summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2011-05-31 17:06:44 (GMT)
committerJunio C Hamano <gitster@pobox.com>2011-05-31 18:24:12 (GMT)
commitb4194828dc00e97dcd07ecb4bb4f87650a6fca1d (patch)
tree9baeefb8b2ce7e5815a2d812dc109fd4dc55f64e
parent2d11f21c365821ccba1e093f22b99ad71b955f21 (diff)
downloadgit-b4194828dc00e97dcd07ecb4bb4f87650a6fca1d.zip
git-b4194828dc00e97dcd07ecb4bb4f87650a6fca1d.tar.gz
git-b4194828dc00e97dcd07ecb4bb4f87650a6fca1d.tar.bz2
diff-index --quiet: learn the "stop feeding the backend early" logic
A negative return from the unpack callback function usually means unpack failed for the entry and signals the unpack_trees() machinery to fail the entire merge operation, immediately and there is no other way for the callback to tell the machinery to exit early without reporting an error. This is what we usually want to make a merge all-or-nothing operation, but the machinery is also used for diff-index codepath by using a custom unpack callback function. And we do sometimes want to exit early without failing, namely when we are under --quiet and can short-cut the diff upon finding the first difference. Add "exiting_early" field to unpack_trees_options structure, to signal the unpack_trees() machinery that the negative return value is not signaling an error but an early return from the unpack_trees() machinery. As this by definition hasn't unpacked everything, discard the resulting index just like the failure codepath. Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--diff-lib.c7
-rw-r--r--unpack-trees.c4
-rw-r--r--unpack-trees.h1
3 files changed, 10 insertions, 2 deletions
diff --git a/diff-lib.c b/diff-lib.c
index 9c29293..2e09500 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -433,8 +433,13 @@ static int oneway_diff(struct cache_entry **src, struct unpack_trees_options *o)
if (tree == o->df_conflict_entry)
tree = NULL;
- if (ce_path_match(idx ? idx : tree, &revs->prune_data))
+ if (ce_path_match(idx ? idx : tree, &revs->prune_data)) {
do_oneway_diff(o, idx, tree);
+ if (diff_can_quit_early(&revs->diffopt)) {
+ o->exiting_early = 1;
+ return -1;
+ }
+ }
return 0;
}
diff --git a/unpack-trees.c b/unpack-trees.c
index 500ebcf..b2b6a90 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -593,7 +593,7 @@ static int unpack_nondirectories(int n, unsigned long mask,
static int unpack_failed(struct unpack_trees_options *o, const char *message)
{
discard_index(&o->result);
- if (!o->gently) {
+ if (!o->gently && !o->exiting_early) {
if (message)
return error("%s", message);
return -1;
@@ -1128,6 +1128,8 @@ return_failed:
display_error_msgs(o);
mark_all_ce_unused(o->src_index);
ret = unpack_failed(o, NULL);
+ if (o->exiting_early)
+ ret = 0;
goto done;
}
diff --git a/unpack-trees.h b/unpack-trees.h
index cd11a08..4c6c540 100644
--- a/unpack-trees.h
+++ b/unpack-trees.h
@@ -46,6 +46,7 @@ struct unpack_trees_options {
debug_unpack,
skip_sparse_checkout,
gently,
+ exiting_early,
show_all_errors;
const char *prefix;
int cache_bottom;