* [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
* 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
* [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