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');