X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topbloke.git;a=blobdiff_plain;f=tb-update.pl;fp=tb-update.pl;h=6005d9e034846bbea47c260020d4712b0a0961f6;hp=18acbc53ababf079bf711401b61800bb551cc131;hb=0329eb76d525c6a7cd8a331697cd1d6b969314ea;hpb=1fad317fcb22638e18719e7949a2cea67809e35e diff --git a/tb-update.pl b/tb-update.pl index 18acbc5..6005d9e 100755 --- a/tb-update.pl +++ b/tb-update.pl @@ -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 ($) {