about summary refs log tree commit diff
path: root/scripts/maintenance/shrink-manifest.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/maintenance/shrink-manifest.pl')
-rwxr-xr-xscripts/maintenance/shrink-manifest.pl77
1 files changed, 77 insertions, 0 deletions
diff --git a/scripts/maintenance/shrink-manifest.pl b/scripts/maintenance/shrink-manifest.pl
new file mode 100755
index 000000000000..9ceb4af90cde
--- /dev/null
+++ b/scripts/maintenance/shrink-manifest.pl
@@ -0,0 +1,77 @@
+#! /usr/bin/perl -w -I. -I..
+
+use strict;
+use readmanifest;
+use readcache;
+
+
+my %allNarFiles;
+my %allPatches;
+my %allSuccessors;
+
+foreach my $manifest (glob "/data/webserver/dist/*/*/MANIFEST") {
+    print STDERR "loading $manifest\n";
+    readManifest($manifest, \%allNarFiles, \%allPatches, \%allSuccessors, 1);
+}
+
+
+
+foreach my $manifest (@ARGV) {
+
+    print STDERR "shrinking manifest $manifest...\n";
+
+    my %narFiles;
+    my %patches;
+    my %successors;
+
+    if (readManifest($manifest, \%narFiles, \%patches, \%successors, 1) < 3) {
+        print STDERR "manifest `$manifest' is too old (i.e., for Nix <= 0.7)\n";
+	next;
+    }
+
+    my %done;
+
+    sub traverse {
+	my $p = shift;
+	my $prefix = shift;
+	print "$prefix$p\n";
+
+	my $reachesNAR = 0;
+
+	foreach my $patch (@{$patches{$p}}) {
+	    next if defined $done{$patch->{url}};
+	    $done{$patch->{url}} = 1;
+	    $reachesNAR = 1 if traverse ($patch->{basePath}, $prefix . "  ");
+	}
+
+	$reachesNAR = 1 if defined $allNarFiles{$p};
+
+	print "  $prefix$reachesNAR\n";
+	return $reachesNAR;
+    }
+
+#    foreach my $p (keys %narFiles) {
+#	traverse ($p, "");
+#    }
+
+    my %newPatches;
+
+    foreach my $p (keys %patches) {
+	my $patchList = $patches{$p};
+	my @newList;
+	foreach my $patch (@{$patchList}) {
+	    if (! defined $allNarFiles{$patch->{basePath}} || 
+		! defined $allNarFiles{$p} ) 
+	    {
+#		print "REMOVING PATCH ", $patch->{basePath}, " -> ", $p, "\n";
+	    } else {
+#		print "KEEPING PATCH ", $patch->{basePath}, " -> ", $p, "\n";
+		push @newList, $patch;
+	    }
+	}
+	$newPatches{$p} = \@newList;
+    }
+
+    writeManifest ($manifest, \%narFiles, \%newPatches);
+}
+