2006-09-27 19:34:37 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='Revision traversal vs grafts and path limiter'
|
|
|
|
|
2020-11-18 23:44:36 +00:00
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
tests: mark tests relying on the current default for `init.defaultBranch`
In addition to the manual adjustment to let the `linux-gcc` CI job run
the test suite with `master` and then with `main`, this patch makes sure
that GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME is set in all test scripts
that currently rely on the initial branch name being `master by default.
To determine which test scripts to mark up, the first step was to
force-set the default branch name to `master` in
- all test scripts that contain the keyword `master`,
- t4211, which expects `t/t4211/history.export` with a hard-coded ref to
initialize the default branch,
- t5560 because it sources `t/t556x_common` which uses `master`,
- t8002 and t8012 because both source `t/annotate-tests.sh` which also
uses `master`)
This trick was performed by this command:
$ sed -i '/^ *\. \.\/\(test-lib\|lib-\(bash\|cvs\|git-svn\)\|gitweb-lib\)\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' $(git grep -l master t/t[0-9]*.sh) \
t/t4211*.sh t/t5560*.sh t/t8002*.sh t/t8012*.sh
After that, careful, manual inspection revealed that some of the test
scripts containing the needle `master` do not actually rely on a
specific default branch name: either they mention `master` only in a
comment, or they initialize that branch specificially, or they do not
actually refer to the current default branch. Therefore, the
aforementioned modification was undone in those test scripts thusly:
$ git checkout HEAD -- \
t/t0027-auto-crlf.sh t/t0060-path-utils.sh \
t/t1011-read-tree-sparse-checkout.sh \
t/t1305-config-include.sh t/t1309-early-config.sh \
t/t1402-check-ref-format.sh t/t1450-fsck.sh \
t/t2024-checkout-dwim.sh \
t/t2106-update-index-assume-unchanged.sh \
t/t3040-subprojects-basic.sh t/t3301-notes.sh \
t/t3308-notes-merge.sh t/t3423-rebase-reword.sh \
t/t3436-rebase-more-options.sh \
t/t4015-diff-whitespace.sh t/t4257-am-interactive.sh \
t/t5323-pack-redundant.sh t/t5401-update-hooks.sh \
t/t5511-refspec.sh t/t5526-fetch-submodules.sh \
t/t5529-push-errors.sh t/t5530-upload-pack-error.sh \
t/t5548-push-porcelain.sh \
t/t5552-skipping-fetch-negotiator.sh \
t/t5572-pull-submodule.sh t/t5608-clone-2gb.sh \
t/t5614-clone-submodules-shallow.sh \
t/t7508-status.sh t/t7606-merge-custom.sh \
t/t9302-fast-import-unpack-limit.sh
We excluded one set of test scripts in these commands, though: the range
of `git p4` tests. The reason? `git p4` stores the (foreign) remote
branch in the branch called `p4/master`, which is obviously not the
default branch. Manual analysis revealed that only five of these tests
actually require a specific default branch name to pass; They were
modified thusly:
$ sed -i '/^ *\. \.\/lib-git-p4\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' t/t980[0167]*.sh t/t9811*.sh
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-11-18 23:44:19 +00:00
|
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
|
2024-06-11 09:20:24 +00:00
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
2006-09-27 19:34:37 +00:00
|
|
|
. ./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." &&
|
2016-01-07 13:51:42 +00:00
|
|
|
A0=$(git rev-parse --verify HEAD) &&
|
2006-09-27 19:34:37 +00:00
|
|
|
|
|
|
|
echo >fileA fileA modified &&
|
|
|
|
git commit -a -m "Second in one history." &&
|
2016-01-07 13:51:42 +00:00
|
|
|
A1=$(git rev-parse --verify HEAD) &&
|
2006-09-27 19:34:37 +00:00
|
|
|
|
|
|
|
echo >subdir/fileB fileB modified &&
|
|
|
|
git commit -a -m "Third in one history." &&
|
2016-01-07 13:51:42 +00:00
|
|
|
A2=$(git rev-parse --verify HEAD) &&
|
2006-09-27 19:34:37 +00:00
|
|
|
|
2021-08-02 16:53:36 +00:00
|
|
|
git update-ref -d refs/heads/main &&
|
|
|
|
rm -f .git/index &&
|
2006-09-27 19:34:37 +00:00
|
|
|
|
|
|
|
echo >fileA fileA again &&
|
|
|
|
echo >subdir/fileB fileB again &&
|
|
|
|
git add fileA subdir/fileB &&
|
|
|
|
git commit -a -m "Initial in alternate history." &&
|
2016-01-07 13:51:42 +00:00
|
|
|
B0=$(git rev-parse --verify HEAD) &&
|
2006-09-27 19:34:37 +00:00
|
|
|
|
|
|
|
echo >fileA fileA modified in alternate history &&
|
|
|
|
git commit -a -m "Second in alternate history." &&
|
2016-01-07 13:51:42 +00:00
|
|
|
B1=$(git rev-parse --verify HEAD) &&
|
2006-09-27 19:34:37 +00:00
|
|
|
|
|
|
|
echo >subdir/fileB fileB modified in alternate history &&
|
|
|
|
git commit -a -m "Third in alternate history." &&
|
2016-01-07 13:51:42 +00:00
|
|
|
B2=$(git rev-parse --verify HEAD) &&
|
2006-09-27 19:34:37 +00:00
|
|
|
: 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
|
2010-05-14 09:31:37 +00:00
|
|
|
test_cmp test.expect test.actual
|
2006-09-27 19:34:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for type in basic parents parents-raw
|
|
|
|
do
|
|
|
|
test_expect_success 'without grafts' "
|
2010-10-31 01:46:54 +00:00
|
|
|
rm -f .git/info/grafts &&
|
2006-09-27 19:34:37 +00:00
|
|
|
check $type $B2 -- $B2 $B1 $B0
|
|
|
|
"
|
|
|
|
|
|
|
|
test_expect_success 'with grafts' "
|
2022-06-03 11:15:05 +00:00
|
|
|
mkdir -p .git/info &&
|
2010-10-31 01:46:54 +00:00
|
|
|
echo '$B0 $A2' >.git/info/grafts &&
|
2006-09-27 19:34:37 +00:00
|
|
|
check $type $B2 -- $B2 $B1 $B0 $A2 $A1 $A0
|
|
|
|
"
|
|
|
|
|
|
|
|
test_expect_success 'without grafts, with pathlimit' "
|
2010-10-31 01:46:54 +00:00
|
|
|
rm -f .git/info/grafts &&
|
2006-09-27 19:34:37 +00:00
|
|
|
check $type $B2 subdir -- $B2 $B0
|
|
|
|
"
|
|
|
|
|
|
|
|
test_expect_success 'with grafts, with pathlimit' "
|
2010-10-31 01:46:54 +00:00
|
|
|
echo '$B0 $A2' >.git/info/grafts &&
|
2006-09-27 19:34:37 +00:00
|
|
|
check $type $B2 subdir -- $B2 $B0 $A2 $A0
|
|
|
|
"
|
|
|
|
|
|
|
|
done
|
Deprecate support for .git/info/grafts
The grafts feature was a convenient way to "stitch together" ancient
history to the fresh start of linux.git.
Its implementation is, however, not up to Git's standards, as there are
too many ways where it can lead to surprising and unwelcome behavior.
For example, when pushing from a repository with active grafts, it is
possible to miss commits that have been "grafted out", resulting in a
broken state on the other side.
Also, the grafts feature is limited to "rewriting" commits' list of
parents, it cannot replace anything else.
The much younger feature implemented as `git replace` set out to remedy
those limitations and dangerous bugs.
Seeing as `git replace` is pretty mature by now (since 4228e8bc98
(replace: add --graft option, 2014-07-19) it can perform the graft
file's duties), it is time to deprecate support for the graft file, and
to retire it eventually.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Reviewed-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-04-28 22:44:44 +00:00
|
|
|
|
|
|
|
test_expect_success 'show advice that grafts are deprecated' '
|
|
|
|
git show HEAD 2>err &&
|
2023-10-31 05:23:30 +00:00
|
|
|
test_grep "git replace" err &&
|
Deprecate support for .git/info/grafts
The grafts feature was a convenient way to "stitch together" ancient
history to the fresh start of linux.git.
Its implementation is, however, not up to Git's standards, as there are
too many ways where it can lead to surprising and unwelcome behavior.
For example, when pushing from a repository with active grafts, it is
possible to miss commits that have been "grafted out", resulting in a
broken state on the other side.
Also, the grafts feature is limited to "rewriting" commits' list of
parents, it cannot replace anything else.
The much younger feature implemented as `git replace` set out to remedy
those limitations and dangerous bugs.
Seeing as `git replace` is pretty mature by now (since 4228e8bc98
(replace: add --graft option, 2014-07-19) it can perform the graft
file's duties), it is time to deprecate support for the graft file, and
to retire it eventually.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Reviewed-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-04-28 22:44:44 +00:00
|
|
|
test_config advice.graftFileDeprecated false &&
|
|
|
|
git show HEAD 2>err &&
|
2023-10-31 05:23:30 +00:00
|
|
|
test_grep ! "git replace" err
|
Deprecate support for .git/info/grafts
The grafts feature was a convenient way to "stitch together" ancient
history to the fresh start of linux.git.
Its implementation is, however, not up to Git's standards, as there are
too many ways where it can lead to surprising and unwelcome behavior.
For example, when pushing from a repository with active grafts, it is
possible to miss commits that have been "grafted out", resulting in a
broken state on the other side.
Also, the grafts feature is limited to "rewriting" commits' list of
parents, it cannot replace anything else.
The much younger feature implemented as `git replace` set out to remedy
those limitations and dangerous bugs.
Seeing as `git replace` is pretty mature by now (since 4228e8bc98
(replace: add --graft option, 2014-07-19) it can perform the graft
file's duties), it is time to deprecate support for the graft file, and
to retire it eventually.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Reviewed-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-04-28 22:44:44 +00:00
|
|
|
'
|
|
|
|
|
2006-09-27 19:34:37 +00:00
|
|
|
test_done
|