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
a291790a
Commit
a291790a
authored
Feb 15, 2015
by
Carlos Martín Nieto
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #2831 from ethomson/merge_lock
merge: lock index during the merge (not just checkout)
parents
a7fa970f
41fae48d
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
332 additions
and
64 deletions
+332
-64
include/git2/checkout.h
+7
-1
src/checkout.c
+4
-1
src/cherrypick.c
+12
-6
src/index.c
+93
-29
src/index.h
+29
-0
src/merge.c
+14
-11
src/rebase.c
+9
-6
src/revert.c
+11
-6
tests/checkout/tree.c
+80
-0
tests/index/tests.c
+21
-0
tests/merge/workdir/setup.c
+52
-4
No files found.
include/git2/checkout.h
View file @
a291790a
...
...
@@ -135,7 +135,10 @@ typedef enum {
/** Only update existing files, don't create new ones */
GIT_CHECKOUT_UPDATE_ONLY
=
(
1u
<<
7
),
/** Normally checkout updates index entries as it goes; this stops that */
/**
* Normally checkout updates index entries as it goes; this stops that.
* Implies `GIT_CHECKOUT_DONT_WRITE_INDEX`.
*/
GIT_CHECKOUT_DONT_UPDATE_INDEX
=
(
1u
<<
8
),
/** Don't refresh index/config/etc before doing checkout */
...
...
@@ -166,6 +169,9 @@ typedef enum {
/** Don't overwrite existing files or folders */
GIT_CHECKOUT_DONT_REMOVE_EXISTING
=
(
1u
<<
22
),
/** Normally checkout writes the index upon completion; this prevents that. */
GIT_CHECKOUT_DONT_WRITE_INDEX
=
(
1u
<<
23
),
/**
* THE FOLLOWING OPTIONS ARE NOT YET IMPLEMENTED
*/
...
...
src/checkout.c
View file @
a291790a
...
...
@@ -2375,6 +2375,9 @@ cleanup:
return
error
;
}
#define CHECKOUT_INDEX_DONT_WRITE_MASK \
(GIT_CHECKOUT_DONT_UPDATE_INDEX | GIT_CHECKOUT_DONT_WRITE_INDEX)
int
git_checkout_iterator
(
git_iterator
*
target
,
git_index
*
index
,
...
...
@@ -2481,7 +2484,7 @@ int git_checkout_iterator(
cleanup
:
if
(
!
error
&&
data
.
index
!=
NULL
&&
(
data
.
strategy
&
GIT_CHECKOUT_DONT_UPDATE_INDEX
)
==
0
)
(
data
.
strategy
&
CHECKOUT_INDEX_DONT_WRITE_MASK
)
==
0
)
error
=
git_index_write
(
data
.
index
);
git_diff_free
(
data
.
diff
);
...
...
src/cherrypick.c
View file @
a291790a
...
...
@@ -10,6 +10,7 @@
#include "filebuf.h"
#include "merge.h"
#include "vector.h"
#include "index.h"
#include "git2/types.h"
#include "git2/merge.h"
...
...
@@ -171,7 +172,8 @@ int git_cherrypick(
char
commit_oidstr
[
GIT_OID_HEXSZ
+
1
];
const
char
*
commit_msg
,
*
commit_summary
;
git_buf
their_label
=
GIT_BUF_INIT
;
git_index
*
index_new
=
NULL
;
git_index
*
index
=
NULL
;
git_indexwriter
indexwriter
=
GIT_INDEXWRITER_INIT
;
int
error
=
0
;
assert
(
repo
&&
commit
);
...
...
@@ -192,21 +194,25 @@ int git_cherrypick(
if
((
error
=
write_merge_msg
(
repo
,
commit_msg
))
<
0
||
(
error
=
git_buf_printf
(
&
their_label
,
"%.7s... %s"
,
commit_oidstr
,
commit_summary
))
<
0
||
(
error
=
cherrypick_normalize_opts
(
repo
,
&
opts
,
given_opts
,
git_buf_cstr
(
&
their_label
)))
<
0
||
(
error
=
git_indexwriter_init_for_operation
(
&
indexwriter
,
repo
,
&
opts
.
checkout_opts
.
checkout_strategy
))
<
0
||
(
error
=
write_cherrypick_head
(
repo
,
commit_oidstr
))
<
0
||
(
error
=
git_repository_head
(
&
our_ref
,
repo
))
<
0
||
(
error
=
git_reference_peel
((
git_object
**
)
&
our_commit
,
our_ref
,
GIT_OBJ_COMMIT
))
<
0
||
(
error
=
git_cherrypick_commit
(
&
index_new
,
repo
,
commit
,
our_commit
,
opts
.
mainline
,
&
opts
.
merge_opts
))
<
0
||
(
error
=
git_merge__check_result
(
repo
,
index_new
))
<
0
||
(
error
=
git_merge__append_conflicts_to_merge_msg
(
repo
,
index_new
))
<
0
||
(
error
=
git_checkout_index
(
repo
,
index_new
,
&
opts
.
checkout_opts
))
<
0
)
(
error
=
git_cherrypick_commit
(
&
index
,
repo
,
commit
,
our_commit
,
opts
.
mainline
,
&
opts
.
merge_opts
))
<
0
||
(
error
=
git_merge__check_result
(
repo
,
index
))
<
0
||
(
error
=
git_merge__append_conflicts_to_merge_msg
(
repo
,
index
))
<
0
||
(
error
=
git_checkout_index
(
repo
,
index
,
&
opts
.
checkout_opts
))
<
0
||
(
error
=
git_indexwriter_commit
(
&
indexwriter
))
<
0
)
goto
on_error
;
goto
done
;
on_error:
cherrypick_state_cleanup
(
repo
);
done:
git_index_free
(
index_new
);
git_indexwriter_cleanup
(
&
indexwriter
);
git_index_free
(
index
);
git_commit_free
(
our_commit
);
git_reference_free
(
our_ref
);
git_buf_free
(
&
their_label
);
...
...
src/index.c
View file @
a291790a
...
...
@@ -656,39 +656,15 @@ int git_index__changed_relative_to(
int
git_index_write
(
git_index
*
index
)
{
git_
filebuf
file
=
GIT_FILEBUF
_INIT
;
git_
indexwriter
writer
=
GIT_INDEXWRITER
_INIT
;
int
error
;
if
(
!
index
->
index_file_path
)
return
create_index_error
(
-
1
,
"Failed to read index: The index is in-memory only"
);
if
(
index_sort_if_needed
(
index
,
true
)
<
0
)
return
-
1
;
git_vector_sort
(
&
index
->
reuc
);
if
((
error
=
git_filebuf_open
(
&
file
,
index
->
index_file_path
,
GIT_FILEBUF_HASH_CONTENTS
,
GIT_INDEX_FILE_MODE
))
<
0
)
{
if
(
error
==
GIT_ELOCKED
)
giterr_set
(
GITERR_INDEX
,
"The index is locked. This might be due to a concurrent or crashed process"
);
return
error
;
}
if
((
error
=
write_index
(
index
,
&
file
))
<
0
)
{
git_filebuf_cleanup
(
&
file
);
return
error
;
}
if
((
error
=
git_indexwriter_init
(
&
writer
,
index
))
==
0
)
error
=
git_indexwriter_commit
(
&
writer
);
if
((
error
=
git_filebuf_commit
(
&
file
))
<
0
)
return
error
;
if
(
git_futils_filestamp_check
(
&
index
->
stamp
,
index
->
index_file_path
)
<
0
)
/* index could not be read from disk! */
;
else
index
->
on_disk
=
1
;
git_indexwriter_cleanup
(
&
writer
);
return
0
;
return
error
;
}
const
char
*
git_index_path
(
const
git_index
*
index
)
...
...
@@ -2695,3 +2671,91 @@ int git_index_snapshot_find(
{
return
index_find_in_entries
(
out
,
entries
,
entry_srch
,
path
,
path_len
,
stage
);
}
int
git_indexwriter_init
(
git_indexwriter
*
writer
,
git_index
*
index
)
{
int
error
;
GIT_REFCOUNT_INC
(
index
);
writer
->
index
=
index
;
if
(
!
index
->
index_file_path
)
return
create_index_error
(
-
1
,
"Failed to write index: The index is in-memory only"
);
if
((
error
=
git_filebuf_open
(
&
writer
->
file
,
index
->
index_file_path
,
GIT_FILEBUF_HASH_CONTENTS
,
GIT_INDEX_FILE_MODE
))
<
0
)
{
if
(
error
==
GIT_ELOCKED
)
giterr_set
(
GITERR_INDEX
,
"The index is locked. This might be due to a concurrent or crashed process"
);
return
error
;
}
writer
->
should_write
=
1
;
return
0
;
}
int
git_indexwriter_init_for_operation
(
git_indexwriter
*
writer
,
git_repository
*
repo
,
unsigned
int
*
checkout_strategy
)
{
git_index
*
index
;
int
error
;
if
((
error
=
git_repository_index__weakptr
(
&
index
,
repo
))
<
0
||
(
error
=
git_indexwriter_init
(
writer
,
index
))
<
0
)
return
error
;
writer
->
should_write
=
(
*
checkout_strategy
&
GIT_CHECKOUT_DONT_WRITE_INDEX
)
==
0
;
*
checkout_strategy
|=
GIT_CHECKOUT_DONT_WRITE_INDEX
;
return
0
;
}
int
git_indexwriter_commit
(
git_indexwriter
*
writer
)
{
int
error
;
if
(
!
writer
->
should_write
)
return
0
;
if
(
index_sort_if_needed
(
writer
->
index
,
true
)
<
0
)
return
-
1
;
git_vector_sort
(
&
writer
->
index
->
reuc
);
if
((
error
=
write_index
(
writer
->
index
,
&
writer
->
file
))
<
0
)
{
git_indexwriter_cleanup
(
writer
);
return
error
;
}
if
((
error
=
git_filebuf_commit
(
&
writer
->
file
))
<
0
)
return
error
;
if
((
error
=
git_futils_filestamp_check
(
&
writer
->
index
->
stamp
,
writer
->
index
->
index_file_path
))
<
0
)
{
giterr_set
(
GITERR_OS
,
"Could not read index timestamp"
);
return
-
1
;
}
writer
->
index
->
on_disk
=
1
;
git_index_free
(
writer
->
index
);
writer
->
index
=
NULL
;
return
0
;
}
void
git_indexwriter_cleanup
(
git_indexwriter
*
writer
)
{
git_filebuf_cleanup
(
&
writer
->
file
);
git_index_free
(
writer
->
index
);
writer
->
index
=
NULL
;
}
src/index.h
View file @
a291790a
...
...
@@ -94,4 +94,33 @@ extern int git_index_snapshot_find(
const
char
*
path
,
size_t
path_len
,
int
stage
);
typedef
struct
{
git_index
*
index
;
git_filebuf
file
;
unsigned
int
should_write
:
1
;
}
git_indexwriter
;
#define GIT_INDEXWRITER_INIT { NULL, GIT_FILEBUF_INIT }
/* Lock the index for eventual writing. */
extern
int
git_indexwriter_init
(
git_indexwriter
*
writer
,
git_index
*
index
);
/* Lock the index for eventual writing by a repository operation: a merge,
* revert, cherry-pick or a rebase. Note that the given checkout strategy
* will be updated for the operation's use so that checkout will not write
* the index.
*/
extern
int
git_indexwriter_init_for_operation
(
git_indexwriter
*
writer
,
git_repository
*
repo
,
unsigned
int
*
checkout_strategy
);
/* Write the index and unlock it. */
extern
int
git_indexwriter_commit
(
git_indexwriter
*
writer
);
/* Cleanup an index writing session, unlocking the file (if it is still
* locked and freeing any data structures.
*/
extern
void
git_indexwriter_cleanup
(
git_indexwriter
*
writer
);
#endif
src/merge.c
View file @
a291790a
...
...
@@ -2652,7 +2652,8 @@ int git_merge(
git_checkout_options
checkout_opts
;
git_annotated_commit
*
ancestor_head
=
NULL
,
*
our_head
=
NULL
;
git_tree
*
ancestor_tree
=
NULL
,
*
our_tree
=
NULL
,
**
their_trees
=
NULL
;
git_index
*
index_new
=
NULL
;
git_index
*
index
=
NULL
;
git_indexwriter
indexwriter
=
GIT_INDEXWRITER_INIT
;
size_t
i
;
int
error
=
0
;
...
...
@@ -2666,11 +2667,10 @@ int git_merge(
their_trees
=
git__calloc
(
their_heads_len
,
sizeof
(
git_tree
*
));
GITERR_CHECK_ALLOC
(
their_trees
);
if
((
error
=
merge_heads
(
&
ancestor_head
,
&
our_head
,
repo
,
their_heads
,
their_heads_len
))
<
0
)
goto
on_error
;
if
((
error
=
merge_normalize_checkout_opts
(
repo
,
&
checkout_opts
,
given_checkout_opts
,
ancestor_head
,
our_head
,
their_heads_len
,
their_heads
))
<
0
)
if
((
error
=
merge_heads
(
&
ancestor_head
,
&
our_head
,
repo
,
their_heads
,
their_heads_len
))
<
0
||
(
error
=
merge_normalize_checkout_opts
(
repo
,
&
checkout_opts
,
given_checkout_opts
,
ancestor_head
,
our_head
,
their_heads_len
,
their_heads
))
<
0
||
(
error
=
git_indexwriter_init_for_operation
(
&
indexwriter
,
repo
,
&
checkout_opts
.
checkout_strategy
))
<
0
)
goto
on_error
;
/* Write the merge files to the repository. */
...
...
@@ -2691,10 +2691,11 @@ int git_merge(
/* TODO: recursive, octopus, etc... */
if
((
error
=
git_merge_trees
(
&
index_new
,
repo
,
ancestor_tree
,
our_tree
,
their_trees
[
0
],
merge_opts
))
<
0
||
(
error
=
git_merge__check_result
(
repo
,
index_new
))
<
0
||
(
error
=
git_merge__append_conflicts_to_merge_msg
(
repo
,
index_new
))
<
0
||
(
error
=
git_checkout_index
(
repo
,
index_new
,
&
checkout_opts
))
<
0
)
if
((
error
=
git_merge_trees
(
&
index
,
repo
,
ancestor_tree
,
our_tree
,
their_trees
[
0
],
merge_opts
))
<
0
||
(
error
=
git_merge__check_result
(
repo
,
index
))
<
0
||
(
error
=
git_merge__append_conflicts_to_merge_msg
(
repo
,
index
))
<
0
||
(
error
=
git_checkout_index
(
repo
,
index
,
&
checkout_opts
))
<
0
||
(
error
=
git_indexwriter_commit
(
&
indexwriter
))
<
0
)
goto
on_error
;
goto
done
;
...
...
@@ -2703,7 +2704,9 @@ on_error:
merge_state_cleanup
(
repo
);
done:
git_index_free
(
index_new
);
git_indexwriter_cleanup
(
&
indexwriter
);
git_index_free
(
index
);
git_tree_free
(
ancestor_tree
);
git_tree_free
(
our_tree
);
...
...
src/rebase.c
View file @
a291790a
...
...
@@ -14,6 +14,7 @@
#include "array.h"
#include "config.h"
#include "annotated_commit.h"
#include "index.h"
#include <git2/types.h>
#include <git2/annotated_commit.h>
...
...
@@ -763,6 +764,7 @@ static int rebase_next_merge(
git_commit
*
current_commit
=
NULL
,
*
parent_commit
=
NULL
;
git_tree
*
current_tree
=
NULL
,
*
head_tree
=
NULL
,
*
parent_tree
=
NULL
;
git_index
*
index
=
NULL
;
git_indexwriter
indexwriter
=
GIT_INDEXWRITER_INIT
;
git_rebase_operation
*
operation
;
char
current_idstr
[
GIT_OID_HEXSZ
];
unsigned
int
parent_count
;
...
...
@@ -792,20 +794,21 @@ static int rebase_next_merge(
git_oid_fmt
(
current_idstr
,
&
operation
->
id
);
if
((
error
=
rebase_setupfile
(
rebase
,
MSGNUM_FILE
,
-
1
,
"%d
\n
"
,
rebase
->
current
+
1
))
<
0
||
(
error
=
rebase_setupfile
(
rebase
,
CURRENT_FILE
,
-
1
,
"%.*s
\n
"
,
GIT_OID_HEXSZ
,
current_idstr
))
<
0
)
goto
done
;
normalize_checkout_opts
(
rebase
,
current_commit
,
&
checkout_opts
,
given_checkout_opts
);
if
((
error
=
git_merge_trees
(
&
index
,
rebase
->
repo
,
parent_tree
,
head_tree
,
current_tree
,
NULL
))
<
0
||
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
,
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
||
(
error
=
git_checkout_index
(
rebase
->
repo
,
index
,
&
checkout_opts
))
<
0
)
(
error
=
git_checkout_index
(
rebase
->
repo
,
index
,
&
checkout_opts
))
<
0
||
(
error
=
git_indexwriter_commit
(
&
indexwriter
))
<
0
)
goto
done
;
*
out
=
operation
;
done
:
git_indexwriter_cleanup
(
&
indexwriter
);
git_index_free
(
index
);
git_tree_free
(
current_tree
);
git_tree_free
(
head_tree
);
...
...
src/revert.c
View file @
a291790a
...
...
@@ -9,6 +9,7 @@
#include "repository.h"
#include "filebuf.h"
#include "merge.h"
#include "index.h"
#include "git2/types.h"
#include "git2/merge.h"
...
...
@@ -174,7 +175,8 @@ int git_revert(
char
commit_oidstr
[
GIT_OID_HEXSZ
+
1
];
const
char
*
commit_msg
;
git_buf
their_label
=
GIT_BUF_INIT
;
git_index
*
index_new
=
NULL
;
git_index
*
index
=
NULL
;
git_indexwriter
indexwriter
=
GIT_INDEXWRITER_INIT
;
int
error
;
assert
(
repo
&&
commit
);
...
...
@@ -194,14 +196,16 @@ int git_revert(
if
((
error
=
git_buf_printf
(
&
their_label
,
"parent of %.7s... %s"
,
commit_oidstr
,
commit_msg
))
<
0
||
(
error
=
revert_normalize_opts
(
repo
,
&
opts
,
given_opts
,
git_buf_cstr
(
&
their_label
)))
<
0
||
(
error
=
git_indexwriter_init_for_operation
(
&
indexwriter
,
repo
,
&
opts
.
checkout_opts
.
checkout_strategy
))
<
0
||
(
error
=
write_revert_head
(
repo
,
commit_oidstr
))
<
0
||
(
error
=
write_merge_msg
(
repo
,
commit_oidstr
,
commit_msg
))
<
0
||
(
error
=
git_repository_head
(
&
our_ref
,
repo
))
<
0
||
(
error
=
git_reference_peel
((
git_object
**
)
&
our_commit
,
our_ref
,
GIT_OBJ_COMMIT
))
<
0
||
(
error
=
git_revert_commit
(
&
index_new
,
repo
,
commit
,
our_commit
,
opts
.
mainline
,
&
opts
.
merge_opts
))
<
0
||
(
error
=
git_merge__check_result
(
repo
,
index_new
))
<
0
||
(
error
=
git_merge__append_conflicts_to_merge_msg
(
repo
,
index_new
))
<
0
||
(
error
=
git_checkout_index
(
repo
,
index_new
,
&
opts
.
checkout_opts
))
<
0
)
(
error
=
git_revert_commit
(
&
index
,
repo
,
commit
,
our_commit
,
opts
.
mainline
,
&
opts
.
merge_opts
))
<
0
||
(
error
=
git_merge__check_result
(
repo
,
index
))
<
0
||
(
error
=
git_merge__append_conflicts_to_merge_msg
(
repo
,
index
))
<
0
||
(
error
=
git_checkout_index
(
repo
,
index
,
&
opts
.
checkout_opts
))
<
0
||
(
error
=
git_indexwriter_commit
(
&
indexwriter
))
<
0
)
goto
on_error
;
goto
done
;
...
...
@@ -210,7 +214,8 @@ on_error:
revert_state_cleanup
(
repo
);
done:
git_index_free
(
index_new
);
git_indexwriter_cleanup
(
&
indexwriter
);
git_index_free
(
index
);
git_commit_free
(
our_commit
);
git_reference_free
(
our_ref
);
git_buf_free
(
&
their_label
);
...
...
tests/checkout/tree.c
View file @
a291790a
...
...
@@ -1184,3 +1184,83 @@ void test_checkout_tree__caches_attributes_during_checkout(void)
git_buf_free
(
&
ident2
);
git_object_free
(
obj
);
}
void
test_checkout_tree__can_not_update_index
(
void
)
{
git_oid
oid
;
git_object
*
head
;
unsigned
int
status
;
git_checkout_options
opts
=
GIT_CHECKOUT_OPTIONS_INIT
;
git_index
*
index
;
opts
.
checkout_strategy
|=
GIT_CHECKOUT_FORCE
|
GIT_CHECKOUT_DONT_UPDATE_INDEX
;
cl_git_pass
(
git_reference_name_to_id
(
&
oid
,
g_repo
,
"HEAD"
));
cl_git_pass
(
git_object_lookup
(
&
head
,
g_repo
,
&
oid
,
GIT_OBJ_ANY
));
cl_git_pass
(
git_reset
(
g_repo
,
head
,
GIT_RESET_HARD
,
&
g_opts
,
NULL
,
NULL
));
cl_assert_equal_i
(
false
,
git_path_isdir
(
"./testrepo/ab/"
));
cl_git_pass
(
git_revparse_single
(
&
g_object
,
g_repo
,
"subtrees"
));
cl_git_pass
(
git_checkout_tree
(
g_repo
,
g_object
,
&
opts
));
cl_assert_equal_i
(
true
,
git_path_isfile
(
"./testrepo/ab/de/2.txt"
));
cl_git_pass
(
git_status_file
(
&
status
,
g_repo
,
"ab/de/2.txt"
));
cl_assert_equal_i
(
GIT_STATUS_WT_NEW
,
status
);
cl_git_pass
(
git_repository_index
(
&
index
,
g_repo
));
cl_git_pass
(
git_index_write
(
index
));
cl_git_pass
(
git_status_file
(
&
status
,
g_repo
,
"ab/de/2.txt"
));
cl_assert_equal_i
(
GIT_STATUS_WT_NEW
,
status
);
git_object_free
(
head
);
git_index_free
(
index
);
}
void
test_checkout_tree__can_update_but_not_write_index
(
void
)
{
git_oid
oid
;
git_object
*
head
;
unsigned
int
status
;
git_checkout_options
opts
=
GIT_CHECKOUT_OPTIONS_INIT
;
git_index
*
index
;
git_repository
*
other
;
opts
.
checkout_strategy
|=
GIT_CHECKOUT_FORCE
|
GIT_CHECKOUT_DONT_WRITE_INDEX
;
cl_git_pass
(
git_reference_name_to_id
(
&
oid
,
g_repo
,
"HEAD"
));
cl_git_pass
(
git_object_lookup
(
&
head
,
g_repo
,
&
oid
,
GIT_OBJ_ANY
));
cl_git_pass
(
git_reset
(
g_repo
,
head
,
GIT_RESET_HARD
,
&
g_opts
,
NULL
,
NULL
));
cl_assert_equal_i
(
false
,
git_path_isdir
(
"./testrepo/ab/"
));
cl_git_pass
(
git_revparse_single
(
&
g_object
,
g_repo
,
"subtrees"
));
cl_git_pass
(
git_checkout_tree
(
g_repo
,
g_object
,
&
opts
));
cl_assert_equal_i
(
true
,
git_path_isfile
(
"./testrepo/ab/de/2.txt"
));
cl_git_pass
(
git_status_file
(
&
status
,
g_repo
,
"ab/de/2.txt"
));
cl_assert_equal_i
(
GIT_STATUS_INDEX_NEW
,
status
);
cl_git_pass
(
git_repository_open
(
&
other
,
"testrepo"
));
cl_git_pass
(
git_status_file
(
&
status
,
other
,
"ab/de/2.txt"
));
cl_assert_equal_i
(
GIT_STATUS_WT_NEW
,
status
);
git_repository_free
(
other
);
cl_git_pass
(
git_repository_index
(
&
index
,
g_repo
));
cl_git_pass
(
git_index_write
(
index
));
cl_git_pass
(
git_repository_open
(
&
other
,
"testrepo"
));
cl_git_pass
(
git_status_file
(
&
status
,
other
,
"ab/de/2.txt"
));
cl_assert_equal_i
(
GIT_STATUS_INDEX_NEW
,
status
);
git_repository_free
(
other
);
git_object_free
(
head
);
git_index_free
(
index
);
}
tests/index/tests.c
View file @
a291790a
...
...
@@ -677,3 +677,24 @@ void test_index_tests__reload_while_ignoring_case(void)
git_index_free
(
index
);
}
void
test_index_tests__can_lock_index
(
void
)
{
git_index
*
index
;
git_indexwriter
one
=
GIT_INDEXWRITER_INIT
,
two
=
GIT_INDEXWRITER_INIT
;
cl_git_pass
(
git_index_open
(
&
index
,
TEST_INDEX_PATH
));
cl_git_pass
(
git_indexwriter_init
(
&
one
,
index
));
cl_git_fail_with
(
GIT_ELOCKED
,
git_indexwriter_init
(
&
two
,
index
));
cl_git_fail_with
(
GIT_ELOCKED
,
git_index_write
(
index
));
cl_git_pass
(
git_indexwriter_commit
(
&
one
));
cl_git_pass
(
git_index_write
(
index
));
git_indexwriter_cleanup
(
&
one
);
git_indexwriter_cleanup
(
&
two
);
git_index_free
(
index
);
}
tests/merge/workdir/setup.c
View file @
a291790a
...
...
@@ -1018,6 +1018,7 @@ void test_merge_workdir_setup__retained_after_success(void)
git_annotated_commit_free
(
their_heads
[
0
]);
}
void
test_merge_workdir_setup__removed_after_failure
(
void
)
{
git_oid
our_oid
;
...
...
@@ -1030,16 +1031,63 @@ void test_merge_workdir_setup__removed_after_failure(void)
cl_git_pass
(
git_reference_lookup
(
&
octo1_ref
,
repo
,
GIT_REFS_HEADS_DIR
OCTO1_BRANCH
));
cl_git_pass
(
git_annotated_commit_from_ref
(
&
their_heads
[
0
],
repo
,
octo1_ref
));
cl_git_write2file
(
"merge-resolve/.git/index.lock"
,
"foo
\n
"
,
4
,
O_RDWR
|
O_CREAT
,
0666
);
cl_git_fail
(
git_merge
(
repo
,
(
const
git_annotated_commit
**
)
&
their_heads
[
0
],
1
,
NULL
,
NULL
));
cl_assert
(
!
git_path_exists
(
"merge-resolve/.git/"
GIT_MERGE_HEAD_FILE
));
cl_assert
(
!
git_path_exists
(
"merge-resolve/.git/"
GIT_MERGE_MODE_FILE
));
cl_assert
(
!
git_path_exists
(
"merge-resolve/.git/"
GIT_MERGE_MSG_FILE
));
git_reference_free
(
octo1_ref
);
git_annotated_commit_free
(
our_head
);
git_annotated_commit_free
(
their_heads
[
0
]);
}
void
test_merge_workdir_setup__unlocked_after_success
(
void
)
{
git_oid
our_oid
;
git_reference
*
octo1_ref
;
git_annotated_commit
*
our_head
,
*
their_heads
[
1
];
cl_git_pass
(
git_oid_fromstr
(
&
our_oid
,
ORIG_HEAD
));
cl_git_pass
(
git_annotated_commit_lookup
(
&
our_head
,
repo
,
&
our_oid
));
cl_git_pass
(
git_reference_lookup
(
&
octo1_ref
,
repo
,
GIT_REFS_HEADS_DIR
OCTO1_BRANCH
));
cl_git_pass
(
git_annotated_commit_from_ref
(
&
their_heads
[
0
],
repo
,
octo1_ref
));
cl_git_pass
(
git_merge
(
repo
,
(
const
git_annotated_commit
**
)
&
their_heads
[
0
],
1
,
NULL
,
NULL
));
cl_assert
(
!
git_path_exists
(
"merge-resolve/.git/index.lock"
));
git_reference_free
(
octo1_ref
);
git_annotated_commit_free
(
our_head
);
git_annotated_commit_free
(
their_heads
[
0
]);
}
void
test_merge_workdir_setup__unlocked_after_conflict
(
void
)
{
git_oid
our_oid
;
git_reference
*
octo1_ref
;
git_annotated_commit
*
our_head
,
*
their_heads
[
1
];
cl_git_pass
(
git_oid_fromstr
(
&
our_oid
,
ORIG_HEAD
));
cl_git_pass
(
git_annotated_commit_lookup
(
&
our_head
,
repo
,
&
our_oid
));
cl_git_pass
(
git_reference_lookup
(
&
octo1_ref
,
repo
,
GIT_REFS_HEADS_DIR
OCTO1_BRANCH
));
cl_git_pass
(
git_annotated_commit_from_ref
(
&
their_heads
[
0
],
repo
,
octo1_ref
));
cl_git_rewritefile
(
"merge-resolve/new-in-octo1.txt"
,
"Conflicting file!
\n\n
Merge will fail!
\n
"
);
cl_git_fail
(
git_merge
(
repo
,
(
const
git_annotated_commit
**
)
&
their_heads
[
0
],
1
,
NULL
,
NULL
));
cl_assert
(
!
git_path_exists
(
"merge-resolve/"
GIT_MERGE_HEAD_FILE
));
cl_assert
(
!
git_path_exists
(
"merge-resolve/"
GIT_ORIG_HEAD_FILE
));
cl_assert
(
!
git_path_exists
(
"merge-resolve/"
GIT_MERGE_MODE_FILE
));
cl_assert
(
!
git_path_exists
(
"merge-resolve/"
GIT_MERGE_MSG_FILE
));
cl_assert
(
!
git_path_exists
(
"merge-resolve/.git/index.lock"
));
git_reference_free
(
octo1_ref
);
...
...
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