});
}
-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) = @_;
# 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 ($) {