summaryrefslogtreecommitdiff
path: root/unpack-trees.c
diff options
context:
space:
mode:
authorLibravatar Daniel Barkalow <barkalow@iabervon.org>2008-02-07 11:39:52 -0500
committerLibravatar Junio C Hamano <gitster@pobox.com>2008-02-09 23:16:51 -0800
commit17e464266701bc1453f60a80cd71d8ba55b528e6 (patch)
tree999bbdc1cd580846811ca415968d57e811ed8e19 /unpack-trees.c
parentAllow callers of unpack_trees() to handle failure (diff)
downloadtgif-17e464266701bc1453f60a80cd71d8ba55b528e6.tar.xz
Add flag to make unpack_trees() not print errors.
(This applies only to errors where a plausible operation is impossible due to the particular data, not to errors resulting from misuse of the merge functions.) This will allow builtin-checkout to suppress merge errors if it's going to try more merging methods. Additionally, if unpack_trees() returns with an error, but without printing anything, it will roll back any changes to the index (by rereading the index, currently). This obviously could be done by the caller, but chances are that the caller would forget and debugging this is difficult. Also, future implementations may give unpack_trees() a more efficient way of undoing its changes than the caller could. Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Diffstat (limited to 'unpack-trees.c')
-rw-r--r--unpack-trees.c43
1 files changed, 29 insertions, 14 deletions
diff --git a/unpack-trees.c b/unpack-trees.c
index 9e6587f661..45f40c2775 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -356,12 +356,23 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options
posns[i] = create_tree_entry_list(t+i);
if (unpack_trees_rec(posns, len, o->prefix ? o->prefix : "",
- o, &df_conflict_list))
+ o, &df_conflict_list)) {
+ if (o->gently) {
+ discard_cache();
+ read_cache();
+ }
return -1;
+ }
}
- if (o->trivial_merges_only && o->nontrivial_merge)
- return error("Merge requires file-level merging");
+ if (o->trivial_merges_only && o->nontrivial_merge) {
+ if (o->gently) {
+ discard_cache();
+ read_cache();
+ }
+ return o->gently ? -1 :
+ error("Merge requires file-level merging");
+ }
check_updates(active_cache, active_nr, o);
return 0;
@@ -415,7 +426,8 @@ static int verify_uptodate(struct cache_entry *ce,
}
if (errno == ENOENT)
return 0;
- return error("Entry '%s' not uptodate. Cannot merge.", ce->name);
+ return o->gently ? -1 :
+ error("Entry '%s' not uptodate. Cannot merge.", ce->name);
}
static void invalidate_ce_path(struct cache_entry *ce)
@@ -501,8 +513,9 @@ static int verify_clean_subdirectory(struct cache_entry *ce, const char *action,
d.exclude_per_dir = o->dir->exclude_per_dir;
i = read_directory(&d, ce->name, pathbuf, namelen+1, NULL);
if (i)
- return error("Updating '%s' would lose untracked files in it",
- ce->name);
+ return o->gently ? -1 :
+ error("Updating '%s' would lose untracked files in it",
+ ce->name);
free(pathbuf);
return cnt;
}
@@ -574,8 +587,9 @@ static int verify_absent(struct cache_entry *ce, const char *action,
return 0;
}
- return error("Untracked working tree file '%s' "
- "would be %s by merge.", ce->name, action);
+ return o->gently ? -1 :
+ error("Untracked working tree file '%s' "
+ "would be %s by merge.", ce->name, action);
}
return 0;
}
@@ -707,7 +721,7 @@ int threeway_merge(struct cache_entry **stages,
/* #14, #14ALT, #2ALT */
if (remote && !df_conflict_head && head_match && !remote_match) {
if (index && !same(index, remote) && !same(index, head))
- return reject_merge(index);
+ return o->gently ? -1 : reject_merge(index);
return merged_entry(remote, index, o);
}
/*
@@ -715,7 +729,7 @@ int threeway_merge(struct cache_entry **stages,
* make sure that it matches head.
*/
if (index && !same(index, head)) {
- return reject_merge(index);
+ return o->gently ? -1 : reject_merge(index);
}
if (head) {
@@ -866,11 +880,11 @@ int twoway_merge(struct cache_entry **src,
/* all other failures */
remove_entry(remove);
if (oldtree)
- return reject_merge(oldtree);
+ return o->gently ? -1 : reject_merge(oldtree);
if (current)
- return reject_merge(current);
+ return o->gently ? -1 : reject_merge(current);
if (newtree)
- return reject_merge(newtree);
+ return o->gently ? -1 : reject_merge(newtree);
return -1;
}
}
@@ -897,7 +911,8 @@ int bind_merge(struct cache_entry **src,
return error("Cannot do a bind merge of %d trees\n",
o->merge_size);
if (a && old)
- return error("Entry '%s' overlaps. Cannot bind.", a->name);
+ return o->gently ? -1 :
+ error("Entry '%s' overlaps. Cannot bind.", a->name);
if (!a)
return keep_entry(old, o);
else