git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/4] rev-parse: allow --flags to output rev-parse-like flags
@ 2010-09-25 13:33 Jon Seymour
  2010-09-25 13:33 ` [PATCH v4 1/4] rev-parse: stop interpreting flags as options to rev-parse once --flags is specified Jon Seymour
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Jon Seymour @ 2010-09-25 13:33 UTC (permalink / raw)
  To: git, robbat2, casey, avarab; +Cc: Jon Seymour

This series allows git rev-parse --flags to output remaining flag-like arguments
even if such arguments are valid options to git rev-parse itself.

Previously:
  $ git rev-parse --flags -q -X --no-flags -- Y -Z
  -X
  $

Now:
  $ git rev-parse --flags -q -X --no-flags -- Y -Z
  -q -X --no-flags
  $

This series also changes the interpretation of --flags so that
specification of this option implies --no-revs.

Previously:
  $ git rev-parse --flags HEAD
  HEAD
  $

Now:
  $ git rev-parse --flags HEAD
  $

Reviewers attention is drawn to the following behaviour which, while
unchanged from current behaviour, differs from the behaviour specified
by the documentation. Specifically:

  $ git rev-parse -X --no-flags
  -X
  $ git rev-parse --no-flags -X
  $

In other words, a git rev-parse option only ever affects the 
interpretation of succeeding options, never preceding options.

Aevar's feedback on v2 of this series has been incorporated.

Jon Seymour (4):
  rev-parse: stop interpreting flags as options to rev-parse once
    --flags is specified
  rev-parse: add tests for git rev-parse --flags.
  rev-parse: update documentation of --flags and --no-flags options
  rev-parse: make --flags imply --no-revs for remaining arguments.

 Documentation/git-rev-parse.txt |   12 ++++
 builtin/rev-parse.c             |   14 +++++-
 t/t1510-rev-parse-flags.sh      |  109 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 134 insertions(+), 1 deletions(-)
 create mode 100755 t/t1510-rev-parse-flags.sh

-- 
1.7.3.3.gc4c52.dirty

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v4 1/4] rev-parse: stop interpreting flags as options to rev-parse once --flags is specified
  2010-09-25 13:33 [PATCH v4 0/4] rev-parse: allow --flags to output rev-parse-like flags Jon Seymour
@ 2010-09-25 13:33 ` Jon Seymour
  2010-09-25 13:33 ` [PATCH v4 2/4] rev-parse: add tests for git rev-parse --flags Jon Seymour
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 8+ messages in thread
From: Jon Seymour @ 2010-09-25 13:33 UTC (permalink / raw)
  To: git, robbat2, casey, avarab; +Cc: Jon Seymour

Current git rev-parse behaviour makes --flags hard to use if the remaining
arguments to git rev-parse contain an option that would otherwise be interpreted
as an option by git rev-parse itself.

So, for example:

  $> git rev-parse --flags -q -X
  -X

Normally one might expect to use -- to prevent -q being interpreted:

  $> git rev-parse --flags -- -q -X
  -q -X

But we can't really use -- in this way, because commands that use
git rev-parse might reasonably expect:

  $> git rev-parse --flags -Y -- -q -X
  -Y

That is, -Y to be regarded as a flag but everything after -- to be uninterpreted.

This proposed change modifies git rev-parse so that git rev-parse stops
interpreting flag arguments as options to git rev-parse once --flags is
interpreted. We also exit early once -- is found.

Signed-off-by: Jon Seymour <jon.seymour@gmail.com>
---
 builtin/rev-parse.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index a5a1c86..2ad269a 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -497,8 +497,16 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 				/* Pass on the "--" if we show anything but files.. */
 				if (filter & (DO_FLAGS | DO_REVS))
 					show_file(arg);
+				if (!(filter & DO_NONFLAGS)) {
+					return 0;
+				}
 				continue;
 			}
+			if (!(filter & DO_NONFLAGS)) {
+				/* once we see --flags, we stop interpreting other flags */
+				 show_flag(arg);
+				 continue;
+			}
 			if (!strcmp(arg, "--default")) {
 				def = argv[i+1];
 				i++;
-- 
1.7.3.3.gc4c52.dirty

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v4 2/4] rev-parse: add tests for git rev-parse --flags.
  2010-09-25 13:33 [PATCH v4 0/4] rev-parse: allow --flags to output rev-parse-like flags Jon Seymour
  2010-09-25 13:33 ` [PATCH v4 1/4] rev-parse: stop interpreting flags as options to rev-parse once --flags is specified Jon Seymour
