Give user-defined rules precedence over built-in rules
[ghc-hetmet.git] / darcs-all
index b4ba47e..106eb8f 100644 (file)
--- a/darcs-all
+++ b/darcs-all
@@ -82,6 +82,8 @@ my $checked_out_flag = 0;
 
 my %tags;
 
+my @packages;
+
 # Figure out where to get the other repositories from.
 sub getrepo {
     my $basedir = ".";
@@ -150,14 +152,9 @@ sub darcs {
        or die "darcs failed: $?";
 }
 
-sub darcsall {
-    my $localpath;
-    my $remotepath;
-    my $path;
-    my $tag;
+sub parsePackages {
     my @repos;
-    my $command = $_[0];
-    my $line;
+    my $lineNum;
 
     my ($repo_base, $checked_out_tree) = getrepo();
 
@@ -165,43 +162,66 @@ sub darcsall {
     @repos = <IN>;
     close IN;
 
-    $line = 0;
+    @packages = ();
+    $lineNum = 0;
     foreach (@repos) {
         chomp;
-        $line++;
+        $lineNum++;
         if (/^([^# ]+) +([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+)$/) {
-            $localpath = $1;
-            $tag = $2;
-            $remotepath = $3;
+            my %line;
+            $line{"localpath"}  = $1;
+            $line{"tag"}        = $2;
+            $line{"remotepath"} = $3;
+            $line{"vcs"}        = $4;
+            $line{"upstream"}   = $5;
+            push @packages, \%line;
+        }
+        elsif (! /^(#.*)?$/) {
+            die "Bad content on line $lineNum of packages file: $_";
+        }
+    }
+}
 
-            if ($checked_out_tree) {
-                $path = "$repo_base/$localpath";
-            }
-            else {
-                $path = "$repo_base/$remotepath";
-            }
+sub darcsall {
+    my $localpath;
+    my $remotepath;
+    my $path;
+    my $tag;
+    my @repos;
+    my $command = $_[0];
+    my $line;
+
+    my ($repo_base, $checked_out_tree) = getrepo();
+
+    for $line (@packages) {
+        $localpath  = $$line{"localpath"};
+        $tag        = $$line{"tag"};
+        $remotepath = $$line{"remotepath"};
+
+        if ($checked_out_tree) {
+            $path = "$repo_base/$localpath";
+        }
+        else {
+            $path = "$repo_base/$remotepath";
+        }
 
-            if (-d "$localpath/_darcs") {
-                if ($want_remote_repo) {
-                    if ($command =~ /^opt/) {
-                        # Allows ./darcs-all optimize --relink
-                        darcs (@_, "--repodir", $localpath, "--sibling=$path");
-                    } else {
-                        darcs (@_, "--repodir", $localpath, $path);
-                    }
+        if (-d "$localpath/_darcs") {
+            if ($want_remote_repo) {
+                if ($command =~ /^opt/) {
+                    # Allows ./darcs-all optimize --relink
+                    darcs (@_, "--repodir", $localpath, "--sibling=$path");
                 } else {
-                    darcs (@_, "--repodir", $localpath);
+                    darcs (@_, "--repodir", $localpath, $path);
                 }
-            }
-            elsif ($tag eq "-") {
-                message "== Required repo $localpath is missing! Skipping";
-            }
-            else {
-                message "== $localpath repo not present; skipping";
+            } else {
+                darcs (@_, "--repodir", $localpath);
             }
         }
-        elsif (! /^(#.*)?$/) {
-            die "Bad content on line $line of packages file: $_";
+        elsif ($tag eq "-") {
+            message "== Required repo $localpath is missing! Skipping";
+        }
+        else {
+            message "== $localpath repo not present; skipping";
         }
     }
 }
@@ -225,38 +245,43 @@ sub darcsget {
         $r_flags = \@_;
     }
 
-    open IN, "< packages" or die "Can't open packages file";
-    @repos = <IN>;
-    close IN;
+    for $line (@packages) {
+        $localpath  = $$line{"localpath"};
+        $tag        = $$line{"tag"};
+        $remotepath = $$line{"remotepath"};
 
-    $line = 0;
-    foreach (@repos) {
-        chomp;
-        $line++;
-        if (/^([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+)$/) {
-            $localpath = $1;
-            $tag = $2;
-            $remotepath = $3;
-
-            if ($checked_out_tree) {
-                $path = "$repo_base/$localpath";
+        if ($checked_out_tree) {
+            $path = "$repo_base/$localpath";
+        }
+        else {
+            $path = "$repo_base/$remotepath";
+        }
+
+        if ($tags{$tag} eq 1) {
+            if (-d $localpath) {
+                warning("$localpath already present; omitting");
             }
             else {
-                $path = "$repo_base/$remotepath";
+                darcs (@$r_flags, $path, $localpath);
             }
+        }
+    }
+}
 
-            if (($tag eq "-") || defined($tags{$tag})) {
-                if (-d $localpath) {
-                    warning("$localpath already present; omitting");
-                }
-                else {
-                    darcs (@$r_flags, $path, $localpath);
-                }
+sub darcsupstreampull {
+    my $localpath;
+    my $upstream;
+    my $line;
+
+    for $line (@packages) {
+        $localpath  = $$line{"localpath"};
+        $upstream   = $$line{"upstream"};
+
+        if ($upstream ne "-") {
+            if (-d $localpath) {
+                darcs ("pull", @_, "--repodir", $localpath, $upstream);
             }
         }
-        elsif (! /^(#.*)?$/) {
-            die "Bad content on line $line of packages file: $_";
-        }
     }
 }
 
@@ -265,6 +290,12 @@ sub main {
         die "error: darcs-all must be run from the top level of the ghc tree."
     }
 
+    $tags{"-"} = 1;
+    $tags{"dph"} = 1;
+    $tags{"nofib"} = 0;
+    $tags{"testsuite"} = 0;
+    $tags{"extra"} = 0;
+
     while ($#_ ne -1) {
         my $arg = shift;
         # We handle -q here as well as lower down as we need to skip over it
@@ -286,16 +317,35 @@ sub main {
         elsif ($arg eq "--nofib") {
             $tags{"nofib"} = 1;
         }
+        elsif ($arg eq "--no-nofib") {
+            $tags{"nofib"} = 0;
+        }
         # --testsuite tells get to also grab the testsuite repo.
         # It has no effect on the other commands.
         elsif ($arg eq "--testsuite") {
             $tags{"testsuite"} = 1;
         }
+        elsif ($arg eq "--no-testsuite") {
+            $tags{"testsuite"} = 0;
+        }
+        # --dph tells get to also grab the dph repo.
+        # It has no effect on the other commands.
+        elsif ($arg eq "--dph") {
+            $tags{"dph"} = 1;
+        }
+        elsif ($arg eq "--no-dph") {
+            $tags{"dph"} = 0;
+        }
         # --extralibs tells get to also grab the extra repos.
         # It has no effect on the other commands.
         elsif ($arg eq "--extra") {
             $tags{"extra"} = 1;
         }
+        elsif ($arg eq "--no-extra") {
+            $tags{"extra"} = 0;
+        }
+        # Use --checked-out if the remote repos are a checked-out tree,
+        # rather than the master trees.
         elsif ($arg eq "--checked-out") {
             $checked_out_flag = 1;
         }
@@ -312,9 +362,14 @@ sub main {
         die "What do you want to do?";
     }
     my $command = $_[0];
+    parsePackages;
     if ($command eq "get") {
         darcsget @_;
     }
+    elsif ($command eq "upstreampull") {
+        shift;
+        darcsupstreampull @_;
+    }
     else {
         if ($command =~ /^(?:w|wh|wha|what|whats|whatsn|whatsne|whatsnew)$/) {
             # Hack around whatsnew failing if there are no changes