Make darcs-all a perl script
[ghc-hetmet.git] / darcs-all
1 #!/usr/bin/perl -w
2
3 use strict;
4
5 my @top_dirs = ("nofib", "testsuite");
6
7 # Figure out where to get the other repositories from,
8 # based on where this GHC repo came from.
9 my $defaultrepo = `cat _darcs/prefs/defaultrepo`;
10 chomp $defaultrepo;
11 my $defaultrepo_base;
12 my $defaultrepo_lib;
13
14 if ($defaultrepo =~ /:/) {
15     # HTTP or SSH
16     $defaultrepo_base = $defaultrepo;
17     $defaultrepo_base =~ s#/ghc$##;
18     $defaultrepo_lib = "$defaultrepo_base/packages";
19 }
20 elsif ($defaultrepo =~ /^\//) {
21     # Local filesystem (assumes a checked-out tree):
22     $defaultrepo_base = $defaultrepo;
23     $defaultrepo_lib = "$defaultrepo/libraries";
24 }
25 else {
26     die "Couldn't work out defaultrepo";
27 }
28
29 my $verbose = 1;
30 my $ignore_failure = 0;
31
32 # --extra says we grab the extra libs with 'get'.  It has no effect on
33 # the other commands.
34 my $extra = 0;
35 # --nofib/--testsuite tell get to also grab the respective repos.
36 # They have no effect on the other commands.
37 my $nofib = 0;
38 my $testsuite = 0;
39
40 while ($#_ ne -1) {
41     my $arg = shift;
42     if ($arg eq "-q") {
43         $verbose = 0;
44     }
45     elsif ($arg eq "--extra") {
46         $extra = 1;
47     }
48     elsif ($arg eq "--nofib") {
49         $nofib = 1;
50     }
51     elsif ($arg eq "--testsuite") {
52         $testsuite = 1;
53     }
54     else {
55         unshift @_, $arg;
56         last;
57     }
58 }
59
60 sub message {
61     if ($verbose) {
62         print "@_\n";
63     }
64 }
65
66 sub warning {
67     print "warning: @_\n";
68 }
69
70 sub darcs {
71     message "== running darcs @_";
72     system ("darcs", @_) == 0
73         or $ignore_failure
74         or die "darcs failed: $?";
75 }
76
77 sub darcsall {
78     darcs @_;
79     for my $dir (@top_dirs) {
80         if (-d $dir && -d "$dir/_darcs") {
81             darcs (@_, "--repodir", $dir);
82         }
83         else {
84             message "== $dir not present or not a repository; skipping";
85         }
86     }
87     for my $pkg (`cat libraries/core-packages libraries/extra-packages`) {
88         chomp $pkg;
89         if (-d "libraries/$pkg") {
90             darcs (@_, "--repodir", "libraries/$pkg");
91         }
92         else {
93             warning("$pkg doesn't exist, use 'darcs-all get' to get it");
94         }
95     }
96 }
97
98 sub darcsgetpackage {
99     my ($get_it, $r_flags, $repo_root, $package) = @_;
100
101     if ($get_it) {
102         if (-d $package) {
103             warning("$package already present; omitting");
104         }
105         else {
106             darcs (@$r_flags, "$repo_root/$package");
107         }
108     }
109 }
110
111 sub darcsget {
112     my $r_flags;
113     if (! grep /(?:--complete|--partial)/, @_) {
114         warning("adding --partial, to override use --complete");
115         $r_flags = [@_, "--partial"];
116     }
117     else {
118         $r_flags = \@_;
119     }
120
121     darcsgetpackage($nofib,     $r_flags, $defaultrepo_base, "nofib");
122     darcsgetpackage($testsuite, $r_flags, $defaultrepo_base, "testsuite");
123
124     chdir "libraries";
125
126     my @packages;
127     if ($extra) {
128         @packages = `cat core-packages extra-packages`;
129     }
130     else {
131         @packages = `cat core-packages`;
132     }
133
134     for my $pkg (@packages) {
135         chomp $pkg;
136         darcsgetpackage(1, $r_flags, $defaultrepo_lib, $pkg);
137     }
138 }
139
140 sub main {
141     if (! -d "_darcs" || ! -d "compiler") {
142         die "error: darcs-all must be run from the top level of the ghc tree."
143     }
144
145     if ($#_ eq -1) {
146         die "What do you want to do?";
147     }
148     my $command = $_[0];
149     if ($command eq "get") {
150         darcsget @_;
151     }
152     else {
153         if ($command =~ /^(?:w|wh|wha|what|whats|whatsn|whatsne|whatsnew)$/) {
154             # Hack around whatsnew failing if there are no changes
155             $ignore_failure = 1;
156         }
157         darcsall @_;
158     }
159 }
160
161 main(@ARGV);
162