Add a check for old time packaes
[ghc.git] / sync-all
1 #!/usr/bin/perl -w
2
3 use strict;
4 use Cwd;
5
6 $| = 1; # autoflush stdout after each print, to avoid output after die
7
8 my $defaultrepo;
9 my @packages;
10 my $verbose = 2;
11 my $try_to_resume = 0;
12 my $ignore_failure = 0;
13 my $checked_out_flag = 0; # NOT the opposite of bare_flag (describes remote repo state)
14 my $get_mode;
15 my $bare_flag = ""; # NOT the opposite of checked_out_flag (describes local repo state)
16
17 my %tags;
18
19 # Figure out where to get the other repositories from.
20 sub getrepo {
21     my $repo;
22
23     if (defined($defaultrepo)) {
24         $repo = $defaultrepo;
25         chomp $repo;
26     } else {
27         # Figure out where to get the other repositories from,
28         # based on where this GHC repo came from.
29         my $git_dir = $bare_flag ? "--git-dir=ghc.git" : "";
30         my $branch  = `git $git_dir branch | grep "\* " | sed "s/^\* //"`; chomp $branch;
31         my $remote  = `git $git_dir config branch.$branch.remote`;         chomp $remote;
32         if ($remote eq "") {
33             # remotes are not mandatory for branches (e.g. not recorded by default for bare repos)
34             $remote = "origin";
35         }
36         $repo       = `git $git_dir config remote.$remote.url`;            chomp $repo;
37     }
38
39     my $repo_base;
40     my $checked_out_tree;
41
42     if ($repo =~ /^...*:/) {
43         # HTTP or SSH
44         # Above regex says "at least two chars before the :", to avoid
45         # catching Win32 drives ("C:\").
46         $repo_base = $repo;
47
48         # --checked-out is needed if you want to use a checked-out repo
49         # over SSH or HTTP
50         if ($checked_out_flag) {
51             $checked_out_tree = 1;
52         } else {
53             $checked_out_tree = 0;
54         }
55
56         # Don't drop the last part of the path if specified with -r, as
57         # it expects repos of the form:
58         #
59         #   http://darcs.haskell.org
60         #
61         # rather than
62         #
63         #   http://darcs.haskell.org/ghc
64         #
65         if (!$defaultrepo) {
66             $repo_base =~ s#/[^/]+/?$##;
67         }
68     }
69     elsif ($repo =~ /^\/|\.\.\/|.:(\/|\\)/) {
70         # Local filesystem, either absolute (C:/ or /) or relative (../) path
71         $repo_base = $repo;
72         if (-f "$repo/HEAD") {
73             # assume a local mirror:
74             $checked_out_tree = 0;
75             $repo_base =~ s#/[^/]+/?$##;
76         } elsif (-d "$repo/ghc.git") {
77             # assume a local mirror:
78             $checked_out_tree = 0;
79         } else {
80             # assume a checked-out tree:
81             $checked_out_tree = 1;
82         }
83     }
84     else {
85         die "Couldn't work out repo";
86     }
87
88     return $repo_base, $checked_out_tree;
89 }
90
91 sub parsePackages {
92     my @repos;
93     my $lineNum;
94
95     open IN, "< packages.conf"
96         or open IN, "< packages" # clashes with packages directory when using --bare
97         or die "Can't open packages file (or packages.conf)";
98     @repos = <IN>;
99     close IN;
100
101     @packages = ();
102     $lineNum = 0;
103     foreach (@repos) {
104         chomp;
105         $lineNum++;
106         if (/^([^# ]+) +([^ ]+) +([^ ]+) +([^ ]+)$/) {
107             my %line;
108             $line{"localpath"}  = $1;
109             $line{"tag"}        = $2;
110             $line{"remotepath"} = $3;
111             $line{"vcs"}        = $4;
112             push @packages, \%line;
113         }
114         elsif (! /^(#.*)?$/) {
115             die "Bad content on line $lineNum of packages file: $_";
116         }
117     }
118 }
119
120 sub tryReadFile {
121     my $filename = shift;
122     my @lines;
123
124     open (FH, $filename) or return "";
125     @lines = <FH>;
126     close FH;
127     return join('', @lines);
128 }
129
130 sub message {
131     if ($verbose >= 2) {
132         print "@_\n";
133     }
134 }
135
136 sub warning {
137     if ($verbose >= 1) {
138         print "warning: @_\n";
139     }
140 }
141
142 sub gitNewWorkdir {
143     my $dir = shift;
144     my $target = shift;
145     my $target_dir = "$target/$dir";
146     my $pwd;
147
148     if ($dir eq '.') {
149         message "== running git-new-workdir . $target_dir @_";
150     } else {
151         message "== $dir: running git-new-workdir . $target_dir @_";
152         $pwd = getcwd();
153         chdir($dir);
154     }
155
156     system ("git-new-workdir", ".", $target_dir, @_) == 0
157         or $ignore_failure
158         or die "git-new-workdir failed: $?";
159
160     if ($dir ne '.') {
161         chdir($pwd);
162     }
163 }
164
165 sub scm {
166     my $dir = shift;
167     my $scm = shift;
168     my $pwd;
169
170     if ($dir eq '.') {
171         message "== running $scm @_";
172     } else {
173         message "== $dir: running $scm @_";
174         $pwd = getcwd();
175         chdir($dir);
176     }
177
178     system ($scm, @_) == 0
179         or $ignore_failure
180         or die "$scm failed: $?";
181
182     if ($dir ne '.') {
183         chdir($pwd);
184     }
185 }
186
187 sub scmall {
188     my $command = shift;
189
190     my $localpath;
191     my $tag;
192     my $remotepath;
193     my $scm;
194     my $line;
195     my $branch_name;
196     my $subcommand;
197
198     my $path;
199     my $wd_before = getcwd;
200
201     my $pwd;
202     my @args;
203
204     my $started;
205     my $doing;
206     my $start_repo;
207
208     my ($repo_base, $checked_out_tree) = getrepo();
209
210     my $is_github_repo = $repo_base =~ m/(git@|git:\/\/|https:\/\/)github.com/;
211
212     parsePackages;
213
214     @args = ();
215
216     if ($command =~ /^remote$/) {
217         while (@_ > 0 && $_[0] =~ /^-/) {
218             push(@args,shift);
219         }
220         if (@_ < 1) { help(1); }
221         $subcommand = shift;
222         if ($subcommand ne 'add' &&
223             $subcommand ne 'rm' &&
224             $subcommand ne 'set-branches' &&
225             $subcommand ne 'set-url') {
226             help(1);
227         }
228         while (@_ > 0 && $_[0] =~ /^-/) {
229             push(@args,shift);
230         }
231         if (($subcommand eq 'add' || $subcommand eq 'rm') && @_ < 1) {
232             help(1);
233         } elsif (@_ < 1) { # set-url
234             $branch_name = 'origin';
235         } else {
236             $branch_name = shift;
237         }
238     } elsif ($command eq 'new') {
239         if (@_ < 1) {
240             $branch_name = 'origin';
241         } else {
242             $branch_name = shift;
243         }
244     }
245
246     push(@args, @_);
247
248     # $doing is a good enough approximation to what we are doing that
249     # we can use it to check that --resume is resuming the right command
250     $doing = join(" ", ($command, @args));
251     $started = 1;
252     if ($try_to_resume && -f "resume") {
253         my $what;
254         open RESUME, "< resume"
255             or die "Can't open resume file";
256         $start_repo = <RESUME>;
257         chomp $start_repo;
258         $what = <RESUME>;
259         chomp $what;
260         close RESUME;
261         if ($what eq $doing) {
262             $started = 0;
263         }
264     }
265
266     for $line (@packages) {
267         $tag        = $$line{"tag"};
268         $scm        = $$line{"vcs"};
269         # Use the "remote" structure for bare git repositories
270         $localpath  = ($bare_flag && $scm eq "git") ?
271                       $$line{"remotepath"} : $$line{"localpath"};
272         $remotepath = ($checked_out_tree) ?
273                       $$line{"localpath"}  : $$line{"remotepath"};
274
275         if (!$started) {
276             if ($start_repo eq $localpath) {
277                 $started = 1;
278             }
279             else {
280                 next;
281             }
282         }
283
284         open RESUME, "> resume.tmp";
285         print RESUME "$localpath\n";
286         print RESUME "$doing\n";
287         close RESUME;
288         rename "resume.tmp", "resume";
289
290         # Check the SCM is OK as early as possible
291         die "Unknown SCM: $scm" if (($scm ne "darcs") and ($scm ne "git"));
292
293         # We can't create directories on GitHub, so we translate
294         # "packages/foo" into "package-foo".
295         if ($is_github_repo) {
296             $remotepath =~ s/\//-/;
297         }
298
299         # Construct the path for this package in the repo we pulled from
300         $path = "$repo_base/$remotepath";
301
302         if ($command eq "get") {
303             next if $remotepath eq "-"; # "git submodule init/update" will get this later
304
305             # Skip any repositories we have not included the tag for
306             if (not defined($tags{$tag})) {
307                 $tags{$tag} = 0;
308             }
309             if ($tags{$tag} == 0) {
310                 next;
311             }
312
313             if (-d $localpath) {
314                 warning("$localpath already present; omitting")
315                     if $localpath ne ".";
316                 if ($scm eq "git") {
317                     scm ($localpath, $scm, "config", "core.ignorecase", "true");
318                 }
319                 next;
320             }
321
322             # Note that we use "." as the path, as $localpath
323             # doesn't exist yet.
324             if ($scm eq "darcs") {
325                 # The first time round the loop, default the get-mode
326                 if (not defined($get_mode)) {
327                     warning("adding --partial, to override use --complete");
328                     $get_mode = "--partial";
329                 }
330                 scm (".", $scm, "get", $get_mode, $path, $localpath, @args);
331             }
332             else {
333                 my @argsWithBare = @args;
334                 push @argsWithBare, $bare_flag if $bare_flag;
335                 scm (".", $scm, "clone", $path, $localpath, @argsWithBare);
336                 scm ($localpath, $scm, "config", "core.ignorecase", "true");
337             }
338             next;
339         }
340
341         my $darcs_repo_present = 1 if -d "$localpath/_darcs";
342         my $git_repo_present = 1 if -d "$localpath/.git" || ($bare_flag && -d "$localpath");
343         if ($darcs_repo_present) {
344             if ($git_repo_present) {
345                 die "Found both _darcs and .git in $localpath";
346             }
347             $scm = "darcs";
348         } elsif ($git_repo_present) {
349             $scm = "git";
350         } elsif ($tag eq "") {
351             die "Required repo $localpath is missing";
352         } else {
353              message "== $localpath repo not present; skipping";
354              next;
355         }
356
357         # Work out the arguments we should give to the SCM
358         if ($command eq "status") {
359             if ($scm eq "darcs") {
360                 $command = "whatsnew";
361             }
362             elsif ($scm eq "git") {
363                 $command = "status";
364             }
365             else {
366                 die "Unknown scm";
367             }
368
369             # Hack around 'darcs whatsnew' failing if there are no changes
370             $ignore_failure = 1;
371             scm ($localpath, $scm, $command, @args);
372         }
373         elsif ($command eq "commit") {
374             # git fails if there is nothing to commit, so ignore failures
375             $ignore_failure = 1;
376             scm ($localpath, $scm, "commit", @args);
377         }
378         elsif ($command eq "push") {
379             scm ($localpath, $scm, "push", @args);
380         }
381         elsif ($command eq "pull") {
382             my $realcmd;
383             if ($remotepath eq "-") {
384                 # Only fetch for the submodules. "git submodule update"
385                 # will take care of making us point to the right commit.
386                 $realcmd = "fetch";
387             }
388             else {
389                 $realcmd = "pull";
390             }
391             scm ($localpath, $scm, $realcmd, @args);
392         }
393         elsif ($command eq "new-workdir") {
394             gitNewWorkdir ($localpath, @args);
395         }
396         elsif ($command eq "send") {
397             if ($scm eq "darcs") {
398                 $command = "send";
399             }
400             elsif ($scm eq "git") {
401                 $command = "send-email";
402             }
403             else {
404                 die "Unknown scm";
405             }
406             scm ($localpath, $scm, $command, @args);
407         }
408         elsif ($command eq "fetch") {
409             scm ($localpath, $scm, "fetch", @args);
410         }
411         elsif ($command eq "new") {
412             my @scm_args = ("log", "$branch_name..");
413             scm ($localpath, $scm, @scm_args, @args);
414         }
415         elsif ($command eq "log") {
416             scm ($localpath, $scm, "log", @args);
417         }
418         elsif ($command eq "remote") {
419             my @scm_args;
420             $ignore_failure = 1;
421             if ($subcommand eq 'add') {
422                 @scm_args = ("remote", "add", $branch_name, $path);
423             } elsif ($subcommand eq 'rm') {
424                 @scm_args = ("remote", "rm", $branch_name);
425             } elsif ($subcommand eq 'set-branches') {
426                 @scm_args = ("remote", "set-branches", $branch_name);
427             } elsif ($subcommand eq 'set-url') {
428                 @scm_args = ("remote", "set-url", $branch_name, $path);
429             }
430             scm ($localpath, $scm, @scm_args, @args);
431         }
432         elsif ($command eq "checkout") {
433             # Not all repos are necessarily branched, so ignore failure
434             $ignore_failure = 1;
435             scm ($localpath, $scm, "checkout", @args)
436                 unless $scm eq "darcs";
437         }
438         elsif ($command eq "grep") {
439             # Hack around 'git grep' failing if there are no matches
440             $ignore_failure = 1;
441             scm ($localpath, $scm, "grep", @args)
442                 unless $scm eq "darcs";
443         }
444         elsif ($command eq "diff") {
445             scm ($localpath, $scm, "diff", @args)
446                 unless $scm eq "darcs";
447         }
448         elsif ($command eq "clean") {
449             scm ($localpath, $scm, "clean", @args)
450                 unless $scm eq "darcs";
451         }
452         elsif ($command eq "reset") {
453             scm ($localpath, $scm, "reset", @args)
454                 unless $scm eq "darcs";
455         }
456         elsif ($command eq "branch") {
457             scm ($localpath, $scm, "branch", @args)
458                 unless $scm eq "darcs";
459         }
460         elsif ($command eq "config") {
461             scm ($localpath, $scm, "config", @args)
462                 unless $scm eq "darcs";
463         }
464         elsif ($command eq "repack") {
465             scm ($localpath, $scm, "repack", @args)
466                 if $scm eq "git"
467         }
468         elsif ($command eq "format-patch") {
469             scm ($localpath, $scm, "format-patch", @args)
470                 if $scm eq "git"
471         }
472         elsif ($command eq "gc") {
473             scm ($localpath, $scm, "gc", @args)
474                 unless $scm eq "darcs";
475         }
476         elsif ($command eq "tag") {
477             scm ($localpath, $scm, "tag", @args);
478         }
479         else {
480             die "Unknown command: $command";
481         }
482     }
483
484     unlink "resume";
485 }
486
487 sub help
488 {
489         my $exit = shift;
490
491         # Get the built in help
492         my $help = <<END;
493 Usage:
494
495 ./sync-all [-q] [-s] [--ignore-failure] [-r repo] [--checked-out] [--bare]
496            [--nofib] [--extra] [--testsuite] [--no-dph] [--resume]
497            cmd [git flags]
498
499 Applies the command "cmd" to each repository in the tree.
500
501 A full repository tree is obtained by first cloning the ghc
502 repository, then getting the subrepositories with "sync-all get":
503
504   \$ git clone http://darcs.haskell.org/ghc.git
505   \$ cd ghc
506   \$ ./sync-all get
507
508 After this, "./sync-all pull" will pull from the original repository
509 tree.
510
511 A remote pointing to another local repository tree can be added like
512 this:
513
514   \$ ./sync-all -r /path/to/ghc remote add otherlocal
515
516 and then we can pull from this other tree with
517
518   \$ ./sync-all pull otherlocal
519
520 -------------- Commands -----------------
521 get
522
523     Clones all sub-repositories from the same place that the ghc
524     repository was cloned from. See "which repos to use" below
525     for details of how the subrepositories are laid out.
526
527     There are various --<package-tag> options that can be given
528     before "get" that enable extra repositories. The full list is
529     given at the end of this help. For example:
530
531     ./sync-all --testsuite get
532
533     would get the testsuite repository in addition to the usual set of
534     subrepositories.
535
536 remote add <remote-name>
537 remote rm <remote-name>
538 remote set-url [--push] <remote-name>
539
540     Runs a "git remote" command on each subrepository, adjusting the
541     repository location in each case appropriately. For example, to
542     add a new remote pointing to the upstream repositories:
543
544     ./sync-all -r http://darcs.haskell.org/ remote add upstream
545
546     The -r flag points to the root of the repository tree (see "which
547     repos to use" below). For a repository on the local filesystem it
548     would point to the ghc repository, and for a remote repository it
549     points to the directory containing "ghc.git".
550
551 These commands just run the equivalent git command on each repository, passing
552 any extra arguments to git:
553
554   branch
555   checkout
556   clean
557   commit
558   config
559   diff
560   fetch
561   format-patch
562   gc
563   grep
564   log
565   new
566   new-workdir
567   pull
568   push
569   repack
570   reset
571   send
572   status
573   tag
574
575 -------------- Flags -------------------
576 These flags are given *before* the command and modify the way sync-all behaves.
577 Flags given *after* the command are passed to git.
578
579   -q says to be quiet, and -s to be silent.
580
581   --resume will restart a command that failed, from the repo at which it
582   failed. This means you don't need to wait while, e.g., "pull" goes through
583   all the repos it's just pulled, and tries to pull them again.
584
585   --ignore-failure says to ignore errors and move on to the next repository
586
587   -r repo says to use repo as the location of package repositories
588
589   --checked-out says that the remote repo is in checked-out layout, as opposed
590   to the layout used for the main repo. By default a repo on the local
591   filesystem is assumed to be checked-out, and repos accessed via HTTP or SSH
592   are assumed to be in the main repo layout; use --checked-out to override the
593   latter.
594
595   --bare says that the local repo is in bare layout, same as the main repo. It
596   also means that these repos are bare. You only have to use this flag if you
597   don't have a bare ghc.git in the current directory and would like to 'get'
598   all of the repos bare. Requires packages.conf to be present in the current
599   directory (a renamed packages file from the main ghc repo).
600
601   Note: --checked-out and --bare flags are NOT the opposite of each other.
602         --checked-out: describes the layout of the remote repository tree.
603         --bare:        describes the layout of the local repository tree.
604
605   --nofib also clones the nofib benchmark suite
606
607   --testsuite also clones the ghc testsuite 
608
609   --extra also clone some extra library packages
610
611   --no-dph avoids cloning the dph pacakges
612
613
614 ------------ Checking out a branch -------------
615 To check out a branch you can run the following command:
616
617   \$ ./sync-all checkout ghc-7.4
618
619
620 ------------ Which repos to use -------------
621 sync-all uses the following algorithm to decide which remote repos to use
622
623 It always computes the remote repos from a single base, <repo_base> How is
624 <repo_base> set? If you say "-r repo", then that's <repo_base> otherwise
625 <repo_base> is set by asking git where the ghc repo came from, and removing the
626 last component (e.g. /ghc.git/ or /ghc/).
627
628 Then sync-all iterates over the package found in the file ./packages; see that
629 file for a description of the contents.
630
631 If <repo_base> looks like a local filesystem path, or if you give the
632 --checked-out flag, sync-all works on repos of form:
633
634   <repo_base>/<local-path>
635
636 otherwise sync-all works on repos of form:
637
638   <repo_base>/<remote-path>
639
640 This logic lets you say
641   both    sync-all -r http://darcs.haskell.org/ghc-6.12 remote add ghc-6.12
642   and     sync-all -r ../working remote add working
643 The latter is called a "checked-out tree".
644
645 sync-all *ignores* the defaultrepo of all repos other than the root one. So the
646 remote repos must be laid out in one of the two formats given by <local-path>
647 and <remote-path> in the file 'packages'.
648
649 Available package-tags are:
650 END
651
652         # Collect all the tags in the packages file
653         my %available_tags;
654         open IN, "< packages.conf"
655             or open IN, "< packages" # clashes with packages directory when using --bare
656             or die "Can't open packages file (or packages.conf)";
657         while (<IN>) {
658             chomp;
659             if (/^([^# ]+) +(?:([^ ]+) +)?([^ ]+) +([^ ]+)/) {
660                 if (defined($2) && $2 ne "-") {
661                     $available_tags{$2} = 1;
662                 }
663             }
664             elsif (! /^(#.*)?$/) {
665                 die "Bad line: $_";
666             }
667         }
668         close IN;
669
670         # Show those tags and the help text
671         my @available_tags = keys %available_tags;
672         print "$help@available_tags\n\n";
673         exit $exit;
674 }
675
676 sub main {
677
678     $tags{"-"} = 1;
679     $tags{"dph"} = 1;
680
681     while ($#_ ne -1) {
682         my $arg = shift;
683         # We handle -q here as well as lower down as we need to skip over it
684         # if it comes before the source-control command
685         if ($arg eq "-q") {
686             $verbose = 1;
687         }
688         elsif ($arg eq "-s") {
689             $verbose = 0;
690         }
691         elsif ($arg eq "-r") {
692             $defaultrepo = shift;
693         }
694         elsif ($arg eq "--resume") {
695             $try_to_resume = 1;
696         }
697         elsif ($arg eq "--ignore-failure") {
698             $ignore_failure = 1;
699         }
700         elsif ($arg eq "--complete" || $arg eq "--partial") {
701             $get_mode = $arg;
702         }
703         # Use --checked-out if the _remote_ repos are a checked-out tree,
704         # rather than the master trees.
705         elsif ($arg eq "--checked-out") {
706             $checked_out_flag = 1;
707         }
708         # Use --bare if the _local_ repos are bare repos,
709         # rather than a checked-out tree.
710         elsif ($arg eq "--bare") {
711             $bare_flag = $arg;
712         }
713         elsif ($arg eq "--help") {
714             help(0);
715         }
716         # --<tag> says we grab the libs tagged 'tag' with
717         # 'get'. It has no effect on the other commands.
718         elsif ($arg =~ m/^--no-(.*)$/) {
719             $tags{$1} = 0;
720         }
721         elsif ($arg =~ m/^--(.*)$/) {
722             $tags{$1} = 1;
723         }
724         else {
725             unshift @_, $arg;
726             if (grep /^-q$/, @_) {
727                 $verbose = 1;
728             }
729             last;
730         }
731     }
732
733     # check for ghc repositories in cwd
734     my $checked_out_found = 1 if (-d ".git" && -d "compiler");
735     my $bare_found = 1 if (-d "ghc.git");
736
737     if ($bare_flag && ! $bare_found && ! $defaultrepo) {
738         die "error: bare repository ghc.git not found.\n"
739           . "       Either clone a bare ghc repo first or specify the repo location. E.g.:\n"
740           . "       ./sync-all --bare [--testsuite --nofib --extra] -r http://darcs.haskell.org/ get\n"
741     }
742     elsif ($bare_found) {
743         $bare_flag = "--bare";
744     }
745     elsif (! $bare_flag && ! $checked_out_found) {
746         die "error: sync-all must be run from the top level of the ghc tree.";
747     }
748
749     if ($#_ eq -1) {
750         help(1);
751     }
752     else {
753         # Give the command and rest of the arguments to the main loop
754         # We normalise command names here to avoid duplicating the
755         # abbreviations that we allow.
756         my $command = shift;
757
758         if ($command =~ /^(?:g|ge|get)$/) {
759             $command = "get";
760         }
761         elsif ($command =~ /^(?:pus|push)$/) {
762             $command = "push";
763         }
764         elsif ($command =~ /^(?:pul|pull)$/) {
765             $command = "pull";
766         }
767         elsif ($command =~ /^(?:s|se|sen|send)$/) {
768             $command = "send";
769         }
770         elsif ($command =~ /^(?:w|wh|wha|what|whats|whatsn|whatsne|whatsnew|status)$/) {
771             $command = "status";
772         }
773
774         scmall ($command, @_);
775
776         if ($command eq "get" or $command eq "pull") {
777             my $gitConfig = &tryReadFile(".git/config");
778             if ($gitConfig !~ /submodule/) {
779                 &scm(".", "git", "submodule", "init");
780             }
781             &scm(".", "git", "submodule", "update");
782         }
783     }
784 }
785
786 END {
787     my $ec = $?;
788     my $pwd = getcwd();
789
790     message "== Checking for old haddock repo";
791     if (-d "utils/haddock/.git") {
792         chdir("utils/haddock");
793         if ((system "git log -1 87e2ca11c3d1b1bc49900fba0b5c5c6f85650718 > /dev/null 2> /dev/null") == 0) {
794             print <<EOF;
795 ============================
796 ATTENTION!
797
798 You have an old haddock repository in your GHC tree!
799
800 Please remove it (e.g. "rm -r utils/haddock"), and then run
801 "./sync-all get" to get the new repository.
802 ============================
803 EOF
804         }
805         chdir($pwd);
806     }
807
808     message "== Checking for old binary repo";
809     if (-d "libraries/binary/.git") {
810         chdir("libraries/binary");
811         if ((system "git log -1 749ac0efbde3b14901417364a872796598747aaf > /dev/null 2> /dev/null") == 0) {
812             print <<EOF;
813 ============================
814 ATTENTION!
815
816 You have an old binary repository in your GHC tree!
817
818 Please remove it (e.g. "rm -r libraries/binary"), and then run
819 "./sync-all get" to get the new repository.
820 ============================
821 EOF
822         }
823         chdir($pwd);
824     }
825
826     message "== Checking for old mtl repo";
827     if (-d "libraries/mtl/.git") {
828         chdir("libraries/mtl");
829         if ((system "git log -1 c67d8f7247c612dc35242bc67e616f7ea35eadb9 > /dev/null 2> /dev/null") == 0) {
830             print <<EOF;
831 ============================
832 ATTENTION!
833
834 You have an old mtl repository in your GHC tree!
835
836 Please remove it (e.g. "rm -r libraries/mtl"), and then run
837 "./sync-all get" to get the new repository.
838 ============================
839 EOF
840         }
841         chdir($pwd);
842     }
843
844     message "== Checking for old Cabal repo";
845     if (-d "libraries/Cabal/.git") {
846         chdir("libraries/Cabal");
847         if ((system "git log -1 c8ebd66a32865f72ae03ee0663c62df3d77f08fe > /dev/null 2> /dev/null") == 0) {
848             print <<EOF;
849 ============================
850 ATTENTION!
851
852 You have an old Cabal repository in your GHC tree!
853
854 Please remove it (e.g. "rm -r libraries/Cabal"), and then run
855 "./sync-all get" to get the new repository.
856 ============================
857 EOF
858         }
859         chdir($pwd);
860     }
861
862     message "== Checking for old time from tarball";
863     if (! -d "libraries/time/.git") {
864             print <<EOF;
865 ============================
866 ATTENTION!
867
868 You have an old time package in your GHC tree!
869
870 Please remove it (e.g. "rm -r libraries/time"), and then run
871 "./sync-all get" to get the new repository.
872 ============================
873 EOF
874     }
875
876     $? = $ec;
877 }
878
879 main(@ARGV);
880