6 # I use this in EVERY shell script ;)
12 while ! [ -f ./all ]; do
13 if [ x"`pwd`" = x"/" ]; then
14 echo "Cannot find myself."
15 echo "Please run this script with the working directory inside a Xonotic checkout."
23 # If we are on WINDOWS:
28 # Windows hates users. So this script has to copy itself elsewhere first...
29 cp "$SELF" ../all.xonotic.sh
30 export WE_HATE_OUR_USERS=1
31 exec ../all.xonotic.sh "$@"
39 echo >&2 "$ESC[1m$*$ESC[m"
42 self=`git hash-object "$SELF"`
45 self_new=`git hash-object "$SELF"`
46 if [ x"$self" != x"$self_new" ]; then
47 msg "./all has changed."
48 if [ -z "$XONOTIC_FORBID_RERUN_ALL" ]; then
49 msg "Rerunning the requested operation to make sure."
50 export XONOTIC_FORBID_RERUN_ALL=1
53 msg "Please try $SELF update, and then retry your requested operation."
70 echo "the root directory"
80 if git ls-files -u | grep ' 1 '; then
82 echo "MERGE CONFLICT."
83 echo "change into the \"$1\" project directory, and then:"
84 echo "- edit the files mentioned above with your favorite editor,"
85 echo " and fix the conflicts (marked with <<<<<<< blocks)"
86 echo "- for binary files, you can select the files using"
87 echo " git checkout --ours or git checkout --theirs"
88 echo "- when done with a file, 'git add' the file"
89 echo "- when done, 'git commit'"
98 while [ x"$yesno" != x"y" -a x"$yesno" != x"n" ]; do
109 check_mergeconflict "$1"
114 data/xonotic-data.pk3dir | | master |
115 data/xonotic-music.pk3dir | | master |
116 data/xonotic-nexcompat.pk3dir | | master | no
117 darkplaces | | div0-stable | svn
118 netradiant | | master |
119 div0-gittools | | master | no
120 d0_blind_id | git://github.com/divVerent/d0_blind_id.git | master |
121 data/xonotic-maps.pk3dir | | master |
122 mediasource | | master | no
123 fteqcc | git://github.com/Blub/qclib.git | master |
125 # todo: in darkplaces, change repobranch to div0-stable
127 repos=`echo "$repos_urls" | grep . | cut -d '|' -f 1 | tr -d ' '`
129 base=`git config remote.origin.url`
132 base=${base%xonotic.git}
135 echo "The main repo is not xonotic.git, what have you done?"
139 pushbase=`git config remote.origin.pushurl || true`
142 pushbase=${pushbase%xonotic.git}
147 echo "The main repo is not xonotic.git, what have you done?"
154 repo_t=`echo "$repos_urls" | grep "^$1 " | cut -d '|' -f 2 | tr -d ' '`
155 if [ -n "$repo_t" ]; then
165 if [ x"$1" = x"." ]; then
166 echo "$base""xonotic.git"
168 echo "$base${1##*/}.git"
175 [ -n "$pushbase" ] || return 0
176 repo_t=`echo "$repos_urls" | grep "^$1 " | cut -d '|' -f 2 | tr -d ' '`
177 if [ -n "$repo_t" ]; then
182 echo "$pushbase$repo_t"
186 if [ x"$1" = x"." ]; then
187 echo "$pushbase""xonotic.git"
189 echo "$pushbase${1##*/}.git"
196 repo_t=`echo "$repos_urls" | grep "^$1 " | cut -d '|' -f 3 | tr -d ' '`
197 if [ -n "$repo_t" ]; then
206 echo "$repos_urls" | grep "^$1 " | cut -d '|' -f 4 | tr -d ' '
214 # if we have the dir, always keep it
216 msg "Repository $d enabled because it already exists"
220 # if .yes file exists, always keep it
221 if [ -f "$d.yes" ]; then
222 msg "Repository $d enabled by a .yes file"
226 # if we have .no file, skip
227 if [ -f "$d.no" ]; then
228 msg "Repository $d disabled by a .no file, delete $p.no to enable"
231 # if we have matching pk3, skip
232 if [ x"$p" != x"$d" ] && [ -f "$p" ]; then
233 msg "Repository $d disabled by matching .pk3 file, delete $p or create $d.yes to enable"
236 # if "no" flag is set, skip
239 msg "Repository $d disabled by default, create $d.yes to enable"
244 msg "Repository $d enabled by default"
251 if [ "$#" = 0 ]; then
257 fix_upstream_rebase()
259 if [ -z "$r_me" ] || [ -z "$r_other" ]; then
262 r_base=`git merge-base "$r_me" "$r_other"`
264 # no merge-base? upstream did filter-branch
265 if [ -n "$r_base" ]; then
266 # otherwise, check if the two histories are "similar"
267 r_l_me=`git log --pretty="format:%s" "$r_other".."$r_me" | grep -v "^Merge" | sort -u`
268 r_l_other=`git log --pretty="format:%s" "$r_me".."$r_other" | grep -v "^Merge" | sort -u`
270 # heuristics: upstream rebase/filter-branch if more than 50% of the commits of one of the sides are in the other too
271 r_lc_me=`echo "$r_l_me" | wc -l`
272 r_lc_other=`echo "$r_l_other" | wc -l`
273 r_lc_together=`{ echo "$r_l_me"; echo "$r_l_other"; } | sort -u | wc -l`
274 r_lc_same=$(($r_lc_me + $r_lc_other - $r_lc_together))
276 if [ $(( $r_lc_same * 2 )) -gt $(( $r_lc_me )) ] || [ $(( $r_lc_same * 2 )) -gt $(( $r_lc_other )) ]; then
277 if yesno "Probable upstream rebase detected, automatically fix?" 'git log --oneline --graph --date-order --left-right "$r_other"..."$r_me"'; then
278 git reset --hard "$r_me"
288 fix_upstream_rebase_mergeok()
290 r_me=`git rev-parse --revs-only HEAD^1 2>/dev/null || true`
291 r_other=`git rev-parse --revs-only HEAD^2 2>/dev/null || true`
295 fix_upstream_rebase_mergefail()
297 r_me=`git rev-parse --revs-only HEAD 2>/dev/null || true`
298 r_other=`git rev-parse --revs-only MERGE_HEAD 2>/dev/null || true`
304 verbose git config remote.origin.url "$1"
306 verbose git config remote.origin.pushurl "$2"
308 verbose git config --unset remote.origin.pushurl || true
310 verbose git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
311 verbose git config core.autocrlf input
312 if [ -z "`git config push.default`" ]; then
313 verbose git config push.default current # or is tracking better?
322 find "$@" -xtype f \( -executable -or -type l \) -print > "$ziplist"
323 7za a -tzip -mx=9 -x@"$ziplist" "$archive" "$@" || true
324 zip -9y -@<"$ziplist" "$archive" || true
336 enter "$d0/$d" verbose
337 verbose fix_upstream_rebase_mergefail && verbose fix_upstream_rebase_mergeok
343 pushurl=`repopushurl "$d"`
344 branch=`repobranch "$d"`
345 if [ -d "$d0/$d" ]; then
347 fix_git_config "$url" "$pushurl"
353 # enable the ssh URL for pushing
356 if [ -f ~/.ssh/id_rsa.pub ]; then
358 msg "A key already exists and no new one will be generated. If you"
359 msg "already have done the procedure for getting your key approved, you"
360 msg "can skip the following paragraph and already use the repository."
362 msg "To get access, your key has to be approved first. For that, visit"
363 msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
364 msg "the \"Support\" tracker in the \"Repository\" category where you"
365 msg "apply for access and paste the following output into the issue:"
367 msg "`cat ~/.ssh/id_rsa.pub`"
369 msg "Note that you will only have write access to branches that start"
370 msg "with your user name."
371 elif [ -f ~/.ssh/id_dsa.pub ]; then
373 msg "A key already exists and no new one will be generated. If you"
374 msg "already have done the procedure for getting your key approved, you"
375 msg "can skip the following paragraph and already use the repository."
377 msg "To get access, your key has to be approved first. For that, visit"
378 msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
379 msg "the \"Support\" tracker in the \"Repository\" category where you"
380 msg "apply for access and paste the following output into the issue:"
382 msg "`cat ~/.ssh/id_dsa.pub`"
384 msg "Note that you will only have write access to branches that start"
385 msg "with your user name."
388 msg "No key has been generated yet. One will be generated now."
389 msg "If other people are using your computer, it is recommended"
390 msg "to specify a passphrase. Otherwise you can simply hit ENTER"
391 msg "when asked for a passphrase."
393 ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
395 msg "To get access, your key has to be approved first. For that, visit"
396 msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
397 msg "the \"Support\" tracker in the \"Repository\" category where you"
398 msg "apply for access and paste the following output into the issue:"
400 msg "`cat ~/.ssh/id_rsa.pub`"
402 msg "Note that you will only have write access to branches that start"
403 msg "with your user name."
410 if [ x"$1" = x"-N" ]; then
412 elif [ x"$1" = x"-p" ]; then
414 if [ x"$base" != x"ssh://xonotic@git.xonotic.org/" ]; then
415 pushbase=ssh://xonotic@git.xonotic.org/
417 elif [ x"$1" = x"-s" ]; then
419 base=ssh://xonotic@git.xonotic.org/
421 elif [ x"$1" = x"-g" ]; then
423 base=git://git.xonotic.org/xonotic/
424 elif [ x"$1" = x"-h" ]; then
426 base=http://git.xonotic.org/xonotic/
434 pushurl=`repopushurl .`
435 fix_git_config "$url" "$pushurl"
437 if $allow_pull || $fix_config; then
442 pushurl=`repopushurl "$d"`
443 branch=`repobranch "$d"`
444 if [ -d "$d0/$d" ]; then
446 enter "$d0/$d" verbose
447 r=`git symbolic-ref HEAD`
449 if git config branch.$r.remote >/dev/null 2>&1; then
450 if ! verbose git pull; then
451 fix_upstream_rebase_mergefail || true
452 check_mergeconflict "$d"
453 echo "Pulling failed. Press ENTER to continue, or Ctrl-C to abort."
456 fix_upstream_rebase_mergeok || true
461 checkself "$cmd" "$@"
463 verbose git remote prune origin
467 verbose git clone "$url" "$d0/$d"
468 enter "$d0/$d" verbose
469 fix_git_config "$url" "$pushurl"
470 if [ "$branch" != "master" ]; then
471 verbose git checkout --track -b "$branch" origin/"$branch"
478 misc/tools/xonotic-map-compiler-autobuild download
482 if [ x"$1" = x"-f" ]; then
488 if [ -z "$branch" ]; then
491 branch=${remote#origin/}
502 enter "$d0/$d" verbose
504 if [ -n "$b" ] && git rev-parse "refs/heads/$b" >/dev/null 2>&1; then
506 verbose git checkout $checkoutflags "$b"
507 elif [ -n "$b" ] && git rev-parse "refs/remotes/$remote/$b" >/dev/null 2>&1; then
509 verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
512 if git rev-parse "refs/heads/$b" >/dev/null 2>&1; then
514 verbose git checkout $checkoutflags "$b"
515 elif git rev-parse "refs/remotes/$remote/$b" >/dev/null 2>&1; then
517 verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
519 echo "WTF? Not even branch $b doesn't exist in $d"
524 checkself "$cmd" "$@"
528 echo "The requested branch was not found in any repository."
536 if [ -z "$branch" ]; then
540 if [ -z "$branch" ]; then
543 r=`git symbolic-ref HEAD`
550 dv=`visible_repo_name "$d"`
551 enter "$d0/$d" verbose
552 if git rev-parse "refs/heads/$branch" >/dev/null 2>&1; then
553 echo "Already having this branch in $dv."
555 if yesno "Branch in $dv?"; then
556 if [ -n "$srcbranch" ]; then
559 b=origin/"`repobranch "$d"`"
560 verbose git fetch origin || true
562 # TODO do this without pushing
563 verbose git checkout -b "$branch" "$b"
564 verbose git config "branch.$branch.remote" "$remote"
565 verbose git config "branch.$branch.merge" "refs/heads/$branch"
575 cd "$d0/$d" # am in a pipe, shouldn't use enter
576 git branch -r -v -v | cut -c 3- | sed "s/^(no branch)/(no_branch)/" | sed "s,^,$d ,"
581 while read -r d BRANCH REV TEXT; do
582 if [ x"$BRANCH" = x"`repobranch "$d"`" ]; then
585 if [ x"$REV" = x"->" ]; then
588 BRANCH=${BRANCH#remotes/}
589 ID=`echo "$BRANCH" | tr -c "A-Za-z0-9." "_"`
590 branches_list="$branches_list $BRANCH" # TEH SORT MAKEZ IT UNIEQ
591 eval "r=\$branches_repos_$ID"
593 eval "branches_repos_$ID=\$r"
595 echo -n "$branches_list" | xargs -n 1 echo | sort -u | while IFS= read -r BRANCH; do
596 ID=`echo "$BRANCH" | tr -c "A-Za-z0-9." "_"`
597 eval "r=\$branches_repos_$ID"
598 printf "%-60s %s\n" "$BRANCH" "$r"
605 dv=`visible_repo_name "$d"`
606 enter "$d0/$d" verbose
607 r=`git symbolic-ref HEAD`
609 if git log HEAD..origin/"`repobranch "$d"`" | grep .; then
610 # we have uncommitted changes
611 if yesno "Could merge from \"`repobranch "$d"`\" into \"$r\" in $dv. Do it?"; then
612 if ! verbose git merge origin/"`repobranch "$d"`"; then
613 check_mergeconflict "$d"
614 exit 1 # this should ALWAYS be fatal
624 dv=`visible_repo_name "$d"`
625 enter "$d0/$d" verbose
626 r=`git symbolic-ref HEAD`
628 diffdata=`git diff --color HEAD`
629 if [ -n "$diffdata" ]; then
630 # we have uncommitted changes
631 if yesno "Uncommitted changes in \"$r\" in $dv. Commit?" 'echo "$diffdata" | less -r'; then
632 verbose git commit -a
635 rem=`git config "branch.$r.remote" || echo origin`
636 bra=`git config "branch.$r.merge" || echo "$r"`
637 upstream="$rem/${bra#refs/heads/}"
638 if ! git rev-parse "$upstream" >/dev/null 2>&1; then
639 upstream="origin/`repobranch "$d"`"
641 logdata=`git log --color "$upstream".."$r"`
642 if [ -n "$logdata" ]; then
643 if yesno "Push \"$r\" in $dv?" 'echo "$logdata" | less -r'; then
644 verbose git push "$rem" HEAD
647 if [ x"$submit" = x"-s" ]; then
650 verbose git push "$rem" HEAD:"${bra%%/*}/finished/${bra#*/}"
664 if [ -z "$CC" ]; then
665 export CC="gcc -DSUPPORTIPV6"
681 export CC="$CC -g -mtune=native -march=native"
689 if [ -n "$WE_HATE_OUR_USERS" ]; then
690 TARGETS="sv-$debug cl-$debug"
691 elif [ x"`uname`" = x"Darwin" ]; then
694 TARGETS="sv-$debug cl-$debug sdl-$debug"
697 # AGL cannot be compiled on systems with a kernel > 10.x (Snow Leopard)
698 TARGETS="sv-$debug sdl-$debug"
701 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"
703 TARGETS="sv-$debug cl-$debug sdl-$debug"
705 if [ $# -gt 0 ] && [ x"$1" = x"" ]; then
706 # if we give the command make the arg "", it will surely fail (invalid filename),
707 # so better handle it as an empty client option
710 elif [ -n "$1" ]; then
712 TARGETS_SAVE=$TARGETS
717 TARGETS="$TARGETS sdl-debug"
720 TARGETS="$TARGETS cl-debug"
723 TARGETS="$TARGETS sv-debug"
726 BAD_TARGETS="$BAD_TARGETS $X"
730 if [ -n "$TARGETS" ]; then # at least a valid client
732 else # no valid client, let's assume this option is not meant to be a client then
733 TARGETS=$TARGETS_SAVE
737 if [ -z "$MAKEFLAGS" ]; then
738 if [ -f /proc/cpuinfo ]; then
739 ncpus=$((`grep -c '^processor :' /proc/cpuinfo`+0))
740 if [ $ncpus -gt 1 ]; then
744 if [ -n "$WE_HATE_OUR_USERS" ]; then
745 MAKEFLAGS="$MAKEFLAGS DP_MAKE_TARGET=mingw LIB_JPEG= CFLAGS_LIBJPEG="
749 enter "$d0/d0_blind_id" verbose
750 if ! $compiled0; then
751 # compilation of crypto library failed
752 # use binaries then, if we can...
754 if [ -n "$WE_HATE_OUR_USERS" ]; then
755 verbose cp "$d0/misc/buildfiles/win32/libd0_blind_id"-* .libs/
756 verbose cp "$d0/misc/buildfiles/win32/libgmp"-* .libs/
762 verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_blind_id".* .libs/
763 verbose cp "$d0/misc/builddeps/dp.linux64/lib/libgmp".* .libs/
764 MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/"
767 verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_blind_id".* .libs/
768 verbose cp "$d0/misc/builddeps/dp.linux32/lib/libgmp".* .libs/
769 MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/"
777 verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_blind_id".* .libs/
787 if [ -f Makefile ]; then
788 verbose make $MAKEFLAGS distclean
791 if ! [ -f Makefile ]; then
792 verbose sh autogen.sh
795 verbose make $MAKEFLAGS
798 enter "$d0/fteqcc" verbose
800 verbose make $MAKEFLAGS clean
802 verbose make $MAKEFLAGS
804 enter "$d0/data/xonotic-data.pk3dir" verbose
806 verbose make FTEQCC="../../../../fteqcc/fteqcc.bin" "$@" $MAKEFLAGS clean
808 verbose make FTEQCC="../../../../fteqcc/fteqcc.bin" "$@" $MAKEFLAGS
809 # 4 levels up: data, xonotic-data, qcsrc, server
811 enter "$d0/darkplaces" verbose
812 if [ x"$BAD_TARGETS" = x" " ]; then
813 echo "Warning: invalid empty client, default clients will be used."
816 verbose make $MAKEFLAGS clean
818 for T in $TARGETS; do
819 verbose make $MAKEFLAGS STRIP=: "$@" "$T"
821 for T in $BAD_TARGETS; do
822 echo "Warning: discarded invalid client $T."
825 verbose "$SELF" update-maps
828 if [ -n "$WE_HATE_OUR_USERS" ]; then
830 export PATH="$d0/misc/buildfiles/win32:$d0/d0_blind_id/.libs:$PATH"
831 elif [ x"`uname`" = x"Darwin" ]; then
832 export DYLD_LIBRARY_PATH="$d0/misc/buildfiles/osx/Xonotic-SDL.app/Contents/MacOS:$d0/d0_blind_id/.libs"
833 export DYLD_FRAMEWORK_PATH="$d0/misc/buildfiles/osx/Xonotic-SDL.app/Contents/Frameworks"
836 export LD_LIBRARY_PATH="$d0/d0_blind_id/.libs"
840 sdl|glx|agl|dedicated)
849 if ! [ -x "darkplaces/darkplaces$client" ]; then
850 if [ -x "darkplaces/darkplaces$client.exe" ]; then
853 echo "Client darkplaces/darkplaces$client not found, aborting"
857 set -- "darkplaces/darkplaces$client" -xonotic -mygames "$@"
859 # if pulseaudio is running: USE IT
860 if [ -z "$SDL_AUDIODRIVER" ] && ! [ -n "$WE_HATE_OUR_USERS" ] && ! [ x"`uname`" = x"Darwin" ]; then
861 if ps -C pulseaudio >/dev/null; then
862 if ldd /usr/lib/libSDL.so 2>/dev/null | grep pulse >/dev/null; then
863 export SDL_AUDIODRIVER=pulse
870 if [ -n "$USE_GDB" ]; then
871 set -- gdb --args "$@"
872 elif which gdb >/dev/null 2>&1; then
873 set -- gdb --batch -x savecore.gdb --args "$@"
874 elif which catchsegv >/dev/null 2>&1; then
875 set -- catchsegv "$@"
879 if [ -f xonotic.core ]; then
880 if yesno "The program has CRASHED. Do you want to examine the core dump?"; then
881 gdb "$binary" xonotic.core
882 #elif yesno "You did not want to examine the core dump. Do you want to provide it - including your DarkPlaces checkout - to the Xonotic developers?"; then
883 # tar cvzf xonotic.core.tar.gz xonotic.core darkplaces/*.c darkplaces/*.h
885 # rm -f xonotic.core.tar.gz
887 echo "The core dump can be examined later by"
888 echo " gdb $binary xonotic.core"
894 if [ x"$1" = x"-k" ]; then
899 if verbose cd "$d0/$d"; then
911 patchdir=`mktemp -d -t save-patches.XXXXXX`
913 enter "$d0/$d" verbose
914 git branch -v -v | cut -c 3- | {
916 while read -r BRANCH REV UPSTREAM TEXT; do
919 UPSTREAM=${UPSTREAM#\[}
920 UPSTREAM=${UPSTREAM%\]}
921 UPSTREAM=${UPSTREAM%:*}
925 UPSTREAM=origin/"`repobranch "$d"`"
929 if [ x"$REV" = x"->" ]; then
932 if git format-patch -o "$patchdir/$i" "$UPSTREAM".."$BRANCH"; then
933 echo "$d" > "$patchdir/$i/info.txt"
934 echo "$BRANCH" >> "$patchdir/$i/info.txt"
935 echo "$UPSTREAM" >> "$patchdir/$i/info.txt"
936 echo "$TRACK" >> "$patchdir/$i/info.txt"
939 rm -rf "$patchdir/$i"
944 ( cd "$patchdir" && tar cvzf - . ) > "$outfile"
949 patchdir=`mktemp -d -t restore-patches.XXXXXX`
950 ( cd "$patchdir" && tar xvzf - ) < "$infile"
952 for P in "$patchdir"/*/info.txt; do
959 verbose git checkout HEAD^0
960 verbose git branch -D "$BRANCH"
961 if [ x"$TRACK" = x"true" ]; then
962 verbose git checkout --track -b "$BRANCH" "$UPSTREAM"
964 verbose git branch -b "$BRANCH" "$UPSTREAM"
976 report=$report"$*$LF"
981 report=$report" $*$LF"
986 o=`"$@" | sed 's/^/ /' || true`
990 enter "$d0/$d" verbose
991 base="`repobranch "$d"`"
993 for ref in `git for-each-ref --format='%(refname)' refs/remotes/origin/`; do
994 case "${ref#refs/remotes/origin/}" in
1007 if [ -n "$branch" ]; then
1008 if [ x"$branch" != x"${ref#refs/remotes/origin/}" ]; then
1017 l0=`git rev-list "$base".."$ref" | wc -l`
1018 l1=`git rev-list master.."$ref" | wc -l`
1019 if [ $l0 -gt $l1 ]; then
1026 reportecho " Branch $ref:"
1027 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1028 logdata=`git log --color "$realbase".."$ref"`
1029 if [ -z "$logdata" ]; then
1030 reportecho4 "--> not merging, no changes vs master"
1031 if yesno "Branch \"$ref\" probably should get deleted. Do it?" ''; then
1032 git push origin :"${ref#refs/remotes/origin/}"
1033 reportecho4 "--> branch deleted"
1036 diffdata=`git diff --color --find-copies-harder --ignore-space-change "$realbase"..."$ref"`
1037 if [ -z "$diffdata" ]; then
1038 reportecho4 "--> not merging, no changes vs master, branch contains redundant history"
1039 if yesno "Branch \"$ref\" probably should get deleted. Do it?" '{ echo "$logdata"; } | less -r'; then
1040 git push origin :"${ref#refs/remotes/origin/}"
1041 reportecho4 "--> branch deleted"
1043 elif [ -z "$branch" ] && [ -n "$note" ]; then
1044 reportdo4 echo "$note"
1045 reportecho4 "--> not merging, already had this one rejected before"
1046 elif yesno "Branch \"$ref\" may want to get merged. Do it?" '{ echo "$logdata"; echo "$diffdata"; } | less -r'; then
1047 git checkout "$realbase"
1048 org=`git rev-parse HEAD`
1049 if ! git merge --no-ff "$ref" 2>&1 | tee "$t" && ! { git ls-files -u | grep ' 1 ' >/dev/null; }; then
1050 git reset --hard "$org"
1051 GIT_NOTES_REF=refs/notes/admin-merge git notes edit -m "Merge failed:$LF`cat "$t"`" "$ref"
1053 reportecho4 "--> merge failed"
1054 elif ! "$SELF" compile 2>&1 | tee "$t"; then
1055 git reset --hard "$org"
1056 GIT_NOTES_REF=refs/notes/admin-merge git notes edit -m "Compile failed:$LF`cat "$t"`" "$ref"
1058 reportecho4 "--> compile failed"
1059 elif ! yesno "Still merge \"$ref\" into `git symbolic-ref HEAD` of $d? Maybe you want to test first."; then
1060 git reset --hard "$org"
1061 GIT_NOTES_REF=refs/notes/admin-merge git notes edit "$ref"
1062 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1063 if [ x"$note" = x"del" ]; then
1064 git push origin :"${ref#refs/remotes/origin/}"
1065 reportecho4 "--> test failed, branch deleted"
1066 elif [ -n "$note" ]; then
1067 reportdo4 echo "$note"
1068 reportecho4 "--> test failed"
1070 reportecho4 "--> test failed, postponed"
1074 case ",`repoflags "$d"`," in
1076 # we do quite a mess here... luckily we know $org
1077 git fetch # svn needs to be current
1078 git rebase -i --onto origin/master "$org"
1079 git svn dcommit --add-author-from
1080 git reset --hard "$org"
1083 git push origin HEAD
1086 reportecho4 "--> MERGED"
1087 if yesno "Delete original branch \"$ref\"?"; then
1088 git push origin :"${ref#refs/remotes/origin/}"
1089 reportecho4 "--> branch deleted"
1093 GIT_NOTES_REF=refs/notes/admin-merge git notes edit "$ref"
1094 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1095 if [ x"$note" = x"del" ]; then
1096 git push origin :"${ref#refs/remotes/origin/}"
1097 reportecho4 "--> branch deleted"
1098 elif [ -n "$note" ]; then
1099 reportdo4 echo "$note"
1100 reportecho4 "--> rejected"
1102 reportecho4 "--> postponed"
1111 echo "$report" | ssh nexuiz@rm.endoftheinternet.org cat '>>' public_html/xonotic-merge-notes.txt
1123 # ./all clean [-m] [-f | -fu | -fU] [-r] [-D]
1124 # ./all clean --reclone
1127 if [ x"$1" = x"--reclone" ]; then
1134 elif [ x"$1" = x"-f" ]; then
1136 elif [ x"$1" = x"-u" ]; then
1138 elif [ x"$1" = x"-U" ]; then
1141 elif [ x"$1" = x"-fu" ]; then
1144 elif [ x"$1" = x"-fU" ]; then
1148 elif [ x"$1" = x"-m" ]; then
1150 elif [ x"$1" = x"-r" ]; then
1152 elif [ x"$1" = x"-D" ]; then
1165 if $gotoupstream; then
1167 msg "Must also use -f (delete local changes) when using -u"
1170 if $gotomaster; then
1171 if $fetchupstream; then
1172 verbose git fetch origin
1173 verbose git remote prune origin
1175 verbose git checkout -f "`repobranch "$d"`"
1176 verbose git reset --hard origin/"`repobranch "$d"`"
1178 r=`git symbolic-ref HEAD`
1180 rem=`git config "branch.$r.remote" || echo origin`
1181 bra=`git config "branch.$r.merge" || echo "$r"`
1182 upstream="$rem/${bra#refs/heads/}"
1183 if $fetchupstream; then
1184 verbose git fetch "$rem"
1185 verbose git remote prune "$rem"
1187 if ! git rev-parse "$upstream" >/dev/null 2>&1; then
1188 upstream="origin/`repobranch "$d"`"
1190 verbose git reset --hard "$upstream"
1192 elif $gotomaster; then
1194 verbose git checkout -f "`repobranch "$d"`"
1195 verbose git reset --hard
1197 verbose git checkout "`repobranch "$d"`"
1200 verbose git reset --hard
1202 if $rmuntracked; then
1205 verbose git clean -df
1208 verbose git clean -xdf
1212 if $killbranches; then
1213 git for-each-ref --format='%(refname)' refs/heads/ | while IFS= read -r B; do
1214 if [ x"$B" != x"`git symbolic-ref HEAD`" ]; then
1215 verbose git branch -D "${B#refs/heads/}"
1218 git rev-parse refs/heads/master >/dev/null 2>&1 || verbose git branch -t master origin/master || true
1219 git rev-parse "refs/heads/`repobranch "$d"`" >/dev/null 2>&1 || verbose git branch -t "`repobranch "$d"`" origin/"`repobranch "$d"`" || true
1224 # release building goes here
1226 #"$SELF" each git clean -fxd
1227 case "$RELEASETYPE" in
1229 msg "Building a BETA"
1232 msg "Building a RELEASE"
1235 echo >&2 -n "$ESC[2J$ESC[H"
1242 msg " +---------------------------------------------------------.---+"
1244 msg " +---------------------------------------------------------^---+"
1246 msg " | / \ This is the official release build system. |"
1247 msg " | | | If you are not a member of the Xonotic Core Team, |"
1248 msg " | | STOP | you are not supposed to use this script and should |"
1249 msg " | | | instead use ./all compile to compile the engine |"
1250 msg " | \____/ and game code. |"
1252 msg " | [ I understand ] |"
1253 msg " +-------------------------------------------------------------+"
1255 # A LOT of build infrastructure is required:
1258 # - .ssh/config must be configured so the following
1259 # host names are reachable and have a compile
1260 # infrastructure set up:
1261 # - xonotic-build-linux32 (with gcc on x86)
1262 # - xonotic-build-linux64 (with gcc on x86_64)
1263 # - xonotic-build-win32 (with i586-mingw32msvc-g++)
1264 # - xonotic-build-win64 (with amd64-mingw32msvc-g++
1265 # and x86_64-w64-mingw32-g++)
1266 # - xonotic-build-osx (with Xcode and SDL.framework)
1267 # - AMD Compressonator installed in WINE
1268 # - ResEdit installed in WINE
1269 # - a lot of other requirements you will figure out
1270 # while reading the error messages
1271 # - environment variable RELEASETYPE set
1272 # - optionally, environment variable RELEASEDATE set
1277 verbose rm -rf Xonotic Xonotic*.zip
1278 verbose mkdir -p Xonotic
1279 if [ -n "$RELEASEDATE" ]; then
1280 verbose echo "$RELEASEDATE" > Xonotic/stamp.txt
1282 verbose date +%Y%m%d > Xonotic/stamp.txt
1284 verbose git archive --format=tar HEAD -- Docs misc server xonotic-linux-glx.sh xonotic-linux-sdl.sh misc/buildfiles key_0.d0pk | {
1286 verbose mkdir data fteqcc source source/darkplaces source/fteqcc
1288 verbose rm -rf misc/builddeps
1289 verbose mv misc/buildfiles/win32/* . || true
1290 verbose mv misc/buildfiles/win64 bin64 || true
1291 verbose mv misc/buildfiles/osx/* . || true
1292 verbose rm -rf misc/buildfiles
1293 verbose rm -rf misc/pki
1296 verbose cd darkplaces
1297 verbose git archive --format=tar HEAD
1299 verbose cd Xonotic/source/darkplaces
1304 verbose git archive --format=tar HEAD
1306 verbose cd Xonotic/source/fteqcc
1310 verbose cd data/xonotic-data.pk3dir
1311 verbose git archive --format=tar HEAD -- qcsrc Makefile
1313 verbose cd Xonotic/source
1316 rm -f Xonotic/key_15.d0pk
1318 release-compile-run)
1327 if [ -n "$targetfiles" ]; then
1328 case " $HOSTS_THAT_ARE_DISABLED " in
1333 case " $HOSTS_THAT_ARE_MYSELF " in
1335 verbose rsync --delete -zLvaSHP "$srcdir"/ "$buildpath/"
1336 verbose rsync --delete -zLvaSHP "$depsdir"/ "$buildpath.deps/"
1337 verbose ln -snf "$buildpath.deps" "$buildpath/.deps"
1338 verbose eval make -C "$buildpath" clean $maketargets $makeflags
1339 for f in $targetfiles; do
1340 verbose mv "$buildpath/${f%:*}" "${f##*:}" || true
1344 verbose rsync --delete -zLvaSHP "$srcdir"/ "$host:$buildpath/"
1345 verbose rsync --delete -zLvaSHP "$depsdir"/ "$host:$buildpath.deps/"
1346 verbose ssh "$host" "ln -snf $buildpath.deps $buildpath/.deps && cd $buildpath && nice -`nice` make clean $maketargets $makeflags"
1347 for f in $targetfiles; do
1348 verbose rsync -zvaSHP "$host:$buildpath/${f%:*}" "${f##*:}" || true
1352 # now rebrand the binaries...
1353 for f in $targetfiles; do
1354 #verbose "$d0/misc/tools/rebrand-darkplaces-engine.sh" "${XONOTIC_BRAND:-$d0/misc/tools/xonotic.brand}" "${f##*:}" || true
1357 verbose "$d0/misc/tools/change-icon-of-exe.sh" "$d0/misc/logos/icons_ico/xonotic.ico" "$f"
1359 d=`mktemp -d -t rebrand.XXXXXX`
1361 echo "-mygames" > darkplaces.opt
1362 zip -9r darkplaces.zip darkplaces.opt
1375 fteqcc_maketargets=$3
1377 darkplaces_maketargets=$5
1379 host=xonotic-build-$suffix
1380 verbose "$SELF" release-compile-run "$host" /tmp/fteqcc.build."$suffix" "$fteqcc_maketargets" "$makeflags" "Xonotic/source/fteqcc" "$d0/misc/builddeps/dp.$suffix" "$fteqcc_files"
1381 verbose "$SELF" release-compile-run "$host" /tmp/Darkplaces.build."$suffix" "$darkplaces_maketargets" "$makeflags" "Xonotic/source/darkplaces" "$d0/misc/builddeps/dp.$suffix" "$darkplaces_files"
1383 release-engine-win32)
1384 verbose "$SELF" release-compile win32 \
1385 'STRIP=: DP_MAKE_TARGET=mingw CC="i586-mingw32msvc-gcc -march=i686 -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' \
1386 win 'fteqcc.exe:Xonotic/fteqcc/fteqcc.exe' \
1388 verbose "$SELF" release-compile win32 \
1389 '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' \
1391 release 'darkplaces.exe:Xonotic/xonotic.exe darkplaces-sdl.exe:Xonotic/xonotic-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-dedicated.exe'
1393 release-engine-win64)
1394 verbose "$SELF" release-compile win64 \
1395 'STRIP=: DP_MAKE_TARGET=mingw CC="amd64-mingw32msvc-gcc -g -Wl,--dynamicbase -Wl,--nxcompat -I.deps/include -L.deps/lib -DSUPPORTIPV6" WINDRES="amd64-mingw32msvc-windres" SDL_CONFIG=".deps/bin/sdl-config" LIB_JPEG= CFLAGS_LIBJPEG= WIN64RELEASE=1 D3D=0' \
1396 win 'fteqcc.exe:Xonotic/fteqcc/fteqcc-x64.exe' \
1397 'sv-release sdl-release' 'darkplaces-sdl.exe:Xonotic/xonotic-x64-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-x64-dedicated.exe'
1398 verbose "$SELF" release-compile win64 \
1399 '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' \
1401 cl-release 'darkplaces.exe:Xonotic/xonotic-x64.exe'
1404 # gcc on OSX is buggy, needs -fno-reorder-blocks for a release build to succeed
1405 verbose "$SELF" release-compile osx \
1406 'STRIP=: CC="gcc -g -arch i386 -arch ppc -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.4 -I.deps/include -L.deps/lib -fno-reorder-blocks -DSUPPORTIPV6"' \
1407 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.osx' \
1408 'sv-release sdl-release' 'darkplaces-sdl:Xonotic/Xonotic-SDL.app/Contents/MacOS/xonotic-osx-sdl-bin darkplaces-dedicated:Xonotic/xonotic-osx-dedicated'
1409 verbose "$SELF" release-compile osx \
1410 'STRIP=: CC="gcc -g -arch i386 -arch ppc -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.4 -I.deps/include -L.deps/lib -fno-reorder-blocks -DSUPPORTIPV6"' \
1412 'cl-release' 'darkplaces-agl:Xonotic/Xonotic.app/Contents/MacOS/xonotic-osx-agl-bin'
1414 release-engine-linux32)
1415 verbose "$SELF" release-compile linux32 \
1416 'STRIP=: CC="gcc -m32 -march=i686 -g -I.deps/include -L.deps/lib -DSUPPORTIPV6" DP_MODPLUG_STATIC_LIBDIR=.deps/lib LIB_JPEG=.deps/lib/libjpeg.a DP_CRYPTO_STATIC_LIBDIR=.deps/lib' \
1417 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.linux32' \
1418 release 'darkplaces-glx:Xonotic/xonotic-linux32-glx darkplaces-sdl:Xonotic/xonotic-linux32-sdl darkplaces-dedicated:Xonotic/xonotic-linux32-dedicated'
1420 release-engine-linux64)
1421 verbose "$SELF" release-compile linux64 \
1422 'STRIP=: CC="gcc -m64 -g -I.deps/include -L.deps/lib -DSUPPORTIPV6" DP_MODPLUG_STATIC_LIBDIR=.deps/lib LIB_JPEG=.deps/lib/libjpeg.a DP_CRYPTO_STATIC_LIBDIR=.deps/lib' \
1423 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.linux64' \
1424 release 'darkplaces-glx:Xonotic/xonotic-linux64-glx darkplaces-sdl:Xonotic/xonotic-linux64-sdl darkplaces-dedicated:Xonotic/xonotic-linux64-dedicated'
1427 verbose "$SELF" release-engine-linux32 &
1428 verbose "$SELF" release-engine-linux64 &
1429 verbose "$SELF" release-engine-win32 &
1430 verbose "$SELF" release-engine-win64 &
1431 verbose "$SELF" release-engine-osx &
1440 verbose "$SELF" update-maps
1443 case "$RELEASETYPE" in
1445 verbose make -C Xonotic/source FTEQCC="../fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 clean all
1448 verbose make -C Xonotic/source FTEQCC="../fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 FTEQCCFLAGS_WATERMARK= clean all
1451 verbose rm -f Xonotic/source/*/fteqcc.log
1453 release-buildpk3-transform-raw)
1456 release-buildpk3-transform-normal)
1459 # texture: convert to jpeg and dds
1460 verbose export do_jpeg=true
1461 verbose export jpeg_qual_rgb=95
1462 verbose export jpeg_qual_a=99
1463 verbose export do_dds=true
1464 verbose export dds_flags=
1465 verbose export do_ogg=false
1466 verbose export del_src=true
1467 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1469 release-buildpk3-transform-low)
1472 # texture: convert to jpeg and dds
1473 # music: reduce bitrate
1474 verbose export do_jpeg=true
1475 verbose export jpeg_qual_rgb=80
1476 verbose export jpeg_qual_a=95
1477 verbose export do_dds=false
1478 verbose export do_ogg=true
1479 verbose export ogg_qual=1
1480 verbose export del_src=true
1481 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1483 release-buildpk3-transform-lowdds)
1486 # texture: convert to jpeg and dds
1487 # music: reduce bitrate
1488 verbose export do_jpeg=false
1489 verbose export do_jpeg_if_not_dds=true
1490 verbose export jpeg_qual_rgb=80
1491 verbose export jpeg_qual_a=95
1492 verbose export do_dds=true
1493 verbose export dds_flags=
1494 verbose export do_ogg=true
1495 verbose export ogg_qual=1
1496 verbose export del_src=true
1497 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1510 verbose rm -rf Xonotic/temp
1511 verbose mkdir -p Xonotic/temp
1514 verbose git archive --format=tar HEAD
1516 verbose cd Xonotic/temp
1519 verbose cd Xonotic/temp
1520 if [ x"$src" = x"data/xonotic-data.pk3dir" ]; then
1521 verbose cp ../source/progs.dat .
1522 verbose cp ../source/csprogs.dat .
1523 verbose cp ../source/menu.dat .
1524 verbose rm -rf qcsrc
1525 gv=`grep "^gameversion " "defaultXonotic.cfg" | awk '{ print $2 }'`
1526 major=$(($gv / 10000))
1527 minor=$(($gv / 100 - $major * 100))
1528 patch=$(($gv - $major * 10000 - $minor * 100))
1529 versionstr="$major.$minor.$patch"
1530 case "$RELEASETYPE" in
1532 versionstr="$versionstr""beta"
1536 s/^set g_xonoticversion [^ ]* /set g_xonoticversion $versionstr /;
1537 s/^gameversion_min [0-9]*/gameversion_min $(( ($gv / 100) * 100 - 100 ))/;
1538 s/^gameversion_max [0-9]*/gameversion_max $(( ($gv / 100) * 100 + 199 ))/;
1539 " defaultXonotic.cfg
1541 verbose cd gfx/menu/luminos
1542 verbose cp "$d0"/mediasource/gfx/menu/luminos_versionbuilder/background_l2.svg .
1543 verbose "$d0"/mediasource/gfx/menu/luminos_versionbuilder/versionbuilder "$versionstr"
1544 verbose rm background_l2.svg
1547 if [ x"$src" = x"data/xonotic-maps.pk3dir" ]; then
1548 for X in ../../data/*-????????????????????????????????????????-????????????????????????????????????????.pk3; do
1549 if [ -f "$X" ]; then
1551 verbose rm -f maps/*.log maps/*.irc maps/*.lin
1555 verbose export git_src_repo="$d0/$src" # skip hash-object
1556 verbose "$SELF" release-buildpk3-transform-$transform "Xonotic/temp"
1557 verbose mkzip "../../$dst" *
1559 verbose rm -rf Xonotic/temp
1562 stamp=`cat Xonotic/stamp.txt`
1568 dst="data/xonotic-$stamp-${dst#data/xonotic-}"
1574 while [ "$#" -gt 1 ]; do
1575 verbose "$SELF" release-buildpk3 "$src" "Xonotic/$dst$2.pk3" "$1"
1581 verbose "$SELF" release-buildpk3s data/font-nimbussansl.pk3dir raw ''
1582 verbose "$SELF" release-buildpk3s data/xonotic-data.pk3dir normal '' raw '-raw' low '-low' lowdds '-lowdds'
1583 verbose "$SELF" release-buildpk3s data/xonotic-maps.pk3dir normal '' raw '-raw' low '-low' lowdds '-lowdds'
1584 verbose "$SELF" release-buildpk3s data/xonotic-music.pk3dir raw '' low '-low'
1585 verbose "$SELF" release-buildpk3s data/xonotic-nexcompat.pk3dir low ''
1587 release-pack-needsx11)
1590 verbose startx "$SELF" release-pack -- /usr/bin/Xvfb :7
1593 verbose "$SELF" release-pack
1598 stamp=`cat Xonotic/stamp.txt`
1599 # exe and dll files do not need +x, so this makes them eligible for 7zip compression too
1600 chmod a-x Xonotic/*.exe Xonotic/*.dll || true
1601 # let's pass crypto import laws of some nasty countries
1602 crypto_libs=`find Xonotic -name \*d0_rijndael\*`
1603 if [ -n "$crypto_libs" ]; then
1604 verbose mkzip Xonotic-$stamp-crypto.zip \
1608 # build the archives
1609 verbose mkzip Xonotic-$stamp-engine.zip \
1611 Xonotic/bin64/*.dll \
1614 Xonotic/xonotic.exe \
1615 Xonotic/source/darkplaces/
1616 verbose cp Xonotic-$stamp-engine.zip Xonotic-$stamp-common.zip
1617 verbose mkzip Xonotic-$stamp-common.zip \
1618 Xonotic/source/fteqcc/ \
1619 Xonotic/source/qcsrc/ \
1624 Xonotic/key_0.d0pk \
1625 Xonotic/data/font-nimbussansl-$stamp.pk3
1626 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp.zip
1627 verbose mkzip0 Xonotic-$stamp.zip \
1628 Xonotic/data/xonotic-$stamp-data.pk3 \
1629 Xonotic/data/xonotic-$stamp-maps.pk3 \
1630 Xonotic/data/xonotic-$stamp-music.pk3 \
1631 Xonotic/data/xonotic-$stamp-nexcompat.pk3
1632 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp-low.zip
1633 verbose mkzip0 Xonotic-$stamp-low.zip \
1634 Xonotic/data/xonotic-$stamp-data-low.pk3 \
1635 Xonotic/data/xonotic-$stamp-maps-low.pk3 \
1636 Xonotic/data/xonotic-$stamp-music-low.pk3
1637 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp-lowdds.zip
1638 verbose mkzip0 Xonotic-$stamp-lowdds.zip \
1639 Xonotic/data/xonotic-$stamp-data-lowdds.pk3 \
1640 Xonotic/data/xonotic-$stamp-maps-lowdds.pk3 \
1641 Xonotic/data/xonotic-$stamp-music-low.pk3
1642 verbose mv Xonotic-$stamp-common.zip Xonotic-$stamp-high.zip
1643 verbose mkzip0 Xonotic-$stamp-high.zip \
1644 Xonotic/data/xonotic-$stamp-data-raw.pk3 \
1645 Xonotic/data/xonotic-$stamp-maps-raw.pk3 \
1646 Xonotic/data/xonotic-$stamp-music.pk3 \
1647 Xonotic/data/xonotic-$stamp-nexcompat.pk3
1650 verbose "$SELF" release-prepare
1651 verbose "$SELF" release-maps
1652 verbose "$SELF" release-engine
1653 verbose "$SELF" release-qc
1654 verbose "$SELF" release-pack-needsx11
1655 verbose "$SELF" release-zip
1660 echo " $SELF admin-merge [<branch>]"
1661 echo " $SELF branch <branch>"
1662 echo " $SELF branch <remote> <branch> [<srcbranch>]"
1663 echo " $SELF branches"
1664 echo " $SELF checkout|switch <branch>"
1665 echo " $SELF checkout|switch <remote>/<branch>"
1666 echo " $SELF clean [-m] [-f | -fu | -fU] [-r] [-D]"
1667 echo " $SELF clean --reclone"
1668 echo " $SELF compile [-c] [-r] [-0]"
1669 echo " $SELF each|foreach [-k] command..."
1670 echo " $SELF fix_upstream_rebase"
1671 echo " $SELF keygen"
1673 echo " $SELF push|commit [-s]"
1674 echo " $SELF release"
1675 echo " $SELF restore-patches"
1676 echo " $SELF run [sdl|glx|wgl|agl|dedicated] options..."
1677 echo " $SELF save-patches"
1678 echo " $SELF update-maps"
1679 echo " $SELF update|pull [-N] [-s | -h [-p] | -g [-p]]"