darcs-all 4.57 KB
Newer Older
Ian Lynagh's avatar
Ian Lynagh committed
1
#!/usr/bin/perl -w
2

Ian Lynagh's avatar
Ian Lynagh committed
3
use strict;
4

Ian Lynagh's avatar
Ian Lynagh committed
5
my @top_dirs = ("nofib", "testsuite", "utils/hsc2hs");
6

7 8
# Figure out where to get the other repositories from,
# based on where this GHC repo came from.
Ian Lynagh's avatar
Ian Lynagh committed
9 10 11 12
my $defaultrepo = `cat _darcs/prefs/defaultrepo`;
chomp $defaultrepo;
my $defaultrepo_base;
my $defaultrepo_lib;
Ian Lynagh's avatar
Ian Lynagh committed
13
my $hsc2hs_repo_loc;
Ian Lynagh's avatar
Ian Lynagh committed
14

Simon Marlow's avatar
Simon Marlow committed
15
if ($defaultrepo =~ /^...*:/) {
Ian Lynagh's avatar
Ian Lynagh committed
16
    # HTTP or SSH
Simon Marlow's avatar
Simon Marlow committed
17 18
    # Above regex says "at least two chars before the :", to avoid
    # catching Win32 drives ("C:\").
Ian Lynagh's avatar
Ian Lynagh committed
19
    $defaultrepo_base = $defaultrepo;
20
    $defaultrepo_base =~ s#/[^/]+/?$##;
Ian Lynagh's avatar
Ian Lynagh committed
21
    $defaultrepo_lib = "$defaultrepo_base/packages";
Ian Lynagh's avatar
Ian Lynagh committed
22
    $hsc2hs_repo_loc = $defaultrepo_base;
23
}
24 25 26
elsif ($defaultrepo =~ /^(\.\.)?\//) {
    # Local filesystem, either absolute or relative path
    # (assumes a checked-out tree):
Ian Lynagh's avatar
Ian Lynagh committed
27 28
    $defaultrepo_base = $defaultrepo;
    $defaultrepo_lib = "$defaultrepo/libraries";
Ian Lynagh's avatar
Ian Lynagh committed
29
    $hsc2hs_repo_loc = "$defaultrepo_base/utils";
30
}
Ian Lynagh's avatar
Ian Lynagh committed
31 32
else {
    die "Couldn't work out defaultrepo";
33 34
}

Ian Lynagh's avatar
Ian Lynagh committed
35
my $verbose = 2;
Ian Lynagh's avatar
Ian Lynagh committed
36
my $ignore_failure = 0;
37

38 39
# --extra says we grab the extra libs with 'get'.  It has no effect on
# the other commands.
Ian Lynagh's avatar
Ian Lynagh committed
40
my $extra = 0;
41 42
# --nofib/--testsuite tell get to also grab the respective repos.
# They have no effect on the other commands.
Ian Lynagh's avatar
Ian Lynagh committed
43 44 45 46
my $nofib = 0;
my $testsuite = 0;

sub message {
Ian Lynagh's avatar
Ian Lynagh committed
47
    if ($verbose >= 2) {
Ian Lynagh's avatar
Ian Lynagh committed
48 49 50 51 52
        print "@_\n";
    }
}

sub warning {
Ian Lynagh's avatar
Ian Lynagh committed
53 54 55
    if ($verbose >= 1) {
        print "warning: @_\n";
    }
Ian Lynagh's avatar
Ian Lynagh committed
56 57 58 59 60 61 62 63 64 65
}

sub darcs {
    message "== running darcs @_";
    system ("darcs", @_) == 0
        or $ignore_failure
        or die "darcs failed: $?";
}