@ 2010-09-25 13:33 ` Jon Seymour
  2010-09-25 14:27   ` Ævar Arnfjörð Bjarmason
  2010-09-25 13:33 ` [PATCH v4 3/4] rev-parse: update documentation of --flags and --no-flags options Jon Seymour
  2010-09-25 13:33 ` [PATCH v4 4/4] rev-parse: make --flags imply --no-revs for remaining arguments Jon Seymour
  3 siblings, 1 reply; 8+ messages in thread
From: Jon Seymour @ 2010-09-25 13:33 UTC (permalink / raw)
  To: git, robbat2, casey, avarab; +Cc: Jon Seymour

Signed-off-by: Jon Seymour <jon.seymour@gmail.com>
---
 t/t1510-rev-parse-flags.sh |  109 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 109 insertions(+), 0 deletions(-)
 create mode 100755 t/t1510-rev-parse-flags.sh

diff --git a/t/t1510-rev-parse-flags.sh b/t/t1510-rev-parse-flags.sh
new file mode 100755
index 0000000..53002df
--- /dev/null
+++ b/t/t1510-rev-parse-flags.sh
@@ -0,0 +1,109 @@
+#!/bin/sh
+#
+# Copyright (c) 2010 Jon Seymour
+#
+
+test_description='test git rev-parse --flags'
+. ./test-lib.sh
+
+test_commit "A"
+
+test_expect_success 'git rev-parse --flags -> ""' \
+'
+	: >expected &&
+	git rev-parse --flags >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --flags X -> ""' \
+'
+	: >expected &&
+	git rev-parse --flags X >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --no-revs --flags HEAD -> ""' \
+'
+	: >expected &&
+	git rev-parse --no-revs --flags HEAD >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --symbolic --flags HEAD -> "HEAD"' \
+'
+	echo HEAD > expected &&
+	git rev-parse --symbolic --flags HEAD >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --flags -- -> ""' \
+'
+	: >expected &&
+	git rev-parse --flags -- >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --flags -- X -> ""' \
+'
+	: >expected &&
+	git rev-parse --flags -- X >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --flags -- -X -> ""' \
+'
+	: >expected &&
+	git rev-parse --flags -- -X >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --flags -- -q --> ""' \
+'
+	: >expected &&
+	git rev-parse --flags -- -q >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --flags -X -> "-X"' \
+'
+	echo -X > expected &&
+	git rev-parse --flags -X >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --flags -q -> "-q"' \
+'
+	echo -q > expected &&
+	git rev-parse --flags -q >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --flags -X -- Y -Z -> "-X"' \
+'
+	echo -X > expected &&
+	git rev-parse --flags -X -- Y -Z >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --flags --no-flags -> "--no-flags"' \
+'
+	echo --no-flags > expected &&
+	git rev-parse --flags --no-flags >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --no-flags --flags -X -> ""' \
+'
+	: >expected &&
+	git rev-parse --no-flags --flags -X >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --symbolic --no-flags --flags HEAD -> "HEAD"' \
+'
+	echo HEAD >expected &&
+	git rev-parse --symbolic --no-flags --flags HEAD >actual &&
+	test_cmp expected actual
+'
+
+test_done
-- 
1.7.3.3.gc4c52.dirty

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v4 3/4] rev-parse: update documentation of --flags and --no-flags options
  2010-09-25 13:33 [PATCH v4 0/4] rev-parse: allow --flags to output rev-parse-like flags Jon Seymour
  2010-09-25 13:33 ` [PATCH v4 1/4] rev-parse: stop interpreting flags as options to rev-parse once --flags is specified Jon Seymour
  2010-09-25 13:33 ` [PATCH v4 2/4] rev-parse: add tests for git rev-parse --flags Jon Seymour
@ 2010-09-25 13:33 ` Jon Seymour
  2010-09-25 13:33 ` [PATCH v4 4/4] rev-parse: make --flags imply --no-revs for remaining arguments Jon Seymour
  3 siblings, 0 replies; 8+ messages in thread
