diff options
Diffstat (limited to 'push-all')
-rw-r--r-- | push-all | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/push-all b/push-all new file mode 100644 index 0000000000..ef4dbc8d53 --- /dev/null +++ b/push-all @@ -0,0 +1,129 @@ +#!/usr/bin/perl -w + +use strict; + +my $reporoot; + +my $verbose = 1; +my $ignore_failure = 0; + +# --checked-out says we are pushing to a checked out tree +my $checked_out = 0; +# --push or --pull or --send? +my $push_pull_send = "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_send, "--no-set-default", @_); +} + +sub pushall { + my $dir; + my $localpath; + my $remotepath; + my $path; + my $tag; + my @repos; + + open IN, "< packages" or die "Can't open packages file"; + @repos = <IN>; + close IN; + + REPO: foreach (@repos) { + chomp; + if (/^([^# ]+) +(?:([^ ]+) +)?([^ ]+) +([^ ]+)$/) { + $localpath = $1; + $tag = defined($2) ? $2 : ""; + $remotepath = $3; + + if ($checked_out) { + $path = "$reporoot/$localpath"; + } + else { + if ($remotepath =~ /^http:/) { + message "Ignoring $localpath; remote is http URL"; + next REPO; + } + else { + $path = "$reporoot/$remotepath"; + } + } + + if (-d "$localpath/_darcs") { + darcs_push ($path, @_, "--repodir", $localpath); + } + elsif ($tag eq "") { + message "== Required repo $localpath is missing! Skipping"; + } + else { + message "== $localpath repo not present; skipping"; + } + } + elsif (! /^(#.*)?$/) { + die "Bad line: $_"; + } + } +} + +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 "--push") { + $push_pull_send = "push"; + } + elsif ($arg eq "--pull") { + $push_pull_send = "pull"; + } + elsif ($arg eq "--send") { + $push_pull_send = "send"; + } + else { + $reporoot = $arg; + if (grep /^-q$/, @_) { + $verbose = 0; + } + last; + } + } + } + else { + die "Where do you want to push to?"; + } + + pushall (@_); +} + +main(@ARGV); + |