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.cou...@gmail.com>
Mentored-by: Matthieu Moy <matthieu....@grenoble-inp.fr>
Signed-off-by: Karthik Nayak <karthik....@gmail.com>
---
 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to