#!/usr/bin/perl -w use strict; my @top_dirs = ("nofib", "testsuite"); my $reporoot; my $verbose = 1; my $ignore_failure = 0; # --checked-out says we are pushing to a checked out tree my $checked_out = 0; # --boot-only says we only want to push bootlibs, not extralibs my $boot_only = 0; # --push or --pull? my $push_pull = "push"; sub message { if ($verbose) { print "@_\n"; } } sub warning { print "warning: @_\n"; } sub darcs { message "== running darcs @_"; system ("darcs", @_) == 0 or $ignore_failure or die "darcs failed: $?"; } sub darcs_push { darcs ($push_pull, "--no-set-default", @_); } sub pushall { my $dir; my $ghcrepo = $checked_out ? $reporoot : "$reporoot/ghc"; darcs_push ($ghcrepo, @_); for $dir (@top_dirs) { if (-d $dir && -d "$dir/_darcs") { darcs_push ("$reporoot/$dir", @_, "--repodir", $dir); } else { message "== $dir not present or not a repository; skipping"; } } my $library_lists = $boot_only ? "libraries/boot-packages" : "libraries/boot-packages libraries/extra-packages"; for my $pkg (`cat $library_lists`) { chomp $pkg; $dir = "libraries/$pkg"; if (-d "$dir") { darcs_push ("$reporoot/$dir", @_, "--repodir", "$dir"); } else { warning("$pkg doesn't exist, use 'darcs-all get' to get it"); } } } sub main { if (! -d "_darcs" || ! -d "compiler") { die "error: darcs-all must be run from the top level of the ghc tree." } if ($#_ ne -1) { while ($#_ ne -1) { my $arg = shift; # We handle -q here as well as lower down as we need to skip # over it if it comes before the darcs command if ($arg eq "-q") { $verbose = 0; } elsif ($arg eq "--ignore-failure") { $ignore_failure = 1; } elsif ($arg eq "--checked-out") { $checked_out = 1; } elsif ($arg eq "--boot-only") { $boot_only = 1; } elsif ($arg eq "--push") { $push_pull = "push"; } elsif ($arg eq "--pull") { $push_pull = "pull"; } else { $reporoot = $arg; if (grep /^-q$/, @_) { $verbose = 0; } last; } } } else { die "Where do you want to push to?"; } pushall (@_); } main(@ARGV);