]> mj.ucw.cz Git - git-tools.git/commitdiff
Update2: Improved detection of source branches
authorMartin Mares <mj@ucw.cz>
Thu, 9 Apr 2015 14:16:40 +0000 (16:16 +0200)
committerMartin Mares <mj@ucw.cz>
Thu, 9 Apr 2015 14:16:40 +0000 (16:16 +0200)
When a new branch or tag is created, we tried to detect the branch
where the current commit comes from.

The new detection code is more robust (it parses the output of
"git for-each-ref" instead of "git branch") and it adds a hint when
multiple source branches match.

update2

diff --git a/update2 b/update2
index 1caa5ca056bc255874850362c5f0d0ff1dfbc856..ef1ee59549cafc6634a0794d3e4e009f1a1bd28e 100755 (executable)
--- a/update2
+++ b/update2
@@ -49,17 +49,24 @@ if (@ARGV) {
        }
 }
 
-sub scan_branches($$) {
+sub get_source($$) {
        my ($ref, $new) = @_;
-       # Is there any branch pointing to $new (other than $ref)?
-       for (`git branch -v --no-abbrev`) {
+       # Get branch (different from $ref) whose tip is $new
+       my @branches = ();
+       for (`git for-each-ref refs/heads`) {
                chomp;
-               my ($name, $sha) = /^..(\S+)\s+(\S+)/ or die;
-               if ((!defined($ref) || $name ne $ref) && $sha eq $new) {
-                       return $name;
+               my ($sha, $type, $name) = m{^(\S+) (\S+)\trefs/heads/(\S+)$} or die;
+               if ((!defined($ref) || $name ne $ref) && $sha eq $new && $type eq 'commit') {
+                       push @branches, $name;
                }
        }
-       return;
+       if (@branches == 1) {
+               return $branches[0];
+       } elsif (@branches) {
+               return sprintf("%s [and %d other]", $branches[0], @branches-1);
+       } else {
+               return;
+       }
 }
 
 sub scan_commits($$) {
@@ -98,7 +105,7 @@ sub update_branch($$$$$)
        if ($old =~ /^0+$/) {
                # Creation of a branch
                $subj .= ' Created branch';
-               my $copy_of = scan_branches($branch, $new);
+               my $copy_of = get_source($branch, $new);
                if (defined $copy_of) {
                        $subj .= " as a copy of $copy_of";
                        print $out "Created branch $branch as a copy of $copy_of ($new).\n";
@@ -194,7 +201,7 @@ sub update_tag($$$$$)
                $subj .= " Deleted tag $tag";
                print $out "Deleted tag $tag ($old).\n";
        } else {
-               my $copy_of = scan_branches(undef, $new);
+               my $copy_of = get_source(undef, $new);
                my $cp = defined($copy_of) ? " to branch $copy_of" : "";
                if ($old =~ /^0+/) {
                        $subj .= " Created tag $tag$cp";