From: Ian Jackson Date: Mon, 6 Feb 2012 13:44:42 +0000 (+0000) Subject: Unwanted dep removal search - difficulties X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=topbloke.git;a=commitdiff_plain;h=3ec6b37d1ae4571c56e8f228817ba829ac2ef3bc Unwanted dep removal search - difficulties --- diff --git a/DESIGN b/DESIGN index 09cea32..a5c7ee6 100644 --- a/DESIGN +++ b/DESIGN @@ -259,18 +259,18 @@ Unwanted removal search subgraphs: inc inc.. / ??? \ - rm + rm inc.. rm.. merge of a removal, search down the rm path / [inc] \ inc ??? call it an inclusion, terminate the search rm - inc merge of an inclusion, terminates search + inc merge of an inclusion, terminates search inc.. rm.. / [rm] \ - inc ??? call it an inclusion, terminate search + inc ??? call it an inclusion, terminate search rm.. rm.. / ??? \ diff --git a/tb-update.pl b/tb-update.pl index cd4e177..d5eed35 100755 --- a/tb-update.pl +++ b/tb-update.pl @@ -145,15 +145,41 @@ sub update_base ($) { next if $source_inc{$dep}; unless unless $anc_inc{$dep}; my $unw_dr = { Name => $dep }; + 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');