3 # Copyright (c) 2006 Junio C Hamano
9 my $topic_pattern = '??*/*';
11 my @stage = qw(next pu);
12 my @mark = ('.', '?', '-', '+');
17 GetOptions("topic=s" => \$topic_pattern,
19 "stage=s" => \@custom_stage,
20 "mark=s" => \@custom_mark,
24 if (@custom_stage) { @stage = @custom_stage; }
25 if (@custom_mark) { @mark = @custom_mark; }
30 open(REVS, '-|', qw(git rev-list --no-merges), @args)
41 my ($bottom, $top, $mask) = @_;
43 open(REVS, '-|', qw(git rev-list --pretty=oneline --no-merges),
48 my ($sha1, $topic) = /^([0-9a-f]{40}) (.*)$/;
49 push @revs, [$sha1, $topic, $mask];
56 my ($topic, $stage, $in_next) = @_;
57 my @not_in_topic = read_revs_short('^master', "^$topic", "$stage");
59 # @$in_next is what is in $stage but not in $base.
60 # @not_in_topic excludes what came from $topic from @$in_next.
61 # $topic can be rebased if these two set matches, because
62 # no commits in $topic has been merged to $stage yet.
63 if (@not_in_topic != @$in_next) {
64 # we cannot rebase it anymore
67 if (read_revs_short('master', "^$topic")) {
68 # there is something that is in master but not in topic.
71 # topic is up to date.
77 open(CONF, '-|', qw(git repo-config --get),
78 "branch.$topic.description")
80 my $it = join('',<CONF>);
91 ~^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
93 ~~^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
99 open(TOPIC, '-|', qw(git for-each-ref),
100 '--sort=-authordate',
101 '--format=%(objectname) %(authordate) %(refname)',
102 "refs/heads/$topic_pattern")
105 my @in_next = read_revs_short('^master', $stage[0]);
109 my ($sha1, $date, $topic) = m|^([0-9a-f]{40})\s(.*?)\srefs/heads/(.+)$|
111 my @revs = read_revs($base, $sha1, (1<<@stage)-1);
112 next unless (@revs || $all);
114 my %revs = map { $_->[0] => $_ } @revs; # fast index
115 for (my $i = 0; $i < @stage; $i++) {
116 for my $item (read_revs_short("^$stage[$i]", $sha1)) {
117 if (exists $revs{$item}) {
118 $revs{$item}[2] &= ~(1 << $i);
123 print '*' . rebase_marker($sha1, $stage[0], \@in_next);
126 $count = " " . (scalar @revs) . " commits";
129 $count = " 1 commit";
131 print " $topic ($date)$count\n";
132 describe_topic($topic);
133 for my $item (@revs) {
134 my $mark = $item->[2];
136 $mark = $mark[$mark];
138 wrap_print("$mark $item->[1]");