From 0329eb76d525c6a7cd8a331697cd1d6b969314ea Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 1 Feb 2012 18:38:05 +0000 Subject: [PATCH] update: find best merge source --- tb-update.pl | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) 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 ($) { -- 2.30.2