* Fix handling of chained patches: don't skip patches if intermediate

paths are missing, etc.
This commit is contained in:
Eelco Dolstra 2004-12-30 17:09:57 +00:00
parent 581bcb986f
commit 3745cecc6a

View file

@ -67,6 +67,12 @@ sub addEdge {
addToQueue $targetPath; addToQueue $targetPath;
sub isValidPath {
my $p = shift;
system "nix-store --isvalid '$p' 2> /dev/null";
return $? == 0;
}
while ($queueFront < scalar @queue) { while ($queueFront < scalar @queue) {
my $u = $queue[$queueFront++]; my $u = $queue[$queueFront++];
print "$u\n"; print "$u\n";
@ -75,8 +81,7 @@ while ($queueFront < scalar @queue) {
# If the path already exists, it has distance 0 from the "start" # If the path already exists, it has distance 0 from the "start"
# node. # node.
system "nix-store --isvalid '$u' 2> /dev/null"; if (isValidPath($u)) {
if ($? == 0) {
addEdge "start", $u, 0, "present", undef; addEdge "start", $u, 0, "present", undef;
} }
@ -85,6 +90,7 @@ while ($queueFront < scalar @queue) {
# Add patch edges. # Add patch edges.
my $patchList = $patches{$u}; my $patchList = $patches{$u};
foreach my $patch (@{$patchList}) { foreach my $patch (@{$patchList}) {
if (isValidPath($patch->{basePath})) {
# !!! this should be cached # !!! this should be cached
my $hash = `nix-hash "$patch->{basePath}"`; my $hash = `nix-hash "$patch->{basePath}"`;
chomp $hash; chomp $hash;
@ -93,6 +99,7 @@ while ($queueFront < scalar @queue) {
print " REJECTING PATCH from $patch->{basePath}\n"; print " REJECTING PATCH from $patch->{basePath}\n";
next; next;
} }
}
print " PATCH from $patch->{basePath}\n"; print " PATCH from $patch->{basePath}\n";
addToQueue $patch->{basePath}; addToQueue $patch->{basePath};
addEdge $patch->{basePath}, $u, $patch->{size}, "patch", $patch; addEdge $patch->{basePath}, $u, $patch->{size}, "patch", $patch;
@ -206,8 +213,8 @@ while (scalar @path > 0) {
# Unpack the resulting NAR archive into the target path. # Unpack the resulting NAR archive into the target path.
print " unpacking patched archive...\n"; print " unpacking patched archive...\n";
system "nix-store --restore $targetPath < /tmp/nar2"; system "nix-store --restore $v < /tmp/nar2";
die "cannot unpack /tmp/nar2 into `$targetPath'" if ($? != 0); die "cannot unpack /tmp/nar2 into `$v'" if ($? != 0);
} }
elsif ($edge->{type} eq "narfile") { elsif ($edge->{type} eq "narfile") {
@ -222,8 +229,8 @@ while (scalar @path > 0) {
# Unpack the archive into the target path. # Unpack the archive into the target path.
print " unpacking archive...\n"; print " unpacking archive...\n";
system "bunzip2 < '$narFilePath' | nix-store --restore '$targetPath'"; system "bunzip2 < '$narFilePath' | nix-store --restore '$v'";
die "cannot unpack `$narFilePath' into `$targetPath'" if ($? != 0); die "cannot unpack `$narFilePath' into `$v'" if ($? != 0);
} }
} }