sub darcsall {
66
    my @packages;
Ian Lynagh's avatar
Ian Lynagh committed
67 68 69 70 71 72 73 74 75
    darcs @_;
    for my $dir (@top_dirs) {
        if (-d $dir && -d "$dir/_darcs") {
            darcs (@_, "--repodir", $dir);
        }
        else {
            message "== $dir not present or not a repository; skipping";
        }
    }
76 77 78 79
    for my $path (<libraries/*/_darcs>) {
        chomp $path;
        if ($path =~ m#/(.*)/#) {
            my $pkg = $1;
80
            darcs (@_, "--repodir", "libraries/$pkg");
Ian Lynagh's avatar
Ian Lynagh committed
81 82
        }
        else {
83 84 85 86 87 88 89 90
            die "that pattern can't fail!";
        }
    }
    @packages = `cat libraries/boot-packages`;
    # @packages = `cat libraries/boot-packages libraries/extra-packages`;
    for my $pkg (@packages) {
        chomp $pkg;
        if (! -d "libraries/$pkg") {
Ian Lynagh's avatar
Ian Lynagh committed
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
            warning("$pkg doesn't exist, use 'darcs-all get' to get it");
        }
    }
}

sub darcsgetpackage {
    my ($get_it, $r_flags, $repo_root, $package) = @_;

    if ($get_it) {
        if (-d $package) {
            warning("$package already present; omitting");
        }
        else {
            darcs (@$r_flags, "$repo_root/$package");
        }
    }
}

sub darcsget {
    my $r_flags;
111
    if (! grep /(?:--complete|--partial)/, @_) {
Ian Lynagh's avatar
Ian Lynagh committed
112 113 114 115 116 117 118 119 120 121
        warning("adding --partial, to override use --complete");
        $r_flags = [@_, "--partial"];
    }
    else {
        $r_flags = \@_;
    }

    darcsgetpackage($nofib,     $r_flags, $defaultrepo_base, "nofib");
    darcsgetpackage($testsuite, $r_flags, $defaultrepo_base, "testsuite");

Ian Lynagh's avatar
Ian Lynagh committed
122 123 124 125
    chdir "utils";
    darcsgetpackage(1         , $r_flags, $hsc2hs_repo_loc,  "hsc2hs");
    chdir "..";

Ian Lynagh's avatar
Ian Lynagh committed
126 127 128 129
    chdir "libraries";

    my @packages;
    if ($extra) {
130
        @packages = `cat boot-packages extra-packages`;
Ian Lynagh's avatar
Ian Lynagh committed
131 132
    }
    else {
133
        @packages = `cat boot-packages`;
Ian Lynagh's avatar
Ian Lynagh committed
134 135 136 137 138 139 140 141 142 143 144 145 146
    }

    for my $pkg (@packages) {
        chomp $pkg;
        darcsgetpackage(1, $r_flags, $defaultrepo_lib, $pkg);
    }
}

sub main {
    if (! -d "_darcs" || ! -d "compiler") {
        die "error: darcs-all must be run from the top level of the ghc tree."
    }

147 148
    while ($#_ ne -1) {
        my $arg = shift;
149 150
        # We handle -q here as well as lower down as we need to skip over it
        # if it comes before the darcs command
151
        if ($arg eq "-q") {
Ian Lynagh's avatar
Ian Lynagh committed
152 153 154
            $verbose = 1;
        }
        elsif ($arg eq "-s") {
155 156 157 158 159 160 161 162 163 164 165 166 167
            $verbose = 0;
        }
        elsif ($arg eq "--extra") {
            $extra = 1;
        }
        elsif ($arg eq "--nofib") {
            $nofib = 1;
        }
        elsif ($arg eq "--testsuite") {
            $testsuite = 1;
        }
        else {
            unshift @_, $arg;
168
            if (grep /^-q$/, @_) {
Ian Lynagh's avatar
Ian Lynagh committed
169
                $verbose = 1;
170
            }
171 172 173 174
            last;
        }
    }

Ian Lynagh's avatar
Ian Lynagh committed
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
    if ($#_ eq -1) {
        die "What do you want to do?";
    }
    my $command = $_[0];
    if ($command eq "get") {
        darcsget @_;
    }
    else {
        if ($command =~ /^(?:w|wh|wha|what|whats|whatsn|whatsne|whatsnew)$/) {
            # Hack around whatsnew failing if there are no changes
            $ignore_failure = 1;
        }
        darcsall @_;
    }
}

main(@ARGV);