提交 c24fe420 编写于 作者: J Junio C Hamano

show-branch: omit uninteresting merges.

Signed-off-by: NJunio C Hamano <junkio@cox.net>
上级 746437d5
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#include "refs.h" #include "refs.h"
static const char show_branch_usage[] = static const char show_branch_usage[] =
"git-show-branch [--current] [--all] [--heads] [--tags] [--topo-order] [--more=count | --list | --independent | --merge-base ] [--topics] [<refs>...]"; "git-show-branch [--dense] [--current] [--all] [--heads] [--tags] [--topo-order] [--more=count | --list | --independent | --merge-base ] [--topics] [<refs>...]";
static int default_num = 0; static int default_num = 0;
static int default_alloc = 0; static int default_alloc = 0;
...@@ -527,6 +527,27 @@ static int git_show_branch_config(const char *var, const char *value) ...@@ -527,6 +527,27 @@ static int git_show_branch_config(const char *var, const char *value)
return git_default_config(var, value); return git_default_config(var, value);
} }
static int omit_in_dense(struct commit *commit, struct commit **rev, int n)
{
/* If the commit is tip of the named branches, do not
* omit it.
* Otherwise, if it is a merge that is reachable from only one
* tip, it is not that interesting.
*/
int i, flag, count;
for (i = 0; i < n; i++)
if (rev[i] == commit)
return 0;
flag = commit->object.flags;
for (i = count = 0; i < n; i++) {
if (flag & (1u << (i + REV_SHIFT)))
count++;
}
if (count == 1)
return 1;
return 0;
}
int main(int ac, char **av) int main(int ac, char **av)
{ {
struct commit *rev[MAX_REVS], *commit; struct commit *rev[MAX_REVS], *commit;
...@@ -548,6 +569,7 @@ int main(int ac, char **av) ...@@ -548,6 +569,7 @@ int main(int ac, char **av)
int with_current_branch = 0; int with_current_branch = 0;
int head_at = -1; int head_at = -1;
int topics = 0; int topics = 0;
int dense = 1;
setup_git_directory(); setup_git_directory();
git_config(git_show_branch_config); git_config(git_show_branch_config);
...@@ -590,6 +612,8 @@ int main(int ac, char **av) ...@@ -590,6 +612,8 @@ int main(int ac, char **av)
lifo = 1; lifo = 1;
else if (!strcmp(arg, "--topics")) else if (!strcmp(arg, "--topics"))
topics = 1; topics = 1;
else if (!strcmp(arg, "--sparse"))
dense = 0;
else if (!strcmp(arg, "--date-order")) else if (!strcmp(arg, "--date-order"))
lifo = 0; lifo = 0;
else else
...@@ -732,12 +756,15 @@ int main(int ac, char **av) ...@@ -732,12 +756,15 @@ int main(int ac, char **av)
shown_merge_point |= is_merge_point; shown_merge_point |= is_merge_point;
if (1 < num_rev) { if (1 < num_rev) {
int is_merge = !!(commit->parents && commit->parents->next); int is_merge = !!(commit->parents &&
commit->parents->next);
if (topics && if (topics &&
!is_merge_point && !is_merge_point &&
(this_flag & (1u << REV_SHIFT))) (this_flag & (1u << REV_SHIFT)))
continue; continue;
if (dense && is_merge &&
omit_in_dense(commit, rev, num_rev))
continue;
for (i = 0; i < num_rev; i++) { for (i = 0; i < num_rev; i++) {
int mark; int mark;
if (!(this_flag & (1u << (i + REV_SHIFT)))) if (!(this_flag & (1u << (i + REV_SHIFT))))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册