mirror of
https://github.com/git/git
synced 2024-08-25 02:35:46 +00:00
![Junio C Hamano](/assets/img/avatar_default.png)
This script creates two separate histories, A and B, each of which does: (A0, B0): create fileA and subdir/fileB (A1, B1): modify fileA (A2, B2): modify subdir/fileB and then grafts them together to make B0 a child of A2. So the final history looks like (time flows from top to bottom): true parent touches subdir? A0 none yes (creates it) A1 A0 no A2 A1 yes B0 none yes (different from what's in A2) B1 B0 no B2 B1 yes "git rev-list --parents --pretty=raw B2" would give "fake" parents on the "commit " header lines while "parent " header lines show the parent as recorded in the commit object (i.e. B0 appears to have A2 as its parent on "commit " header but there is no "parent A2" header line in it). When you have path limiters, we simplify history to omit commits that do not affect the specified paths. So "git rev-list --parents --pretty=raw B2 subdir" would return "B2 B0 A2 A0" (because B1 and A1 do not touch the path). When it does so, the "commit " header lines have "fake" parents (i.e. B2 appears to have B0 as its parent on "commit " header), but you can still get the true parents by looking at "parent " header. Signed-off-by: Junio C Hamano <junkio@cox.net>
114 lines
2.3 KiB
Bash
Executable file
114 lines
2.3 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='Revision traversal vs grafts and path limiter'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success setup '
|
|
mkdir subdir &&
|
|
echo >fileA fileA &&
|
|
echo >subdir/fileB fileB &&
|
|
git add fileA subdir/fileB &&
|
|
git commit -a -m "Initial in one history." &&
|
|
A0=`git rev-parse --verify HEAD` &&
|
|
|
|
echo >fileA fileA modified &&
|
|
git commit -a -m "Second in one history." &&
|
|
A1=`git rev-parse --verify HEAD` &&
|
|
|
|
echo >subdir/fileB fileB modified &&
|
|
git commit -a -m "Third in one history." &&
|
|
A2=`git rev-parse --verify HEAD` &&
|
|
|
|
rm -f .git/refs/heads/master .git/index &&
|
|
|
|
echo >fileA fileA again &&
|
|
echo >subdir/fileB fileB again &&
|
|
git add fileA subdir/fileB &&
|
|
git commit -a -m "Initial in alternate history." &&
|
|
B0=`git rev-parse --verify HEAD` &&
|
|
|
|
echo >fileA fileA modified in alternate history &&
|
|
git commit -a -m "Second in alternate history." &&
|
|
B1=`git rev-parse --verify HEAD` &&
|
|
|
|
echo >subdir/fileB fileB modified in alternate history &&
|
|
git commit -a -m "Third in alternate history." &&
|
|
B2=`git rev-parse --verify HEAD` &&
|
|
: done
|
|
'
|
|
|
|
check () {
|
|
type=$1
|
|
shift
|
|
|
|
arg=
|
|
which=arg
|
|
rm -f test.expect
|
|
for a
|
|
do
|
|
if test "z$a" = z--
|
|
then
|
|
which=expect
|
|
child=
|
|
continue
|
|
fi
|
|
if test "$which" = arg
|
|
then
|
|
arg="$arg$a "
|
|
continue
|
|
fi
|
|
if test "$type" = basic
|
|
then
|
|
echo "$a"
|
|
else
|
|
if test "z$child" != z
|
|
then
|
|
echo "$child $a"
|
|
fi
|
|
child="$a"
|
|
fi
|
|
done >test.expect
|
|
if test "$type" != basic && test "z$child" != z
|
|
then
|
|
echo >>test.expect $child
|
|
fi
|
|
if test $type = basic
|
|
then
|
|
git rev-list $arg >test.actual
|
|
elif test $type = parents
|
|
then
|
|
git rev-list --parents $arg >test.actual
|
|
elif test $type = parents-raw
|
|
then
|
|
git rev-list --parents --pretty=raw $arg |
|
|
sed -n -e 's/^commit //p' >test.actual
|
|
fi
|
|
diff test.expect test.actual
|
|
}
|
|
|
|
for type in basic parents parents-raw
|
|
do
|
|
test_expect_success 'without grafts' "
|
|
rm -f .git/info/grafts
|
|
check $type $B2 -- $B2 $B1 $B0
|
|
"
|
|
|
|
test_expect_success 'with grafts' "
|
|
echo '$B0 $A2' >.git/info/grafts
|
|
check $type $B2 -- $B2 $B1 $B0 $A2 $A1 $A0
|
|
"
|
|
|
|
test_expect_success 'without grafts, with pathlimit' "
|
|
rm -f .git/info/grafts
|
|
check $type $B2 subdir -- $B2 $B0
|
|
"
|
|
|
|
test_expect_success 'with grafts, with pathlimit' "
|
|
echo '$B0 $A2' >.git/info/grafts
|
|
check $type $B2 subdir -- $B2 $B0 $A2 $A0
|
|
"
|
|
|
|
done
|
|
test_done
|