diff options
author | Junio C Hamano <gitster@pobox.com> | 2012-07-03 11:01:03 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-07-03 11:17:17 -0700 |
commit | c005e98612c3ba896415cfa56df67ae8b240cc85 (patch) | |
tree | 5acb7f6f23a9dc8a6072265c42662c415a9bdfe2 /sha1_name.c | |
parent | a78fafe74a4f8c416c35ca07b3ba28375475ae96 (diff) | |
download | git-c005e98612c3ba896415cfa56df67ae8b240cc85.tar.gz |
get_sha1(): fix error status regression
In finish_object_disambiguation(), if the candidate hasn't been
checked, there are two cases:
- It is the first and only object that match the prefix; or
- It replaced another object that matched the prefix but that
object did not satisfy ds->fn() callback.
And the former case we set ds->candidate_ok to true without doing
anything else, while for the latter we check the candidate, which
may set ds->candidate_ok to false.
At this point in the code, ds->candidate_ok can be false only if
this last-round check found that the candidate does not pass the
check, because the state after update_candidates() returns cannot
satisfy
!ds->ambiguous && ds->candidate_exists && ds->candidate_checked
and !ds->canidate_ok at the same time.
Hence, when we execute this "return", we know we have seen more than
one object that match the prefix (and none of them satisfied ds->fn),
meaning that we should say "the short name is ambiguous", not "there
is no object that matches the prefix".
Noticed by Jeff King.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'sha1_name.c')
-rw-r--r-- | sha1_name.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/sha1_name.c b/sha1_name.c index 2e2dbb8664..c824bdd3eb 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -212,7 +212,7 @@ static int finish_object_disambiguation(struct disambiguate_state *ds, ds->fn(ds->candidate, ds->cb_data)); if (!ds->candidate_ok) - return SHORT_NAME_NOT_FOUND; + return SHORT_NAME_AMBIGUOUS; hashcpy(sha1, ds->candidate); return 0; |