git/t/t6018-rev-list-glob.sh

381 lines
9.7 KiB
Bash
Raw Normal View History

#!/bin/sh
test_description='rev-list/rev-parse --glob'
. ./test-lib.sh
commit () {
test_tick &&
echo $1 > foo &&
git add foo &&
git commit -m "$1"
}
compare () {
# Split arguments on whitespace.
git $1 $2 >expected &&
git $1 $3 >actual &&
test_cmp expected actual
}
test_expect_success 'setup' '
commit master &&
git checkout -b subspace/one master &&
commit one &&
git checkout -b subspace/two master &&
commit two &&
git checkout -b subspace-x master &&
commit subspace-x &&
git checkout -b other/three master &&
commit three &&
git checkout -b someref master &&
commit some &&
git checkout master &&
commit master2 &&
git tag foo/bar master &&
commit master3 &&
git update-ref refs/remotes/foo/baz master &&
commit master4 &&
git update-ref refs/remotes/upstream/one subspace/one &&
git update-ref refs/remotes/upstream/two subspace/two &&
git update-ref refs/remotes/upstream/x subspace-x &&
git tag qux/one subspace/one &&
git tag qux/two subspace/two &&
git tag qux/x subspace-x
'
test_expect_success 'rev-parse --glob=refs/heads/subspace/*' '
compare rev-parse "subspace/one subspace/two" "--glob=refs/heads/subspace/*"
'
test_expect_success 'rev-parse --glob=heads/subspace/*' '
compare rev-parse "subspace/one subspace/two" "--glob=heads/subspace/*"
'
test_expect_success 'rev-parse --glob=refs/heads/subspace/' '
compare rev-parse "subspace/one subspace/two" "--glob=refs/heads/subspace/"
'
test_expect_success 'rev-parse --glob=heads/subspace/' '
compare rev-parse "subspace/one subspace/two" "--glob=heads/subspace/"
'
test_expect_success 'rev-parse --glob=heads/subspace' '
compare rev-parse "subspace/one subspace/two" "--glob=heads/subspace"
'
test_expect_failure 'rev-parse accepts --glob as detached option' '
compare rev-parse "subspace/one subspace/two" "--glob heads/subspace"
'
test_expect_failure 'rev-parse is not confused by option-like glob' '
compare rev-parse "master" "--glob --symbolic master"
'
test_expect_success 'rev-parse --branches=subspace/*' '
compare rev-parse "subspace/one subspace/two" "--branches=subspace/*"
'
test_expect_success 'rev-parse --branches=subspace/' '
compare rev-parse "subspace/one subspace/two" "--branches=subspace/"
'
test_expect_success 'rev-parse --branches=subspace' '
compare rev-parse "subspace/one subspace/two" "--branches=subspace"
'
test_expect_success 'rev-parse --glob=heads/subspace/* --glob=heads/other/*' '
compare rev-parse "subspace/one subspace/two other/three" "--glob=heads/subspace/* --glob=heads/other/*"
'
test_expect_success 'rev-parse --glob=heads/someref/* master' '
compare rev-parse "master" "--glob=heads/someref/* master"
'
test_expect_success 'rev-parse --glob=heads/*' '
compare rev-parse "master other/three someref subspace-x subspace/one subspace/two" "--glob=heads/*"
'
test_expect_success 'rev-parse --tags=foo' '
compare rev-parse "foo/bar" "--tags=foo"
'
test_expect_success 'rev-parse --remotes=foo' '
compare rev-parse "foo/baz" "--remotes=foo"
'
test_expect_success 'rev-parse --exclude with --branches' '
compare rev-parse "--exclude=*/* --branches" "master someref subspace-x"
'
test_expect_success 'rev-parse --exclude with --all' '
compare rev-parse "--exclude=refs/remotes/* --all" "--branches --tags"
'
test_expect_success 'rev-parse accumulates multiple --exclude' '
compare rev-parse "--exclude=refs/remotes/* --exclude=refs/tags/* --all" --branches
'
test_expect_success 'rev-parse --branches clears --exclude' '
compare rev-parse "--exclude=* --branches --branches" "--branches"
'
test_expect_success 'rev-parse --tags clears --exclude' '
compare rev-parse "--exclude=* --tags --tags" "--tags"
'
test_expect_success 'rev-parse --all clears --exclude' '
compare rev-parse "--exclude=* --all --all" "--all"
'
test_expect_success 'rev-parse --exclude=glob with --branches=glob' '
compare rev-parse "--exclude=subspace-* --branches=sub*" "subspace/one subspace/two"
'
test_expect_success 'rev-parse --exclude=glob with --tags=glob' '
compare rev-parse "--exclude=qux/? --tags=qux/*" "qux/one qux/two"
'
test_expect_success 'rev-parse --exclude=glob with --remotes=glob' '
compare rev-parse "--exclude=upstream/? --remotes=upstream/*" "upstream/one upstream/two"
'
test_expect_success 'rev-parse --exclude=ref with --branches=glob' '
compare rev-parse "--exclude=subspace-x --branches=sub*" "subspace/one subspace/two"
'
test_expect_success 'rev-parse --exclude=ref with --tags=glob' '
compare rev-parse "--exclude=qux/x --tags=qux/*" "qux/one qux/two"
'
test_expect_success 'rev-parse --exclude=ref with --remotes=glob' '
compare rev-parse "--exclude=upstream/x --remotes=upstream/*" "upstream/one upstream/two"
'
test_expect_success 'rev-list --exclude=glob with --branches=glob' '
compare rev-list "--exclude=subspace-* --branches=sub*" "subspace/one subspace/two"
'
test_expect_success 'rev-list --exclude=glob with --tags=glob' '
compare rev-list "--exclude=qux/? --tags=qux/*" "qux/one qux/two"
'
test_expect_success 'rev-list --exclude=glob with --remotes=glob' '
compare rev-list "--exclude=upstream/? --remotes=upstream/*" "upstream/one upstream/two"
'
test_expect_success 'rev-list --exclude=ref with --branches=glob' '
compare rev-list "--exclude=subspace-x --branches=sub*" "subspace/one subspace/two"
'
test_expect_success 'rev-list --exclude=ref with --tags=glob' '
compare rev-list "--exclude=qux/x --tags=qux/*" "qux/one qux/two"
'
test_expect_success 'rev-list --exclude=ref with --remotes=glob' '
compare rev-list "--exclude=upstream/x --remotes=upstream/*" "upstream/one upstream/two"
'
test_expect_success 'rev-list --glob=refs/heads/subspace/*' '
compare rev-list "subspace/one subspace/two" "--glob=refs/heads/subspace/*"
'
test_expect_success 'rev-list --glob refs/heads/subspace/*' '
compare rev-list "subspace/one subspace/two" "--glob refs/heads/subspace/*"
'
test_expect_success 'rev-list not confused by option-like --glob arg' '
compare rev-list "master" "--glob -0 master"
'
test_expect_success 'rev-list --glob=heads/subspace/*' '
compare rev-list "subspace/one subspace/two" "--glob=heads/subspace/*"
'
test_expect_success 'rev-list --glob=refs/heads/subspace/' '
compare rev-list "subspace/one subspace/two" "--glob=refs/heads/subspace/"
'
test_expect_success 'rev-list --glob=heads/subspace/' '
compare rev-list "subspace/one subspace/two" "--glob=heads/subspace/"
'
test_expect_success 'rev-list --glob=heads/subspace' '
compare rev-list "subspace/one subspace/two" "--glob=heads/subspace"
'
test_expect_success 'rev-list --branches=subspace/*' '
compare rev-list "subspace/one subspace/two" "--branches=subspace/*"
'
test_expect_success 'rev-list --branches=subspace/' '
compare rev-list "subspace/one subspace/two" "--branches=subspace/"
'
test_expect_success 'rev-list --branches=subspace' '
compare rev-list "subspace/one subspace/two" "--branches=subspace"
'
test_expect_success 'rev-list --branches' '
compare rev-list "master subspace-x someref other/three subspace/one subspace/two" "--branches"
'
test_expect_success 'rev-list --glob=heads/someref/* master' '
compare rev-list "master" "--glob=heads/someref/* master"
'
test_expect_success 'rev-list --glob=heads/subspace/* --glob=heads/other/*' '
compare rev-list "subspace/one subspace/two other/three" "--glob=heads/subspace/* --glob=heads/other/*"
'
test_expect_success 'rev-list --glob=heads/*' '
compare rev-list "master other/three someref subspace-x subspace/one subspace/two" "--glob=heads/*"
'
test_expect_success 'rev-list --tags=foo' '
compare rev-list "foo/bar" "--tags=foo"
'
test_expect_success 'rev-list --tags' '
compare rev-list "foo/bar qux/x qux/two qux/one" "--tags"
'
test_expect_success 'rev-list --remotes=foo' '
compare rev-list "foo/baz" "--remotes=foo"
'
test_expect_success 'rev-list --exclude with --branches' '
compare rev-list "--exclude=*/* --branches" "master someref subspace-x"
'
test_expect_success 'rev-list --exclude with --all' '
compare rev-list "--exclude=refs/remotes/* --all" "--branches --tags"
'
test_expect_success 'rev-list accumulates multiple --exclude' '
compare rev-list "--exclude=refs/remotes/* --exclude=refs/tags/* --all" --branches
'
rev-list: make empty --stdin not an error When we originally did the series that contains 7ba826290a (revision: add rev_input_given flag, 2017-08-02) the intent was that "git rev-list --stdin </dev/null" would similarly become a successful noop. However, an attempt at the time to do that did not work[1]. The problem is that rev_input_given serves two roles: - it tells rev-list.c that it should not error out - it tells revision.c that it should not have the "default" ref kick (e.g., "HEAD" in "git log") We want to trigger the former, but not the latter. This is technically possible with a single flag, if we set the flag only after revision.c's revs->def check. But this introduces a rather subtle ordering dependency. Instead, let's keep two flags: one to denote when we got actual input (which triggers both roles) and one for when we read stdin (which triggers only the first). This does mean a caller interested in the first role has to check both flags, but there's only one such caller. And any future callers might want to make the distinction anyway (e.g., if they care less about erroring out, and more about whether revision.c soaked up our stdin). In fact, we already keep such a flag internally in revision.c for this purpose, so this is really just exposing that to the caller (and the old function-local flag can go away in favor of our new one). [1] https://public-inbox.org/git/20170802223416.gwiezhbuxbdmbjzx@sigill.intra.peff.net/ Helped-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-08-22 21:37:23 +00:00
test_expect_success 'rev-list should succeed with empty output on empty stdin' '
git rev-list --stdin </dev/null >actual &&
test_must_be_empty actual
'
test_expect_success 'rev-list should succeed with empty output with all refs excluded' '
git rev-list --exclude=* --all >actual &&
test_must_be_empty actual
'
test_expect_success 'rev-list should succeed with empty output with empty --all' '
(
test_create_repo empty &&
cd empty &&
git rev-list --all >actual &&
test_must_be_empty actual
)
'
test_expect_success 'rev-list should succeed with empty output with empty glob' '
git rev-list --glob=does-not-match-anything >actual &&
test_must_be_empty actual
'
test_expect_success 'shortlog accepts --glob/--tags/--remotes' '
compare shortlog "subspace/one subspace/two" --branches=subspace &&
compare shortlog \
"master subspace-x someref other/three subspace/one subspace/two" \
--branches &&
compare shortlog master "--glob=heads/someref/* master" &&
compare shortlog "subspace/one subspace/two other/three" \
"--glob=heads/subspace/* --glob=heads/other/*" &&
compare shortlog \
"master other/three someref subspace-x subspace/one subspace/two" \
"--glob=heads/*" &&
compare shortlog foo/bar --tags=foo &&
compare shortlog "foo/bar qux/one qux/two qux/x" --tags &&
compare shortlog foo/baz --remotes=foo
'
test_expect_failure 'shortlog accepts --glob as detached option' '
compare shortlog \
"master other/three someref subspace-x subspace/one subspace/two" \
"--glob heads/*"
'
test_expect_failure 'shortlog --glob is not confused by option-like argument' '
compare shortlog master "--glob -e master"
'
test_done