Avoid segfault when ticky file argument is stderr
[ghc-hetmet.git] / darcs-all
index 632d54d..65d6612 100644 (file)
--- a/darcs-all
+++ b/darcs-all
@@ -8,10 +8,14 @@ top_dirs="nofib testsuite"
 # based on where this GHC repo came from.
 defaultrepo=`cat _darcs/prefs/defaultrepo`
 case $defaultrepo in
-  http://* | *@*:*)
-    defaultrepo_lib=`echo $defaultrepo | sed 's!/ghc$!!'`/packages;;
+  # HTTP or SSH:
+  http://* | *:*)
+    defaultrepo_base="`echo $defaultrepo | sed 's!/ghc$!!'`"
+    defaultrepo_lib="$defaultrepo_base"/packages;;
+  # Local filesystem (assumes a checked-out tree):
   /*)
-    defaultrepo_lib=$defaultrepo/libraries;;
+    defaultrepo_base="$defaultrepo"
+    defaultrepo_lib="$defaultrepo"/libraries;;
 esac
 
 quiet=NO
@@ -19,26 +23,26 @@ quiet=NO
 message()
 {
   if [ "$quiet" = "NO" ]; then
-     echo $*
+     echo "$@"
   fi
 }
 
 darcsall()
 {
-  message "== running darcs $* at the top level"
-  darcs $*
+  message "== running darcs $@ at the top level"
+  darcs "$@"
   for dir in $top_dirs; do
     if test -d $dir -a -d $dir/_darcs; then
-       message "== running darcs $* in $dir"
-       darcs $* --repodir $dir
+       message "== running darcs $@ in $dir"
+       darcs "$@" --repodir $dir
     else
        message "== $dir not present or not a repository; skipping"
     fi
   done
   for pkg in `cat libraries/core-packages libraries/extra-packages`; do
     if test -d libraries/$pkg; then
-       message "== running darcs $* in libraries/$pkg"
-       darcs $* --repodir libraries/$pkg
+       message "== running darcs $@ in libraries/$pkg"
+       darcs "$@" --repodir libraries/$pkg
     else
        echo "warning: $pkg doesn't seem to exist, use 'darcs-all get' to get it"
     fi
@@ -48,10 +52,33 @@ darcsall()
 darcsget()
 {
   case $* in
-    *--partial*) ;;
-    *) echo "warning: adding --partial, to override use --complete"
+    *--complete*|*--partial*)
+      additional_flag="" ;;
+    *)
+      echo "warning: adding --partial, to override use --complete"
+      additional_flag="--partial" ;;
   esac
 
+  if test "$nofib" = "YES"; then
+    if test -d nofib; then
+      echo "warning: nofib already present; omitting"
+    else
+      repo="$defaultrepo_base"/nofib
+      message "== running darcs get $additional_flag $@ $repo"
+      darcs get $additional_flag "$@" $repo
+    fi
+  fi
+
+  if test "$testsuite" = "YES"; then
+    if test -d testsuite; then
+      echo "warning: testsuite already present; omitting"
+    else
+      repo="$defaultrepo_base"/testsuite
+      message "== running darcs get $additional_flag $@ $repo"
+      darcs get $additional_flag "$@" $repo
+    fi
+  fi
+
   cd libraries
 
   if test "$extra" = "YES"; then
@@ -65,8 +92,8 @@ darcsget()
        echo "warning: $pkg already present; omitting"
     else
        repo=$defaultrepo_lib/$pkg
-       message "== running darcs get --partial $* $repo"
-       darcs get --partial $* $repo
+       message "== running darcs get $additional_flag $@ $repo"
+       darcs get $additional_flag "$@" $repo
     fi
   done
 }
@@ -82,14 +109,27 @@ esac
 
 # --extra says we grab the extra libs with 'get'.  It has no effect on
 # the other commands.
-extra=NO;
-case $1 in
-  --extra) shift; extra=YES;
-esac
+extra=NO
+# --nofib/--testsuite tell get to also grab the respective repos.
+# They have no effect on the other commands.
+nofib=NO
+testsuite=NO
+
+args_done=NO
+
+while [ "$args_done" = NO ]
+do
+    case $1 in
+      --extra) shift; extra=YES;;
+      --nofib) shift; nofib=YES;;
+      --testsuite) shift; testsuite=YES;;
+      *) args_done=YES;;
+    esac
+done
 
 case $1 in
-  get)  shift; darcsget $*;;
+  get)  shift; darcsget "$@";;
   # Hack around whatsnew failing if there are no changes
-  w|wh|wha|what|whats|whatsn|whatsne|whatsnew) set +e; darcsall $*;;
-  *) darcsall $*;;
+  w|wh|wha|what|whats|whatsn|whatsne|whatsnew) set +e; darcsall "$@";;
+  *) darcsall "$@";;
 esac