All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v5 0/4] rev-parse: allow --flags to output rev-parse-like flags
@ 2010-09-25 16:18 Jon Seymour
  2010-09-25 16:18 ` [PATCH v5 1/4] rev-parse: stop interpreting flags as options to rev-parse once --flags is specified Jon Seymour
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Jon Seymour @ 2010-09-25 16:18 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 and v4 of this series has been incorporated.

v5 fixes a breakage in support of --no-revs option introduced by v4
and updates the test to add tests that would have prevented that breakage
being introduced.

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      |  127 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 152 insertions(+), 1 deletions(-)
 create mode 100755 t/t1510-rev-parse-flags.sh

-- 
1.7.3.4.g9eb38

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

* [PATCH v5 1/4] rev-parse: stop interpreting flags as options to rev-parse once --flags is specified
  2010-09-25 16:18 [PATCH v5 0/4] rev-parse: allow --flags to output rev-parse-like flags Jon Seymour
@ 2010-09-25 16:18 ` Jon Seymour
  2010-09-25 16:18 ` [PATCH v5 2/4] rev-parse: add tests for git rev-parse --flags Jon Seymour
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Jon Seymour @ 2010-09-25 16:18 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.4.g73371.dirty

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

* [PATCH v5 2/4] rev-parse: add tests for git rev-parse --flags.
  2010-09-25 16:18 [PATCH v5 0/4] rev-parse: allow --flags to output rev-parse-like flags Jon Seymour
  2010-09-25 16:18 ` [PATCH v5 1/4] rev-parse: stop interpreting flags as options to rev-parse once --flags is specified Jon Seymour
@ 2010-09-25 16:18 ` Jon Seymour
  2010-09-25 16:18 ` [PATCH v5 3/4] rev-parse: update documentation of --flags and --no-flags options Jon Seymour
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Jon Seymour @ 2010-09-25 16:18 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..ef0b4ad
--- /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"' \
+'
+	printf "%s\n" -X > expected &&
+	git rev-parse --flags -X >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --flags -q -> "-q"' \
+'
+	printf "%s\n" -q > expected &&
+	git rev-parse --flags -q >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --flags -X -- Y -Z -> "-X"' \
+'
+	printf "%s\n" -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"' \
+'
+	printf "%s\n" --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.4.g73371.dirty

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

* [PATCH v5 3/4] rev-parse: update documentation of --flags and --no-flags options
  2010-09-25 16:18 [PATCH v5 0/4] rev-parse: allow --flags to output rev-parse-like flags Jon Seymour
  2010-09-25 16:18 ` [PATCH v5 1/4] rev-parse: stop interpreting flags as options to rev-parse once --flags is specified Jon Seymour
  2010-09-25 16:18 ` [PATCH v5 2/4] rev-parse: add tests for git rev-parse --flags Jon Seymour
@ 2010-09-25 16:18 ` Jon Seymour
  2010-09-25 16:18 ` [PATCH v5 4/4] rev-parse: make --flags imply --no-revs for remaining arguments Jon Seymour
  2010-09-26  1:24 ` [RE: v6 0/4] rev-parse: allow --flags to output rev-parse-like flags Jon Seymour
  4 siblings, 0 replies; 7+ messages in thread
From: Jon Seymour @ 2010-09-25 16:18 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.4.g73371.dirty

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

* [PATCH v5 4/4] rev-parse: make --flags imply --no-revs for remaining arguments.
  2010-09-25 16:18 [PATCH v5 0/4] rev-parse: allow --flags to output rev-parse-like flags Jon Seymour
                   ` (2 preceding siblings ...)
  2010-09-25 16:18 ` [PATCH v5 3/4] rev-parse: update documentation of --flags and --no-flags options Jon Seymour
@ 2010-09-25 16:18 ` Jon Seymour
  2010-09-25 16:21   ` Jon Seymour
  2010-09-26  1:24 ` [RE: v6 0/4] rev-parse: allow --flags to output rev-parse-like flags Jon Seymour
  4 siblings, 1 reply; 7+ messages in thread
