t4013: improve diff-post-processor logic

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>
This commit is contained in:
brian m. carlson 2020-08-21 18:51:46 +07:00 committed by Junio C Hamano
parent 878e727637
commit fc7e73d7ef

View file

@ -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')