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`"
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 ticket:"
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."
392 ssh-keygen -t rsa -b 4096
394 msg "To get access, your key has to be approved first. For that, visit"
395 msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
396 msg "the \"Support\" tracker in the \"Repository\" category where you"
397 msg "apply for access and paste the following output into the ticket:"
399 msg "`cat ~/.ssh/id_rsa.pub`"
401 msg "Note that you will only have write access to branches that start"
402 msg "with your user name."
409 if [ x"$1" = x"-N" ]; then
411 elif [ x"$1" = x"-p" ]; then
413 if [ x"$base" != x"ssh://xonotic@git.xonotic.org/" ]; then
414 pushbase=ssh://xonotic@git.xonotic.org/
416 elif [ x"$1" = x"-s" ]; then
418 base=ssh://xonotic@git.xonotic.org/
420 elif [ x"$1" = x"-g" ]; then
422 base=git://git.xonotic.org/xonotic/
423 elif [ x"$1" = x"-h" ]; then
425 base=http://git.xonotic.org/xonotic/
433 pushurl=`repopushurl .`
434 fix_git_config "$url" "$pushurl"
436 if $allow_pull || $fix_config; then
441 pushurl=`repopushurl "$d"`
442 branch=`repobranch "$d"`
443 if [ -d "$d0/$d" ]; then
445 enter "$d0/$d" verbose
446 r=`git symbolic-ref HEAD`
448 if git config branch.$r.remote >/dev/null 2>&1; then
449 if ! verbose git pull; then
450 fix_upstream_rebase_mergefail || true
451 check_mergeconflict "$d"
452 echo "Pulling failed. Press ENTER to continue, or Ctrl-C to abort."
455 fix_upstream_rebase_mergeok || true
460 checkself "$cmd" "$@"
462 verbose git remote prune origin
466 verbose git clone "$url" "$d0/$d"
467 enter "$d0/$d" verbose
468 fix_git_config "$url" "$pushurl"
469 if [ "$branch" != "master" ]; then
470 verbose git checkout --track -b "$branch" origin/"$branch"
477 misc/tools/xonotic-map-compiler-autobuild download
481 if [ x"$1" = x"-f" ]; then
487 if [ -z "$branch" ]; then
490 branch=${remote#origin/}
501 enter "$d0/$d" verbose
503 if [ -n "$b" ] && git rev-parse "refs/heads/$b" >/dev/null 2>&1; then
505 verbose git checkout $checkoutflags "$b"
506 elif [ -n "$b" ] && git rev-parse "refs/remotes/$remote/$b" >/dev/null 2>&1; then
508 verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
511 if git rev-parse "refs/heads/$b" >/dev/null 2>&1; then
513 verbose git checkout $checkoutflags "$b"
514 elif git rev-parse "refs/remotes/$remote/$b" >/dev/null 2>&1; then
516 verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
518 echo "WTF? Not even branch $b doesn't exist in $d"
523 checkself "$cmd" "$@"
527 echo "The requested branch was not found in any repository."
535 if [ -z "$branch" ]; then
539 if [ -z "$branch" ]; then
542 r=`git symbolic-ref HEAD`
549 dv=`visible_repo_name "$d"`
550 enter "$d0/$d" verbose
551 if git rev-parse "refs/heads/$branch" >/dev/null 2>&1; then
552 echo "Already having this branch in $dv."
554 if yesno "Branch in $dv?"; then
555 if [ -n "$srcbranch" ]; then
558 b=origin/"`repobranch "$d"`"
559 verbose git fetch origin || true
561 # TODO do this without pushing
562 verbose git checkout -b "$branch" "$b"
563 verbose git config "branch.$branch.remote" "$remote"
564 verbose git config "branch.$branch.merge" "refs/heads/$branch"
574 cd "$d0/$d" # am in a pipe, shouldn't use enter
575 git branch -r -v -v | cut -c 3- | sed "s/^(no branch)/(no_branch)/" | sed "s,^,$d ,"
580 while read -r d BRANCH REV TEXT; do
581 if [ x"$BRANCH" = x"`repobranch "$d"`" ]; then
584 if [ x"$REV" = x"->" ]; then
587 BRANCH=${BRANCH#remotes/}
588 ID=`echo "$BRANCH" | tr -c "A-Za-z0-9." "_"`
589 branches_list="$branches_list $BRANCH" # TEH SORT MAKEZ IT UNIEQ
590 eval "r=\$branches_repos_$ID"
592 eval "branches_repos_$ID=\$r"
594 echo -n "$branches_list" | xargs -n 1 echo | sort -u | while IFS= read -r BRANCH; do
595 ID=`echo "$BRANCH" | tr -c "A-Za-z0-9." "_"`
596 eval "r=\$branches_repos_$ID"
597 printf "%-60s %s\n" "$BRANCH" "$r"
604 dv=`visible_repo_name "$d"`
605 enter "$d0/$d" verbose
606 r=`git symbolic-ref HEAD`
608 if git log HEAD..origin/"`repobranch "$d"`" | grep .; then
609 # we have uncommitted changes
610 if yesno "Could merge from \"`repobranch "$d"`\" into \"$r\" in $dv. Do it?"; then
611 if ! verbose git merge origin/"`repobranch "$d"`"; then
612 check_mergeconflict "$d"
613 exit 1 # this should ALWAYS be fatal
623 dv=`visible_repo_name "$d"`
624 enter "$d0/$d" verbose
625 r=`git symbolic-ref HEAD`
627 diffdata=`git diff --color HEAD`
628 if [ -n "$diffdata" ]; then
629 # we have uncommitted changes
630 if yesno "Uncommitted changes in \"$r\" in $dv. Commit?" 'echo "$diffdata" | less -r'; then
631 verbose git commit -a
634 rem=`git config "branch.$r.remote" || echo origin`
635 bra=`git config "branch.$r.merge" || echo "$r"`
636 upstream="$rem/${bra#refs/heads/}"
637 if ! git rev-parse "$upstream" >/dev/null 2>&1; then
638 upstream="origin/`repobranch "$d"`"
640 logdata=`git log --color "$upstream".."$r"`
641 if [ -n "$logdata" ]; then
642 if yesno "Push \"$r\" in $dv?" 'echo "$logdata" | less -r'; then
643 verbose git push "$rem" HEAD
646 if [ x"$submit" = x"-s" ]; then
649 verbose git push "$rem" HEAD:"${bra%%/*}/finished/${bra#*/}"
663 if [ -z "$CC" ]; then
664 export CC="gcc -DSUPPORTIPV6"
680 export CC="$CC -g -mtune=native -march=native"
688 if [ -n "$WE_HATE_OUR_USERS" ]; then
689 TARGETS="sv-$debug cl-$debug"
690 elif [ x"`uname`" = x"Darwin" ]; then
693 TARGETS="sv-$debug cl-$debug sdl-$debug"
696 # AGL cannot be compiled on systems with a kernel > 10.x (Snow Leopard)
697 TARGETS="sv-$debug sdl-$debug"
700 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"
702 TARGETS="sv-$debug cl-$debug sdl-$debug"
704 if [ $# -gt 0 ] && [ x"$1" = x"" ]; then
705 # if we give the command make the arg "", it will surely fail (invalid filename),
706 # so better handle it as an empty client option
709 elif [ -n "$1" ]; then
711 TARGETS_SAVE=$TARGETS
716 TARGETS="$TARGETS sdl-debug"
719 TARGETS="$TARGETS cl-debug"
722 TARGETS="$TARGETS sv-debug"
725 BAD_TARGETS="$BAD_TARGETS $X"
729 if [ -n "$TARGETS" ]; then # at least a valid client
731 else # no valid client, let's assume this option is not meant to be a client then
732 TARGETS=$TARGETS_SAVE
736 if [ -z "$MAKEFLAGS" ]; then
737 if [ -f /proc/cpuinfo ]; then
738 ncpus=$((`grep -c '^processor :' /proc/cpuinfo`+0))
739 if [ $ncpus -gt 1 ]; then
743 if [ -n "$WE_HATE_OUR_USERS" ]; then
744 MAKEFLAGS="$MAKEFLAGS DP_MAKE_TARGET=mingw LIB_JPEG= CFLAGS_LIBJPEG="
748 enter "$d0/d0_blind_id" verbose
749 if ! $compiled0; then
750 # compilation of crypto library failed
751 # use binaries then, if we can...
753 if [ -n "$WE_HATE_OUR_USERS" ]; then
754 verbose cp "$d0/misc/buildfiles/win32/libd0_blind_id"-* .libs/
755 verbose cp "$d0/misc/buildfiles/win32/libgmp"-* .libs/
761 verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_blind_id".* .libs/
762 verbose cp "$d0/misc/builddeps/dp.linux64/lib/libgmp".* .libs/
763 MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/"
766 verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_blind_id".* .libs/
767 verbose cp "$d0/misc/builddeps/dp.linux32/lib/libgmp".* .libs/
768 MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/"
776 verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_blind_id".* .libs/
786 if [ -f Makefile ]; then
787 verbose make $MAKEFLAGS distclean
790 if ! [ -f Makefile ]; then
791 verbose sh autogen.sh
794 verbose make $MAKEFLAGS
797 enter "$d0/fteqcc" verbose
799 verbose make $MAKEFLAGS clean
801 verbose make $MAKEFLAGS
803 enter "$d0/data/xonotic-data.pk3dir" verbose
805 verbose make FTEQCC="$d0/fteqcc/fteqcc.bin" "$@" $MAKEFLAGS clean
807 verbose make FTEQCC="$d0/fteqcc/fteqcc.bin" "$@" $MAKEFLAGS
809 enter "$d0/darkplaces" verbose
810 if [ x"$BAD_TARGETS" = x" " ]; then
811 echo "Warning: invalid empty client, default clients will be used."
814 verbose make $MAKEFLAGS clean
816 for T in $TARGETS; do
817 verbose make $MAKEFLAGS STRIP=: "$@" "$T"
819 for T in $BAD_TARGETS; do
820 echo "Warning: discarded invalid client $T."
823 verbose "$SELF" update-maps
826 if [ -n "$WE_HATE_OUR_USERS" ]; then
828 export PATH="$d0/misc/buildfiles/win32:$d0/d0_blind_id/.libs:$PATH"
829 elif [ x"`uname`" = x"Darwin" ]; then
830 export DYLD_LIBRARY_PATH="$d0/misc/buildfiles/osx/Xonotic-SDL.app/Contents/MacOS:$d0/d0_blind_id/.libs"
831 export DYLD_FRAMEWORK_PATH="$d0/misc/buildfiles/osx/Xonotic-SDL.app/Contents/Frameworks"
834 export LD_LIBRARY_PATH="$d0/d0_blind_id/.libs"
838 sdl|glx|agl|dedicated)
847 if ! [ -x "darkplaces/darkplaces$client" ]; then
848 if [ -x "darkplaces/darkplaces$client.exe" ]; then
851 echo "Client darkplaces/darkplaces$client not found, aborting"
855 set -- "darkplaces/darkplaces$client" -xonotic -mygames "$@"
857 # if pulseaudio is running: USE IT
858 if [ -z "$SDL_AUDIODRIVER" ] && ! [ -n "$WE_HATE_OUR_USERS" ] && ! [ x"`uname`" = x"Darwin" ]; then
859 if ps -C pulseaudio >/dev/null; then
860 if ldd /usr/lib/libSDL.so 2>/dev/null | grep pulse >/dev/null; then
861 export SDL_AUDIODRIVER=pulse
868 if [ -n "$USE_GDB" ]; then
869 set -- gdb --args "$@"
870 elif which gdb >/dev/null 2>&1; then
871 set -- gdb --batch -x savecore.gdb --args "$@"
872 elif which catchsegv >/dev/null 2>&1; then
873 set -- catchsegv "$@"
877 if [ -f xonotic.core ]; then
878 if yesno "The program has CRASHED. Do you want to examine the core dump?"; then
879 gdb "$binary" xonotic.core
880 #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
881 # tar cvzf xonotic.core.tar.gz xonotic.core darkplaces/*.c darkplaces/*.h
883 # rm -f xonotic.core.tar.gz
885 echo "The core dump can be examined later by"
886 echo " gdb $binary xonotic.core"
892 if [ x"$1" = x"-k" ]; then
897 if verbose cd "$d0/$d"; then
909 patchdir=`mktemp -d -t save-patches.XXXXXX`
911 enter "$d0/$d" verbose
912 git branch -v -v | cut -c 3- | {
914 while read -r BRANCH REV UPSTREAM TEXT; do
917 UPSTREAM=${UPSTREAM#\[}
918 UPSTREAM=${UPSTREAM%\]}
919 UPSTREAM=${UPSTREAM%:*}
923 UPSTREAM=origin/"`repobranch "$d"`"
927 if [ x"$REV" = x"->" ]; then
930 if git format-patch -o "$patchdir/$i" "$UPSTREAM".."$BRANCH"; then
931 echo "$d" > "$patchdir/$i/info.txt"
932 echo "$BRANCH" >> "$patchdir/$i/info.txt"
933 echo "$UPSTREAM" >> "$patchdir/$i/info.txt"
934 echo "$TRACK" >> "$patchdir/$i/info.txt"
937 rm -rf "$patchdir/$i"
942 ( cd "$patchdir" && tar cvzf - . ) > "$outfile"
947 patchdir=`mktemp -d -t restore-patches.XXXXXX`
948 ( cd "$patchdir" && tar xvzf - ) < "$infile"
950 for P in "$patchdir"/*/info.txt; do
957 verbose git checkout HEAD^0
958 verbose git branch -D "$BRANCH"
959 if [ x"$TRACK" = x"true" ]; then
960 verbose git checkout --track -b "$BRANCH" "$UPSTREAM"
962 verbose git branch -b "$BRANCH" "$UPSTREAM"
974 report=$report"$*$LF"
979 report=$report" $*$LF"
984 o=`"$@" | sed 's/^/ /' || true`
988 enter "$d0/$d" verbose
989 base="`repobranch "$d"`"
991 for ref in `git for-each-ref --format='%(refname)' refs/remotes/origin/`; do
992 case "${ref#refs/remotes/origin/}" in
1005 if [ -n "$branch" ]; then
1006 if [ x"$branch" != x"${ref#refs/remotes/origin/}" ]; then
1015 l0=`git rev-list "$base".."$ref" | wc -l`
1016 l1=`git rev-list master.."$ref" | wc -l`
1017 if [ $l0 -gt $l1 ]; then
1024 reportecho " Branch $ref:"
1025 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1026 logdata=`git log --color "$realbase".."$ref"`
1027 if [ -z "$logdata" ]; then
1028 reportecho4 "--> not merging, no changes vs master"
1029 if yesno "Branch \"$ref\" probably should get deleted. Do it?" ''; then
1030 git push origin :"${ref#refs/remotes/origin/}"
1031 reportecho4 "--> branch deleted"
1034 diffdata=`git diff --color --find-copies-harder --ignore-space-change "$realbase"..."$ref"`
1035 if [ -z "$diffdata" ]; then
1036 reportecho4 "--> not merging, no changes vs master, branch contains redundant history"
1037 if yesno "Branch \"$ref\" probably should get deleted. Do it?" '{ echo "$logdata"; } | less -r'; then
1038 git push origin :"${ref#refs/remotes/origin/}"
1039 reportecho4 "--> branch deleted"
1041 elif [ -z "$branch" ] && [ -n "$note" ]; then
1042 reportdo4 echo "$note"
1043 reportecho4 "--> not merging, already had this one rejected before"
1044 elif yesno "Branch \"$ref\" may want to get merged. Do it?" '{ echo "$logdata"; echo "$diffdata"; } | less -r'; then
1045 git checkout "$realbase"
1046 org=`git rev-parse HEAD`
1047 if ! git merge --no-ff "$ref" 2>&1 | tee "$t" && ! { git ls-files -u | grep ' 1 ' >/dev/null; }; then
1048 git reset --hard "$org"
1049 GIT_NOTES_REF=refs/notes/admin-merge git notes edit -m "Merge failed:$LF`cat "$t"`" "$ref"
1051 reportecho4 "--> merge failed"
1052 elif ! "$SELF" compile 2>&1 | tee "$t"; then
1053 git reset --hard "$org"
1054 GIT_NOTES_REF=refs/notes/admin-merge git notes edit -m "Compile failed:$LF`cat "$t"`" "$ref"
1056 reportecho4 "--> compile failed"
1057 elif ! yesno "Still merge \"$ref\" into `git symbolic-ref HEAD` of $d? Maybe you want to test first."; then
1058 git reset --hard "$org"
1059 GIT_NOTES_REF=refs/notes/admin-merge git notes edit "$ref"
1060 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1061 if [ x"$note" = x"del" ]; then
1062 git push origin :"${ref#refs/remotes/origin/}"
1063 reportecho4 "--> test failed, branch deleted"
1064 elif [ -n "$note" ]; then
1065 reportdo4 echo "$note"
1066 reportecho4 "--> test failed"
1068 reportecho4 "--> test failed, postponed"
1072 case ",`repoflags "$d"`," in
1074 # we do quite a mess here... luckily we know $org
1075 git fetch # svn needs to be current
1076 git rebase -i --onto origin/master "$org"
1077 git svn dcommit --add-author-from
1078 git reset --hard "$org"
1081 git push origin HEAD
1084 reportecho4 "--> MERGED"
1085 if yesno "Delete original branch \"$ref\"?"; then
1086 git push origin :"${ref#refs/remotes/origin/}"
1087 reportecho4 "--> branch deleted"
1091 GIT_NOTES_REF=refs/notes/admin-merge git notes edit "$ref"
1092 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1093 if [ x"$note" = x"del" ]; then
1094 git push origin :"${ref#refs/remotes/origin/}"
1095 reportecho4 "--> branch deleted"
1096 elif [ -n "$note" ]; then
1097 reportdo4 echo "$note"
1098 reportecho4 "--> rejected"
1100 reportecho4 "--> postponed"
1109 echo "$report" | ssh nexuiz@rm.endoftheinternet.org cat '>>' public_html/xonotic-merge-notes.txt
1121 # ./all clean [-m] [-f | -fu | -fU] [-r] [-D]
1122 # ./all clean --reclone
1125 if [ x"$1" = x"--reclone" ]; then
1132 elif [ x"$1" = x"-f" ]; then
1134 elif [ x"$1" = x"-u" ]; then
1136 elif [ x"$1" = x"-U" ]; then
1139 elif [ x"$1" = x"-fu" ]; then
1142 elif [ x"$1" = x"-fU" ]; then
1146 elif [ x"$1" = x"-m" ]; then
1148 elif [ x"$1" = x"-r" ]; then
1150 elif [ x"$1" = x"-D" ]; then
1163 if $gotoupstream; then
1165 msg "Must also use -f (delete local changes) when using -u"
1168 if $gotomaster; then
1169 if $fetchupstream; then
1170 verbose git fetch origin
1171 verbose git remote prune origin
1173 verbose git checkout -f "`repobranch "$d"`"
1174 verbose git reset --hard origin/"`repobranch "$d"`"
1176 r=`git symbolic-ref HEAD`
1178 rem=`git config "branch.$r.remote" || echo origin`
1179 bra=`git config "branch.$r.merge" || echo "$r"`
1180 upstream="$rem/${bra#refs/heads/}"
1181 if $fetchupstream; then
1182 verbose git fetch "$rem"
1183 verbose git remote prune "$rem"
1185 if ! git rev-parse "$upstream" >/dev/null 2>&1; then
1186 upstream="origin/`repobranch "$d"`"
1188 verbose git reset --hard "$upstream"
1190 elif $gotomaster; then
1192 verbose git checkout -f "`repobranch "$d"`"
1193 verbose git reset --hard
1195 verbose git checkout "`repobranch "$d"`"
1198 verbose git reset --hard
1200 if $rmuntracked; then
1203 verbose git clean -df
1206 verbose git clean -xdf
1210 if $killbranches; then
1211 git for-each-ref --format='%(refname)' refs/heads/ | while IFS= read -r B; do
1212 if [ x"$B" != x"`git symbolic-ref HEAD`" ]; then
1213 verbose git branch -D "${B#refs/heads/}"
1216 git rev-parse refs/heads/master >/dev/null 2>&1 || verbose git branch -t master origin/master || true
1217 git rev-parse "refs/heads/`repobranch "$d"`" >/dev/null 2>&1 || verbose git branch -t "`repobranch "$d"`" origin/"`repobranch "$d"`" || true
1222 # release building goes here
1224 #"$SELF" each git clean -fxd
1225 case "$RELEASETYPE" in
1227 msg "Building a BETA"
1230 msg "Building a RELEASE"
1233 echo >&2 -n "$ESC[2J$ESC[H"
1240 msg " +---------------------------------------------------------.---+"
1242 msg " +---------------------------------------------------------^---+"
1244 msg " | / \ This is the official release build system. |"
1245 msg " | | | If you are not a member of the Xonotic Core Team, |"
1246 msg " | | STOP | you are not supposed to use this script and should |"
1247 msg " | | | instead use ./all compile to compile the engine |"
1248 msg " | \____/ and game code. |"
1250 msg " | [ I understand ] |"
1251 msg " +-------------------------------------------------------------+"
1253 # A LOT of build infrastructure is required:
1256 # - .ssh/config must be configured so the following
1257 # host names are reachable and have a compile
1258 # infrastructure set up:
1259 # - xonotic-build-linux32 (with gcc on x86)
1260 # - xonotic-build-linux64 (with gcc on x86_64)
1261 # - xonotic-build-win32 (with i586-mingw32msvc-g++)
1262 # - xonotic-build-win64 (with amd64-mingw32msvc-g++
1263 # and x86_64-w64-mingw32-g++)
1264 # - xonotic-build-osx (with Xcode and SDL.framework)
1265 # - AMD Compressonator installed in WINE
1266 # - ResEdit installed in WINE
1267 # - a lot of other requirements you will figure out
1268 # while reading the error messages
1269 # - environment variable RELEASETYPE set
1270 # - optionally, environment variable RELEASEDATE set
1275 verbose rm -rf Xonotic Xonotic*.zip
1276 verbose mkdir -p Xonotic
1277 if [ -n "$RELEASEDATE" ]; then
1278 verbose echo "$RELEASEDATE" > Xonotic/stamp.txt
1280 verbose date +%Y%m%d > Xonotic/stamp.txt
1282 verbose git archive --format=tar HEAD -- Docs misc server xonotic-linux-glx.sh xonotic-linux-sdl.sh misc/buildfiles key_0.d0pk | {
1284 verbose mkdir data fteqcc source source/darkplaces source/fteqcc
1286 verbose rm -rf misc/builddeps
1287 verbose mv misc/buildfiles/win32/* . || true
1288 verbose mv misc/buildfiles/win64 bin64 || true
1289 verbose mv misc/buildfiles/osx/* . || true
1290 verbose rm -rf misc/buildfiles
1291 verbose rm -rf misc/pki
1294 verbose cd darkplaces
1295 verbose git archive --format=tar HEAD
1297 verbose cd Xonotic/source/darkplaces
1302 verbose git archive --format=tar HEAD
1304 verbose cd Xonotic/source/fteqcc
1308 verbose cd data/xonotic-data.pk3dir
1309 verbose git archive --format=tar HEAD -- qcsrc Makefile
1311 verbose cd Xonotic/source
1314 rm -f Xonotic/key_15.d0pk
1316 release-compile-run)
1325 if [ -n "$targetfiles" ]; then
1326 case " $HOSTS_THAT_ARE_DISABLED " in
1331 case " $HOSTS_THAT_ARE_MYSELF " in
1333 verbose rsync --delete -zLvaSHP "$srcdir"/ "$buildpath/"
1334 verbose rsync --delete -zLvaSHP "$depsdir"/ "$buildpath.deps/"
1335 verbose ln -snf "$buildpath.deps" "$buildpath/.deps"
1336 verbose eval make -C "$buildpath" clean $maketargets $makeflags
1337 for f in $targetfiles; do
1338 verbose mv "$buildpath/${f%:*}" "${f##*:}" || true
1342 verbose rsync --delete -zLvaSHP "$srcdir"/ "$host:$buildpath/"
1343 verbose rsync --delete -zLvaSHP "$depsdir"/ "$host:$buildpath.deps/"
1344 verbose ssh "$host" "ln -snf $buildpath.deps $buildpath/.deps && cd $buildpath && nice -`nice` make clean $maketargets $makeflags"
1345 for f in $targetfiles; do
1346 verbose rsync -zvaSHP "$host:$buildpath/${f%:*}" "${f##*:}" || true
1350 # now rebrand the binaries...
1351 for f in $targetfiles; do
1352 #verbose "$d0/misc/tools/rebrand-darkplaces-engine.sh" "${XONOTIC_BRAND:-$d0/misc/tools/xonotic.brand}" "${f##*:}" || true
1355 verbose "$d0/misc/tools/change-icon-of-exe.sh" "$d0/misc/logos/icons_ico/xonotic.ico" "$f"
1357 d=`mktemp -d -t rebrand.XXXXXX`
1359 echo "-mygames" > darkplaces.opt
1360 zip -9r darkplaces.zip darkplaces.opt
1373 fteqcc_maketargets=$3
1375 darkplaces_maketargets=$5
1377 host=xonotic-build-$suffix
1378 verbose "$SELF" release-compile-run "$host" /tmp/fteqcc.build."$suffix" "$fteqcc_maketargets" "$makeflags" "Xonotic/source/fteqcc" "$d0/misc/builddeps/dp.$suffix" "$fteqcc_files"
1379 verbose "$SELF" release-compile-run "$host" /tmp/Darkplaces.build."$suffix" "$darkplaces_maketargets" "$makeflags" "Xonotic/source/darkplaces" "$d0/misc/builddeps/dp.$suffix" "$darkplaces_files"
1381 release-engine-win32)
1382 verbose "$SELF" release-compile win32 \
1383 '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' \
1384 win 'fteqcc.exe:Xonotic/fteqcc/fteqcc.exe' \
1386 verbose "$SELF" release-compile win32 \
1387 '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' \
1389 release 'darkplaces.exe:Xonotic/xonotic.exe darkplaces-sdl.exe:Xonotic/xonotic-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-dedicated.exe'
1391 release-engine-win64)
1392 verbose "$SELF" release-compile win64 \
1393 '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' \
1394 win 'fteqcc.exe:Xonotic/fteqcc/fteqcc-x64.exe' \
1395 'sv-release sdl-release' 'darkplaces-sdl.exe:Xonotic/xonotic-x64-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-x64-dedicated.exe'
1396 verbose "$SELF" release-compile win64 \
1397 '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' \
1399 cl-release 'darkplaces.exe:Xonotic/xonotic-x64.exe'
1402 # gcc on OSX is buggy, needs -fno-reorder-blocks for a release build to succeed
1403 verbose "$SELF" release-compile osx \
1404 '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"' \
1405 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.osx' \
1406 'sv-release sdl-release' 'darkplaces-sdl:Xonotic/Xonotic-SDL.app/Contents/MacOS/xonotic-osx-sdl-bin darkplaces-dedicated:Xonotic/xonotic-osx-dedicated'
1407 verbose "$SELF" release-compile osx \
1408 '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"' \
1410 'cl-release' 'darkplaces-agl:Xonotic/Xonotic.app/Contents/MacOS/xonotic-osx-agl-bin'
1412 release-engine-linux32)
1413 verbose "$SELF" release-compile linux32 \
1414 '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' \
1415 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.linux32' \
1416 release 'darkplaces-glx:Xonotic/xonotic-linux32-glx darkplaces-sdl:Xonotic/xonotic-linux32-sdl darkplaces-dedicated:Xonotic/xonotic-linux32-dedicated'
1418 release-engine-linux64)
1419 verbose "$SELF" release-compile linux64 \
1420 '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' \
1421 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.linux64' \
1422 release 'darkplaces-glx:Xonotic/xonotic-linux64-glx darkplaces-sdl:Xonotic/xonotic-linux64-sdl darkplaces-dedicated:Xonotic/xonotic-linux64-dedicated'
1425 verbose "$SELF" release-engine-linux32 &
1426 verbose "$SELF" release-engine-linux64 &
1427 verbose "$SELF" release-engine-win32 &
1428 verbose "$SELF" release-engine-win64 &
1429 verbose "$SELF" release-engine-osx &
1438 verbose "$SELF" update-maps
1441 case "$RELEASETYPE" in
1443 verbose make -C Xonotic/source FTEQCC="$d0/Xonotic/fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 clean all
1446 verbose make -C Xonotic/source FTEQCC="$d0/Xonotic/fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 FTEQCCFLAGS_WATERMARK= clean all
1449 verbose rm -f Xonotic/source/*/fteqcc.log
1451 release-buildpk3-transform-raw)
1454 release-buildpk3-transform-normal)
1457 # texture: convert to jpeg and dds
1458 verbose export do_jpeg=true
1459 verbose export jpeg_qual_rgb=95
1460 verbose export jpeg_qual_a=99
1461 verbose export do_dds=true
1462 verbose export dds_flags=
1463 verbose export do_ogg=false
1464 verbose export del_src=true
1465 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1467 release-buildpk3-transform-low)
1470 # texture: convert to jpeg and dds
1471 # music: reduce bitrate
1472 verbose export do_jpeg=true
1473 verbose export jpeg_qual_rgb=80
1474 verbose export jpeg_qual_a=95
1475 verbose export do_dds=false
1476 verbose export do_ogg=true
1477 verbose export ogg_qual=1
1478 verbose export del_src=true
1479 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1481 release-buildpk3-transform-lowdds)
1484 # texture: convert to jpeg and dds
1485 # music: reduce bitrate
1486 verbose export do_jpeg=false
1487 verbose export do_jpeg_if_not_dds=true
1488 verbose export jpeg_qual_rgb=80
1489 verbose export jpeg_qual_a=95
1490 verbose export do_dds=true
1491 verbose export dds_flags=
1492 verbose export do_ogg=true
1493 verbose export ogg_qual=1
1494 verbose export del_src=true
1495 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1508 verbose rm -rf Xonotic/temp
1509 verbose mkdir -p Xonotic/temp
1512 verbose git archive --format=tar HEAD
1514 verbose cd Xonotic/temp
1517 verbose cd Xonotic/temp
1518 if [ x"$src" = x"data/xonotic-data.pk3dir" ]; then
1519 verbose cp ../source/progs.dat .
1520 verbose cp ../source/csprogs.dat .
1521 verbose cp ../source/menu.dat .
1522 verbose rm -rf qcsrc
1523 gv=`grep "^gameversion " "defaultXonotic.cfg" | awk '{ print $2 }'`
1524 major=$(($gv / 10000))
1525 minor=$(($gv / 100 - $major * 100))
1526 patch=$(($gv - $major * 10000 - $minor * 100))
1527 versionstr="$major.$minor.$patch"
1528 case "$RELEASETYPE" in
1530 versionstr="$versionstr""beta"
1534 s/^set g_xonoticversion [^ ]* /set g_xonoticversion $versionstr /;
1535 s/^gameversion_min [0-9]*/gameversion_min $(( ($gv / 100) * 100 - 100 ))/;
1536 s/^gameversion_max [0-9]*/gameversion_max $(( ($gv / 100) * 100 + 199 ))/;
1537 " defaultXonotic.cfg
1539 verbose cd gfx/menu/luminos
1540 verbose cp "$d0"/mediasource/gfx/menu/luminos_versionbuilder/background_l2.svg .
1541 verbose "$d0"/mediasource/gfx/menu/luminos_versionbuilder/versionbuilder "$versionstr"
1542 verbose rm background_l2.svg
1545 if [ x"$src" = x"data/xonotic-maps.pk3dir" ]; then
1546 for X in ../../data/*-????????????????????????????????????????-????????????????????????????????????????.pk3; do
1547 if [ -f "$X" ]; then
1549 verbose rm -f maps/*.log maps/*.irc maps/*.lin
1553 verbose export git_src_repo="$d0/$src" # skip hash-object
1554 verbose "$SELF" release-buildpk3-transform-$transform "Xonotic/temp"
1555 verbose mkzip "../../$dst" *
1557 verbose rm -rf Xonotic/temp
1560 stamp=`cat Xonotic/stamp.txt`
1566 dst="data/xonotic-$stamp-${dst#data/xonotic-}"
1572 while [ "$#" -gt 1 ]; do
1573 verbose "$SELF" release-buildpk3 "$src" "Xonotic/$dst$2.pk3" "$1"
1579 verbose "$SELF" release-buildpk3s data/font-nimbussansl.pk3dir raw ''
1580 verbose "$SELF" release-buildpk3s data/xonotic-data.pk3dir normal '' raw '-raw' low '-low' lowdds '-lowdds'
1581 verbose "$SELF" release-buildpk3s data/xonotic-maps.pk3dir normal '' raw '-raw' low '-low' lowdds '-lowdds'
1582 verbose "$SELF" release-buildpk3s data/xonotic-music.pk3dir raw '' low '-low'
1583 verbose "$SELF" release-buildpk3s data/xonotic-nexcompat.pk3dir low ''
1585 release-pack-needsx11)
1588 verbose startx "$SELF" release-pack -- /usr/bin/Xvfb :7
1591 verbose "$SELF" release-pack
1596 stamp=`cat Xonotic/stamp.txt`
1597 # exe and dll files do not need +x, so this makes them eligible for 7zip compression too
1598 chmod a-x Xonotic/*.exe Xonotic/*.dll || true
1599 # let's pass crypto import laws of some nasty countries
1600 crypto_libs=`find Xonotic -name \*d0_rijndael\*`
1601 if [ -n "$crypto_libs" ]; then
1602 verbose mkzip Xonotic-$stamp-crypto.zip \
1606 # build the archives
1607 verbose mkzip Xonotic-$stamp-engine.zip \
1609 Xonotic/bin64/*.dll \
1612 Xonotic/xonotic.exe \
1613 Xonotic/source/darkplaces/
1614 verbose cp Xonotic-$stamp-engine.zip Xonotic-$stamp-common.zip
1615 verbose mkzip Xonotic-$stamp-common.zip \
1616 Xonotic/source/fteqcc/ \
1617 Xonotic/source/qcsrc/ \
1622 Xonotic/key_0.d0pk \
1623 Xonotic/data/font-nimbussansl-$stamp.pk3
1624 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp.zip
1625 verbose mkzip0 Xonotic-$stamp.zip \
1626 Xonotic/data/xonotic-$stamp-data.pk3 \
1627 Xonotic/data/xonotic-$stamp-maps.pk3 \
1628 Xonotic/data/xonotic-$stamp-music.pk3 \
1629 Xonotic/data/xonotic-$stamp-nexcompat.pk3
1630 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp-low.zip
1631 verbose mkzip0 Xonotic-$stamp-low.zip \
1632 Xonotic/data/xonotic-$stamp-data-low.pk3 \
1633 Xonotic/data/xonotic-$stamp-maps-low.pk3 \
1634 Xonotic/data/xonotic-$stamp-music-low.pk3
1635 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp-lowdds.zip
1636 verbose mkzip0 Xonotic-$stamp-lowdds.zip \
1637 Xonotic/data/xonotic-$stamp-data-lowdds.pk3 \
1638 Xonotic/data/xonotic-$stamp-maps-lowdds.pk3 \
1639 Xonotic/data/xonotic-$stamp-music-low.pk3
1640 verbose mv Xonotic-$stamp-common.zip Xonotic-$stamp-high.zip
1641 verbose mkzip0 Xonotic-$stamp-high.zip \
1642 Xonotic/data/xonotic-$stamp-data-raw.pk3 \
1643 Xonotic/data/xonotic-$stamp-maps-raw.pk3 \
1644 Xonotic/data/xonotic-$stamp-music.pk3 \
1645 Xonotic/data/xonotic-$stamp-nexcompat.pk3
1648 verbose "$SELF" release-prepare
1649 verbose "$SELF" release-maps
1650 verbose "$SELF" release-engine
1651 verbose "$SELF" release-qc
1652 verbose "$SELF" release-pack-needsx11
1653 verbose "$SELF" release-zip
1658 echo " $SELF admin-merge [<branch>]"
1659 echo " $SELF branch <branch>"
1660 echo " $SELF branch <remote> <branch> [<srcbranch>]"
1661 echo " $SELF branches"
1662 echo " $SELF checkout|switch <branch>"
1663 echo " $SELF checkout|switch <remote>/<branch>"
1664 echo " $SELF clean [-m] [-f | -fu | -fU] [-r] [-D]"
1665 echo " $SELF clean --reclone"
1666 echo " $SELF compile [-c]"
1667 echo " $SELF each|foreach [-k] command..."
1668 echo " $SELF fix_upstream_rebase"
1670 echo " $SELF push|commit [-s]"
1671 echo " $SELF release"
1672 echo " $SELF restore-patches"
1673 echo " $SELF run [sdl|glx|wgl|agl|dedicated] options..."
1674 echo " $SELF save-patches"
1675 echo " $SELF update-maps"
1676 echo " $SELF update|pull [-N]"