* [PATCH 1/2] docs: clarify git-branch --list behavior
  2013-01-31  6:43 ` [PATCH 0/2] improve "git branch --contains=<commit> <pattern>" Jeff King
@ 2013-01-31  6:45   ` Jeff King
  2013-02-01  0:20     ` Eric Sunshine
  2013-01-31  6:46   ` [PATCH 2/2] branch: let branch filters imply --list Jeff King
  2013-01-31 15:53   ` [PATCH 0/2] improve "git branch --contains=<commit> <pattern>" Junio C Hamano
  2 siblings, 1 reply; 11+ messages in thread
From: Jeff King @ 2013-01-31  6:45 UTC (permalink / raw)
  To: Peter Wu; +Cc: git
It was not clear from the "description" section of
git-branch(1) that using a <pattern> meant that you _had_ to
use the --list option. Let's clarify that, and while we're
at it, reword some clunky and ambiguous sentences.
Signed-off-by: Jeff King <peff@peff.net>
---
 Documentation/git-branch.txt | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt
index 45a225e..01aa87f 100644
--- a/Documentation/git-branch.txt
+++ b/Documentation/git-branch.txt
@@ -22,13 +22,15 @@ DESCRIPTION
 DESCRIPTION
 -----------
 
-With no arguments, existing branches are listed and the current branch will
-be highlighted with an asterisk.  Option `-r` causes the remote-tracking
-branches to be listed, and option `-a` shows both. This list mode is also
-activated by the `--list` option (see below).
-<pattern> restricts the output to matching branches, the pattern is a shell
-wildcard (i.e., matched using fnmatch(3)).
-Multiple patterns may be given; if any of them matches, the branch is shown.
+If `--list` is given, or if there are no non-option arguments, existing
+branches are listed; the current branch will be highlighted with an
+asterisk.  Option `-r` causes the remote-tracking branches to be listed,
+and option `-a` shows both local and remote branches. If a `<pattern>`
+is given, it is used as a shell wildcard to restrict the output to
+matching branches. If multiple patterns are given, a branch is shown if
+any it is matched by any of the patterns.  Note that when providing a
+`<pattern>`, you must use `--list`; otherwise the command is interpreted
+as branch creation.
 
 With `--contains`, shows only the branches that contain the named commit
 (in other words, the branches whose tip commits are descendants of the
-- 
1.8.1.2.5.g1cb3f73
^ permalink raw reply related	[flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] docs: clarify git-branch --list behavior
  2013-01-31  6:45   ` [PATCH 1/2] docs: clarify git-branch --list behavior Jeff King
@ 2013-02-01  0:20     ` Eric Sunshine
  2013-02-01  0:37       ` Junio C Hamano
  0 siblings, 1 reply; 11+ messages in thread
From: Eric Sunshine @ 2013-02-01  0:20 UTC (permalink / raw)
  To: Jeff King; +Cc: Peter Wu, git
