chiark / gitweb /
update: find best merge source
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 1 Feb 2012 18:38:05 +0000 (18:38 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 1 Feb 2012 18:38:05 +0000 (18:38 +0000)
tb-update.pl

index 18acbc5..6005d9e 100755 (executable)
@@ -29,13 +29,25 @@ sub merge_base ($$) {
                });
 }
 
-sub committ_date ($) {
+sub commit_date ($) {
     my ($ref) = @_;
     my $l = run_git_1line(qw(git-log --date=raw -n1 --pretty=format:%cd), $ref);
     $l =~ m/^(\d+)\s/ or die;
     return $l;
 }
 
+sub compare_source_ages ($$) {
+    my ($r,$s) = @_; # refs, returns something like  age($r) cmp age($s)
+    our %memos;
+    return memo(\%memos, "$r $s", sub {
+       my $mb = merge_base($r, $s);
+       return -($mb eq $r) cmp ($mb eq $s)
+           # if merge base is $a then $a must be before $b
+           # ie the commit equal to the merge base is earlier
+           or (commit_date($r) cmp commit_date($s));
+    });
+}
+
 sub update_base ($) {
     my ($patch) = @_;
 
@@ -108,30 +120,13 @@ sub update_base ($) {
        # ie we are ahead of the source.  Skip those sources.
        @sources = grep { $source->{MergeBase} ne $source->{Head} } @sources;
 
-       our %cmp_memos;
-       @sources = sort { 
-           memo(\%cmp_memos, "$a->{Name} $b->{Name}", sub {
-               my $mb = merge_base($a->{Ref}, $b->{Ref});
-               return -($mb eq $a->{Ref}) cmp ($mb eq $b->{Ref})
-                   # if merge base is $a then $a must be before $b
-                   # ie the commit equal to the merge base is earlier
-                   or (committ_date($a->{Ref}) cmp committ_date($b->{Ref}));
-           })
-       } @sources;
-       fixme we do not need to sort, only find best, and then do again
-
-       # Now we run git-rev-list to walk the graph back to those
-       # sources so we can tell which is the most recent.
-       foreach my $source (@sources) {
-           
-
-    
-           $source->{MergeBase} = $mergebase;
-           
-           bad_metadata("$patch base topgit $obj") unless $obj eq 'blob';
-           
-           # ok
-       } elsif ($obk 
+       my $best = $sources[0];
+       foreach my $source (@sources[1..$#sources]) {
+           next if compare_source_ages($best->{Ref}, $source->{Ref}) <= 0;
+           $best = $source;
+               
+       }
+       
 
 
 sub done ($) {