show-branch --topics

This adds a new flag, --topics, to help managing topic
branches.  When you have topic branches forked some time ago
from your primary line of development, show-branch would show
many "uninteresting" things that happend on the primary line of
development when trying to see what are still not merged from
the topic branches.

With this flag, the first ref given to show-branch is taken as
the primary branch, and the rest are taken as the topic
branches.  Output from the command is modified so that commits
only on the primary branch are not shown.  In other words,

	$ git show-branch --topics master topic1 topic2 ...

shows an (almost) equivalent of

	$ git rev-list ^master topic1 topic2 ...

The major differences are that (1) you can tell which commits
are on which branch, and (2) the commit at the fork point is
shown.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2006-03-02 17:14:00 -08:00
parent 0b8b051cd5
commit d320a5437f

View File

@ -5,7 +5,7 @@
#include "refs.h"
static const char show_branch_usage[] =
"git-show-branch [--current] [--all] [--heads] [--tags] [--topo-order] [--more=count | --list | --independent | --merge-base ] [<refs>...]";
"git-show-branch [--current] [--all] [--heads] [--tags] [--topo-order] [--more=count | --list | --independent | --merge-base ] [--topics] [<refs>...]";
static int default_num = 0;
static int default_alloc = 0;
@ -547,6 +547,7 @@ int main(int ac, char **av)
int shown_merge_point = 0;
int with_current_branch = 0;
int head_at = -1;
int topics = 0;
setup_git_directory();
git_config(git_show_branch_config);
@ -587,6 +588,8 @@ int main(int ac, char **av)
independent = 1;
else if (!strcmp(arg, "--topo-order"))
lifo = 1;
else if (!strcmp(arg, "--topics"))
topics = 1;
else if (!strcmp(arg, "--date-order"))
lifo = 0;
else
@ -729,6 +732,20 @@ int main(int ac, char **av)
if (1 < num_rev) {
int is_merge = !!(commit->parents && commit->parents->next);
if (topics) {
int interesting = 0;
for (i = 1; i < num_rev; i++) {
if ((this_flag &
(1u << (i + REV_SHIFT)))) {
interesting = 1;
break;
}
}
if (!interesting)
continue;
}
for (i = 0; i < num_rev; i++) {
int mark;
if (!(this_flag & (1u << (i + REV_SHIFT))))