On Thu, Jan 31, 2013 at 1:45 AM, Jeff King <peff@peff.net> wrote:
> +If `--list` is given, or if there are no non-option arguments, existing
> +branches are listed; the current branch will be highlighted with an
> +asterisk.  Option `-r` causes the remote-tracking branches to be listed,
> +and option `-a` shows both local and remote branches. If a `<pattern>`
> +is given, it is used as a shell wildcard to restrict the output to
> +matching branches. If multiple patterns are given, a branch is shown if
> +any it is matched by any of the patterns.
s/if any it is/if it is/
-- ES
^ permalink raw reply	[flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] docs: clarify git-branch --list behavior
  2013-02-01  0:20     ` Eric Sunshine
@ 2013-02-01  0:37       ` Junio C Hamano
  2013-02-01  5:06         ` Jeff King
  0 siblings, 1 reply; 11+ messages in thread
From: Junio C Hamano @ 2013-02-01  0:37 UTC (permalink / raw)
  To: Eric Sunshine; +Cc: Jeff King, Peter Wu, git
Eric Sunshine <sunshine@sunshineco.com> writes:
> On Thu, Jan 31, 2013 at 1:45 AM, Jeff King <peff@peff.net> wrote:
>> +If `--list` is given, or if there are no non-option arguments, existing
>> +branches are listed; the current branch will be highlighted with an
>> +asterisk.  Option `-r` causes the remote-tracking branches to be listed,
>> +and option `-a` shows both local and remote branches. If a `<pattern>`
>> +is given, it is used as a shell wildcard to restrict the output to
>> +matching branches. If multiple patterns are given, a branch is shown if
>> +any it is matched by any of the patterns.
>
> s/if any it is/if it is/
Thanks; I'll squash this in.  Peff, no need to resend.
 Documentation/git-branch.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt
index 01aa87f..2635dee 100644
--- a/Documentation/git-branch.txt
+++ b/Documentation/git-branch.txt
@@ -28,7 +28,7 @@ asterisk.  Option `-r` causes the remote-tracking branches to be listed,
 and option `-a` shows both local and remote branches. If a `<pattern>`
 is given, it is used as a shell wildcard to restrict the output to
 matching branches. If multiple patterns are given, a branch is shown if
-any it is matched by any of the patterns.  Note that when providing a
+it matches any of the patterns.  Note that when providing a
 `<pattern>`, you must use `--list`; otherwise the command is interpreted
 as branch creation.
 
^ permalink raw reply related	[flat|nested] 11+ messages in thread
* Re: [PATCH 1/2] docs: clarify git-branch --list behavior
  2013-02-01  0:37       ` Junio C Hamano
@ 2013-02-01  5:06         ` Jeff King
  2013-02-01  5:42           ` Junio C Hamano
  0 siblings, 1 reply; 11+ messages in thread
From: Jeff King @ 2013-02-01  5:06 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Eric Sunshine, Peter Wu, git
On Thu, Jan 31, 2013 at 04:37:01PM -0800, Junio C Hamano wrote:
> Eric Sunshine <sunshine@sunshineco.com> writes:
> 
> > On Thu, Jan 31, 2013 at 1:45 AM, Jeff King <peff@peff.net> wrote:
> >> +If `--list` is given, or if there are no non-option arguments, existing
> >> +branches are listed; the current branch will be highlighted with an
> >> +asterisk.  Option `-r` causes the remote-tracking branches to be listed,
> >> +and option `-a` shows both local and remote branches. If a `<pattern>`
> >> +is given, it is used as a shell wildcard to restrict the output to
> >> +matching branches. If multiple patterns are given, a branch is shown if
> >> +any it is matched by any of the patterns.
> >
> > s/if any it is/if it is/
> 
> Thanks; I'll squash this in.  Peff, no need to resend.
Thanks. No matter how many times I proofread a doc change, I always
manage to slip an error into the final version. Hooray for many eyes.
-Peff
^ permalink raw reply	[flat|nested] 11+ messages in thread
* [PATCH 2/2] branch: let branch filters imply --list
  2013-01-31  6:43 ` [PATCH 0/2] improve "git branch --contains=<commit> <pattern>" Jeff King
  2013-01-31  6:45   ` [PATCH 1/2] docs: clarify git-branch --list behavior Jeff King