From: Jon Seymour @ 2010-09-25 16:18 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      |   24 +++++++++++++++++++++---
 3 files changed, 39 insertions(+), 15 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..0655424 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -521,7 +521,11 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 				continue;
 			}
 			if (!strcmp(arg, "--flags")) {
-				filter &= ~DO_NONFLAGS;
+				if (!(filter & DO_FLAGS)) {
+					/* prevent --flags being interpreted if --no-flags has been seen */
+					continue;
+				}
+				filter &= ~(DO_NONFLAGS|DO_REVS);
 				continue;
 			}
 			if (!strcmp(arg, "--no-flags")) {
diff --git a/t/t1510-rev-parse-flags.sh b/t/t1510-rev-parse-flags.sh
index ef0b4ad..7df2081 100755
--- a/t/t1510-rev-parse-flags.sh
+++ b/t/t1510-rev-parse-flags.sh
@@ -29,10 +29,10 @@ test_expect_success 'git rev-parse --no-revs --flags HEAD -> ""' \
 	test_cmp expected actual
 '
 
-test_expect_success 'git rev-parse --symbolic --flags HEAD -> "HEAD"' \
+test_expect_success 'git rev-parse --flags HEAD -> ""' \
 '
-	echo HEAD > expected &&
-	git rev-parse --symbolic --flags HEAD >actual &&
+	: > expected &&
+	git rev-parse --flags HEAD >actual &&
 	test_cmp expected actual
 '
 
@@ -106,4 +106,22 @@ test_expect_success 'git rev-parse --symbolic --no-flags --flags HEAD -> "HEAD"'
 	test_cmp expected actual
 '
 
+test_expect_success 'git rev-parse --no-revs file -> "file"' \
+'
+	echo foo >file &&
+	echo file >expected &&
+	git rev-parse --no-revs file >actual &&
+	test_cmp expected actual
+'
+
+test_expect_success 'git rev-parse --no-revs -- not-a-file -> "-- not-a-file"' \
+'
+	cat >expected <<-EOF &&
+--
+not-a-file
+	EOF
+	git rev-parse --no-revs -- not-a-file >actual &&
+	test_cmp expected actual
+'
+
 test_done
-- 
1.7.3.4.g73371.dirty

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

* Re: [PATCH v5 4/4] rev-parse: make --flags imply --no-revs for remaining arguments.
  2010-09-25 16:18 ` [PATCH v5 4/4] rev-parse: make --flags imply --no-revs for remaining arguments Jon Seymour
@ 2010-09-25 16:21   ` Jon Seymour
  0 siblings, 0 replies; 7+ messages in thread
From: Jon Seymour @ 2010-09-25 16:21 UTC (permalink / raw)
  To: git, robbat2, casey, avarab

Apologies - it appears I missed on : > case. Will fix in next iteration...

jon.

On Sun, Sep 26, 2010 at 2:18 AM, 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      |   24 +++++++++++++++++++++---
>  3 files changed, 39 insertions(+), 15 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..0655424 100644
> --- a/builtin/rev-parse.c
> +++ b/builtin/rev-parse.c
> @@ -521,7 +521,11 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
>                                continue;
>                        }
>                        if (!strcmp(arg, "--flags")) {
> -                               filter &= ~DO_NONFLAGS;
> +                               if (!(filter & DO_FLAGS)) {
> +                                       /* prevent --flags being interpreted if --no-flags has been seen */
> +                                       continue;
> +                               }
> +                               filter &= ~(DO_NONFLAGS|DO_REVS);
>                                continue;
>                        }
>                        if (!strcmp(arg, "--no-flags")) {
> diff --git a/t/t1510-rev-parse-flags.sh b/t/t1510-rev-parse-flags.sh
> index ef0b4ad..7df2081 100755
> --- a/t/t1510-rev-parse-flags.sh
> +++ b/t/t1510-rev-parse-flags.sh
> @@ -29,10 +29,10 @@ test_expect_success 'git rev-parse --no-revs --flags HEAD -> ""' \
>        test_cmp expected actual
>  '
>
> -test_expect_success 'git rev-parse --symbolic --flags HEAD -> "HEAD"' \
> +test_expect_success 'git rev-parse --flags HEAD -> ""' \
>  '
> -       echo HEAD > expected &&
> -       git rev-parse --symbolic --flags HEAD >actual &&
> +       : > expected &&
> +       git rev-parse --flags HEAD >actual &&
>        test_cmp expected actual
>  '
>
> @@ -106,4 +106,22 @@ test_expect_success 'git rev-parse --symbolic --no-flags --flags HEAD -> "HEAD"'
>        test_cmp expected actual
>  '
>
> +test_expect_success 'git rev-parse --no-revs file -> "file"' \
> +'
> +       echo foo >file &&
> +       echo file >expected &&
> +       git rev-parse --no-revs file >actual &&
> +       test_cmp expected actual
> +'
> +
> +test_expect_success 'git rev-parse --no-revs -- not-a-file -> "-- not-a-file"' \
> +'
> +       cat >expected <<-EOF &&
> +--
> +not-a-file
> +       EOF
> +       git rev-parse --no-revs -- not-a-file >actual &&
> +       test_cmp expected actual
> +'
> +
>  test_done
> --
> 1.7.3.4.g73371.dirty
>
>

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

* [RE: v6 0/4] rev-parse: allow --flags to output rev-parse-like flags
  2010-09-25 16:18 [PATCH v5 0/4] rev-parse: allow --flags to output rev-parse-like flags Jon Seymour
                   ` (3 preceding siblings ...)
  2010-09-25 16:18 ` [PATCH v5 4/4] rev-parse: make --flags imply --no-revs for remaining arguments Jon Seymour
@ 2010-09-26  1:24 ` Jon Seymour
  4 siblings, 0 replies; 7+ messages in thread
From: Jon Seymour @ 2010-09-26  1:24 UTC (permalink / raw)
  To: git, robbat2, casey, avarab; +Cc: Jon Seymour

Those interested in the latest version of this series can poll
the stop-interpreting-after-flags branch on git://github.com/jonseymour/git.git

I have tagged v6 which is re-organized slightly w.r.t v5 so that tests
and documentation of existing behaviour are cleanly separated from
proposed changes.

I will post another version of this series to the list if/when I
receive additional
feedback or a final ack.

Regards,

jon seymour.

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

end of thread, other threads:[~2010-09-26  1:24 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-09-25 16:18 [PATCH v5 0/4] rev-parse: allow --flags to output rev-parse-like flags Jon Seymour
2010-09-25 16:18 ` [PATCH v5 1/4] rev-parse: stop interpreting flags as options to rev-parse once --flags is specified Jon Seymour
2010-09-25 16:18 ` [PATCH v5 2/4] rev-parse: add tests for git rev-parse --flags Jon Seymour
2010-09-25 16:18 ` [PATCH v5 3/4] rev-parse: update documentation of --flags and --no-flags options Jon Seymour
2010-09-25 16:18 ` [PATCH v5 4/4] rev-parse: make --flags imply --no-revs for remaining arguments Jon Seymour
2010-09-25 16:21   ` Jon Seymour
2010-09-26  1:24 ` [RE: v6 0/4] rev-parse: allow --flags to output rev-parse-like flags Jon Seymour

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.