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 ticket:"
367 msg "`cat ~/.ssh/id_rsa.pub`"
368 elif [ -f ~/.ssh/id_dsa.pub ]; then
370 msg "A key already exists and no new one will be generated. If you"
371 msg "already have done the procedure for getting your key approved, you"
372 msg "can skip the following paragraph and already use the repository."
374 msg "To get access, your key has to be approved first. For that, visit"
375 msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
376 msg "the \"Support\" tracker in the \"Repository\" category where you"
377 msg "apply for access and paste the following output into the ticket:"
379 msg "`cat ~/.ssh/id_dsa.pub`"
382 msg "No key has been generated yet. One will be generated now."
383 msg "If other people are using your computer, it is recommended"
384 msg "to specify a passphrase."
386 ssh-keygen -t rsa -b 4096
388 msg "To get access, your key has to be approved first. For that, visit"
389 msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
390 msg "the \"Support\" tracker in the \"Repository\" category where you"
391 msg "apply for access and paste the following output into the ticket:"
393 msg "`cat ~/.ssh/id_rsa.pub`"
400 if [ x"$1" = x"-N" ]; then
402 elif [ x"$1" = x"-p" ]; then
404 if [ x"$base" != x"ssh://xonotic@git.xonotic.org/" ]; then
405 pushbase=ssh://xonotic@git.xonotic.org/
407 elif [ x"$1" = x"-s" ]; then
409 base=ssh://xonotic@git.xonotic.org/
411 elif [ x"$1" = x"-g" ]; then
413 base=git://git.xonotic.org/xonotic/
414 elif [ x"$1" = x"-h" ]; then
416 base=http://git.xonotic.org/xonotic/
424 pushurl=`repopushurl .`
425 fix_git_config "$url" "$pushurl"
427 if $allow_pull || $fix_config; then
432 pushurl=`repopushurl "$d"`
433 branch=`repobranch "$d"`
434 if [ -d "$d0/$d" ]; then
436 enter "$d0/$d" verbose
437 r=`git symbolic-ref HEAD`
439 if git config branch.$r.remote >/dev/null 2>&1; then
440 if ! verbose git pull; then
441 fix_upstream_rebase_mergefail || true
442 check_mergeconflict "$d"
443 echo "Pulling failed. Press ENTER to continue, or Ctrl-C to abort."
446 fix_upstream_rebase_mergeok || true
451 checkself "$cmd" "$@"
453 verbose git remote prune origin
457 verbose git clone "$url" "$d0/$d"
458 enter "$d0/$d" verbose
459 fix_git_config "$url" "$pushurl"
460 if [ "$branch" != "master" ]; then
461 verbose git checkout --track -b "$branch" origin/"$branch"
468 misc/tools/xonotic-map-compiler-autobuild download
472 if [ x"$1" = x"-f" ]; then
478 if [ -z "$branch" ]; then
481 branch=${remote#origin/}
492 enter "$d0/$d" verbose
494 if [ -n "$b" ] && git rev-parse "refs/heads/$b" >/dev/null 2>&1; then
496 verbose git checkout $checkoutflags "$b"
497 elif [ -n "$b" ] && git rev-parse "refs/remotes/$remote/$b" >/dev/null 2>&1; then
499 verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
502 if git rev-parse "refs/heads/$b" >/dev/null 2>&1; then
504 verbose git checkout $checkoutflags "$b"
505 elif git rev-parse "refs/remotes/$remote/$b" >/dev/null 2>&1; then
507 verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
509 echo "WTF? Not even branch $b doesn't exist in $d"
514 checkself "$cmd" "$@"
518 echo "The requested branch was not found in any repository."
526 if [ -z "$branch" ]; then
530 if [ -z "$branch" ]; then
533 r=`git symbolic-ref HEAD`
540 dv=`visible_repo_name "$d"`
541 enter "$d0/$d" verbose
542 if git rev-parse "refs/heads/$branch" >/dev/null 2>&1; then
543 echo "Already having this branch in $dv."
545 if yesno "Branch in $dv?"; then
546 if [ -n "$srcbranch" ]; then
549 b=origin/"`repobranch "$d"`"
550 verbose git fetch origin || true
552 # TODO do this without pushing
553 verbose git checkout -b "$branch" "$b"
554 verbose git config "branch.$branch.remote" "$remote"
555 verbose git config "branch.$branch.merge" "refs/heads/$branch"
565 cd "$d0/$d" # am in a pipe, shouldn't use enter
566 git branch -r -v -v | cut -c 3- | sed "s/^(no branch)/(no_branch)/" | sed "s,^,$d ,"
571 while read -r d BRANCH REV TEXT; do
572 if [ x"$BRANCH" = x"`repobranch "$d"`" ]; then
575 if [ x"$REV" = x"->" ]; then
578 BRANCH=${BRANCH#remotes/}
579 ID=`echo "$BRANCH" | tr -c "A-Za-z0-9." "_"`
580 branches_list="$branches_list $BRANCH" # TEH SORT MAKEZ IT UNIEQ
581 eval "r=\$branches_repos_$ID"
583 eval "branches_repos_$ID=\$r"
585 echo -n "$branches_list" | xargs -n 1 echo | sort -u | while IFS= read -r BRANCH; do
586 ID=`echo "$BRANCH" | tr -c "A-Za-z0-9." "_"`
587 eval "r=\$branches_repos_$ID"
588 printf "%-60s %s\n" "$BRANCH" "$r"
595 dv=`visible_repo_name "$d"`
596 enter "$d0/$d" verbose
597 r=`git symbolic-ref HEAD`
599 if git log HEAD..origin/"`repobranch "$d"`" | grep .; then
600 # we have uncommitted changes
601 if yesno "Could merge from \"`repobranch "$d"`\" into \"$r\" in $dv. Do it?"; then
602 if ! verbose git merge origin/"`repobranch "$d"`"; then
603 check_mergeconflict "$d"
604 exit 1 # this should ALWAYS be fatal
614 dv=`visible_repo_name "$d"`
615 enter "$d0/$d" verbose
616 r=`git symbolic-ref HEAD`
618 diffdata=`git diff --color HEAD`
619 if [ -n "$diffdata" ]; then
620 # we have uncommitted changes
621 if yesno "Uncommitted changes in \"$r\" in $dv. Commit?" 'echo "$diffdata" | less -r'; then
622 verbose git commit -a
625 rem=`git config "branch.$r.remote" || echo origin`
626 bra=`git config "branch.$r.merge" || echo "$r"`
627 upstream="$rem/${bra#refs/heads/}"
628 if ! git rev-parse "$upstream" >/dev/null 2>&1; then
629 upstream="origin/`repobranch "$d"`"
631 logdata=`git log --color "$upstream".."$r"`
632 if [ -n "$logdata" ]; then
633 if yesno "Push \"$r\" in $dv?" 'echo "$logdata" | less -r'; then
634 verbose git push "$rem" HEAD
637 if [ x"$submit" = x"-s" ]; then
640 verbose git push "$rem" HEAD:"${bra%%/*}/finished/${bra#*/}"
654 if [ -z "$CC" ]; then
655 export CC="gcc -DSUPPORTIPV6"
671 export CC="$CC -g -mtune=native -march=native"
679 if [ -n "$WE_HATE_OUR_USERS" ]; then
680 TARGETS="sv-$debug cl-$debug"
681 elif [ x"`uname`" = x"Darwin" ]; then
684 TARGETS="sv-$debug cl-$debug sdl-$debug"
687 # AGL cannot be compiled on systems with a kernel > 10.x (Snow Leopard)
688 TARGETS="sv-$debug sdl-$debug"
691 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"
693 TARGETS="sv-$debug cl-$debug sdl-$debug"
695 if [ $# -gt 0 ] && [ x"$1" = x"" ]; then
696 # if we give the command make the arg "", it will surely fail (invalid filename),
697 # so better handle it as an empty client option
700 elif [ -n "$1" ]; then
702 TARGETS_SAVE=$TARGETS
707 TARGETS="$TARGETS sdl-debug"
710 TARGETS="$TARGETS cl-debug"
713 TARGETS="$TARGETS sv-debug"
716 BAD_TARGETS="$BAD_TARGETS $X"
720 if [ -n "$TARGETS" ]; then # at least a valid client
722 else # no valid client, let's assume this option is not meant to be a client then
723 TARGETS=$TARGETS_SAVE
727 if [ -z "$MAKEFLAGS" ]; then
728 if [ -f /proc/cpuinfo ]; then
729 ncpus=$((`grep -c '^processor :' /proc/cpuinfo`+0))
730 if [ $ncpus -gt 1 ]; then
734 if [ -n "$WE_HATE_OUR_USERS" ]; then
735 MAKEFLAGS="$MAKEFLAGS DP_MAKE_TARGET=mingw LIB_JPEG= CFLAGS_LIBJPEG="
739 enter "$d0/d0_blind_id" verbose
740 if ! $compiled0; then
741 # compilation of crypto library failed
742 # use binaries then, if we can...
744 if [ -n "$WE_HATE_OUR_USERS" ]; then
745 verbose cp "$d0/misc/buildfiles/win32/libd0_blind_id"-* .libs/
746 verbose cp "$d0/misc/buildfiles/win32/libgmp"-* .libs/
752 verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_blind_id".* .libs/
753 verbose cp "$d0/misc/builddeps/dp.linux64/lib/libgmp".* .libs/
754 MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/"
757 verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_blind_id".* .libs/
758 verbose cp "$d0/misc/builddeps/dp.linux32/lib/libgmp".* .libs/
759 MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/"
767 verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_blind_id".* .libs/
777 if [ -f Makefile ]; then
778 verbose make $MAKEFLAGS distclean
781 if ! [ -f Makefile ]; then
782 verbose sh autogen.sh
785 verbose make $MAKEFLAGS
788 enter "$d0/fteqcc" verbose
790 verbose make $MAKEFLAGS clean
792 verbose make $MAKEFLAGS
794 enter "$d0/data/xonotic-data.pk3dir" verbose
796 verbose make FTEQCC="$d0/fteqcc/fteqcc.bin" "$@" $MAKEFLAGS clean
798 verbose make FTEQCC="$d0/fteqcc/fteqcc.bin" "$@" $MAKEFLAGS
800 enter "$d0/darkplaces" verbose
801 if [ x"$BAD_TARGETS" = x" " ]; then
802 echo "Warning: invalid empty client, default clients will be used."
805 verbose make $MAKEFLAGS clean
807 for T in $TARGETS; do
808 verbose make $MAKEFLAGS STRIP=: "$@" "$T"
810 for T in $BAD_TARGETS; do
811 echo "Warning: discarded invalid client $T."
814 verbose "$SELF" update-maps
817 if [ -n "$WE_HATE_OUR_USERS" ]; then
819 export PATH="$d0/misc/buildfiles/win32:$d0/d0_blind_id/.libs:$PATH"
820 elif [ x"`uname`" = x"Darwin" ]; then
821 export DYLD_LIBRARY_PATH="$d0/misc/buildfiles/osx/Xonotic-SDL.app/Contents/MacOS:$d0/d0_blind_id/.libs"
822 export DYLD_FRAMEWORK_PATH="$d0/misc/buildfiles/osx/Xonotic-SDL.app/Contents/Frameworks"
825 export LD_LIBRARY_PATH="$d0/d0_blind_id/.libs"
829 sdl|glx|agl|dedicated)
838 if ! [ -x "darkplaces/darkplaces$client" ]; then
839 if [ -x "darkplaces/darkplaces$client.exe" ]; then
842 echo "Client darkplaces/darkplaces$client not found, aborting"
846 set -- "darkplaces/darkplaces$client" -xonotic -mygames "$@"
848 # if pulseaudio is running: USE IT
849 if [ -z "$SDL_AUDIODRIVER" ] && ! [ -n "$WE_HATE_OUR_USERS" ] && ! [ x"`uname`" = x"Darwin" ]; then
850 if ps -C pulseaudio >/dev/null; then
851 if ldd /usr/lib/libSDL.so 2>/dev/null | grep pulse >/dev/null; then
852 export SDL_AUDIODRIVER=pulse
859 if [ -n "$USE_GDB" ]; then
860 set -- gdb --args "$@"
861 elif which gdb >/dev/null 2>&1; then
862 set -- gdb --batch -x savecore.gdb --args "$@"
863 elif which catchsegv >/dev/null 2>&1; then
864 set -- catchsegv "$@"
868 if [ -f xonotic.core ]; then
869 if yesno "The program has CRASHED. Do you want to examine the core dump?"; then
870 gdb "$binary" xonotic.core
871 #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
872 # tar cvzf xonotic.core.tar.gz xonotic.core darkplaces/*.c darkplaces/*.h
874 # rm -f xonotic.core.tar.gz
876 echo "The core dump can be examined later by"
877 echo " gdb $binary xonotic.core"
883 if [ x"$1" = x"-k" ]; then
888 if verbose cd "$d0/$d"; then
900 patchdir=`mktemp -d -t save-patches.XXXXXX`
902 enter "$d0/$d" verbose
903 git branch -v -v | cut -c 3- | {
905 while read -r BRANCH REV UPSTREAM TEXT; do
908 UPSTREAM=${UPSTREAM#\[}
909 UPSTREAM=${UPSTREAM%\]}
910 UPSTREAM=${UPSTREAM%:*}
914 UPSTREAM=origin/"`repobranch "$d"`"
918 if [ x"$REV" = x"->" ]; then
921 if git format-patch -o "$patchdir/$i" "$UPSTREAM".."$BRANCH"; then
922 echo "$d" > "$patchdir/$i/info.txt"
923 echo "$BRANCH" >> "$patchdir/$i/info.txt"
924 echo "$UPSTREAM" >> "$patchdir/$i/info.txt"
925 echo "$TRACK" >> "$patchdir/$i/info.txt"
928 rm -rf "$patchdir/$i"
933 ( cd "$patchdir" && tar cvzf - . ) > "$outfile"
938 patchdir=`mktemp -d -t restore-patches.XXXXXX`
939 ( cd "$patchdir" && tar xvzf - ) < "$infile"
941 for P in "$patchdir"/*/info.txt; do
948 verbose git checkout HEAD^0
949 verbose git branch -D "$BRANCH"
950 if [ x"$TRACK" = x"true" ]; then
951 verbose git checkout --track -b "$BRANCH" "$UPSTREAM"
953 verbose git branch -b "$BRANCH" "$UPSTREAM"
965 report=$report"$*$LF"
970 report=$report" $*$LF"
975 o=`"$@" | sed 's/^/ /' || true`
979 enter "$d0/$d" verbose
980 base="`repobranch "$d"`"
982 for ref in `git for-each-ref --format='%(refname)' refs/remotes/origin/`; do
983 case "${ref#refs/remotes/origin/}" in
996 if [ -n "$branch" ]; then
997 if [ x"$branch" != x"${ref#refs/remotes/origin/}" ]; then
1006 l0=`git rev-list "$base".."$ref" | wc -l`
1007 l1=`git rev-list master.."$ref" | wc -l`
1008 if [ $l0 -gt $l1 ]; then
1015 reportecho " Branch $ref:"
1016 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1017 logdata=`git log --color "$realbase".."$ref"`
1018 if [ -z "$logdata" ]; then
1019 reportecho4 "--> not merging, no changes vs master"
1020 if yesno "Branch \"$ref\" probably should get deleted. Do it?" ''; then
1021 git push origin :"${ref#refs/remotes/origin/}"
1022 reportecho4 "--> branch deleted"
1025 diffdata=`git diff --color --find-copies-harder --ignore-space-change "$realbase"..."$ref"`
1026 if [ -z "$diffdata" ]; then
1027 reportecho4 "--> not merging, no changes vs master, branch contains redundant history"
1028 if yesno "Branch \"$ref\" probably should get deleted. Do it?" '{ echo "$logdata"; } | less -r'; then
1029 git push origin :"${ref#refs/remotes/origin/}"
1030 reportecho4 "--> branch deleted"
1032 elif [ -z "$branch" ] && [ -n "$note" ]; then
1033 reportdo4 echo "$note"
1034 reportecho4 "--> not merging, already had this one rejected before"
1035 elif yesno "Branch \"$ref\" may want to get merged. Do it?" '{ echo "$logdata"; echo "$diffdata"; } | less -r'; then
1036 git checkout "$realbase"
1037 org=`git rev-parse HEAD`
1038 if ! git merge --no-ff "$ref" 2>&1 | tee "$t" && ! { git ls-files -u | grep ' 1 ' >/dev/null; }; then
1039 git reset --hard "$org"
1040 GIT_NOTES_REF=refs/notes/admin-merge git notes edit -m "Merge failed:$LF`cat "$t"`" "$ref"
1042 reportecho4 "--> merge failed"
1043 elif ! "$SELF" compile 2>&1 | tee "$t"; then
1044 git reset --hard "$org"
1045 GIT_NOTES_REF=refs/notes/admin-merge git notes edit -m "Compile failed:$LF`cat "$t"`" "$ref"
1047 reportecho4 "--> compile failed"
1048 elif ! yesno "Still merge \"$ref\" into `git symbolic-ref HEAD` of $d? Maybe you want to test first."; then
1049 git reset --hard "$org"
1050 GIT_NOTES_REF=refs/notes/admin-merge git notes edit "$ref"
1051 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1052 if [ x"$note" = x"del" ]; then
1053 git push origin :"${ref#refs/remotes/origin/}"
1054 reportecho4 "--> test failed, branch deleted"
1055 elif [ -n "$note" ]; then
1056 reportdo4 echo "$note"
1057 reportecho4 "--> test failed"
1059 reportecho4 "--> test failed, postponed"
1063 case ",`repoflags "$d"`," in
1065 # we do quite a mess here... luckily we know $org
1066 git fetch # svn needs to be current
1067 git rebase -i --onto origin/master "$org"
1068 git svn dcommit --add-author-from
1069 git reset --hard "$org"
1072 git push origin HEAD
1075 reportecho4 "--> MERGED"
1076 if yesno "Delete original branch \"$ref\"?"; then
1077 git push origin :"${ref#refs/remotes/origin/}"
1078 reportecho4 "--> branch deleted"
1082 GIT_NOTES_REF=refs/notes/admin-merge git notes edit "$ref"
1083 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1084 if [ x"$note" = x"del" ]; then
1085 git push origin :"${ref#refs/remotes/origin/}"
1086 reportecho4 "--> branch deleted"
1087 elif [ -n "$note" ]; then
1088 reportdo4 echo "$note"
1089 reportecho4 "--> rejected"
1091 reportecho4 "--> postponed"
1100 echo "$report" | ssh nexuiz@rm.endoftheinternet.org cat '>>' public_html/xonotic-merge-notes.txt
1112 # ./all clean [-m] [-f | -fu | -fU] [-r] [-D]
1113 # ./all clean --reclone
1116 if [ x"$1" = x"--reclone" ]; then
1123 elif [ x"$1" = x"-f" ]; then
1125 elif [ x"$1" = x"-u" ]; then
1127 elif [ x"$1" = x"-U" ]; then
1130 elif [ x"$1" = x"-fu" ]; then
1133 elif [ x"$1" = x"-fU" ]; then
1137 elif [ x"$1" = x"-m" ]; then
1139 elif [ x"$1" = x"-r" ]; then
1141 elif [ x"$1" = x"-D" ]; then
1154 if $gotoupstream; then
1156 msg "Must also use -f (delete local changes) when using -u"
1159 if $gotomaster; then
1160 if $fetchupstream; then
1161 verbose git fetch origin
1162 verbose git remote prune origin
1164 verbose git checkout -f "`repobranch "$d"`"
1165 verbose git reset --hard origin/"`repobranch "$d"`"
1167 r=`git symbolic-ref HEAD`
1169 rem=`git config "branch.$r.remote" || echo origin`
1170 bra=`git config "branch.$r.merge" || echo "$r"`
1171 upstream="$rem/${bra#refs/heads/}"
1172 if $fetchupstream; then
1173 verbose git fetch "$rem"
1174 verbose git remote prune "$rem"
1176 if ! git rev-parse "$upstream" >/dev/null 2>&1; then
1177 upstream="origin/`repobranch "$d"`"
1179 verbose git reset --hard "$upstream"
1181 elif $gotomaster; then
1183 verbose git checkout -f "`repobranch "$d"`"
1184 verbose git reset --hard
1186 verbose git checkout "`repobranch "$d"`"
1189 verbose git reset --hard
1191 if $rmuntracked; then
1194 verbose git clean -df
1197 verbose git clean -xdf
1201 if $killbranches; then
1202 git for-each-ref --format='%(refname)' refs/heads/ | while IFS= read -r B; do
1203 if [ x"$B" != x"`git symbolic-ref HEAD`" ]; then
1204 verbose git branch -D "${B#refs/heads/}"
1207 git rev-parse refs/heads/master >/dev/null 2>&1 || verbose git branch -t master origin/master || true
1208 git rev-parse "refs/heads/`repobranch "$d"`" >/dev/null 2>&1 || verbose git branch -t "`repobranch "$d"`" origin/"`repobranch "$d"`" || true
1213 # release building goes here
1215 #"$SELF" each git clean -fxd
1216 case "$RELEASETYPE" in
1218 msg "Building a BETA"
1221 msg "Building a RELEASE"
1224 echo >&2 -n "$ESC[2J$ESC[H"
1231 msg " +---------------------------------------------------------.---+"
1233 msg " +---------------------------------------------------------^---+"
1235 msg " | / \ This is the official release build system. |"
1236 msg " | | | If you are not a member of the Xonotic Core Team, |"
1237 msg " | | STOP | you are not supposed to use this script and should |"
1238 msg " | | | instead use ./all compile to compile the engine |"
1239 msg " | \____/ and game code. |"
1241 msg " | [ I understand ] |"
1242 msg " +-------------------------------------------------------------+"
1244 # A LOT of build infrastructure is required:
1247 # - .ssh/config must be configured so the following
1248 # host names are reachable and have a compile
1249 # infrastructure set up:
1250 # - xonotic-build-linux32 (with gcc on x86)
1251 # - xonotic-build-linux64 (with gcc on x86_64)
1252 # - xonotic-build-win32 (with i586-mingw32msvc-g++)
1253 # - xonotic-build-win64 (with amd64-mingw32msvc-g++
1254 # and x86_64-w64-mingw32-g++)
1255 # - xonotic-build-osx (with Xcode and SDL.framework)
1256 # - AMD Compressonator installed in WINE
1257 # - ResEdit installed in WINE
1258 # - a lot of other requirements you will figure out
1259 # while reading the error messages
1260 # - environment variable RELEASETYPE set
1261 # - optionally, environment variable RELEASEDATE set
1266 verbose rm -rf Xonotic Xonotic*.zip
1267 verbose mkdir -p Xonotic
1268 if [ -n "$RELEASEDATE" ]; then
1269 verbose echo "$RELEASEDATE" > Xonotic/stamp.txt
1271 verbose date +%Y%m%d > Xonotic/stamp.txt
1273 verbose git archive --format=tar HEAD -- Docs misc server xonotic-linux-glx.sh xonotic-linux-sdl.sh misc/buildfiles key_0.d0pk | {
1275 verbose mkdir data fteqcc source source/darkplaces source/fteqcc
1277 verbose rm -rf misc/builddeps
1278 verbose mv misc/buildfiles/win32/* . || true
1279 verbose mv misc/buildfiles/win64 bin64 || true
1280 verbose mv misc/buildfiles/osx/* . || true
1281 verbose rm -rf misc/buildfiles
1282 verbose rm -rf misc/pki
1285 verbose cd darkplaces
1286 verbose git archive --format=tar HEAD
1288 verbose cd Xonotic/source/darkplaces
1293 verbose git archive --format=tar HEAD
1295 verbose cd Xonotic/source/fteqcc
1299 verbose cd data/xonotic-data.pk3dir
1300 verbose git archive --format=tar HEAD -- qcsrc Makefile
1302 verbose cd Xonotic/source
1305 rm -f Xonotic/key_15.d0pk
1307 release-compile-run)
1316 if [ -n "$targetfiles" ]; then
1317 case " $HOSTS_THAT_ARE_DISABLED " in
1322 case " $HOSTS_THAT_ARE_MYSELF " in
1324 verbose rsync --delete -zLvaSHP "$srcdir"/ "$buildpath/"
1325 verbose rsync --delete -zLvaSHP "$depsdir"/ "$buildpath.deps/"
1326 verbose ln -snf "$buildpath.deps" "$buildpath/.deps"
1327 verbose eval make -C "$buildpath" clean $maketargets $makeflags
1328 for f in $targetfiles; do
1329 verbose mv "$buildpath/${f%:*}" "${f##*:}" || true
1333 verbose rsync --delete -zLvaSHP "$srcdir"/ "$host:$buildpath/"
1334 verbose rsync --delete -zLvaSHP "$depsdir"/ "$host:$buildpath.deps/"
1335 verbose ssh "$host" "ln -snf $buildpath.deps $buildpath/.deps && cd $buildpath && nice -`nice` make clean $maketargets $makeflags"
1336 for f in $targetfiles; do
1337 verbose rsync -zvaSHP "$host:$buildpath/${f%:*}" "${f##*:}" || true
1341 # now rebrand the binaries...
1342 for f in $targetfiles; do
1343 #verbose "$d0/misc/tools/rebrand-darkplaces-engine.sh" "${XONOTIC_BRAND:-$d0/misc/tools/xonotic.brand}" "${f##*:}" || true
1346 verbose "$d0/misc/tools/change-icon-of-exe.sh" "$d0/misc/logos/icons_ico/xonotic.ico" "$f"
1348 d=`mktemp -d -t rebrand.XXXXXX`
1350 echo "-mygames" > darkplaces.opt
1351 zip -9r darkplaces.zip darkplaces.opt
1364 fteqcc_maketargets=$3
1366 darkplaces_maketargets=$5
1368 host=xonotic-build-$suffix
1369 verbose "$SELF" release-compile-run "$host" /tmp/fteqcc.build."$suffix" "$fteqcc_maketargets" "$makeflags" "Xonotic/source/fteqcc" "$d0/misc/builddeps/dp.$suffix" "$fteqcc_files"
1370 verbose "$SELF" release-compile-run "$host" /tmp/Darkplaces.build."$suffix" "$darkplaces_maketargets" "$makeflags" "Xonotic/source/darkplaces" "$d0/misc/builddeps/dp.$suffix" "$darkplaces_files"
1372 release-engine-win32)
1373 verbose "$SELF" release-compile win32 \
1374 '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' \
1375 win 'fteqcc.exe:Xonotic/fteqcc/fteqcc.exe' \
1377 verbose "$SELF" release-compile win32 \
1378 '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' \
1380 release 'darkplaces.exe:Xonotic/xonotic.exe darkplaces-sdl.exe:Xonotic/xonotic-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-dedicated.exe'
1382 release-engine-win64)
1383 verbose "$SELF" release-compile win64 \
1384 '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' \
1385 win 'fteqcc.exe:Xonotic/fteqcc/fteqcc-x64.exe' \
1386 'sv-release sdl-release' 'darkplaces-sdl.exe:Xonotic/xonotic-x64-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-x64-dedicated.exe'
1387 verbose "$SELF" release-compile win64 \
1388 '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' \
1390 cl-release 'darkplaces.exe:Xonotic/xonotic-x64.exe'
1393 # gcc on OSX is buggy, needs -fno-reorder-blocks for a release build to succeed
1394 verbose "$SELF" release-compile osx \
1395 '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"' \
1396 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.osx' \
1397 'sv-release sdl-release' 'darkplaces-sdl:Xonotic/Xonotic-SDL.app/Contents/MacOS/xonotic-osx-sdl-bin darkplaces-dedicated:Xonotic/xonotic-osx-dedicated'
1398 verbose "$SELF" release-compile osx \
1399 '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"' \
1401 'cl-release' 'darkplaces-agl:Xonotic/Xonotic.app/Contents/MacOS/xonotic-osx-agl-bin'
1403 release-engine-linux32)
1404 verbose "$SELF" release-compile linux32 \
1405 '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' \
1406 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.linux32' \
1407 release 'darkplaces-glx:Xonotic/xonotic-linux32-glx darkplaces-sdl:Xonotic/xonotic-linux32-sdl darkplaces-dedicated:Xonotic/xonotic-linux32-dedicated'
1409 release-engine-linux64)
1410 verbose "$SELF" release-compile linux64 \
1411 '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' \
1412 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.linux64' \
1413 release 'darkplaces-glx:Xonotic/xonotic-linux64-glx darkplaces-sdl:Xonotic/xonotic-linux64-sdl darkplaces-dedicated:Xonotic/xonotic-linux64-dedicated'
1416 verbose "$SELF" release-engine-linux32 &
1417 verbose "$SELF" release-engine-linux64 &
1418 verbose "$SELF" release-engine-win32 &
1419 verbose "$SELF" release-engine-win64 &
1420 verbose "$SELF" release-engine-osx &
1429 verbose "$SELF" update-maps
1432 case "$RELEASETYPE" in
1434 verbose make -C Xonotic/source FTEQCC="$d0/Xonotic/fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 clean all
1437 verbose make -C Xonotic/source FTEQCC="$d0/Xonotic/fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 FTEQCCFLAGS_WATERMARK= clean all
1440 verbose rm -f Xonotic/source/*/fteqcc.log
1442 release-buildpk3-transform-raw)
1445 release-buildpk3-transform-normal)
1448 # texture: convert to jpeg and dds
1449 verbose export do_jpeg=true
1450 verbose export jpeg_qual_rgb=95
1451 verbose export jpeg_qual_a=99
1452 verbose export do_dds=true
1453 verbose export dds_flags=
1454 verbose export do_ogg=false
1455 verbose export del_src=true
1456 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1458 release-buildpk3-transform-low)
1461 # texture: convert to jpeg and dds
1462 # music: reduce bitrate
1463 verbose export do_jpeg=true
1464 verbose export jpeg_qual_rgb=80
1465 verbose export jpeg_qual_a=95
1466 verbose export do_dds=false
1467 verbose export do_ogg=true
1468 verbose export ogg_qual=1
1469 verbose export del_src=true
1470 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1472 release-buildpk3-transform-lowdds)
1475 # texture: convert to jpeg and dds
1476 # music: reduce bitrate
1477 verbose export do_jpeg=false
1478 verbose export do_jpeg_if_not_dds=true
1479 verbose export jpeg_qual_rgb=80
1480 verbose export jpeg_qual_a=95
1481 verbose export do_dds=true
1482 verbose export dds_flags=
1483 verbose export do_ogg=true
1484 verbose export ogg_qual=1
1485 verbose export del_src=true
1486 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1499 verbose rm -rf Xonotic/temp
1500 verbose mkdir -p Xonotic/temp
1503 verbose git archive --format=tar HEAD
1505 verbose cd Xonotic/temp
1508 verbose cd Xonotic/temp
1509 if [ x"$src" = x"data/xonotic-data.pk3dir" ]; then
1510 verbose cp ../source/progs.dat .
1511 verbose cp ../source/csprogs.dat .
1512 verbose cp ../source/menu.dat .
1513 verbose rm -rf qcsrc
1514 gv=`grep "^gameversion " "defaultXonotic.cfg" | awk '{ print $2 }'`
1515 major=$(($gv / 10000))
1516 minor=$(($gv / 100 - $major * 100))
1517 patch=$(($gv - $major * 10000 - $minor * 100))
1518 versionstr="$major.$minor.$patch"
1519 case "$RELEASETYPE" in
1521 versionstr="$versionstr""beta"
1525 s/^set g_xonoticversion [^ ]* /set g_xonoticversion $versionstr /;
1526 s/^gameversion_min [0-9]*/gameversion_min $(( ($gv / 100) * 100 - 100 ))/;
1527 s/^gameversion_max [0-9]*/gameversion_max $(( ($gv / 100) * 100 + 199 ))/;
1528 " defaultXonotic.cfg
1530 verbose cd gfx/menu/luminos
1531 verbose cp "$d0"/mediasource/gfx/menu/luminos_versionbuilder/background_l2.svg .
1532 verbose "$d0"/mediasource/gfx/menu/luminos_versionbuilder/versionbuilder "$versionstr"
1533 verbose rm background_l2.svg
1536 if [ x"$src" = x"data/xonotic-maps.pk3dir" ]; then
1537 for X in ../../data/*-????????????????????????????????????????-????????????????????????????????????????.pk3; do
1538 if [ -f "$X" ]; then
1540 verbose rm -f maps/*.log maps/*.irc maps/*.lin
1544 verbose export git_src_repo="$d0/$src" # skip hash-object
1545 verbose "$SELF" release-buildpk3-transform-$transform "Xonotic/temp"
1546 verbose mkzip "../../$dst" *
1548 verbose rm -rf Xonotic/temp
1551 stamp=`cat Xonotic/stamp.txt`
1557 dst="data/xonotic-$stamp-${dst#data/xonotic-}"
1563 while [ "$#" -gt 1 ]; do
1564 verbose "$SELF" release-buildpk3 "$src" "Xonotic/$dst$2.pk3" "$1"
1570 verbose "$SELF" release-buildpk3s data/font-nimbussansl.pk3dir raw ''
1571 verbose "$SELF" release-buildpk3s data/xonotic-data.pk3dir normal '' raw '-raw' low '-low' lowdds '-lowdds'
1572 verbose "$SELF" release-buildpk3s data/xonotic-maps.pk3dir normal '' raw '-raw' low '-low' lowdds '-lowdds'
1573 verbose "$SELF" release-buildpk3s data/xonotic-music.pk3dir raw '' low '-low'
1574 verbose "$SELF" release-buildpk3s data/xonotic-nexcompat.pk3dir low ''
1576 release-pack-needsx11)
1579 verbose startx "$SELF" release-pack -- /usr/bin/Xvfb :7
1582 verbose "$SELF" release-pack
1587 stamp=`cat Xonotic/stamp.txt`
1588 # exe and dll files do not need +x, so this makes them eligible for 7zip compression too
1589 chmod a-x Xonotic/*.exe Xonotic/*.dll || true
1590 # let's pass crypto import laws of some nasty countries
1591 crypto_libs=`find Xonotic -name \*d0_rijndael\*`
1592 if [ -n "$crypto_libs" ]; then
1593 verbose mkzip Xonotic-$stamp-crypto.zip \
1597 # build the archives
1598 verbose mkzip Xonotic-$stamp-engine.zip \
1600 Xonotic/bin64/*.dll \
1603 Xonotic/xonotic.exe \
1604 Xonotic/source/darkplaces/
1605 verbose cp Xonotic-$stamp-engine.zip Xonotic-$stamp-common.zip
1606 verbose mkzip Xonotic-$stamp-common.zip \
1607 Xonotic/source/fteqcc/ \
1608 Xonotic/source/qcsrc/ \
1613 Xonotic/key_0.d0pk \
1614 Xonotic/data/font-nimbussansl-$stamp.pk3
1615 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp.zip
1616 verbose mkzip0 Xonotic-$stamp.zip \
1617 Xonotic/data/xonotic-$stamp-data.pk3 \
1618 Xonotic/data/xonotic-$stamp-maps.pk3 \
1619 Xonotic/data/xonotic-$stamp-music.pk3 \
1620 Xonotic/data/xonotic-$stamp-nexcompat.pk3
1621 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp-low.zip
1622 verbose mkzip0 Xonotic-$stamp-low.zip \
1623 Xonotic/data/xonotic-$stamp-data-low.pk3 \
1624 Xonotic/data/xonotic-$stamp-maps-low.pk3 \
1625 Xonotic/data/xonotic-$stamp-music-low.pk3
1626 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp-lowdds.zip
1627 verbose mkzip0 Xonotic-$stamp-lowdds.zip \
1628 Xonotic/data/xonotic-$stamp-data-lowdds.pk3 \
1629 Xonotic/data/xonotic-$stamp-maps-lowdds.pk3 \
1630 Xonotic/data/xonotic-$stamp-music-low.pk3
1631 verbose mv Xonotic-$stamp-common.zip Xonotic-$stamp-high.zip
1632 verbose mkzip0 Xonotic-$stamp-high.zip \
1633 Xonotic/data/xonotic-$stamp-data-raw.pk3 \
1634 Xonotic/data/xonotic-$stamp-maps-raw.pk3 \
1635 Xonotic/data/xonotic-$stamp-music.pk3 \
1636 Xonotic/data/xonotic-$stamp-nexcompat.pk3
1639 verbose "$SELF" release-prepare
1640 verbose "$SELF" release-maps
1641 verbose "$SELF" release-engine
1642 verbose "$SELF" release-qc
1643 verbose "$SELF" release-pack-needsx11
1644 verbose "$SELF" release-zip
1649 echo " $SELF admin-merge [<branch>]"
1650 echo " $SELF branch <branch>"
1651 echo " $SELF branch <remote> <branch> [<srcbranch>]"
1652 echo " $SELF branches"
1653 echo " $SELF checkout|switch <branch>"
1654 echo " $SELF checkout|switch <remote>/<branch>"
1655 echo " $SELF clean [-m] [-f | -fu | -fU] [-r] [-D]"
1656 echo " $SELF clean --reclone"
1657 echo " $SELF compile [-c]"
1658 echo " $SELF each|foreach [-k] command..."
1659 echo " $SELF fix_upstream_rebase"
1661 echo " $SELF push|commit [-s]"
1662 echo " $SELF release"
1663 echo " $SELF restore-patches"
1664 echo " $SELF run [sdl|glx|wgl|agl|dedicated] options..."
1665 echo " $SELF save-patches"
1666 echo " $SELF update-maps"
1667 echo " $SELF update|pull [-N]"