@ 2013-01-31  6:46   ` Jeff King
  2013-01-31 16:13     ` Peter Wu
  2013-01-31 15:53   ` [PATCH 0/2] improve "git branch --contains=<commit> <pattern>" Junio C Hamano
  2 siblings, 1 reply; 11+ messages in thread
From: Jeff King @ 2013-01-31  6:46 UTC (permalink / raw)
  To: Peter Wu; +Cc: git
Currently, a branch filter like `--contains`, `--merged`, or
`--no-merged` is ignored when we are not in listing mode.
For example:
  git branch --contains=foo bar
will create the branch "bar" from the current HEAD, ignoring
the `--contains` argument entirely. This is not very
helpful. There are two reasonable behaviors for git here:
  1. Flag an error; the arguments do not make sense.
  2. Implicitly go into `--list` mode
This patch chooses the latter, as it is more convenient, and
there should not be any ambiguity with attempting to create
a branch; using `--contains` and not wanting to list is
nonsensical.
That leaves the case where an explicit modification option
like `-d` is given.  We already catch the case where
`--list` is given alongside `-d` and flag an error. With
this patch, we will also catch the use of `--contains` and
other filter options alongside `-d`.
Signed-off-by: Jeff King <peff@peff.net>
---
 Documentation/git-branch.txt |  6 +++---
 builtin/branch.c             |  3 +++
 t/t3201-branch-contains.sh   | 35 +++++++++++++++++++++++++++++++++++
 3 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt
index 01aa87f..07ef5af 100644
--- a/Documentation/git-branch.txt
+++ b/Documentation/git-branch.txt
@@ -195,15 +195,15 @@ start-point is either a local or remote-tracking branch.
 
 --contains [<commit>]::
 	Only list branches which contain the specified commit (HEAD
-	if not specified).
+	if not specified). Implies `--list`.
 
 --merged [<commit>]::
 	Only list branches whose tips are reachable from the
-	specified commit (HEAD if not specified).
+	specified commit (HEAD if not specified). Implies `--list`.
 
 --no-merged [<commit>]::
 	Only list branches whose tips are not reachable from the
-	specified commit (HEAD if not specified).
+	specified commit (HEAD if not specified). Implies `--list`.
 
 <branchname>::
 	The name of the branch to create or delete.
diff --git a/builtin/branch.c b/builtin/branch.c
index 873f624..4aa3d4e 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -825,6 +825,9 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
 	if (!delete && !rename && !edit_description && !new_upstream && !unset_upstream && argc == 0)
 		list = 1;
 
+	if (with_commit || merge_filter != NO_FILTER)
+		list = 1;
+
 	if (!!delete + !!rename + !!force_create + !!list + !!new_upstream + !!unset_upstream > 1)
 		usage_with_options(builtin_branch_usage, options);
 
diff --git a/t/t3201-branch-contains.sh b/t/t3201-branch-contains.sh
index f86f4bc..141b061 100755
--- a/t/t3201-branch-contains.sh
+++ b/t/t3201-branch-contains.sh
@@ -55,6 +55,16 @@ test_expect_success 'branch --contains=side' '
 
 '
 
+test_expect_success 'branch --contains with pattern implies --list' '
+
+	git branch --contains=master master >actual &&
+	{
+		echo "  master"
+	} >expect &&
+	test_cmp expect actual
+
+'
+
 test_expect_success 'side: branch --merged' '
 
 	git branch --merged >actual &&
@@ -66,6 +76,16 @@ test_expect_success 'side: branch --merged' '
 
 '
 
+test_expect_success 'branch --merged with pattern implies --list' '
+
+	git branch --merged=side master >actual &&
+	{
+		echo "  master"
+	} >expect &&
+	test_cmp expect actual
+
+'
+
 test_expect_success 'side: branch --no-merged' '
 
 	git branch --no-merged >actual &&
@@ -95,4 +115,19 @@ test_expect_success 'master: branch --no-merged' '
 
 '
 
+test_expect_success 'branch --no-merged with pattern implies --list' '
+
+	git branch --no-merged=master master >actual &&
+	>expect &&
+	test_cmp expect actual
+
+'
+
+test_expect_success 'implicit --list conflicts with modification options' '
+
+	test_must_fail git branch --contains=master -d &&
+	test_must_fail git branch --contains=master -m foo
+
+'
+
 test_done
-- 
1.8.1.2.5.g1cb3f73
^ permalink raw reply related	[flat|nested] 11+ messages in thread* Re: [PATCH 2/2] branch: let branch filters imply --list
  2013-01-31  6:46   ` [PATCH 2/2] branch: let branch filters imply --list Jeff King
