Skip to content

Commit

Permalink
Add flag to make unpack_trees() not print errors.
Browse files Browse the repository at this point in the history
(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>
  • Loading branch information
Daniel Barkalow authored and Junio C Hamano committed Feb 10, 2008
1 parent 203a2fe commit 17e4642
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 14 deletions.
43 changes: 29 additions & 14 deletions unpack-trees.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -707,15 +721,15 @@ 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);
}
/*
* If we have an entry in the index cache, then we want to
* make sure that it matches head.
*/
if (index && !same(index, head)) {
return reject_merge(index);
return o->gently ? -1 : reject_merge(index);
}

if (head) {
Expand Down Expand Up @@ -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;
}
}
Expand All @@ -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
Expand Down
1 change: 1 addition & 0 deletions unpack-trees.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ struct unpack_trees_options {
int trivial_merges_only;
int verbose_update;
int aggressive;
int gently;
const char *prefix;
int pos;
struct dir_struct *dir;
Expand Down

0 comments on commit 17e4642

Please sign in to comment.