X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topbloke.git;a=blobdiff_plain;f=tb-update.pl;h=58e7d602470c23c11766b39edd1322ba44584694;hp=cd4e177ab00ca0ef7895429648d369ff13dc8d77;hb=8acb4aba1948cee65c773e1d0c199e190dc4837f;hpb=6b0753965cba21fff6761582c9e0cf4cc30fe877 diff --git a/tb-update.pl b/tb-update.pl index cd4e177..58e7d60 100755 --- a/tb-update.pl +++ b/tb-update.pl @@ -145,15 +145,51 @@ sub update_base ($) { next if $source_inc{$dep}; unless unless $anc_inc{$dep}; my $unw_dr = { Name => $dep }; + + + # Algorithm + # We do a history graph walk. + # In each iteration we get git-rev-list to find us + # one commit. + + # We get git-rev-list to find us + send us a series of commits + # We look up each one. + my @prune; + my $pruned = sub { + my ($commit) = @_; + return grep { commit_has_ancestor($_, $cand) } @prune; + }; + my $prune = sub { + my ($commit) = @_; + return if $pruned->($commit); + push @prune, $commit; + }; run_git(sub { my ($cand, @parents) = split; + if (dep_included_in($dep, $cand)) { + $prune->($cand); + return; + } + my @parents_with = + grep { dep_included_in($dep, $_) } @parents; + return if !@parents_with; # irrelevant merge + return if $pruned->($cand); # not interesting any more + $prune->($_) foreach @parents_with; + + + PROBLEM @prune is bad we want to know why + we have found thing not just whether found + + # return if dep_included_in($dep, $cand); - return if grep { !dep_included_in($dep, $_) } @parents; + return if # OK, it's missing from $cand but included in # all of $cand's parents. }, - qw(git-rev-list --date-order --remove-empty) + qw(git-rev-list --date-order --full-history + --remove-empty) '--pretty=format:%H %P%n', $dep, '--', '.topbloke/+included');