name-rev: deprecate --stdin in favor of --annotate-stdin

Introduce a --annotate-stdin that is functionally equivalent of --stdin.
--stdin does not behave as --stdin in other subcommands, such as
pack-objects whereby it takes one argument per line. Since --stdin can
be a confusing and misleading name, rename it to --annotate-stdin.

This change adds a warning to --stdin warning that it will be removed in
the future.

Signed-off-by: "John Cai" <johncai86@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
John Cai 2022-01-05 23:29:31 +00:00 committed by Junio C Hamano
parent 2ae0a9cb82
commit 34ae3b7071
8 changed files with 67 additions and 26 deletions

View File

@ -42,11 +42,37 @@ OPTIONS
--all:: --all::
List all commits reachable from all refs List all commits reachable from all refs
--stdin:: --annotate-stdin::
Transform stdin by substituting all the 40-character SHA-1 Transform stdin by substituting all the 40-character SHA-1
hexes (say $hex) with "$hex ($rev_name)". When used with hexes (say $hex) with "$hex ($rev_name)". When used with
--name-only, substitute with "$rev_name", omitting $hex --name-only, substitute with "$rev_name", omitting $hex
altogether. Intended for the scripter's use. altogether.
+
For example:
+
-----------
$ cat sample.txt
An abbreviated revision 2ae0a9cb82 will not be substituted.
The full name after substitution is 2ae0a9cb8298185a94e5998086f380a355dd8907,
while its tree object is 70d105cc79e63b81cfdcb08a15297c23e60b07ad
$ git name-rev --annotate-stdin <sample.txt
An abbreviated revision 2ae0a9cb82 will not be substituted.
The full name after substitution is 2ae0a9cb8298185a94e5998086f380a355dd8907 (master),
while its tree object is 70d105cc79e63b81cfdcb08a15297c23e60b07ad
$ git name-rev --name-only --annotate-stdin <sample.txt
An abbreviated revision 2ae0a9cb82 will not be substituted.
The full name after substitution is master,
while its tree object is 70d105cc79e63b81cfdcb08a15297c23e60b07ad
-----------
--stdin::
This option is deprecated in favor of 'git name-rev --annotate-stdin'.
They are functionally equivalent.
--name-only:: --name-only::
Instead of printing both the SHA-1 and the name, print only Instead of printing both the SHA-1 and the name, print only

View File

