branch: let branch filters imply --list

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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2013-01-31 01:46:11 -05:00 коммит произвёл Junio C Hamano
Родитель de90ff81f3
Коммит d040350813
3 изменённых файлов: 41 добавлений и 3 удалений

Просмотреть файл

@ -195,15 +195,15 @@ start-point is either a local or remote-tracking branch.
--contains [<commit>]:: --contains [<commit>]::
Only list branches which contain the specified commit (HEAD Only list branches which contain the specified commit (HEAD
if not specified). if not specified). Implies `--list`.
--merged [<commit>]:: --merged [<commit>]::
Only list branches whose tips are reachable from the 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>]:: --no-merged [<commit>]::
Only list branches whose tips are not reachable from the 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>:: <branchname>::
The name of the branch to create or delete. The name of the branch to create or delete.

Просмотреть файл

@ -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) if (!delete && !rename && !edit_description && !new_upstream && !unset_upstream && argc == 0)
list = 1; list = 1;
if (with_commit || merge_filter != NO_FILTER)
list = 1;
if (!!delete + !!rename + !!force_create + !!list + !!new_upstream + !!unset_upstream > 1) if (!!delete + !!rename + !!force_create + !!list + !!new_upstream + !!unset_upstream > 1)
usage_with_options(builtin_branch_usage, options); usage_with_options(builtin_branch_usage, options);

Просмотреть файл

@ -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' ' test_expect_success 'side: branch --merged' '
git branch --merged >actual && 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' ' test_expect_success 'side: branch --no-merged' '
git branch --no-merged >actual && 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 test_done