Đoàn Trần Công Danh <congdanhqx@xxxxxxxxx> writes: > From: "brian m. carlson" <sandals@xxxxxxxxxxxxxxxxxxxx> > > 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 not-exist objects, in consequence, we could't catch "for missing objects" would probably the best, even though "non-existing objects" would also work. > possible future bugs where object names is all-zeros including but s/is/are/ > not limiting to: "not limited to", I think. > * show intend-to-add entry > * deleted entry > * diff between index and working tree with new file > > In addition, in the incoming change, we would like to test for s/incoming/upcoming/? > diff with 10 characters index, which is also not covered by current "test for customizing the length of abbreviated blob object names on the index line"? s/covered/supported/ > diff-processor logic. > > Let's fix the bug for all-zero object names and extend object names' > abbrev to 16 while we're at it. "and support abbreviation of object names up to 16 bytes"? Also while we are at it, we fixed the post-processing not to touch the file modes, which were mistakenly munged in the older code as if they were object names abbreviated to 7 hexdigits. > diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh > index 5f97dd6d65..f6bdfc13fd 100755 > --- a/t/t4013-diff-various.sh > +++ b/t/t4013-diff-various.sh > @@ -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')