branch: introduce --list option

Currently, there is no way to invoke the list mode explicitly, without
giving -v to force verbose output.

Introduce a --list option which invokes the list mode. This will be
beneficial for invoking list mode with pattern matching, which otherwise
would be interpreted as branch creation.

Along with --list, test also combinations of existing options.

Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Michael J Gruber 2011-08-28 16:54:31 +02:00 committed by Junio C Hamano
parent 171edcbb49
commit cddd127b9a
4 changed files with 53 additions and 5 deletions

View file

@ -9,7 +9,7 @@ SYNOPSIS
-------- --------
[verse] [verse]
'git branch' [--color[=<when>] | --no-color] [-r | -a] 'git branch' [--color[=<when>] | --no-color] [-r | -a]
[-v [--abbrev=<length> | --no-abbrev]] [--list] [-v [--abbrev=<length> | --no-abbrev]]
[(--merged | --no-merged | --contains) [<commit>]] [(--merged | --no-merged | --contains) [<commit>]]
'git branch' [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>] 'git branch' [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
'git branch' (-m | -M) [<oldbranch>] <newbranch> 'git branch' (-m | -M) [<oldbranch>] <newbranch>
@ -20,7 +20,8 @@ DESCRIPTION
With no arguments, existing branches are listed and the current branch will With no arguments, existing branches are listed and the current branch will
be highlighted with an asterisk. Option `-r` causes the remote-tracking be highlighted with an asterisk. Option `-r` causes the remote-tracking
branches to be listed, and option `-a` shows both. branches to be listed, and option `-a` shows both. This list mode is also
activated by the `--list` and `-v` options (see below).
With `--contains`, shows only the branches that contain the named commit With `--contains`, shows only the branches that contain the named commit
(in other words, the branches whose tip commits are descendants of the (in other words, the branches whose tip commits are descendants of the
@ -110,11 +111,15 @@ OPTIONS
--all:: --all::
List both remote-tracking branches and local branches. List both remote-tracking branches and local branches.
--list::
Activate the list mode.
-v:: -v::
--verbose:: --verbose::
Show sha1 and commit subject line for each head, along with Show sha1 and commit subject line for each head, along with
relationship to upstream branch (if any). If given twice, print relationship to upstream branch (if any). If given twice, print
the name of the upstream branch, as well. the name of the upstream branch, as well.
`--list` is implied by all verbosity options.
--abbrev=<length>:: --abbrev=<length>::
Alter the sha1's minimum display length in the output listing. Alter the sha1's minimum display length in the output listing.

View file

@ -612,7 +612,7 @@ static int opt_parse_merge_filter(const struct option *opt, const char *arg, int
int cmd_branch(int argc, const char **argv, const char *prefix) int cmd_branch(int argc, const char **argv, const char *prefix)
{ {
int delete = 0, rename = 0, force_create = 0; int delete = 0, rename = 0, force_create = 0, list = 0;
int verbose = 0, abbrev = -1, detached = 0; int verbose = 0, abbrev = -1, detached = 0;
int reflog = 0; int reflog = 0;
enum branch_track track; enum branch_track track;
@ -651,6 +651,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
OPT_BIT('D', NULL, &delete, "delete branch (even if not merged)", 2), OPT_BIT('D', NULL, &delete, "delete branch (even if not merged)", 2),
OPT_BIT('m', "move", &rename, "move/rename a branch and its reflog", 1), OPT_BIT('m', "move", &rename, "move/rename a branch and its reflog", 1),
OPT_BIT('M', NULL, &rename, "move/rename a branch, even if target exists", 2), OPT_BIT('M', NULL, &rename, "move/rename a branch, even if target exists", 2),
OPT_BOOLEAN(0, "list", &list, "list branch names"),
OPT_BOOLEAN('l', "create-reflog", &reflog, "create the branch's reflog"), OPT_BOOLEAN('l', "create-reflog", &reflog, "create the branch's reflog"),
OPT__FORCE(&force_create, "force creation (when already exists)"), OPT__FORCE(&force_create, "force creation (when already exists)"),
{ {
@ -693,7 +694,12 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, options, builtin_branch_usage, argc = parse_options(argc, argv, prefix, options, builtin_branch_usage,
0); 0);
if (!!delete + !!rename + !!force_create > 1)
if (!delete && !rename && !force_create &&
(argc == 0 || (verbose && argc)))
list = 1;
if (!!delete + !!rename + !!force_create + !!list > 1)
usage_with_options(builtin_branch_usage, options); usage_with_options(builtin_branch_usage, options);
if (abbrev == -1) if (abbrev == -1)
@ -701,7 +707,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
if (delete) if (delete)
return delete_branches(argc, argv, delete > 1, kinds); return delete_branches(argc, argv, delete > 1, kinds);
else if (argc == 0) else if (list)
return print_ref_list(kinds, detached, verbose, abbrev, with_commit); return print_ref_list(kinds, detached, verbose, abbrev, with_commit);
else if (rename && (argc == 1)) else if (rename && (argc == 1))
rename_branch(head, argv[0], rename > 1); rename_branch(head, argv[0], rename > 1);

View file

@ -98,6 +98,38 @@ test_expect_success 'git branch -m q r/q should fail when r exists' '
test_must_fail git branch -m q r/q test_must_fail git branch -m q r/q
' '
test_expect_success 'git branch -v -d t should work' '
git branch t &&
test .git/refs/heads/t &&
git branch -v -d t &&
test ! -f .git/refs/heads/t
'
test_expect_success 'git branch -v -m t s should work' '
git branch t &&
test .git/refs/heads/t &&
git branch -v -m t s &&
test ! -f .git/refs/heads/t &&
test -f .git/refs/heads/s &&
git branch -d s
'
test_expect_success 'git branch -m -d t s should fail' '
git branch t &&
test .git/refs/heads/t &&
test_must_fail git branch -m -d t s &&
git branch -d t &&
test ! -f .git/refs/heads/t
'
test_expect_success 'git branch --list -d t should fail' '
git branch t &&
test .git/refs/heads/t &&
test_must_fail git branch --list -d t &&
git branch -d t &&
test ! -f .git/refs/heads/t
'
mv .git/config .git/config-saved mv .git/config .git/config-saved
test_expect_success 'git branch -m q q2 without config should succeed' ' test_expect_success 'git branch -m q q2 without config should succeed' '

View file

@ -32,6 +32,11 @@ test_expect_success 'git branch shows local branches' '
test_cmp expect actual test_cmp expect actual
' '
test_expect_success 'git branch --list shows local branches' '
git branch --list >actual &&
test_cmp expect actual
'
cat >expect <<'EOF' cat >expect <<'EOF'
origin/HEAD -> origin/branch-one origin/HEAD -> origin/branch-one
origin/branch-one origin/branch-one