[PATCH v2 12/12] get_short_oid: document & warn if we ignore the type selector
- From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- Date
- May 1, 2018, 12:06 UTC
- Message-ID
- <20180501120651.15886-13-avarab@gmail.com>
- In-Reply-To
- <20180501120651.15886-1-avarab@gmail.com>
The SHA1 prefix 06fa currently matches no blobs in git.git. When disambiguating short SHA1s we've been quietly ignoring the user's type selector as a fallback mechanism, this was intentionally added in 1ffa26c461 ("get_short_sha1: list ambiguous objects on error", 2016-09-26).
I think that behavior makes sense, it's not very useful to just show nothing because a preference has been expressed via core.disambiguate, but it's bad that we're quietly doing this. The user might thing that we just didn't understand what e.g 06fa^{blob} meant.
Now we'll instead print a warning if no objects of the requested type were found:
$ git rev-parse 06fa^{blob}
error: short SHA1 06fa is ambiguous
hint: The candidates are:
[... no blobs listed ...]
warning: Your hint (via core.disambiguate or peel syntax) was ignored, we fell
back to showing all object types since no object of the requested type
matched the provide short SHA1 06faSigned-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> --- Documentation/config.txt | 4 ++++ sha1-name.c | 11 ++++++++++- t/t1512-rev-parse-disambiguation.sh | 5 ++++- 3 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt index 14a3d57e77..e14f2c0492 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -922,6 +922,10 @@ Is set to `none` by default to show all object types. Can also be tags), `tree` (peel: `$sha1^{tree}`), `treeish` (everything except blobs, peel syntax: `$sha1:`), `blob` (peel: `$sha1^{blob}`) or `tag` (peel: `$sha1^{tag}`). The peel syntax will override any config value. ++ +If no objects of the selected type exist the disambiguation will fall +back to `none` and print a warning indicating no objects of the +selected type could be found for that prefix. add.ignoreErrors:: add.ignore-errors (deprecated):: diff --git a/sha1-name.c b/sha1-name.c index 1d2a74a29c..9789764a38 100644 --- a/sha1-name.c +++ b/sha1-name.c @@ -447,6 +447,7 @@ static int get_short_oid(const char *name, int len, struct object_id *oid, if (!quietly && (status == SHORT_NAME_AMBIGUOUS)) { struct oid_array collect = OID_ARRAY_INIT; + int ignored_hint = 0; error(_("short SHA1 %s is ambiguous"), ds.hex_pfx); @@ -456,8 +457,10 @@ static int get_short_oid(const char *name, int len, struct object_id *oid, * that case, we still want to show them, so disable the hint * function entirely. */ - if (!ds.ambiguous) + if (!ds.ambiguous) { ds.fn = NULL; + ignored_hint = 1; + } advise(_("The candidates are:")); for_each_abbrev(ds.hex_pfx, collect_ambiguous, &collect); @@ -466,6 +469,12 @@ static int get_short_oid(const char *name, int len, struct object_id *oid, if (oid_array_for_each(&collect, show_ambiguous_object, &ds)) BUG("show_ambiguous_object shouldn't return non-zero"); oid_array_clear(&collect); + + if (ignored_hint) { + warning(_("Your hint (via core.disambiguate or peel syntax) was ignored, we fell\n" + "back to showing all object types since no object of the requested type\n" + "matched the provide short SHA1 %s"), ds.hex_pfx); + } } return status; diff --git a/t/t1512-rev-parse-disambiguation.sh b/t/t1512-rev-parse-disambiguation.sh index b17973a266..940f323ee9 100755 --- a/t/t1512-rev-parse-disambiguation.sh +++ b/t/t1512-rev-parse-disambiguation.sh @@ -359,7 +359,10 @@ test_expect_success C_LOCALE_OUTPUT 'failed type-selector still shows hint' ' echo 872 | git hash-object --stdin -w && test_must_fail git rev-parse ee3d^{commit} 2>stderr && grep ^hint: stderr >hints && - test_line_count = 3 hints + test_line_count = 3 hints && + grep ^warning stderr >warnings && + grep -q "Your hint.*was ignored" warnings && + grep -q "the provide short SHA1 ee3d" stderr ' test_expect_success 'core.disambiguate config can prefer types' '
-- 2.17.0.290.gded63e768a