Add -v and --abbrev options to git-branch

The new -v option makes git-branch show the abbreviated sha1 + subjectline
for each branch.

Additionally, minimum abbreviation length can be specified with
--abbrev=<length>

Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Lars Hjemli 2006-11-24 14:45:10 +01:00 committed by Junio C Hamano
parent 983d2ee284
commit 75e6e21320
2 changed files with 51 additions and 6 deletions

View File

@ -8,7 +8,7 @@ git-branch - List, create, or delete branches.
SYNOPSIS SYNOPSIS
-------- --------
[verse] [verse]
'git-branch' [-r] [-a] 'git-branch' [-r] [-a] [-v] [--abbrev=<length>]
'git-branch' [-l] [-f] <branchname> [<start-point>] 'git-branch' [-l] [-f] <branchname> [<start-point>]
'git-branch' (-d | -D) <branchname>... 'git-branch' (-d | -D) <branchname>...
@ -52,6 +52,13 @@ OPTIONS
-a:: -a::
List both remote-tracking branches and local branches. List both remote-tracking branches and local branches.
-v::
Show sha1 and subject message for each head.
--abbrev=<length>::
Alter minimum display length for sha1 in output listing,
default value is 7.
<branchname>:: <branchname>::
The name of the branch to create or delete. The name of the branch to create or delete.
The new branch name must pass all checks defined by The new branch name must pass all checks defined by

View File

@ -11,7 +11,7 @@
#include "builtin.h" #include "builtin.h"
static const char builtin_branch_usage[] = static const char builtin_branch_usage[] =
"git-branch (-d | -D) <branchname> | [-l] [-f] <branchname> [<start-point>] | [-r] | [-a]"; "git-branch (-d | -D) <branchname> | [-l] [-f] <branchname> [<start-point>] | [-r | -a] [-v] [--abbrev=<length>] ";
static const char *head; static const char *head;
@ -87,10 +87,11 @@ static void delete_branches(int argc, const char **argv, int force)
struct ref_item { struct ref_item {
char *name; char *name;
unsigned int kind; unsigned int kind;
unsigned char sha1[20];
}; };
struct ref_list { struct ref_list {
int index, alloc; int index, alloc, maxwidth;
struct ref_item *list; struct ref_item *list;
int kinds; int kinds;
}; };
@ -100,6 +101,7 @@ static int append_ref(const char *refname, const unsigned char *sha1, int flags,
struct ref_list *ref_list = (struct ref_list*)(cb_data); struct ref_list *ref_list = (struct ref_list*)(cb_data);
struct ref_item *newitem; struct ref_item *newitem;
int kind = REF_UNKNOWN_TYPE; int kind = REF_UNKNOWN_TYPE;
int len;
/* Detect kind */ /* Detect kind */
if (!strncmp(refname, "refs/heads/", 11)) { if (!strncmp(refname, "refs/heads/", 11)) {
@ -128,6 +130,10 @@ static int append_ref(const char *refname, const unsigned char *sha1, int flags,
newitem = &(ref_list->list[ref_list->index++]); newitem = &(ref_list->list[ref_list->index++]);
newitem->name = xstrdup(refname); newitem->name = xstrdup(refname);
newitem->kind = kind; newitem->kind = kind;
hashcpy(newitem->sha1, sha1);
len = strlen(newitem->name);
if (len > ref_list->maxwidth)
ref_list->maxwidth = len;
return 0; return 0;
} }
@ -151,7 +157,24 @@ static int ref_cmp(const void *r1, const void *r2)
return strcmp(c1->name, c2->name); return strcmp(c1->name, c2->name);
} }
static void print_ref_list(int kinds) static void print_ref_info(const unsigned char *sha1, int abbrev)
{
struct commit *commit;
char subject[256];
commit = lookup_commit(sha1);
if (commit && !parse_commit(commit))
pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0,
subject, sizeof(subject), 0,
NULL, NULL, 0);
else
strcpy(subject, " **** invalid ref ****");
printf(" %s %s\n", find_unique_abbrev(sha1, abbrev), subject);
}
static void print_ref_list(int kinds, int verbose, int abbrev)
{ {
int i; int i;
char c; char c;
@ -169,7 +192,13 @@ static void print_ref_list(int kinds)
!strcmp(ref_list.list[i].name, head)) !strcmp(ref_list.list[i].name, head))
c = '*'; c = '*';
printf("%c %s\n", c, ref_list.list[i].name); if (verbose) {
printf("%c %-*s", c, ref_list.maxwidth,
ref_list.list[i].name);
print_ref_info(ref_list.list[i].sha1, abbrev);
}
else
printf("%c %s\n", c, ref_list.list[i].name);
} }
free_ref_list(&ref_list); free_ref_list(&ref_list);
@ -215,6 +244,7 @@ static void create_branch(const char *name, const char *start,
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, force_delete = 0, force_create = 0; int delete = 0, force_delete = 0, force_create = 0;
int verbose = 0, abbrev = DEFAULT_ABBREV;
int reflog = 0; int reflog = 0;
int kinds = REF_LOCAL_BRANCH; int kinds = REF_LOCAL_BRANCH;
int i; int i;
@ -255,6 +285,14 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
reflog = 1; reflog = 1;
continue; continue;
} }
if (!strncmp(arg, "--abbrev=", 9)) {
abbrev = atoi(arg+9);
continue;
}
if (!strcmp(arg, "-v")) {
verbose = 1;
continue;
}
usage(builtin_branch_usage); usage(builtin_branch_usage);
} }
@ -268,7 +306,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
if (delete) if (delete)
delete_branches(argc - i, argv + i, force_delete); delete_branches(argc - i, argv + i, force_delete);
else if (i == argc) else if (i == argc)
print_ref_list(kinds); print_ref_list(kinds, verbose, abbrev);
else if (i == argc - 1) else if (i == argc - 1)
create_branch(argv[i], head, force_create, reflog); create_branch(argv[i], head, force_create, reflog);
else if (i == argc - 2) else if (i == argc - 2)