2015-07-09 09:03:21 +03:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='test for-each-refs usage of ref-filter APIs'
|
|
|
|
|
2020-11-19 02:44:36 +03: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-19 02:44:19 +03:00
|
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
|
2015-07-09 09:03:21 +03:00
|
|
|
. ./test-lib.sh
|
|
|
|
. "$TEST_DIRECTORY"/lib-gpg.sh
|
|
|
|
|
|
|
|
test_expect_success 'setup some history and refs' '
|
|
|
|
test_commit one &&
|
2020-12-17 04:07:08 +03:00
|
|
|
git branch -M main &&
|
2015-07-09 09:03:21 +03:00
|
|
|
test_commit two &&
|
|
|
|
test_commit three &&
|
|
|
|
git checkout -b side &&
|
|
|
|
test_commit four &&
|
2016-03-07 03:10:26 +03:00
|
|
|
git tag -m "An annotated tag" annotated-tag &&
|
|
|
|
git tag -m "Annonated doubly" doubly-annotated-tag annotated-tag &&
|
2016-05-09 19:49:00 +03:00
|
|
|
|
|
|
|
# Note that these "signed" tags might not actually be signed.
|
|
|
|
# Tests which care about the distinction should be marked
|
|
|
|
# with the GPG prereq.
|
2016-03-07 03:10:27 +03:00
|
|
|
if test_have_prereq GPG
|
|
|
|
then
|
2016-05-09 19:49:00 +03:00
|
|
|
sign=-s
|
|
|
|
else
|
|
|
|
sign=
|
2016-03-07 03:10:27 +03:00
|
|
|
fi &&
|
2016-05-09 19:49:00 +03:00
|
|
|
git tag $sign -m "A signed tag" signed-tag &&
|
|
|
|
git tag $sign -m "Signed doubly" doubly-signed-tag signed-tag &&
|
|
|
|
|
2020-12-17 04:07:08 +03:00
|
|
|
git checkout main &&
|
|
|
|
git update-ref refs/odd/spot main
|
2015-07-09 09:03:21 +03:00
|
|
|
'
|
|
|
|
|
2015-07-07 19:06:10 +03:00
|
|
|
test_expect_success 'filtering with --points-at' '
|
|
|
|
cat >expect <<-\EOF &&
|
2020-12-17 04:07:08 +03:00
|
|
|
refs/heads/main
|
2015-07-07 19:06:10 +03:00
|
|
|
refs/odd/spot
|
|
|
|
refs/tags/three
|
|
|
|
EOF
|
2020-12-17 04:07:08 +03:00
|
|
|
git for-each-ref --format="%(refname)" --points-at=main >actual &&
|
2015-07-07 19:06:10 +03:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check signed tags with --points-at' '
|
2016-05-09 19:49:00 +03:00
|
|
|
sed -e "s/Z$//" >expect <<-\EOF &&
|
2015-07-07 19:06:10 +03:00
|
|
|
refs/heads/side Z
|
2016-03-07 03:10:26 +03:00
|
|
|
refs/tags/annotated-tag four
|
2015-07-07 19:06:10 +03:00
|
|
|
refs/tags/four Z
|
|
|
|
refs/tags/signed-tag four
|
|
|
|
EOF
|
|
|
|
git for-each-ref --format="%(refname) %(*subject)" --points-at=side >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2015-07-07 19:06:13 +03:00
|
|
|
test_expect_success 'filtering with --merged' '
|
|
|
|
cat >expect <<-\EOF &&
|
2020-12-17 04:07:08 +03:00
|
|
|
refs/heads/main
|
2015-07-07 19:06:13 +03:00
|
|
|
refs/odd/spot
|
|
|
|
refs/tags/one
|
|
|
|
refs/tags/three
|
|
|
|
refs/tags/two
|
|
|
|
EOF
|
2020-12-17 04:07:08 +03:00
|
|
|
git for-each-ref --format="%(refname)" --merged=main >actual &&
|
2015-07-07 19:06:13 +03:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'filtering with --no-merged' '
|
2016-05-09 19:49:00 +03:00
|
|
|
cat >expect <<-\EOF &&
|
2015-07-07 19:06:13 +03:00
|
|
|
refs/heads/side
|
2016-03-07 03:10:26 +03:00
|
|
|
refs/tags/annotated-tag
|
|
|
|
refs/tags/doubly-annotated-tag
|
2016-03-07 03:10:25 +03:00
|
|
|
refs/tags/doubly-signed-tag
|
2015-07-07 19:06:13 +03:00
|
|
|
refs/tags/four
|
|
|
|
refs/tags/signed-tag
|
|
|
|
EOF
|
2020-12-17 04:07:08 +03:00
|
|
|
git for-each-ref --format="%(refname)" --no-merged=main >actual &&
|
2015-07-07 19:06:13 +03:00
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2015-07-07 19:06:17 +03:00
|
|
|
test_expect_success 'filtering with --contains' '
|
2016-05-09 19:49:00 +03:00
|
|
|
cat >expect <<-\EOF &&
|
2020-12-17 04:07:08 +03:00
|
|
|
refs/heads/main
|
2015-07-07 19:06:17 +03:00
|
|
|
refs/heads/side
|
|
|
|
refs/odd/spot
|
2016-03-07 03:10:26 +03:00
|
|
|
refs/tags/annotated-tag
|
|
|
|
refs/tags/doubly-annotated-tag
|
2016-03-07 03:10:25 +03:00
|
|
|
refs/tags/doubly-signed-tag
|
2015-07-07 19:06:17 +03:00
|
|
|
refs/tags/four
|
|
|
|
refs/tags/signed-tag
|
|
|
|
refs/tags/three
|
|
|
|
refs/tags/two
|
|
|
|
EOF
|
|
|
|
git for-each-ref --format="%(refname)" --contains=two >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
ref-filter: add --no-contains option to tag/branch/for-each-ref
Change the tag, branch & for-each-ref commands to have a --no-contains
option in addition to their longstanding --contains options.
This allows for finding the last-good rollout tag given a known-bad
<commit>. Given a hypothetically bad commit cf5c7253e0, the git
version to revert to can be found with this hacky two-liner:
(git tag -l 'v[0-9]*'; git tag -l --contains cf5c7253e0 'v[0-9]*') |
sort | uniq -c | grep -E '^ *1 ' | awk '{print $2}' | tail -n 10
With this new --no-contains option the same can be achieved with:
git tag -l --no-contains cf5c7253e0 'v[0-9]*' | sort | tail -n 10
As the filtering machinery is shared between the tag, branch &
for-each-ref commands, implement this for those commands too. A
practical use for this with "branch" is e.g. finding branches which
were branched off between v2.8.0 and v2.10.0:
git branch --contains v2.8.0 --no-contains v2.10.0
The "describe" command also has a --contains option, but its semantics
are unrelated to what tag/branch/for-each-ref use --contains for. A
--no-contains option for "describe" wouldn't make any sense, other
than being exactly equivalent to not supplying --contains at all,
which would be confusing at best.
Add a --without option to "tag" as an alias for --no-contains, for
consistency with --with and --contains. The --with option is
undocumented, and possibly the only user of it is
Junio (<xmqqefy71iej.fsf@gitster.mtv.corp.google.com>). But it's
trivial to support, so let's do that.
The additions to the the test suite are inverse copies of the
corresponding --contains tests. With this change --no-contains for
tag, branch & for-each-ref is just as well tested as the existing
--contains option.
In addition to those tests, add a test for "tag" which asserts that
--no-contains won't find tree/blob tags, which is slightly
unintuitive, but consistent with how --contains works & is documented.
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2017-03-24 21:40:57 +03:00
|
|
|
test_expect_success 'filtering with --no-contains' '
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
refs/tags/one
|
|
|
|
EOF
|
|
|
|
git for-each-ref --format="%(refname)" --no-contains=two >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'filtering with --contains and --no-contains' '
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
refs/tags/two
|
|
|
|
EOF
|
|
|
|
git for-each-ref --format="%(refname)" --contains=two --no-contains=three >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2015-09-11 17:59:47 +03:00
|
|
|
test_expect_success '%(color) must fail' '
|
|
|
|
test_must_fail git for-each-ref --format="%(color)%(refname)"
|
|
|
|
'
|
|
|
|
|
2021-05-11 18:35:20 +03:00
|
|
|
test_expect_success '%(color:#aa22ac) must succeed' '
|
|
|
|
test_when_finished rm -rf test &&
|
|
|
|
git init test &&
|
|
|
|
(
|
|
|
|
cd test &&
|
|
|
|
test_commit initial &&
|
|
|
|
git branch -M main &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
refs/heads/main
|
|
|
|
refs/tags/initial
|
|
|
|
EOF
|
|
|
|
git remote add origin nowhere &&
|
|
|
|
git config branch.main.remote origin &&
|
|
|
|
git config branch.main.merge refs/heads/main &&
|
|
|
|
git for-each-ref --format="%(color:#aa22ac)%(refname)" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2020-12-17 04:07:08 +03:00
|
|
|
test_expect_success 'left alignment is default' '
|
2016-05-09 19:49:00 +03:00
|
|
|
cat >expect <<-\EOF &&
|
2020-10-23 17:00:05 +03:00
|
|
|
refname is refs/heads/main |refs/heads/main
|
2015-09-11 18:03:07 +03:00
|
|
|
refname is refs/heads/side |refs/heads/side
|
|
|
|
refname is refs/odd/spot |refs/odd/spot
|
2016-03-07 03:10:26 +03:00
|
|
|
refname is refs/tags/annotated-tag|refs/tags/annotated-tag
|
|
|
|
refname is refs/tags/doubly-annotated-tag|refs/tags/doubly-annotated-tag
|
2016-03-07 03:10:25 +03:00
|
|
|
refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag
|
2015-09-11 18:03:07 +03:00
|
|
|
refname is refs/tags/four |refs/tags/four
|
|
|
|
refname is refs/tags/one |refs/tags/one
|
|
|
|
refname is refs/tags/signed-tag|refs/tags/signed-tag
|
|
|
|
refname is refs/tags/three |refs/tags/three
|
|
|
|
refname is refs/tags/two |refs/tags/two
|
|
|
|
EOF
|
|
|
|
git for-each-ref --format="%(align:30)refname is %(refname)%(end)|%(refname)" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2020-12-17 04:07:08 +03:00
|
|
|
test_expect_success 'middle alignment' '
|
2016-05-09 19:49:00 +03:00
|
|
|
cat >expect <<-\EOF &&
|
2020-10-23 17:00:05 +03:00
|
|
|
| refname is refs/heads/main |refs/heads/main
|
2015-09-11 18:03:07 +03:00
|
|
|
| refname is refs/heads/side |refs/heads/side
|
|
|
|
| refname is refs/odd/spot |refs/odd/spot
|
2016-03-07 03:10:26 +03:00
|
|
|
|refname is refs/tags/annotated-tag|refs/tags/annotated-tag
|
|
|
|
|refname is refs/tags/doubly-annotated-tag|refs/tags/doubly-annotated-tag
|
2016-03-07 03:10:25 +03:00
|
|
|
|refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag
|
2015-09-11 18:03:07 +03:00
|
|
|
| refname is refs/tags/four |refs/tags/four
|
|
|
|
| refname is refs/tags/one |refs/tags/one
|
|
|
|
|refname is refs/tags/signed-tag|refs/tags/signed-tag
|
|
|
|
| refname is refs/tags/three |refs/tags/three
|
|
|
|
| refname is refs/tags/two |refs/tags/two
|
|
|
|
EOF
|
|
|
|
git for-each-ref --format="|%(align:middle,30)refname is %(refname)%(end)|%(refname)" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2020-12-17 04:07:08 +03:00
|
|
|
test_expect_success 'right alignment' '
|
2016-05-09 19:49:00 +03:00
|
|
|
cat >expect <<-\EOF &&
|
2020-10-23 17:00:05 +03:00
|
|
|
| refname is refs/heads/main|refs/heads/main
|
2015-09-11 18:03:07 +03:00
|
|
|
| refname is refs/heads/side|refs/heads/side
|
|
|
|
| refname is refs/odd/spot|refs/odd/spot
|
2016-03-07 03:10:26 +03:00
|
|
|
|refname is refs/tags/annotated-tag|refs/tags/annotated-tag
|
|
|
|
|refname is refs/tags/doubly-annotated-tag|refs/tags/doubly-annotated-tag
|
2016-03-07 03:10:25 +03:00
|
|
|
|refname is refs/tags/doubly-signed-tag|refs/tags/doubly-signed-tag
|
2015-09-11 18:03:07 +03:00
|
|
|
| refname is refs/tags/four|refs/tags/four
|
|
|
|
| refname is refs/tags/one|refs/tags/one
|
|
|
|
|refname is refs/tags/signed-tag|refs/tags/signed-tag
|
|
|
|
| refname is refs/tags/three|refs/tags/three
|
|
|
|
| refname is refs/tags/two|refs/tags/two
|
|
|
|
EOF
|
|
|
|
git for-each-ref --format="|%(align:30,right)refname is %(refname)%(end)|%(refname)" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2016-05-09 19:49:00 +03:00
|
|
|
cat >expect <<-\EOF
|
2020-10-23 17:00:05 +03:00
|
|
|
| refname is refs/heads/main |refs/heads/main
|
2016-02-17 21:06:16 +03:00
|
|
|
| refname is refs/heads/side |refs/heads/side
|
|
|
|
| refname is refs/odd/spot |refs/odd/spot
|
2016-03-07 03:10:26 +03:00
|
|
|
| refname is refs/tags/annotated-tag |refs/tags/annotated-tag
|
|
|
|
|refname is refs/tags/doubly-annotated-tag |refs/tags/doubly-annotated-tag
|
2016-03-07 03:10:25 +03:00
|
|
|
| refname is refs/tags/doubly-signed-tag |refs/tags/doubly-signed-tag
|
2016-02-17 21:06:16 +03:00
|
|
|
| refname is refs/tags/four |refs/tags/four
|
|
|
|
| refname is refs/tags/one |refs/tags/one
|
|
|
|
| refname is refs/tags/signed-tag |refs/tags/signed-tag
|
|
|
|
| refname is refs/tags/three |refs/tags/three
|
|
|
|
| refname is refs/tags/two |refs/tags/two
|
|
|
|
EOF
|
|
|
|
|
|
|
|
test_align_permutations() {
|
|
|
|
while read -r option
|
|
|
|
do
|
2020-12-17 04:07:08 +03:00
|
|
|
test_expect_success "align:$option" '
|
2016-02-17 21:06:16 +03:00
|
|
|
git for-each-ref --format="|%(align:$option)refname is %(refname)%(end)|%(refname)" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
test_align_permutations <<-\EOF
|
|
|
|
middle,42
|
|
|
|
42,middle
|
|
|
|
position=middle,42
|
|
|
|
42,position=middle
|
|
|
|
middle,width=42
|
|
|
|
width=42,middle
|
|
|
|
position=middle,width=42
|
|
|
|
width=42,position=middle
|
|
|
|
EOF
|
|
|
|
|
|
|
|
# Last one wins (silently) when multiple arguments of the same type are given
|
|
|
|
|
|
|
|
test_align_permutations <<-\EOF
|
|
|
|
32,width=42,middle
|
|
|
|
width=30,42,middle
|
|
|
|
width=42,position=right,middle
|
|
|
|
42,right,position=middle
|
|
|
|
EOF
|
|
|
|
|
2015-09-11 18:03:07 +03:00
|
|
|
# Individual atoms inside %(align:...) and %(end) must not be quoted.
|
|
|
|
|
2020-12-17 04:07:08 +03:00
|
|
|
test_expect_success 'alignment with format quote' "
|
2016-05-09 19:49:00 +03:00
|
|
|
cat >expect <<-\EOF &&
|
2020-10-23 17:00:05 +03:00
|
|
|
|' '\''main| A U Thor'\'' '|
|
2015-09-11 18:03:07 +03:00
|
|
|
|' '\''side| A U Thor'\'' '|
|
|
|
|
|' '\''odd/spot| A U Thor'\'' '|
|
2016-03-07 03:10:26 +03:00
|
|
|
|' '\''annotated-tag| '\'' '|
|
|
|
|
|' '\''doubly-annotated-tag| '\'' '|
|
2016-03-07 03:10:25 +03:00
|
|
|
|' '\''doubly-signed-tag| '\'' '|
|
2015-09-11 18:03:07 +03:00
|
|
|
|' '\''four| A U Thor'\'' '|
|
|
|
|
|' '\''one| A U Thor'\'' '|
|
|
|
|
|' '\''signed-tag| '\'' '|
|
|
|
|
|' '\''three| A U Thor'\'' '|
|
|
|
|
|' '\''two| A U Thor'\'' '|
|
|
|
|
EOF
|
|
|
|
git for-each-ref --shell --format=\"|%(align:30,middle)'%(refname:short)| %(authorname)'%(end)|\" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
"
|
|
|
|
|
2020-12-17 04:07:08 +03:00
|
|
|
test_expect_success 'nested alignment with quote formatting' "
|
2016-05-09 19:49:00 +03:00
|
|
|
cat >expect <<-\EOF &&
|
2020-10-23 17:00:05 +03:00
|
|
|
|' main '|
|
2015-09-11 18:03:07 +03:00
|
|
|
|' side '|
|
|
|
|
|' odd/spot '|
|
2016-03-07 03:10:26 +03:00
|
|
|
|' annotated-tag '|
|
|
|
|
|'doubly-annotated-tag '|
|
2016-03-07 03:10:25 +03:00
|
|
|
|'doubly-signed-tag '|
|
2015-09-11 18:03:07 +03:00
|
|
|
|' four '|
|
|
|
|
|' one '|
|
|
|
|
|' signed-tag '|
|
|
|
|
|' three '|
|
|
|
|
|' two '|
|
|
|
|
EOF
|
|
|
|
git for-each-ref --shell --format='|%(align:30,left)%(align:15,right)%(refname:short)%(end)%(end)|' >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
"
|
|
|
|
|
2015-09-11 18:04:16 +03:00
|
|
|
test_expect_success 'check `%(contents:lines=1)`' '
|
2016-05-09 19:49:00 +03:00
|
|
|
cat >expect <<-\EOF &&
|
2020-12-17 04:07:08 +03:00
|
|
|
main |three
|
2015-09-11 18:04:16 +03:00
|
|
|
side |four
|
|
|
|
odd/spot |three
|
2016-03-07 03:10:26 +03:00
|
|
|
annotated-tag |An annotated tag
|
|
|
|
doubly-annotated-tag |Annonated doubly
|
2016-03-07 03:10:25 +03:00
|
|
|
doubly-signed-tag |Signed doubly
|
2015-09-11 18:04:16 +03:00
|
|
|
four |four
|
|
|
|
one |one
|
2016-03-07 03:10:25 +03:00
|
|
|
signed-tag |A signed tag
|
2015-09-11 18:04:16 +03:00
|
|
|
three |three
|
|
|
|
two |two
|
|
|
|
EOF
|
|
|
|
git for-each-ref --format="%(refname:short) |%(contents:lines=1)" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check `%(contents:lines=0)`' '
|
2016-05-09 19:49:00 +03:00
|
|
|
cat >expect <<-\EOF &&
|
2020-12-17 04:07:08 +03:00
|
|
|
main |
|
2015-09-11 18:04:16 +03:00
|
|
|
side |
|
|
|
|
odd/spot |
|
2016-03-07 03:10:26 +03:00
|
|
|
annotated-tag |
|
|
|
|
doubly-annotated-tag |
|
2016-03-07 03:10:25 +03:00
|
|
|
doubly-signed-tag |
|
2015-09-11 18:04:16 +03:00
|
|
|
four |
|
|
|
|
one |
|
|
|
|
signed-tag |
|
|
|
|
three |
|
|
|
|
two |
|
|
|
|
EOF
|
|
|
|
git for-each-ref --format="%(refname:short) |%(contents:lines=0)" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check `%(contents:lines=99999)`' '
|
2016-05-09 19:49:00 +03:00
|
|
|
cat >expect <<-\EOF &&
|
2020-12-17 04:07:08 +03:00
|
|
|
main |three
|
2015-09-11 18:04:16 +03:00
|
|
|
side |four
|
|
|
|
odd/spot |three
|
2016-03-07 03:10:26 +03:00
|
|
|
annotated-tag |An annotated tag
|
|
|
|
doubly-annotated-tag |Annonated doubly
|
2016-03-07 03:10:25 +03:00
|
|
|
doubly-signed-tag |Signed doubly
|
2015-09-11 18:04:16 +03:00
|
|
|
four |four
|
|
|
|
one |one
|
2016-03-07 03:10:25 +03:00
|
|
|
signed-tag |A signed tag
|
2015-09-11 18:04:16 +03:00
|
|
|
three |three
|
|
|
|
two |two
|
|
|
|
EOF
|
|
|
|
git for-each-ref --format="%(refname:short) |%(contents:lines=99999)" >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '`%(contents:lines=-1)` should fail' '
|
|
|
|
test_must_fail git for-each-ref --format="%(refname:short) |%(contents:lines=-1)"
|
|
|
|
'
|
|
|
|
|
2015-09-10 18:48:25 +03:00
|
|
|
test_expect_success 'setup for version sort' '
|
|
|
|
test_commit foo1.3 &&
|
|
|
|
test_commit foo1.6 &&
|
|
|
|
test_commit foo1.10
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'version sort' '
|
|
|
|
git for-each-ref --sort=version:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
foo1.3
|
|
|
|
foo1.6
|
|
|
|
foo1.10
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'version sort (shortened)' '
|
|
|
|
git for-each-ref --sort=v:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
foo1.3
|
|
|
|
foo1.6
|
|
|
|
foo1.10
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'reverse version sort' '
|
|
|
|
git for-each-ref --sort=-version:refname --format="%(refname:short)" refs/tags/ | grep "foo" >actual &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
foo1.10
|
|
|
|
foo1.6
|
|
|
|
foo1.3
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2017-01-10 11:49:34 +03:00
|
|
|
test_expect_success 'improper usage of %(if), %(then), %(else) and %(end) atoms' '
|
|
|
|
test_must_fail git for-each-ref --format="%(if)" &&
|
|
|
|
test_must_fail git for-each-ref --format="%(then) %(end)" &&
|
|
|
|
test_must_fail git for-each-ref --format="%(else) %(end)" &&
|
|
|
|
test_must_fail git for-each-ref --format="%(if) %(else) %(end)" &&
|
|
|
|
test_must_fail git for-each-ref --format="%(if) %(then) %(then) %(end)" &&
|
|
|
|
test_must_fail git for-each-ref --format="%(then) %(else) %(end)" &&
|
|
|
|
test_must_fail git for-each-ref --format="%(if) %(else) %(end)" &&
|
|
|
|
test_must_fail git for-each-ref --format="%(if) %(then) %(else)" &&
|
|
|
|
test_must_fail git for-each-ref --format="%(if) %(else) %(then) %(end)" &&
|
|
|
|
test_must_fail git for-each-ref --format="%(if) %(then) %(else) %(else) %(end)" &&
|
|
|
|
test_must_fail git for-each-ref --format="%(if) %(end)"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check %(if)...%(then)...%(end) atoms' '
|
|
|
|
git for-each-ref --format="%(refname)%(if)%(authorname)%(then) Author: %(authorname)%(end)" >actual &&
|
|
|
|
cat >expect <<-\EOF &&
|
2020-12-17 04:07:08 +03:00
|
|
|
refs/heads/main Author: A U Thor
|
2017-01-10 11:49:34 +03:00
|
|
|
refs/heads/side Author: A U Thor
|
|
|
|
refs/odd/spot Author: A U Thor
|
|
|
|
refs/tags/annotated-tag
|
|
|
|
refs/tags/doubly-annotated-tag
|
|
|
|
refs/tags/doubly-signed-tag
|
|
|
|
refs/tags/foo1.10 Author: A U Thor
|
|
|
|
refs/tags/foo1.3 Author: A U Thor
|
|
|
|
refs/tags/foo1.6 Author: A U Thor
|
|
|
|
refs/tags/four Author: A U Thor
|
|
|
|
refs/tags/one Author: A U Thor
|
|
|
|
refs/tags/signed-tag
|
|
|
|
refs/tags/three Author: A U Thor
|
|
|
|
refs/tags/two Author: A U Thor
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check %(if)...%(then)...%(else)...%(end) atoms' '
|
|
|
|
git for-each-ref --format="%(if)%(authorname)%(then)%(authorname)%(else)No author%(end): %(refname)" >actual &&
|
|
|
|
cat >expect <<-\EOF &&
|
2020-12-17 04:07:08 +03:00
|
|
|
A U Thor: refs/heads/main
|
2017-01-10 11:49:34 +03:00
|
|
|
A U Thor: refs/heads/side
|
|
|
|
A U Thor: refs/odd/spot
|
|
|
|
No author: refs/tags/annotated-tag
|
|
|
|
No author: refs/tags/doubly-annotated-tag
|
|
|
|
No author: refs/tags/doubly-signed-tag
|
|
|
|
A U Thor: refs/tags/foo1.10
|
|
|
|
A U Thor: refs/tags/foo1.3
|
|
|
|
A U Thor: refs/tags/foo1.6
|
|
|
|
A U Thor: refs/tags/four
|
|
|
|
A U Thor: refs/tags/one
|
|
|
|
No author: refs/tags/signed-tag
|
|
|
|
A U Thor: refs/tags/three
|
|
|
|
A U Thor: refs/tags/two
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
test_expect_success 'ignore spaces in %(if) atom usage' '
|
|
|
|
git for-each-ref --format="%(refname:short): %(if)%(HEAD)%(then)Head ref%(else)Not Head ref%(end)" >actual &&
|
|
|
|
cat >expect <<-\EOF &&
|
2020-12-17 04:07:08 +03:00
|
|
|
main: Head ref
|
2017-01-10 11:49:34 +03:00
|
|
|
side: Not Head ref
|
|
|
|
odd/spot: Not Head ref
|
|
|
|
annotated-tag: Not Head ref
|
|
|
|
doubly-annotated-tag: Not Head ref
|
|
|
|
doubly-signed-tag: Not Head ref
|
|
|
|
foo1.10: Not Head ref
|
|
|
|
foo1.3: Not Head ref
|
|
|
|
foo1.6: Not Head ref
|
|
|
|
four: Not Head ref
|
|
|
|
one: Not Head ref
|
|
|
|
signed-tag: Not Head ref
|
|
|
|
three: Not Head ref
|
|
|
|
two: Not Head ref
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2017-01-10 11:49:36 +03:00
|
|
|
test_expect_success 'check %(if:equals=<string>)' '
|
2020-12-17 04:07:08 +03:00
|
|
|
git for-each-ref --format="%(if:equals=main)%(refname:short)%(then)Found main%(else)Not main%(end)" refs/heads/ >actual &&
|
2017-01-10 11:49:36 +03:00
|
|
|
cat >expect <<-\EOF &&
|
2020-12-17 04:07:08 +03:00
|
|
|
Found main
|
|
|
|
Not main
|
2017-01-10 11:49:36 +03:00
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'check %(if:notequals=<string>)' '
|
2020-12-17 04:07:08 +03:00
|
|
|
git for-each-ref --format="%(if:notequals=main)%(refname:short)%(then)Not main%(else)Found main%(end)" refs/heads/ >actual &&
|
2017-01-10 11:49:36 +03:00
|
|
|
cat >expect <<-\EOF &&
|
2020-12-17 04:07:08 +03:00
|
|
|
Found main
|
|
|
|
Not main
|
2017-01-10 11:49:36 +03:00
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2020-09-16 05:08:40 +03:00
|
|
|
test_expect_success '--merged is compatible with --no-merged' '
|
|
|
|
git for-each-ref --merged HEAD --no-merged HEAD
|
2017-03-21 15:58:49 +03:00
|
|
|
'
|
|
|
|
|
2019-04-29 08:19:42 +03:00
|
|
|
test_expect_success 'validate worktree atom' '
|
|
|
|
cat >expect <<-EOF &&
|
2020-12-17 04:07:08 +03:00
|
|
|
main: $(pwd)
|
|
|
|
main_worktree: $(pwd)/worktree_dir
|
2019-04-29 08:19:42 +03:00
|
|
|
side: not checked out
|
|
|
|
EOF
|
2020-12-17 04:07:08 +03:00
|
|
|
git worktree add -b main_worktree worktree_dir main &&
|
2019-04-29 08:19:42 +03:00
|
|
|
git for-each-ref --format="%(refname:short): %(if)%(worktreepath)%(then)%(worktreepath)%(else)not checked out%(end)" refs/heads/ >actual &&
|
|
|
|
rm -r worktree_dir &&
|
|
|
|
git worktree prune &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2015-07-09 09:03:21 +03:00
|
|
|
test_done
|