mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-02 12:29:08 +00:00
Fix trailing whitespaces
This commit is contained in:
parent
f0ab73720a
commit
1fed6b07f0
@ -117,4 +117,3 @@ int main (int argc, char **argv)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -33,7 +33,7 @@ typedef enum {
|
||||
|
||||
/**
|
||||
* Automerge options for `git_merge_trees_opts`.
|
||||
*/
|
||||
*/
|
||||
typedef enum {
|
||||
GIT_MERGE_AUTOMERGE_NORMAL = 0,
|
||||
GIT_MERGE_AUTOMERGE_NONE = 1,
|
||||
@ -45,10 +45,10 @@ typedef enum {
|
||||
typedef struct {
|
||||
unsigned int version;
|
||||
git_merge_tree_flags flags;
|
||||
|
||||
|
||||
/** Similarity to consider a file renamed (default 50) */
|
||||
unsigned int rename_threshold;
|
||||
|
||||
|
||||
/** Maximum similarity sources to examine (overrides the
|
||||
* `merge.renameLimit` config) (default 200)
|
||||
*/
|
||||
@ -56,7 +56,7 @@ typedef struct {
|
||||
|
||||
/** Pluggable similarity metric; pass NULL to use internal metric */
|
||||
git_diff_similarity_metric *metric;
|
||||
|
||||
|
||||
/** Flags for automerging content. */
|
||||
git_merge_automerge_flags automerge_flags;
|
||||
} git_merge_tree_opts;
|
||||
|
@ -96,12 +96,12 @@ GIT_EXTERN(int) git_packbuilder_insert_tree(git_packbuilder *pb, const git_oid *
|
||||
|
||||
/**
|
||||
* Insert a commit object
|
||||
*
|
||||
*
|
||||
* This will add a commit as well as the completed referenced tree.
|
||||
*
|
||||
*
|
||||
* @param pb The packbuilder
|
||||
* @param id The oid of the commit
|
||||
*
|
||||
*
|
||||
* @return 0 or an error code
|
||||
*/
|
||||
GIT_EXTERN(int) git_packbuilder_insert_commit(git_packbuilder *pb, const git_oid *id);
|
||||
|
@ -177,4 +177,3 @@ GIT_EXTERN(void) git_index_reuc_clear(git_index *index);
|
||||
/** @} */
|
||||
GIT_END_DECL
|
||||
#endif
|
||||
|
||||
|
@ -32,7 +32,7 @@ typedef enum {
|
||||
|
||||
/** Errors that do not impact the program's execution */
|
||||
GIT_TRACE_ERROR = 2,
|
||||
|
||||
|
||||
/** Warnings that suggest abnormal data */
|
||||
GIT_TRACE_WARN = 3,
|
||||
|
||||
@ -65,4 +65,3 @@ GIT_EXTERN(int) git_trace_set(git_trace_level_t level, git_trace_callback cb);
|
||||
/** @} */
|
||||
GIT_END_DECL
|
||||
#endif
|
||||
|
||||
|
@ -771,7 +771,7 @@ static int blob_content_to_link(
|
||||
|
||||
if ((error = git_futils_mkpath2file(path, dir_mode)) < 0)
|
||||
return error;
|
||||
|
||||
|
||||
if ((error = git_blob__getbuf(&linktarget, blob)) < 0)
|
||||
return error;
|
||||
|
||||
|
@ -274,7 +274,7 @@ static int update_head_to_branch(
|
||||
int retcode;
|
||||
git_buf remote_branch_name = GIT_BUF_INIT;
|
||||
git_reference* remote_ref = NULL;
|
||||
|
||||
|
||||
assert(options->checkout_branch);
|
||||
|
||||
if ((retcode = git_buf_printf(&remote_branch_name, GIT_REFS_REMOTES_DIR "%s/%s",
|
||||
|
@ -178,7 +178,7 @@ int git_diff_find_similar__hashsig_for_file(
|
||||
|
||||
GIT_UNUSED(f);
|
||||
error = git_hashsig_create_fromfile((git_hashsig **)out, path, opt);
|
||||
|
||||
|
||||
if (error == GIT_EBUFS) {
|
||||
error = 0;
|
||||
giterr_clear();
|
||||
@ -195,7 +195,7 @@ int git_diff_find_similar__hashsig_for_buf(
|
||||
|
||||
GIT_UNUSED(f);
|
||||
error = git_hashsig_create((git_hashsig **)out, buf, len, opt);
|
||||
|
||||
|
||||
if (error == GIT_EBUFS) {
|
||||
error = 0;
|
||||
giterr_clear();
|
||||
@ -437,7 +437,7 @@ static int similarity_measure(
|
||||
return -1;
|
||||
if (!cache[b_idx] && similarity_calc(diff, opts, b_idx, cache) < 0)
|
||||
return -1;
|
||||
|
||||
|
||||
/* some metrics may not wish to process this file (too big / too small) */
|
||||
if (!cache[a_idx] || !cache[b_idx])
|
||||
return 0;
|
||||
|
@ -365,4 +365,3 @@ int git_hashsig_compare(const git_hashsig *a, const git_hashsig *b)
|
||||
return (hashsig_heap_compare(&a->mins, &b->mins) +
|
||||
hashsig_heap_compare(&a->maxs, &b->maxs)) / 2;
|
||||
}
|
||||
|
||||
|
38
src/index.c
38
src/index.c
@ -381,7 +381,7 @@ void git_index_clear(git_index *index)
|
||||
git_index_reuc_clear(index);
|
||||
|
||||
git_index_name_clear(index);
|
||||
|
||||
|
||||
git_futils_filestamp_set(&index->stamp, NULL);
|
||||
|
||||
git_tree_cache_free(index->tree);
|
||||
@ -1108,7 +1108,7 @@ const git_index_name_entry *git_index_name_get_byindex(
|
||||
git_index *index, size_t n)
|
||||
{
|
||||
assert(index);
|
||||
|
||||
|
||||
git_vector_sort(&index->names);
|
||||
return git_vector_get(&index->names, n);
|
||||
}
|
||||
@ -1122,7 +1122,7 @@ int git_index_name_add(git_index *index,
|
||||
|
||||
conflict_name = git__calloc(1, sizeof(git_index_name_entry));
|
||||
GITERR_CHECK_ALLOC(conflict_name);
|
||||
|
||||
|
||||
if (ancestor) {
|
||||
conflict_name->ancestor = git__strdup(ancestor);
|
||||
GITERR_CHECK_ALLOC(conflict_name->ancestor);
|
||||
@ -1137,7 +1137,7 @@ int git_index_name_add(git_index *index,
|
||||
conflict_name->theirs = git__strdup(theirs);
|
||||
GITERR_CHECK_ALLOC(conflict_name->theirs);
|
||||
}
|
||||
|
||||
|
||||
return git_vector_insert(&index->names, conflict_name);
|
||||
}
|
||||
|
||||
@ -1147,7 +1147,7 @@ void git_index_name_clear(git_index *index)
|
||||
git_index_name_entry *conflict_name;
|
||||
|
||||
assert(index);
|
||||
|
||||
|
||||
git_vector_foreach(&index->names, i, conflict_name) {
|
||||
if (conflict_name->ancestor)
|
||||
git__free(conflict_name->ancestor);
|
||||
@ -1160,7 +1160,7 @@ void git_index_name_clear(git_index *index)
|
||||
|
||||
git__free(conflict_name);
|
||||
}
|
||||
|
||||
|
||||
git_vector_clear(&index->names);
|
||||
}
|
||||
|
||||
@ -1354,7 +1354,7 @@ static int read_reuc(git_index *index, const char *buffer, size_t size)
|
||||
static int read_conflict_names(git_index *index, const char *buffer, size_t size)
|
||||
{
|
||||
size_t len;
|
||||
|
||||
|
||||
/* This gets called multiple times, the vector might already be initialized */
|
||||
if (index->names._alloc_size == 0 &&
|
||||
git_vector_init(&index->names, 16, conflict_name_cmp) < 0)
|
||||
@ -1375,7 +1375,7 @@ static int read_conflict_names(git_index *index, const char *buffer, size_t size
|
||||
\
|
||||
buffer += len; \
|
||||
size -= len;
|
||||
|
||||
|
||||
while (size) {
|
||||
git_index_name_entry *conflict_name = git__calloc(1, sizeof(git_index_name_entry));
|
||||
GITERR_CHECK_ALLOC(conflict_name);
|
||||
@ -1383,17 +1383,17 @@ static int read_conflict_names(git_index *index, const char *buffer, size_t size
|
||||
read_conflict_name(conflict_name->ancestor);
|
||||
read_conflict_name(conflict_name->ours);
|
||||
read_conflict_name(conflict_name->theirs);
|
||||
|
||||
|
||||
if (git_vector_insert(&index->names, conflict_name) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
#undef read_conflict_name
|
||||
|
||||
|
||||
/* entries are guaranteed to be sorted on-disk */
|
||||
index->names.sorted = 1;
|
||||
|
||||
return 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t read_entry(git_index_entry *dest, const void *buffer, size_t buffer_size)
|
||||
@ -1724,7 +1724,7 @@ static int create_name_extension_data(git_buf *name_buf, git_index_name_entry *c
|
||||
error = git_buf_put(name_buf, "\0", 1);
|
||||
else
|
||||
error = git_buf_put(name_buf, conflict_name->ancestor, strlen(conflict_name->ancestor) + 1);
|
||||
|
||||
|
||||
if (error != 0)
|
||||
goto on_error;
|
||||
|
||||
@ -1753,20 +1753,20 @@ static int write_name_extension(git_index *index, git_filebuf *file)
|
||||
struct index_extension extension;
|
||||
size_t i;
|
||||
int error = 0;
|
||||
|
||||
|
||||
git_vector_foreach(out, i, conflict_name) {
|
||||
if ((error = create_name_extension_data(&name_buf, conflict_name)) < 0)
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
||||
memset(&extension, 0x0, sizeof(struct index_extension));
|
||||
memcpy(&extension.signature, INDEX_EXT_CONFLICT_NAME_SIG, 4);
|
||||
extension.extension_size = (uint32_t)name_buf.size;
|
||||
|
||||
|
||||
error = write_extension(file, &extension, &name_buf);
|
||||
|
||||
|
||||
git_buf_free(&name_buf);
|
||||
|
||||
|
||||
done:
|
||||
return error;
|
||||
}
|
||||
@ -1844,7 +1844,7 @@ static int write_index(git_index *index, git_filebuf *file)
|
||||
/* write the rename conflict extension */
|
||||
if (index->names.length > 0 && write_name_extension(index, file) < 0)
|
||||
return -1;
|
||||
|
||||
|
||||
/* write the reuc extension */
|
||||
if (index->reuc.length > 0 && write_reuc_extension(index, file) < 0)
|
||||
return -1;
|
||||
|
327
src/merge.c
327
src/merge.c
@ -370,14 +370,14 @@ static int merge_conflict_resolve_trivial(
|
||||
if (conflict->type == GIT_MERGE_DIFF_DIRECTORY_FILE ||
|
||||
conflict->type == GIT_MERGE_DIFF_RENAMED_ADDED)
|
||||
return 0;
|
||||
|
||||
|
||||
if (conflict->our_status == GIT_DELTA_RENAMED ||
|
||||
conflict->their_status == GIT_DELTA_RENAMED)
|
||||
return 0;
|
||||
|
||||
ours_empty = !GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry);
|
||||
theirs_empty = !GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry);
|
||||
|
||||
|
||||
ours_changed = (conflict->our_status != GIT_DELTA_UNMODIFIED);
|
||||
theirs_changed = (conflict->their_status != GIT_DELTA_UNMODIFIED);
|
||||
ours_theirs_differ = ours_changed && theirs_changed &&
|
||||
@ -433,7 +433,7 @@ static int merge_conflict_resolve_trivial(
|
||||
*resolved = 1;
|
||||
|
||||
/* Note: trivial resolution does not update the REUC. */
|
||||
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -486,9 +486,9 @@ static int merge_conflict_resolve_one_renamed(
|
||||
int ours_changed, theirs_changed;
|
||||
git_index_entry *merged;
|
||||
int error = 0;
|
||||
|
||||
|
||||
assert(resolved && diff_list && conflict);
|
||||
|
||||
|
||||
*resolved = 0;
|
||||
|
||||
if (!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry) ||
|
||||
@ -497,7 +497,7 @@ static int merge_conflict_resolve_one_renamed(
|
||||
|
||||
ours_renamed = (conflict->our_status == GIT_DELTA_RENAMED);
|
||||
theirs_renamed = (conflict->their_status == GIT_DELTA_RENAMED);
|
||||
|
||||
|
||||
if (!ours_renamed && !theirs_renamed)
|
||||
return 0;
|
||||
|
||||
@ -509,7 +509,7 @@ static int merge_conflict_resolve_one_renamed(
|
||||
|
||||
ours_changed = (git_oid__cmp(&conflict->ancestor_entry.oid, &conflict->our_entry.oid) != 0);
|
||||
theirs_changed = (git_oid__cmp(&conflict->ancestor_entry.oid, &conflict->their_entry.oid) != 0);
|
||||
|
||||
|
||||
/* if both are modified (and not to a common target) require a merge */
|
||||
if (ours_changed && theirs_changed &&
|
||||
git_oid__cmp(&conflict->our_entry.oid, &conflict->their_entry.oid) != 0)
|
||||
@ -517,7 +517,7 @@ static int merge_conflict_resolve_one_renamed(
|
||||
|
||||
if ((merged = git_pool_malloc(&diff_list->pool, sizeof(git_index_entry))) == NULL)
|
||||
return -1;
|
||||
|
||||
|
||||
if (ours_changed)
|
||||
memcpy(merged, &conflict->our_entry, sizeof(git_index_entry));
|
||||
else
|
||||
@ -527,12 +527,12 @@ static int merge_conflict_resolve_one_renamed(
|
||||
merged->path = conflict->our_entry.path;
|
||||
else
|
||||
merged->path = conflict->their_entry.path;
|
||||
|
||||
|
||||
*resolved = 1;
|
||||
|
||||
|
||||
git_vector_insert(&diff_list->staged, merged);
|
||||
git_vector_insert(&diff_list->resolved, (git_merge_diff *)conflict);
|
||||
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -550,11 +550,11 @@ static int merge_conflict_resolve_automerge(
|
||||
git_odb *odb = NULL;
|
||||
git_oid automerge_oid;
|
||||
int error = 0;
|
||||
|
||||
|
||||
assert(resolved && diff_list && conflict);
|
||||
|
||||
|
||||
*resolved = 0;
|
||||
|
||||
|
||||
if (automerge_flags == GIT_MERGE_AUTOMERGE_NONE)
|
||||
return 0;
|
||||
|
||||
@ -585,7 +585,7 @@ static int merge_conflict_resolve_automerge(
|
||||
!result.automergeable ||
|
||||
(error = git_odb_write(&automerge_oid, odb, result.data, result.len, GIT_OBJ_BLOB)) < 0)
|
||||
goto done;
|
||||
|
||||
|
||||
if ((index_entry = git_pool_malloc(&diff_list->pool, sizeof(git_index_entry))) == NULL)
|
||||
GITERR_CHECK_ALLOC(index_entry);
|
||||
|
||||
@ -595,7 +595,7 @@ static int merge_conflict_resolve_automerge(
|
||||
index_entry->file_size = result.len;
|
||||
index_entry->mode = result.mode;
|
||||
git_oid_cpy(&index_entry->oid, &automerge_oid);
|
||||
|
||||
|
||||
git_vector_insert(&diff_list->staged, index_entry);
|
||||
git_vector_insert(&diff_list->resolved, (git_merge_diff *)conflict);
|
||||
|
||||
@ -607,7 +607,7 @@ done:
|
||||
git_merge_file_input_free(&theirs);
|
||||
git_merge_file_result_free(&result);
|
||||
git_odb_free(odb);
|
||||
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -619,16 +619,16 @@ static int merge_conflict_resolve(
|
||||
{
|
||||
int resolved = 0;
|
||||
int error = 0;
|
||||
|
||||
|
||||
*out = 0;
|
||||
|
||||
|
||||
if ((error = merge_conflict_resolve_trivial(&resolved, diff_list, conflict)) < 0)
|
||||
goto done;
|
||||
|
||||
if (automerge_flags != GIT_MERGE_AUTOMERGE_NONE) {
|
||||
if (!resolved && (error = merge_conflict_resolve_one_removed(&resolved, diff_list, conflict)) < 0)
|
||||
goto done;
|
||||
|
||||
|
||||
if (!resolved && (error = merge_conflict_resolve_one_renamed(&resolved, diff_list, conflict)) < 0)
|
||||
goto done;
|
||||
|
||||
@ -637,7 +637,7 @@ static int merge_conflict_resolve(
|
||||
}
|
||||
|
||||
*out = resolved;
|
||||
|
||||
|
||||
done:
|
||||
return error;
|
||||
}
|
||||
@ -666,7 +666,7 @@ static int index_entry_similarity_exact(
|
||||
|
||||
if (git_oid__cmp(&a->oid, &b->oid) == 0)
|
||||
return 100;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -680,28 +680,28 @@ static int index_entry_similarity_calc(
|
||||
git_diff_file diff_file = {{{0}}};
|
||||
git_off_t blobsize;
|
||||
int error;
|
||||
|
||||
|
||||
*out = NULL;
|
||||
|
||||
if ((error = git_blob_lookup(&blob, repo, &entry->oid)) < 0)
|
||||
return error;
|
||||
|
||||
|
||||
git_oid_cpy(&diff_file.oid, &entry->oid);
|
||||
diff_file.path = entry->path;
|
||||
diff_file.size = entry->file_size;
|
||||
diff_file.mode = entry->mode;
|
||||
diff_file.flags = 0;
|
||||
|
||||
|
||||
blobsize = git_blob_rawsize(blob);
|
||||
|
||||
/* file too big for rename processing */
|
||||
if (!git__is_sizet(blobsize))
|
||||
return 0;
|
||||
|
||||
|
||||
error = opts->metric->buffer_signature(out, &diff_file,
|
||||
git_blob_rawcontent(blob), (size_t)blobsize,
|
||||
opts->metric->payload);
|
||||
|
||||
|
||||
git_blob_free(blob);
|
||||
|
||||
return error;
|
||||
@ -718,16 +718,16 @@ static int index_entry_similarity_inexact(
|
||||
{
|
||||
int score = 0;
|
||||
int error = 0;
|
||||
|
||||
|
||||
if (GIT_MODE_TYPE(a->mode) != GIT_MODE_TYPE(b->mode))
|
||||
return 0;
|
||||
|
||||
|
||||
/* update signature cache if needed */
|
||||
if (!cache[a_idx] && (error = index_entry_similarity_calc(&cache[a_idx], repo, a, opts)) < 0)
|
||||
return error;
|
||||
if (!cache[b_idx] && (error = index_entry_similarity_calc(&cache[b_idx], repo, b, opts)) < 0)
|
||||
return error;
|
||||
|
||||
|
||||
/* some metrics may not wish to process this file (too big / too small) */
|
||||
if (!cache[a_idx] || !cache[b_idx])
|
||||
return 0;
|
||||
@ -736,13 +736,13 @@ static int index_entry_similarity_inexact(
|
||||
if (opts->metric->similarity(
|
||||
&score, cache[a_idx], cache[b_idx], opts->metric->payload) < 0)
|
||||
return -1;
|
||||
|
||||
|
||||
/* clip score */
|
||||
if (score < 0)
|
||||
score = 0;
|
||||
else if (score > 100)
|
||||
score = 100;
|
||||
|
||||
|
||||
return score;
|
||||
}
|
||||
|
||||
@ -758,7 +758,7 @@ static int merge_diff_mark_similarity(
|
||||
size_t i, j;
|
||||
git_merge_diff *conflict_src, *conflict_tgt;
|
||||
int similarity;
|
||||
|
||||
|
||||
git_vector_foreach(&diff_list->conflicts, i, conflict_src) {
|
||||
/* Items can be the source of a rename iff they have an item in the
|
||||
* ancestor slot and lack an item in the ours or theirs slot. */
|
||||
@ -766,63 +766,63 @@ static int merge_diff_mark_similarity(
|
||||
(GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_src->our_entry) &&
|
||||
GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_src->their_entry)))
|
||||
continue;
|
||||
|
||||
|
||||
git_vector_foreach(&diff_list->conflicts, j, conflict_tgt) {
|
||||
size_t our_idx = diff_list->conflicts.length + j;
|
||||
size_t their_idx = (diff_list->conflicts.length * 2) + j;
|
||||
|
||||
|
||||
if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_tgt->ancestor_entry))
|
||||
continue;
|
||||
|
||||
|
||||
if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_tgt->our_entry) &&
|
||||
!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_src->our_entry)) {
|
||||
similarity = similarity_fn(repo, &conflict_src->ancestor_entry, i, &conflict_tgt->our_entry, our_idx, cache, opts);
|
||||
|
||||
|
||||
if (similarity == GIT_EBUFS)
|
||||
continue;
|
||||
continue;
|
||||
else if (similarity < 0)
|
||||
return similarity;
|
||||
|
||||
|
||||
if (similarity > similarity_ours[i].similarity &&
|
||||
similarity > similarity_ours[j].similarity) {
|
||||
/* Clear previous best similarity */
|
||||
if (similarity_ours[i].similarity > 0)
|
||||
similarity_ours[similarity_ours[i].other_idx].similarity = 0;
|
||||
|
||||
|
||||
if (similarity_ours[j].similarity > 0)
|
||||
similarity_ours[similarity_ours[j].other_idx].similarity = 0;
|
||||
|
||||
|
||||
similarity_ours[i].similarity = similarity;
|
||||
similarity_ours[i].other_idx = j;
|
||||
|
||||
|
||||
similarity_ours[j].similarity = similarity;
|
||||
similarity_ours[j].other_idx = i;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_tgt->their_entry) &&
|
||||
!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict_src->their_entry)) {
|
||||
similarity = similarity_fn(repo, &conflict_src->ancestor_entry, i, &conflict_tgt->their_entry, their_idx, cache, opts);
|
||||
|
||||
|
||||
if (similarity > similarity_theirs[i].similarity &&
|
||||
similarity > similarity_theirs[j].similarity) {
|
||||
/* Clear previous best similarity */
|
||||
if (similarity_theirs[i].similarity > 0)
|
||||
similarity_theirs[similarity_theirs[i].other_idx].similarity = 0;
|
||||
|
||||
|
||||
if (similarity_theirs[j].similarity > 0)
|
||||
similarity_theirs[similarity_theirs[j].other_idx].similarity = 0;
|
||||
|
||||
|
||||
similarity_theirs[i].similarity = similarity;
|
||||
similarity_theirs[i].other_idx = j;
|
||||
|
||||
|
||||
similarity_theirs[j].similarity = similarity;
|
||||
similarity_theirs[j].other_idx = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -857,13 +857,13 @@ static void merge_diff_mark_rename_conflict(
|
||||
const git_merge_tree_opts *opts)
|
||||
{
|
||||
git_merge_diff *ours_source = NULL, *theirs_source = NULL;
|
||||
|
||||
|
||||
if (ours_renamed)
|
||||
ours_source = diff_list->conflicts.contents[ours_source_idx];
|
||||
|
||||
|
||||
if (theirs_renamed)
|
||||
theirs_source = diff_list->conflicts.contents[theirs_source_idx];
|
||||
|
||||
|
||||
/* Detect 2->1 conflicts */
|
||||
if (ours_renamed && theirs_renamed) {
|
||||
/* Both renamed to the same target name. */
|
||||
@ -877,30 +877,30 @@ static void merge_diff_mark_rename_conflict(
|
||||
/* If our source was also renamed in theirs, this is a 1->2 */
|
||||
if (similarity_theirs[ours_source_idx].similarity >= opts->rename_threshold)
|
||||
ours_source->type = GIT_MERGE_DIFF_BOTH_RENAMED_1_TO_2;
|
||||
|
||||
|
||||
else if (GIT_MERGE_INDEX_ENTRY_EXISTS(target->their_entry)) {
|
||||
ours_source->type = GIT_MERGE_DIFF_RENAMED_ADDED;
|
||||
target->type = GIT_MERGE_DIFF_RENAMED_ADDED;
|
||||
}
|
||||
|
||||
|
||||
else if (!GIT_MERGE_INDEX_ENTRY_EXISTS(ours_source->their_entry))
|
||||
ours_source->type = GIT_MERGE_DIFF_RENAMED_DELETED;
|
||||
|
||||
|
||||
else if (ours_source->type == GIT_MERGE_DIFF_MODIFIED_DELETED)
|
||||
ours_source->type = GIT_MERGE_DIFF_RENAMED_MODIFIED;
|
||||
} else if (theirs_renamed) {
|
||||
/* If their source was also renamed in ours, this is a 1->2 */
|
||||
if (similarity_ours[theirs_source_idx].similarity >= opts->rename_threshold)
|
||||
theirs_source->type = GIT_MERGE_DIFF_BOTH_RENAMED_1_TO_2;
|
||||
|
||||
|
||||
else if (GIT_MERGE_INDEX_ENTRY_EXISTS(target->our_entry)) {
|
||||
theirs_source->type = GIT_MERGE_DIFF_RENAMED_ADDED;
|
||||
target->type = GIT_MERGE_DIFF_RENAMED_ADDED;
|
||||
}
|
||||
|
||||
|
||||
else if (!GIT_MERGE_INDEX_ENTRY_EXISTS(theirs_source->our_entry))
|
||||
theirs_source->type = GIT_MERGE_DIFF_RENAMED_DELETED;
|
||||
|
||||
|
||||
else if (theirs_source->type == GIT_MERGE_DIFF_MODIFIED_DELETED)
|
||||
theirs_source->type = GIT_MERGE_DIFF_RENAMED_MODIFIED;
|
||||
}
|
||||
@ -915,7 +915,7 @@ GIT_INLINE(void) merge_diff_coalesce_rename(
|
||||
/* Coalesce the rename target into the rename source. */
|
||||
memcpy(source_entry, target_entry, sizeof(git_index_entry));
|
||||
*source_status = GIT_DELTA_RENAMED;
|
||||
|
||||
|
||||
memset(target_entry, 0x0, sizeof(git_index_entry));
|
||||
*target_status = GIT_DELTA_UNMODIFIED;
|
||||
}
|
||||
@ -930,50 +930,50 @@ static void merge_diff_list_coalesce_renames(
|
||||
bool ours_renamed = 0, theirs_renamed = 0;
|
||||
size_t ours_source_idx = 0, theirs_source_idx = 0;
|
||||
git_merge_diff *ours_source, *theirs_source, *target;
|
||||
|
||||
|
||||
for (i = 0; i < diff_list->conflicts.length; i++) {
|
||||
target = diff_list->conflicts.contents[i];
|
||||
|
||||
|
||||
ours_renamed = 0;
|
||||
theirs_renamed = 0;
|
||||
|
||||
|
||||
if (GIT_MERGE_INDEX_ENTRY_EXISTS(target->our_entry) &&
|
||||
similarity_ours[i].similarity >= opts->rename_threshold) {
|
||||
ours_source_idx = similarity_ours[i].other_idx;
|
||||
|
||||
|
||||
ours_source = diff_list->conflicts.contents[ours_source_idx];
|
||||
|
||||
|
||||
merge_diff_coalesce_rename(
|
||||
&ours_source->our_entry,
|
||||
&ours_source->our_status,
|
||||
&target->our_entry,
|
||||
&target->our_status);
|
||||
|
||||
|
||||
similarity_ours[ours_source_idx].similarity = 0;
|
||||
similarity_ours[i].similarity = 0;
|
||||
|
||||
|
||||
ours_renamed = 1;
|
||||
}
|
||||
|
||||
|
||||
/* insufficient to determine direction */
|
||||
if (GIT_MERGE_INDEX_ENTRY_EXISTS(target->their_entry) &&
|
||||
similarity_theirs[i].similarity >= opts->rename_threshold) {
|
||||
theirs_source_idx = similarity_theirs[i].other_idx;
|
||||
|
||||
|
||||
theirs_source = diff_list->conflicts.contents[theirs_source_idx];
|
||||
|
||||
|
||||
merge_diff_coalesce_rename(
|
||||
&theirs_source->their_entry,
|
||||
&theirs_source->their_status,
|
||||
&target->their_entry,
|
||||
&target->their_status);
|
||||
|
||||
|
||||
similarity_theirs[theirs_source_idx].similarity = 0;
|
||||
similarity_theirs[i].similarity = 0;
|
||||
|
||||
|
||||
theirs_renamed = 1;
|
||||
}
|
||||
|
||||
|
||||
merge_diff_mark_rename_conflict(diff_list,
|
||||
similarity_ours, ours_renamed, ours_source_idx,
|
||||
similarity_theirs, theirs_renamed, theirs_source_idx,
|
||||
@ -984,7 +984,7 @@ static void merge_diff_list_coalesce_renames(
|
||||
static int merge_diff_empty(const git_vector *conflicts, size_t idx)
|
||||
{
|
||||
git_merge_diff *conflict = conflicts->contents[idx];
|
||||
|
||||
|
||||
return (!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->ancestor_entry) &&
|
||||
!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry) &&
|
||||
!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry));
|
||||
@ -1000,7 +1000,7 @@ static void merge_diff_list_count_candidates(
|
||||
|
||||
*src_count = 0;
|
||||
*tgt_count = 0;
|
||||
|
||||
|
||||
git_vector_foreach(&diff_list->conflicts, i, entry) {
|
||||
if (GIT_MERGE_INDEX_ENTRY_EXISTS(entry->ancestor_entry) &&
|
||||
(!GIT_MERGE_INDEX_ENTRY_EXISTS(entry->our_entry) ||
|
||||
@ -1021,20 +1021,20 @@ int git_merge_diff_list__find_renames(
|
||||
size_t cache_size = 0;
|
||||
size_t src_count, tgt_count, i;
|
||||
int error = 0;
|
||||
|
||||
|
||||
assert(diff_list && opts);
|
||||
|
||||
|
||||
if ((opts->flags & GIT_MERGE_TREE_FIND_RENAMES) == 0)
|
||||
return 0;
|
||||
|
||||
|
||||
similarity_ours = git__calloc(diff_list->conflicts.length,
|
||||
sizeof(struct merge_diff_similarity));
|
||||
GITERR_CHECK_ALLOC(similarity_ours);
|
||||
|
||||
|
||||
similarity_theirs = git__calloc(diff_list->conflicts.length,
|
||||
sizeof(struct merge_diff_similarity));
|
||||
GITERR_CHECK_ALLOC(similarity_theirs);
|
||||
|
||||
|
||||
/* Calculate similarity between items that were deleted from the ancestor
|
||||
* and added in the other branch.
|
||||
*/
|
||||
@ -1048,7 +1048,7 @@ int git_merge_diff_list__find_renames(
|
||||
GITERR_CHECK_ALLOC(cache);
|
||||
|
||||
merge_diff_list_count_candidates(diff_list, &src_count, &tgt_count);
|
||||
|
||||
|
||||
if (src_count > opts->target_limit || tgt_count > opts->target_limit) {
|
||||
/* TODO: report! */
|
||||
} else {
|
||||
@ -1063,7 +1063,7 @@ int git_merge_diff_list__find_renames(
|
||||
* into the old name.
|
||||
*/
|
||||
merge_diff_list_coalesce_renames(diff_list, similarity_ours, similarity_theirs, opts);
|
||||
|
||||
|
||||
/* And remove any entries that were merged and are now empty. */
|
||||
git_vector_remove_matching(&diff_list->conflicts, merge_diff_empty);
|
||||
|
||||
@ -1094,7 +1094,7 @@ GIT_INLINE(const char *) merge_diff_path(
|
||||
return conflict->our_entry.path;
|
||||
else if (GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry))
|
||||
return conflict->their_entry.path;
|
||||
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -1106,7 +1106,7 @@ GIT_INLINE(bool) merge_diff_any_side_added_or_modified(
|
||||
conflict->their_status == GIT_DELTA_ADDED ||
|
||||
conflict->their_status == GIT_DELTA_MODIFIED)
|
||||
return true;
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -1114,11 +1114,11 @@ GIT_INLINE(bool) path_is_prefixed(const char *parent, const char *child)
|
||||
{
|
||||
size_t child_len = strlen(child);
|
||||
size_t parent_len = strlen(parent);
|
||||
|
||||
|
||||
if (child_len < parent_len ||
|
||||
strncmp(parent, child, parent_len) != 0)
|
||||
return 0;
|
||||
|
||||
|
||||
return (child[parent_len] == '/');
|
||||
}
|
||||
|
||||
@ -1127,7 +1127,7 @@ GIT_INLINE(int) merge_diff_detect_df_conflict(
|
||||
git_merge_diff *conflict)
|
||||
{
|
||||
const char *cur_path = merge_diff_path(conflict);
|
||||
|
||||
|
||||
/* Determine if this is a D/F conflict or the child of one */
|
||||
if (df_data->df_path &&
|
||||
path_is_prefixed(df_data->df_path, cur_path))
|
||||
@ -1139,14 +1139,14 @@ GIT_INLINE(int) merge_diff_detect_df_conflict(
|
||||
merge_diff_any_side_added_or_modified(conflict) &&
|
||||
path_is_prefixed(df_data->prev_path, cur_path)) {
|
||||
conflict->type = GIT_MERGE_DIFF_DF_CHILD;
|
||||
|
||||
|
||||
df_data->prev_conflict->type = GIT_MERGE_DIFF_DIRECTORY_FILE;
|
||||
df_data->df_path = df_data->prev_path;
|
||||
}
|
||||
|
||||
|
||||
df_data->prev_path = cur_path;
|
||||
df_data->prev_conflict = conflict;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1172,7 +1172,7 @@ GIT_INLINE(int) merge_diff_detect_type(
|
||||
conflict->type = GIT_MERGE_DIFF_MODIFIED_DELETED;
|
||||
else
|
||||
conflict->type = GIT_MERGE_DIFF_NONE;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1183,11 +1183,11 @@ GIT_INLINE(int) index_entry_dup(
|
||||
{
|
||||
if (src != NULL) {
|
||||
memcpy(out, src, sizeof(git_index_entry));
|
||||
|
||||
|
||||
if ((out->path = git_pool_strdup(pool, src->path)) == NULL)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1208,7 +1208,7 @@ GIT_INLINE(int) merge_delta_type_from_index_entries(
|
||||
else if (git_oid__cmp(&ancestor->oid, &other->oid) ||
|
||||
ancestor->mode != other->mode)
|
||||
return GIT_DELTA_MODIFIED;
|
||||
|
||||
|
||||
return GIT_DELTA_UNMODIFIED;
|
||||
}
|
||||
|
||||
@ -1218,20 +1218,20 @@ static git_merge_diff *merge_diff_from_index_entries(
|
||||
{
|
||||
git_merge_diff *conflict;
|
||||
git_pool *pool = &diff_list->pool;
|
||||
|
||||
|
||||
if ((conflict = git_pool_malloc(pool, sizeof(git_merge_diff))) == NULL)
|
||||
return NULL;
|
||||
|
||||
|
||||
if (index_entry_dup(&conflict->ancestor_entry, pool, entries[TREE_IDX_ANCESTOR]) < 0 ||
|
||||
index_entry_dup(&conflict->our_entry, pool, entries[TREE_IDX_OURS]) < 0 ||
|
||||
index_entry_dup(&conflict->their_entry, pool, entries[TREE_IDX_THEIRS]) < 0)
|
||||
return NULL;
|
||||
|
||||
|
||||
conflict->our_status = merge_delta_type_from_index_entries(
|
||||
entries[TREE_IDX_ANCESTOR], entries[TREE_IDX_OURS]);
|
||||
conflict->their_status = merge_delta_type_from_index_entries(
|
||||
entries[TREE_IDX_ANCESTOR], entries[TREE_IDX_THEIRS]);
|
||||
|
||||
|
||||
return conflict;
|
||||
}
|
||||
|
||||
@ -1243,13 +1243,13 @@ static int merge_index_insert_conflict(
|
||||
const git_index_entry *tree_items[3])
|
||||
{
|
||||
git_merge_diff *conflict;
|
||||
|
||||
|
||||
if ((conflict = merge_diff_from_index_entries(diff_list, tree_items)) == NULL ||
|
||||
merge_diff_detect_type(conflict) < 0 ||
|
||||
merge_diff_detect_df_conflict(merge_df_data, conflict) < 0 ||
|
||||
git_vector_insert(&diff_list->conflicts, conflict) < 0)
|
||||
return -1;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1259,13 +1259,13 @@ static int merge_index_insert_unmodified(
|
||||
{
|
||||
int error = 0;
|
||||
git_index_entry *entry;
|
||||
|
||||
|
||||
entry = git_pool_malloc(&diff_list->pool, sizeof(git_index_entry));
|
||||
GITERR_CHECK_ALLOC(entry);
|
||||
|
||||
|
||||
if ((error = index_entry_dup(entry, &diff_list->pool, tree_items[0])) >= 0)
|
||||
error = git_vector_insert(&diff_list->staged, entry);
|
||||
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -1282,40 +1282,40 @@ int git_merge_diff_list__find_differences(
|
||||
int cur_item_modified;
|
||||
size_t i, j;
|
||||
int error = 0;
|
||||
|
||||
|
||||
assert(diff_list && our_tree && their_tree);
|
||||
|
||||
if ((error = git_iterator_for_tree(&iterators[TREE_IDX_ANCESTOR], (git_tree *)ancestor_tree, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)) < 0 ||
|
||||
(error = git_iterator_for_tree(&iterators[TREE_IDX_OURS], (git_tree *)our_tree, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)) < 0 ||
|
||||
(error = git_iterator_for_tree(&iterators[TREE_IDX_THEIRS], (git_tree *)their_tree, GIT_ITERATOR_DONT_IGNORE_CASE, NULL, NULL)) < 0)
|
||||
goto done;
|
||||
|
||||
|
||||
/* Set up the iterators */
|
||||
for (i = 0; i < 3; i++) {
|
||||
if ((error = git_iterator_current(&items[i], iterators[i])) < 0)
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
||||
while (true) {
|
||||
for (i = 0; i < 3; i++)
|
||||
cur_items[i] = NULL;
|
||||
|
||||
best_cur_item = NULL;
|
||||
cur_item_modified = 0;
|
||||
|
||||
|
||||
/* Find the next path(s) to consume from each iterator */
|
||||
for (i = 0; i < 3; i++) {
|
||||
if (items[i] == NULL) {
|
||||
cur_item_modified = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (best_cur_item == NULL) {
|
||||
best_cur_item = items[i];
|
||||
cur_items[i] = items[i];
|
||||
} else {
|
||||
int path_diff = entry_compare(items[i], best_cur_item);
|
||||
|
||||
|
||||
if (path_diff < 0) {
|
||||
/*
|
||||
* Found an item that sorts before our current item, make
|
||||
@ -1332,21 +1332,21 @@ int git_merge_diff_list__find_differences(
|
||||
cur_item_modified = 1;
|
||||
} else if (path_diff == 0) {
|
||||
cur_items[i] = items[i];
|
||||
|
||||
|
||||
if (!cur_item_modified)
|
||||
cur_item_modified = index_entry_cmp(best_cur_item, items[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (best_cur_item == NULL)
|
||||
break;
|
||||
|
||||
|
||||
if (cur_item_modified)
|
||||
error = merge_index_insert_conflict(diff_list, &df_data, cur_items);
|
||||
else
|
||||
error = merge_index_insert_unmodified(diff_list, cur_items);
|
||||
|
||||
|
||||
/* Advance each iterator that participated */
|
||||
for (i = 0; i < 3; i++) {
|
||||
if (cur_items[i] != NULL &&
|
||||
@ -1354,29 +1354,29 @@ int git_merge_diff_list__find_differences(
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
done:
|
||||
for (i = 0; i < 3; i++)
|
||||
git_iterator_free(iterators[i]);
|
||||
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
git_merge_diff_list *git_merge_diff_list__alloc(git_repository *repo)
|
||||
{
|
||||
git_merge_diff_list *diff_list = git__calloc(1, sizeof(git_merge_diff_list));
|
||||
|
||||
|
||||
if (diff_list == NULL)
|
||||
return NULL;
|
||||
|
||||
|
||||
diff_list->repo = repo;
|
||||
|
||||
|
||||
if (git_vector_init(&diff_list->staged, 0, NULL) < 0 ||
|
||||
git_vector_init(&diff_list->conflicts, 0, NULL) < 0 ||
|
||||
git_vector_init(&diff_list->resolved, 0, NULL) < 0 ||
|
||||
git_pool_init(&diff_list->pool, 1, 0) < 0)
|
||||
return NULL;
|
||||
|
||||
|
||||
return diff_list;
|
||||
}
|
||||
|
||||
@ -1387,48 +1387,48 @@ static int merge_tree_normalize_opts(
|
||||
{
|
||||
git_config *cfg = NULL;
|
||||
int error = 0;
|
||||
|
||||
|
||||
assert(repo && opts);
|
||||
|
||||
|
||||
if ((error = git_repository_config__weakptr(&cfg, repo)) < 0)
|
||||
return error;
|
||||
|
||||
|
||||
if (given != NULL)
|
||||
memcpy(opts, given, sizeof(git_merge_tree_opts));
|
||||
else {
|
||||
git_merge_tree_opts init = GIT_MERGE_TREE_OPTS_INIT;
|
||||
memcpy(opts, &init, sizeof(init));
|
||||
|
||||
|
||||
opts->flags = GIT_MERGE_TREE_FIND_RENAMES;
|
||||
opts->rename_threshold = GIT_MERGE_TREE_RENAME_THRESHOLD;
|
||||
}
|
||||
|
||||
|
||||
if (!opts->target_limit) {
|
||||
int32_t limit = 0;
|
||||
|
||||
|
||||
opts->target_limit = GIT_MERGE_TREE_TARGET_LIMIT;
|
||||
|
||||
|
||||
if (git_config_get_int32(&limit, cfg, "merge.renameLimit") < 0) {
|
||||
giterr_clear();
|
||||
|
||||
|
||||
if (git_config_get_int32(&limit, cfg, "diff.renameLimit") < 0)
|
||||
giterr_clear();
|
||||
}
|
||||
|
||||
|
||||
if (limit > 0)
|
||||
opts->target_limit = limit;
|
||||
}
|
||||
|
||||
|
||||
/* assign the internal metric with whitespace flag as payload */
|
||||
if (!opts->metric) {
|
||||
opts->metric = git__malloc(sizeof(git_diff_similarity_metric));
|
||||
GITERR_CHECK_ALLOC(opts->metric);
|
||||
|
||||
|
||||
opts->metric->file_signature = git_diff_find_similar__hashsig_for_file;
|
||||
opts->metric->buffer_signature = git_diff_find_similar__hashsig_for_buf;
|
||||
opts->metric->free_signature = git_diff_find_similar__hashsig_free;
|
||||
opts->metric->similarity = git_diff_find_similar__calc_similarity;
|
||||
|
||||
|
||||
if (opts->flags & GIT_DIFF_FIND_IGNORE_WHITESPACE)
|
||||
opts->metric->payload = (void *)GIT_HASHSIG_IGNORE_WHITESPACE;
|
||||
else if (opts->flags & GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE)
|
||||
@ -1436,7 +1436,7 @@ static int merge_tree_normalize_opts(
|
||||
else
|
||||
opts->metric->payload = (void *)GIT_HASHSIG_SMART_WHITESPACE;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1450,20 +1450,20 @@ static int merge_index_insert_reuc(
|
||||
int mode[3] = { 0, 0, 0 };
|
||||
git_oid const *oid[3] = { NULL, NULL, NULL };
|
||||
size_t i;
|
||||
|
||||
|
||||
if (!GIT_MERGE_INDEX_ENTRY_EXISTS(*entry))
|
||||
return 0;
|
||||
|
||||
|
||||
if ((reuc = git_index_reuc_get_bypath(index, entry->path)) != NULL) {
|
||||
for (i = 0; i < 3; i++) {
|
||||
mode[i] = reuc->mode[i];
|
||||
oid[i] = &reuc->oid[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
mode[idx] = entry->mode;
|
||||
oid[idx] = &entry->oid;
|
||||
|
||||
|
||||
return git_index_reuc_add(index, entry->path,
|
||||
mode[0], oid[0], mode[1], oid[1], mode[2], oid[2]);
|
||||
}
|
||||
@ -1475,58 +1475,58 @@ int index_from_diff_list(git_index **out, git_merge_diff_list *diff_list)
|
||||
git_index_entry *entry;
|
||||
git_merge_diff *conflict;
|
||||
int error = 0;
|
||||
|
||||
|
||||
*out = NULL;
|
||||
|
||||
|
||||
if ((error = git_index_new(&index)) < 0)
|
||||
return error;
|
||||
|
||||
|
||||
git_vector_foreach(&diff_list->staged, i, entry) {
|
||||
if ((error = git_index_add(index, entry)) < 0)
|
||||
goto on_error;
|
||||
}
|
||||
|
||||
|
||||
git_vector_foreach(&diff_list->conflicts, i, conflict) {
|
||||
const git_index_entry *ancestor =
|
||||
GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->ancestor_entry) ?
|
||||
&conflict->ancestor_entry : NULL;
|
||||
|
||||
|
||||
const git_index_entry *ours =
|
||||
GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry) ?
|
||||
&conflict->our_entry : NULL;
|
||||
|
||||
|
||||
const git_index_entry *theirs =
|
||||
GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry) ?
|
||||
&conflict->their_entry : NULL;
|
||||
|
||||
|
||||
if ((error = git_index_conflict_add(index, ancestor, ours, theirs)) < 0)
|
||||
goto on_error;
|
||||
}
|
||||
|
||||
|
||||
/* Add each rename entry to the rename portion of the index. */
|
||||
git_vector_foreach(&diff_list->conflicts, i, conflict) {
|
||||
const char *ancestor_path, *our_path, *their_path;
|
||||
|
||||
|
||||
if (!GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->ancestor_entry))
|
||||
continue;
|
||||
|
||||
|
||||
ancestor_path = conflict->ancestor_entry.path;
|
||||
|
||||
|
||||
our_path =
|
||||
GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry) ?
|
||||
conflict->our_entry.path : NULL;
|
||||
|
||||
|
||||
their_path =
|
||||
GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry) ?
|
||||
conflict->their_entry.path : NULL;
|
||||
|
||||
|
||||
if ((our_path && strcmp(ancestor_path, our_path) != 0) ||
|
||||
(their_path && strcmp(ancestor_path, their_path) != 0)) {
|
||||
if ((error = git_index_name_add(index, ancestor_path, our_path, their_path)) < 0)
|
||||
goto on_error;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Add each entry in the resolved conflict to the REUC independently, since
|
||||
* the paths may differ due to renames. */
|
||||
git_vector_foreach(&diff_list->resolved, i, conflict) {
|
||||
@ -1537,7 +1537,7 @@ int index_from_diff_list(git_index **out, git_merge_diff_list *diff_list)
|
||||
const git_index_entry *ours =
|
||||
GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->our_entry) ?
|
||||
&conflict->our_entry : NULL;
|
||||
|
||||
|
||||
const git_index_entry *theirs =
|
||||
GIT_MERGE_INDEX_ENTRY_EXISTS(conflict->their_entry) ?
|
||||
&conflict->their_entry : NULL;
|
||||
@ -1545,22 +1545,22 @@ int index_from_diff_list(git_index **out, git_merge_diff_list *diff_list)
|
||||
if (ancestor != NULL &&
|
||||
(error = merge_index_insert_reuc(index, TREE_IDX_ANCESTOR, ancestor)) < 0)
|
||||
goto on_error;
|
||||
|
||||
|
||||
if (ours != NULL &&
|
||||
(error = merge_index_insert_reuc(index, TREE_IDX_OURS, ours)) < 0)
|
||||
goto on_error;
|
||||
|
||||
|
||||
if (theirs != NULL &&
|
||||
(error = merge_index_insert_reuc(index, TREE_IDX_THEIRS, theirs)) < 0)
|
||||
goto on_error;
|
||||
}
|
||||
|
||||
|
||||
*out = index;
|
||||
return 0;
|
||||
|
||||
|
||||
on_error:
|
||||
git_index_free(index);
|
||||
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -1582,33 +1582,33 @@ int git_merge_trees(
|
||||
assert(out && repo && our_tree && their_tree);
|
||||
|
||||
*out = NULL;
|
||||
|
||||
|
||||
if ((error = merge_tree_normalize_opts(repo, &opts, given_opts)) < 0)
|
||||
return error;
|
||||
|
||||
diff_list = git_merge_diff_list__alloc(repo);
|
||||
GITERR_CHECK_ALLOC(diff_list);
|
||||
|
||||
|
||||
if ((error = git_merge_diff_list__find_differences(diff_list, ancestor_tree, our_tree, their_tree)) < 0 ||
|
||||
(error = git_merge_diff_list__find_renames(repo, diff_list, &opts)) < 0)
|
||||
goto done;
|
||||
|
||||
|
||||
memcpy(&changes, &diff_list->conflicts, sizeof(git_vector));
|
||||
git_vector_clear(&diff_list->conflicts);
|
||||
|
||||
|
||||
git_vector_foreach(&changes, i, conflict) {
|
||||
int resolved = 0;
|
||||
|
||||
|
||||
if ((error = merge_conflict_resolve(&resolved, diff_list, conflict, opts.automerge_flags)) < 0)
|
||||
goto done;
|
||||
|
||||
|
||||
if (!resolved)
|
||||
git_vector_insert(&diff_list->conflicts, conflict);
|
||||
}
|
||||
|
||||
|
||||
if (!given_opts || !given_opts->metric)
|
||||
git__free(opts.metric);
|
||||
|
||||
|
||||
error = index_from_diff_list(out, diff_list);
|
||||
|
||||
done:
|
||||
@ -1621,11 +1621,10 @@ void git_merge_diff_list__free(git_merge_diff_list *diff_list)
|
||||
{
|
||||
if (!diff_list)
|
||||
return;
|
||||
|
||||
|
||||
git_vector_free(&diff_list->staged);
|
||||
git_vector_free(&diff_list->conflicts);
|
||||
git_vector_free(&diff_list->resolved);
|
||||
git_pool_clear(&diff_list->pool);
|
||||
git__free(diff_list);
|
||||
}
|
||||
|
||||
|
36
src/merge.h
36
src/merge.h
@ -24,46 +24,46 @@
|
||||
typedef enum {
|
||||
/* No conflict - a change only occurs in one branch. */
|
||||
GIT_MERGE_DIFF_NONE = 0,
|
||||
|
||||
|
||||
/* Occurs when a file is modified in both branches. */
|
||||
GIT_MERGE_DIFF_BOTH_MODIFIED = (1 << 0),
|
||||
|
||||
|
||||
/* Occurs when a file is added in both branches. */
|
||||
GIT_MERGE_DIFF_BOTH_ADDED = (1 << 1),
|
||||
|
||||
|
||||
/* Occurs when a file is deleted in both branches. */
|
||||
GIT_MERGE_DIFF_BOTH_DELETED = (1 << 2),
|
||||
|
||||
|
||||
/* Occurs when a file is modified in one branch and deleted in the other. */
|
||||
GIT_MERGE_DIFF_MODIFIED_DELETED = (1 << 3),
|
||||
|
||||
|
||||
/* Occurs when a file is renamed in one branch and modified in the other. */
|
||||
GIT_MERGE_DIFF_RENAMED_MODIFIED = (1 << 4),
|
||||
|
||||
|
||||
/* Occurs when a file is renamed in one branch and deleted in the other. */
|
||||
GIT_MERGE_DIFF_RENAMED_DELETED = (1 << 5),
|
||||
|
||||
|
||||
/* Occurs when a file is renamed in one branch and a file with the same
|
||||
* name is added in the other. Eg, A->B and new file B. Core git calls
|
||||
* this a "rename/delete". */
|
||||
GIT_MERGE_DIFF_RENAMED_ADDED = (1 << 6),
|
||||
|
||||
|
||||
/* Occurs when both a file is renamed to the same name in the ours and
|
||||
* theirs branches. Eg, A->B and A->B in both. Automergeable. */
|
||||
GIT_MERGE_DIFF_BOTH_RENAMED = (1 << 7),
|
||||
|
||||
|
||||
/* Occurs when a file is renamed to different names in the ours and theirs
|
||||
* branches. Eg, A->B and A->C. */
|
||||
GIT_MERGE_DIFF_BOTH_RENAMED_1_TO_2 = (1 << 8),
|
||||
|
||||
|
||||
/* Occurs when two files are renamed to the same name in the ours and
|
||||
* theirs branches. Eg, A->C and B->C. */
|
||||
GIT_MERGE_DIFF_BOTH_RENAMED_2_TO_1 = (1 << 9),
|
||||
|
||||
|
||||
/* Occurs when an item at a path in one branch is a directory, and an
|
||||
* item at the same path in a different branch is a file. */
|
||||
GIT_MERGE_DIFF_DIRECTORY_FILE = (1 << 10),
|
||||
|
||||
|
||||
/* The child of a folder that is in a directory/file conflict. */
|
||||
GIT_MERGE_DIFF_DF_CHILD = (1 << 11),
|
||||
} git_merge_diff_type_t;
|
||||
@ -72,20 +72,20 @@ typedef enum {
|
||||
typedef struct {
|
||||
git_repository *repo;
|
||||
git_pool pool;
|
||||
|
||||
|
||||
/* Vector of git_index_entry that represent the merged items that
|
||||
* have been staged, either because only one side changed, or because
|
||||
* the two changes were non-conflicting and mergeable. These items
|
||||
* will be written as staged entries in the main index.
|
||||
*/
|
||||
git_vector staged;
|
||||
|
||||
|
||||
/* Vector of git_merge_diff entries that represent the conflicts that
|
||||
* have not been automerged. These items will be written to high-stage
|
||||
* entries in the main index.
|
||||
*/
|
||||
git_vector conflicts;
|
||||
|
||||
|
||||
/* Vector of git_merge_diff that have been automerged. These items
|
||||
* will be written to the REUC when the index is produced.
|
||||
*/
|
||||
@ -97,12 +97,12 @@ typedef struct {
|
||||
*/
|
||||
typedef struct {
|
||||
git_merge_diff_type_t type;
|
||||
|
||||
|
||||
git_index_entry ancestor_entry;
|
||||
|
||||
|
||||
git_index_entry our_entry;
|
||||
git_delta_t our_status;
|
||||
|
||||
|
||||
git_index_entry their_entry;
|
||||
git_delta_t their_status;
|
||||
} git_merge_diff;
|
||||
|
@ -28,12 +28,12 @@ GIT_INLINE(const char *) merge_file_best_path(
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
if (strcmp(ancestor->path, ours->path) == 0)
|
||||
return theirs->path;
|
||||
else if(strcmp(ancestor->path, theirs->path) == 0)
|
||||
return ours->path;
|
||||
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -51,15 +51,15 @@ GIT_INLINE(int) merge_file_best_mode(
|
||||
if (ours->mode == GIT_FILEMODE_BLOB_EXECUTABLE ||
|
||||
theirs->mode == GIT_FILEMODE_BLOB_EXECUTABLE)
|
||||
return GIT_FILEMODE_BLOB_EXECUTABLE;
|
||||
|
||||
|
||||
return GIT_FILEMODE_BLOB;
|
||||
}
|
||||
|
||||
|
||||
if (ancestor->mode == ours->mode)
|
||||
return theirs->mode;
|
||||
else if(ancestor->mode == theirs->mode)
|
||||
return ours->mode;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -70,27 +70,27 @@ int git_merge_file_input_from_index_entry(
|
||||
{
|
||||
git_odb *odb = NULL;
|
||||
int error = 0;
|
||||
|
||||
|
||||
assert(input && repo && entry);
|
||||
|
||||
|
||||
if (entry->mode == 0)
|
||||
return 0;
|
||||
|
||||
|
||||
if ((error = git_repository_odb(&odb, repo)) < 0 ||
|
||||
(error = git_odb_read(&input->odb_object, odb, &entry->oid)) < 0)
|
||||
goto done;
|
||||
|
||||
|
||||
input->mode = entry->mode;
|
||||
input->path = git__strdup(entry->path);
|
||||
input->mmfile.size = git_odb_object_size(input->odb_object);
|
||||
input->mmfile.ptr = (char *)git_odb_object_data(input->odb_object);
|
||||
|
||||
|
||||
if (input->label == NULL)
|
||||
input->label = entry->path;
|
||||
|
||||
|
||||
done:
|
||||
git_odb_free(odb);
|
||||
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -101,27 +101,27 @@ int git_merge_file_input_from_diff_file(
|
||||
{
|
||||
git_odb *odb = NULL;
|
||||
int error = 0;
|
||||
|
||||
|
||||
assert(input && repo && file);
|
||||
|
||||
|
||||
if (file->mode == 0)
|
||||
return 0;
|
||||
|
||||
|
||||
if ((error = git_repository_odb(&odb, repo)) < 0 ||
|
||||
(error = git_odb_read(&input->odb_object, odb, &file->oid)) < 0)
|
||||
goto done;
|
||||
|
||||
|
||||
input->mode = file->mode;
|
||||
input->path = git__strdup(file->path);
|
||||
input->mmfile.size = git_odb_object_size(input->odb_object);
|
||||
input->mmfile.ptr = (char *)git_odb_object_data(input->odb_object);
|
||||
|
||||
|
||||
if (input->label == NULL)
|
||||
input->label = file->path;
|
||||
|
||||
|
||||
done:
|
||||
git_odb_free(odb);
|
||||
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -138,12 +138,12 @@ int git_merge_files(
|
||||
int error = 0;
|
||||
|
||||
assert(out && ancestor && ours && theirs);
|
||||
|
||||
|
||||
memset(out, 0x0, sizeof(git_merge_file_result));
|
||||
|
||||
if (!GIT_MERGE_FILE_SIDE_EXISTS(ours) || !GIT_MERGE_FILE_SIDE_EXISTS(theirs))
|
||||
return 0;
|
||||
|
||||
|
||||
memset(&xmparam, 0x0, sizeof(xmparam_t));
|
||||
xmparam.ancestor = ancestor->label;
|
||||
xmparam.file1 = ours->label;
|
||||
@ -154,7 +154,7 @@ int git_merge_files(
|
||||
|
||||
if (flags == GIT_MERGE_AUTOMERGE_FAVOR_OURS)
|
||||
xmparam.favor = XDL_MERGE_FAVOR_OURS;
|
||||
|
||||
|
||||
if (flags == GIT_MERGE_AUTOMERGE_FAVOR_THEIRS)
|
||||
xmparam.favor = XDL_MERGE_FAVOR_THEIRS;
|
||||
|
||||
@ -164,7 +164,7 @@ int git_merge_files(
|
||||
error = -1;
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
||||
out->automergeable = (xdl_result == 0);
|
||||
out->data = (unsigned char *)mmbuffer.ptr;
|
||||
out->len = mmbuffer.size;
|
||||
@ -172,4 +172,3 @@ int git_merge_files(
|
||||
done:
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,7 @@ typedef struct {
|
||||
char *path;
|
||||
unsigned int mode;
|
||||
mmfile_t mmfile;
|
||||
|
||||
|
||||
git_odb_object *odb_object;
|
||||
} git_merge_file_input;
|
||||
|
||||
@ -24,10 +24,10 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
bool automergeable;
|
||||
|
||||
|
||||
const char *path;
|
||||
int mode;
|
||||
|
||||
|
||||
unsigned char *data;
|
||||
size_t len;
|
||||
} git_merge_file_result;
|
||||
|
@ -141,7 +141,7 @@ bool git_pathspec_match_path(
|
||||
|
||||
git_vector_foreach(vspec, i, match) {
|
||||
int result = (match->flags & GIT_ATTR_FNMATCH_MATCH_ALL) ? 0 : FNM_NOMATCH;
|
||||
|
||||
|
||||
if (result == FNM_NOMATCH)
|
||||
result = use_strcmp(match->pattern, path) ? FNM_NOMATCH : 0;
|
||||
|
||||
|
@ -217,7 +217,7 @@ static int packed_load(refdb_fs_backend *backend)
|
||||
backend->peeling_mode = PEELING_NONE;
|
||||
|
||||
if (buffer_start[0] == '#') {
|
||||
static const char *traits_header = "# pack-refs with: ";
|
||||
static const char *traits_header = "# pack-refs with: ";
|
||||
|
||||
if (git__prefixcmp(buffer_start, traits_header) == 0) {
|
||||
char *traits = (char *)buffer_start + strlen(traits_header);
|
||||
@ -1060,7 +1060,7 @@ static void refdb_fs_backend__free(git_refdb_backend *_backend)
|
||||
|
||||
static int setup_namespace(git_buf *path, git_repository *repo)
|
||||
{
|
||||
char *parts, *start, *end;
|
||||
char *parts, *start, *end;
|
||||
|
||||
/* Not all repositories have a path */
|
||||
if (repo->path_repository == NULL)
|
||||
@ -1091,7 +1091,7 @@ static int setup_namespace(git_buf *path, git_repository *repo)
|
||||
free(parts);
|
||||
|
||||
/* Make sure that the folder with the namespace exists */
|
||||
if (git_futils_mkdir_r(git_buf_cstr(path), repo->path_repository, 0777) < 0)
|
||||
if (git_futils_mkdir_r(git_buf_cstr(path), repo->path_repository, 0777) < 0)
|
||||
return -1;
|
||||
|
||||
/* Return the root of the namespaced path, i.e. without the trailing '/refs' */
|
||||
|
@ -32,7 +32,7 @@ int git_reset_default(
|
||||
int error;
|
||||
git_index *index = NULL;
|
||||
|
||||
assert(pathspecs != NULL && pathspecs->count > 0);
|
||||
assert(pathspecs != NULL && pathspecs->count > 0);
|
||||
|
||||
memset(&entry, 0, sizeof(git_index_entry));
|
||||
|
||||
|
@ -855,4 +855,3 @@ int git_revparse(
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -173,7 +173,7 @@ int git_signature__parse(git_signature *sig, const char **buffer_out,
|
||||
|
||||
tz_start = time_end + 1;
|
||||
|
||||
if ((tz_start[0] != '-' && tz_start[0] != '+') ||
|
||||
if ((tz_start[0] != '-' && tz_start[0] != '+') ||
|
||||
git__strtol32(&offset, tz_start + 1, &tz_end, 10) < 0)
|
||||
return signature_error("malformed timezone");
|
||||
|
||||
|
@ -25,7 +25,7 @@ int git_trace_set(git_trace_level_t level, git_trace_callback callback)
|
||||
git_trace__data.level = level;
|
||||
git_trace__data.callback = callback;
|
||||
GIT_MEMORY_BARRIER;
|
||||
|
||||
|
||||
return 0;
|
||||
#else
|
||||
GIT_UNUSED(level);
|
||||
@ -36,4 +36,3 @@ int git_trace_set(git_trace_level_t level, git_trace_callback callback)
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -25,14 +25,14 @@ GIT_INLINE(void) git_trace__write_fmt(
|
||||
git_trace_level_t level,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
git_trace_callback callback = git_trace__data.callback;
|
||||
git_trace_callback callback = git_trace__data.callback;
|
||||
git_buf message = GIT_BUF_INIT;
|
||||
va_list ap;
|
||||
|
||||
|
||||
va_start(ap, fmt);
|
||||
git_buf_vprintf(&message, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
|
||||
callback(level, git_buf_cstr(&message));
|
||||
|
||||
git_buf_free(&message);
|
||||
|
@ -348,7 +348,7 @@ static int local_push(
|
||||
if ((error = git_repository_open(&remote_repo, push->remote->url)) < 0)
|
||||
return error;
|
||||
|
||||
/* We don't currently support pushing locally to non-bare repos. Proper
|
||||
/* We don't currently support pushing locally to non-bare repos. Proper
|
||||
non-bare repo push support would require checking configs to see if
|
||||
we should override the default 'don't let this happen' behavior */
|
||||
if (!remote_repo->is_bare) {
|
||||
|
@ -235,4 +235,3 @@ int git_win32__find_xdg_dirs(git_buf *out)
|
||||
|
||||
return win32_find_existing_dirs(out, global_tmpls, temp);
|
||||
}
|
||||
|
||||
|
@ -535,7 +535,7 @@ int p_gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
|
||||
/*converting file time to unix epoch*/
|
||||
tmpres /= 10; /*convert into microseconds*/
|
||||
tmpres -= DELTA_EPOCH_IN_MICROSECS;
|
||||
tmpres -= DELTA_EPOCH_IN_MICROSECS;
|
||||
tv->tv_sec = (long)(tmpres / 1000000UL);
|
||||
tv->tv_usec = (long)(tmpres % 1000000UL);
|
||||
}
|
||||
|
@ -363,7 +363,7 @@ void assert_conflict(
|
||||
git_index *index;
|
||||
git_object *hack_tree;
|
||||
git_reference *branch, *head;
|
||||
git_buf file_path = GIT_BUF_INIT;
|
||||
git_buf file_path = GIT_BUF_INIT;
|
||||
|
||||
cl_git_pass(git_repository_index(&index, g_repo));
|
||||
|
||||
|
@ -48,13 +48,13 @@ void test_clone_empty__can_clone_an_empty_local_repo_barely(void)
|
||||
cl_assert_equal_i(GIT_ENOTFOUND, git_reference_lookup(&ref, g_repo_cloned, local_name));
|
||||
|
||||
/* ...one can still retrieve the name of the remote tracking reference */
|
||||
cl_assert_equal_i((int)strlen(expected_tracked_branch_name) + 1,
|
||||
cl_assert_equal_i((int)strlen(expected_tracked_branch_name) + 1,
|
||||
git_branch_upstream_name(buffer, 1024, g_repo_cloned, local_name));
|
||||
|
||||
cl_assert_equal_s(expected_tracked_branch_name, buffer);
|
||||
|
||||
/* ...and the name of the remote... */
|
||||
cl_assert_equal_i((int)strlen(expected_remote_name) + 1,
|
||||
cl_assert_equal_i((int)strlen(expected_remote_name) + 1,
|
||||
git_branch_remote_name(buffer, 1024, g_repo_cloned, expected_tracked_branch_name));
|
||||
|
||||
cl_assert_equal_s(expected_remote_name, buffer);
|
||||
|
@ -115,7 +115,7 @@ void test_commit_write__root(void)
|
||||
head_old = git__strdup(git_reference_symbolic_target(head));
|
||||
cl_assert(head_old != NULL);
|
||||
git_reference_free(head);
|
||||
|
||||
|
||||
cl_git_pass(git_reference_symbolic_create(&head, g_repo, "HEAD", branch_name, 1));
|
||||
|
||||
cl_git_pass(git_commit_create_v(
|
||||
|
@ -21,7 +21,7 @@ void test_index_names__cleanup(void)
|
||||
{
|
||||
git_index_free(repo_index);
|
||||
repo_index = NULL;
|
||||
|
||||
|
||||
cl_git_sandbox_cleanup();
|
||||
}
|
||||
|
||||
@ -32,14 +32,14 @@ void test_index_names__add(void)
|
||||
cl_git_pass(git_index_name_add(repo_index, "ancestor", "ours", "theirs"));
|
||||
cl_git_pass(git_index_name_add(repo_index, "ancestor2", "ours2", NULL));
|
||||
cl_git_pass(git_index_name_add(repo_index, "ancestor3", NULL, "theirs3"));
|
||||
|
||||
|
||||
cl_assert(git_index_name_entrycount(repo_index) == 3);
|
||||
|
||||
|
||||
conflict_name = git_index_name_get_byindex(repo_index, 0);
|
||||
cl_assert(strcmp(conflict_name->ancestor, "ancestor") == 0);
|
||||
cl_assert(strcmp(conflict_name->ours, "ours") == 0);
|
||||
cl_assert(strcmp(conflict_name->theirs, "theirs") == 0);
|
||||
|
||||
|
||||
conflict_name = git_index_name_get_byindex(repo_index, 1);
|
||||
cl_assert(strcmp(conflict_name->ancestor, "ancestor2") == 0);
|
||||
cl_assert(strcmp(conflict_name->ours, "ours2") == 0);
|
||||
@ -54,31 +54,31 @@ void test_index_names__add(void)
|
||||
void test_index_names__roundtrip(void)
|
||||
{
|
||||
const git_index_name_entry *conflict_name;
|
||||
|
||||
|
||||
cl_git_pass(git_index_name_add(repo_index, "ancestor", "ours", "theirs"));
|
||||
cl_git_pass(git_index_name_add(repo_index, "ancestor2", "ours2", NULL));
|
||||
cl_git_pass(git_index_name_add(repo_index, "ancestor3", NULL, "theirs3"));
|
||||
|
||||
|
||||
cl_git_pass(git_index_write(repo_index));
|
||||
git_index_clear(repo_index);
|
||||
cl_assert(git_index_name_entrycount(repo_index) == 0);
|
||||
|
||||
|
||||
cl_git_pass(git_index_read(repo_index));
|
||||
cl_assert(git_index_name_entrycount(repo_index) == 3);
|
||||
|
||||
|
||||
conflict_name = git_index_name_get_byindex(repo_index, 0);
|
||||
cl_assert(strcmp(conflict_name->ancestor, "ancestor") == 0);
|
||||
cl_assert(strcmp(conflict_name->ours, "ours") == 0);
|
||||
cl_assert(strcmp(conflict_name->theirs, "theirs") == 0);
|
||||
|
||||
|
||||
conflict_name = git_index_name_get_byindex(repo_index, 1);
|
||||
cl_assert(strcmp(conflict_name->ancestor, "ancestor2") == 0);
|
||||
cl_assert(strcmp(conflict_name->ours, "ours2") == 0);
|
||||
cl_assert(conflict_name->theirs == NULL);
|
||||
|
||||
|
||||
conflict_name = git_index_name_get_byindex(repo_index, 2);
|
||||
cl_assert(strcmp(conflict_name->ancestor, "ancestor3") == 0);
|
||||
cl_assert(conflict_name->ours == NULL);
|
||||
cl_assert(strcmp(conflict_name->theirs, "theirs3") == 0);
|
||||
|
||||
|
||||
}
|
||||
|
@ -232,7 +232,7 @@ void test_index_reuc__remove(void)
|
||||
|
||||
cl_git_pass(git_index_reuc_remove(repo_index, 0));
|
||||
cl_git_fail(git_index_reuc_remove(repo_index, 1));
|
||||
|
||||
|
||||
cl_assert_equal_i(1, git_index_reuc_entrycount(repo_index));
|
||||
|
||||
cl_assert(reuc = git_index_reuc_get_byindex(repo_index, 0));
|
||||
@ -283,7 +283,7 @@ void test_index_reuc__write(void)
|
||||
/* ensure sort order was round-tripped correct */
|
||||
cl_assert(reuc = git_index_reuc_get_byindex(repo_index, 0));
|
||||
cl_assert_equal_s("one.txt", reuc->path);
|
||||
|
||||
|
||||
cl_assert(reuc = git_index_reuc_get_byindex(repo_index, 1));
|
||||
cl_assert_equal_s("two.txt", reuc->path);
|
||||
}
|
||||
@ -296,41 +296,41 @@ static int reuc_entry_exists(void)
|
||||
void test_index_reuc__cleaned_on_reset_hard(void)
|
||||
{
|
||||
git_object *target;
|
||||
|
||||
|
||||
retrieve_target_from_oid(&target, repo, "3a34580a35add43a4cf361e8e9a30060a905c876");
|
||||
|
||||
|
||||
test_index_reuc__add();
|
||||
cl_git_pass(git_reset(repo, target, GIT_RESET_HARD));
|
||||
cl_assert(reuc_entry_exists() == false);
|
||||
|
||||
|
||||
git_object_free(target);
|
||||
}
|
||||
|
||||
void test_index_reuc__cleaned_on_reset_mixed(void)
|
||||
{
|
||||
git_object *target;
|
||||
|
||||
|
||||
retrieve_target_from_oid(&target, repo, "3a34580a35add43a4cf361e8e9a30060a905c876");
|
||||
|
||||
test_index_reuc__add();
|
||||
test_index_reuc__add();
|
||||
cl_git_pass(git_reset(repo, target, GIT_RESET_MIXED));
|
||||
cl_assert(reuc_entry_exists() == false);
|
||||
|
||||
|
||||
git_object_free(target);
|
||||
}
|
||||
|
||||
void test_index_reuc__retained_on_reset_soft(void)
|
||||
{
|
||||
git_object *target;
|
||||
|
||||
|
||||
retrieve_target_from_oid(&target, repo, "3a34580a35add43a4cf361e8e9a30060a905c876");
|
||||
|
||||
|
||||
git_reset(repo, target, GIT_RESET_HARD);
|
||||
|
||||
test_index_reuc__add();
|
||||
cl_git_pass(git_reset(repo, target, GIT_RESET_SOFT));
|
||||
cl_assert(reuc_entry_exists() == true);
|
||||
|
||||
|
||||
git_object_free(target);
|
||||
}
|
||||
|
||||
@ -339,7 +339,7 @@ void test_index_reuc__cleaned_on_checkout_tree(void)
|
||||
git_oid oid;
|
||||
git_object *obj;
|
||||
git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
|
||||
|
||||
|
||||
opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_UPDATE_ONLY;
|
||||
|
||||
test_index_reuc__add();
|
||||
@ -347,16 +347,16 @@ void test_index_reuc__cleaned_on_checkout_tree(void)
|
||||
git_object_lookup(&obj, repo, &oid, GIT_OBJ_ANY);
|
||||
git_checkout_tree(repo, obj, &opts);
|
||||
cl_assert(reuc_entry_exists() == false);
|
||||
|
||||
|
||||
git_object_free(obj);
|
||||
}
|
||||
|
||||
void test_index_reuc__cleaned_on_checkout_head(void)
|
||||
{
|
||||
git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
|
||||
|
||||
|
||||
opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_UPDATE_ONLY;
|
||||
|
||||
|
||||
test_index_reuc__add();
|
||||
git_checkout_head(repo, &opts);
|
||||
cl_assert(reuc_entry_exists() == false);
|
||||
@ -365,9 +365,9 @@ void test_index_reuc__cleaned_on_checkout_head(void)
|
||||
void test_index_reuc__retained_on_checkout_index(void)
|
||||
{
|
||||
git_checkout_opts opts = GIT_CHECKOUT_OPTS_INIT;
|
||||
|
||||
|
||||
opts.checkout_strategy = GIT_CHECKOUT_SAFE | GIT_CHECKOUT_UPDATE_ONLY;
|
||||
|
||||
|
||||
test_index_reuc__add();
|
||||
git_checkout_index(repo, repo_index, &opts);
|
||||
cl_assert(reuc_entry_exists() == true);
|
||||
|
@ -56,11 +56,11 @@ void merge__dump_index_entries(git_vector *index_entries)
|
||||
{
|
||||
size_t i;
|
||||
const git_index_entry *index_entry;
|
||||
|
||||
|
||||
printf ("\nINDEX [%d]:\n", (int)index_entries->length);
|
||||
for (i = 0; i < index_entries->length; i++) {
|
||||
index_entry = index_entries->contents[i];
|
||||
|
||||
|
||||
printf("%o ", index_entry->mode);
|
||||
printf("%s ", git_oid_allocfmt(&index_entry->oid));
|
||||
printf("%d ", git_index_entry_stage(index_entry));
|
||||
@ -77,7 +77,7 @@ void merge__dump_names(git_index *index)
|
||||
|
||||
for (i = 0; i < git_index_name_entrycount(index); i++) {
|
||||
conflict_name = git_index_name_get_byindex(index, i);
|
||||
|
||||
|
||||
printf("%s %s %s\n", conflict_name->ancestor, conflict_name->ours, conflict_name->theirs);
|
||||
}
|
||||
printf("\n");
|
||||
@ -91,7 +91,7 @@ void merge__dump_reuc(git_index *index)
|
||||
printf ("\nREUC:\n");
|
||||
for (i = 0; i < git_index_reuc_entrycount(index); i++) {
|
||||
reuc = git_index_reuc_get_byindex(index, i);
|
||||
|
||||
|
||||
printf("%s ", reuc->path);
|
||||
printf("%o ", reuc->mode[0]);
|
||||
printf("%s\n", git_oid_allocfmt(&reuc->oid[0]));
|
||||
@ -114,18 +114,18 @@ static int index_entry_eq_merge_index_entry(const struct merge_index_entry *expe
|
||||
test_oid = 1;
|
||||
} else
|
||||
test_oid = 0;
|
||||
|
||||
|
||||
if (actual->mode != expected->mode ||
|
||||
(test_oid && git_oid_cmp(&actual->oid, &expected_oid) != 0) ||
|
||||
git_index_entry_stage(actual) != expected->stage)
|
||||
return 0;
|
||||
|
||||
|
||||
if (actual->mode == 0 && (actual->path != NULL || strlen(expected->path) > 0))
|
||||
return 0;
|
||||
|
||||
if (actual->mode != 0 && (strcmp(actual->path, expected->path) != 0))
|
||||
return 0;
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -133,7 +133,7 @@ static int name_entry_eq(const char *expected, const char *actual)
|
||||
{
|
||||
if (strlen(expected) == 0)
|
||||
return (actual == NULL) ? 1 : 0;
|
||||
|
||||
|
||||
return (strcmp(expected, actual) == 0) ? 1 : 0;
|
||||
}
|
||||
|
||||
@ -153,11 +153,11 @@ static int index_conflict_data_eq_merge_diff(const struct merge_index_conflict_d
|
||||
!index_entry_eq_merge_index_entry(&expected->ours.entry, &actual->our_entry) ||
|
||||
!index_entry_eq_merge_index_entry(&expected->theirs.entry, &actual->their_entry))
|
||||
return 0;
|
||||
|
||||
|
||||
if (expected->ours.status != actual->our_status ||
|
||||
expected->theirs.status != actual->their_status)
|
||||
return 0;
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -165,48 +165,48 @@ int merge_test_merge_conflicts(git_vector *conflicts, const struct merge_index_c
|
||||
{
|
||||
git_merge_diff *actual;
|
||||
size_t i;
|
||||
|
||||
|
||||
if (conflicts->length != expected_len)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < expected_len; i++) {
|
||||
actual = conflicts->contents[i];
|
||||
|
||||
|
||||
if (!index_conflict_data_eq_merge_diff(&expected[i], actual))
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int merge_test_index(git_index *index, const struct merge_index_entry expected[], size_t expected_len)
|
||||
{
|
||||
size_t i;
|
||||
const git_index_entry *index_entry;
|
||||
|
||||
size_t i;
|
||||
const git_index_entry *index_entry;
|
||||
|
||||
/*
|
||||
dump_index_entries(&index->entries);
|
||||
*/
|
||||
|
||||
if (git_index_entrycount(index) != expected_len)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < expected_len; i++) {
|
||||
if ((index_entry = git_index_get_byindex(index, i)) == NULL)
|
||||
return 0;
|
||||
|
||||
if (git_index_entrycount(index) != expected_len)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < expected_len; i++) {
|
||||
if ((index_entry = git_index_get_byindex(index, i)) == NULL)
|
||||
return 0;
|
||||
|
||||
if (!index_entry_eq_merge_index_entry(&expected[i], index_entry))
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int merge_test_names(git_index *index, const struct merge_name_entry expected[], size_t expected_len)
|
||||
{
|
||||
size_t i;
|
||||
const git_index_name_entry *name_entry;
|
||||
|
||||
|
||||
/*
|
||||
dump_names(index);
|
||||
*/
|
||||
@ -221,26 +221,26 @@ int merge_test_names(git_index *index, const struct merge_name_entry expected[],
|
||||
if (! name_entry_eq_merge_name_entry(&expected[i], name_entry))
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int merge_test_reuc(git_index *index, const struct merge_reuc_entry expected[], size_t expected_len)
|
||||
{
|
||||
size_t i;
|
||||
size_t i;
|
||||
const git_index_reuc_entry *reuc_entry;
|
||||
git_oid expected_oid;
|
||||
|
||||
git_oid expected_oid;
|
||||
|
||||
/*
|
||||
dump_reuc(index);
|
||||
*/
|
||||
|
||||
if (git_index_reuc_entrycount(index) != expected_len)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < expected_len; i++) {
|
||||
if ((reuc_entry = git_index_reuc_get_byindex(index, i)) == NULL)
|
||||
return 0;
|
||||
|
||||
if (git_index_reuc_entrycount(index) != expected_len)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < expected_len; i++) {
|
||||
if ((reuc_entry = git_index_reuc_get_byindex(index, i)) == NULL)
|
||||
return 0;
|
||||
|
||||
if (strcmp(reuc_entry->path, expected[i].path) != 0 ||
|
||||
reuc_entry->mode[0] != expected[i].ancestor_mode ||
|
||||
@ -268,19 +268,19 @@ int merge_test_reuc(git_index *index, const struct merge_reuc_entry expected[],
|
||||
if (git_oid_cmp(&reuc_entry->oid[2], &expected_oid) != 0)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int dircount(void *payload, git_buf *pathbuf)
|
||||
{
|
||||
int *entries = payload;
|
||||
size_t len = git_buf_len(pathbuf);
|
||||
|
||||
|
||||
if (len < 5 || strcmp(pathbuf->ptr + (git_buf_len(pathbuf) - 5), "/.git") != 0)
|
||||
(*entries)++;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -289,22 +289,22 @@ int merge_test_workdir(git_repository *repo, const struct merge_index_entry expe
|
||||
size_t actual_len = 0, i;
|
||||
git_oid actual_oid, expected_oid;
|
||||
git_buf wd = GIT_BUF_INIT;
|
||||
|
||||
git_buf_puts(&wd, repo->workdir);
|
||||
|
||||
git_buf_puts(&wd, repo->workdir);
|
||||
git_path_direach(&wd, dircount, &actual_len);
|
||||
|
||||
|
||||
if (actual_len != expected_len)
|
||||
return 0;
|
||||
|
||||
|
||||
for (i = 0; i < expected_len; i++) {
|
||||
git_blob_create_fromworkdir(&actual_oid, repo, expected[i].path);
|
||||
git_oid_fromstr(&expected_oid, expected[i].oid_str);
|
||||
|
||||
|
||||
if (git_oid_cmp(&actual_oid, &expected_oid) != 0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
git_buf_free(&wd);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -93,7 +93,7 @@ void test_merge_trees_automerge__automerge(void)
|
||||
const git_index_entry *entry;
|
||||
git_merge_tree_opts opts = GIT_MERGE_TREE_OPTS_INIT;
|
||||
git_blob *blob;
|
||||
|
||||
|
||||
struct merge_index_entry merge_index_entries[] = {
|
||||
ADDED_IN_MASTER_INDEX_ENTRY,
|
||||
AUTOMERGEABLE_INDEX_ENTRY,
|
||||
@ -105,7 +105,7 @@ void test_merge_trees_automerge__automerge(void)
|
||||
{ 0100644, "2bd0a343aeef7a2cf0d158478966a6e587ff3863", 3, "conflicting.txt" },
|
||||
|
||||
UNCHANGED_INDEX_ENTRY,
|
||||
};
|
||||
};
|
||||
|
||||
struct merge_reuc_entry merge_reuc_entries[] = {
|
||||
AUTOMERGEABLE_REUC_ENTRY,
|
||||
@ -120,10 +120,10 @@ void test_merge_trees_automerge__automerge(void)
|
||||
|
||||
cl_assert((entry = git_index_get_bypath(index, "automergeable.txt", 0)) != NULL);
|
||||
cl_assert(entry->file_size == strlen(AUTOMERGEABLE_MERGED_FILE));
|
||||
|
||||
|
||||
cl_git_pass(git_object_lookup((git_object **)&blob, repo, &entry->oid, GIT_OBJ_BLOB));
|
||||
cl_assert(memcmp(git_blob_rawcontent(blob), AUTOMERGEABLE_MERGED_FILE, entry->file_size) == 0);
|
||||
|
||||
|
||||
git_index_free(index);
|
||||
git_blob_free(blob);
|
||||
}
|
||||
@ -132,7 +132,7 @@ void test_merge_trees_automerge__favor_ours(void)
|
||||
{
|
||||
git_index *index;
|
||||
git_merge_tree_opts opts = GIT_MERGE_TREE_OPTS_INIT;
|
||||
|
||||
|
||||
struct merge_index_entry merge_index_entries[] = {
|
||||
ADDED_IN_MASTER_INDEX_ENTRY,
|
||||
AUTOMERGEABLE_INDEX_ENTRY,
|
||||
@ -148,9 +148,9 @@ void test_merge_trees_automerge__favor_ours(void)
|
||||
REMOVED_IN_BRANCH_REUC_ENTRY,
|
||||
REMOVED_IN_MASTER_REUC_ENTRY,
|
||||
};
|
||||
|
||||
|
||||
opts.automerge_flags = GIT_MERGE_AUTOMERGE_FAVOR_OURS;
|
||||
|
||||
|
||||
cl_git_pass(merge_trees_from_branches(&index, repo, "master", THEIRS_AUTOMERGE_BRANCH, &opts));
|
||||
|
||||
cl_assert(merge_test_index(index, merge_index_entries, 6));
|
||||
@ -163,7 +163,7 @@ void test_merge_trees_automerge__favor_theirs(void)
|
||||
{
|
||||
git_index *index;
|
||||
git_merge_tree_opts opts = GIT_MERGE_TREE_OPTS_INIT;
|
||||
|
||||
|
||||
struct merge_index_entry merge_index_entries[] = {
|
||||
ADDED_IN_MASTER_INDEX_ENTRY,
|
||||
AUTOMERGEABLE_INDEX_ENTRY,
|
||||
@ -181,12 +181,12 @@ void test_merge_trees_automerge__favor_theirs(void)
|
||||
};
|
||||
|
||||
opts.automerge_flags = GIT_MERGE_AUTOMERGE_FAVOR_THEIRS;
|
||||
|
||||
|
||||
cl_git_pass(merge_trees_from_branches(&index, repo, "master", THEIRS_AUTOMERGE_BRANCH, &opts));
|
||||
|
||||
cl_assert(merge_test_index(index, merge_index_entries, 6));
|
||||
cl_assert(merge_test_reuc(index, merge_reuc_entries, 4));
|
||||
|
||||
|
||||
git_index_free(index);
|
||||
}
|
||||
|
||||
@ -194,7 +194,7 @@ void test_merge_trees_automerge__unrelated(void)
|
||||
{
|
||||
git_index *index;
|
||||
git_merge_tree_opts opts = GIT_MERGE_TREE_OPTS_INIT;
|
||||
|
||||
|
||||
struct merge_index_entry merge_index_entries[] = {
|
||||
{ 0100644, "233c0919c998ed110a4b6ff36f353aec8b713487", 0, "added-in-master.txt" },
|
||||
{ 0100644, "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf", 2, "automergeable.txt" },
|
||||
@ -208,10 +208,10 @@ void test_merge_trees_automerge__unrelated(void)
|
||||
{ 0100644, "dfe3f22baa1f6fce5447901c3086bae368de6bdd", 0, "removed-in-branch.txt" },
|
||||
{ 0100644, "c8f06f2e3bb2964174677e91f0abead0e43c9e5d", 0, "unchanged.txt" },
|
||||
};
|
||||
|
||||
|
||||
cl_git_pass(merge_trees_from_branches(&index, repo, "master", THEIRS_UNRELATED_BRANCH, &opts));
|
||||
|
||||
|
||||
cl_assert(merge_test_index(index, merge_index_entries, 11));
|
||||
|
||||
|
||||
git_index_free(index);
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ void test_merge_trees_modeconflict__cleanup(void)
|
||||
void test_merge_trees_modeconflict__df_conflict(void)
|
||||
{
|
||||
git_index *index;
|
||||
|
||||
|
||||
struct merge_index_entry merge_index_entries[] = {
|
||||
{ 0100644, "49130a28ef567af9a6a6104c38773fedfa5f9742", 2, "dir-10" },
|
||||
{ 0100644, "6c06dcd163587c2cc18be44857e0b71116382aeb", 3, "dir-10" },
|
||||
@ -49,7 +49,7 @@ void test_merge_trees_modeconflict__df_conflict(void)
|
||||
{ 0100644, "e49f917b448d1340b31d76e54ba388268fd4c922", 0, "file-4/new" },
|
||||
{ 0100644, "cab2cf23998b40f1af2d9d9a756dc9e285a8df4b", 2, "file-5/new" },
|
||||
{ 0100644, "f5504f36e6f4eb797a56fc5bac6c6c7f32969bf2", 3, "file-5/new" },
|
||||
};
|
||||
};
|
||||
|
||||
cl_git_pass(merge_trees_from_branches(&index, repo, DF_SIDE1_BRANCH, DF_SIDE2_BRANCH, NULL));
|
||||
|
||||
|
@ -72,14 +72,14 @@ void test_merge_trees_renames__index(void)
|
||||
{ 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 2, "7-both-renamed.txt" },
|
||||
{ 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 3, "7-both-renamed.txt" },
|
||||
};
|
||||
|
||||
|
||||
struct merge_name_entry merge_name_entries[] = {
|
||||
{
|
||||
"3a-renamed-in-ours-deleted-in-theirs.txt",
|
||||
"3a-newname-in-ours-deleted-in-theirs.txt",
|
||||
""
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
"3b-renamed-in-theirs-deleted-in-ours.txt",
|
||||
"",
|
||||
@ -97,7 +97,7 @@ void test_merge_trees_renames__index(void)
|
||||
"",
|
||||
"4b-newname-in-theirs-added-in-ours.txt",
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
"5a-renamed-in-ours-added-in-theirs.txt",
|
||||
"5a-newname-in-ours-added-in-theirs.txt",
|
||||
@ -115,13 +115,13 @@ void test_merge_trees_renames__index(void)
|
||||
"6-both-renamed-1-to-2-ours.txt",
|
||||
"6-both-renamed-1-to-2-theirs.txt",
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
"7-both-renamed-side-1.txt",
|
||||
"7-both-renamed.txt",
|
||||
"7-both-renamed-side-1.txt",
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
"7-both-renamed-side-2.txt",
|
||||
"7-both-renamed-side-2.txt",
|
||||
@ -159,7 +159,7 @@ void test_merge_trees_renames__index(void)
|
||||
"",
|
||||
"",
|
||||
"241a1005cd9b980732741b74385b891142bcba28" },
|
||||
|
||||
|
||||
{ "1b-newname-in-theirs.txt",
|
||||
0, 0, 0100644,
|
||||
"",
|
||||
@ -194,11 +194,11 @@ void test_merge_trees_renames__index(void)
|
||||
cl_git_pass(merge_trees_from_branches(&index, repo,
|
||||
BRANCH_RENAME_OURS, BRANCH_RENAME_THEIRS,
|
||||
opts));
|
||||
|
||||
|
||||
cl_assert(merge_test_index(index, merge_index_entries, 41));
|
||||
cl_assert(merge_test_names(index, merge_name_entries, 9));
|
||||
cl_assert(merge_test_reuc(index, merge_reuc_entries, 10));
|
||||
|
||||
|
||||
git_index_free(index);
|
||||
}
|
||||
|
||||
@ -206,7 +206,7 @@ void test_merge_trees_renames__no_rename_index(void)
|
||||
{
|
||||
git_index *index;
|
||||
git_merge_tree_opts opts = GIT_MERGE_TREE_OPTS_INIT;
|
||||
|
||||
|
||||
struct merge_index_entry merge_index_entries[] = {
|
||||
{ 0100644, "68c6c84b091926c7d90aa6a79b2bc3bb6adccd8e", 0, "0a-no-change.txt" },
|
||||
{ 0100644, "f0ce2b8e4986084d9b308fb72709e414c23eb5e6", 0, "0b-duplicated-in-ours.txt" },
|
||||
@ -241,13 +241,12 @@ void test_merge_trees_renames__no_rename_index(void)
|
||||
{ 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 2, "7-both-renamed.txt" },
|
||||
{ 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 3, "7-both-renamed.txt" },
|
||||
};
|
||||
|
||||
|
||||
cl_git_pass(merge_trees_from_branches(&index, repo,
|
||||
BRANCH_RENAME_OURS, BRANCH_RENAME_THEIRS,
|
||||
&opts));
|
||||
|
||||
|
||||
cl_assert(merge_test_index(index, merge_index_entries, 32));
|
||||
|
||||
|
||||
git_index_free(index);
|
||||
}
|
||||
|
||||
|
@ -58,37 +58,37 @@ static void test_find_differences(
|
||||
opts.metric->similarity = git_diff_find_similar__calc_similarity;
|
||||
opts.metric->payload = (void *)GIT_HASHSIG_SMART_WHITESPACE;
|
||||
|
||||
cl_git_pass(git_oid_fromstr(&ancestor_oid, ancestor_oidstr));
|
||||
cl_git_pass(git_oid_fromstr(&ours_oid, ours_oidstr));
|
||||
cl_git_pass(git_oid_fromstr(&theirs_oid, theirs_oidstr));
|
||||
|
||||
cl_git_pass(git_tree_lookup(&ancestor_tree, repo, &ancestor_oid));
|
||||
cl_git_pass(git_tree_lookup(&ours_tree, repo, &ours_oid));
|
||||
cl_git_pass(git_tree_lookup(&theirs_tree, repo, &theirs_oid));
|
||||
|
||||
cl_git_pass(git_oid_fromstr(&ancestor_oid, ancestor_oidstr));
|
||||
cl_git_pass(git_oid_fromstr(&ours_oid, ours_oidstr));
|
||||
cl_git_pass(git_oid_fromstr(&theirs_oid, theirs_oidstr));
|
||||
|
||||
cl_git_pass(git_tree_lookup(&ancestor_tree, repo, &ancestor_oid));
|
||||
cl_git_pass(git_tree_lookup(&ours_tree, repo, &ours_oid));
|
||||
cl_git_pass(git_tree_lookup(&theirs_tree, repo, &theirs_oid));
|
||||
|
||||
cl_git_pass(git_merge_diff_list__find_differences(merge_diff_list, ancestor_tree, ours_tree, theirs_tree));
|
||||
cl_git_pass(git_merge_diff_list__find_renames(repo, merge_diff_list, &opts));
|
||||
|
||||
/*
|
||||
dump_merge_index(merge_index);
|
||||
*/
|
||||
|
||||
cl_assert(treediff_conflict_data_len == merge_diff_list->conflicts.length);
|
||||
|
||||
cl_assert(treediff_conflict_data_len == merge_diff_list->conflicts.length);
|
||||
|
||||
cl_assert(merge_test_merge_conflicts(&merge_diff_list->conflicts, treediff_conflict_data, treediff_conflict_data_len));
|
||||
|
||||
git_tree_free(ancestor_tree);
|
||||
git_tree_free(ours_tree);
|
||||
git_tree_free(theirs_tree);
|
||||
|
||||
git_tree_free(ancestor_tree);
|
||||
git_tree_free(ours_tree);
|
||||
git_tree_free(theirs_tree);
|
||||
|
||||
git_merge_diff_list__free(merge_diff_list);
|
||||
|
||||
|
||||
git__free(opts.metric);
|
||||
}
|
||||
|
||||
void test_merge_trees_treediff__simple(void)
|
||||
{
|
||||
struct merge_index_conflict_data treediff_conflict_data[] = {
|
||||
struct merge_index_conflict_data treediff_conflict_data[] = {
|
||||
{
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "233c0919c998ed110a4b6ff36f353aec8b713487", 0, "added-in-master.txt" }, GIT_DELTA_ADDED },
|
||||
@ -96,41 +96,41 @@ void test_merge_trees_treediff__simple(void)
|
||||
GIT_MERGE_DIFF_NONE
|
||||
},
|
||||
|
||||
{
|
||||
{
|
||||
{ { 0100644, "6212c31dab5e482247d7977e4f0dd3601decf13b", 0, "automergeable.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf", 0, "automergeable.txt" }, GIT_DELTA_MODIFIED },
|
||||
{ { 0100644, "058541fc37114bfc1dddf6bd6bffc7fae5c2e6fe", 0, "automergeable.txt" }, GIT_DELTA_MODIFIED },
|
||||
GIT_MERGE_DIFF_BOTH_MODIFIED
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-branch.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-branch.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "4eb04c9e79e88f6640d01ff5b25ca2a60764f216", 0, "changed-in-branch.txt" }, GIT_DELTA_MODIFIED },
|
||||
GIT_MERGE_DIFF_NONE
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-master.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "11deab00b2d3a6f5a3073988ac050c2d7b6655e2", 0, "changed-in-master.txt" }, GIT_DELTA_MODIFIED },
|
||||
{ { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-master.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
GIT_MERGE_DIFF_NONE
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "d427e0b2e138501a3d15cc376077a3631e15bd46", 0, "conflicting.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "4e886e602529caa9ab11d71f86634bd1b6e0de10", 0, "conflicting.txt" }, GIT_DELTA_MODIFIED },
|
||||
{ { 0100644, "2bd0a343aeef7a2cf0d158478966a6e587ff3863", 0, "conflicting.txt" }, GIT_DELTA_MODIFIED },
|
||||
GIT_MERGE_DIFF_BOTH_MODIFIED
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "dfe3f22baa1f6fce5447901c3086bae368de6bdd", 0, "removed-in-branch.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "dfe3f22baa1f6fce5447901c3086bae368de6bdd", 0, "removed-in-branch.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_DELETED },
|
||||
GIT_MERGE_DIFF_NONE
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "5c3b68a71fc4fa5d362fd3875e53137c6a5ab7a5", 0, "removed-in-master.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_DELETED },
|
||||
@ -138,13 +138,13 @@ void test_merge_trees_treediff__simple(void)
|
||||
GIT_MERGE_DIFF_NONE
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
test_find_differences(TREE_OID_ANCESTOR, TREE_OID_MASTER, TREE_OID_BRANCH, treediff_conflict_data, 7);
|
||||
}
|
||||
|
||||
void test_merge_trees_treediff__df_conflicts(void)
|
||||
{
|
||||
struct merge_index_conflict_data treediff_conflict_data[] = {
|
||||
struct merge_index_conflict_data treediff_conflict_data[] = {
|
||||
{
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "49130a28ef567af9a6a6104c38773fedfa5f9742", 0, "dir-10" }, GIT_DELTA_ADDED },
|
||||
@ -158,7 +158,7 @@ void test_merge_trees_treediff__df_conflicts(void)
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_DELETED },
|
||||
GIT_MERGE_DIFF_BOTH_DELETED,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
@ -172,7 +172,7 @@ void test_merge_trees_treediff__df_conflicts(void)
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_DELETED },
|
||||
GIT_MERGE_DIFF_NONE,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
@ -186,7 +186,7 @@ void test_merge_trees_treediff__df_conflicts(void)
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_DELETED },
|
||||
GIT_MERGE_DIFF_DF_CHILD,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "e9ad6ec3e38364a3d07feda7c4197d4d845c53b5", 0, "dir-8" }, GIT_DELTA_ADDED },
|
||||
@ -200,7 +200,7 @@ void test_merge_trees_treediff__df_conflicts(void)
|
||||
{ { 0100644, "f20c9063fa0bda9a397c96947a7b687305c49753", 0, "dir-8/file.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
GIT_MERGE_DIFF_NONE,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "3ef4d30382ca33fdeba9fda895a99e0891ba37aa", 0, "dir-9" }, GIT_DELTA_ADDED },
|
||||
@ -235,7 +235,7 @@ void test_merge_trees_treediff__df_conflicts(void)
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_DELETED },
|
||||
GIT_MERGE_DIFF_DIRECTORY_FILE,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
@ -277,7 +277,7 @@ void test_merge_trees_treediff__df_conflicts(void)
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_DELETED },
|
||||
GIT_MERGE_DIFF_BOTH_DELETED,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "cab2cf23998b40f1af2d9d9a756dc9e285a8df4b", 0, "file-5/new" }, GIT_DELTA_ADDED },
|
||||
@ -285,7 +285,7 @@ void test_merge_trees_treediff__df_conflicts(void)
|
||||
GIT_MERGE_DIFF_BOTH_ADDED,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
test_find_differences(TREE_OID_DF_ANCESTOR, TREE_OID_DF_SIDE1, TREE_OID_DF_SIDE2, treediff_conflict_data, 20);
|
||||
}
|
||||
|
||||
@ -298,7 +298,7 @@ void test_merge_trees_treediff__strict_renames(void)
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
GIT_MERGE_DIFF_NONE,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "6212c31dab5e482247d7977e4f0dd3601decf13b", 0, "automergeable.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "ee3fa1b8c00aff7fe02065fdb50864bb0d932ccf", 0, "automergeable.txt" }, GIT_DELTA_MODIFIED },
|
||||
@ -348,8 +348,8 @@ void test_merge_trees_treediff__strict_renames(void)
|
||||
GIT_MERGE_DIFF_NONE,
|
||||
},
|
||||
};
|
||||
|
||||
test_find_differences(TREE_OID_ANCESTOR, TREE_OID_MASTER, TREE_OID_RENAMES1, treediff_conflict_data, 8);
|
||||
|
||||
test_find_differences(TREE_OID_ANCESTOR, TREE_OID_MASTER, TREE_OID_RENAMES1, treediff_conflict_data, 8);
|
||||
}
|
||||
|
||||
void test_merge_trees_treediff__rename_conflicts(void)
|
||||
@ -375,7 +375,7 @@ void test_merge_trees_treediff__rename_conflicts(void)
|
||||
{ { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 0, "0c-duplicated-in-theirs.txt" }, GIT_DELTA_ADDED },
|
||||
GIT_MERGE_DIFF_NONE,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "2f56120107d680129a5d9791b521cb1e73a2ed31", 0, "0c-rewritten-in-theirs.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "efc9121fdedaf08ba180b53ebfbcf71bd488ed09", 0, "0c-rewritten-in-theirs.txt" }, GIT_DELTA_MODIFIED },
|
||||
@ -389,21 +389,21 @@ void test_merge_trees_treediff__rename_conflicts(void)
|
||||
{ { 0100644, "0d872f8e871a30208305978ecbf9e66d864f1638", 0, "1a-renamed-in-ours-edited-in-theirs.txt" }, GIT_DELTA_MODIFIED },
|
||||
GIT_MERGE_DIFF_RENAMED_MODIFIED,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", 0, "1a-renamed-in-ours.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", 0, "1a-newname-in-ours.txt" }, GIT_DELTA_RENAMED },
|
||||
{ { 0100644, "d0d4594e16f2e19107e3fa7ea63e7aaaff305ffb", 0, "1a-renamed-in-ours.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
GIT_MERGE_DIFF_NONE,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "241a1005cd9b980732741b74385b891142bcba28", 0, "1b-renamed-in-theirs-edited-in-ours.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "ed9523e62e453e50dd9be1606af19399b96e397a", 0, "1b-renamed-in-theirs-edited-in-ours.txt" }, GIT_DELTA_MODIFIED },
|
||||
{ { 0100644, "241a1005cd9b980732741b74385b891142bcba28", 0, "1b-newname-in-theirs-edited-in-ours.txt" }, GIT_DELTA_RENAMED },
|
||||
GIT_MERGE_DIFF_RENAMED_MODIFIED,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136", 0, "1b-renamed-in-theirs.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "2b5f1f181ee3b58ea751f5dd5d8f9b445520a136", 0, "1b-renamed-in-theirs.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
@ -417,28 +417,28 @@ void test_merge_trees_treediff__rename_conflicts(void)
|
||||
{ { 0100644, "178940b450f238a56c0d75b7955cb57b38191982", 0, "2-newname-in-both.txt" }, GIT_DELTA_RENAMED },
|
||||
GIT_MERGE_DIFF_BOTH_RENAMED,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9", 0, "3a-renamed-in-ours-deleted-in-theirs.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "18cb316b1cefa0f8a6946f0e201a8e1a6f845ab9", 0, "3a-newname-in-ours-deleted-in-theirs.txt" }, GIT_DELTA_RENAMED },
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_DELETED },
|
||||
GIT_MERGE_DIFF_RENAMED_DELETED,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495", 0, "3b-renamed-in-theirs-deleted-in-ours.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_DELETED },
|
||||
{ { 0100644, "36219b49367146cb2e6a1555b5a9ebd4d0328495", 0, "3b-newname-in-theirs-deleted-in-ours.txt" }, GIT_DELTA_RENAMED },
|
||||
GIT_MERGE_DIFF_RENAMED_DELETED,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "8b5b53cb2aa9ceb1139f5312fcfa3cc3c5a47c9a", 0, "4a-newname-in-ours-added-in-theirs.txt" }, GIT_DELTA_ADDED },
|
||||
GIT_MERGE_DIFF_RENAMED_ADDED,
|
||||
},
|
||||
|
||||
},
|
||||
|
||||
{
|
||||
{ { 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c", 0, "4a-renamed-in-ours-added-in-theirs.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "227792b52aaa0b238bea00ec7e509b02623f168c", 0, "4a-newname-in-ours-added-in-theirs.txt" }, GIT_DELTA_RENAMED },
|
||||
@ -459,21 +459,21 @@ void test_merge_trees_treediff__rename_conflicts(void)
|
||||
{ { 0100644, "98d52d07c0b0bbf2b46548f6aa521295c2cb55db", 0, "4b-newname-in-theirs-added-in-ours.txt" }, GIT_DELTA_RENAMED },
|
||||
GIT_MERGE_DIFF_RENAMED_ADDED,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 0, "5-both-renamed-1-to-2.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 0, "5-both-renamed-1-to-2-ours.txt" }, GIT_DELTA_RENAMED },
|
||||
{ { 0100644, "d8fa77b6833082c1ea36b7828a582d4c43882450", 0, "5-both-renamed-1-to-2-theirs.txt" }, GIT_DELTA_RENAMED },
|
||||
GIT_MERGE_DIFF_BOTH_RENAMED_1_TO_2,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 0, "6-both-renamed-side-1.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 0, "6-both-renamed.txt" }, GIT_DELTA_RENAMED },
|
||||
{ { 0100644, "b42712cfe99a1a500b2a51fe984e0b8a7702ba11", 0, "6-both-renamed-side-1.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
GIT_MERGE_DIFF_BOTH_RENAMED_2_TO_1,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 0, "6-both-renamed-side-2.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "b69fe837e4cecfd4c9a40cdca7c138468687df07", 0, "6-both-renamed-side-2.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
@ -481,8 +481,7 @@ void test_merge_trees_treediff__rename_conflicts(void)
|
||||
GIT_MERGE_DIFF_BOTH_RENAMED_2_TO_1,
|
||||
},
|
||||
};
|
||||
|
||||
test_find_differences(TREE_OID_RENAME_CONFLICT_ANCESTOR,
|
||||
test_find_differences(TREE_OID_RENAME_CONFLICT_ANCESTOR,
|
||||
TREE_OID_RENAME_CONFLICT_OURS, TREE_OID_RENAME_CONFLICT_THEIRS, treediff_conflict_data, 18);
|
||||
}
|
||||
|
||||
@ -494,7 +493,7 @@ void test_merge_trees_treediff__best_renames(void)
|
||||
{ { 0100644, "233c0919c998ed110a4b6ff36f353aec8b713487", 0, "added-in-master.txt" }, GIT_DELTA_ADDED },
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
GIT_MERGE_DIFF_NONE,
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
{ { 0100644, "6212c31dab5e482247d7977e4f0dd3601decf13b", 0, "automergeable.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
@ -502,7 +501,7 @@ void test_merge_trees_treediff__best_renames(void)
|
||||
{ { 0100644, "45299c1ca5e07bba1fd90843056fb559f96b1f5a", 0, "renamed-90.txt" }, GIT_DELTA_RENAMED },
|
||||
GIT_MERGE_DIFF_RENAMED_MODIFIED,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0100644, "ab6c44a2e84492ad4b41bb6bac87353e9d02ac8b", 0, "changed-in-master.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0100644, "11deab00b2d3a6f5a3073988ac050c2d7b6655e2", 0, "changed-in-master.txt" }, GIT_DELTA_MODIFIED },
|
||||
@ -523,7 +522,7 @@ void test_merge_trees_treediff__best_renames(void)
|
||||
{ { 0100644, "5c3b68a71fc4fa5d362fd3875e53137c6a5ab7a5", 0, "removed-in-master.txt" }, GIT_DELTA_UNMODIFIED },
|
||||
GIT_MERGE_DIFF_MODIFIED_DELETED,
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
{ { 0, "", 0, "" }, GIT_DELTA_UNMODIFIED },
|
||||
@ -538,6 +537,6 @@ void test_merge_trees_treediff__best_renames(void)
|
||||
GIT_MERGE_DIFF_NONE,
|
||||
},
|
||||
};
|
||||
|
||||
test_find_differences(TREE_OID_ANCESTOR, TREE_OID_MASTER, TREE_OID_RENAMES2, treediff_conflict_data, 7);
|
||||
|
||||
test_find_differences(TREE_OID_ANCESTOR, TREE_OID_MASTER, TREE_OID_RENAMES2, treediff_conflict_data, 7);
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ static int merge_trivial(git_index **index, const char *ours, const char *theirs
|
||||
git_merge_tree_opts opts = GIT_MERGE_TREE_OPTS_INIT;
|
||||
|
||||
opts.automerge_flags |= automerge ? 0 : GIT_MERGE_AUTOMERGE_NONE;
|
||||
|
||||
|
||||
git_buf_printf(&branch_buf, "%s%s", GIT_REFS_HEADS_DIR, ours);
|
||||
cl_git_pass(git_reference_name_to_id(&our_oid, repo, branch_buf.ptr));
|
||||
cl_git_pass(git_commit_lookup(&our_commit, repo, &our_oid));
|
||||
@ -46,7 +46,7 @@ static int merge_trivial(git_index **index, const char *ours, const char *theirs
|
||||
|
||||
cl_git_pass(git_merge_base(&ancestor_oid, repo, git_commit_id(our_commit), git_commit_id(their_commit)));
|
||||
cl_git_pass(git_commit_lookup(&ancestor_commit, repo, &ancestor_oid));
|
||||
|
||||
|
||||
cl_git_pass(git_commit_tree(&ancestor_tree, ancestor_commit));
|
||||
cl_git_pass(git_commit_tree(&our_tree, our_commit));
|
||||
cl_git_pass(git_commit_tree(&their_tree, their_commit));
|
||||
@ -106,7 +106,7 @@ void test_merge_trees_trivial__3alt(void)
|
||||
cl_assert(entry = git_index_get_bypath(result, "new-in-3alt.txt", 0));
|
||||
cl_assert(git_index_reuc_entrycount(result) == 0);
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 0);
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -124,7 +124,7 @@ void test_merge_trees_trivial__4(void)
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 2);
|
||||
cl_assert(entry = git_index_get_bypath(result, "new-and-different.txt", 2));
|
||||
cl_assert(entry = git_index_get_bypath(result, "new-and-different.txt", 3));
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -139,7 +139,7 @@ void test_merge_trees_trivial__5alt_1(void)
|
||||
cl_assert(entry = git_index_get_bypath(result, "new-and-same.txt", 0));
|
||||
cl_assert(git_index_reuc_entrycount(result) == 0);
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 0);
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -154,7 +154,7 @@ void test_merge_trees_trivial__5alt_2(void)
|
||||
cl_assert(entry = git_index_get_bypath(result, "modified-to-same.txt", 0));
|
||||
cl_assert(git_index_reuc_entrycount(result) == 0);
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 0);
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -171,7 +171,7 @@ void test_merge_trees_trivial__6(void)
|
||||
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 1);
|
||||
cl_assert(entry = git_index_get_bypath(result, "removed-in-both.txt", 1));
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -189,7 +189,7 @@ void test_merge_trees_trivial__6_automerge(void)
|
||||
cl_assert(reuc = git_index_reuc_get_bypath(result, "removed-in-both.txt"));
|
||||
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 0);
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -207,7 +207,7 @@ void test_merge_trees_trivial__8(void)
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 2);
|
||||
cl_assert(entry = git_index_get_bypath(result, "removed-in-8.txt", 1));
|
||||
cl_assert(entry = git_index_get_bypath(result, "removed-in-8.txt", 3));
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -226,7 +226,7 @@ void test_merge_trees_trivial__8_automerge(void)
|
||||
cl_assert(reuc = git_index_reuc_get_bypath(result, "removed-in-8.txt"));
|
||||
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 0);
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -244,7 +244,7 @@ void test_merge_trees_trivial__7(void)
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 2);
|
||||
cl_assert(entry = git_index_get_bypath(result, "removed-in-7.txt", 1));
|
||||
cl_assert(entry = git_index_get_bypath(result, "removed-in-7.txt", 3));
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -262,7 +262,7 @@ void test_merge_trees_trivial__7_automerge(void)
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 2);
|
||||
cl_assert(entry = git_index_get_bypath(result, "removed-in-7.txt", 1));
|
||||
cl_assert(entry = git_index_get_bypath(result, "removed-in-7.txt", 3));
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -280,7 +280,7 @@ void test_merge_trees_trivial__10(void)
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 2);
|
||||
cl_assert(entry = git_index_get_bypath(result, "removed-in-10-branch.txt", 1));
|
||||
cl_assert(entry = git_index_get_bypath(result, "removed-in-10-branch.txt", 2));
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -299,7 +299,7 @@ void test_merge_trees_trivial__10_automerge(void)
|
||||
cl_assert(reuc = git_index_reuc_get_bypath(result, "removed-in-10-branch.txt"));
|
||||
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 0);
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -317,7 +317,7 @@ void test_merge_trees_trivial__9(void)
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 2);
|
||||
cl_assert(entry = git_index_get_bypath(result, "removed-in-9-branch.txt", 1));
|
||||
cl_assert(entry = git_index_get_bypath(result, "removed-in-9-branch.txt", 2));
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -335,7 +335,7 @@ void test_merge_trees_trivial__9_automerge(void)
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 2);
|
||||
cl_assert(entry = git_index_get_bypath(result, "removed-in-9-branch.txt", 1));
|
||||
cl_assert(entry = git_index_get_bypath(result, "removed-in-9-branch.txt", 2));
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -354,7 +354,7 @@ void test_merge_trees_trivial__13(void)
|
||||
|
||||
cl_assert(git_index_reuc_entrycount(result) == 0);
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 0);
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -373,7 +373,7 @@ void test_merge_trees_trivial__14(void)
|
||||
|
||||
cl_assert(git_index_reuc_entrycount(result) == 0);
|
||||
cl_assert(merge_trivial_conflict_entrycount(result) == 0);
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
||||
@ -392,6 +392,6 @@ void test_merge_trees_trivial__11(void)
|
||||
cl_assert(entry = git_index_get_bypath(result, "modified-in-both.txt", 1));
|
||||
cl_assert(entry = git_index_get_bypath(result, "modified-in-both.txt", 2));
|
||||
cl_assert(entry = git_index_get_bypath(result, "modified-in-both.txt", 3));
|
||||
|
||||
|
||||
git_index_free(result);
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ void test_refs_branches_move__can_move_a_local_branch(void)
|
||||
|
||||
cl_git_pass(git_branch_move(&new_ref, original_ref, NEW_BRANCH_NAME, 0));
|
||||
cl_assert_equal_s(GIT_REFS_HEADS_DIR NEW_BRANCH_NAME, git_reference_name(new_ref));
|
||||
|
||||
|
||||
git_reference_free(original_ref);
|
||||
git_reference_free(new_ref);
|
||||
}
|
||||
@ -32,7 +32,7 @@ void test_refs_branches_move__can_move_a_local_branch(void)
|
||||
void test_refs_branches_move__can_move_a_local_branch_to_a_different_namespace(void)
|
||||
{
|
||||
git_reference *original_ref, *new_ref, *newer_ref;
|
||||
|
||||
|
||||
cl_git_pass(git_reference_lookup(&original_ref, repo, "refs/heads/br2"));
|
||||
|
||||
/* Downward */
|
||||
@ -42,14 +42,14 @@ void test_refs_branches_move__can_move_a_local_branch_to_a_different_namespace(v
|
||||
/* Upward */
|
||||
cl_git_pass(git_branch_move(&newer_ref, new_ref, "br2", 0));
|
||||
git_reference_free(new_ref);
|
||||
|
||||
|
||||
git_reference_free(newer_ref);
|
||||
}
|
||||
|
||||
void test_refs_branches_move__can_move_a_local_branch_to_a_partially_colliding_namespace(void)
|
||||
{
|
||||
git_reference *original_ref, *new_ref, *newer_ref;
|
||||
|
||||
|
||||
cl_git_pass(git_reference_lookup(&original_ref, repo, "refs/heads/br2"));
|
||||
|
||||
/* Downward */
|
||||
@ -59,29 +59,29 @@ void test_refs_branches_move__can_move_a_local_branch_to_a_partially_colliding_n
|
||||
/* Upward */
|
||||
cl_git_pass(git_branch_move(&newer_ref, new_ref, "br2", 0));
|
||||
git_reference_free(new_ref);
|
||||
|
||||
|
||||
git_reference_free(newer_ref);
|
||||
}
|
||||
|
||||
void test_refs_branches_move__can_not_move_a_branch_if_its_destination_name_collide_with_an_existing_one(void)
|
||||
{
|
||||
git_reference *original_ref, *new_ref;
|
||||
|
||||
|
||||
cl_git_pass(git_reference_lookup(&original_ref, repo, "refs/heads/br2"));
|
||||
|
||||
cl_assert_equal_i(GIT_EEXISTS, git_branch_move(&new_ref, original_ref, "master", 0));
|
||||
|
||||
|
||||
git_reference_free(original_ref);
|
||||
}
|
||||
|
||||
void test_refs_branches_move__moving_a_branch_with_an_invalid_name_returns_EINVALIDSPEC(void)
|
||||
{
|
||||
git_reference *original_ref, *new_ref;
|
||||
|
||||
|
||||
cl_git_pass(git_reference_lookup(&original_ref, repo, "refs/heads/br2"));
|
||||
|
||||
cl_assert_equal_i(GIT_EINVALIDSPEC, git_branch_move(&new_ref, original_ref, "Inv@{id", 0));
|
||||
|
||||
|
||||
git_reference_free(original_ref);
|
||||
}
|
||||
|
||||
@ -98,11 +98,11 @@ void test_refs_branches_move__can_not_move_a_non_branch(void)
|
||||
void test_refs_branches_move__can_force_move_over_an_existing_branch(void)
|
||||
{
|
||||
git_reference *original_ref, *new_ref;
|
||||
|
||||
|
||||
cl_git_pass(git_reference_lookup(&original_ref, repo, "refs/heads/br2"));
|
||||
|
||||
cl_git_pass(git_branch_move(&new_ref, original_ref, "master", 1));
|
||||
|
||||
|
||||
git_reference_free(original_ref);
|
||||
git_reference_free(new_ref);
|
||||
}
|
||||
|
@ -11,15 +11,15 @@ int reference_is_packed(git_reference *ref)
|
||||
int packed;
|
||||
|
||||
assert(ref);
|
||||
|
||||
|
||||
if (git_buf_joinpath(&ref_path,
|
||||
git_repository_path(git_reference_owner(ref)),
|
||||
git_reference_name(ref)) < 0)
|
||||
return -1;
|
||||
|
||||
packed = !git_path_isfile(ref_path.ptr);
|
||||
|
||||
|
||||
git_buf_free(&ref_path);
|
||||
|
||||
|
||||
return packed;
|
||||
}
|
||||
|
@ -557,12 +557,12 @@ void test_refs_revparse__issue_994(void)
|
||||
/**
|
||||
* $ git rev-parse blah-7-gc47800c
|
||||
* c47800c7266a2be04c571c04d5a6614691ea99bd
|
||||
*
|
||||
*
|
||||
* $ git rev-parse HEAD~3
|
||||
* 4a202b346bb0fb0db7eff3cffeb3c70babbd2045
|
||||
*
|
||||
*
|
||||
* $ git branch blah-7-gc47800c HEAD~3
|
||||
*
|
||||
*
|
||||
* $ git rev-parse blah-7-gc47800c
|
||||
* 4a202b346bb0fb0db7eff3cffeb3c70babbd2045
|
||||
*/
|
||||
@ -592,15 +592,15 @@ void test_refs_revparse__try_to_retrieve_branch_before_described_tag(void)
|
||||
/**
|
||||
* $ git rev-parse a65fedf39aefe402d3bb6e24df4d4f5fe4547750
|
||||
* a65fedf39aefe402d3bb6e24df4d4f5fe4547750
|
||||
*
|
||||
*
|
||||
* $ git rev-parse HEAD~3
|
||||
* 4a202b346bb0fb0db7eff3cffeb3c70babbd2045
|
||||
*
|
||||
*
|
||||
* $ git branch a65fedf39aefe402d3bb6e24df4d4f5fe4547750 HEAD~3
|
||||
*
|
||||
*
|
||||
* $ git rev-parse a65fedf39aefe402d3bb6e24df4d4f5fe4547750
|
||||
* a65fedf39aefe402d3bb6e24df4d4f5fe4547750
|
||||
*
|
||||
*
|
||||
* $ git rev-parse heads/a65fedf39aefe402d3bb6e24df4d4f5fe4547750
|
||||
* 4a202b346bb0fb0db7eff3cffeb3c70babbd2045
|
||||
*/
|
||||
@ -631,12 +631,12 @@ void test_refs_revparse__try_to_retrieve_sha_before_branch(void)
|
||||
/**
|
||||
* $ git rev-parse c47800
|
||||
* c47800c7266a2be04c571c04d5a6614691ea99bd
|
||||
*
|
||||
*
|
||||
* $ git rev-parse HEAD~3
|
||||
* 4a202b346bb0fb0db7eff3cffeb3c70babbd2045
|
||||
*
|
||||
*
|
||||
* $ git branch c47800 HEAD~3
|
||||
*
|
||||
*
|
||||
* $ git rev-parse c47800
|
||||
* 4a202b346bb0fb0db7eff3cffeb3c70babbd2045
|
||||
*/
|
||||
@ -694,4 +694,3 @@ void test_refs_revparse__parses_range_operator(void)
|
||||
"a65fedf39aefe402d3bb6e24df4d4f5fe4547750",
|
||||
GIT_REVPARSE_RANGE | GIT_REVPARSE_MERGE_BASE);
|
||||
}
|
||||
|
||||
|
@ -25,7 +25,7 @@ void test_refs_setter__update_direct(void)
|
||||
{
|
||||
git_reference *ref, *test_ref, *new_ref;
|
||||
git_oid id;
|
||||
|
||||
|
||||
cl_git_pass(git_reference_lookup(&ref, g_repo, ref_master_name));
|
||||
cl_assert(git_reference_type(ref) == GIT_REF_OID);
|
||||
git_oid_cpy(&id, git_reference_target(ref));
|
||||
@ -48,7 +48,7 @@ void test_refs_setter__update_direct(void)
|
||||
void test_refs_setter__update_symbolic(void)
|
||||
{
|
||||
git_reference *head, *new_head;
|
||||
|
||||
|
||||
cl_git_pass(git_reference_lookup(&head, g_repo, "HEAD"));
|
||||
cl_assert(git_reference_type(head) == GIT_REF_SYMBOLIC);
|
||||
cl_assert(strcmp(git_reference_symbolic_target(head), ref_master_name) == 0);
|
||||
@ -56,7 +56,7 @@ void test_refs_setter__update_symbolic(void)
|
||||
cl_git_pass(git_reference_symbolic_set_target(&new_head, head, ref_test_name));
|
||||
git_reference_free(new_head);
|
||||
git_reference_free(head);
|
||||
|
||||
|
||||
cl_git_pass(git_reference_lookup(&head, g_repo, "HEAD"));
|
||||
cl_assert(git_reference_type(head) == GIT_REF_SYMBOLIC);
|
||||
cl_assert(strcmp(git_reference_symbolic_target(head), ref_test_name) == 0);
|
||||
@ -68,13 +68,13 @@ void test_refs_setter__cant_update_direct_with_symbolic(void)
|
||||
// Overwrite an existing object id reference with a symbolic one
|
||||
git_reference *ref, *new;
|
||||
git_oid id;
|
||||
|
||||
|
||||
cl_git_pass(git_reference_lookup(&ref, g_repo, ref_master_name));
|
||||
cl_assert(git_reference_type(ref) == GIT_REF_OID);
|
||||
git_oid_cpy(&id, git_reference_target(ref));
|
||||
|
||||
|
||||
cl_git_fail(git_reference_symbolic_set_target(&new, ref, ref_name));
|
||||
|
||||
|
||||
git_reference_free(ref);
|
||||
}
|
||||
|
||||
@ -83,7 +83,7 @@ void test_refs_setter__cant_update_symbolic_with_direct(void)
|
||||
// Overwrite an existing symbolic reference with an object id one
|
||||
git_reference *ref, *new;
|
||||
git_oid id;
|
||||
|
||||
|
||||
cl_git_pass(git_reference_lookup(&ref, g_repo, ref_master_name));
|
||||
cl_assert(git_reference_type(ref) == GIT_REF_OID);
|
||||
git_oid_cpy(&id, git_reference_target(ref));
|
||||
@ -94,6 +94,6 @@ void test_refs_setter__cant_update_symbolic_with_direct(void)
|
||||
|
||||
/* Can't set an OID on a direct ref */
|
||||
cl_git_fail(git_reference_set_target(&new, ref, &id));
|
||||
|
||||
|
||||
git_reference_free(ref);
|
||||
}
|
||||
|
@ -105,14 +105,14 @@ void test_reset_hard__cannot_reset_in_a_bare_repository(void)
|
||||
static void index_entry_init(git_index *index, int side, git_oid *oid)
|
||||
{
|
||||
git_index_entry entry;
|
||||
|
||||
|
||||
memset(&entry, 0x0, sizeof(git_index_entry));
|
||||
|
||||
|
||||
entry.path = "conflicting_file";
|
||||
entry.flags = (side << GIT_IDXENTRY_STAGESHIFT);
|
||||
entry.mode = 0100644;
|
||||
git_oid_cpy(&entry.oid, oid);
|
||||
|
||||
|
||||
cl_git_pass(git_index_add(index, &entry));
|
||||
}
|
||||
|
||||
@ -122,19 +122,19 @@ static void unmerged_index_init(git_index *index, int entries)
|
||||
int write_ours = 2;
|
||||
int write_theirs = 4;
|
||||
git_oid ancestor, ours, theirs;
|
||||
|
||||
|
||||
git_oid_fromstr(&ancestor, "6bb0d9f700543ba3d318ba7075fc3bd696b4287b");
|
||||
git_oid_fromstr(&ours, "b19a1e93bec1317dc6097229e12afaffbfa74dc2");
|
||||
git_oid_fromstr(&theirs, "950b81b7eee953d050aa05a641f8e056c85dd1bd");
|
||||
|
||||
|
||||
cl_git_rewritefile("status/conflicting_file", "conflicting file\n");
|
||||
|
||||
|
||||
if (entries & write_ancestor)
|
||||
index_entry_init(index, 1, &ancestor);
|
||||
|
||||
|
||||
if (entries & write_ours)
|
||||
index_entry_init(index, 2, &ours);
|
||||
|
||||
|
||||
if (entries & write_theirs)
|
||||
index_entry_init(index, 3, &theirs);
|
||||
}
|
||||
@ -143,24 +143,24 @@ void test_reset_hard__resetting_reverts_unmerged(void)
|
||||
{
|
||||
git_index *index;
|
||||
int entries;
|
||||
|
||||
|
||||
/* Ensure every permutation of non-zero stage entries results in the
|
||||
* path being cleaned up. */
|
||||
for (entries = 1; entries < 8; entries++) {
|
||||
cl_git_pass(git_repository_index(&index, repo));
|
||||
|
||||
|
||||
unmerged_index_init(index, entries);
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
|
||||
retrieve_target_from_oid(&target, repo, "26a125ee1bfc5df1e1b2e9441bbe63c8a7ae989f");
|
||||
cl_git_pass(git_reset(repo, target, GIT_RESET_HARD));
|
||||
|
||||
|
||||
cl_assert(git_path_exists("status/conflicting_file") == 0);
|
||||
|
||||
|
||||
git_object_free(target);
|
||||
target = NULL;
|
||||
|
||||
git_index_free(index);
|
||||
|
||||
git_index_free(index);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -219,4 +219,3 @@ void test_status_submodules__dirty_workdir_only(void)
|
||||
git_status_foreach_ext(g_repo, &opts, cb_status__match, &counts));
|
||||
cl_assert_equal_i(6, counts.entry_count);
|
||||
}
|
||||
|
||||
|
@ -85,4 +85,3 @@ void test_trace_trace__writes_lower_level(void)
|
||||
cl_assert(written == 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user