From: Jon Seymour @ 2010-09-25 13:33 UTC (permalink / raw)
  To: git, robbat2, casey, avarab; +Cc: Jon Seymour

Signed-off-by: Jon Seymour <jon.seymour@gmail.com>
---
 Documentation/git-rev-parse.txt |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
index 341ca90..f5e6637 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -49,10 +49,20 @@ OPTIONS
 	'git rev-list' command.
 
 --flags::
-	Do not output non-flag parameters.
+	Do not output non-flag parameters which are not also revisions.
+	+
+	If specified, this option causes 'git rev-parse' to stop
+	interpreting remaining arguments as options for its own
+	consumption. As such, this option should be specified
+	after all other options that 'git rev-parse' is expected
+	to interpret.
 
 --no-flags::
 	Do not output flag parameters.
+	+
+	If both `--flags` and `--no-flags` are specified, the first
+	option specified wins and the other option is treated like
+	a non-option argument.
 
 --default <arg>::
 	If there is no parameter given by the user, use `<arg>`
-- 
1.7.3.3.gc4c52.dirty

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v4 4/4] rev-parse: make --flags imply --no-revs for remaining arguments.
  2010-09-25 13:33 [PATCH v4 0/4] rev-parse: allow --flags to output rev-parse-like flags Jon Seymour
                   ` (2 preceding siblings ...)
  2010-09-25 13:33 ` [PATCH v4 3/4] rev-parse: update documentation of --flags and --no-flags options Jon Seymour
@ 2010-09-25 13:33 ` Jon Seymour
  2010-09-25 14:20   ` Jon Seymour
  3 siblings, 1 reply; 8+ messages in thread
From: Jon Seymour @ 2010-09-25 13:33 UTC (permalink / raw)
  To: git, robbat2, casey, avarab; +Cc: Jon Seymour

This change ensures that git rev-parse --flags complies with its documentation,
namely:

   "Do not output non-flag parameters".

Previously:
   $ git rev-parse --flags HEAD
   <sha1 hash of HEAD>
   $

Now:
   $ git rev-parse --flags HEAD
   $

Signed-off-by: Jon Seymour <jon.seymour@gmail.com>
---
 Documentation/git-rev-parse.txt |   24 +++++++++++++-----------
 builtin/rev-parse.c             |    6 +++++-
 t/t1510-rev-parse-flags.sh      |    2 +-
 3 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
index f5e6637..f26fc7b 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -49,20 +49,22 @@ OPTIONS
 	'git rev-list' command.
 
 --flags::
-	Do not output non-flag parameters which are not also revisions.
-	+
-	If specified, this option causes 'git rev-parse' to stop
-	interpreting remaining arguments as options for its own
-	consumption. As such, this option should be specified
-	after all other options that 'git rev-parse' is expected
-	to interpret.
+	Do not output non-flag parameters.
++
+If specified, this option causes 'git rev-parse' to stop
+interpreting remaining arguments as options for its own
+consumption. As such, this option should be specified
+after all other options that 'git rev-parse' is expected
+to interpret.
++
+If `--flags` is specified, `--no-revs` is implied.
 
 --no-flags::
 	Do not output flag parameters.
-	+
-	If both `--flags` and `--no-flags` are specified, the first
-	option specified wins and the other option is treated like
-	a non-option argument.
++
+If both `--flags` and `--no-flags` are specified, the first
+option specified wins and the other option is treated like
+a non-option argument.
 
 --default <arg>::
 	If there is no parameter given by the user, use `<arg>`
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 2ad269a..84f9f07 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -13,7 +13,7 @@
 #define DO_REVS		1
 #define DO_NOREV	2
 #define DO_FLAGS	4
-#define DO_NONFLAGS	8
+#define DO_NONFLAGS	(8|DO_REVS)
 static int filter = ~0;
 
 static const char *def;
@@ -521,6 +521,10 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 				continue;
 			}
 			if (!strcmp(arg, "--flags")) {
+				if (!(filter & DO_FLAGS)) {
+					/* prevent --flags being interpreted if --no-flags has been seen */
+					continue;
+				}
 				filter &= ~DO_NONFLAGS;
 				continue;
 			}
