Commit 99daef87 authored by batterseapower's avatar batterseapower

Prepare GHC for building with Git

* New packages format lets you select source control system in use
* Packages file now includes root repo explicitly
* Scripts darcs-all and push-all updated for the new packages format only
* New sync-all script, intended for use after Git changeover and for buildbots right now
* Had to remove libraries/bootstrapping from tree since Git cannot track empty directories without a hack
* Determine checkout date with Git using Darcs fallback in aclocal.m4
parent d1984e43
...@@ -988,7 +988,17 @@ if test "$RELEASE" = "NO"; then ...@@ -988,7 +988,17 @@ if test "$RELEASE" = "NO"; then
if test -f VERSION_DATE; then if test -f VERSION_DATE; then
PACKAGE_VERSION=${PACKAGE_VERSION}.`cat VERSION_DATE` PACKAGE_VERSION=${PACKAGE_VERSION}.`cat VERSION_DATE`
AC_MSG_RESULT(given $PACKAGE_VERSION) AC_MSG_RESULT(given $PACKAGE_VERSION)
elif test -d .git; then
changequote(, )dnl
ver_date=`git log -n 1 --date=short --pretty=format:%ci | sed "s/^.*\([0-9][0-9][0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\).*$/\1\2\3/"`
if echo $ver_date | grep '^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$' 2>&1 >/dev/null; then true; else
changequote([, ])dnl
AC_MSG_ERROR([failed to detect version date: check that git is in your path])
fi
PACKAGE_VERSION=${PACKAGE_VERSION}.$ver_date
AC_MSG_RESULT(inferred $PACKAGE_VERSION)
elif test -d _darcs; then elif test -d _darcs; then
# TODO: Remove this branch after conversion to Git
changequote(, )dnl changequote(, )dnl
ver_date=`darcs changes --quiet --no-summary --xml | head -500 | grep 'date=' | sed "s/^.*date='\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\).*$/\1/g" | sort -n | tail -1` ver_date=`darcs changes --quiet --no-summary --xml | head -500 | grep 'date=' | sed "s/^.*date='\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\).*$/\1/g" | sort -n | tail -1`
if echo $ver_date | grep '^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$' 2>&1 >/dev/null; then true; else if echo $ver_date | grep '^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$' 2>&1 >/dev/null; then true; else
...@@ -1001,7 +1011,7 @@ if test "$RELEASE" = "NO"; then ...@@ -1001,7 +1011,7 @@ if test "$RELEASE" = "NO"; then
PACKAGE_VERSION=`cat VERSION` PACKAGE_VERSION=`cat VERSION`
AC_MSG_RESULT(given $PACKAGE_VERSION) AC_MSG_RESULT(given $PACKAGE_VERSION)
else else
AC_MSG_WARN([cannot determine snapshot version: no _darcs directory and no VERSION file]) AC_MSG_WARN([cannot determine snapshot version: no .git or _darcs directory and no VERSION file])
fi fi
fi fi
......
...@@ -56,12 +56,10 @@ sub darcsall { ...@@ -56,12 +56,10 @@ sub darcsall {
my $path; my $path;
my $tag; my $tag;
darcs @_;
open IN, "< packages" or die "Can't open packages file"; open IN, "< packages" or die "Can't open packages file";
while (<IN>) { while (<IN>) {
chomp; chomp;
if (/^([^ ]+) +(?:([^ ]+) +)?([^ ]+)/) { if (/^([^# ]+) +(?:([^ ]+) +)?([^ ]+) +([^ ]+)$/) {
$localpath = $1; $localpath = $1;
$tag = defined($2) ? $2 : ""; $tag = defined($2) ? $2 : "";
......
...@@ -163,6 +163,7 @@ BOOTSTRAPPING_FLAGS = $(CABAL_GHC_FLAGS) -DCABAL_VERSION=$(CABAL_VERSION) -odir ...@@ -163,6 +163,7 @@ BOOTSTRAPPING_FLAGS = $(CABAL_GHC_FLAGS) -DCABAL_VERSION=$(CABAL_VERSION) -odir
boot: ifBuildable/ifBuildable cabal-bin bootstrapping.conf boot: ifBuildable/ifBuildable cabal-bin bootstrapping.conf
cabal-bin: cabal-bin.hs cabal-bin: cabal-bin.hs
mkdir $(HERE_ABS)/bootstrapping
$(GHC) $(BOOTSTRAPPING_FLAGS) --make cabal-bin -o cabal-bin $(GHC) $(BOOTSTRAPPING_FLAGS) --make cabal-bin -o cabal-bin
bootstrapping.conf: cabal-bin bootstrapping.conf: cabal-bin
...@@ -311,7 +312,7 @@ clean: $(foreach SUBDIR,$(SUBDIRS),clean.library.$(SUBDIR)) ...@@ -311,7 +312,7 @@ clean: $(foreach SUBDIR,$(SUBDIRS),clean.library.$(SUBDIR))
-cd filepath && $(CABAL) clean --distpref=dist-bootstrapping -cd filepath && $(CABAL) clean --distpref=dist-bootstrapping
-cd Cabal && $(CABAL) clean --distpref=dist-bootstrapping -cd Cabal && $(CABAL) clean --distpref=dist-bootstrapping
-cd hpc && $(CABAL) clean --distpref=dist-bootstrapping -cd hpc && $(CABAL) clean --distpref=dist-bootstrapping
$(RM) -rf bootstrapping/* $(RM) -rfd bootstrapping
$(RM) -f bootstrapping.conf bootstrapping.conf.old $(RM) -f bootstrapping.conf bootstrapping.conf.old
$(RM) -f bootstrapping.conf.tmp bootstrapping.conf.tmp.old $(RM) -f bootstrapping.conf.tmp bootstrapping.conf.tmp.old
$(RM) -f cabal-bin cabal-bin.exe $(RM) -f cabal-bin cabal-bin.exe
......
# Note that when adding libraries to this file, you also need to add # Note that when adding libraries to this file, you also need to add
# the library to the SUBDIRS variable in libraries/Makefile so that they # the library to the SUBDIRS variable in libraries/Makefile so that they
# actually get built # actually get built
utils/hsc2hs hsc2hs . ghc git
libraries/array packages/array utils/hsc2hs hsc2hs darcs
libraries/base packages/base libraries/array packages/array darcs
libraries/bytestring packages/bytestring libraries/base packages/base darcs
libraries/Cabal packages/Cabal libraries/bytestring packages/bytestring darcs
libraries/containers packages/containers libraries/Cabal packages/Cabal darcs
libraries/directory packages/directory libraries/containers packages/containers darcs
libraries/editline packages/editline libraries/directory packages/directory darcs
libraries/filepath packages/filepath libraries/editline packages/editline darcs
libraries/ghc-prim packages/ghc-prim libraries/filepath packages/filepath darcs
libraries/haskell98 packages/haskell98 libraries/ghc-prim packages/ghc-prim darcs
libraries/hpc packages/hpc libraries/haskell98 packages/haskell98 darcs
libraries/integer-gmp packages/integer-gmp libraries/hpc packages/hpc darcs
libraries/old-locale packages/old-locale libraries/integer-gmp packages/integer-gmp darcs
libraries/old-time packages/old-time libraries/old-locale packages/old-locale darcs
libraries/packedstring packages/packedstring libraries/old-time packages/old-time darcs
libraries/pretty packages/pretty libraries/packedstring packages/packedstring darcs
libraries/process packages/process libraries/pretty packages/pretty darcs
libraries/random packages/random libraries/process packages/process darcs
libraries/template-haskell packages/template-haskell libraries/random packages/random darcs
libraries/unix packages/unix libraries/template-haskell packages/template-haskell darcs
libraries/Win32 packages/Win32 libraries/unix packages/unix darcs
libraries/HUnit extralibs packages/HUnit libraries/Win32 packages/Win32 darcs
libraries/QuickCheck extralibs packages/QuickCheck libraries/HUnit extralibs packages/HUnit darcs
libraries/haskell-src extralibs packages/haskell-src libraries/QuickCheck extralibs packages/QuickCheck darcs
libraries/html extralibs packages/html libraries/haskell-src extralibs packages/haskell-src darcs
libraries/mtl extralibs packages/mtl libraries/html extralibs packages/html darcs
libraries/network extralibs packages/network libraries/mtl extralibs packages/mtl darcs
libraries/parsec extralibs packages/parsec libraries/network extralibs packages/network darcs
libraries/parallel extralibs packages/parallel libraries/parsec extralibs packages/parsec darcs
libraries/regex-base extralibs packages/regex-base libraries/parallel extralibs packages/parallel darcs
libraries/regex-compat extralibs packages/regex-compat libraries/regex-base extralibs packages/regex-base darcs
libraries/regex-posix extralibs packages/regex-posix libraries/regex-compat extralibs packages/regex-compat darcs
libraries/stm extralibs packages/stm libraries/regex-posix extralibs packages/regex-posix darcs
libraries/time extralibs packages/time libraries/stm extralibs packages/stm darcs
libraries/xhtml extralibs packages/xhtml libraries/time extralibs packages/time darcs
libraries/dph dph packages/dph libraries/xhtml extralibs packages/xhtml darcs
testsuite testsuite testsuite libraries/dph dph packages/dph darcs
nofib nofib nofib testsuite testsuite testsuite darcs
nofib nofib nofib darcs
...@@ -39,13 +39,11 @@ sub pushall { ...@@ -39,13 +39,11 @@ sub pushall {
my $remotepath; my $remotepath;
my $path; my $path;
my $tag; my $tag;
my $ghcrepo = $checked_out ? $reporoot : "$reporoot/ghc";
darcs_push ($ghcrepo, @_);
open IN, "< packages" or die "Can't open packages file"; open IN, "< packages" or die "Can't open packages file";
while (<IN>) { while (<IN>) {
chomp; chomp;
if (/^([^ ]+) +(?:([^ ]+) +)?([^ ]+)/) { if (/^([^# ]+) +(?:([^ ]+) +)?([^ ]+) +([^ ]+)$/) {
$localpath = $1; $localpath = $1;
$tag = defined($2) ? $2 : ""; $tag = defined($2) ? $2 : "";
$remotepath = $3; $remotepath = $3;
......
#!/usr/bin/perl -w
use strict;
use Cwd;
# Figure out where to get the other repositories from,
# based on where this GHC repo came from.
my $branch = `git branch | grep "\* " | sed "s/^\* //"`; chomp $branch;
my $remote = `git config branch.$branch.remote`; chomp $remote;
my $defaultrepo = `git config remote.$remote.url`; chomp $defaultrepo;
my $defaultrepo_base;
my $checked_out_tree;
if ($defaultrepo =~ /^...*:/) {
# HTTP or SSH
# Above regex says "at least two chars before the :", to avoid
# catching Win32 drives ("C:\").
$defaultrepo_base = $defaultrepo;
$defaultrepo_base =~ s#/[^/]+/?$##;
$checked_out_tree = 0;
}
elsif ($defaultrepo =~ /^\/|\.\.\/|.:(\/|\\)/) {
# Local filesystem, either absolute or relative path
# (assumes a checked-out tree):
$defaultrepo_base = $defaultrepo;
$checked_out_tree = 1;
}
else {
die "Couldn't work out defaultrepo";
}
my $verbose = 2;
my $get_mode;
# Flags specific to a particular command
my $ignore_failure = 0;
my $local_repo_unnecessary = 0;
# Always define the empty tag so that we fetch the /required/ packages
my %tags;
$tags{""} = 1;
sub message {
if ($verbose >= 2) {
print "@_\n";
}
}
sub warning {
if ($verbose >= 1) {
print "warning: @_\n";
}
}
sub scm {
my $scm = shift;
message "== running $scm @_";
system ($scm, @_) == 0
or $ignore_failure
or die "$scm failed: $?";
}
sub repoexists {
my ($scm, $localpath) = @_;
if ($scm eq "darcs") {
-d "$localpath/_darcs";
}
else {
-d "$localpath/.git";
}
}
sub scmall {
my $command = shift;
my $localpath;
my $tag;
my $remotepath;
my $scm;
my $path;
my $wd_before = getcwd;
my @scm_args;
open IN, "< packages" or die "Can't open packages file";
while (<IN>) {
chomp;
if (/^([^# ]+) +(?:([^ ]+) +)?([^ ]+) +([^ ]+)$/) {
$localpath = $1;
$tag = defined($2) ? $2 : "";
$remotepath = $3;
$scm = $4;
# Check the SCM is OK as early as possible
die "Unknown SCM: $scm" if (($scm ne "darcs") and ($scm ne "git"));
# Work out the path for this package in the repo we pulled from
if ($checked_out_tree) {
$path = "$defaultrepo_base/$localpath";
}
else {
$path = "$defaultrepo_base/$remotepath";
}
# Work out the arguments we should give to the SCM
if ($command =~ /^(?:w|wh|wha|what|whats|whatsn|whatsne|whatsnew)$/) {
@scm_args = (($scm eq "darcs" and "whatsnew")
or ($scm eq "git" and "status"));
# Hack around 'darcs whatsnew' failing if there are no changes
$ignore_failure = 1;
}
elsif ($command =~ /^(?:pus|push)$/) {
@scm_args = "push";
}
elsif ($command =~ /^(?:pul|pull)$/) {
@scm_args = "pull";
# Q: should we append the -a argument for darcs repos?
}
elsif ($command =~ /^(?:g|ge|get)$/) {
# Skip any repositories we have not included the tag for
if (not defined($tags{$tag})) {
next;
}
if (-d $localpath) {
warning("$localpath already present; omitting") if $localpath ne ".";
next;
}
# The first time round the loop, default the get-mode
if (not defined($get_mode)) {
warning("adding --partial, to override use --complete");
$get_mode = "--partial";
}
# The only command that doesn't need a repo
$local_repo_unnecessary = 1;
if ($scm eq "darcs") {
# Note: we can only use the get-mode with darcs for now
@scm_args = ("get", $get_mode, $path, $localpath);
}
else {
@scm_args = ("clone", $path, $localpath);
}
}
elsif ($command =~ /^(?:s|se|sen|send)$/) {
@scm_args = (($scm eq "darcs" and "send")
or ($scm eq "git" and "send-email"));
}
else {
die "Unknown command: $command";
}
# Actually execute the command
chdir $wd_before or die "Could not change to $wd_before";
if (repoexists ($scm, $localpath)) {
chdir $localpath or die "Could not change to $localpath";
scm ($scm, @scm_args, @_);
}
elsif ($local_repo_unnecessary) {
# Don't bother to change directory in this case
scm ($scm, @scm_args, @_);
}
elsif ($tag eq "") {
message "== Required repo $localpath is missing! Skipping";
}
else {
message "== $localpath repo not present; skipping";
}
}
elsif (! /^(#.*)?$/) {
die "Bad line: $_";
}
}
close IN;
}
sub main {
if (! -d ".git" || ! -d "compiler") {
die "error: sync-all must be run from the top level of the ghc tree."
}
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 source-control command
if ($arg eq "-q") {
$verbose = 1;
}
elsif ($arg eq "-s") {
$verbose = 0;
}
elsif ($arg eq "--ignore-failure") {
$ignore_failure = 1;
}
# --<tag> says we grab the libs tagged 'tag' with
# 'get'. It has no effect on the other commands.
elsif ($arg =~ m/^--/) {
$arg =~ s/^--//;
$tags{$arg} = 1;
}
elsif ($arg eq "--complete" || $arg eq "--partial") {
$get_mode = $arg;
}
else {
unshift @_, $arg;
if (grep /^-q$/, @_) {
$verbose = 1;
}
last;
}
}
if ($#_ eq -1) {
# Get the built in help
my $help = <<END;
What do you want to do?
Supported commands:
* whatsnew
* push
* pull
* get, with options:
* --<package-tag>
* --complete
* --partial
* send
Available package-tags are:
END
# Collect all the tags in the packages file
my %available_tags;
open IN, "< packages" or die "Can't open packages file";
while (<IN>) {
chomp;
if (/^([^# ]+) +(?:([^ ]+) +)?([^ ]+) +([^ ]+)/) {
if (defined($2)) {
$available_tags{$2} = 1;
}
}
elsif (! /^(#.*)?$/) {
die "Bad line: $_";
}
}
close IN;
# Show those tags and the help text
my @available_tags = keys %available_tags;
print "$help@available_tags";
exit 1;
}
else {
# Give the command and rest of the arguments to the main loop
scmall @_;
}
}
main(@ARGV);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment