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
5a0b8803
Commit
5a0b8803
authored
Nov 04, 2013
by
Vicent Martí
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1929 from libgit2/rb/misc-diff-fixes
Fix some observed problems with incorrect diffs
parents
becb13c0
3e57069e
Show whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
398 additions
and
96 deletions
+398
-96
examples/showindex.c
+1
-1
include/git2/diff.h
+32
-2
include/git2/index.h
+12
-5
include/git2/status.h
+4
-0
include/git2/types.h
+12
-2
src/checkout.c
+1
-1
src/diff.c
+47
-10
src/diff.h
+1
-1
src/diff_tform.c
+57
-18
src/index.c
+5
-4
src/status.c
+11
-6
src/submodule.c
+5
-2
tests-clar/checkout/head.c
+0
-1
tests-clar/diff/blob.c
+1
-2
tests-clar/diff/diff_helpers.c
+9
-5
tests-clar/diff/tree.c
+3
-4
tests-clar/diff/workdir.c
+156
-0
tests-clar/index/addall.c
+20
-9
tests-clar/index/names.c
+3
-3
tests-clar/index/reuc.c
+0
-2
tests-clar/index/tests.c
+14
-13
tests-clar/status/worktree.c
+4
-5
No files found.
examples/showindex.c
View file @
5a0b8803
...
@@ -33,7 +33,7 @@ int main (int argc, char** argv)
...
@@ -33,7 +33,7 @@ int main (int argc, char** argv)
git_repository_free
(
repo
);
git_repository_free
(
repo
);
}
}
git_index_read
(
index
);
git_index_read
(
index
,
0
);
ecount
=
git_index_entrycount
(
index
);
ecount
=
git_index_entrycount
(
index
);
if
(
!
ecount
)
if
(
!
ecount
)
...
...
include/git2/diff.h
View file @
5a0b8803
...
@@ -352,7 +352,7 @@ typedef struct {
...
@@ -352,7 +352,7 @@ typedef struct {
/* options controlling which files are in the diff */
/* options controlling which files are in the diff */
git_submodule_ignore_t
ignore_submodules
;
/**
<
< submodule ignore rule */
git_submodule_ignore_t
ignore_submodules
;
/**< submodule ignore rule */
git_strarray
pathspec
;
/**< defaults to include all paths */
git_strarray
pathspec
;
/**< defaults to include all paths */
git_diff_notify_cb
notify_cb
;
git_diff_notify_cb
notify_cb
;
void
*
notify_payload
;
void
*
notify_payload
;
...
@@ -367,9 +367,14 @@ typedef struct {
...
@@ -367,9 +367,14 @@ typedef struct {
const
char
*
new_prefix
;
/**< defaults to "b" */
const
char
*
new_prefix
;
/**< defaults to "b" */
}
git_diff_options
;
}
git_diff_options
;
/* The current version of the diff options structure */
#define GIT_DIFF_OPTIONS_VERSION 1
#define GIT_DIFF_OPTIONS_VERSION 1
/* Stack initializer for diff options. Alternatively use
* `git_diff_options_init` programmatic initialization.
*/
#define GIT_DIFF_OPTIONS_INIT \
#define GIT_DIFF_OPTIONS_INIT \
{GIT_DIFF_OPTIONS_VERSION, 0,
0
, {NULL,0}, NULL, NULL, 3}
{GIT_DIFF_OPTIONS_VERSION, 0,
GIT_SUBMODULE_IGNORE_DEFAULT
, {NULL,0}, NULL, NULL, 3}
/**
/**
* When iterating over a diff, callback that will be made per file.
* When iterating over a diff, callback that will be made per file.
...
@@ -607,6 +612,10 @@ GIT_EXTERN(int) git_diff_tree_to_tree(
...
@@ -607,6 +612,10 @@ GIT_EXTERN(int) git_diff_tree_to_tree(
* The tree you pass will be used for the "old_file" side of the delta, and
* The tree you pass will be used for the "old_file" side of the delta, and
* the index will be used for the "new_file" side of the delta.
* the index will be used for the "new_file" side of the delta.
*
*
* If you pass NULL for the index, then the existing index of the `repo`
* will be used. In this case, the index will be refreshed from disk
* (if it has changed) before the diff is generated.
*
* @param diff Output pointer to a git_diff pointer to be allocated.
* @param diff Output pointer to a git_diff pointer to be allocated.
* @param repo The repository containing the tree and index.
* @param repo The repository containing the tree and index.
* @param old_tree A git_tree object to diff from, or NULL for empty tree.
* @param old_tree A git_tree object to diff from, or NULL for empty tree.
...
@@ -631,6 +640,10 @@ GIT_EXTERN(int) git_diff_tree_to_index(
...
@@ -631,6 +640,10 @@ GIT_EXTERN(int) git_diff_tree_to_index(
* The index will be used for the "old_file" side of the delta, and the
* The index will be used for the "old_file" side of the delta, and the
* working directory will be used for the "new_file" side of the delta.
* working directory will be used for the "new_file" side of the delta.
*
*
* If you pass NULL for the index, then the existing index of the `repo`
* will be used. In this case, the index will be refreshed from disk
* (if it has changed) before the diff is generated.
*
* @param diff Output pointer to a git_diff pointer to be allocated.
* @param diff Output pointer to a git_diff pointer to be allocated.
* @param repo The repository.
* @param repo The repository.
* @param index The index to diff from; repo index used if NULL.
* @param index The index to diff from; repo index used if NULL.
...
@@ -730,6 +743,23 @@ GIT_EXTERN(int) git_diff_find_similar(
...
@@ -730,6 +743,23 @@ GIT_EXTERN(int) git_diff_find_similar(
git_diff
*
diff
,
git_diff
*
diff
,
const
git_diff_find_options
*
options
);
const
git_diff_find_options
*
options
);
/**
* Initialize diff options structure
*
* In most cases, you can probably just use `GIT_DIFF_OPTIONS_INIT` to
* initialize the diff options structure, but in some cases that is not
* going to work. You can call this function instead. Note that you
* must pass both a pointer to the structure to be initialized and the
* `GIT_DIFF_OPTIONS_VERSION` value from the header you compiled with.
*
* @param options Pointer to git_diff_options memory to be initialized
* @param version Should be `GIT_DIFF_OPTIONS_VERSION`
* @return 0 on success, negative on failure (such as unsupported version)
*/
GIT_EXTERN
(
int
)
git_diff_options_init
(
git_diff_options
*
options
,
unsigned
int
version
);
/**@}*/
/**@}*/
...
...
include/git2/index.h
View file @
5a0b8803
...
@@ -222,16 +222,23 @@ GIT_EXTERN(unsigned int) git_index_caps(const git_index *index);
...
@@ -222,16 +222,23 @@ GIT_EXTERN(unsigned int) git_index_caps(const git_index *index);
GIT_EXTERN
(
int
)
git_index_set_caps
(
git_index
*
index
,
unsigned
int
caps
);
GIT_EXTERN
(
int
)
git_index_set_caps
(
git_index
*
index
,
unsigned
int
caps
);
/**
/**
* Update the contents of an existing index object in memory
* Update the contents of an existing index object in memory
by reading
*
by reading
from the hard disk.
* from the hard disk.
*
*
* If the file doesn't exist on the filesystem, the index
* If `force` is true, this performs a "hard" read that discards in-memory
* will be cleared from its current content.
* changes and always reloads the on-disk index data. If there is no
* on-disk version, the index will be cleared.
*
* If `force` is false, this does a "soft" read that reloads the index
* data from disk only if it has changed since the last time it was
* loaded. Purely in-memory index data will be untouched. Be aware: if
* there are changes on disk, unwritten in-memory changes are discarded.
*
*
* @param index an existing index object
* @param index an existing index object
* @param force if true, always reload, vs. only read if file has changed
* @return 0 or an error code
* @return 0 or an error code
*/
*/
GIT_EXTERN
(
int
)
git_index_read
(
git_index
*
index
);
GIT_EXTERN
(
int
)
git_index_read
(
git_index
*
index
,
int
force
);
/**
/**
* Write an existing index object from memory back to disk
* Write an existing index object from memory back to disk
...
...
include/git2/status.h
View file @
5a0b8803
...
@@ -118,6 +118,9 @@ typedef enum {
...
@@ -118,6 +118,9 @@ typedef enum {
* case-insensitive order
* case-insensitive order
* - GIT_STATUS_OPT_RENAMES_FROM_REWRITES indicates that rename detection
* - GIT_STATUS_OPT_RENAMES_FROM_REWRITES indicates that rename detection
* should include rewritten files
* should include rewritten files
* - GIT_STATUS_OPT_NO_REFRESH bypasses the default status behavior of
* doing a "soft" index reload (i.e. reloading the index data if the
* file on disk has been modified outside libgit2).
*
*
* Calling `git_status_foreach()` is like calling the extended version
* Calling `git_status_foreach()` is like calling the extended version
* with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED,
* with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED,
...
@@ -137,6 +140,7 @@ typedef enum {
...
@@ -137,6 +140,7 @@ typedef enum {
GIT_STATUS_OPT_SORT_CASE_SENSITIVELY
=
(
1u
<<
9
),
GIT_STATUS_OPT_SORT_CASE_SENSITIVELY
=
(
1u
<<
9
),
GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY
=
(
1u
<<
10
),
GIT_STATUS_OPT_SORT_CASE_INSENSITIVELY
=
(
1u
<<
10
),
GIT_STATUS_OPT_RENAMES_FROM_REWRITES
=
(
1u
<<
11
),
GIT_STATUS_OPT_RENAMES_FROM_REWRITES
=
(
1u
<<
11
),
GIT_STATUS_OPT_NO_REFRESH
=
(
1u
<<
12
),
}
git_status_opt_t
;
}
git_status_opt_t
;
#define GIT_STATUS_OPT_DEFAULTS \
#define GIT_STATUS_OPT_DEFAULTS \
...
...
include/git2/types.h
View file @
5a0b8803
...
@@ -268,13 +268,18 @@ typedef struct git_submodule git_submodule;
...
@@ -268,13 +268,18 @@ typedef struct git_submodule git_submodule;
* superproject into the current checkout out branch of the submodule.
* superproject into the current checkout out branch of the submodule.
* - GIT_SUBMODULE_UPDATE_NONE: do not update this submodule even when
* - GIT_SUBMODULE_UPDATE_NONE: do not update this submodule even when
* the commit in the superproject is updated.
* the commit in the superproject is updated.
* - GIT_SUBMODULE_UPDATE_DEFAULT: not used except as static initializer
* when we don't want any particular update rule to be specified.
*/
*/
typedef
enum
{
typedef
enum
{
GIT_SUBMODULE_UPDATE_RESET
=
-
1
,
GIT_SUBMODULE_UPDATE_RESET
=
-
1
,
GIT_SUBMODULE_UPDATE_CHECKOUT
=
1
,
GIT_SUBMODULE_UPDATE_CHECKOUT
=
1
,
GIT_SUBMODULE_UPDATE_REBASE
=
2
,
GIT_SUBMODULE_UPDATE_REBASE
=
2
,
GIT_SUBMODULE_UPDATE_MERGE
=
3
,
GIT_SUBMODULE_UPDATE_MERGE
=
3
,
GIT_SUBMODULE_UPDATE_NONE
=
4
GIT_SUBMODULE_UPDATE_NONE
=
4
,
GIT_SUBMODULE_UPDATE_DEFAULT
=
0
}
git_submodule_update_t
;
}
git_submodule_update_t
;
/**
/**
...
@@ -301,13 +306,18 @@ typedef enum {
...
@@ -301,13 +306,18 @@ typedef enum {
* only considering changes if the HEAD of submodule has moved from the
* only considering changes if the HEAD of submodule has moved from the
* value in the superproject.
* value in the superproject.
* - GIT_SUBMODULE_IGNORE_ALL: never check if the submodule is dirty
* - GIT_SUBMODULE_IGNORE_ALL: never check if the submodule is dirty
* - GIT_SUBMODULE_IGNORE_DEFAULT: not used except as static initializer
* when we don't want any particular ignore rule to be specified.
*/
*/
typedef
enum
{
typedef
enum
{
GIT_SUBMODULE_IGNORE_RESET
=
-
1
,
/* reset to on-disk value */
GIT_SUBMODULE_IGNORE_RESET
=
-
1
,
/* reset to on-disk value */
GIT_SUBMODULE_IGNORE_NONE
=
1
,
/* any change or untracked == dirty */
GIT_SUBMODULE_IGNORE_NONE
=
1
,
/* any change or untracked == dirty */
GIT_SUBMODULE_IGNORE_UNTRACKED
=
2
,
/* dirty if tracked files change */
GIT_SUBMODULE_IGNORE_UNTRACKED
=
2
,
/* dirty if tracked files change */
GIT_SUBMODULE_IGNORE_DIRTY
=
3
,
/* only dirty if HEAD moved */
GIT_SUBMODULE_IGNORE_DIRTY
=
3
,
/* only dirty if HEAD moved */
GIT_SUBMODULE_IGNORE_ALL
=
4
/* never dirty */
GIT_SUBMODULE_IGNORE_ALL
=
4
,
/* never dirty */
GIT_SUBMODULE_IGNORE_DEFAULT
=
0
}
git_submodule_ignore_t
;
}
git_submodule_ignore_t
;
/** @} */
/** @} */
...
...
src/checkout.c
View file @
5a0b8803
...
@@ -1837,7 +1837,7 @@ static int checkout_data_init(
...
@@ -1837,7 +1837,7 @@ static int checkout_data_init(
}
else
{
}
else
{
/* otherwise, grab and reload the index */
/* otherwise, grab and reload the index */
if
((
error
=
git_repository_index
(
&
data
->
index
,
data
->
repo
))
<
0
||
if
((
error
=
git_repository_index
(
&
data
->
index
,
data
->
repo
))
<
0
||
(
error
=
git_index_read
(
data
->
index
))
<
0
)
(
error
=
git_index_read
(
data
->
index
,
true
))
<
0
)
goto
cleanup
;
goto
cleanup
;
/* cannot checkout if unresolved conflicts exist */
/* cannot checkout if unresolved conflicts exist */
...
...
src/diff.c
View file @
5a0b8803
...
@@ -70,6 +70,9 @@ static int diff_delta__from_one(
...
@@ -70,6 +70,9 @@ static int diff_delta__from_one(
const
char
*
matched_pathspec
;
const
char
*
matched_pathspec
;
int
notify_res
;
int
notify_res
;
if
((
entry
->
flags
&
GIT_IDXENTRY_VALID
)
!=
0
)
return
0
;
if
(
status
==
GIT_DELTA_IGNORED
&&
if
(
status
==
GIT_DELTA_IGNORED
&&
DIFF_FLAG_ISNT_SET
(
diff
,
GIT_DIFF_INCLUDE_IGNORED
))
DIFF_FLAG_ISNT_SET
(
diff
,
GIT_DIFF_INCLUDE_IGNORED
))
return
0
;
return
0
;
...
@@ -426,7 +429,7 @@ static int diff_list_apply_options(
...
@@ -426,7 +429,7 @@ static int diff_list_apply_options(
diff
->
diffcaps
=
diff
->
diffcaps
|
GIT_DIFFCAPS_HAS_SYMLINKS
;
diff
->
diffcaps
=
diff
->
diffcaps
|
GIT_DIFFCAPS_HAS_SYMLINKS
;
if
(
!
git_repository__cvar
(
&
val
,
repo
,
GIT_CVAR_IGNORESTAT
)
&&
val
)
if
(
!
git_repository__cvar
(
&
val
,
repo
,
GIT_CVAR_IGNORESTAT
)
&&
val
)
diff
->
diffcaps
=
diff
->
diffcaps
|
GIT_DIFFCAPS_
ASSUME_UNCHANGED
;
diff
->
diffcaps
=
diff
->
diffcaps
|
GIT_DIFFCAPS_
IGNORE_STAT
;
if
((
diff
->
opts
.
flags
&
GIT_DIFF_IGNORE_FILEMODE
)
==
0
&&
if
((
diff
->
opts
.
flags
&
GIT_DIFF_IGNORE_FILEMODE
)
==
0
&&
!
git_repository__cvar
(
&
val
,
repo
,
GIT_CVAR_FILEMODE
)
&&
val
)
!
git_repository__cvar
(
&
val
,
repo
,
GIT_CVAR_FILEMODE
)
&&
val
)
...
@@ -448,6 +451,13 @@ static int diff_list_apply_options(
...
@@ -448,6 +451,13 @@ static int diff_list_apply_options(
/* add other defaults here */
/* add other defaults here */
}
}
/* Reverse src info if diff is reversed */
if
(
DIFF_FLAG_IS_SET
(
diff
,
GIT_DIFF_REVERSE
))
{
git_iterator_type_t
tmp_src
=
diff
->
old_src
;
diff
->
old_src
=
diff
->
new_src
;
diff
->
new_src
=
tmp_src
;
}
/* if ignore_submodules not explicitly set, check diff config */
/* if ignore_submodules not explicitly set, check diff config */
if
(
diff
->
opts
.
ignore_submodules
<=
0
)
{
if
(
diff
->
opts
.
ignore_submodules
<=
0
)
{
const
char
*
str
;
const
char
*
str
;
...
@@ -484,9 +494,9 @@ static int diff_list_apply_options(
...
@@ -484,9 +494,9 @@ static int diff_list_apply_options(
return
-
1
;
return
-
1
;
if
(
DIFF_FLAG_IS_SET
(
diff
,
GIT_DIFF_REVERSE
))
{
if
(
DIFF_FLAG_IS_SET
(
diff
,
GIT_DIFF_REVERSE
))
{
const
char
*
swap
=
diff
->
opts
.
old_prefix
;
const
char
*
tmp_prefix
=
diff
->
opts
.
old_prefix
;
diff
->
opts
.
old_prefix
=
diff
->
opts
.
new_prefix
;
diff
->
opts
.
old_prefix
=
diff
->
opts
.
new_prefix
;
diff
->
opts
.
new_prefix
=
swap
;
diff
->
opts
.
new_prefix
=
tmp_prefix
;
}
}
return
0
;
return
0
;
...
@@ -694,9 +704,8 @@ static int maybe_modified(
...
@@ -694,9 +704,8 @@ static int maybe_modified(
nmode
=
(
nmode
&
~
MODE_BITS_MASK
)
|
(
omode
&
MODE_BITS_MASK
);
nmode
=
(
nmode
&
~
MODE_BITS_MASK
)
|
(
omode
&
MODE_BITS_MASK
);
/* support "assume unchanged" (poorly, b/c we still stat everything) */
/* support "assume unchanged" (poorly, b/c we still stat everything) */
if
((
diff
->
diffcaps
&
GIT_DIFFCAPS_ASSUME_UNCHANGED
)
!=
0
)
if
((
oitem
->
flags
&
GIT_IDXENTRY_VALID
)
!=
0
)
status
=
(
oitem
->
flags_extended
&
GIT_IDXENTRY_INTENT_TO_ADD
)
?
status
=
GIT_DELTA_UNMODIFIED
;
GIT_DELTA_MODIFIED
:
GIT_DELTA_UNMODIFIED
;
/* support "skip worktree" index bit */
/* support "skip worktree" index bit */
else
if
((
oitem
->
flags_extended
&
GIT_IDXENTRY_SKIP_WORKTREE
)
!=
0
)
else
if
((
oitem
->
flags_extended
&
GIT_IDXENTRY_SKIP_WORKTREE
)
!=
0
)
...
@@ -1177,6 +1186,17 @@ int git_diff_tree_to_tree(
...
@@ -1177,6 +1186,17 @@ int git_diff_tree_to_tree(
return
error
;
return
error
;
}
}
static
int
diff_load_index
(
git_index
**
index
,
git_repository
*
repo
)
{
int
error
=
git_repository_index__weakptr
(
index
,
repo
);
/* reload the repository index when user did not pass one in */
if
(
!
error
&&
git_index_read
(
*
index
,
false
)
<
0
)
giterr_clear
();
return
error
;
}
int
git_diff_tree_to_index
(
int
git_diff_tree_to_index
(
git_diff
**
diff
,
git_diff
**
diff
,
git_repository
*
repo
,
git_repository
*
repo
,
...
@@ -1189,7 +1209,7 @@ int git_diff_tree_to_index(
...
@@ -1189,7 +1209,7 @@ int git_diff_tree_to_index(
assert
(
diff
&&
repo
);
assert
(
diff
&&
repo
);
if
(
!
index
&&
(
error
=
git_repository_index__weakptr
(
&
index
,
repo
))
<
0
)
if
(
!
index
&&
(
error
=
diff_load_index
(
&
index
,
repo
))
<
0
)
return
error
;
return
error
;
if
(
index
->
ignore_case
)
{
if
(
index
->
ignore_case
)
{
...
@@ -1232,7 +1252,7 @@ int git_diff_index_to_workdir(
...
@@ -1232,7 +1252,7 @@ int git_diff_index_to_workdir(
assert
(
diff
&&
repo
);
assert
(
diff
&&
repo
);
if
(
!
index
&&
(
error
=
git_repository_index__weakptr
(
&
index
,
repo
))
<
0
)
if
(
!
index
&&
(
error
=
diff_load_index
(
&
index
,
repo
))
<
0
)
return
error
;
return
error
;
DIFF_FROM_ITERATORS
(
DIFF_FROM_ITERATORS
(
...
@@ -1271,11 +1291,15 @@ int git_diff_tree_to_workdir_with_index(
...
@@ -1271,11 +1291,15 @@ int git_diff_tree_to_workdir_with_index(
{
{
int
error
=
0
;
int
error
=
0
;
git_diff
*
d1
=
NULL
,
*
d2
=
NULL
;
git_diff
*
d1
=
NULL
,
*
d2
=
NULL
;
git_index
*
index
=
NULL
;
assert
(
diff
&&
repo
);
assert
(
diff
&&
repo
);
if
(
!
(
error
=
git_diff_tree_to_index
(
&
d1
,
repo
,
old_tree
,
NULL
,
opts
))
&&
if
((
error
=
diff_load_index
(
&
index
,
repo
))
<
0
)
!
(
error
=
git_diff_index_to_workdir
(
&
d2
,
repo
,
NULL
,
opts
)))
return
error
;
if
(
!
(
error
=
git_diff_tree_to_index
(
&
d1
,
repo
,
old_tree
,
index
,
opts
))
&&
!
(
error
=
git_diff_index_to_workdir
(
&
d2
,
repo
,
index
,
opts
)))
error
=
git_diff_merge
(
d1
,
d2
);
error
=
git_diff_merge
(
d1
,
d2
);
git_diff_free
(
d2
);
git_diff_free
(
d2
);
...
@@ -1289,6 +1313,19 @@ int git_diff_tree_to_workdir_with_index(
...
@@ -1289,6 +1313,19 @@ int git_diff_tree_to_workdir_with_index(
return
error
;
return
error
;
}
}
int
git_diff_options_init
(
git_diff_options
*
options
,
unsigned
int
version
)
{
git_diff_options
template
=
GIT_DIFF_OPTIONS_INIT
;
if
(
version
!=
template
.
version
)
{
giterr_set
(
GITERR_INVALID
,
"Invalid version %d for git_diff_options"
,
(
int
)
version
);
return
-
1
;
}
memcpy
(
options
,
&
template
,
sizeof
(
*
options
));
return
0
;
}
size_t
git_diff_num_deltas
(
const
git_diff
*
diff
)
size_t
git_diff_num_deltas
(
const
git_diff
*
diff
)
{
{
...
...
src/diff.h
View file @
5a0b8803
...
@@ -23,7 +23,7 @@
...
@@ -23,7 +23,7 @@
enum
{
enum
{
GIT_DIFFCAPS_HAS_SYMLINKS
=
(
1
<<
0
),
/* symlinks on platform? */
GIT_DIFFCAPS_HAS_SYMLINKS
=
(
1
<<
0
),
/* symlinks on platform? */
GIT_DIFFCAPS_
ASSUME_UNCHANGED
=
(
1
<<
1
),
/* use stat? */
GIT_DIFFCAPS_
IGNORE_STAT
=
(
1
<<
1
),
/* use stat? */
GIT_DIFFCAPS_TRUST_MODE_BITS
=
(
1
<<
2
),
/* use st_mode? */
GIT_DIFFCAPS_TRUST_MODE_BITS
=
(
1
<<
2
),
/* use st_mode? */
GIT_DIFFCAPS_TRUST_CTIME
=
(
1
<<
3
),
/* use st_ctime? */
GIT_DIFFCAPS_TRUST_CTIME
=
(
1
<<
3
),
/* use st_ctime? */
GIT_DIFFCAPS_USE_DEV
=
(
1
<<
4
),
/* use st_dev? */
GIT_DIFFCAPS_USE_DEV
=
(
1
<<
4
),
/* use st_dev? */
...
...
src/diff_tform.c
View file @
5a0b8803
...
@@ -46,7 +46,9 @@ fail:
...
@@ -46,7 +46,9 @@ fail:
}
}
static
git_diff_delta
*
diff_delta__merge_like_cgit
(
static
git_diff_delta
*
diff_delta__merge_like_cgit
(
const
git_diff_delta
*
a
,
const
git_diff_delta
*
b
,
git_pool
*
pool
)
const
git_diff_delta
*
a
,
const
git_diff_delta
*
b
,
git_pool
*
pool
)
{
{
git_diff_delta
*
dup
;
git_diff_delta
*
dup
;
...
@@ -96,15 +98,46 @@ static git_diff_delta *diff_delta__merge_like_cgit(
...
@@ -96,15 +98,46 @@ static git_diff_delta *diff_delta__merge_like_cgit(
return
dup
;
return
dup
;
}
}
int
git_diff_merge
(
static
git_diff_delta
*
diff_delta__merge_like_cgit_reversed
(
git_diff
*
onto
,
const
git_diff_delta
*
a
,
const
git_diff
*
from
)
const
git_diff_delta
*
b
,
git_pool
*
pool
)
{
git_diff_delta
*
dup
;
/* reversed version of above logic */
if
(
a
->
status
==
GIT_DELTA_UNMODIFIED
)
return
diff_delta__dup
(
b
,
pool
);
if
((
dup
=
diff_delta__dup
(
a
,
pool
))
==
NULL
)
return
NULL
;
if
(
b
->
status
==
GIT_DELTA_UNMODIFIED
||
b
->
status
==
GIT_DELTA_UNTRACKED
)
return
dup
;
if
(
dup
->
status
==
GIT_DELTA_DELETED
)
{
if
(
b
->
status
==
GIT_DELTA_ADDED
)
dup
->
status
=
GIT_DELTA_UNMODIFIED
;
}
else
{
dup
->
status
=
b
->
status
;
}
git_oid_cpy
(
&
dup
->
old_file
.
oid
,
&
b
->
old_file
.
oid
);
dup
->
old_file
.
mode
=
b
->
old_file
.
mode
;
dup
->
old_file
.
size
=
b
->
old_file
.
size
;
dup
->
old_file
.
flags
=
b
->
old_file
.
flags
;
return
dup
;
}
int
git_diff_merge
(
git_diff
*
onto
,
const
git_diff
*
from
)
{
{
int
error
=
0
;
int
error
=
0
;
git_pool
onto_pool
;
git_pool
onto_pool
;
git_vector
onto_new
;
git_vector
onto_new
;
git_diff_delta
*
delta
;
git_diff_delta
*
delta
;
bool
ignore_case
=
false
;
bool
ignore_case
,
reversed
;
unsigned
int
i
,
j
;
unsigned
int
i
,
j
;
assert
(
onto
&&
from
);
assert
(
onto
&&
from
);
...
@@ -112,26 +145,26 @@ int git_diff_merge(
...
@@ -112,26 +145,26 @@ int git_diff_merge(
if
(
!
from
->
deltas
.
length
)
if
(
!
from
->
deltas
.
length
)
return
0
;
return
0
;
ignore_case
=
((
onto
->
opts
.
flags
&
GIT_DIFF_IGNORE_CASE
)
!=
0
);
reversed
=
((
onto
->
opts
.
flags
&
GIT_DIFF_REVERSE
)
!=
0
);
if
(
ignore_case
!=
((
from
->
opts
.
flags
&
GIT_DIFF_IGNORE_CASE
)
!=
0
)
||
reversed
!=
((
from
->
opts
.
flags
&
GIT_DIFF_REVERSE
)
!=
0
))
{
giterr_set
(
GITERR_INVALID
,
"Attempt to merge diffs created with conflicting options"
);
return
-
1
;
}
if
(
git_vector_init
(
if
(
git_vector_init
(
&
onto_new
,
onto
->
deltas
.
length
,
git_diff_delta__cmp
)
<
0
||
&
onto_new
,
onto
->
deltas
.
length
,
git_diff_delta__cmp
)
<
0
||
git_pool_init
(
&
onto_pool
,
1
,
0
)
<
0
)
git_pool_init
(
&
onto_pool
,
1
,
0
)
<
0
)
return
-
1
;
return
-
1
;
if
((
onto
->
opts
.
flags
&
GIT_DIFF_IGNORE_CASE
)
!=
0
||
(
from
->
opts
.
flags
&
GIT_DIFF_IGNORE_CASE
)
!=
0
)
{
ignore_case
=
true
;
/* This function currently only supports merging diff lists that
* are sorted identically. */
assert
((
onto
->
opts
.
flags
&
GIT_DIFF_IGNORE_CASE
)
!=
0
&&
(
from
->
opts
.
flags
&
GIT_DIFF_IGNORE_CASE
)
!=
0
);
}
for
(
i
=
0
,
j
=
0
;
i
<
onto
->
deltas
.
length
||
j
<
from
->
deltas
.
length
;
)
{
for
(
i
=
0
,
j
=
0
;
i
<
onto
->
deltas
.
length
||
j
<
from
->
deltas
.
length
;
)
{
git_diff_delta
*
o
=
GIT_VECTOR_GET
(
&
onto
->
deltas
,
i
);
git_diff_delta
*
o
=
GIT_VECTOR_GET
(
&
onto
->
deltas
,
i
);
const
git_diff_delta
*
f
=
GIT_VECTOR_GET
(
&
from
->
deltas
,
j
);
const
git_diff_delta
*
f
=
GIT_VECTOR_GET
(
&
from
->
deltas
,
j
);
int
cmp
=
!
f
?
-
1
:
!
o
?
1
:
STRCMP_CASESELECT
(
ignore_case
,
o
->
old_file
.
path
,
f
->
old_file
.
path
);
int
cmp
=
!
f
?
-
1
:
!
o
?
1
:
STRCMP_CASESELECT
(
ignore_case
,
o
->
old_file
.
path
,
f
->
old_file
.
path
);
if
(
cmp
<
0
)
{
if
(
cmp
<
0
)
{
delta
=
diff_delta__dup
(
o
,
&
onto_pool
);
delta
=
diff_delta__dup
(
o
,
&
onto_pool
);
...
@@ -140,7 +173,9 @@ int git_diff_merge(
...
@@ -140,7 +173,9 @@ int git_diff_merge(
delta
=
diff_delta__dup
(
f
,
&
onto_pool
);
delta
=
diff_delta__dup
(
f
,
&
onto_pool
);
j
++
;
j
++
;
}
else
{
}
else
{
delta
=
diff_delta__merge_like_cgit
(
o
,
f
,
&
onto_pool
);
delta
=
reversed
?
diff_delta__merge_like_cgit_reversed
(
o
,
f
,
&
onto_pool
)
:
diff_delta__merge_like_cgit
(
o
,
f
,
&
onto_pool
);
i
++
;
i
++
;
j
++
;
j
++
;
}
}
...
@@ -160,6 +195,10 @@ int git_diff_merge(
...
@@ -160,6 +195,10 @@ int git_diff_merge(
if
(
!
error
)
{
if
(
!
error
)
{
git_vector_swap
(
&
onto
->
deltas
,
&
onto_new
);
git_vector_swap
(
&
onto
->
deltas
,
&
onto_new
);
git_pool_swap
(
&
onto
->
pool
,
&
onto_pool
);
git_pool_swap
(
&
onto
->
pool
,
&
onto_pool
);
if
((
onto
->
opts
.
flags
&
GIT_DIFF_REVERSE
)
!=
0
)
onto
->
old_src
=
from
->
old_src
;
else
onto
->
new_src
=
from
->
new_src
;
onto
->
new_src
=
from
->
new_src
;
/* prefix strings also come from old pool, so recreate those.*/
/* prefix strings also come from old pool, so recreate those.*/
...
...
src/index.c
View file @
5a0b8803
...
@@ -349,7 +349,7 @@ int git_index_open(git_index **index_out, const char *index_path)
...
@@ -349,7 +349,7 @@ int git_index_open(git_index **index_out, const char *index_path)
*
index_out
=
index
;
*
index_out
=
index
;
GIT_REFCOUNT_INC
(
index
);
GIT_REFCOUNT_INC
(
index
);
return
(
index_path
!=
NULL
)
?
git_index_read
(
index
)
:
0
;
return
(
index_path
!=
NULL
)
?
git_index_read
(
index
,
true
)
:
0
;
}
}
int
git_index_new
(
git_index
**
out
)
int
git_index_new
(
git_index
**
out
)
...
@@ -451,11 +451,11 @@ unsigned int git_index_caps(const git_index *index)
...
@@ -451,11 +451,11 @@ unsigned int git_index_caps(const git_index *index)
(
index
->
no_symlinks
?
GIT_INDEXCAP_NO_SYMLINKS
:
0
));
(
index
->
no_symlinks
?
GIT_INDEXCAP_NO_SYMLINKS
:
0
));
}
}
int
git_index_read
(
git_index
*
index
)
int
git_index_read
(
git_index
*
index
,
int
force
)
{
{
int
error
=
0
,
updated
;
int
error
=
0
,
updated
;
git_buf
buffer
=
GIT_BUF_INIT
;
git_buf
buffer
=
GIT_BUF_INIT
;
git_futils_filestamp
stamp
=
{
0
}
;
git_futils_filestamp
stamp
=
index
->
stamp
;
if
(
!
index
->
index_file_path
)
if
(
!
index
->
index_file_path
)
return
create_index_error
(
-
1
,
return
create_index_error
(
-
1
,
...
@@ -464,12 +464,13 @@ int git_index_read(git_index *index)
...
@@ -464,12 +464,13 @@ int git_index_read(git_index *index)
index
->
on_disk
=
git_path_exists
(
index
->
index_file_path
);
index
->
on_disk
=
git_path_exists
(
index
->
index_file_path
);
if
(
!
index
->
on_disk
)
{
if
(
!
index
->
on_disk
)
{
if
(
force
)
git_index_clear
(
index
);
git_index_clear
(
index
);
return
0
;
return
0
;
}
}
updated
=
git_futils_filestamp_check
(
&
stamp
,
index
->
index_file_path
);
updated
=
git_futils_filestamp_check
(
&
stamp
,
index
->
index_file_path
);
if
(
updated
<
=
0
)
if
(
updated
<
0
||
(
!
updated
&&
!
force
)
)
return
updated
;
return
updated
;
error
=
git_futils_readbuffer
(
&
buffer
,
index
->
index_file_path
);
error
=
git_futils_readbuffer
(
&
buffer
,
index
->
index_file_path
);
...
...
src/status.c
View file @
5a0b8803
...
@@ -251,12 +251,17 @@ int git_status_list_new(
...
@@ -251,12 +251,17 @@ int git_status_list_new(
return
error
;
return
error
;
/* if there is no HEAD, that's okay - we'll make an empty iterator */
/* if there is no HEAD, that's okay - we'll make an empty iterator */
if
((
(
error
=
git_repository_head_tree
(
&
head
,
repo
))
<
0
)
&&
if
((
error
=
git_repository_head_tree
(
&
head
,
repo
))
<
0
)
{
error
!=
GIT_ENOTFOUND
&&
error
!=
GIT_EUNBORNBRANCH
)
{
if
(
error
!=
GIT_ENOTFOUND
&&
error
!=
GIT_EUNBORNBRANCH
)
git_index_free
(
index
);
/* release index */
goto
done
;
return
error
;
giterr_clear
()
;
}
}
/* refresh index from disk unless prevented */
if
((
flags
&
GIT_STATUS_OPT_NO_REFRESH
)
==
0
&&
git_index_read
(
index
,
false
)
<
0
)
giterr_clear
();
status
=
git_status_list_alloc
(
index
);
status
=
git_status_list_alloc
(
index
);
GITERR_CHECK_ALLOC
(
status
);
GITERR_CHECK_ALLOC
(
status
);
...
@@ -291,7 +296,7 @@ int git_status_list_new(
...
@@ -291,7 +296,7 @@ int git_status_list_new(
if
(
show
!=
GIT_STATUS_SHOW_WORKDIR_ONLY
)
{
if
(
show
!=
GIT_STATUS_SHOW_WORKDIR_ONLY
)
{
if
((
error
=
git_diff_tree_to_index
(
if
((
error
=
git_diff_tree_to_index
(
&
status
->
head2idx
,
repo
,
head
,
NULL
,
&
diffopt
))
<
0
)
&
status
->
head2idx
,
repo
,
head
,
index
,
&
diffopt
))
<
0
)
goto
done
;
goto
done
;
if
((
flags
&
GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX
)
!=
0
&&
if
((
flags
&
GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX
)
!=
0
&&
...
@@ -301,7 +306,7 @@ int git_status_list_new(
...
@@ -301,7 +306,7 @@ int git_status_list_new(
if
(
show
!=
GIT_STATUS_SHOW_INDEX_ONLY
)
{
if
(
show
!=
GIT_STATUS_SHOW_INDEX_ONLY
)
{
if
((
error
=
git_diff_index_to_workdir
(
if
((
error
=
git_diff_index_to_workdir
(
&
status
->
idx2wd
,
repo
,
NULL
,
&
diffopt
))
<
0
)
&
status
->
idx2wd
,
repo
,
index
,
&
diffopt
))
<
0
)
goto
done
;
goto
done
;
if
((
flags
&
GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR
)
!=
0
&&
if
((
flags
&
GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR
)
!=
0
&&
...
...
src/submodule.c
View file @
5a0b8803
...
@@ -1527,6 +1527,7 @@ static void submodule_get_wd_status(
...
@@ -1527,6 +1527,7 @@ static void submodule_get_wd_status(
const
git_oid
*
wd_oid
=
const
git_oid
*
wd_oid
=
(
sm
->
flags
&
GIT_SUBMODULE_STATUS__WD_OID_VALID
)
?
&
sm
->
wd_oid
:
NULL
;
(
sm
->
flags
&
GIT_SUBMODULE_STATUS__WD_OID_VALID
)
?
&
sm
->
wd_oid
:
NULL
;
git_tree
*
sm_head
=
NULL
;
git_tree
*
sm_head
=
NULL
;
git_index
*
index
=
NULL
;
git_diff_options
opt
=
GIT_DIFF_OPTIONS_INIT
;
git_diff_options
opt
=
GIT_DIFF_OPTIONS_INIT
;
git_diff
*
diff
;
git_diff
*
diff
;
...
@@ -1558,12 +1559,14 @@ static void submodule_get_wd_status(
...
@@ -1558,12 +1559,14 @@ static void submodule_get_wd_status(
if
(
ign
==
GIT_SUBMODULE_IGNORE_NONE
)
if
(
ign
==
GIT_SUBMODULE_IGNORE_NONE
)
opt
.
flags
|=
GIT_DIFF_INCLUDE_UNTRACKED
;
opt
.
flags
|=
GIT_DIFF_INCLUDE_UNTRACKED
;
(
void
)
git_repository_index__weakptr
(
&
index
,
sm_repo
);
/* if we don't have an unborn head, check diff with index */
/* if we don't have an unborn head, check diff with index */
if
(
git_repository_head_tree
(
&
sm_head
,
sm_repo
)
<
0
)
if
(
git_repository_head_tree
(
&
sm_head
,
sm_repo
)
<
0
)
giterr_clear
();
giterr_clear
();
else
{
else
{
/* perform head to index diff on submodule */
/* perform head to index diff on submodule */
if
(
git_diff_tree_to_index
(
&
diff
,
sm_repo
,
sm_head
,
NULL
,
&
opt
)
<
0
)
if
(
git_diff_tree_to_index
(
&
diff
,
sm_repo
,
sm_head
,
index
,
&
opt
)
<
0
)
giterr_clear
();
giterr_clear
();
else
{
else
{
if
(
git_diff_num_deltas
(
diff
)
>
0
)
if
(
git_diff_num_deltas
(
diff
)
>
0
)
...
@@ -1576,7 +1579,7 @@ static void submodule_get_wd_status(
...
@@ -1576,7 +1579,7 @@ static void submodule_get_wd_status(
}
}
/* perform index-to-workdir diff on submodule */
/* perform index-to-workdir diff on submodule */
if
(
git_diff_index_to_workdir
(
&
diff
,
sm_repo
,
NULL
,
&
opt
)
<
0
)
if
(
git_diff_index_to_workdir
(
&
diff
,
sm_repo
,
index
,
&
opt
)
<
0
)
giterr_clear
();
giterr_clear
();
else
{
else
{
size_t
untracked
=
size_t
untracked
=
...
...
tests-clar/checkout/head.c
View file @
5a0b8803
...
@@ -54,7 +54,6 @@ void test_checkout_head__with_index_only_tree(void)
...
@@ -54,7 +54,6 @@ void test_checkout_head__with_index_only_tree(void)
cl_git_pass
(
git_checkout_head
(
g_repo
,
&
opts
));
cl_git_pass
(
git_checkout_head
(
g_repo
,
&
opts
));
cl_git_pass
(
git_repository_index
(
&
index
,
g_repo
));
cl_git_pass
(
git_repository_index
(
&
index
,
g_repo
));
cl_git_pass
(
git_index_read
(
index
));
/* reload if needed */
cl_assert
(
!
git_path_isfile
(
"testrepo/newdir/newfile.txt"
));
cl_assert
(
!
git_path_isfile
(
"testrepo/newdir/newfile.txt"
));
cl_assert
(
git_index_get_bypath
(
index
,
"newdir/newfile.txt"
,
0
)
==
NULL
);
cl_assert
(
git_index_get_bypath
(
index
,
"newdir/newfile.txt"
,
0
)
==
NULL
);
...
...
tests-clar/diff/blob.c
View file @
5a0b8803
...
@@ -26,9 +26,8 @@ void test_diff_blob__initialize(void)
...
@@ -26,9 +26,8 @@ void test_diff_blob__initialize(void)
g_repo
=
cl_git_sandbox_init
(
"attr"
);
g_repo
=
cl_git_sandbox_init
(
"attr"
);
GIT_INIT_STRUCTURE
(
&
opts
,
GIT_DIFF_OPTIONS_VERSION
);
cl_git_pass
(
git_diff_options_init
(
&
opts
,
GIT_DIFF_OPTIONS_VERSION
)
);
opts
.
context_lines
=
1
;
opts
.
context_lines
=
1
;
opts
.
interhunk_lines
=
0
;
memset
(
&
expected
,
0
,
sizeof
(
expected
));
memset
(
&
expected
,
0
,
sizeof
(
expected
));
...
...
tests-clar/diff/diff_helpers.c
View file @
5a0b8803
...
@@ -221,11 +221,15 @@ static int diff_print_cb(
...
@@ -221,11 +221,15 @@ static int diff_print_cb(
const
git_diff_line
*
line
,
const
git_diff_line
*
line
,
void
*
payload
)
void
*
payload
)
{
{
GIT_UNUSED
(
payload
);
FILE
*
fp
=
payload
;
GIT_UNUSED
(
delta
);
GIT_UNUSED
(
hunk
);
GIT_UNUSED
(
delta
);
GIT_UNUSED
(
hunk
);
fprintf
((
FILE
*
)
payload
,
"%c%.*s"
,
line
->
origin
,
(
int
)
line
->
content_len
,
line
->
content
);
if
(
line
->
origin
==
GIT_DIFF_LINE_CONTEXT
||
line
->
origin
==
GIT_DIFF_LINE_ADDITION
||
line
->
origin
==
GIT_DIFF_LINE_DELETION
)
fputc
(
line
->
origin
,
fp
);
fwrite
(
line
->
content
,
1
,
line
->
content_len
,
fp
);
return
0
;
return
0
;
}
}
...
...
tests-clar/diff/tree.c
View file @
5a0b8803
...
@@ -9,9 +9,7 @@ static diff_expects expect;
...
@@ -9,9 +9,7 @@ static diff_expects expect;
void
test_diff_tree__initialize
(
void
)
void
test_diff_tree__initialize
(
void
)
{
{
GIT_INIT_STRUCTURE
(
&
opts
,
GIT_DIFF_OPTIONS_VERSION
);
cl_git_pass
(
git_diff_options_init
(
&
opts
,
GIT_DIFF_OPTIONS_VERSION
));
/* The default context lines is set by _INIT which we can't use here */
opts
.
context_lines
=
3
;
memset
(
&
expect
,
0
,
sizeof
(
expect
));
memset
(
&
expect
,
0
,
sizeof
(
expect
));
...
@@ -91,7 +89,8 @@ void test_diff_tree__0(void)
...
@@ -91,7 +89,8 @@ void test_diff_tree__0(void)
}
}
#define DIFF_OPTS(FLAGS, CTXT) \
#define DIFF_OPTS(FLAGS, CTXT) \
{GIT_DIFF_OPTIONS_VERSION, (FLAGS), 0, {NULL,0}, NULL, NULL, (CTXT), 1}
{GIT_DIFF_OPTIONS_VERSION, (FLAGS), GIT_SUBMODULE_IGNORE_DEFAULT, \
{NULL,0}, NULL, NULL, (CTXT), 1}
void
test_diff_tree__options
(
void
)
void
test_diff_tree__options
(
void
)
{
{
...
...
tests-clar/diff/workdir.c
View file @
5a0b8803
...
@@ -63,6 +63,60 @@ void test_diff_workdir__to_index(void)
...
@@ -63,6 +63,60 @@ void test_diff_workdir__to_index(void)
git_diff_free
(
diff
);
git_diff_free
(
diff
);
}
}
void
test_diff_workdir__to_index_with_assume_unchanged
(
void
)
{
git_diff_options
opts
=
GIT_DIFF_OPTIONS_INIT
;
git_diff
*
diff
=
NULL
;
git_index
*
idx
=
NULL
;
diff_expects
exp
;
const
git_index_entry
*
iep
;
git_index_entry
ie
;
g_repo
=
cl_git_sandbox_init
(
"status"
);
/* do initial diff */
cl_git_pass
(
git_diff_index_to_workdir
(
&
diff
,
g_repo
,
NULL
,
&
opts
));
memset
(
&
exp
,
0
,
sizeof
(
exp
));
cl_git_pass
(
git_diff_foreach
(
diff
,
diff_file_cb
,
diff_hunk_cb
,
diff_line_cb
,
&
exp
));
cl_assert_equal_i
(
8
,
exp
.
files
);
cl_assert_equal_i
(
0
,
exp
.
file_status
[
GIT_DELTA_ADDED
]);
cl_assert_equal_i
(
4
,
exp
.
file_status
[
GIT_DELTA_DELETED
]);
cl_assert_equal_i
(
4
,
exp
.
file_status
[
GIT_DELTA_MODIFIED
]);
git_diff_free
(
diff
);
/* mark a couple of entries with ASSUME_UNCHANGED */
cl_git_pass
(
git_repository_index
(
&
idx
,
g_repo
));
cl_assert
((
iep
=
git_index_get_bypath
(
idx
,
"modified_file"
,
0
))
!=
NULL
);
memcpy
(
&
ie
,
iep
,
sizeof
(
ie
));
ie
.
flags
|=
GIT_IDXENTRY_VALID
;
cl_git_pass
(
git_index_add
(
idx
,
&
ie
));
cl_assert
((
iep
=
git_index_get_bypath
(
idx
,
"file_deleted"
,
0
))
!=
NULL
);
memcpy
(
&
ie
,
iep
,
sizeof
(
ie
));
ie
.
flags
|=
GIT_IDXENTRY_VALID
;
cl_git_pass
(
git_index_add
(
idx
,
&
ie
));
cl_git_pass
(
git_index_write
(
idx
));
git_index_free
(
idx
);
/* redo diff and see that entries are skipped */
cl_git_pass
(
git_diff_index_to_workdir
(
&
diff
,
g_repo
,
NULL
,
&
opts
));
memset
(
&
exp
,
0
,
sizeof
(
exp
));
cl_git_pass
(
git_diff_foreach
(
diff
,
diff_file_cb
,
diff_hunk_cb
,
diff_line_cb
,
&
exp
));
cl_assert_equal_i
(
6
,
exp
.
files
);
cl_assert_equal_i
(
0
,
exp
.
file_status
[
GIT_DELTA_ADDED
]);
cl_assert_equal_i
(
3
,
exp
.
file_status
[
GIT_DELTA_DELETED
]);
cl_assert_equal_i
(
3
,
exp
.
file_status
[
GIT_DELTA_MODIFIED
]);
git_diff_free
(
diff
);
}
void
test_diff_workdir__to_tree
(
void
)
void
test_diff_workdir__to_tree
(
void
)
{
{
/* grabbed a couple of commit oids from the history of the attr repo */
/* grabbed a couple of commit oids from the history of the attr repo */
...
@@ -196,6 +250,38 @@ void test_diff_workdir__to_tree(void)
...
@@ -196,6 +250,38 @@ void test_diff_workdir__to_tree(void)
git_diff_free
(
diff
);
git_diff_free
(
diff
);
/* Let's try that once more with a reversed diff */
opts
.
flags
|=
GIT_DIFF_REVERSE
;
cl_git_pass
(
git_diff_tree_to_index
(
&
diff
,
g_repo
,
b
,
NULL
,
&
opts
));
cl_git_pass
(
git_diff_index_to_workdir
(
&
diff2
,
g_repo
,
NULL
,
&
opts
));
cl_git_pass
(
git_diff_merge
(
diff
,
diff2
));
git_diff_free
(
diff2
);
memset
(
&
exp
,
0
,
sizeof
(
exp
));
cl_git_pass
(
git_diff_foreach
(
diff
,
diff_file_cb
,
diff_hunk_cb
,
diff_line_cb
,
&
exp
));
cl_assert_equal_i
(
16
,
exp
.
files
);
cl_assert_equal_i
(
5
,
exp
.
file_status
[
GIT_DELTA_DELETED
]);
cl_assert_equal_i
(
4
,
exp
.
file_status
[
GIT_DELTA_ADDED
]);
cl_assert_equal_i
(
3
,
exp
.
file_status
[
GIT_DELTA_MODIFIED
]);
cl_assert_equal_i
(
1
,
exp
.
file_status
[
GIT_DELTA_IGNORED
]);
cl_assert_equal_i
(
3
,
exp
.
file_status
[
GIT_DELTA_UNTRACKED
]);
cl_assert_equal_i
(
12
,
exp
.
hunks
);
cl_assert_equal_i
(
19
,
exp
.
lines
);
cl_assert_equal_i
(
3
,
exp
.
line_ctxt
);
cl_assert_equal_i
(
12
,
exp
.
line_dels
);
cl_assert_equal_i
(
4
,
exp
.
line_adds
);
git_diff_free
(
diff
);
/* all done now */
git_tree_free
(
a
);
git_tree_free
(
a
);
git_tree_free
(
b
);
git_tree_free
(
b
);
}
}
...
@@ -1330,3 +1416,73 @@ void test_diff_workdir__patience_diff(void)
...
@@ -1330,3 +1416,73 @@ void test_diff_workdir__patience_diff(void)
git_patch_free
(
patch
);
git_patch_free
(
patch
);
git_diff_free
(
diff
);
git_diff_free
(
diff
);
}
}
void
test_diff_workdir__with_stale_index
(
void
)
{
git_diff_options
opts
=
GIT_DIFF_OPTIONS_INIT
;
git_diff
*
diff
=
NULL
;
git_index
*
idx
=
NULL
;
diff_expects
exp
;
g_repo
=
cl_git_sandbox_init
(
"status"
);
cl_git_pass
(
git_repository_index
(
&
idx
,
g_repo
));
/* make the in-memory index invalid */
{
git_repository
*
r2
;
git_index
*
idx2
;
cl_git_pass
(
git_repository_open
(
&
r2
,
"status"
));
cl_git_pass
(
git_repository_index
(
&
idx2
,
r2
));
cl_git_pass
(
git_index_add_bypath
(
idx2
,
"new_file"
));
cl_git_pass
(
git_index_add_bypath
(
idx2
,
"subdir/new_file"
));
cl_git_pass
(
git_index_remove_bypath
(
idx2
,
"staged_new_file"
));
cl_git_pass
(
git_index_remove_bypath
(
idx2
,
"staged_changes_file_deleted"
));
cl_git_pass
(
git_index_write
(
idx2
));
git_index_free
(
idx2
);
git_repository_free
(
r2
);
}
opts
.
context_lines
=
3
;
opts
.
interhunk_lines
=
1
;
opts
.
flags
|=
GIT_DIFF_INCLUDE_UNTRACKED
|
GIT_DIFF_INCLUDE_UNMODIFIED
;
/* first try with index pointer which should prevent reload */
cl_git_pass
(
git_diff_index_to_workdir
(
&
diff
,
g_repo
,
idx
,
&
opts
));
memset
(
&
exp
,
0
,
sizeof
(
exp
));
cl_git_pass
(
git_diff_foreach
(
diff
,
diff_file_cb
,
diff_hunk_cb
,
diff_line_cb
,
&
exp
));
cl_assert_equal_i
(
17
,
exp
.
files
);
cl_assert_equal_i
(
0
,
exp
.
file_status
[
GIT_DELTA_ADDED
]);
cl_assert_equal_i
(
4
,
exp
.
file_status
[
GIT_DELTA_DELETED
]);
cl_assert_equal_i
(
4
,
exp
.
file_status
[
GIT_DELTA_MODIFIED
]);
cl_assert_equal_i
(
4
,
exp
.
file_status
[
GIT_DELTA_UNTRACKED
]);
cl_assert_equal_i
(
5
,
exp
.
file_status
[
GIT_DELTA_UNMODIFIED
]);
git_diff_free
(
diff
);
/* now let's try without the index pointer which should trigger reload */
/* two files that were UNTRACKED should have become UNMODIFIED */
/* one file that was UNMODIFIED should now have become UNTRACKED */
/* one file that was DELETED should now be gone completely */
cl_git_pass
(
git_diff_index_to_workdir
(
&
diff
,
g_repo
,
NULL
,
&
opts
));
memset
(
&
exp
,
0
,
sizeof
(
exp
));
cl_git_pass
(
git_diff_foreach
(
diff
,
diff_file_cb
,
diff_hunk_cb
,
diff_line_cb
,
&
exp
));
cl_assert_equal_i
(
16
,
exp
.
files
);
cl_assert_equal_i
(
0
,
exp
.
file_status
[
GIT_DELTA_ADDED
]);
cl_assert_equal_i
(
3
,
exp
.
file_status
[
GIT_DELTA_DELETED
]);
cl_assert_equal_i
(
4
,
exp
.
file_status
[
GIT_DELTA_MODIFIED
]);
cl_assert_equal_i
(
3
,
exp
.
file_status
[
GIT_DELTA_UNTRACKED
]);
cl_assert_equal_i
(
6
,
exp
.
file_status
[
GIT_DELTA_UNMODIFIED
]);
git_index_free
(
idx
);
}
tests-clar/index/addall.c
View file @
5a0b8803
...
@@ -68,10 +68,11 @@ static int index_status_cb(
...
@@ -68,10 +68,11 @@ static int index_status_cb(
return
0
;
return
0
;
}
}
static
void
check_status
(
static
void
check_status
_at_line
(
git_repository
*
repo
,
git_repository
*
repo
,
size_t
index_adds
,
size_t
index_dels
,
size_t
index_mods
,
size_t
index_adds
,
size_t
index_dels
,
size_t
index_mods
,
size_t
wt_adds
,
size_t
wt_dels
,
size_t
wt_mods
,
size_t
ignores
)
size_t
wt_adds
,
size_t
wt_dels
,
size_t
wt_mods
,
size_t
ignores
,
const
char
*
file
,
int
line
)
{
{
index_status_counts
vals
;
index_status_counts
vals
;
...
@@ -79,15 +80,25 @@ static void check_status(
...
@@ -79,15 +80,25 @@ static void check_status(
cl_git_pass
(
git_status_foreach
(
repo
,
index_status_cb
,
&
vals
));
cl_git_pass
(
git_status_foreach
(
repo
,
index_status_cb
,
&
vals
));
cl_assert_equal_sz
(
index_adds
,
vals
.
index_adds
);
clar__assert_equal
(
cl_assert_equal_sz
(
index_dels
,
vals
.
index_dels
);
file
,
line
,
"wrong index adds"
,
1
,
"%"
PRIuZ
,
index_adds
,
vals
.
index_adds
);
cl_assert_equal_sz
(
index_mods
,
vals
.
index_mods
);
clar__assert_equal
(
cl_assert_equal_sz
(
wt_adds
,
vals
.
wt_adds
);
file
,
line
,
"wrong index dels"
,
1
,
"%"
PRIuZ
,
index_dels
,
vals
.
index_dels
);
cl_assert_equal_sz
(
wt_dels
,
vals
.
wt_dels
);
clar__assert_equal
(
cl_assert_equal_sz
(
wt_mods
,
vals
.
wt_mods
);
file
,
line
,
"wrong index mods"
,
1
,
"%"
PRIuZ
,
index_mods
,
vals
.
index_mods
);
cl_assert_equal_sz
(
ignores
,
vals
.
ignores
);
clar__assert_equal
(
file
,
line
,
"wrong workdir adds"
,
1
,
"%"
PRIuZ
,
wt_adds
,
vals
.
wt_adds
);
clar__assert_equal
(
file
,
line
,
"wrong workdir dels"
,
1
,
"%"
PRIuZ
,
wt_dels
,
vals
.
wt_dels
);
clar__assert_equal
(
file
,
line
,
"wrong workdir mods"
,
1
,
"%"
PRIuZ
,
wt_mods
,
vals
.
wt_mods
);
clar__assert_equal
(
file
,
line
,
"wrong ignores"
,
1
,
"%"
PRIuZ
,
ignores
,
vals
.
ignores
);
}
}
#define check_status(R,IA,ID,IM,WA,WD,WM,IG) \
check_status_at_line(R,IA,ID,IM,WA,WD,WM,IG,__FILE__,__LINE__)
static
void
check_stat_data
(
git_index
*
index
,
const
char
*
path
,
bool
match
)
static
void
check_stat_data
(
git_index
*
index
,
const
char
*
path
,
bool
match
)
{
{
const
git_index_entry
*
entry
;
const
git_index_entry
*
entry
;
...
...
tests-clar/index/names.c
View file @
5a0b8803
...
@@ -63,7 +63,7 @@ void test_index_names__roundtrip(void)
...
@@ -63,7 +63,7 @@ void test_index_names__roundtrip(void)
git_index_clear
(
repo_index
);
git_index_clear
(
repo_index
);
cl_assert
(
git_index_name_entrycount
(
repo_index
)
==
0
);
cl_assert
(
git_index_name_entrycount
(
repo_index
)
==
0
);
cl_git_pass
(
git_index_read
(
repo_index
));
cl_git_pass
(
git_index_read
(
repo_index
,
true
));
cl_assert
(
git_index_name_entrycount
(
repo_index
)
==
3
);
cl_assert
(
git_index_name_entrycount
(
repo_index
)
==
3
);
conflict_name
=
git_index_name_get_byindex
(
repo_index
,
0
);
conflict_name
=
git_index_name_get_byindex
(
repo_index
,
0
);
...
@@ -120,7 +120,7 @@ void test_index_names__cleaned_on_checkout_tree(void)
...
@@ -120,7 +120,7 @@ void test_index_names__cleaned_on_checkout_tree(void)
git_reference_name_to_id
(
&
oid
,
repo
,
"refs/heads/master"
);
git_reference_name_to_id
(
&
oid
,
repo
,
"refs/heads/master"
);
git_object_lookup
(
&
obj
,
repo
,
&
oid
,
GIT_OBJ_ANY
);
git_object_lookup
(
&
obj
,
repo
,
&
oid
,
GIT_OBJ_ANY
);
git_checkout_tree
(
repo
,
obj
,
&
opts
);
git_checkout_tree
(
repo
,
obj
,
&
opts
);
cl_assert
(
git_index_name_entrycount
(
repo_index
)
==
0
);
cl_assert
_equal_sz
(
0
,
git_index_name_entrycount
(
repo_index
)
);
git_object_free
(
obj
);
git_object_free
(
obj
);
}
}
...
@@ -133,7 +133,7 @@ void test_index_names__cleaned_on_checkout_head(void)
...
@@ -133,7 +133,7 @@ void test_index_names__cleaned_on_checkout_head(void)
test_index_names__add
();
test_index_names__add
();
git_checkout_head
(
repo
,
&
opts
);
git_checkout_head
(
repo
,
&
opts
);
cl_assert
(
git_index_name_entrycount
(
repo_index
)
==
0
);
cl_assert
_equal_sz
(
0
,
git_index_name_entrycount
(
repo_index
)
);
}
}
void
test_index_names__retained_on_checkout_index
(
void
)
void
test_index_names__retained_on_checkout_index
(
void
)
...
...
tests-clar/index/reuc.c
View file @
5a0b8803
...
@@ -276,8 +276,6 @@ void test_index_reuc__write(void)
...
@@ -276,8 +276,6 @@ void test_index_reuc__write(void)
0100644
,
&
their_oid
));
0100644
,
&
their_oid
));
cl_git_pass
(
git_index_write
(
repo_index
));
cl_git_pass
(
git_index_write
(
repo_index
));
cl_git_pass
(
git_index_read
(
repo_index
));
cl_assert_equal_i
(
2
,
git_index_reuc_entrycount
(
repo_index
));
cl_assert_equal_i
(
2
,
git_index_reuc_entrycount
(
repo_index
));
/* ensure sort order was round-tripped correct */
/* ensure sort order was round-tripped correct */
...
...
tests-clar/index/tests.c
View file @
5a0b8803
...
@@ -8,7 +8,7 @@ static const size_t index_entry_count_2 = 1437;
...
@@ -8,7 +8,7 @@ static const size_t index_entry_count_2 = 1437;
#define TEST_INDEXBIG_PATH cl_fixture("big.index")
#define TEST_INDEXBIG_PATH cl_fixture("big.index")
/
/ Suite data
/
* Suite data */
struct
test_entry
{
struct
test_entry
{
size_t
index
;
size_t
index
;
char
path
[
128
];
char
path
[
128
];
...
@@ -24,7 +24,7 @@ static struct test_entry test_entries[] = {
...
@@ -24,7 +24,7 @@ static struct test_entry test_entries[] = {
{
48
,
"src/revobject.h"
,
1448
,
0x4C3F7FE2
}
{
48
,
"src/revobject.h"
,
1448
,
0x4C3F7FE2
}
};
};
/
/ Helpers
/
* Helpers */
static
void
copy_file
(
const
char
*
src
,
const
char
*
dst
)
static
void
copy_file
(
const
char
*
src
,
const
char
*
dst
)
{
{
git_buf
source_buf
=
GIT_BUF_INIT
;
git_buf
source_buf
=
GIT_BUF_INIT
;
...
@@ -32,7 +32,7 @@ static void copy_file(const char *src, const char *dst)
...
@@ -32,7 +32,7 @@ static void copy_file(const char *src, const char *dst)
cl_git_pass
(
git_futils_readbuffer
(
&
source_buf
,
src
));
cl_git_pass
(
git_futils_readbuffer
(
&
source_buf
,
src
));
dst_fd
=
git_futils_creat_withpath
(
dst
,
0777
,
0666
);
/
/-V536
dst_fd
=
git_futils_creat_withpath
(
dst
,
0777
,
0666
);
/
* -V536 */
if
(
dst_fd
<
0
)
if
(
dst_fd
<
0
)
goto
cleanup
;
goto
cleanup
;
...
@@ -66,7 +66,7 @@ static void files_are_equal(const char *a, const char *b)
...
@@ -66,7 +66,7 @@ static void files_are_equal(const char *a, const char *b)
}
}
/
/ Fixture setup and teardown
/
* Fixture setup and teardown */
void
test_index_tests__initialize
(
void
)
void
test_index_tests__initialize
(
void
)
{
{
}
}
...
@@ -173,7 +173,8 @@ void test_index_tests__write(void)
...
@@ -173,7 +173,8 @@ void test_index_tests__write(void)
void
test_index_tests__sort0
(
void
)
void
test_index_tests__sort0
(
void
)
{
{
// sort the entires in an index
/* sort the entires in an index */
/*
/*
* TODO: This no longer applies:
* TODO: This no longer applies:
* index sorting in Git uses some specific changes to the way
* index sorting in Git uses some specific changes to the way
...
@@ -187,7 +188,7 @@ void test_index_tests__sort0(void)
...
@@ -187,7 +188,7 @@ void test_index_tests__sort0(void)
void
test_index_tests__sort1
(
void
)
void
test_index_tests__sort1
(
void
)
{
{
/
/ sort the entires in an empty index
/
* sort the entires in an empty index */
git_index
*
index
;
git_index
*
index
;
cl_git_pass
(
git_index_open
(
&
index
,
"fake-index"
));
cl_git_pass
(
git_index_open
(
&
index
,
"fake-index"
));
...
@@ -349,14 +350,14 @@ void test_index_tests__remove_entry(void)
...
@@ -349,14 +350,14 @@ void test_index_tests__remove_entry(void)
cl_git_pass
(
git_index_add_bypath
(
index
,
"hello"
));
cl_git_pass
(
git_index_add_bypath
(
index
,
"hello"
));
cl_git_pass
(
git_index_write
(
index
));
cl_git_pass
(
git_index_write
(
index
));
cl_git_pass
(
git_index_read
(
index
));
/* reload */
cl_git_pass
(
git_index_read
(
index
,
true
));
/* reload */
cl_assert
(
git_index_entrycount
(
index
)
==
1
);
cl_assert
(
git_index_entrycount
(
index
)
==
1
);
cl_assert
(
git_index_get_bypath
(
index
,
"hello"
,
0
)
!=
NULL
);
cl_assert
(
git_index_get_bypath
(
index
,
"hello"
,
0
)
!=
NULL
);
cl_git_pass
(
git_index_remove
(
index
,
"hello"
,
0
));
cl_git_pass
(
git_index_remove
(
index
,
"hello"
,
0
));
cl_git_pass
(
git_index_write
(
index
));
cl_git_pass
(
git_index_write
(
index
));
cl_git_pass
(
git_index_read
(
index
));
/* reload */
cl_git_pass
(
git_index_read
(
index
,
true
));
/* reload */
cl_assert
(
git_index_entrycount
(
index
)
==
0
);
cl_assert
(
git_index_entrycount
(
index
)
==
0
);
cl_assert
(
git_index_get_bypath
(
index
,
"hello"
,
0
)
==
NULL
);
cl_assert
(
git_index_get_bypath
(
index
,
"hello"
,
0
)
==
NULL
);
...
@@ -388,7 +389,7 @@ void test_index_tests__remove_directory(void)
...
@@ -388,7 +389,7 @@ void test_index_tests__remove_directory(void)
cl_git_pass
(
git_index_add_bypath
(
index
,
"b.txt"
));
cl_git_pass
(
git_index_add_bypath
(
index
,
"b.txt"
));
cl_git_pass
(
git_index_write
(
index
));
cl_git_pass
(
git_index_write
(
index
));
cl_git_pass
(
git_index_read
(
index
));
/* reload */
cl_git_pass
(
git_index_read
(
index
,
true
));
/* reload */
cl_assert_equal_i
(
4
,
(
int
)
git_index_entrycount
(
index
));
cl_assert_equal_i
(
4
,
(
int
)
git_index_entrycount
(
index
));
cl_assert
(
git_index_get_bypath
(
index
,
"a/1.txt"
,
0
)
!=
NULL
);
cl_assert
(
git_index_get_bypath
(
index
,
"a/1.txt"
,
0
)
!=
NULL
);
cl_assert
(
git_index_get_bypath
(
index
,
"a/2.txt"
,
0
)
!=
NULL
);
cl_assert
(
git_index_get_bypath
(
index
,
"a/2.txt"
,
0
)
!=
NULL
);
...
@@ -397,7 +398,7 @@ void test_index_tests__remove_directory(void)
...
@@ -397,7 +398,7 @@ void test_index_tests__remove_directory(void)
cl_git_pass
(
git_index_remove
(
index
,
"a/1.txt"
,
0
));
cl_git_pass
(
git_index_remove
(
index
,
"a/1.txt"
,
0
));
cl_git_pass
(
git_index_write
(
index
));
cl_git_pass
(
git_index_write
(
index
));
cl_git_pass
(
git_index_read
(
index
));
/* reload */
cl_git_pass
(
git_index_read
(
index
,
true
));
/* reload */
cl_assert_equal_i
(
3
,
(
int
)
git_index_entrycount
(
index
));
cl_assert_equal_i
(
3
,
(
int
)
git_index_entrycount
(
index
));
cl_assert
(
git_index_get_bypath
(
index
,
"a/1.txt"
,
0
)
==
NULL
);
cl_assert
(
git_index_get_bypath
(
index
,
"a/1.txt"
,
0
)
==
NULL
);
cl_assert
(
git_index_get_bypath
(
index
,
"a/2.txt"
,
0
)
!=
NULL
);
cl_assert
(
git_index_get_bypath
(
index
,
"a/2.txt"
,
0
)
!=
NULL
);
...
@@ -406,7 +407,7 @@ void test_index_tests__remove_directory(void)
...
@@ -406,7 +407,7 @@ void test_index_tests__remove_directory(void)
cl_git_pass
(
git_index_remove_directory
(
index
,
"a"
,
0
));
cl_git_pass
(
git_index_remove_directory
(
index
,
"a"
,
0
));
cl_git_pass
(
git_index_write
(
index
));
cl_git_pass
(
git_index_write
(
index
));
cl_git_pass
(
git_index_read
(
index
));
/* reload */
cl_git_pass
(
git_index_read
(
index
,
true
));
/* reload */
cl_assert_equal_i
(
1
,
(
int
)
git_index_entrycount
(
index
));
cl_assert_equal_i
(
1
,
(
int
)
git_index_entrycount
(
index
));
cl_assert
(
git_index_get_bypath
(
index
,
"a/1.txt"
,
0
)
==
NULL
);
cl_assert
(
git_index_get_bypath
(
index
,
"a/1.txt"
,
0
)
==
NULL
);
cl_assert
(
git_index_get_bypath
(
index
,
"a/2.txt"
,
0
)
==
NULL
);
cl_assert
(
git_index_get_bypath
(
index
,
"a/2.txt"
,
0
)
==
NULL
);
...
@@ -517,7 +518,7 @@ void test_index_tests__reload_from_disk(void)
...
@@ -517,7 +518,7 @@ void test_index_tests__reload_from_disk(void)
/* Sync the changes back into the read_index */
/* Sync the changes back into the read_index */
cl_assert_equal_sz
(
0
,
git_index_entrycount
(
read_index
));
cl_assert_equal_sz
(
0
,
git_index_entrycount
(
read_index
));
cl_git_pass
(
git_index_read
(
read_index
));
cl_git_pass
(
git_index_read
(
read_index
,
true
));
cl_assert_equal_i
(
true
,
read_index
->
on_disk
);
cl_assert_equal_i
(
true
,
read_index
->
on_disk
);
cl_assert_equal_sz
(
2
,
git_index_entrycount
(
read_index
));
cl_assert_equal_sz
(
2
,
git_index_entrycount
(
read_index
));
...
@@ -526,7 +527,7 @@ void test_index_tests__reload_from_disk(void)
...
@@ -526,7 +527,7 @@ void test_index_tests__reload_from_disk(void)
cl_git_pass
(
p_unlink
(
write_index
->
index_file_path
));
cl_git_pass
(
p_unlink
(
write_index
->
index_file_path
));
/* Sync the changes back into the read_index */
/* Sync the changes back into the read_index */
cl_git_pass
(
git_index_read
(
read_index
));
cl_git_pass
(
git_index_read
(
read_index
,
true
));
cl_assert_equal_i
(
false
,
read_index
->
on_disk
);
cl_assert_equal_i
(
false
,
read_index
->
on_disk
);
cl_assert_equal_sz
(
0
,
git_index_entrycount
(
read_index
));
cl_assert_equal_sz
(
0
,
git_index_entrycount
(
read_index
));
...
...
tests-clar/status/worktree.c
View file @
5a0b8803
...
@@ -470,16 +470,15 @@ void test_status_worktree__conflict_with_diff3(void)
...
@@ -470,16 +470,15 @@ void test_status_worktree__conflict_with_diff3(void)
cl_assert_equal_i
(
GIT_STATUS_WT_MODIFIED
,
status
);
cl_assert_equal_i
(
GIT_STATUS_WT_MODIFIED
,
status
);
cl_git_pass
(
git_repository_index
(
&
index
,
repo
));
cl_git_pass
(
git_repository_index
(
&
index
,
repo
));
cl_git_pass
(
git_index_remove
(
index
,
"modified_file"
,
0
));
cl_git_pass
(
git_index_remove
(
index
,
"modified_file"
,
0
));
cl_git_pass
(
git_index_conflict_add
(
index
,
&
ancestor_entry
,
cl_git_pass
(
git_index_conflict_add
(
&
our_entry
,
&
their_entry
));
index
,
&
ancestor_entry
,
&
our_entry
,
&
their_entry
));
cl_git_pass
(
git_index_write
(
index
));
git_index_free
(
index
);
cl_git_pass
(
git_status_file
(
&
status
,
repo
,
"modified_file"
));
cl_git_pass
(
git_status_file
(
&
status
,
repo
,
"modified_file"
));
cl_assert_equal_i
(
GIT_STATUS_INDEX_DELETED
|
GIT_STATUS_WT_NEW
,
status
);
cl_assert_equal_i
(
GIT_STATUS_INDEX_DELETED
|
GIT_STATUS_WT_NEW
,
status
);
git_index_free
(
index
);
}
}
static
const
char
*
filemode_paths
[]
=
{
static
const
char
*
filemode_paths
[]
=
{
...
...
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