chiark / gitweb /
before NEW THEORY
[topbloke.git] / tb-update.pl
index cd4e177ab00ca0ef7895429648d369ff13dc8d77..58e7d602470c23c11766b39edd1322ba44584694 100755 (executable)
@@ -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');