@ 2013-01-31 16:13     ` Peter Wu
  2013-01-31 17:02       ` Junio C Hamano
  0 siblings, 1 reply; 11+ messages in thread
From: Peter Wu @ 2013-01-31 16:13 UTC (permalink / raw)
  To: Jeff King; +Cc: git
On Thursday 31 January 2013 01:46:11 Jeff King wrote:
> Currently, a branch filter like `--contains`, `--merged`, or
> `--no-merged` is ignored when we are not in listing mode.
> For example:
> 
>   git branch --contains=foo bar
> 
> will create the branch "bar" from the current HEAD, ignoring
> the `--contains` argument entirely. This is not very
> helpful. There are two reasonable behaviors for git here:
> 
>   1. Flag an error; the arguments do not make sense.
> 
>   2. Implicitly go into `--list` mode
> 
> This patch chooses the latter, as it is more convenient, and
> there should not be any ambiguity with attempting to create
> a branch; using `--contains` and not wanting to list is
> nonsensical.
> 
> That leaves the case where an explicit modification option
> like `-d` is given.  We already catch the case where
> `--list` is given alongside `-d` and flag an error. With
> this patch, we will also catch the use of `--contains` and
> other filter options alongside `-d`.
> 
> Signed-off-by: Jeff King <peff@peff.net>
Tested-by: Peter Wu <lekensteyn@gmail.com>
I have tested this patch on top of 1.8.1.2 and it seems to work.
One note, the following command spits out master without complaining about the 
non-existing branch name:
    git branch --contains <id> master <non-existant branch name>
(the order of branches doesn't affect the result.)
Regards,
Peter
^ permalink raw reply	[flat|nested] 11+ messages in thread* Re: [PATCH 2/2] branch: let branch filters imply --list
  2013-01-31 16:13     ` Peter Wu
@ 2013-01-31 17:02       ` Junio C Hamano
  0 siblings, 0 replies; 11+ messages in thread
From: Junio C Hamano @ 2013-01-31 17:02 UTC (permalink / raw)
  To: Peter Wu; +Cc: Jeff King, git
Peter Wu <lekensteyn@gmail.com> writes:
> One note, the following command spits out master without complaining about the 
> non-existing branch name:
>
>     git branch --contains <id> master <non-existant branch name>
>
> (the order of branches doesn't affect the result.)
That is perfectly normal.
What you gave after "--contains <id>" are *not* branch names.  They
are patterns against branch names that fits the given criteria (in
this case "--contains <id>") are matched, and the branches that do
not match any of the patterns will not appear in the result.
^ permalink raw reply	[flat|nested] 11+ messages in thread
* Re: [PATCH 0/2] improve "git branch --contains=<commit> <pattern>"
  2013-01-31  6:43 ` [PATCH 0/2] improve "git branch --contains=<commit> <pattern>" Jeff King
  2013-01-31  6:45   ` [PATCH 1/2] docs: clarify git-branch --list behavior Jeff King
  2013-01-31  6:46   ` [PATCH 2/2] branch: let branch filters imply --list Jeff King
@ 2013-01-31 15:53   ` Junio C Hamano
  2 siblings, 0 replies; 11+ messages in thread
From: Junio C Hamano @ 2013-01-31 15:53 UTC (permalink / raw)
  To: Jeff King; +Cc: Peter Wu, git
Jeff King <peff@peff.net> writes:
> That being said, we could be much more helpful. It seems like --contains
> should imply listing mode, since it is nonsensical in other modes. The
> second patch below adjusts that, and makes the command above do what you
> expect.
>
>   [1/2]: docs: clarify git-branch --list behavior
>   [2/2]: branch: let branch filters imply --list
Thanks.  Looks good.
^ permalink raw reply	[flat|nested] 11+ messages in thread