diff --git a/t/t1510-rev-parse-flags.sh b/t/t1510-rev-parse-flags.sh
index 53002df..4dd6228 100755
--- a/t/t1510-rev-parse-flags.sh
+++ b/t/t1510-rev-parse-flags.sh
@@ -31,7 +31,7 @@ test_expect_success 'git rev-parse --no-revs --flags HEAD -> ""' \
 
 test_expect_success 'git rev-parse --symbolic --flags HEAD -> "HEAD"' \
 '
-	echo HEAD > expected &&
+	: > expected &&
 	git rev-parse --symbolic --flags HEAD >actual &&
 	test_cmp expected actual
 '
-- 
1.7.3.3.gc4c52.dirty

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v4 4/4] rev-parse: make --flags imply --no-revs for remaining arguments.
  2010-09-25 13:33 ` [PATCH v4 4/4] rev-parse: make --flags imply --no-revs for remaining arguments Jon Seymour
@ 2010-09-25 14:20   ` Jon Seymour
  0 siblings, 0 replies; 8+ messages in thread
From: Jon Seymour @ 2010-09-25 14:20 UTC (permalink / raw)
  To: Jon Seymour
  Cc: git@vger.kernel.org, robbat2@gentoo.org, casey@nrlssc.navy.mil,
	avarab@gmail.com

Oops - 4/4 breaks --no-revs.

Will issue v5 with guarding test shortly.

jon.

On 25/09/2010, at 23:33, Jon Seymour <jon.seymour@gmail.com> wrote:

> This change ensures that git rev-parse --flags complies with its documentation,
> namely:
> 
>   "Do not output non-flag parameters".
> 
> Previously:
>   $ git rev-parse --flags HEAD
>   <sha1 hash of HEAD>
>   $
> 
> Now:
>   $ git rev-parse --flags HEAD
>   $
> 
> Signed-off-by: Jon Seymour <jon.seymour@gmail.com>
> ---
> Documentation/git-rev-parse.txt |   24 +++++++++++++-----------
> builtin/rev-parse.c             |    6 +++++-
> t/t1510-rev-parse-flags.sh      |    2 +-
> 3 files changed, 19 insertions(+), 13 deletions(-)
> 
> diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
> index f5e6637..f26fc7b 100644
> --- a/Documentation/git-rev-parse.txt
> +++ b/Documentation/git-rev-parse.txt
> @@ -49,20 +49,22 @@ OPTIONS
>    'git rev-list' command.
> 
> --flags::
> -    Do not output non-flag parameters which are not also revisions.
> -    +
> -    If specified, this option causes 'git rev-parse' to stop
> -    interpreting remaining arguments as options for its own
> -    consumption. As such, this option should be specified
> -    after all other options that 'git rev-parse' is expected
> -    to interpret.
> +    Do not output non-flag parameters.
> ++
> +If specified, this option causes 'git rev-parse' to stop
> +interpreting remaining arguments as options for its own
> +consumption. As such, this option should be specified
> +after all other options that 'git rev-parse' is expected
> +to interpret.
> ++
> +If `--flags` is specified, `--no-revs` is implied.
> 
> --no-flags::
>    Do not output flag parameters.
> -    +
> -    If both `--flags` and `--no-flags` are specified, the first
> -    option specified wins and the other option is treated like
> -    a non-option argument.
> ++
> +If both `--flags` and `--no-flags` are specified, the first
> +option specified wins and the other option is treated like
> +a non-option argument.
> 
> --default <arg>::
>    If there is no parameter given by the user, use `<arg>`
> diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
> index 2ad269a..84f9f07 100644
> --- a/builtin/rev-parse.c
> +++ b/builtin/rev-parse.c
> @@ -13,7 +13,7 @@
> #define DO_REVS        1
> #define DO_NOREV    2
> #define DO_FLAGS    4
> -#define DO_NONFLAGS    8
> +#define DO_NONFLAGS    (8|DO_REVS)
> static int filter = ~0;
> 
> static const char *def;
> @@ -521,6 +521,10 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
>                continue;
>            }
>            if (!strcmp(arg, "--flags")) {
> +                if (!(filter & DO_FLAGS)) {
> +                    /* prevent --flags being interpreted if --no-flags has been seen */
> +                    continue;
> +                }
>                filter &= ~DO_NONFLAGS;
>                continue;
>            }
> diff --git a/t/t1510-rev-parse-flags.sh b/t/t1510-rev-parse-flags.sh
> index 53002df..4dd6228 100755
> --- a/t/t1510-rev-parse-flags.sh
> +++ b/t/t1510-rev-parse-flags.sh
> @@ -31,7 +31,7 @@ test_expect_success 'git rev-parse --no-revs --flags HEAD -> ""' \
> 
> test_expect_success 'git rev-parse --symbolic --flags HEAD -> "HEAD"' \
> '
> -    echo HEAD > expected &&
> +    : > expected &&
>    git rev-parse --symbolic --flags HEAD >actual &&
>    test_cmp expected actual
> '
> -- 
> 1.7.3.3.gc4c52.dirty
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4 2/4] rev-parse: add tests for git rev-parse --flags.
  2010-09-25 13:33 ` [PATCH v4 2/4] rev-parse: add tests for git rev-parse --flags Jon Seymour
@ 2010-09-25 14:27   ` Ævar Arnfjörð Bjarmason
  2010-09-25 16:19     ` Jon Seymour
  0 siblings, 1 reply; 8+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2010-09-25 14:27 UTC (permalink / raw)
  To: Jon Seymour; +Cc: git, robbat2, casey

On Sat, Sep 25, 2010 at 13:33, Jon Seymour <jon.seymour@gmail.com> wrote:

> +       : >expected &&

We've been dropping the ":>foo" style in favor of ">foo" in other
tests. There's no need for the ":".

> +       echo -X > expected &&
> +       echo -q > expected &&
> +       echo -X > expected &&
> +       echo --no-flags > expected &&

Maybe some echo implementations don't like flag-like params, and we need:

    printf "%s\n" "-X"

here. I don't know whether that's the case.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4 2/4] rev-parse: add tests for git rev-parse --flags.
  2010-09-25 14:27   ` Ævar Arnfjörð Bjarmason
