Add support for %(objectname:short=<length>) which would print the abbreviated unique objectname of given length. When no length is specified 7 is used. The minimum length is 4. Add tests and documentation for the same. Mentored-by: Christian Couder <christian.couder@xxxxxxxxx> Mentored-by: Matthieu Moy <matthieu.moy@xxxxxxxxxxxxxxx> Signed-off-by: Karthik Nayak <karthik.188@xxxxxxxxx> --- Documentation/git-for-each-ref.txt | 4 +++- ref-filter.c | 30 ++++++++++++++++++++++-------- t/t6300-for-each-ref.sh | 22 ++++++++++++++++++++++ 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt index b8d33a1..c713ec0 100644 --- a/Documentation/git-for-each-ref.txt +++ b/Documentation/git-for-each-ref.txt @@ -104,7 +104,9 @@ objectsize:: objectname:: The object name (aka SHA-1). - For a non-ambiguous abbreviation of the object name append `:short`. + For a non-ambiguous abbreviation of the object name append + `:short`. The length can be explicitly specified by appending + `:short=<length>`. Minimum length being 4. upstream:: The name of a local ref which can be considered ``upstream'' diff --git a/ref-filter.c b/ref-filter.c index 94d8754..de4d451 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -464,14 +464,28 @@ static void *get_obj(const unsigned char *sha1, struct object **obj, unsigned lo static int grab_objectname(const char *name, const unsigned char *sha1, struct atom_value *v) { - if (!strcmp(name, "objectname")) { - char *s = xmalloc(41); - strcpy(s, sha1_to_hex(sha1)); - v->s = s; - return 1; - } - if (!strcmp(name, "objectname:short")) { - v->s = xstrdup(find_unique_abbrev(sha1, DEFAULT_ABBREV)); + const char *p; + + if (match_atom_name(name, "objectname", &p)) { + /* No arguments given, copy the entire objectname */ + if (!p) { + char *s = xmalloc(41); + strcpy(s, sha1_to_hex(sha1)); + v->s = s; + } else { + unsigned int length = DEFAULT_ABBREV; + + if (skip_prefix(p, "short", &p)) { + if (p[0] == '=') + if (strtoul_ui(p + 1, 10, &length)) + die(_("positive length expected with objectname:%s"), p + 1); + } else + die(_("format: unknown option entered with objectname:%s"), p); + + if (length < MINIMUM_ABBREV) + length = MINIMUM_ABBREV; + v->s = xstrdup(find_unique_abbrev(sha1, length)); + } return 1; } return 0; diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh index 7c9bec7..6fc569e 100755 --- a/t/t6300-for-each-ref.sh +++ b/t/t6300-for-each-ref.sh @@ -385,6 +385,28 @@ test_expect_success 'Check short objectname format' ' test_cmp expected actual ' +cat >expected <<EOF +$(git rev-parse --short=1 HEAD) +EOF + +test_expect_success 'Check objectname:short format when size is less than MINIMUM_ABBREV' ' + git for-each-ref --format="%(objectname:short=1)" refs/heads >actual && + test_cmp expected actual +' + +cat >expected <<EOF +$(git rev-parse --short=10 HEAD) +EOF + +test_expect_success 'Check objectname:short format' ' + git for-each-ref --format="%(objectname:short=10)" refs/heads >actual && + test_cmp expected actual +' + +test_expect_success 'Check objectname:short format for invalid input' ' + test_must_fail git for-each-ref --format="%(objectname:short=-1)" refs/heads +' + test_expect_success 'Check for invalid refname format' ' test_must_fail git for-each-ref --format="%(refname:INVALID)" ' -- 2.6.0 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html