]> git.ipfire.org Git - thirdparty/git.git/commitdiff
t4013: improve diff-post-processor logic
authorbrian m. carlson <sandals@crustytoothpaste.net>
Fri, 21 Aug 2020 11:51:46 +0000 (18:51 +0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 21 Aug 2020 19:43:05 +0000 (12:43 -0700)
From 72f936b1 (t4013: make test hash independent, 2020-02-07),
we started to adjust metadata of git-diff's output in order to
ignore uninteresting metadata which is dependent of underlying hash
algorithm.

However, we forgot to special case all-zero object names, which is
special for missing objects, in consequence, we could't catch
possible future bugs where object names is all-zeros including but
not limited to:
* show intend-to-add entry
* deleted entry
* diff between index and working tree with new file

We also mistakenly munged file-modes as if they were object names
abbreviated to 6 hexadecimal digits.

In addition, in the upcoming change, we would like to test for
customizing the length of abbreviated blob objects on the index line,
which is not supported by current diff-processor logic.

Let's fix the bug for all-zero object names, and file modes.
While we're at it, support abbreviation of object names up to 16 bytes.

Based-on-patch-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t4013-diff-various.sh

index 3f60f7d96ce1998cd977751158c09cadfd926d15..b3a949ee87dc751d23b32f675ba1929ef5efd5ef 100755 (executable)
@@ -130,27 +130,45 @@ test_expect_success setup '
 EOF
 
 process_diffs () {
-       _x04="[0-9a-f][0-9a-f][0-9a-f][0-9a-f]" &&
-       _x07="$_x05[0-9a-f][0-9a-f]" &&
-       sed -e "s/$OID_REGEX/$ZERO_OID/g" \
-           -e "s/From $_x40 /From $ZERO_OID /" \
-           -e "s/from $_x40)/from $ZERO_OID)/" \
-           -e "s/commit $_x40\$/commit $ZERO_OID/" \
-           -e "s/commit $_x40 (/commit $ZERO_OID (/" \
-           -e "s/$_x40 $_x40 $_x40/$ZERO_OID $ZERO_OID $ZERO_OID/" \
-           -e "s/$_x40 $_x40 /$ZERO_OID $ZERO_OID /" \
-           -e "s/^$_x40 $_x40$/$ZERO_OID $ZERO_OID/" \
-           -e "s/^$_x40 /$ZERO_OID /" \
-           -e "s/^$_x40$/$ZERO_OID/" \
-           -e "s/$_x07\.\.$_x07/fffffff..fffffff/g" \
-           -e "s/$_x07,$_x07\.\.$_x07/fffffff,fffffff..fffffff/g" \
-           -e "s/$_x07 $_x07 $_x07/fffffff fffffff fffffff/g" \
-           -e "s/$_x07 $_x07 /fffffff fffffff /g" \
-           -e "s/Merge: $_x07 $_x07/Merge: fffffff fffffff/g" \
-           -e "s/$_x07\.\.\./fffffff.../g" \
-           -e "s/ $_x04\.\.\./ ffff.../g" \
-           -e "s/ $_x04/ ffff/g" \
-           "$1"
+       perl -e '
+               my $oid_length = length($ARGV[0]);
+               my $x40 = "[0-9a-f]{40}";
+               my $xab = "[0-9a-f]{4,16}";
+               my $orx = "[0-9a-f]" x $oid_length;
+
+               sub munge_oid {
+                       my ($oid) = @_;
+                       my $x;
+
+                       return "" unless length $oid;
+
+                       if ($oid =~ /^(100644|100755|120000)$/) {
+                               return $oid;
+                       }
+
+                       if ($oid =~ /^0*$/) {
+                               $x = "0";
+                       } else {
+                               $x = "f";
+                       }
+
+                       if (length($oid) == 40) {
+                               return $x x $oid_length;
+                       } else {
+                               return $x x length($oid);
+                       }
+               }
+
+               while (<STDIN>) {
+                       s/($orx)/munge_oid($1)/ge;
+                       s/From ($x40)( |\))/"From " . munge_oid($1) . $2/ge;
+                       s/commit ($x40)($| \(from )($x40?)/"commit " .  munge_oid($1) . $2 . munge_oid($3)/ge;
+                       s/\b($x40)( |\.\.|$)/munge_oid($1) . $2/ge;
+                       s/^($x40)($| )/munge_oid($1) . $2/e;
+                       s/($xab)(\.\.|,| |\.\.\.|$)/munge_oid($1) . $2/ge;
+                       print;
+               }
+       ' "$ZERO_OID" <"$1"
 }
 
 V=$(git version | sed -e 's/^git version //' -e 's/\./\\./g')