summaryrefslogtreecommitdiff
path: root/push-all
blob: a5c20629cdcf7589758b998090cf8bbc812ada72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/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;
# --core-only says we only want to push corelibs, not extralibs
my $core_only = 0;

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", "--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 = $core_only
                      ? "libraries/core-packages"
                      : "libraries/core-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 "--core-only") {
                $core_only = 1;
            }
            else {
                $reporoot = $arg;
                if (grep /^-q$/, @_) {
                    $verbose = 0;
                }
                last;
            }
        }
    }
    else {
        die "Where do you want to push to?";
    }

    pushall (@_);
}

main(@ARGV);