Andy Parkins <andyparkins@xxxxxxxxx> writes: > -static void print_ref_list(int remote_only) > +static void print_ref_list(int display_mode) > { > int i; > char c; > > - if (remote_only) > + if (display_mode) > for_each_remote_ref(append_ref, NULL); > else > for_each_branch_ref(append_ref, NULL); If you make this a "mode", it probably is better to make 1 and 0 into symbolic constants. This patch taken alone is regression in readability. By the way, it might make sense to make it bitfields; that would allow you to show either one kind or both. Something like this untested patch, that is... diff --git a/builtin-branch.c b/builtin-branch.c index 368b68e..182648c 100644 --- a/builtin-branch.c +++ b/builtin-branch.c @@ -79,45 +79,73 @@ static void delete_branches(int argc, co } } +#define REF_LOCAL_BRANCH 01 +#define REF_REMOTE_BRANCH 02 + static int ref_index, ref_alloc; -static char **ref_list; +static struct ref_list { + int kind; + char name[FLEX_ARRAY]; +} **ref_list; -static int append_ref(const char *refname, const unsigned char *sha1, int flags, - void *cb_data) +static int append_ref(const char *refname, const unsigned char *sha1, + int flags, void *cb_data) { + int kinds = *((int*)cb_data); + int this_kind, strip; + struct ref_list *elem; + + if (!strncmp(refname, "refs/heads/", 11)) { + this_kind = REF_LOCAL_BRANCH; + strip = 11; + } + else if (!strncmp(refname, "refs/remotes/", 13)) { + this_kind = REF_REMOTE_BRANCH; + strip = 13; + } + else + this_kind = 0; + + if ((this_kind & kinds) == 0) + return 0; + if (ref_index >= ref_alloc) { ref_alloc = alloc_nr(ref_alloc); ref_list = xrealloc(ref_list, ref_alloc * sizeof(char *)); } - - ref_list[ref_index++] = xstrdup(refname); + + elem = xcalloc(1, sizeof(*elem) + strlen(refname) - strip); + strcpy(elem->name, refname + strip); + elem->kind = this_kind; + ref_list[ref_index++] = elem; return 0; } -static int ref_cmp(const void *r1, const void *r2) +static int ref_cmp(const void *r1_, const void *r2_) { - return strcmp(*(char **)r1, *(char **)r2); + const struct ref_list *r1 = *((const struct ref_list **)r1_); + const struct ref_list *r2 = *((const struct ref_list **)r2_); + + if (r1->kind != r2->kind) + return r1->kind - r2->kind; + return strcmp(r1->name, r2->name); } -static void print_ref_list(int remote_only) +static void print_ref_list(int kinds) { int i; char c; - if (remote_only) - for_each_remote_ref(append_ref, NULL); - else - for_each_branch_ref(append_ref, NULL); - + for_each_ref(append_ref, &kinds); qsort(ref_list, ref_index, sizeof(char *), ref_cmp); for (i = 0; i < ref_index; i++) { c = ' '; - if (!strcmp(ref_list[i], head)) + if (ref_list[i]->kind == REF_LOCAL_BRANCH && + !strcmp(ref_list[i]->name, head)) c = '*'; - - printf("%c %s\n", c, ref_list[i]); + printf("%c %s\n", c, ref_list[i]->name); } } @@ -160,8 +188,9 @@ static void create_branch(const char *na int cmd_branch(int argc, const char **argv, const char *prefix) { - int delete = 0, force_delete = 0, force_create = 0, remote_only = 0; + int delete = 0, force_delete = 0, force_create = 0; int reflog = 0; + int kinds = REF_LOCAL_BRANCH; int i; git_config(git_default_config); @@ -189,7 +218,11 @@ int cmd_branch(int argc, const char **ar continue; } if (!strcmp(arg, "-r")) { - remote_only = 1; + kinds = REF_REMOTE_BRANCH; + continue; + } + if (!strcmp(arg, "-a")) { + kinds = REF_REMOTE_BRANCH | REF_LOCAL_BRANCH; continue; } if (!strcmp(arg, "-l")) { @@ -209,7 +242,7 @@ int cmd_branch(int argc, const char **ar if (delete) delete_branches(argc - i, argv + i, force_delete); else if (i == argc) - print_ref_list(remote_only); + print_ref_list(kinds); else if (i == argc - 1) create_branch(argv[i], head, force_create, reflog); else if (i == argc - 2) - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html