Add tarball syncing to darcs-all
[ghc-hetmet.git] / darcs-all
index cdef628..69445d0 100644 (file)
--- a/darcs-all
+++ b/darcs-all
@@ -112,6 +112,14 @@ sub warning {
     }
 }
 
+sub download {
+    my ($from, $to) = @_;
+
+    my @cmd = ("wget", $from, "-O", $to);
+    message "== running @cmd";
+    system @cmd;
+}
+
 sub darcs {
     message "== running darcs @_";
     system ("darcs", @_) == 0
@@ -132,7 +140,7 @@ sub darcsall {
     @repos = <IN>;
     close IN;
 
-    REPO: foreach (@repos) {
+    foreach (@repos) {
         chomp;
         if (/^([^# ]+) +(?:([^ ]+) +)?([^ ]+) +([^ ]+)$/) {
             $localpath = $1;
@@ -164,6 +172,10 @@ sub darcsall {
             die "Bad line: $_";
         }
     }
+
+    if ($_[0] eq "pull" || $_[0] eq "pul") {
+        &sync_tarballs();
+    }
 }
 
 sub darcsget {
@@ -215,6 +227,63 @@ sub darcsget {
             die "Bad line: $_";
         }
     }
+
+    &sync_tarballs();
+}
+
+sub sync_tarballs {
+    my $localpath;
+    my $localdirectory;
+    my $localfilename;
+    my $actualpath;
+    my $actualfilename;
+    my $remotepath;
+    my $path;
+    my @tarballs;
+    my %localtarballs;
+    my ($repo_base, $checked_out_tree) = getrepo();
+
+    message "== Syncing tarballs";
+
+    open IN, "< tarballs" or die "Can't open packages file";
+    @tarballs = <IN>;
+    close IN;
+
+    foreach (@tarballs) {
+        chomp;
+        if (m@^([^# ]+)/([^#/ ]+) +([^ ]+)$@) {
+            $localdirectory = $1;
+            $localfilename = $2;
+            $remotepath = $3;
+            $localpath = "$localdirectory/$localfilename";
+
+            $localtarballs{$localdirectory}{$localfilename} = 1;
+
+            if (! -e $localpath) {
+                if ($checked_out_tree) {
+                    $path = "$repo_base/$localpath";
+                }
+                else {
+                    $path = "$repo_base/$remotepath";
+                }
+                &download($path, $localpath);
+            }
+        }
+        elsif (! /^(#.*)?$/) {
+            die "Bad line: $_";
+        }
+    }
+
+    foreach $localdirectory (keys %localtarballs) {
+        FILE: foreach $actualpath (glob "$localdirectory/*.tar.gz $localdirectory/*.tar.bz2") {
+            $actualfilename = $actualpath;
+            $actualfilename =~ s#.*/##;
+            if (! defined($localtarballs{$localdirectory}{$actualfilename})) {
+                message "== Deleting $actualpath";
+                unlink $actualpath;
+            }
+        }
+    }
 }
 
 sub main {