@ 2010-09-25 16:19     ` Jon Seymour
  0 siblings, 0 replies; 8+ messages in thread
From: Jon Seymour @ 2010-09-25 16:19 UTC (permalink / raw)
  To: Ævar Arnfjörð Bjarmason; +Cc: git, robbat2, casey

On Sun, Sep 26, 2010 at 12:27 AM, Ævar Arnfjörð Bjarmason
<avarab@gmail.com> wrote:
> On Sat, Sep 25, 2010 at 13:33, Jon Seymour <jon.seymour@gmail.com> wrote:
>
>> +       : >expected &&
>
> We've been dropping the ":>foo" style in favor of ">foo" in other
> tests. There's no need for the ":".
>
>> +       echo -X > expected &&
>> +       echo -q > expected &&
>> +       echo -X > expected &&
>> +       echo --no-flags > expected &&
>
> Maybe some echo implementations don't like flag-like params, and we need:
>
>    printf "%s\n" "-X"
>
> here. I don't know whether that's the case.
>

Thanks for the review.

My latest revision incorporates this feedback, although I didn't use
extra quotes around -X. (e.g. I wrote printf "%s\n" -X)

jon.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-09-25 16:20 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-25 13:33 [PATCH v4 0/4] rev-parse: allow --flags to output rev-parse-like flags Jon Seymour
2010-09-25 13:33 ` [PATCH v4 1/4] rev-parse: stop interpreting flags as options to rev-parse once --flags is specified Jon Seymour
2010-09-25 13:33 ` [PATCH v4 2/4] rev-parse: add tests for git rev-parse --flags Jon Seymour
2010-09-25 14:27   ` Ævar Arnfjörð Bjarmason
2010-09-25 16:19     ` Jon Seymour
2010-09-25 13:33 ` [PATCH v4 3/4] rev-parse: update documentation of --flags and --no-flags options Jon Seymour
2010-09-25 13:33 ` [PATCH v4 4/4] rev-parse: make --flags imply --no-revs for remaining arguments Jon Seymour
2010-09-25 14:20   ` Jon Seymour

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).