#!/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 = ; 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);