# vim: filetype=zsh
set -e
+if [ -n "$ZSH_VERSION" ]; then
+ setopt SH_WORD_SPLIT
+fi
+if [ -z "$ECHO" ]; then
+ if echo "\\\\" | grep .. >/dev/null; then
+ ECHO=echo
+ else
+ ECHO=`which echo`
+ fi
+fi
# I use this in EVERY shell script ;)
LF="
d00=`pwd`
while ! [ -f ./all ]; do
if [ x"`pwd`" = x"/" ]; then
- echo "Cannot find myself."
- echo "Please run this script with the working directory inside a Xonotic checkout."
+ $ECHO "Cannot find myself."
+ $ECHO "Please run this script with the working directory inside a Xonotic checkout."
exit 1
fi
cd ..
msg()
{
- echo >&2 "$ESC[1m$*$ESC[m"
+ $ECHO >&2 "$ESC""[1m$*$ESC""[m"
}
self=`git hash-object "$SELF"`
{
case "$1" in
.)
- echo "the root directory"
+ $ECHO "the root directory"
;;
*)
- echo "\"$1\""
+ $ECHO "\"$1\""
;;
esac
}
check_mergeconflict()
{
if git ls-files -u | grep ' 1 '; then
- echo
- echo "MERGE CONFLICT."
- echo "change into the \"$1\" project directory, and then:"
- echo "- edit the files mentioned above with your favorite editor,"
- echo " and fix the conflicts (marked with <<<<<<< blocks)"
- echo "- for binary files, you can select the files using"
- echo " git checkout --ours or git checkout --theirs"
- echo "- when done with a file, 'git add' the file"
- echo "- when done, 'git commit'"
- echo
+ $ECHO
+ $ECHO "MERGE CONFLICT."
+ $ECHO "change into the \"$1\" project directory, and then:"
+ $ECHO "- edit the files mentioned above with your favorite editor,"
+ $ECHO " and fix the conflicts (marked with <<<<<<< blocks)"
+ $ECHO "- for binary files, you can select the files using"
+ $ECHO " git checkout --ours or git checkout --theirs"
+ $ECHO "- when done with a file, 'git add' the file"
+ $ECHO "- when done, 'git commit'"
+ $ECHO
exit 1
fi
}
yesno=
while [ x"$yesno" != x"y" -a x"$yesno" != x"n" ]; do
eval "$2"
- echo "$1"
+ $ECHO "$1"
IFS= read -r yesno
done
[ x"$yesno" = x"y" ]
}
repos_urls="
-. | | master |
-data/xonotic-data.pk3dir | | master |
-data/xonotic-music.pk3dir | | master |
-data/xonotic-nexcompat.pk3dir | | master | no
-darkplaces | | div0-stable | svn
-netradiant | | master |
-div0-gittools | | master | no
-d0_blind_id | git://github.com/divVerent/d0_blind_id.git | master |
-data/xonotic-maps.pk3dir | | master |
-mediasource | | master | no
-fteqcc | git://github.com/Blub/qclib.git | master |
+. | | master |
+data/xonotic-data.pk3dir | | master |
+data/xonotic-music.pk3dir | | master |
+data/xonotic-nexcompat.pk3dir | | master | no
+darkplaces | | div0-stable | svn
+netradiant | | master |
+div0-gittools | | master | no
+d0_blind_id | | master |
+data/xonotic-maps.pk3dir | | master |
+mediasource | | master | no
+fteqcc | | xonotic-stable | noautocrlf
"
# todo: in darkplaces, change repobranch to div0-stable
-repos=`echo "$repos_urls" | grep . | cut -d '|' -f 1 | tr -d ' '`
+repos=`$ECHO "$repos_urls" | grep . | cut -d '|' -f 1 | tr -d ' '`
base=`git config remote.origin.url`
case "$base" in
base=${base%xonotic.git}
;;
*)
- echo "The main repo is not xonotic.git, what have you done?"
+ $ECHO "The main repo is not xonotic.git, what have you done?"
exit 1
;;
esac
'')
;;
*)
- echo "The main repo is not xonotic.git, what have you done?"
+ $ECHO "The main repo is not xonotic.git, what have you done?"
exit 1
;;
esac
repourl()
{
- repo_t=`echo "$repos_urls" | grep "^$1 " | cut -d '|' -f 2 | tr -d ' '`
+ repo_t=`$ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 2 | tr -d ' '`
if [ -n "$repo_t" ]; then
case "$repo_t" in
*://*)
- echo "$repo_t"
+ $ECHO "$repo_t"
;;
*)
- echo "$base$repo_t"
+ $ECHO "$base$repo_t"
;;
esac
else
if [ x"$1" = x"." ]; then
- echo "$base""xonotic.git"
+ $ECHO "$base""xonotic.git"
else
- echo "$base${1##*/}.git"
+ $ECHO "$base${1##*/}.git"
fi
fi
}
repopushurl()
{
[ -n "$pushbase" ] || return 0
- repo_t=`echo "$repos_urls" | grep "^$1 " | cut -d '|' -f 2 | tr -d ' '`
+ repo_t=`$ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 2 | tr -d ' '`
if [ -n "$repo_t" ]; then
case "$repo_t" in
*://*)
;;
*)
- echo "$pushbase$repo_t"
+ $ECHO "$pushbase$repo_t"
;;
esac
else
if [ x"$1" = x"." ]; then
- echo "$pushbase""xonotic.git"
+ $ECHO "$pushbase""xonotic.git"
else
- echo "$pushbase${1##*/}.git"
+ $ECHO "$pushbase${1##*/}.git"
fi
fi
}
repobranch()
{
- repo_t=`echo "$repos_urls" | grep "^$1 " | cut -d '|' -f 3 | tr -d ' '`
+ repo_t=`$ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 3 | tr -d ' '`
if [ -n "$repo_t" ]; then
- echo "$repo_t"
+ $ECHO "$repo_t"
else
- echo "master"
+ $ECHO "master"
fi
}
repoflags()
{
- echo "$repos_urls" | grep "^$1 " | cut -d '|' -f 4 | tr -d ' '
+ $ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 4 | tr -d ' '
}
listrepos()
# if we have the dir, always keep it
if [ -d "$d" ]; then
msg "Repository $d enabled because it already exists"
- echo "$d"
+ $ECHO "$d"
continue
fi
# if .yes file exists, always keep it
if [ -f "$d.yes" ]; then
msg "Repository $d enabled by a .yes file"
- echo "$d"
+ $ECHO "$d"
continue
fi
# if we have .no file, skip
esac
# default: enable
msg "Repository $d enabled by default"
- echo "$d"
+ $ECHO "$d"
done
}
if [ -z "$r_me" ] || [ -z "$r_other" ]; then
return
fi
+
+ # one of the two sides of the merge should be remote upstream, or all is fine
+ r_r=`git symbolic-ref HEAD`
+ r_r=${r_r#refs/heads/}
+ r_rem=`git config "branch.$r_rem.remote" || $ECHO origin`
+ r_bra=`git config "branch.$r_bra.merge" || $ECHO "$r_r"`
+ r_bra=${r_bra#refs/heads/}
+ if [ x"$r_me" != x"`git rev-parse "$r_rem/$r_bra"`" ]; then
+ if [ x"$r_other" != x"`git rev-parse "$r_rem/$r_bra"`" ]; then
+ return
+ fi
+ fi
+
r_base=`git merge-base "$r_me" "$r_other"`
# no merge-base? upstream did filter-branch
r_l_other=`git log --pretty="format:%s" "$r_me".."$r_other" | grep -v "^Merge" | sort -u`
# heuristics: upstream rebase/filter-branch if more than 50% of the commits of one of the sides are in the other too
- r_lc_me=`echo "$r_l_me" | wc -l`
- r_lc_other=`echo "$r_l_other" | wc -l`
- r_lc_together=`{ echo "$r_l_me"; echo "$r_l_other"; } | sort -u | wc -l`
+ r_lc_me=`$ECHO "$r_l_me" | wc -l`
+ r_lc_other=`$ECHO "$r_l_other" | wc -l`
+ r_lc_together=`{ $ECHO "$r_l_me"; $ECHO "$r_l_other"; } | sort -u | wc -l`
r_lc_same=$(($r_lc_me + $r_lc_other - $r_lc_together))
if [ $(( $r_lc_same * 2 )) -gt $(( $r_lc_me )) ] || [ $(( $r_lc_same * 2 )) -gt $(( $r_lc_other )) ]; then
verbose git config --unset remote.origin.pushurl || true
fi
verbose git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
- verbose git config core.autocrlf input
- if [ -z "`git config push.default`" ]; then
+ case ",`repoflags "$d"`," in
+ *,noautocrlf,*)
+ verbose git config --unset core.autocrlf || true
+ ;;
+ *)
+ verbose git config core.autocrlf input
+ ;;
+ esac
+ if [ -z "`git config push.default || true`" ]; then
verbose git config push.default current # or is tracking better?
fi
+ verbose git config filter.mapclean.clean "tr -d '\r' | grep '^[^/]'"
+ verbose git config filter.mapclean.smudge "cat"
}
mkzip()
zip -0y "$@"
}
+mirrorspeed()
+{
+ # first result is to be ignored, but we use it to check status
+ git ls-remote "$1" refs/heads/master >/dev/null 2>&1 || return 1
+ { time -p git ls-remote "$1" refs/heads/master; } 2>&1 >/dev/null | head -n 1 | cut -d ' ' -f 2 | tr -d . | sed 's,^0*,,'
+ # unit: clock ticks (depends on what "time" returns
+}
+
+bestmirror()
+{
+ pre=$1; shift
+ suf=$1; shift
+
+ if ! { time -p true; } >/dev/null 2>&1; then
+ return 1
+ fi
+
+ bestin=
+ bestt=
+ for mir in "$@"; do
+ case "$mir" in
+ *:*)
+ in=${mir%%:*}
+ op=${mir#*:}
+ ;;
+ *)
+ in=$mir
+ op=
+ ;;
+ esac
+ m=$pre$in$suf
+ if t=`mirrorspeed "$m"`; then
+ if [ -n "$t" ]; then
+ tt=$(($t$op)) # fudge factor
+ msg "$m -> $t$op = $tt ticks"
+ if [ -z "$bestt" ] || [ "$tt" -lt "$bestt" ]; then
+ bestin=$in
+ bestt=$tt
+ fi
+ else
+ msg "$m -> error"
+ fi
+ else
+ msg "$m -> FAIL"
+ fi
+ done
+ if [ -n "$bestin" ]; then
+ msg "Best mirror seems to be $pre$bestin$suf"
+ $ECHO "$bestin"
+ else
+ return 1
+ fi
+}
+
case "$cmd" in
fix_upstream_rebase)
for d in $repos; do
msg "To get access, your key has to be approved first. For that, visit"
msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
msg "the \"Support\" tracker in the \"Repository\" category where you"
- msg "apply for access and paste the following output into the ticket:"
+ msg "apply for access and paste the following output into the issue:"
msg ""
msg "`cat ~/.ssh/id_rsa.pub`"
+ msg ""
+ msg "Note that you will only have write access to branches that start"
+ msg "with your user name."
elif [ -f ~/.ssh/id_dsa.pub ]; then
msg ""
msg "A key already exists and no new one will be generated. If you"
msg "To get access, your key has to be approved first. For that, visit"
msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
msg "the \"Support\" tracker in the \"Repository\" category where you"
- msg "apply for access and paste the following output into the ticket:"
+ msg "apply for access and paste the following output into the issue:"
msg ""
msg "`cat ~/.ssh/id_dsa.pub`"
+ msg ""
+ msg "Note that you will only have write access to branches that start"
+ msg "with your user name."
else
msg ""
msg "No key has been generated yet. One will be generated now."
msg "If other people are using your computer, it is recommended"
- msg "to specify a passphrase."
+ msg "to specify a passphrase. Otherwise you can simply hit ENTER"
+ msg "when asked for a passphrase."
msg ""
- ssh-keygen -t rsa -b 4096
+ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
msg ""
msg "To get access, your key has to be approved first. For that, visit"
msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
msg "the \"Support\" tracker in the \"Repository\" category where you"
- msg "apply for access and paste the following output into the ticket:"
+ msg "apply for access and paste the following output into the issue:"
msg ""
msg "`cat ~/.ssh/id_rsa.pub`"
+ msg ""
+ msg "Note that you will only have write access to branches that start"
+ msg "with your user name."
fi
;;
update|pull)
allow_pull=true
fix_config=false
+ location=current
while :; do
if [ x"$1" = x"-N" ]; then
allow_pull=false
elif [ x"$1" = x"-p" ]; then
fix_config=true
- if [ x"$base" != x"ssh://xonotic@git.xonotic.org/" ]; then
- pushbase=ssh://xonotic@git.xonotic.org/
- fi
+ pushbase=ssh://xonotic@git.xonotic.org/
+ elif [ x"$1" = x"-ps" ]; then
+ fix_config=true
+ pushbase=ssh://xonotic@git.xonotic.org/
+ elif [ x"$1" = x"-ph" ]; then
+ fix_config=true
+ pushbase=http://git.xonotic.org/login/xonotic/
elif [ x"$1" = x"-s" ]; then
fix_config=true
base=ssh://xonotic@git.xonotic.org/
- pushbase=
elif [ x"$1" = x"-g" ]; then
fix_config=true
base=git://git.xonotic.org/xonotic/
elif [ x"$1" = x"-h" ]; then
fix_config=true
base=http://git.xonotic.org/xonotic/
+ elif [ x"$1" = x"-l" ]; then
+ case "$2" in
+ nl) ;;
+ de) ;;
+ us) ;;
+ best) ;;
+ default) ;;
+ *)
+ msg "Invalid location!"
+ msg "Possible locations for the -l option:"
+ msg " nl (Netherlands, run by merlijn)"
+ msg " de (Germany, run by divVerent)"
+ msg " us (United States of America, run by detrate)"
+ msg " best (find automatically)"
+ msg " default (currently nl)"
+ exit 1
+ ;;
+ esac
+ fix_config=true
+ location=$2
+ shift
else
break
fi
shift
done
+ case "$location" in
+ current)
+ if [ x"`git config xonotic.all.mirrorselection 2>/dev/null || true`" != x"done" ]; then
+ git config xonotic.all.mirrorselection done
+ location=best
+ fi
+ ;;
+ esac
+ case "$location" in
+ best)
+ # if we fetched via ssh://, switch to git:// for fetching and keep using ssh:// for pushing
+ case "$base" in
+ ssh://*|*/login/*)
+ pushbase=$base
+ base=git://git.xonotic.org/xonotic/
+ ;;
+ esac
+ newbase=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,:// .git.xonotic.org/,"`
+ case "$newbase" in
+ *\ *)
+ if location=`bestmirror $newbase"xonotic.git" de us nl:'*6/5'`; then # 20% malus to the NL server to not overload it too much
+ :
+ else
+ location=current
+ fi
+ ;;
+ *)
+ location=current
+ ;;
+ esac
+ ;;
+ esac
+ case "$location" in
+ default)
+ location=
+ ;;
+ current)
+ case "$base" in
+ *://*.git.xonotic.org/*)
+ location=${base%%.git.xonotic.org/*}
+ location=${location##*://}
+ ;;
+ *)
+ location=
+ ;;
+ esac
+ ;;
+ esac
+ if [ -n "$location" ]; then
+ base=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,://$location.git.xonotic.org/,"`
+ pushbase=`$ECHO "$pushbase" | sed "s,://\(.*\.\)\?git.xonotic.org/,://$location.git.xonotic.org/,"`
+ else
+ base=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,://git.xonotic.org/,"`
+ pushbase=`$ECHO "$pushbase" | sed "s,://\(.*\.\)\?git.xonotic.org/,://git.xonotic.org/,"`
+ fi
if $fix_config; then
url=`repourl .`
pushurl=`repopushurl .`
if ! verbose git pull; then
fix_upstream_rebase_mergefail || true
check_mergeconflict "$d"
- echo "Pulling failed. Press ENTER to continue, or Ctrl-C to abort."
+ $ECHO "Pulling failed. Press ENTER to continue, or Ctrl-C to abort."
read -r DUMMY
else
fix_upstream_rebase_mergeok || true
;;
esac
fi
+ if [ -n "$checkoutflags" ]; then
+ set -- -f "$@" # to make checkself work again
+ fi
exists=false
for d in $repos; do
enter "$d0/$d" verbose
exists=true
verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
else
- echo "WTF? Not even branch $b doesn't exist in $d"
+ $ECHO "WTF? Not even branch $b doesn't exist in $d"
exit 1
fi
fi
cd "$d0"
done
if ! $exists; then
- echo "The requested branch was not found in any repository."
+ $ECHO "The requested branch was not found in any repository."
fi
exec "$SELF" branch
;;
enter "$d0/$d"
r=`git symbolic-ref HEAD`
r=${r#refs/heads/}
- echo "$d is at $r"
+ $ECHO "$d is at $r"
cd "$d0"
done
else
dv=`visible_repo_name "$d"`
enter "$d0/$d" verbose
if git rev-parse "refs/heads/$branch" >/dev/null 2>&1; then
- echo "Already having this branch in $dv."
+ $ECHO "Already having this branch in $dv."
else
if yesno "Branch in $dv?"; then
if [ -n "$srcbranch" ]; then
continue
fi
BRANCH=${BRANCH#remotes/}
- ID=`echo "$BRANCH" | tr -c "A-Za-z0-9." "_"`
+ ID=`$ECHO "$BRANCH" | tr -c "A-Za-z0-9." "_"`
branches_list="$branches_list $BRANCH" # TEH SORT MAKEZ IT UNIEQ
eval "r=\$branches_repos_$ID"
r="$r $d"
eval "branches_repos_$ID=\$r"
done
- echo -n "$branches_list" | xargs -n 1 echo | sort -u | while IFS= read -r BRANCH; do
- ID=`echo "$BRANCH" | tr -c "A-Za-z0-9." "_"`
+ $ECHO -n "$branches_list" | xargs -n 1 $ECHO | sort -u | while IFS= read -r BRANCH; do
+ ID=`$ECHO "$BRANCH" | tr -c "A-Za-z0-9." "_"`
eval "r=\$branches_repos_$ID"
printf "%-60s %s\n" "$BRANCH" "$r"
- #echo "$BRANCH: $r"
+ #$ECHO "$BRANCH: $r"
done
}
;;
diffdata=`git diff --color HEAD`
if [ -n "$diffdata" ]; then
# we have uncommitted changes
- if yesno "Uncommitted changes in \"$r\" in $dv. Commit?" 'echo "$diffdata" | less -r'; then
+ if yesno "Uncommitted changes in \"$r\" in $dv. Commit?" '$ECHO "$diffdata" | less -r'; then
verbose git commit -a
fi
fi
- rem=`git config "branch.$r.remote" || echo origin`
- bra=`git config "branch.$r.merge" || echo "$r"`
+ rem=`git config "branch.$r.remote" || $ECHO origin`
+ bra=`git config "branch.$r.merge" || $ECHO "$r"`
upstream="$rem/${bra#refs/heads/}"
if ! git rev-parse "$upstream" >/dev/null 2>&1; then
upstream="origin/`repobranch "$d"`"
fi
logdata=`git log --color "$upstream".."$r"`
if [ -n "$logdata" ]; then
- if yesno "Push \"$r\" in $dv?" 'echo "$logdata" | less -r'; then
+ if yesno "Push \"$r\" in $dv?" '$ECHO "$logdata" | less -r'; then
verbose git push "$rem" HEAD
fi
fi
cleanqc=false
compiled0=false
debug=debug
+ snowleopardhack=false
if [ -z "$CC" ]; then
export CC="gcc -DSUPPORTIPV6"
fi
case "$1" in
-0)
compiled0=true
+ shift
;;
-c)
cleand0=true
;;
-r)
debug=release
- export CC="$CC -g -mtune=native -march=native"
+ export CC="$CC -g"
+ case "`$CC -dumpversion`" in
+ [5-9]*|[1-9][0-9]*|4.[3-9]*|4.[1-9][0-9]*)
+ # gcc 4.3 or higher
+ # -march=native is broken < 4.3
+ export CC="$CC -mtune=native -march=native"
+ ;;
+ esac
+ if [ -n "$WE_HATE_OUR_USERS" ]; then
+ export CC="$CC -fno-common"
+ fi
shift
;;
*)
;;
*)
# AGL cannot be compiled on systems with a kernel > 10.x (Snow Leopard)
+ snowleopardhack=true
TARGETS="sv-$debug sdl-$debug"
;;
esac
- export CC="$CC -I$PWD/misc/buildfiles/osx/Xonotic-SDL.app/Contents/Frameworks/SDL.framework/Headers -F$PWD/misc/buildfiles/osx/Xonotic-SDL.app/Contents/Frameworks"
+ export CC="$CC -fno-reorder-blocks -I$PWD/misc/buildfiles/osx/Xonotic-SDL.app/Contents/Frameworks/SDL.framework/Headers -F$PWD/misc/buildfiles/osx/Xonotic-SDL.app/Contents/Frameworks"
else
TARGETS="sv-$debug cl-$debug sdl-$debug"
fi
sdl)
TARGETS="$TARGETS sdl-debug"
;;
- glx|agl|wgl)
+ agl)
+ TARGETS="$TARGETS cl-debug"
+ if $snowleopardhack; then
+ export CC="$CC -arch i386"
+ fi
+ ;;
+ glx|wgl)
TARGETS="$TARGETS cl-debug"
;;
dedicated)
mkdir -p .libs
if [ -n "$WE_HATE_OUR_USERS" ]; then
verbose cp "$d0/misc/buildfiles/win32/libd0_blind_id"-* .libs/
+ verbose cp "$d0/misc/buildfiles/win32/libd0_rijndael"-* .libs/
verbose cp "$d0/misc/buildfiles/win32/libgmp"-* .libs/
else
case "`uname`" in
Linux)
case `uname -m` in
x86_64)
- verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_blind_id".* .libs/
- verbose cp "$d0/misc/builddeps/dp.linux64/lib/libgmp".* .libs/
- MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/"
+ #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_blind_id".* .libs/
+ #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_rijndael".* .libs/
+ #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libgmp".* .libs/
+ MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/ DP_CRYPTO_RIJNDAEL_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/"
;;
*86)
- verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_blind_id".* .libs/
- verbose cp "$d0/misc/builddeps/dp.linux32/lib/libgmp".* .libs/
- MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/"
+ #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_blind_id".* .libs/
+ #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_rijndael".* .libs/
+ #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libgmp".* .libs/
+ MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/ DP_CRYPTO_RIJNDAEL_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/"
;;
*)
compiled0=true
;;
Darwin)
verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_blind_id".* .libs/
+ verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_rijndael".* .libs/
;;
*)
compiled0=true
enter "$d0/data/xonotic-data.pk3dir" verbose
if $cleanqc; then
- verbose make FTEQCC="$d0/fteqcc/fteqcc.bin" "$@" $MAKEFLAGS clean
+ verbose make FTEQCC="../../../../fteqcc/fteqcc.bin" "$@" $MAKEFLAGS clean
fi
- verbose make FTEQCC="$d0/fteqcc/fteqcc.bin" "$@" $MAKEFLAGS
+ verbose make FTEQCC="../../../../fteqcc/fteqcc.bin" "$@" $MAKEFLAGS
+ # 4 levels up: data, xonotic-data, qcsrc, server
enter "$d0/darkplaces" verbose
if [ x"$BAD_TARGETS" = x" " ]; then
- echo "Warning: invalid empty client, default clients will be used."
+ $ECHO "Warning: invalid empty client, default clients will be used."
fi
if $cleandp; then
verbose make $MAKEFLAGS clean
verbose make $MAKEFLAGS STRIP=: "$@" "$T"
done
for T in $BAD_TARGETS; do
- echo "Warning: discarded invalid client $T."
+ $ECHO "Warning: discarded invalid client $T."
done
verbose "$SELF" update-maps
if [ -x "darkplaces/darkplaces$client.exe" ]; then
client=$client.exe
else
- echo "Client darkplaces/darkplaces$client not found, aborting"
+ $ECHO "Client darkplaces/darkplaces$client not found, aborting"
exit 1
fi
fi
binary=$1
- if [ -n "$USE_GDB" ]; then
+ if [ x"$USE_GDB" = x"yes" ]; then
set -- gdb --args "$@"
- elif which gdb >/dev/null 2>&1; then
+ elif [ x"$USE_GDB" != x"no" ] && which gdb >/dev/null 2>&1; then
set -- gdb --batch -x savecore.gdb --args "$@"
elif which catchsegv >/dev/null 2>&1; then
set -- catchsegv "$@"
# # somehow send it
# rm -f xonotic.core.tar.gz
else
- echo "The core dump can be examined later by"
- echo " gdb $binary xonotic.core"
+ $ECHO "The core dump can be examined later by"
+ $ECHO " gdb $binary xonotic.core"
fi
+ exit 1
fi
;;
each|foreach)
continue
fi
if git format-patch -o "$patchdir/$i" "$UPSTREAM".."$BRANCH"; then
- echo "$d" > "$patchdir/$i/info.txt"
- echo "$BRANCH" >> "$patchdir/$i/info.txt"
- echo "$UPSTREAM" >> "$patchdir/$i/info.txt"
- echo "$TRACK" >> "$patchdir/$i/info.txt"
+ $ECHO "$d" > "$patchdir/$i/info.txt"
+ $ECHO "$BRANCH" >> "$patchdir/$i/info.txt"
+ $ECHO "$UPSTREAM" >> "$patchdir/$i/info.txt"
+ $ECHO "$TRACK" >> "$patchdir/$i/info.txt"
i=$(($i+1))
else
rm -rf "$patchdir/$i"
;;
admin-merge)
branch=$1
+ only_delete=false
+ case "$branch" in
+ -d)
+ branch=
+ only_delete=true
+ ;;
+ esac
t=`mktemp`
report=""
reportecho()
{
report=$report"$*$LF"
- echo "$*"
+ $ECHO "$*"
}
reportecho4()
{
report=$report" $*$LF"
- echo " $*"
+ $ECHO " $*"
}
reportdo4()
{
reportecho "$o"
}
for d in $repos; do
+ case "$d" in
+ fteqcc)
+ # sorry, fteqcc repo is managed manually
+ continue
+ ;;
+ esac
enter "$d0/$d" verbose
base="`repobranch "$d"`"
reportecho "In $d:"
diffdata=`git diff --color --find-copies-harder --ignore-space-change "$realbase"..."$ref"`
if [ -z "$diffdata" ]; then
reportecho4 "--> not merging, no changes vs master, branch contains redundant history"
- if yesno "Branch \"$ref\" probably should get deleted. Do it?" '{ echo "$logdata"; } | less -r'; then
+ if yesno "Branch \"$ref\" probably should get deleted. Do it?" '{ $ECHO "$logdata"; } | less -r'; then
git push origin :"${ref#refs/remotes/origin/}"
reportecho4 "--> branch deleted"
fi
+ elif $only_delete; then
+ reportecho4 "--> skipped in delete-only run"
elif [ -z "$branch" ] && [ -n "$note" ]; then
- reportdo4 echo "$note"
+ reportdo4 $ECHO "$note"
reportecho4 "--> not merging, already had this one rejected before"
- elif yesno "Branch \"$ref\" may want to get merged. Do it?" '{ echo "$logdata"; echo "$diffdata"; } | less -r'; then
+ elif yesno "Branch \"$ref\" may want to get merged. Do it?" '{ $ECHO "$logdata"; $ECHO "$diffdata"; } | less -r'; then
git checkout "$realbase"
org=`git rev-parse HEAD`
if ! git merge --no-ff "$ref" 2>&1 | tee "$t" && ! { git ls-files -u | grep ' 1 ' >/dev/null; }; then
git push origin :"${ref#refs/remotes/origin/}"
reportecho4 "--> test failed, branch deleted"
elif [ -n "$note" ]; then
- reportdo4 echo "$note"
+ reportdo4 $ECHO "$note"
reportecho4 "--> test failed"
else
reportecho4 "--> test failed, postponed"
fi
else
- echo "MERGING"
+ # apply crlf, or other cleanup filters (non-behavioural changes)
+ git reset --hard
+ find . -type f -exec touch {} \;
+ git commit -a --amend -C HEAD || true # don't fail if nothing to commit
+
+ $ECHO "MERGING"
case ",`repoflags "$d"`," in
*,svn,*)
# we do quite a mess here... luckily we know $org
git push origin :"${ref#refs/remotes/origin/}"
reportecho4 "--> branch deleted"
elif [ -n "$note" ]; then
- reportdo4 echo "$note"
+ reportdo4 $ECHO "$note"
reportecho4 "--> rejected"
else
reportecho4 "--> postponed"
reportecho ""
done
rm -f "$t"
- echo "$report" | ssh nexuiz@rm.endoftheinternet.org cat '>>' public_html/xonotic-merge-notes.txt
+ $ECHO "$report" | ssh nexuiz@rm.endoftheinternet.org cat '>>' public_html/xonotic-merge-notes.txt
;;
clean)
"$SELF" fix_config
# ./all clean [-m] [-f | -fu | -fU] [-r] [-D]
# ./all clean --reclone
found=false
- while :; do
- if [ x"$1" = x"--reclone" ]; then
+ for X in "$@"; do
+ if [ x"$X" = x"--reclone" ]; then
force=true
fetchupstream=true
gotoupstream=true
gotomaster=true
rmuntracked=true
killbranches=true
- elif [ x"$1" = x"-f" ]; then
+ elif [ x"$X" = x"-f" ]; then
force=true
- elif [ x"$1" = x"-u" ]; then
+ elif [ x"$X" = x"-u" ]; then
gotoupstream=true
- elif [ x"$1" = x"-U" ]; then
+ elif [ x"$X" = x"-U" ]; then
gotoupstream=true
fetchupstream=true
- elif [ x"$1" = x"-fu" ]; then
+ elif [ x"$X" = x"-fu" ]; then
force=true
gotoupstream=true
- elif [ x"$1" = x"-fU" ]; then
+ elif [ x"$X" = x"-fU" ]; then
force=true
gotoupstream=true
fetchupstream=true
- elif [ x"$1" = x"-m" ]; then
+ elif [ x"$X" = x"-m" ]; then
gotomaster=true
- elif [ x"$1" = x"-r" ]; then
+ elif [ x"$X" = x"-r" ]; then
rmuntracked=true
- elif [ x"$1" = x"-D" ]; then
+ elif [ x"$X" = x"-D" ]; then
killbranches=true
+ elif $ECHO "$X" | grep '^-FFFF*UUUU*$' >/dev/null; then
+ msg ''
+ msg " _____"
+ msg " ,--'-\\P/\`\\ FFFFFFF"
+ msg " __/_ B/,-.\\ FFFFFFF"
+ msg " / _\\ (// O\\\\ FFFFFF"
+ msg "| (O \`) _\\._ _)\\ FFFUU"
+ msg "| |___/.^d0~~\"\\ \\ UUUU"
+ msg "| |\`~' \\ | UUUU"
+ msg "| | __,C>|| UUUU"
+ msg "\\ /_ ,-/,-' | UUUU"
+ msg " \\\\_ \\_>~' / UUUU-"
+ msg ''
else
- break
+ msg "Unknown arg: $X"
fi
found=true
- shift
done
if ! $found; then
rmuntracked=true
else
r=`git symbolic-ref HEAD`
r=${r#refs/heads/}
- rem=`git config "branch.$r.remote" || echo origin`
- bra=`git config "branch.$r.merge" || echo "$r"`
+ rem=`git config "branch.$r.remote" || $ECHO origin`
+ bra=`git config "branch.$r.merge" || $ECHO "$r"`
upstream="$rem/${bra#refs/heads/}"
if $fetchupstream; then
verbose git fetch "$rem"
if $rmuntracked; then
case "$d" in
.)
- verbose git clean -df
+ verbose git clean -df || true
;;
*)
- verbose git clean -xdf
+ verbose git clean -xdf || true
;;
esac
fi
verbose git branch -D "${B#refs/heads/}"
fi
done
- git rev-parse refs/heads/master >/dev/null 2>&1 || verbose git branch -t master origin/master || true
- git rev-parse "refs/heads/`repobranch "$d"`" >/dev/null 2>&1 || verbose git branch -t "`repobranch "$d"`" origin/"`repobranch "$d"`" || true
+ git rev-parse refs/heads/master >/dev/null 2>&1 || verbose git branch --track master origin/master || true
+ git rev-parse "refs/heads/`repobranch "$d"`" >/dev/null 2>&1 || verbose git branch --track "`repobranch "$d"`" origin/"`repobranch "$d"`" || true
fi
+ checkself "$cmd" "$@"
done
;;
release-prepare)
#"$SELF" each git clean -fxd
case "$RELEASETYPE" in
- beta)
- msg "Building a BETA"
- ;;
- release)
- msg "Building a RELEASE"
- ;;
- *)
- echo >&2 -n "$ESC[2J$ESC[H"
+ '')
+ $ECHO >&2 -n "$ESC[2J$ESC[H"
msg ""
msg ""
msg ""
# (YYYYMMDD)
exit 1
;;
+ release)
+ msg "Building a FINISHED RELEASE"
+ ;;
+ *)
+ msg "Building a $RELEASETYPE"
+ ;;
esac
verbose rm -rf Xonotic Xonotic*.zip
verbose mkdir -p Xonotic
if [ -n "$RELEASEDATE" ]; then
- verbose echo "$RELEASEDATE" > Xonotic/stamp.txt
+ verbose $ECHO "$RELEASEDATE" > Xonotic/stamp.txt
else
verbose date +%Y%m%d > Xonotic/stamp.txt
fi
verbose git archive --format=tar HEAD -- Docs misc server xonotic-linux-glx.sh xonotic-linux-sdl.sh misc/buildfiles key_0.d0pk | {
verbose cd Xonotic
- verbose mkdir data fteqcc source source/darkplaces source/fteqcc
+ verbose mkdir data fteqcc source source/darkplaces source/fteqcc source/d0_blind_id mapping
verbose tar xvf -
verbose rm -rf misc/builddeps
verbose mv misc/buildfiles/win32/* . || true
verbose cd Xonotic/source
verbose tar xvf -
}
+ {
+ verbose cd d0_blind_id
+ verbose git archive --format=tar HEAD
+ } | {
+ verbose cd Xonotic/source/d0_blind_id
+ verbose tar xvf -
+ verbose sh autogen.sh
+ }
rm -f Xonotic/key_15.d0pk
+ {
+ verbose cd Xonotic/mapping
+ verbose wget http://www.icculus.org/netradiant/files/netradiant-1.5.0-20110223.tar.bz2
+ verbose wget http://www.icculus.org/netradiant/files/netradiant-1.5.0-20110223-win32-7z.exe
+ for X in *-7z.exe; do
+ 7za x "$X"
+ rm -f "$X"
+ done
+ # TODO possibly include other tools?
+ }
;;
release-compile-run)
host=$1
# now rebrand the binaries...
for f in $targetfiles; do
#verbose "$d0/misc/tools/rebrand-darkplaces-engine.sh" "${XONOTIC_BRAND:-$d0/misc/tools/xonotic.brand}" "${f##*:}" || true
- case "$f" in
- xonotic*.exe)
- verbose "$d0/misc/tools/change-icon-of-exe.sh" "$d0/misc/logos/icons_ico/xonotic.ico" "$f"
+ case "${f##*:}" in
+ Xonotic/xonotic*.exe)
+ verbose "$d0/misc/tools/change-icon-of-exe.sh" "$d0/misc/logos/icons_ico/xonotic.ico" "${f##*:}"
(
d=`mktemp -d -t rebrand.XXXXXX`
cd "$d"
- echo "-mygames" > darkplaces.opt
+ $ECHO "-mygames" > darkplaces.opt
zip -9r darkplaces.zip darkplaces.opt
cat darkplaces.zip
cd "$d0"
rm -rf "$d"
- ) >> "$f"
+ ) >> "${f##*:}"
;;
esac
done
win 'fteqcc.exe:Xonotic/fteqcc/fteqcc.exe' \
'' ''
verbose "$SELF" release-compile win32 \
- 'STRIP=: DP_MAKE_TARGET=mingw CC="i586-mingw32msvc-gcc -g -Wl,--dynamicbase -Wl,--nxcompat -I.deps/include -L.deps/lib -DUSE_WSPIAPI_H -DSUPPORTIPV6" WINDRES="i586-mingw32msvc-windres" SDL_CONFIG=".deps/bin/sdl-config" LIB_JPEG= CFLAGS_LIBJPEG= WIN32RELEASE=1 D3D=0' \
+ 'STRIP=: DP_MAKE_TARGET=mingw CC="i586-mingw32msvc-g++ -g -Wl,--dynamicbase -Wl,--nxcompat -I.deps/include -L.deps/lib -DUSE_WSPIAPI_H -DSUPPORTIPV6" WINDRES="i586-mingw32msvc-windres" SDL_CONFIG=".deps/bin/sdl-config" LIB_JPEG= CFLAGS_LIBJPEG= WIN32RELEASE=1 D3D=1' \
'' '' \
release 'darkplaces.exe:Xonotic/xonotic.exe darkplaces-sdl.exe:Xonotic/xonotic-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-dedicated.exe'
;;
win 'fteqcc.exe:Xonotic/fteqcc/fteqcc-x64.exe' \
'sv-release sdl-release' 'darkplaces-sdl.exe:Xonotic/xonotic-x64-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-x64-dedicated.exe'
verbose "$SELF" release-compile win64 \
- 'STRIP=: DP_MAKE_TARGET=mingw CC="x86_64-w64-mingw32-gcc -g -Wl,--dynamicbase -Wl,--nxcompat -I.deps/include -L.deps/lib -DSUPPORTIPV6" WINDRES="x86_64-w64-mingw32-windres" SDL_CONFIG=".deps/bin/sdl-config" LIB_JPEG= CFLAGS_LIBJPEG= WIN64RELEASE=1 D3D=0' \
+ 'STRIP=: DP_MAKE_TARGET=mingw CC="x86_64-w64-mingw32-g++ -g -Wl,--dynamicbase -Wl,--nxcompat -I.deps/include -L.deps/lib -DSUPPORTIPV6" WINDRES="x86_64-w64-mingw32-windres" SDL_CONFIG=".deps/bin/sdl-config" LIB_JPEG= CFLAGS_LIBJPEG= WIN64RELEASE=1 D3D=1' \
'' '' \
cl-release 'darkplaces.exe:Xonotic/xonotic-x64.exe'
;;
verbose "$SELF" update-maps
;;
release-qc)
- case "$RELEASETYPE" in
- beta)
- verbose make -C Xonotic/source FTEQCC="$d0/Xonotic/fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 clean all
- ;;
- release)
- verbose make -C Xonotic/source FTEQCC="$d0/Xonotic/fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 FTEQCCFLAGS_WATERMARK= clean all
- ;;
- esac
- verbose rm -f Xonotic/source/*/fteqcc.log
+ verbose make -C Xonotic/source FTEQCC="../../../fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 clean all
+ verbose rm -f Xonotic/source/qcsrc/*/fteqcc.log
;;
release-buildpk3-transform-raw)
dir=$1
verbose cd "$dir"
# texture: convert to jpeg and dds
verbose export do_jpeg=true
+ verbose export jpeg_qual_rgb=97
+ verbose export jpeg_qual_a=99
+ verbose export do_dds=false
+ verbose export do_ogg=false
+ verbose export del_src=true
+ find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
+ ;;
+ release-buildpk3-transform-normaldds)
+ dir=$1
+ verbose cd "$dir"
+ # texture: convert to jpeg and dds
+ # music: reduce bitrate
+ verbose export do_jpeg=false
+ verbose export do_jpeg_if_not_dds=true
verbose export jpeg_qual_rgb=95
verbose export jpeg_qual_a=99
verbose export do_dds=true
verbose export dds_flags=
- verbose export do_ogg=false
+ verbose export do_ogg=true
verbose export del_src=true
find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
;;
# music: reduce bitrate
verbose export do_jpeg=true
verbose export jpeg_qual_rgb=80
- verbose export jpeg_qual_a=95
+ verbose export jpeg_qual_a=97
verbose export do_dds=false
verbose export do_ogg=true
verbose export ogg_qual=1
verbose export do_jpeg=false
verbose export do_jpeg_if_not_dds=true
verbose export jpeg_qual_rgb=80
- verbose export jpeg_qual_a=95
+ verbose export jpeg_qual_a=99
verbose export do_dds=true
verbose export dds_flags=
verbose export do_ogg=true
verbose rm -rf qcsrc
gv=`grep "^gameversion " "defaultXonotic.cfg" | awk '{ print $2 }'`
major=$(($gv / 10000))
- minor=$(($gv / 100 - $major * 100))
- patch=$(($gv - $major * 10000 - $minor * 100))
+ minor=$((($gv / 100) - ($major * 100)))
+ patch=$(($gv - ($major * 10000) - ($minor * 100)))
versionstr="$major.$minor.$patch"
case "$RELEASETYPE" in
- beta)
- versionstr="$versionstr""beta"
+ release)
+ ;;
+ *)
+ versionstr="$versionstr$RELEASETYPE"
;;
esac
verbose sed -i "
s/^gameversion_min [0-9]*/gameversion_min $(( ($gv / 100) * 100 - 100 ))/;
s/^gameversion_max [0-9]*/gameversion_max $(( ($gv / 100) * 100 + 199 ))/;
" defaultXonotic.cfg
+ case "$RELEASETYPE" in
+ release)
+ echo "" >> defaultXonotic.cfg
+ echo "// nicer menu" >> defaultXonotic.cfg
+ echo "set menu_watermark \"\"" >> defaultXonotic.cfg
+ ;;
+ esac
(
verbose cd gfx/menu/luminos
verbose cp "$d0"/mediasource/gfx/menu/luminos_versionbuilder/background_l2.svg .
done
;;
release-pack)
- verbose "$SELF" release-buildpk3s data/font-nimbussansl.pk3dir raw ''
- verbose "$SELF" release-buildpk3s data/xonotic-data.pk3dir normal '' raw '-raw' low '-low' lowdds '-lowdds'
- verbose "$SELF" release-buildpk3s data/xonotic-maps.pk3dir normal '' raw '-raw' low '-low' lowdds '-lowdds'
- verbose "$SELF" release-buildpk3s data/xonotic-music.pk3dir raw '' low '-low'
- verbose "$SELF" release-buildpk3s data/xonotic-nexcompat.pk3dir low ''
+ verbose "$SELF" release-buildpk3s data/font-nimbussansl.pk3dir raw ''
+ verbose "$SELF" release-buildpk3s data/font-xolonium.pk3dir raw ''
+ verbose "$SELF" release-buildpk3s data/xonotic-data.pk3dir normal '-high' low '-low' normaldds ''
+ verbose "$SELF" release-buildpk3s data/xonotic-maps.pk3dir normal '-high' low '-low' normaldds ''
+ verbose "$SELF" release-buildpk3s data/xonotic-music.pk3dir raw '' low '-low'
+ verbose "$SELF" release-buildpk3s data/xonotic-nexcompat.pk3dir normal '-high' normaldds ''
;;
release-pack-needsx11)
case "$DISPLAY" in
# exe and dll files do not need +x, so this makes them eligible for 7zip compression too
chmod a-x Xonotic/*.exe Xonotic/*.dll || true
# let's pass crypto import laws of some nasty countries
- crypto_libs=`find Xonotic -name \*d0_rijndael\*`
+ crypto_libs=`find Xonotic -name \*d0_rijndael\*.so -o -name \*d0_rijndael\*.dylib -o -name \*d0_rijndael\*.dll -o -name \*d0_rijndael\*.c`
if [ -n "$crypto_libs" ]; then
verbose mkzip Xonotic-$stamp-crypto.zip \
$crypto_libs
Xonotic/fteqcc \
Xonotic/server \
Xonotic/key_0.d0pk \
- Xonotic/data/font-nimbussansl-$stamp.pk3
+ Xonotic/data/font-nimbussansl-$stamp.pk3 \
+ Xonotic/data/font-xolonium-$stamp.pk3
verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp.zip
verbose mkzip0 Xonotic-$stamp.zip \
Xonotic/data/xonotic-$stamp-data.pk3 \
Xonotic/data/xonotic-$stamp-data-low.pk3 \
Xonotic/data/xonotic-$stamp-maps-low.pk3 \
Xonotic/data/xonotic-$stamp-music-low.pk3
- verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp-lowdds.zip
- verbose mkzip0 Xonotic-$stamp-lowdds.zip \
- Xonotic/data/xonotic-$stamp-data-lowdds.pk3 \
- Xonotic/data/xonotic-$stamp-maps-lowdds.pk3 \
- Xonotic/data/xonotic-$stamp-music-low.pk3
verbose mv Xonotic-$stamp-common.zip Xonotic-$stamp-high.zip
verbose mkzip0 Xonotic-$stamp-high.zip \
- Xonotic/data/xonotic-$stamp-data-raw.pk3 \
- Xonotic/data/xonotic-$stamp-maps-raw.pk3 \
+ Xonotic/data/xonotic-$stamp-data-high.pk3 \
+ Xonotic/data/xonotic-$stamp-maps-high.pk3 \
Xonotic/data/xonotic-$stamp-music.pk3 \
- Xonotic/data/xonotic-$stamp-nexcompat.pk3
+ Xonotic/data/xonotic-$stamp-nexcompat-high.pk3
+ verbose mkzip0 Xonotic-$stamp-mappingsuppport.zip \
+ Xonotic/mapping \
+ Xonotic/data/xonotic-$stamp-maps-low.pk3 # TODO add a Radiant build
;;
release)
verbose "$SELF" release-prepare
;;
*)
- echo "Usage:"
- echo " $SELF admin-merge [<branch>]"
- echo " $SELF branch <branch>"
- echo " $SELF branch <remote> <branch> [<srcbranch>]"
- echo " $SELF branches"
- echo " $SELF checkout|switch <branch>"
- echo " $SELF checkout|switch <remote>/<branch>"
- echo " $SELF clean [-m] [-f | -fu | -fU] [-r] [-D]"
- echo " $SELF clean --reclone"
- echo " $SELF compile [-c]"
- echo " $SELF each|foreach [-k] command..."
- echo " $SELF fix_upstream_rebase"
- echo " $SELF merge"
- echo " $SELF push|commit [-s]"
- echo " $SELF release"
- echo " $SELF restore-patches"
- echo " $SELF run [sdl|glx|wgl|agl|dedicated] options..."
- echo " $SELF save-patches"
- echo " $SELF update-maps"
- echo " $SELF update|pull [-N]"
+ $ECHO "Usage:"
+ $ECHO " $SELF admin-merge [<branch>]"
+ $ECHO " $SELF branch <branch>"
+ $ECHO " $SELF branch <remote> <branch> [<srcbranch>]"
+ $ECHO " $SELF branches"
+ $ECHO " $SELF checkout|switch <branch>"
+ $ECHO " $SELF checkout|switch <remote>/<branch>"
+ $ECHO " $SELF clean [-m] [-f | -fu | -fU] [-r] [-D]"
+ $ECHO " $SELF clean --reclone"
+ $ECHO " $SELF compile [-c] [-r] [-0]"
+ $ECHO " $SELF each|foreach [-k] command..."
+ $ECHO " $SELF fix_upstream_rebase"
+ $ECHO " $SELF keygen"
+ $ECHO " $SELF merge"
+ $ECHO " $SELF push|commit [-s]"
+ $ECHO " $SELF release"
+ $ECHO " $SELF restore-patches"
+ $ECHO " $SELF run [sdl|glx|wgl|agl|dedicated] options..."
+ $ECHO " $SELF save-patches"
+ $ECHO " $SELF update-maps"
+ $ECHO " $SELF update|pull [-N] [-s | -h [-p] | -g [-p]] [-l de|nl|default]"
;;
esac