ref-filter: Do not abruptly die when using the 'lstrip=<N>' option

Currently when we use the 'lstrip=<N>' option, if 'N' is greater than
the number of components available in the refname, we abruptly end
program execution by calling die().

This behavior is undesired since a single refname with few components
could end program execution. To avoid this, return an empty string
whenever the value 'N' is greater than the number of components
available, instead of calling die().

Signed-off-by: Karthik Nayak <Karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Karthik Nayak 2017-01-10 14:19:47 +05:30 committed by Junio C Hamano
parent 17938f171f
commit 3a42980f9e
3 changed files with 2 additions and 8 deletions

View File

@ -98,8 +98,7 @@ refname::
abbreviation mode. If `lstrip=<N>` is appended, strips `<N>` abbreviation mode. If `lstrip=<N>` is appended, strips `<N>`
slash-separated path components from the front of the refname slash-separated path components from the front of the refname
(e.g., `%(refname:lstrip=2)` turns `refs/tags/foo` into `foo`. (e.g., `%(refname:lstrip=2)` turns `refs/tags/foo` into `foo`.
`<N>` must be a positive integer. If a displayed ref has fewer `<N>` must be a positive integer.
components than `<N>`, the command aborts with an error.
objecttype:: objecttype::
The type of the object (`blob`, `tree`, `commit`, `tag`). The type of the object (`blob`, `tree`, `commit`, `tag`).

View File

@ -1099,8 +1099,7 @@ static const char *lstrip_ref_components(const char *refname, unsigned int len)
while (remaining) { while (remaining) {
switch (*start++) { switch (*start++) {
case '\0': case '\0':
die(_("ref '%s' does not have %ud components to :lstrip"), return "";
refname, len);
case '/': case '/':
remaining--; remaining--;
break; break;

View File

@ -147,10 +147,6 @@ test_expect_success 'arguments to :lstrip must be positive integers' '
test_must_fail git for-each-ref --format="%(refname:lstrip=foo)" test_must_fail git for-each-ref --format="%(refname:lstrip=foo)"
' '
test_expect_success 'stripping refnames too far gives an error' '
test_must_fail git for-each-ref --format="%(refname:lstrip=3)"
'
test_expect_success 'Check format specifiers are ignored in naming date atoms' ' test_expect_success 'Check format specifiers are ignored in naming date atoms' '
git for-each-ref --format="%(authordate)" refs/heads && git for-each-ref --format="%(authordate)" refs/heads &&
git for-each-ref --format="%(authordate:default) %(authordate)" refs/heads && git for-each-ref --format="%(authordate:default) %(authordate)" refs/heads &&