show-branch --topics
authorJunio C Hamano <junkio@cox.net>
Fri, 3 Mar 2006 01:14:00 +0000 (17:14 -0800)
committerJunio C Hamano <junkio@cox.net>
Fri, 3 Mar 2006 01:16:08 +0000 (17:16 -0800)
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>
show-branch.c

index 5a86ae2..452e63f 100644 (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))))