Subject: [PATCH v2] t4205: correctly test %(describe:abbrev=...)

From: Kousik Sanagavarapu <[email-masked]>
Date: Thu, 29 Jun 2023 18:48:08 +0530

The pretty format %(describe:abbrev=<number>) tells describe to use
at least <number> digits of the oid to generate the human-readable
format of the commit-ish.

There are three things to test here:
  - Check that we can describe a commit that is not tagged (that is,
    for example our HEAD is at least one commit ahead of some reachable
    commit which is tagged) with at least <number> digits of the oid
    being used for describing it.

  - Check that when using such a commit-ish, we always use at least
    <number> digits of the oid to describe it.

  - Check that we can describe a tag. This just gives the name of the
    tag irrespective of abbrev (abbrev doesn't make sense here).

Do this, instead of the current test which only tests the last case.

Helped-by: Junio C Hamano <[email-masked]>
Mentored-by: Christian Couder <[email-masked]>
Mentored-by: Hariom Verma <[email-masked]>
Signed-off-by: Kousik Sanagavarapu <[email-masked]>
---

Changes since v1:
- Changed the log message
- Added things to be tested as commented by Junio

Range-diff vs v1:
1:  2c10de6c11 ! 1:  76c3e38033 t4205: correctly test
%(describe:abbrev=...)
    @@ Metadata
      ## Commit message ##
         t4205: correctly test %(describe:abbrev=...)
     
    -    The pretty format %(describe:abbrev=<number>) tells describe to
         use only
    -    <number> characters of the oid to generate the human-readable
         format of
    -    the commit-ish.
    +    The pretty format %(describe:abbrev=<number>) tells describe to
use
    +    at least <number> digits of the oid to generate the
human-readable
    +    format of the commit-ish.
     
    -    This is not apparent in the test for %(describe:abbrev=...)
         because we
    -    directly tag HEAD and use that, in which case the
         human-readable format
    -    is just the tag name. So, create a new commit and use that
         instead.
    +    There are three things to test here:
    +      - Check that we can describe a commit that is not tagged
(that is,
    +        for example our HEAD is at least one commit ahead of some
reachable
    +        commit which is tagged) with at least <number> digits of
the oid
    +        being used for describing it.
     
    +      - Check that when using such a commit-ish, we always use at
least
    +        <number> digits of the oid to describe it.
    +
    +      - Check that we can describe a tag. This just gives the name
of the
    +        tag irrespective of abbrev (abbrev doesn't make sense
here).
    +
    +    Do this, instead of the current test which only tests the last
case.
    +
    +    Helped-by: Junio C Hamano <[email-masked]>
         Mentored-by: Christian Couder <[email-masked]>
         Mentored-by: Hariom Verma <[email-masked]>
         Signed-off-by: Kousik Sanagavarapu <[email-masked]>
     
      ## t/t4205-log-pretty-formats.sh ##
     @@ t/t4205-log-pretty-formats.sh: test_expect_success
'%(describe:tags) vs git describe --tags' '
    - '
      
      test_expect_success '%(describe:abbrev=...) vs git describe
--abbrev=...' '
    --  test_when_finished "git tag -d tagname" &&
    --  git tag -a -m tagged tagname &&
    +   test_when_finished "git tag -d tagname" &&
    ++
    ++  # Case 1: We have commits between HEAD and the most recent tag
    ++  #         reachable from it
     +  test_commit --no-tag file &&
    ++  git describe --abbrev=15 >expect &&
    ++  git log -1 --format="%(describe:abbrev=15)" >actual &&
    ++  test_cmp expect actual &&
    ++
    ++  # Make sure the hash used is at least 15 digits long
    ++  sed -e "s/^.*-g\([0-9a-f]*\)$/\1/" <actual >hexpart &&
    ++  test 16 -le $(wc -c <hexpart) &&
    ++
    ++  # Case 2: We have a tag at HEAD, describe directly gives the
    ++  #         name of the tag
    +   git tag -a -m tagged tagname &&
        git describe --abbrev=15 >expect &&
        git log -1 --format="%(describe:abbrev=15)" >actual &&
    -   test_cmp expect actual
    +-  test_cmp expect actual
    ++  test_cmp expect actual &&
    ++  test tagname = $(cat actual)
    + '
    + 
    + test_expect_success 'log --pretty with space stealing' '

 t/t4205-log-pretty-formats.sh | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh
index 4cf8a77667..dd9035aa38 100755
--- a/t/t4205-log-pretty-formats.sh
+++ b/t/t4205-log-pretty-formats.sh
@@ -1012,10 +1012,25 @@ test_expect_success '%(describe:tags) vs git describe --tags' '
 
 test_expect_success '%(describe:abbrev=...) vs git describe --abbrev=...' '
 	test_when_finished "git tag -d tagname" &&
+
+	# Case 1: We have commits between HEAD and the most recent tag
+	#	  reachable from it
+	test_commit --no-tag file &&
+	git describe --abbrev=15 >expect &&
+	git log -1 --format="%(describe:abbrev=15)" >actual &&
+	test_cmp expect actual &&
+
+	# Make sure the hash used is at least 15 digits long
+	sed -e "s/^.*-g\([0-9a-f]*\)$/\1/" <actual >hexpart &&
+	test 16 -le $(wc -c <hexpart) &&
+
+	# Case 2: We have a tag at HEAD, describe directly gives the
+	#	  name of the tag
 	git tag -a -m tagged tagname &&
 	git describe --abbrev=15 >expect &&
 	git log -1 --format="%(describe:abbrev=15)" >actual &&
-	test_cmp expect actual
+	test_cmp expect actual &&
+	test tagname = $(cat actual)
 '
 
 test_expect_success 'log --pretty with space stealing' '
-- 
2.41.0.29.g8148156d44.dirty