2009-11-23 08:49:47 +00:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2009, Junio C Hamano
|
|
|
|
#
|
|
|
|
|
|
|
|
test_description='log family learns --stdin'
|
|
|
|
|
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
|
|
|
|
|
2009-11-23 08:49:47 +00:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
check () {
|
|
|
|
for cmd in rev-list "log --stat"
|
|
|
|
do
|
|
|
|
for i in "$@"
|
|
|
|
do
|
|
|
|
printf "%s\n" $i
|
|
|
|
done >input &&
|
|
|
|
test_expect_success "check $cmd $*" '
|
|
|
|
git $cmd $(cat input) >expect &&
|
|
|
|
git $cmd --stdin <input >actual &&
|
|
|
|
sed -e "s/^/input /" input &&
|
|
|
|
sed -e "s/^/output /" expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
them='1 2 3 4 5 6 7'
|
|
|
|
|
|
|
|
test_expect_success setup '
|
|
|
|
(
|
|
|
|
for i in 0 $them
|
|
|
|
do
|
|
|
|
for j in $them
|
|
|
|
do
|
|
|
|
echo $i.$j >file-$j &&
|
|
|
|
git add file-$j || exit
|
|
|
|
done &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m $i || exit
|
|
|
|
done &&
|
|
|
|
for i in $them
|
|
|
|
do
|
2020-11-18 23:44:36 +00:00
|
|
|
git checkout -b side-$i main~$i &&
|
2009-11-23 08:49:47 +00:00
|
|
|
echo updated $i >file-$i &&
|
|
|
|
git add file-$i &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m side-$i || exit
|
2023-06-15 14:39:59 +00:00
|
|
|
done &&
|
|
|
|
|
|
|
|
git update-ref refs/heads/-dashed-branch HEAD
|
2009-11-23 08:49:47 +00:00
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2020-11-18 23:44:36 +00:00
|
|
|
check main
|
2009-11-23 08:49:47 +00:00
|
|
|
check side-1 ^side-4
|
|
|
|
check side-1 ^side-7 --
|
|
|
|
check side-1 ^side-7 -- file-1
|
|
|
|
check side-1 ^side-7 -- file-2
|
|
|
|
check side-3 ^side-4 -- file-3
|
|
|
|
check side-3 ^side-2
|
|
|
|
check side-3 ^side-2 -- file-1
|
2023-06-15 14:39:59 +00:00
|
|
|
check --all
|
|
|
|
check --all --not --branches
|
|
|
|
check --glob=refs/heads
|
|
|
|
check --glob=refs/heads --
|
|
|
|
check --glob=refs/heads -- file-1
|
|
|
|
check --end-of-options -dashed-branch
|
revision: make pseudo-opt flags read via stdin behave consistently
When reading revisions from stdin via git-rev-list(1)'s `--stdin` option
then these revisions never honor flags like `--not` which have been
passed on the command line. Thus, an invocation like e.g. `git rev-list
--all --not --stdin` will not treat all revisions read from stdin as
uninteresting. While this behaviour may be surprising to a user, it's
been this way ever since it has been introduced via 42cabc341c4 (Teach
rev-list an option to read revs from the standard input., 2006-09-05).
With that said, in c40f0b7877 (revision: handle pseudo-opts in `--stdin`
mode, 2023-06-15) we have introduced a new mode to read pseudo opts from
standard input where this behaviour is a lot more confusing. If you pass
`--not` via stdin, it will:
- Influence subsequent revisions or pseudo-options passed on the
command line.
- Influence pseudo-options passed via standard input.
- _Not_ influence normal revisions passed via standard input.
This behaviour is extremely inconsistent and bound to cause confusion.
While it would be nice to retroactively change the behaviour for how
`--not` and `--stdin` behave together, chances are quite high that this
would break existing scripts that expect the current behaviour that has
been around for many years by now. This is thus not really a viable
option to explore to fix the inconsistency.
Instead, we change the behaviour of how pseudo-opts read via standard
input influence the flags such that the effect is fully localized. With
this change, when reading `--not` via standard input, it will:
- _Not_ influence subsequent revisions or pseudo-options passed on
the command line, which is a change in behaviour.
- Influence pseudo-options passed via standard input.
- Influence normal revisions passed via standard input, which is a
change in behaviour.
Thus, all flags read via standard input are fully self-contained to that
standard input, only.
While this is a breaking change as well, the behaviour has only been
recently introduced with Git v2.42.0. Furthermore, the current behaviour
can be regarded as a simple bug. With that in mind it feels like the
right thing to retroactively change it and make the behaviour sane.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Reported-by: Christian Couder <christian.couder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2023-09-25 13:02:00 +00:00
|
|
|
check --all --not refs/heads/main
|
2009-11-23 08:49:47 +00:00
|
|
|
|
2011-05-11 21:01:19 +00:00
|
|
|
test_expect_success 'not only --stdin' '
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
7
|
|
|
|
|
|
|
|
file-1
|
|
|
|
file-2
|
|
|
|
EOF
|
|
|
|
cat >input <<-EOF &&
|
2020-11-18 23:44:36 +00:00
|
|
|
^main^
|
2011-05-11 21:01:19 +00:00
|
|
|
--
|
|
|
|
file-2
|
|
|
|
EOF
|
2020-11-18 23:44:36 +00:00
|
|
|
git log --pretty=tformat:%s --name-only --stdin main -- file-1 \
|
2011-05-11 21:01:19 +00:00
|
|
|
<input >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2023-06-15 14:39:59 +00:00
|
|
|
test_expect_success 'pseudo-opt with missing value' '
|
|
|
|
cat >input <<-EOF &&
|
|
|
|
--glob
|
|
|
|
refs/heads
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
fatal: Option ${SQ}--glob${SQ} requires a value
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_must_fail git rev-list --stdin <input 2>error &&
|
|
|
|
test_cmp expect error
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'pseudo-opt with invalid value' '
|
|
|
|
cat >input <<-EOF &&
|
|
|
|
--no-walk=garbage
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
error: invalid argument to --no-walk
|
|
|
|
fatal: invalid option ${SQ}--no-walk=garbage${SQ} in --stdin mode
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_must_fail git rev-list --stdin <input 2>error &&
|
|
|
|
test_cmp expect error
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'unknown option without --end-of-options' '
|
|
|
|
cat >input <<-EOF &&
|
|
|
|
-dashed-branch
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-EOF &&
|
|
|
|
fatal: invalid option ${SQ}-dashed-branch${SQ} in --stdin mode
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_must_fail git rev-list --stdin <input 2>error &&
|
|
|
|
test_cmp expect error
|
|
|
|
'
|
|
|
|
|
revision: make pseudo-opt flags read via stdin behave consistently
When reading revisions from stdin via git-rev-list(1)'s `--stdin` option
then these revisions never honor flags like `--not` which have been
passed on the command line. Thus, an invocation like e.g. `git rev-list
--all --not --stdin` will not treat all revisions read from stdin as
uninteresting. While this behaviour may be surprising to a user, it's
been this way ever since it has been introduced via 42cabc341c4 (Teach
rev-list an option to read revs from the standard input., 2006-09-05).
With that said, in c40f0b7877 (revision: handle pseudo-opts in `--stdin`
mode, 2023-06-15) we have introduced a new mode to read pseudo opts from
standard input where this behaviour is a lot more confusing. If you pass
`--not` via stdin, it will:
- Influence subsequent revisions or pseudo-options passed on the
command line.
- Influence pseudo-options passed via standard input.
- _Not_ influence normal revisions passed via standard input.
This behaviour is extremely inconsistent and bound to cause confusion.
While it would be nice to retroactively change the behaviour for how
`--not` and `--stdin` behave together, chances are quite high that this
would break existing scripts that expect the current behaviour that has
been around for many years by now. This is thus not really a viable
option to explore to fix the inconsistency.
Instead, we change the behaviour of how pseudo-opts read via standard
input influence the flags such that the effect is fully localized. With
this change, when reading `--not` via standard input, it will:
- _Not_ influence subsequent revisions or pseudo-options passed on
the command line, which is a change in behaviour.
- Influence pseudo-options passed via standard input.
- Influence normal revisions passed via standard input, which is a
change in behaviour.
Thus, all flags read via standard input are fully self-contained to that
standard input, only.
While this is a breaking change as well, the behaviour has only been
recently introduced with Git v2.42.0. Furthermore, the current behaviour
can be regarded as a simple bug. With that in mind it feels like the
right thing to retroactively change it and make the behaviour sane.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Reported-by: Christian Couder <christian.couder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2023-09-25 13:02:00 +00:00
|
|
|
test_expect_success '--not on command line does not influence revisions read via --stdin' '
|
|
|
|
cat >input <<-EOF &&
|
|
|
|
refs/heads/main
|
|
|
|
EOF
|
|
|
|
git rev-list refs/heads/main >expect &&
|
|
|
|
|
|
|
|
git rev-list refs/heads/main --not --stdin <input >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--not via stdin does not influence revisions from command line' '
|
|
|
|
cat >input <<-EOF &&
|
|
|
|
--not
|
|
|
|
EOF
|
|
|
|
git rev-list refs/heads/main >expect &&
|
|
|
|
|
|
|
|
git rev-list refs/heads/main --stdin refs/heads/main <input >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2009-11-23 08:49:47 +00:00
|
|
|
test_done
|