call merge tool properly
[xonotic/div0-gittools.git] / git-branch-manager
index 43a80790c932612071974c5124d7ebd5bcff09cf..2d319857a9024d2ef0e470442c09873601785af4 100755 (executable)
@@ -16,12 +16,12 @@ my %color =
 
 my %html_style =
 (
-       '' => "color: white; background-color: black",
-       'outstanding' => "color: white; background-color: yellow",
-       'unmerge' => "color: white; background-color: red",
-       'merge' => "color: white; background-color: green",
-       'base' => "color: white; background-color: lightblue",
-       'previous' => "color: white; background-color: blue",
+       '' => "color: black; background-color: black",
+       'outstanding' => "color: black; background-color: yellow",
+       'unmerge' => "color: black; background-color: red",
+       'merge' => "color: black; background-color: green",
+       'base' => "color: black; background-color: lightblue",
+       'previous' => "color: black; background-color: blue",
 );
 
 my %name =
@@ -70,7 +70,7 @@ my @datefilter = ();
 my $revprefix = "";
 if($datefilter eq 'mergebase')
 {
-       chomp($revprefix = check_defined "git-merge-base: $!", backtick 'git', 'merge-base', $master, "HEAD");
+       chomp($revprefix = check_defined "git-merge-base: $!", backtick 'git', 'merge-base', $master, $branch);
        $revprefix .= "^..";
 }
 elsif($datefilter ne '')
@@ -78,6 +78,9 @@ elsif($datefilter ne '')
        @datefilter = "--since=$datefilter";
 }
 
+# if set, don't actually merge/revert changes, just mark as such
+my $skip = 0;
+
 our $do_commit = 1;
 my $logcache = undef;
 sub reset_to_commit($)
@@ -135,13 +138,18 @@ sub merge_commit($)
        local $ENV{GIT_AUTHOR_NAME} = $author;
        local $ENV{GIT_AUTHOR_EMAIL} = $email;
        local $ENV{GIT_AUTHOR_DATE} = $date;
-       run 'git', 'cherry-pick', '-n', $r
-               or run 'git', 'mergetool'
-                       or die "git-mergetool: $!";
+       if(!$skip)
+       {
+               run 'git', 'cherry-pick', '-n', $r
+                       or run 'git', 'mergetool'
+                               or die "git-mergetool: $!";
+       }
        if($do_commit)
        {
                run 'git', 'commit', '-F', '.commitmsg'
-                       or die "git-commit: $!";
+                       or (run 'git', 'mergetool'
+                               and run 'git', 'commit', '-F', '.commitmsg')
+                                       or die "git-commit: $!";
        }
 }
 
@@ -182,13 +190,18 @@ sub unmerge_commit($)
        local $ENV{GIT_AUTHOR_NAME} = $author;
        local $ENV{GIT_AUTHOR_EMAIL} = $email;
        local $ENV{GIT_AUTHOR_DATE} = $date;
-       run 'git', 'revert', '-n', $r
-               or run 'git', 'mergetool'
-                       or die "git-mergetool: $!";
+       if(!$skip)
+       {
+               run 'git', 'revert', '-n', $r
+                       or run 'git', 'mergetool'
+                               or die "git-mergetool: $!";
+       }
        if($do_commit)
        {
                run 'git', 'commit', '-F', '.commitmsg'
-                       or die "git-commit: $!";
+                       or (run 'git', 'mergetool'
+                               and run 'git', 'commit', '-F', '.commitmsg')
+                                       or die "git-commit: $!";
        }
 }
 
@@ -271,7 +284,7 @@ sub parse_log()
        }
        $cur_commit = $cur_msg = undef;
        my @commits = ();
-       for((split /\n/, check_defined "git-log: $!", backtick 'git', 'log', '--topo-order', '--reverse', '--pretty=fuller', @datefilter, "$revprefix"."HEAD"), undef)
+       for((split /\n/, check_defined "git-log: $!", backtick 'git', 'log', '--topo-order', '--reverse', '--pretty=fuller', @datefilter, "$revprefix$branch"), undef)
        {
                if(defined $cur_commit and (not defined $_ or /^commit (\S+)/))
                {
@@ -481,7 +494,7 @@ sub opt_rebase($$)
                die "PEBKAC: not initialized"
                        unless defined $l->{base};
        }
-       my $msg = backtick 'git', 'log', '-1', '--pretty=fuller', @datefilter, 'HEAD'
+       my $msg = backtick 'git', 'log', '-1', '--pretty=fuller', @datefilter, $branch
                or die "git-log: $!";
        $msg =~ /^commit (\S+)/s
                or die "Invalid git log output";
@@ -570,7 +583,8 @@ sub opt_list($$)
                {
                        my ($action, $r) = @$_;
                        my $m = $l->{logmsg}->{$r};
-                       printf "<tr style=\"%s\"><td>%s</td><td><a href=\"%s%s\">%s</a></td><td>%s</td></tr>\n", $html_style{$action}, $name{$action}, escapeHTML($r), escapeHTML($cgi_url), escapeHTML($r), escapeHTML($m);
+                       my $m_short = join ' ', map { s/^    (?!git-svn-id)(.)/$1/ ? $_ : () } split /\n/, $m;
+                       printf "<tr style=\"%s\"><td>%s</td><td><a href=\"%s%s\">%s</a></td><td style=\"white-space: pre\">%s</td></tr>\n", $html_style{$action}, $name{$action}, escapeHTML($cgi_url), escapeHTML($r), escapeHTML($r), escapeHTML($m_short);
                }
                print "</table>\n";
        }
@@ -631,13 +645,14 @@ my $result = GetOptions(
        "log|l:s", handler \&opt_list,
        "outstanding|o:s", handler \&opt_list,
        "rebase|b=s", handler \&opt_rebase,
+       "skip", handler \$skip,
        "merge|m=s{,}", handler sub { run_script ['merge', $_[1]]; },
        "unmerge|u=s{,}", handler sub { run_script ['unmerge', $_[1]]; },
        "reset|R=s", handler sub { run_script ['reset', $_[1]]; },
        "hardreset|H=s", handler sub { run_script ['hardreset', $_[1]]; },
        "help|h", handler \&opt_help,
        "histsize|s=i", \$histsize,
-       "cgi|c=s", \$cgi_url
+       "cgi=s", \$cgi_url
 );
 if(!$done)
 {