@ -527,7 +527,7 @@ static void name_rev_line(char *p, struct name_ref_data *data)
int cmd_name_rev(int argc, const char **argv, const char *prefix) int cmd_name_rev(int argc, const char **argv, const char *prefix)
{ {
struct object_array revs = OBJECT_ARRAY_INIT; struct object_array revs = OBJECT_ARRAY_INIT;
int all = 0, transform_stdin = 0, allow_undefined = 1, always = 0, peel_tag = 0; int all = 0, annotate_stdin = 0, transform_stdin = 0, allow_undefined = 1, always = 0, peel_tag = 0;
struct name_ref_data data = { 0, 0, STRING_LIST_INIT_NODUP, STRING_LIST_INIT_NODUP }; struct name_ref_data data = { 0, 0, STRING_LIST_INIT_NODUP, STRING_LIST_INIT_NODUP };
struct option opts[] = { struct option opts[] = {
OPT_BOOL(0, "name-only", &data.name_only, N_("print only ref-based names (no object names)")), OPT_BOOL(0, "name-only", &data.name_only, N_("print only ref-based names (no object names)")),
@ -538,7 +538,8 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
N_("ignore refs matching <pattern>")), N_("ignore refs matching <pattern>")),
OPT_GROUP(""), OPT_GROUP(""),
OPT_BOOL(0, "all", &all, N_("list all commits reachable from all refs")), OPT_BOOL(0, "all", &all, N_("list all commits reachable from all refs")),
OPT_BOOL(0, "stdin", &transform_stdin, N_("read from stdin")), OPT_BOOL(0, "stdin", &transform_stdin, N_("deprecated: use annotate-stdin instead")),
OPT_BOOL(0, "annotate-stdin", &annotate_stdin, N_("annotate text from stdin")),
OPT_BOOL(0, "undefined", &allow_undefined, N_("allow to print `undefined` names (default)")), OPT_BOOL(0, "undefined", &allow_undefined, N_("allow to print `undefined` names (default)")),
OPT_BOOL(0, "always", &always, OPT_BOOL(0, "always", &always,
N_("show abbreviated commit object as fallback")), N_("show abbreviated commit object as fallback")),
@ -554,11 +555,19 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
init_commit_rev_name(&rev_names); init_commit_rev_name(&rev_names);
git_config(git_default_config, NULL); git_config(git_default_config, NULL);
argc = parse_options(argc, argv, prefix, opts, name_rev_usage, 0); argc = parse_options(argc, argv, prefix, opts, name_rev_usage, 0);
if (all + transform_stdin + !!argc > 1) {
if (transform_stdin) {
warning("--stdin is deprecated. Please use --annotate-stdin instead, "
"which is functionally equivalent.\n"
"This option will be removed in a future release.");
annotate_stdin = 1;
}
if (all + annotate_stdin + !!argc > 1) {
error("Specify either a list, or --all, not both!"); error("Specify either a list, or --all, not both!");
usage_with_options(name_rev_usage, opts); usage_with_options(name_rev_usage, opts);
} }
if (all || transform_stdin) if (all || annotate_stdin)
cutoff = 0; cutoff = 0;
for (; argc; argc--, argv++) { for (; argc; argc--, argv++) {
@ -613,7 +622,7 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
for_each_ref(name_ref, &data); for_each_ref(name_ref, &data);
name_tips(); name_tips();
if (transform_stdin) { if (annotate_stdin) {
char buffer[2048]; char buffer[2048];
while (!feof(stdin)) { while (!feof(stdin)) {

View File

@ -11,7 +11,7 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
log_with_names () { log_with_names () {
git rev-list --topo-order --parents --pretty="tformat:%s" HEAD | git rev-list --topo-order --parents --pretty="tformat:%s" HEAD |
git name-rev --stdin --name-only --refs=refs/heads/$1 git name-rev --annotate-stdin --name-only --refs=refs/heads/$1
} }

View File

@ -659,7 +659,7 @@ EOF
test_expect_success 'log --graph with full output' ' test_expect_success 'log --graph with full output' '
git log --graph --date-order --pretty=short | git log --graph --date-order --pretty=short |
git name-rev --name-only --stdin | git name-rev --name-only --annotate-stdin |
sed "s/Merge:.*/Merge: A B/;s/ *\$//" >actual && sed "s/Merge:.*/Merge: A B/;s/ *\$//" >actual &&
test_cmp expect actual test_cmp expect actual
' '

View File

@ -58,7 +58,7 @@ EOF
test_expect_success '--left-right' ' test_expect_success '--left-right' '
git rev-list --left-right B...C > actual && git rev-list --left-right B...C > actual &&
git name-rev --stdin --name-only --refs="*tags/*" \ git name-rev --annotate-stdin --name-only --refs="*tags/*" \
< actual > actual.named && < actual > actual.named &&
test_cmp expect actual.named test_cmp expect actual.named
' '
@ -78,14 +78,14 @@ EOF
test_expect_success '--cherry-pick bar does not come up empty' ' test_expect_success '--cherry-pick bar does not come up empty' '
git rev-list --left-right --cherry-pick B...C -- bar > actual && git rev-list --left-right --cherry-pick B...C -- bar > actual &&
git name-rev --stdin --name-only --refs="*tags/*" \ git name-rev --annotate-stdin --name-only --refs="*tags/*" \
< actual > actual.named && < actual > actual.named &&
test_cmp expect actual.named test_cmp expect actual.named
' '
test_expect_success 'bar does not come up empty' ' test_expect_success 'bar does not come up empty' '
git rev-list --left-right B...C -- bar > actual && git rev-list --left-right B...C -- bar > actual &&
git name-rev --stdin --name-only --refs="*tags/*" \ git name-rev --annotate-stdin --name-only --refs="*tags/*" \
< actual > actual.named && < actual > actual.named &&
test_cmp expect actual.named test_cmp expect actual.named
' '
@ -97,14 +97,14 @@ EOF
test_expect_success '--cherry-pick bar does not come up empty (II)' ' test_expect_success '--cherry-pick bar does not come up empty (II)' '
git rev-list --left-right --cherry-pick F...E -- bar > actual && git rev-list --left-right --cherry-pick F...E -- bar > actual &&
git name-rev --stdin --name-only --refs="*tags/*" \ git name-rev --annotate-stdin --name-only --refs="*tags/*" \
< actual > actual.named && < actual > actual.named &&
test_cmp expect actual.named test_cmp expect actual.named
' '
test_expect_success 'name-rev multiple --refs combine inclusive' ' test_expect_success 'name-rev multiple --refs combine inclusive' '
git rev-list --left-right --cherry-pick F...E -- bar >actual && git rev-list --left-right --cherry-pick F...E -- bar >actual &&
git name-rev --stdin --name-only --refs="*tags/F" --refs="*tags/E" \ git name-rev --annotate-stdin --name-only --refs="*tags/F" --refs="*tags/E" \
<actual >actual.named && <actual >actual.named &&
test_cmp expect actual.named test_cmp expect actual.named
' '
@ -116,7 +116,7 @@ EOF
test_expect_success 'name-rev --refs excludes non-matched patterns' ' test_expect_success 'name-rev --refs excludes non-matched patterns' '
git rev-list --left-right --right-only --cherry-pick F...E -- bar >>expect && git rev-list --left-right --right-only --cherry-pick F...E -- bar >>expect &&
git rev-list --left-right --cherry-pick F...E -- bar >actual && git rev-list --left-right --cherry-pick F...E -- bar >actual &&
git name-rev --stdin --name-only --refs="*tags/F" \ git name-rev --annotate-stdin --name-only --refs="*tags/F" \
<actual >actual.named && <actual >actual.named &&
test_cmp expect actual.named test_cmp expect actual.named
' '
@ -128,14 +128,14 @@ EOF
test_expect_success 'name-rev --exclude excludes matched patterns' ' test_expect_success 'name-rev --exclude excludes matched patterns' '
git rev-list --left-right --right-only --cherry-pick F...E -- bar >>expect && git rev-list --left-right --right-only --cherry-pick F...E -- bar >>expect &&
git rev-list --left-right --cherry-pick F...E -- bar >actual && git rev-list --left-right --cherry-pick F...E -- bar >actual &&
git name-rev --stdin --name-only --refs="*tags/*" --exclude="*E" \ git name-rev --annotate-stdin --name-only --refs="*tags/*" --exclude="*E" \
<actual >actual.named && <actual >actual.named &&
test_cmp expect actual.named test_cmp expect actual.named
' '
test_expect_success 'name-rev --no-refs clears the refs list' ' test_expect_success 'name-rev --no-refs clears the refs list' '
git rev-list --left-right --cherry-pick F...E -- bar >expect && git rev-list --left-right --cherry-pick F...E -- bar >expect &&
git name-rev --stdin --name-only --refs="*tags/F" --refs="*tags/E" --no-refs --refs="*tags/G" \ git name-rev --annotate-stdin --name-only --refs="*tags/F" --refs="*tags/E" --no-refs --refs="*tags/G" \
<expect >actual && <expect >actual &&
test_cmp expect actual test_cmp expect actual
' '
@ -149,7 +149,7 @@ EOF
test_expect_success '--cherry-mark' ' test_expect_success '--cherry-mark' '
git rev-list --cherry-mark F...E -- bar > actual && git rev-list --cherry-mark F...E -- bar > actual &&
git name-rev --stdin --name-only --refs="*tags/*" \ git name-rev --annotate-stdin --name-only --refs="*tags/*" \
< actual > actual.named && < actual > actual.named &&
test_cmp expect actual.named test_cmp expect actual.named
' '
@ -163,7 +163,7 @@ EOF
test_expect_success '--cherry-mark --left-right' ' test_expect_success '--cherry-mark --left-right' '
git rev-list --cherry-mark --left-right F...E -- bar > actual && git rev-list --cherry-mark --left-right F...E -- bar > actual &&
git name-rev --stdin --name-only --refs="*tags/*" \ git name-rev --annotate-stdin --name-only --refs="*tags/*" \
< actual > actual.named && < actual > actual.named &&
test_cmp expect actual.named test_cmp expect actual.named
' '
@ -174,14 +174,14 @@ EOF
test_expect_success '--cherry-pick --right-only' ' test_expect_success '--cherry-pick --right-only' '
git rev-list --cherry-pick --right-only F...E -- bar > actual && git rev-list --cherry-pick --right-only F...E -- bar > actual &&
git name-rev --stdin --name-only --refs="*tags/*" \ git name-rev --annotate-stdin --name-only --refs="*tags/*" \
< actual > actual.named && < actual > actual.named &&
test_cmp expect actual.named test_cmp expect actual.named
' '
test_expect_success '--cherry-pick --left-only' ' test_expect_success '--cherry-pick --left-only' '
git rev-list --cherry-pick --left-only E...F -- bar > actual && git rev-list --cherry-pick --left-only E...F -- bar > actual &&
git name-rev --stdin --name-only --refs="*tags/*" \ git name-rev --annotate-stdin --name-only --refs="*tags/*" \
< actual > actual.named && < actual > actual.named &&
test_cmp expect actual.named test_cmp expect actual.named
' '
@ -193,7 +193,7 @@ EOF
test_expect_success '--cherry' ' test_expect_success '--cherry' '
git rev-list --cherry F...E -- bar > actual && git rev-list --cherry F...E -- bar > actual &&
git name-rev --stdin --name-only --refs="*tags/*" \ git name-rev --annotate-stdin --name-only --refs="*tags/*" \
< actual > actual.named && < actual > actual.named &&
test_cmp expect actual.named test_cmp expect actual.named
' '

View File

@ -12,7 +12,7 @@ note () {
} }
unnote () { unnote () {
git name-rev --tags --stdin | sed -e "s|$OID_REGEX (tags/\([^)]*\)) |\1 |g" git name-rev --tags --annotate-stdin | sed -e "s|$OID_REGEX (tags/\([^)]*\)) |\1 |g"
} }
# #

View File

@ -23,7 +23,8 @@ note () {
} }
unnote () { unnote () {
git name-rev --tags --stdin | sed -e "s|$OID_REGEX (tags/\([^)]*\))\([ ]\)|\1\2|g" git name-rev --tags --annotate-stdin | \
sed -e "s|$OID_REGEX (tags/\([^)]*\))\([ ]\)|\1\2|g"
} }
test_expect_success setup ' test_expect_success setup '

View File

@ -270,7 +270,7 @@ test_expect_success 'name-rev --all' '
test_cmp expect actual test_cmp expect actual
' '
test_expect_success 'name-rev --stdin' ' test_expect_success 'name-rev --annotate-stdin' '
>expect.unsorted && >expect.unsorted &&
for rev in $(git rev-list --all) for rev in $(git rev-list --all)
do do
@ -278,11 +278,16 @@ test_expect_success 'name-rev --stdin' '
echo "$rev ($name)" >>expect.unsorted echo "$rev ($name)" >>expect.unsorted
done && done &&
sort <expect.unsorted >expect && sort <expect.unsorted >expect &&
git rev-list --all | git name-rev --stdin >actual.unsorted && git rev-list --all | git name-rev --annotate-stdin >actual.unsorted &&
sort <actual.unsorted >actual && sort <actual.unsorted >actual &&
test_cmp expect actual test_cmp expect actual
' '
test_expect_success 'name-rev --stdin deprecated' "
git rev-list --all | git name-rev --stdin 2>actual &&
grep -E 'warning: --stdin is deprecated' actual
"
test_expect_success 'describe --contains with the exact tags' ' test_expect_success 'describe --contains with the exact tags' '
echo "A^0" >expect && echo "A^0" >expect &&
tag_object=$(git rev-parse refs/tags/A) && tag_object=$(git rev-parse refs/tags/A) &&