Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
git2
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
git2
Commits
6a0d5696
Commit
6a0d5696
authored
Aug 01, 2015
by
Carlos Martín Nieto
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #3333 from libgit2/cmn/for-v23
Maintenance updates for v0.23
parents
159061a8
ac1a5e20
Show whitespace changes
Inline
Side-by-side
Showing
38 changed files
with
352 additions
and
110 deletions
+352
-110
examples/network/fetch.c
+2
-2
include/git2/errors.h
+1
-0
include/git2/remote.h
+9
-1
src/blame_git.c
+10
-15
src/blob.c
+6
-0
src/cache.c
+4
-4
src/checkout.c
+2
-2
src/filter.c
+9
-7
src/index.c
+22
-2
src/khash.h
+0
-0
src/merge.c
+3
-3
src/openssl_stream.c
+2
-0
src/path.c
+8
-3
src/rebase.c
+2
-2
src/stash.c
+1
-1
src/submodule.c
+16
-1
src/thread-utils.c
+2
-0
src/transports/http.c
+1
-1
src/transports/smart_pkt.c
+1
-1
src/xdiff/xdiff.h
+10
-6
src/xdiff/xdiffi.c
+46
-4
src/xdiff/xdiffi.h
+1
-0
src/xdiff/xemit.c
+43
-6
src/xdiff/xemit.h
+1
-1
src/xdiff/xhistogram.c
+1
-1
src/xdiff/xmerge.c
+2
-2
src/xdiff/xpatience.c
+1
-1
src/xdiff/xprepare.c
+8
-9
src/xdiff/xutils.c
+13
-29
src/xdiff/xutils.h
+1
-0
tests/blame/blame_helpers.c
+1
-1
tests/clar_libgit2.c
+2
-2
tests/index/bypath.c
+35
-0
tests/merge/files.c
+39
-0
tests/merge/merge_helpers.c
+1
-1
tests/revert/workdir.c
+4
-2
tests/submodule/add.c
+1
-0
tests/submodule/lookup.c
+41
-0
No files found.
examples/network/fetch.c
View file @
6a0d5696
...
...
@@ -143,10 +143,10 @@ int fetch(git_repository *repo, int argc, char **argv)
* network.
*/
if
(
stats
->
local_objects
>
0
)
{
printf
(
"
\r
Received %d/%d objects in %
zu
bytes (used %d local objects)
\n
"
,
printf
(
"
\r
Received %d/%d objects in %
"
PRIuZ
"
bytes (used %d local objects)
\n
"
,
stats
->
indexed_objects
,
stats
->
total_objects
,
stats
->
received_bytes
,
stats
->
local_objects
);
}
else
{
printf
(
"
\r
Received %d/%d objects in %
zu
bytes
\n
"
,
printf
(
"
\r
Received %d/%d objects in %
"
PRIuZ
"
bytes
\n
"
,
stats
->
indexed_objects
,
stats
->
total_objects
,
stats
->
received_bytes
);
}
...
...
include/git2/errors.h
View file @
6a0d5696
...
...
@@ -48,6 +48,7 @@ typedef enum {
GIT_EEOF
=
-
20
,
/**< Unexpected EOF */
GIT_EINVALID
=
-
21
,
/**< Invalid operation or input */
GIT_EUNCOMMITTED
=
-
22
,
/**< Uncommitted changes in index prevented operation */
GIT_EDIRECTORY
=
-
23
,
/**< The operation is not valid for a directory */
GIT_PASSTHROUGH
=
-
30
,
/**< Internal only */
GIT_ITEROVER
=
-
31
,
/**< Signals end of iteration with iterator */
...
...
include/git2/remote.h
View file @
6a0d5696
...
...
@@ -511,6 +511,14 @@ typedef enum {
GIT_REMOTE_DOWNLOAD_TAGS_ALL
,
}
git_remote_autotag_option_t
;
/**
* Fetch options structure.
*
* Zero out for defaults. Initialize with `GIT_FETCH_OPTIONS_INIT` macro to
* correctly set the `version` field. E.g.
*
* git_fetch_options opts = GIT_FETCH_OPTIONS_INIT;
*/
typedef
struct
{
int
version
;
...
...
@@ -739,7 +747,7 @@ GIT_EXTERN(int) git_remote_prune_refs(const git_remote *remote);
* stored here for further processing by the caller. Always free this
* strarray on successful return.
* @param repo the repository in which to rename
* @param name the current name of the re
a
mote
* @param name the current name of the remote
* @param new_name the new name the remote should bear
* @return 0, GIT_EINVALIDSPEC, GIT_EEXISTS or an error code
*/
...
...
src/blame_git.c
View file @
6a0d5696
...
...
@@ -304,21 +304,16 @@ static void blame_chunk(
}
static
int
my_emit
(
xdfenv_t
*
xe
,
xdchange_t
*
xscr
,
xdemitcb_t
*
ecb
,
xdemitconf_t
const
*
xecfg
)
long
start_a
,
long
count_a
,
long
start_b
,
long
count_b
,
void
*
cb_data
)
{
xdchange_t
*
xch
=
xscr
;
GIT_UNUSED
(
xe
);
GIT_UNUSED
(
xecfg
);
while
(
xch
)
{
blame_chunk_cb_data
*
d
=
ecb
->
priv
;
blame_chunk
(
d
->
blame
,
d
->
tlno
,
d
->
plno
,
xch
->
i2
,
d
->
target
,
d
->
parent
);
d
->
plno
=
xch
->
i1
+
xch
->
chg1
;
d
->
tlno
=
xch
->
i2
+
xch
->
chg2
;
xch
=
xch
->
next
;
}
blame_chunk_cb_data
*
d
=
(
blame_chunk_cb_data
*
)
cb_data
;
blame_chunk
(
d
->
blame
,
d
->
tlno
,
d
->
plno
,
start_b
,
d
->
target
,
d
->
parent
);
d
->
plno
=
start_a
+
count_a
;
d
->
tlno
=
start_b
+
count_b
;
return
0
;
}
...
...
@@ -352,7 +347,7 @@ static int diff_hunks(mmfile_t file_a, mmfile_t file_b, void *cb_data)
xdemitconf_t
xecfg
=
{
0
};
xdemitcb_t
ecb
=
{
0
};
xecfg
.
emit_func
=
(
void
(
*
)(
void
))
my_emit
;
xecfg
.
hunk_func
=
my_emit
;
ecb
.
priv
=
cb_data
;
trim_common_tail
(
&
file_a
,
&
file_b
,
0
);
...
...
src/blob.c
View file @
6a0d5696
...
...
@@ -185,6 +185,12 @@ int git_blob__create_from_paths(
(
error
=
git_repository_odb
(
&
odb
,
repo
))
<
0
)
goto
done
;
if
(
S_ISDIR
(
st
.
st_mode
))
{
giterr_set
(
GITERR_ODB
,
"cannot create blob from '%s'; it is a directory"
,
content_path
);
error
=
GIT_EDIRECTORY
;
goto
done
;
}
if
(
out_st
)
memcpy
(
out_st
,
&
st
,
sizeof
(
st
));
...
...
src/cache.c
View file @
6a0d5696
...
...
@@ -50,16 +50,16 @@ void git_cache_dump_stats(git_cache *cache)
if
(
kh_size
(
cache
->
map
)
==
0
)
return
;
printf
(
"Cache %p: %d items cached, %
d
bytes
\n
"
,
cache
,
kh_size
(
cache
->
map
),
(
int
)
cache
->
used_memory
);
printf
(
"Cache %p: %d items cached, %
"
PRIdZ
"
bytes
\n
"
,
cache
,
kh_size
(
cache
->
map
),
cache
->
used_memory
);
kh_foreach_value
(
cache
->
map
,
object
,
{
char
oid_str
[
9
];
printf
(
" %s%c %s (%
d
)
\n
"
,
printf
(
" %s%c %s (%
"
PRIuZ
"
)
\n
"
,
git_object_type2string
(
object
->
type
),
object
->
flags
==
GIT_CACHE_STORE_PARSED
?
'*'
:
' '
,
git_oid_tostr
(
oid_str
,
sizeof
(
oid_str
),
&
object
->
oid
),
(
int
)
object
->
size
object
->
size
);
});
}
...
...
src/checkout.c
View file @
6a0d5696
...
...
@@ -1299,8 +1299,8 @@ static int checkout_get_actions(
if
(
counts
[
CHECKOUT_ACTION__CONFLICT
]
>
0
&&
(
data
->
strategy
&
GIT_CHECKOUT_ALLOW_CONFLICTS
)
==
0
)
{
giterr_set
(
GITERR_CHECKOUT
,
"%
d
%s checkout"
,
(
int
)
counts
[
CHECKOUT_ACTION__CONFLICT
],
giterr_set
(
GITERR_CHECKOUT
,
"%
"
PRIuZ
"
%s checkout"
,
counts
[
CHECKOUT_ACTION__CONFLICT
],
counts
[
CHECKOUT_ACTION__CONFLICT
]
==
1
?
"conflict prevents"
:
"conflicts prevent"
);
error
=
GIT_ECONFLICT
;
...
...
src/filter.c
View file @
6a0d5696
...
...
@@ -947,18 +947,20 @@ int git_filter_list_stream_data(
{
git_vector
filter_streams
=
GIT_VECTOR_INIT
;
git_writestream
*
stream_start
;
int
error
=
0
;
int
error
=
0
,
close_error
;
git_buf_sanitize
(
data
);
if
((
error
=
stream_list_init
(
&
stream_start
,
&
filter_streams
,
filters
,
target
))
==
0
&&
(
error
=
stream_start
->
write
(
stream_start
,
data
->
ptr
,
data
->
size
))
==
0
)
error
=
stream_start
->
close
(
stream_start
);
if
((
error
=
stream_list_init
(
&
stream_start
,
&
filter_streams
,
filters
,
target
))
<
0
)
goto
out
;
error
=
stream_start
->
write
(
stream_start
,
data
->
ptr
,
data
->
size
);
out:
close_error
=
stream_start
->
close
(
stream_start
);
stream_list_free
(
&
filter_streams
);
return
error
;
/* propagate the stream init or write error */
return
error
<
0
?
error
:
close_error
;
}
int
git_filter_list_stream_blob
(
...
...
src/index.c
View file @
6a0d5696
...
...
@@ -1236,10 +1236,30 @@ int git_index_add_bypath(git_index *index, const char *path)
assert
(
index
&&
path
);
if
((
ret
=
index_entry_init
(
&
entry
,
index
,
path
))
<
0
||
(
ret
=
index_insert
(
index
,
&
entry
,
1
,
false
))
<
0
)
if
((
ret
=
index_entry_init
(
&
entry
,
index
,
path
))
==
0
)
ret
=
index_insert
(
index
,
&
entry
,
1
,
false
);
/* If we were given a directory, let's see if it's a submodule */
if
(
ret
<
0
&&
ret
!=
GIT_EDIRECTORY
)
return
ret
;
if
(
ret
==
GIT_EDIRECTORY
)
{
git_submodule
*
sm
;
git_error_state
err
;
giterr_capture
(
&
err
,
ret
);
ret
=
git_submodule_lookup
(
&
sm
,
INDEX_OWNER
(
index
),
path
);
if
(
ret
==
GIT_ENOTFOUND
)
return
giterr_restore
(
&
err
);
else
git__free
(
err
.
error_msg
.
message
);
ret
=
git_submodule_add_to_index
(
sm
,
false
);
git_submodule_free
(
sm
);
return
ret
;
}
/* Adding implies conflict was resolved, move conflict entries to REUC */
if
((
ret
=
index_conflict_to_reuc
(
index
,
path
))
<
0
&&
ret
!=
GIT_ENOTFOUND
)
return
ret
;
...
...
src/khash.h
View file @
6a0d5696
src/merge.c
View file @
6a0d5696
...
...
@@ -79,7 +79,7 @@ int merge_bases_many(git_commit_list **out, git_revwalk **walk_out, git_reposito
unsigned
int
i
;
if
(
length
<
2
)
{
giterr_set
(
GITERR_INVALID
,
"At least two commits are required to find an ancestor. Provided 'length' was %
u
."
,
length
);
giterr_set
(
GITERR_INVALID
,
"At least two commits are required to find an ancestor. Provided 'length' was %
"
PRIuZ
"
."
,
length
);
return
-
1
;
}
...
...
@@ -185,7 +185,7 @@ int git_merge_base_octopus(git_oid *out, git_repository *repo, size_t length, co
assert
(
out
&&
repo
&&
input_array
);
if
(
length
<
2
)
{
giterr_set
(
GITERR_INVALID
,
"At least two commits are required to find an ancestor. Provided 'length' was %
u
."
,
length
);
giterr_set
(
GITERR_INVALID
,
"At least two commits are required to find an ancestor. Provided 'length' was %
"
PRIuZ
"
."
,
length
);
return
-
1
;
}
...
...
@@ -2451,7 +2451,7 @@ int git_merge__check_result(git_repository *repo, git_index *index_new)
goto
done
;
if
((
conflicts
=
index_conflicts
+
wd_conflicts
)
>
0
)
{
giterr_set
(
GITERR_MERGE
,
"%
d
uncommitted change%s would be overwritten by merge"
,
giterr_set
(
GITERR_MERGE
,
"%
"
PRIuZ
"
uncommitted change%s would be overwritten by merge"
,
conflicts
,
(
conflicts
!=
1
)
?
"s"
:
""
);
error
=
GIT_ECONFLICT
;
}
...
...
src/openssl_stream.c
View file @
6a0d5696
...
...
@@ -324,7 +324,9 @@ int openssl_connect(git_stream *stream)
SSL_set_bio
(
st
->
ssl
,
bio
,
bio
);
/* specify the host in case SNI is needed */
#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
SSL_set_tlsext_host_name
(
st
->
ssl
,
st
->
host
);
#endif
if
((
ret
=
SSL_connect
(
st
->
ssl
))
<=
0
)
return
ssl_set_error
(
st
->
ssl
,
ret
);
...
...
src/path.c
View file @
6a0d5696
...
...
@@ -12,6 +12,7 @@
#include "win32/posix.h"
#include "win32/buffer.h"
#include "win32/w32_util.h"
#include "win32/version.h"
#else
#include <dirent.h>
#endif
...
...
@@ -1085,7 +1086,7 @@ int git_path_direach(
#if defined(GIT_WIN32) && !defined(__MINGW32__)
/* Using _FIND_FIRST_EX_LARGE_FETCH may increase performance in Windows 7
* and better.
Prior versions will ignore this.
* and better.
*/
#ifndef FIND_FIRST_EX_LARGE_FETCH
# define FIND_FIRST_EX_LARGE_FETCH 2
...
...
@@ -1099,6 +1100,10 @@ int git_path_diriter_init(
git_win32_path
path_filter
;
git_buf
hack
=
{
0
};
static
int
is_win7_or_later
=
-
1
;
if
(
is_win7_or_later
<
0
)
is_win7_or_later
=
git_has_win32_version
(
6
,
1
,
0
);
assert
(
diriter
&&
path
);
memset
(
diriter
,
0
,
sizeof
(
git_path_diriter
));
...
...
@@ -1122,11 +1127,11 @@ int git_path_diriter_init(
diriter
->
handle
=
FindFirstFileExW
(
path_filter
,
FindExInfoBasic
,
is_win7_or_later
?
FindExInfoBasic
:
FindExInfoStandard
,
&
diriter
->
current
,
FindExSearchNameMatch
,
NULL
,
FIND_FIRST_EX_LARGE_FETCH
);
is_win7_or_later
?
FIND_FIRST_EX_LARGE_FETCH
:
0
);
if
(
diriter
->
handle
==
INVALID_HANDLE_VALUE
)
{
giterr_set
(
GITERR_OS
,
"Could not open directory '%s'"
,
path
);
...
...
src/rebase.c
View file @
6a0d5696
...
...
@@ -436,7 +436,7 @@ static int rebase_setupfiles_merge(git_rebase *rebase)
size_t
i
;
int
error
=
0
;
if
((
error
=
rebase_setupfile
(
rebase
,
END_FILE
,
-
1
,
"%
d
\n
"
,
git_array_size
(
rebase
->
operations
)))
<
0
||
if
((
error
=
rebase_setupfile
(
rebase
,
END_FILE
,
-
1
,
"%
"
PRIuZ
"
\n
"
,
git_array_size
(
rebase
->
operations
)))
<
0
||
(
error
=
rebase_setupfile
(
rebase
,
ONTO_NAME_FILE
,
-
1
,
"%s
\n
"
,
rebase
->
onto_name
))
<
0
)
goto
done
;
...
...
@@ -789,7 +789,7 @@ static int rebase_next_merge(
normalize_checkout_options_for_apply
(
&
checkout_opts
,
rebase
,
current_commit
);
if
((
error
=
git_indexwriter_init_for_operation
(
&
indexwriter
,
rebase
->
repo
,
&
checkout_opts
.
checkout_strategy
))
<
0
||
(
error
=
rebase_setupfile
(
rebase
,
MSGNUM_FILE
,
-
1
,
"%
d
\n
"
,
rebase
->
current
+
1
))
<
0
||
(
error
=
rebase_setupfile
(
rebase
,
MSGNUM_FILE
,
-
1
,
"%
"
PRIuZ
"
\n
"
,
rebase
->
current
+
1
))
<
0
||
(
error
=
rebase_setupfile
(
rebase
,
CURRENT_FILE
,
-
1
,
"%.*s
\n
"
,
GIT_OID_HEXSZ
,
current_idstr
))
<
0
||
(
error
=
git_merge_trees
(
&
index
,
rebase
->
repo
,
parent_tree
,
head_tree
,
current_tree
,
NULL
))
<
0
||
(
error
=
git_merge__check_result
(
rebase
->
repo
,
index
))
<
0
||
...
...
src/stash.c
View file @
6a0d5696
...
...
@@ -770,7 +770,7 @@ static int ensure_clean_index(git_repository *repo, git_index *index)
goto
done
;
if
(
git_diff_num_deltas
(
index_diff
)
>
0
)
{
giterr_set
(
GITERR_STASH
,
"%
d
uncommitted changes exist in the index"
,
giterr_set
(
GITERR_STASH
,
"%
"
PRIuZ
"
uncommitted changes exist in the index"
,
git_diff_num_deltas
(
index_diff
));
error
=
GIT_EUNCOMMITTED
;
}
...
...
src/submodule.c
View file @
6a0d5696
...
...
@@ -781,11 +781,25 @@ const char *git_submodule_url(git_submodule *submodule)
int
git_submodule_resolve_url
(
git_buf
*
out
,
git_repository
*
repo
,
const
char
*
url
)
{
int
error
=
0
;
git_buf
normalized
=
GIT_BUF_INIT
;
assert
(
out
&&
repo
&&
url
);
git_buf_sanitize
(
out
);
if
(
strchr
(
url
,
'\\'
))
{
char
*
p
;
if
((
error
=
git_buf_puts
(
&
normalized
,
url
))
<
0
)
return
error
;
for
(
p
=
normalized
.
ptr
;
*
p
;
p
++
)
{
if
(
*
p
==
'\\'
)
*
p
=
'/'
;
}
url
=
normalized
.
ptr
;
}
if
(
git_path_is_relative
(
url
))
{
if
(
!
(
error
=
get_url_base
(
out
,
repo
)))
error
=
git_path_apply_relative
(
out
,
url
);
...
...
@@ -796,6 +810,7 @@ int git_submodule_resolve_url(git_buf *out, git_repository *repo, const char *ur
error
=
-
1
;
}
git_buf_free
(
&
normalized
);
return
error
;
}
...
...
@@ -1647,7 +1662,7 @@ static int submodule_load_from_config(
}
else
{
khiter_t
pos
;
git_strmap
*
map
=
data
->
map
;
pos
=
git_strmap_lookup_index
(
map
,
name
.
ptr
);
pos
=
git_strmap_lookup_index
(
map
,
path
?
path
:
name
.
ptr
);
if
(
git_strmap_valid_index
(
map
,
pos
))
{
sm
=
git_strmap_value_at
(
map
,
pos
);
}
else
{
...
...
src/thread-utils.c
View file @
6a0d5696
...
...
@@ -8,7 +8,9 @@
#include "thread-utils.h"
#ifdef _WIN32
#ifndef WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN
#endif
# include <windows.h>
#elif defined(hpux) || defined(__hpux) || defined(_hpux)
# include <sys/pstat.h>
...
...
src/transports/http.c
View file @
6a0d5696
...
...
@@ -511,7 +511,7 @@ static int write_chunk(git_stream *io, const char *buffer, size_t len)
git_buf
buf
=
GIT_BUF_INIT
;
/* Chunk header */
git_buf_printf
(
&
buf
,
"%
X
\r\n
"
,
(
unsigned
)
len
);
git_buf_printf
(
&
buf
,
"%
"
PRIxZ
"
\r\n
"
,
len
);
if
(
git_buf_oom
(
&
buf
))
return
-
1
;
...
...
src/transports/smart_pkt.c
View file @
6a0d5696
...
...
@@ -523,7 +523,7 @@ static int buffer_want_with_caps(const git_remote_head *head, transport_smart_ca
if
(
len
>
0xffff
)
{
giterr_set
(
GITERR_NET
,
"Tried to produce packet with invalid length %
d"
,
len
);
"Tried to produce packet with invalid length %
"
PRIuZ
,
len
);
return
-
1
;
}
...
...
src/xdiff/xdiff.h
View file @
6a0d5696
...
...
@@ -32,14 +32,14 @@ extern "C" {
#define XDF_IGNORE_WHITESPACE (1 << 2)
#define XDF_IGNORE_WHITESPACE_CHANGE (1 << 3)
#define XDF_IGNORE_WHITESPACE_AT_EOL (1 << 4)
#define XDF_WHITESPACE_FLAGS (XDF_IGNORE_WHITESPACE | XDF_IGNORE_WHITESPACE_CHANGE | XDF_IGNORE_WHITESPACE_AT_EOL)
#define XDF_PATIENCE_DIFF (1 << 5)
#define XDF_HISTOGRAM_DIFF (1 << 6)
#define XDF_WHITESPACE_FLAGS (XDF_IGNORE_WHITESPACE | XDF_IGNORE_WHITESPACE_CHANGE | XDF_IGNORE_WHITESPACE_AT_EOL)
#define XDF_DIFF_ALGORITHM_MASK (XDF_PATIENCE_DIFF | XDF_HISTOGRAM_DIFF)
#define XDF_DIFF_ALG(x) ((x) & XDF_DIFF_ALGORITHM_MASK)
#define XDL_PATCH_NORMAL '-'
#define XDL_PATCH_REVERSE '+'
#define XDL_PATCH_MODEMASK ((1 << 8) - 1)
#define XDL_PATCH_IGNOREBSPACE (1 << 8)
#define XDF_IGNORE_BLANK_LINES (1 << 7)
#define XDL_EMIT_FUNCNAMES (1 << 0)
#define XDL_EMIT_COMMON (1 << 1)
...
...
@@ -88,13 +88,17 @@ typedef struct s_xdemitcb {
typedef
long
(
*
find_func_t
)(
const
char
*
line
,
long
line_len
,
char
*
buffer
,
long
buffer_size
,
void
*
priv
);
typedef
int
(
*
xdl_emit_hunk_consume_func_t
)(
long
start_a
,
long
count_a
,
long
start_b
,
long
count_b
,
void
*
cb_data
);
typedef
struct
s_xdemitconf
{
long
ctxlen
;
long
interhunkctxlen
;
unsigned
long
flags
;
find_func_t
find_func
;
void
*
find_func_priv
;
void
(
*
emit_func
)(
void
)
;
xdl_emit_hunk_consume_func_t
hunk_func
;
}
xdemitconf_t
;
typedef
struct
s_bdiffparam
{
...
...
src/xdiff/xdiffi.c
View file @
6a0d5696
...
...
@@ -328,10 +328,10 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
xdalgoenv_t
xenv
;
diffdata_t
dd1
,
dd2
;
if
(
xpp
->
flags
&
XDF_PATIENCE_DIFF
)
if
(
XDF_DIFF_ALG
(
xpp
->
flags
)
==
XDF_PATIENCE_DIFF
)
return
xdl_do_patience_diff
(
mf1
,
mf2
,
xpp
,
xe
);
if
(
xpp
->
flags
&
XDF_HISTOGRAM_DIFF
)
if
(
XDF_DIFF_ALG
(
xpp
->
flags
)
==
XDF_HISTOGRAM_DIFF
)
return
xdl_do_histogram_diff
(
mf1
,
mf2
,
xpp
,
xe
);
if
(
xdl_prepare_env
(
mf1
,
mf2
,
xpp
,
xe
)
<
0
)
{
...
...
@@ -394,6 +394,7 @@ static xdchange_t *xdl_add_change(xdchange_t *xscr, long i1, long i2, long chg1,
xch
->
i2
=
i2
;
xch
->
chg1
=
chg1
;
xch
->
chg2
=
chg2
;
xch
->
ignore
=
0
;
return
xch
;
}
...
...
@@ -538,13 +539,51 @@ void xdl_free_script(xdchange_t *xscr) {
}
}
static
int
xdl_call_hunk_func
(
xdfenv_t
*
xe
,
xdchange_t
*
xscr
,
xdemitcb_t
*
ecb
,
xdemitconf_t
const
*
xecfg
)
{
xdchange_t
*
xch
,
*
xche
;
(
void
)
xe
;
for
(
xch
=
xscr
;
xch
;
xch
=
xche
->
next
)
{
xche
=
xdl_get_hunk
(
&
xch
,
xecfg
);
if
(
!
xch
)
break
;
if
(
xecfg
->
hunk_func
(
xch
->
i1
,
xche
->
i1
+
xche
->
chg1
-
xch
->
i1
,
xch
->
i2
,
xche
->
i2
+
xche
->
chg2
-
xch
->
i2
,
ecb
->
priv
)
<
0
)
return
-
1
;
}
return
0
;
}
static
void
xdl_mark_ignorable
(
xdchange_t
*
xscr
,
xdfenv_t
*
xe
,
long
flags
)
{
xdchange_t
*
xch
;
for
(
xch
=
xscr
;
xch
;
xch
=
xch
->
next
)
{
int
ignore
=
1
;
xrecord_t
**
rec
;
long
i
;
rec
=
&
xe
->
xdf1
.
recs
[
xch
->
i1
];
for
(
i
=
0
;
i
<
xch
->
chg1
&&
ignore
;
i
++
)
ignore
=
xdl_blankline
(
rec
[
i
]
->
ptr
,
rec
[
i
]
->
size
,
flags
);
rec
=
&
xe
->
xdf2
.
recs
[
xch
->
i2
];
for
(
i
=
0
;
i
<
xch
->
chg2
&&
ignore
;
i
++
)
ignore
=
xdl_blankline
(
rec
[
i
]
->
ptr
,
rec
[
i
]
->
size
,
flags
);
xch
->
ignore
=
ignore
;
}
}
int
xdl_diff
(
mmfile_t
*
mf1
,
mmfile_t
*
mf2
,
xpparam_t
const
*
xpp
,
xdemitconf_t
const
*
xecfg
,
xdemitcb_t
*
ecb
)
{
xdchange_t
*
xscr
;
xdfenv_t
xe
;
emit_func_t
ef
=
xecfg
->
emit_func
?
(
emit_func_t
)
xecfg
->
emit_func
:
xdl_emit_diff
;
emit_func_t
ef
=
xecfg
->
hunk_func
?
xdl_call_hunk_func
:
xdl_emit_diff
;
if
(
xdl_do_diff
(
mf1
,
mf2
,
xpp
,
&
xe
)
<
0
)
{
...
...
@@ -558,6 +597,9 @@ int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
return
-
1
;
}
if
(
xscr
)
{
if
(
xpp
->
flags
&
XDF_IGNORE_BLANK_LINES
)
xdl_mark_ignorable
(
xscr
,
&
xe
,
xpp
->
flags
);
if
(
ef
(
&
xe
,
xscr
,
ecb
,
xecfg
)
<
0
)
{
xdl_free_script
(
xscr
);
...
...
src/xdiff/xdiffi.h
View file @
6a0d5696
...
...
@@ -41,6 +41,7 @@ typedef struct s_xdchange {
struct
s_xdchange
*
next
;
long
i1
,
i2
;
long
chg1
,
chg2
;
int
ignore
;
}
xdchange_t
;
...
...
src/xdiff/xemit.c
View file @
6a0d5696
...
...
@@ -56,16 +56,51 @@ static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *
/*
* Starting at the passed change atom, find the latest change atom to be included
* inside the differential hunk according to the specified configuration.
* Also advance xscr if the first changes must be discarded.
*/
xdchange_t
*
xdl_get_hunk
(
xdchange_t
*
xscr
,
xdemitconf_t
const
*
xecfg
)
{
xdchange_t
*
xch
,
*
xchp
;
xdchange_t
*
xdl_get_hunk
(
xdchange_t
**
xscr
,
xdemitconf_t
const
*
xecfg
)
{
xdchange_t
*
xch
,
*
xchp
,
*
lxch
;
long
max_common
=
2
*
xecfg
->
ctxlen
+
xecfg
->
interhunkctxlen
;
long
max_ignorable
=
xecfg
->
ctxlen
;
unsigned
long
ignored
=
0
;
/* number of ignored blank lines */
/* remove ignorable changes that are too far before other changes */
for
(
xchp
=
*
xscr
;
xchp
&&
xchp
->
ignore
;
xchp
=
xchp
->
next
)
{
xch
=
xchp
->
next
;
if
(
xch
==
NULL
||
xch
->
i1
-
(
xchp
->
i1
+
xchp
->
chg1
)
>=
max_ignorable
)
*
xscr
=
xch
;
}
if
(
*
xscr
==
NULL
)
return
NULL
;
lxch
=
*
xscr
;
for
(
xchp
=
xscr
,
xch
=
xscr
->
next
;
xch
;
xchp
=
xch
,
xch
=
xch
->
next
)
if
(
xch
->
i1
-
(
xchp
->
i1
+
xchp
->
chg1
)
>
max_common
)
for
(
xchp
=
*
xscr
,
xch
=
xchp
->
next
;
xch
;
xchp
=
xch
,
xch
=
xch
->
next
)
{
long
distance
=
xch
->
i1
-
(
xchp
->
i1
+
xchp
->
chg1
);
if
(
distance
>
max_common
)
break
;
return
xchp
;
if
(
distance
<
max_ignorable
&&
(
!
xch
->
ignore
||
lxch
==
xchp
))
{
lxch
=
xch
;
ignored
=
0
;
}
else
if
(
distance
<
max_ignorable
&&
xch
->
ignore
)
{
ignored
+=
xch
->
chg2
;
}
else
if
(
lxch
!=
xchp
&&
xch
->
i1
+
ignored
-
(
lxch
->
i1
+
lxch
->
chg1
)
>
(
unsigned
long
)
max_common
)
{
break
;
}
else
if
(
!
xch
->
ignore
)
{
lxch
=
xch
;
ignored
=
0
;
}
else
{
ignored
+=
xch
->
chg2
;
}
}
return
lxch
;
}
...
...
@@ -144,7 +179,9 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
return
xdl_emit_common
(
xe
,
xscr
,
ecb
,
xecfg
);
for
(
xch
=
xscr
;
xch
;
xch
=
xche
->
next
)
{
xche
=
xdl_get_hunk
(
xch
,
xecfg
);
xche
=
xdl_get_hunk
(
&
xch
,
xecfg
);
if
(
!
xch
)
break
;
s1
=
XDL_MAX
(
xch
->
i1
-
xecfg
->
ctxlen
,
0
);
s2
=
XDL_MAX
(
xch
->
i2
-
xecfg
->
ctxlen
,
0
);
...
...
src/xdiff/xemit.h
View file @
6a0d5696
...
...
@@ -27,7 +27,7 @@
typedef
int
(
*
emit_func_t
)(
xdfenv_t
*
xe
,
xdchange_t
*
xscr
,
xdemitcb_t
*
ecb
,
xdemitconf_t
const
*
xecfg
);
xdchange_t
*
xdl_get_hunk
(
xdchange_t
*
xscr
,
xdemitconf_t
const
*
xecfg
);
xdchange_t
*
xdl_get_hunk
(
xdchange_t
*
*
xscr
,
xdemitconf_t
const
*
xecfg
);
int
xdl_emit_diff
(
xdfenv_t
*
xe
,
xdchange_t
*
xscr
,
xdemitcb_t
*
ecb
,
xdemitconf_t
const
*
xecfg
);
...
...
src/xdiff/xhistogram.c
View file @
6a0d5696
...
...
@@ -258,7 +258,7 @@ static int fall_back_to_classic_diff(struct histindex *index,
int
line1
,
int
count1
,
int
line2
,
int
count2
)
{
xpparam_t
xpp
;
xpp
.
flags
=
index
->
xpp
->
flags
&
~
XDF_
HISTOGRAM_DIFF
;
xpp
.
flags
=
index
->
xpp
->
flags
&
~
XDF_
DIFF_ALGORITHM_MASK
;
return
xdl_fall_back_diff
(
index
->
env
,
&
xpp
,
line1
,
count1
,
line2
,
count2
);
...
...
src/xdiff/xmerge.c
View file @
6a0d5696
...
...
@@ -245,11 +245,11 @@ static int xdl_fill_merge_buffer(xdfenv_t *xe1, const char *name1,
dest
?
dest
+
size
:
NULL
);
/* Postimage from side #1 */
if
(
m
->
mode
&
1
)
size
+=
xdl_recs_copy
(
xe1
,
m
->
i1
,
m
->
chg1
,
1
,
size
+=
xdl_recs_copy
(
xe1
,
m
->
i1
,
m
->
chg1
,
(
m
->
mode
&
2
)
,
dest
?
dest
+
size
:
NULL
);
/* Postimage from side #2 */
if
(
m
->
mode
&
2
)
size
+=
xdl_recs_copy
(
xe2
,
m
->
i2
,
m
->
chg2
,
1
,
size
+=
xdl_recs_copy
(
xe2
,
m
->
i2
,
m
->
chg2
,
0
,
dest
?
dest
+
size
:
NULL
);
}
else
continue
;
...
...
src/xdiff/xpatience.c
View file @
6a0d5696
...
...
@@ -288,7 +288,7 @@ static int fall_back_to_classic_diff(struct hashmap *map,
int
line1
,
int
count1
,
int
line2
,
int
count2
)
{
xpparam_t
xpp
;
xpp
.
flags
=
map
->
xpp
->
flags
&
~
XDF_
PATIENCE_DIFF
;
xpp
.
flags
=
map
->
xpp
->
flags
&
~
XDF_
DIFF_ALGORITHM_MASK
;
return
xdl_fall_back_diff
(
map
->
env
,
&
xpp
,
line1
,
count1
,
line2
,
count2
);
...
...
src/xdiff/xprepare.c
View file @
6a0d5696
...
...
@@ -181,7 +181,7 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_
if
(
!
(
recs
=
(
xrecord_t
**
)
xdl_malloc
(
narec
*
sizeof
(
xrecord_t
*
))))
goto
abort
;
if
(
xpp
->
flags
&
XDF_HISTOGRAM_DIFF
)
if
(
XDF_DIFF_ALG
(
xpp
->
flags
)
==
XDF_HISTOGRAM_DIFF
)
hbits
=
hsize
=
0
;
else
{
hbits
=
xdl_hashbits
((
unsigned
int
)
narec
);
...
...
@@ -209,7 +209,7 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, long narec, xpparam_
crec
->
ha
=
hav
;
recs
[
nrec
++
]
=
crec
;
if
(
!
(
xpp
->
flags
&
XDF_HISTOGRAM_DIFF
)
&&
if
(
(
XDF_DIFF_ALG
(
xpp
->
flags
)
!=
XDF_HISTOGRAM_DIFF
)
&&
xdl_classify_record
(
pass
,
cf
,
rhash
,
hbits
,
crec
)
<
0
)
goto
abort
;
}
...
...
@@ -273,16 +273,15 @@ int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
* (nrecs) will be updated correctly anyway by
* xdl_prepare_ctx().
*/
sample
=
xpp
->
flags
&
XDF_HISTOGRAM_DIFF
?
XDL_GUESS_NLINES2
:
XDL_GUESS_NLINES1
;
sample
=
(
XDF_DIFF_ALG
(
xpp
->
flags
)
==
XDF_HISTOGRAM_DIFF
?
XDL_GUESS_NLINES2
:
XDL_GUESS_NLINES1
);
enl1
=
xdl_guess_lines
(
mf1
,
sample
)
+
1
;
enl2
=
xdl_guess_lines
(
mf2
,
sample
)
+
1
;
if
(
!
(
xpp
->
flags
&
XDF_HISTOGRAM_DIFF
)
&&
xdl_init_classifier
(
&
cf
,
enl1
+
enl2
+
1
,
xpp
->
flags
)
<
0
)
{
if
(
XDF_DIFF_ALG
(
xpp
->
flags
)
!=
XDF_HISTOGRAM_DIFF
&&
xdl_init_classifier
(
&
cf
,
enl1
+
enl2
+
1
,
xpp
->
flags
)
<
0
)
return
-
1
;
}
if
(
xdl_prepare_ctx
(
1
,
mf1
,
enl1
,
xpp
,
&
cf
,
&
xe
->
xdf1
)
<
0
)
{
...
...
@@ -296,8 +295,8 @@ int xdl_prepare_env(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
return
-
1
;
}
if
(
!
(
xpp
->
flags
&
XDF_PATIENCE_DIFF
)
&&
!
(
xpp
->
flags
&
XDF_HISTOGRAM_DIFF
)
&&
if
(
(
XDF_DIFF_ALG
(
xpp
->
flags
)
!=
XDF_PATIENCE_DIFF
)
&&
(
XDF_DIFF_ALG
(
xpp
->
flags
)
!=
XDF_HISTOGRAM_DIFF
)
&&
xdl_optimize_ctxs
(
&
cf
,
&
xe
->
xdf1
,
&
xe
->
xdf2
)
<
0
)
{
xdl_free_ctx
(
&
xe
->
xdf2
);
...
...
src/xdiff/xutils.c
View file @
6a0d5696
...
...
@@ -120,35 +120,6 @@ void *xdl_cha_alloc(chastore_t *cha) {
return
data
;
}
void
*
xdl_cha_first
(
chastore_t
*
cha
)
{
chanode_t
*
sncur
;
if
(
!
(
cha
->
sncur
=
sncur
=
cha
->
head
))
return
NULL
;
cha
->
scurr
=
0
;
return
(
char
*
)
sncur
+
sizeof
(
chanode_t
)
+
cha
->
scurr
;
}
void
*
xdl_cha_next
(
chastore_t
*
cha
)
{
chanode_t
*
sncur
;
if
(
!
(
sncur
=
cha
->
sncur
))
return
NULL
;
cha
->
scurr
+=
cha
->
isize
;
if
(
cha
->
scurr
==
sncur
->
icurr
)
{
if
(
!
(
sncur
=
cha
->
sncur
=
sncur
->
next
))
return
NULL
;
cha
->
scurr
=
0
;
}
return
(
char
*
)
sncur
+
sizeof
(
chanode_t
)
+
cha
->
scurr
;
}
long
xdl_guess_lines
(
mmfile_t
*
mf
,
long
sample
)
{
long
nl
=
0
,
size
,
tsize
=
0
;
char
const
*
data
,
*
cur
,
*
top
;
...
...
@@ -170,6 +141,19 @@ long xdl_guess_lines(mmfile_t *mf, long sample) {
return
nl
+
1
;
}
int
xdl_blankline
(
const
char
*
line
,
long
size
,
long
flags
)
{
long
i
;
if
(
!
(
flags
&
XDF_WHITESPACE_FLAGS
))
return
(
size
<=
1
);
for
(
i
=
0
;
i
<
size
&&
XDL_ISSPACE
(
line
[
i
]);
i
++
)
;
return
(
i
==
size
);
}
int
xdl_recmatch
(
const
char
*
l1
,
long
s1
,
const
char
*
l2
,
long
s2
,
long
flags
)
{
int
i1
,
i2
;
...
...
src/xdiff/xutils.h
View file @
6a0d5696
...
...
@@ -34,6 +34,7 @@ void *xdl_cha_alloc(chastore_t *cha);
void
*
xdl_cha_first
(
chastore_t
*
cha
);
void
*
xdl_cha_next
(
chastore_t
*
cha
);
long
xdl_guess_lines
(
mmfile_t
*
mf
,
long
sample
);
int
xdl_blankline
(
const
char
*
line
,
long
size
,
long
flags
);
int
xdl_recmatch
(
const
char
*
l1
,
long
s1
,
const
char
*
l2
,
long
s2
,
long
flags
);
unsigned
long
xdl_hash_record
(
char
const
**
data
,
char
const
*
top
,
long
flags
);
unsigned
int
xdl_hashbits
(
unsigned
int
size
);
...
...
tests/blame/blame_helpers.c
View file @
6a0d5696
...
...
@@ -4,7 +4,7 @@ void hunk_message(size_t idx, const git_blame_hunk *hunk, const char *fmt, ...)
{
va_list
arglist
;
printf
(
"Hunk %
zd
(line %d +%d): "
,
idx
,
printf
(
"Hunk %
"
PRIuZ
"
(line %d +%d): "
,
idx
,
hunk
->
final_start_line_number
,
hunk
->
lines_in_hunk
-
1
);
va_start
(
arglist
,
fmt
);
...
...
tests/clar_libgit2.c
View file @
6a0d5696
...
...
@@ -483,8 +483,8 @@ void clar__assert_equal_file(
for
(
pos
=
0
;
pos
<
bytes
&&
expected_data
[
pos
]
==
buf
[
pos
];
++
pos
)
/* find differing byte offset */
;
p_snprintf
(
buf
,
sizeof
(
buf
),
"file content mismatch at byte %
d"
,
(
in
t
)(
total_bytes
+
pos
));
buf
,
sizeof
(
buf
),
"file content mismatch at byte %
"
PRIdZ
,
(
ssize_
t
)(
total_bytes
+
pos
));
p_close
(
fd
);
clar__fail
(
file
,
line
,
path
,
buf
,
1
);
}
...
...
tests/index/bypath.c
0 → 100644
View file @
6a0d5696
#include "clar_libgit2.h"
#include "repository.h"
#include "../submodule/submodule_helpers.h"
static
git_repository
*
g_repo
;
static
git_index
*
g_idx
;
void
test_index_bypath__initialize
(
void
)
{
g_repo
=
setup_fixture_submod2
();
cl_git_pass
(
git_repository_index__weakptr
(
&
g_idx
,
g_repo
));
}
void
test_index_bypath__cleanup
(
void
)
{
g_repo
=
NULL
;
g_idx
=
NULL
;
}
void
test_index_bypath__add_directory
(
void
)
{
cl_git_fail_with
(
GIT_EDIRECTORY
,
git_index_add_bypath
(
g_idx
,
"just_a_dir"
));
}
void
test_index_bypath__add_submodule
(
void
)
{
unsigned
int
status
;
const
char
*
sm_name
=
"sm_changed_head"
;
cl_git_pass
(
git_submodule_status
(
&
status
,
g_repo
,
sm_name
,
0
));
cl_assert_equal_i
(
GIT_SUBMODULE_STATUS_WD_MODIFIED
,
status
&
GIT_SUBMODULE_STATUS_WD_MODIFIED
);
cl_git_pass
(
git_index_add_bypath
(
g_idx
,
sm_name
));
cl_git_pass
(
git_submodule_status
(
&
status
,
g_repo
,
sm_name
,
0
));
cl_assert_equal_i
(
0
,
status
&
GIT_SUBMODULE_STATUS_WD_MODIFIED
);
}
tests/merge/files.c
View file @
6a0d5696
...
...
@@ -249,3 +249,42 @@ void test_merge_files__automerge_whitespace_change(void)
git_merge_file_result_free
(
&
result
);
}
void
test_merge_files__doesnt_add_newline
(
void
)
{
git_merge_file_input
ancestor
=
GIT_MERGE_FILE_INPUT_INIT
,
ours
=
GIT_MERGE_FILE_INPUT_INIT
,
theirs
=
GIT_MERGE_FILE_INPUT_INIT
;
git_merge_file_options
opts
=
GIT_MERGE_FILE_OPTIONS_INIT
;
git_merge_file_result
result
=
{
0
};
const
char
*
expected
=
"Zero
\n
1
\n
2
\n
3
\n
4
\n
5 XXX
\n
6 YYY
\n
7
\n
8
\n
9
\n
Ten"
;
ancestor
.
ptr
=
"0
\n
1
\n
2
\n
3
\n
4
\n
5 XXX
\n
6YYY
\n
7
\n
8
\n
9
\n
10"
;
ancestor
.
size
=
strlen
(
ancestor
.
ptr
);
ancestor
.
path
=
"testfile.txt"
;
ancestor
.
mode
=
0100755
;
ours
.
ptr
=
"Zero
\n
1
\n
2
\n
3
\n
4
\n
5 XXX
\n
6 YYY
\n
7
\n
8
\n
9
\n
10"
;
ours
.
size
=
strlen
(
ours
.
ptr
);
ours
.
path
=
"testfile.txt"
;
ours
.
mode
=
0100755
;
theirs
.
ptr
=
"0
\n
1
\n
2
\n
3
\n
4
\n
5 XXX
\n
6 YYY
\n
7
\n
8
\n
9
\n
Ten"
;
theirs
.
size
=
strlen
(
theirs
.
ptr
);
theirs
.
path
=
"testfile.txt"
;
theirs
.
mode
=
0100755
;
opts
.
flags
|=
GIT_MERGE_FILE_IGNORE_WHITESPACE_CHANGE
;
cl_git_pass
(
git_merge_file
(
&
result
,
&
ancestor
,
&
ours
,
&
theirs
,
&
opts
));
cl_assert_equal_i
(
1
,
result
.
automergeable
);
cl_assert_equal_s
(
"testfile.txt"
,
result
.
path
);
cl_assert_equal_i
(
0100755
,
result
.
mode
);
cl_assert_equal_i
(
strlen
(
expected
),
result
.
len
);
cl_assert_equal_strn
(
expected
,
result
.
ptr
,
result
.
len
);
git_merge_file_result_free
(
&
result
);
}
tests/merge/merge_helpers.c
View file @
6a0d5696
...
...
@@ -110,7 +110,7 @@ void merge__dump_index_entries(git_vector *index_entries)
size_t
i
;
const
git_index_entry
*
index_entry
;
printf
(
"
\n
INDEX [%
d]:
\n
"
,
(
int
)
index_entries
->
length
);
printf
(
"
\n
INDEX [%
"
PRIuZ
"]:
\n
"
,
index_entries
->
length
);
for
(
i
=
0
;
i
<
index_entries
->
length
;
i
++
)
{
index_entry
=
index_entries
->
contents
[
i
];
...
...
tests/revert/workdir.c
View file @
6a0d5696
...
...
@@ -334,7 +334,8 @@ void test_revert_workdir__again_after_edit_two(void)
cl_assert
(
merge_test_index
(
repo_index
,
merge_index_entries
,
3
));
cl_git_pass
(
git_futils_readbuffer
(
&
diff_buf
,
"revert/file.txt"
));
cl_assert
(
strcmp
(
diff_buf
.
ptr
,
"a
\n
"
\
cl_assert_equal_s
(
"a
\n
"
\
"<<<<<<< HEAD
\n
"
\
"=======
\n
"
\
"a
\n
"
\
...
...
@@ -343,7 +344,8 @@ void test_revert_workdir__again_after_edit_two(void)
"a
\n
"
\
"a
\n
"
\
"a
\n
"
\
"ab
\n
"
)
==
0
);
"ab"
,
diff_buf
.
ptr
);
git_commit_free
(
revert_commit
);
git_commit_free
(
head_commit
);
...
...
tests/submodule/add.c
View file @
6a0d5696
...
...
@@ -4,6 +4,7 @@
#include "submodule_helpers.h"
#include "config/config_helpers.h"
#include "fileops.h"
#include "repository.h"
static
git_repository
*
g_repo
=
NULL
;
...
...
tests/submodule/lookup.c
View file @
6a0d5696
#include "clar_libgit2.h"
#include "submodule_helpers.h"
#include "git2/sys/repository.h"
#include "repository.h"
#include "fileops.h"
static
git_repository
*
g_repo
=
NULL
;
...
...
@@ -103,8 +104,25 @@ static int sm_lookup_cb(git_submodule *sm, const char *name, void *payload)
void
test_submodule_lookup__foreach
(
void
)
{
git_config
*
cfg
;
sm_lookup_data
data
;
memset
(
&
data
,
0
,
sizeof
(
data
));
cl_git_pass
(
git_submodule_foreach
(
g_repo
,
sm_lookup_cb
,
&
data
));
cl_assert_equal_i
(
8
,
data
.
count
);
memset
(
&
data
,
0
,
sizeof
(
data
));
/* Change the path for a submodule so it doesn't match the name */
cl_git_pass
(
git_config_open_ondisk
(
&
cfg
,
"submod2/.gitmodules"
));
cl_git_pass
(
git_config_set_string
(
cfg
,
"submodule.smchangedindex.path"
,
"sm_changed_index"
));
cl_git_pass
(
git_config_set_string
(
cfg
,
"submodule.smchangedindex.url"
,
"../submod2_target"
));
cl_git_pass
(
git_config_delete_entry
(
cfg
,
"submodule.sm_changed_index.path"
));
cl_git_pass
(
git_config_delete_entry
(
cfg
,
"submodule.sm_changed_index.url"
));
git_config_free
(
cfg
);
cl_git_pass
(
git_submodule_foreach
(
g_repo
,
sm_lookup_cb
,
&
data
));
cl_assert_equal_i
(
8
,
data
.
count
);
}
...
...
@@ -133,6 +151,29 @@ void test_submodule_lookup__lookup_even_with_missing_index(void)
test_submodule_lookup__simple_lookup
();
/* baseline should still pass */
}
void
test_submodule_lookup__backslashes
(
void
)
{
git_config
*
cfg
;
git_submodule
*
sm
;
git_repository
*
subrepo
;
git_buf
buf
=
GIT_BUF_INIT
;
const
char
*
backslashed_path
=
"..
\\
submod2_target"
;
cl_git_pass
(
git_config_open_ondisk
(
&
cfg
,
"submod2/.gitmodules"
));
cl_git_pass
(
git_config_set_string
(
cfg
,
"submodule.sm_unchanged.url"
,
backslashed_path
));
git_config_free
(
cfg
);
cl_git_pass
(
git_submodule_lookup
(
&
sm
,
g_repo
,
"sm_unchanged"
));
cl_assert_equal_s
(
backslashed_path
,
git_submodule_url
(
sm
));
cl_git_pass
(
git_submodule_open
(
&
subrepo
,
sm
));
cl_git_pass
(
git_submodule_resolve_url
(
&
buf
,
g_repo
,
backslashed_path
));
git_buf_free
(
&
buf
);
git_submodule_free
(
sm
);
git_repository_free
(
subrepo
);
}
static
void
baseline_tests
(
void
)
{
/* small baseline that should work even if we change the index or make
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment