Merge branch 'ps/revision-cmdline-stdin-not' into next
"git rev-list --stdin" learned to take non-revisions (like "--not") recently from the standard input, but the way such a "--not" was handled was quite confusing, which has been rethought. This is potentially a change that breaks backward compatibility. * ps/revision-cmdline-stdin-not: revision: make pseudo-opt flags read via stdin behave consistently
This commit is contained in:
@ -151,6 +151,10 @@ endif::git-log[]
|
||||
--not::
|
||||
Reverses the meaning of the '{caret}' prefix (or lack thereof)
|
||||
for all following revision specifiers, up to the next `--not`.
|
||||
When used on the command line before --stdin, the revisions passed
|
||||
through stdin will not be affected by it. Conversely, when passed
|
||||
via standard input, the revisions passed on the command line will
|
||||
not be affected by it.
|
||||
|
||||
--all::
|
||||
Pretend as if all the refs in `refs/`, along with `HEAD`, are
|
||||
@ -240,7 +244,9 @@ endif::git-rev-list[]
|
||||
them from standard input as well. This accepts commits and
|
||||
pseudo-options like `--all` and `--glob=`. When a `--` separator
|
||||
is seen, the following input is treated as paths and used to
|
||||
limit the result.
|
||||
limit the result. Flags like `--not` which are read via standard input
|
||||
are only respected for arguments passed in the same way and will not
|
||||
influence any subsequent command line arguments.
|
||||
|
||||
ifdef::git-rev-list[]
|
||||
--quiet::
|
||||
|
10
revision.c
10
revision.c
@ -2790,13 +2790,13 @@ static int handle_revision_pseudo_opt(struct rev_info *revs,
|
||||
}
|
||||
|
||||
static void read_revisions_from_stdin(struct rev_info *revs,
|
||||
struct strvec *prune,
|
||||
int *flags)
|
||||
struct strvec *prune)
|
||||
{
|
||||
struct strbuf sb;
|
||||
int seen_dashdash = 0;
|
||||
int seen_end_of_options = 0;
|
||||
int save_warning;
|
||||
int flags = 0;
|
||||
|
||||
save_warning = warn_on_object_refname_ambiguity;
|
||||
warn_on_object_refname_ambiguity = 0;
|
||||
@ -2819,13 +2819,13 @@ static void read_revisions_from_stdin(struct rev_info *revs,
|
||||
continue;
|
||||
}
|
||||
|
||||
if (handle_revision_pseudo_opt(revs, argv, flags) > 0)
|
||||
if (handle_revision_pseudo_opt(revs, argv, &flags) > 0)
|
||||
continue;
|
||||
|
||||
die(_("invalid option '%s' in --stdin mode"), sb.buf);
|
||||
}
|
||||
|
||||
if (handle_revision_arg(sb.buf, revs, 0,
|
||||
if (handle_revision_arg(sb.buf, revs, flags,
|
||||
REVARG_CANNOT_BE_FILENAME))
|
||||
die("bad revision '%s'", sb.buf);
|
||||
}
|
||||
@ -2908,7 +2908,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
|
||||
}
|
||||
if (revs->read_from_stdin++)
|
||||
die("--stdin given twice?");
|
||||
read_revisions_from_stdin(revs, &prune_data, &flags);
|
||||
read_revisions_from_stdin(revs, &prune_data);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -68,6 +68,7 @@ check --glob=refs/heads
|
||||
check --glob=refs/heads --
|
||||
check --glob=refs/heads -- file-1
|
||||
check --end-of-options -dashed-branch
|
||||
check --all --not refs/heads/main
|
||||
|
||||
test_expect_success 'not only --stdin' '
|
||||
cat >expect <<-EOF &&
|
||||
@ -127,4 +128,24 @@ test_expect_success 'unknown option without --end-of-options' '
|
||||
test_cmp expect error
|
||||
'
|
||||
|
||||
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
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Reference in New Issue
Block a user