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."
411 if [ x"$1" = x"-N" ]; then
413 elif [ x"$1" = x"-p" ]; then
415 if [ x"$base" != x"ssh://xonotic@git.xonotic.org/" ]; then
416 pushbase=ssh://xonotic@git.xonotic.org/
418 elif [ x"$1" = x"-s" ]; then
420 base=ssh://xonotic@git.xonotic.org/
422 elif [ x"$1" = x"-g" ]; then
424 base=git://git.xonotic.org/xonotic/
425 elif [ x"$1" = x"-h" ]; then
427 base=http://git.xonotic.org/xonotic/
428 elif [ x"$1" = x"-l" ]; then
434 msg "Invalid location!"
435 msg "Possible locations for the -l option:"
436 msg " nl (Netherlands, run by merlijn)"
437 msg " de (Germany, run by divVerent)"
438 msg " default (currently nl)"
456 *://*.git.xonotic.org/*)
457 location=${base%%.git.xonotic.org/*}
458 location=${location##*://}
466 if [ -n "$location" ]; then
467 base=`echo "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,://$location.git.xonotic.org/,"`
468 pushbase=`echo "$pushbase" | sed "s,://\(.*\.\)\?git.xonotic.org/,://$location.git.xonotic.org/,"`
470 base=`echo "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,://git.xonotic.org/,"`
471 pushbase=`echo "$pushbase" | sed "s,://\(.*\.\)\?git.xonotic.org/,://git.xonotic.org/,"`
475 pushurl=`repopushurl .`
476 fix_git_config "$url" "$pushurl"
478 if $allow_pull || $fix_config; then
483 pushurl=`repopushurl "$d"`
484 branch=`repobranch "$d"`
485 if [ -d "$d0/$d" ]; then
487 enter "$d0/$d" verbose
488 r=`git symbolic-ref HEAD`
490 if git config branch.$r.remote >/dev/null 2>&1; then
491 if ! verbose git pull; then
492 fix_upstream_rebase_mergefail || true
493 check_mergeconflict "$d"
494 echo "Pulling failed. Press ENTER to continue, or Ctrl-C to abort."
497 fix_upstream_rebase_mergeok || true
502 checkself "$cmd" "$@"
504 verbose git remote prune origin
508 verbose git clone "$url" "$d0/$d"
509 enter "$d0/$d" verbose
510 fix_git_config "$url" "$pushurl"
511 if [ "$branch" != "master" ]; then
512 verbose git checkout --track -b "$branch" origin/"$branch"
519 misc/tools/xonotic-map-compiler-autobuild download
523 if [ x"$1" = x"-f" ]; then
529 if [ -z "$branch" ]; then
532 branch=${remote#origin/}
543 enter "$d0/$d" verbose
545 if [ -n "$b" ] && git rev-parse "refs/heads/$b" >/dev/null 2>&1; then
547 verbose git checkout $checkoutflags "$b"
548 elif [ -n "$b" ] && git rev-parse "refs/remotes/$remote/$b" >/dev/null 2>&1; then
550 verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
553 if git rev-parse "refs/heads/$b" >/dev/null 2>&1; then
555 verbose git checkout $checkoutflags "$b"
556 elif git rev-parse "refs/remotes/$remote/$b" >/dev/null 2>&1; then
558 verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
560 echo "WTF? Not even branch $b doesn't exist in $d"
565 checkself "$cmd" "$@"
569 echo "The requested branch was not found in any repository."
577 if [ -z "$branch" ]; then
581 if [ -z "$branch" ]; then
584 r=`git symbolic-ref HEAD`
591 dv=`visible_repo_name "$d"`
592 enter "$d0/$d" verbose
593 if git rev-parse "refs/heads/$branch" >/dev/null 2>&1; then
594 echo "Already having this branch in $dv."
596 if yesno "Branch in $dv?"; then
597 if [ -n "$srcbranch" ]; then
600 b=origin/"`repobranch "$d"`"
601 verbose git fetch origin || true
603 # TODO do this without pushing
604 verbose git checkout -b "$branch" "$b"
605 verbose git config "branch.$branch.remote" "$remote"
606 verbose git config "branch.$branch.merge" "refs/heads/$branch"
616 cd "$d0/$d" # am in a pipe, shouldn't use enter
617 git branch -r -v -v | cut -c 3- | sed "s/^(no branch)/(no_branch)/" | sed "s,^,$d ,"
622 while read -r d BRANCH REV TEXT; do
623 if [ x"$BRANCH" = x"`repobranch "$d"`" ]; then
626 if [ x"$REV" = x"->" ]; then
629 BRANCH=${BRANCH#remotes/}
630 ID=`echo "$BRANCH" | tr -c "A-Za-z0-9." "_"`
631 branches_list="$branches_list $BRANCH" # TEH SORT MAKEZ IT UNIEQ
632 eval "r=\$branches_repos_$ID"
634 eval "branches_repos_$ID=\$r"
636 echo -n "$branches_list" | xargs -n 1 echo | sort -u | while IFS= read -r BRANCH; do
637 ID=`echo "$BRANCH" | tr -c "A-Za-z0-9." "_"`
638 eval "r=\$branches_repos_$ID"
639 printf "%-60s %s\n" "$BRANCH" "$r"
646 dv=`visible_repo_name "$d"`
647 enter "$d0/$d" verbose
648 r=`git symbolic-ref HEAD`
650 if git log HEAD..origin/"`repobranch "$d"`" | grep .; then
651 # we have uncommitted changes
652 if yesno "Could merge from \"`repobranch "$d"`\" into \"$r\" in $dv. Do it?"; then
653 if ! verbose git merge origin/"`repobranch "$d"`"; then
654 check_mergeconflict "$d"
655 exit 1 # this should ALWAYS be fatal
665 dv=`visible_repo_name "$d"`
666 enter "$d0/$d" verbose
667 r=`git symbolic-ref HEAD`
669 diffdata=`git diff --color HEAD`
670 if [ -n "$diffdata" ]; then
671 # we have uncommitted changes
672 if yesno "Uncommitted changes in \"$r\" in $dv. Commit?" 'echo "$diffdata" | less -r'; then
673 verbose git commit -a
676 rem=`git config "branch.$r.remote" || echo origin`
677 bra=`git config "branch.$r.merge" || echo "$r"`
678 upstream="$rem/${bra#refs/heads/}"
679 if ! git rev-parse "$upstream" >/dev/null 2>&1; then
680 upstream="origin/`repobranch "$d"`"
682 logdata=`git log --color "$upstream".."$r"`
683 if [ -n "$logdata" ]; then
684 if yesno "Push \"$r\" in $dv?" 'echo "$logdata" | less -r'; then
685 verbose git push "$rem" HEAD
688 if [ x"$submit" = x"-s" ]; then
691 verbose git push "$rem" HEAD:"${bra%%/*}/finished/${bra#*/}"
705 if [ -z "$CC" ]; then
706 export CC="gcc -DSUPPORTIPV6"
722 export CC="$CC -g -mtune=native -march=native"
730 if [ -n "$WE_HATE_OUR_USERS" ]; then
731 TARGETS="sv-$debug cl-$debug"
732 elif [ x"`uname`" = x"Darwin" ]; then
735 TARGETS="sv-$debug cl-$debug sdl-$debug"
738 # AGL cannot be compiled on systems with a kernel > 10.x (Snow Leopard)
739 TARGETS="sv-$debug sdl-$debug"
742 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"
744 TARGETS="sv-$debug cl-$debug sdl-$debug"
746 if [ $# -gt 0 ] && [ x"$1" = x"" ]; then
747 # if we give the command make the arg "", it will surely fail (invalid filename),
748 # so better handle it as an empty client option
751 elif [ -n "$1" ]; then
753 TARGETS_SAVE=$TARGETS
758 TARGETS="$TARGETS sdl-debug"
761 TARGETS="$TARGETS cl-debug"
764 TARGETS="$TARGETS sv-debug"
767 BAD_TARGETS="$BAD_TARGETS $X"
771 if [ -n "$TARGETS" ]; then # at least a valid client
773 else # no valid client, let's assume this option is not meant to be a client then
774 TARGETS=$TARGETS_SAVE
778 if [ -z "$MAKEFLAGS" ]; then
779 if [ -f /proc/cpuinfo ]; then
780 ncpus=$((`grep -c '^processor :' /proc/cpuinfo`+0))
781 if [ $ncpus -gt 1 ]; then
785 if [ -n "$WE_HATE_OUR_USERS" ]; then
786 MAKEFLAGS="$MAKEFLAGS DP_MAKE_TARGET=mingw LIB_JPEG= CFLAGS_LIBJPEG="
790 enter "$d0/d0_blind_id" verbose
791 if ! $compiled0; then
792 # compilation of crypto library failed
793 # use binaries then, if we can...
795 if [ -n "$WE_HATE_OUR_USERS" ]; then
796 verbose cp "$d0/misc/buildfiles/win32/libd0_blind_id"-* .libs/
797 verbose cp "$d0/misc/buildfiles/win32/libgmp"-* .libs/
803 verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_blind_id".* .libs/
804 verbose cp "$d0/misc/builddeps/dp.linux64/lib/libgmp".* .libs/
805 MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/"
808 verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_blind_id".* .libs/
809 verbose cp "$d0/misc/builddeps/dp.linux32/lib/libgmp".* .libs/
810 MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/"
818 verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_blind_id".* .libs/
828 if [ -f Makefile ]; then
829 verbose make $MAKEFLAGS distclean
832 if ! [ -f Makefile ]; then
833 verbose sh autogen.sh
836 verbose make $MAKEFLAGS
839 enter "$d0/fteqcc" verbose
841 verbose make $MAKEFLAGS clean
843 verbose make $MAKEFLAGS
845 enter "$d0/data/xonotic-data.pk3dir" verbose
847 verbose make FTEQCC="../../../../fteqcc/fteqcc.bin" "$@" $MAKEFLAGS clean
849 verbose make FTEQCC="../../../../fteqcc/fteqcc.bin" "$@" $MAKEFLAGS
850 # 4 levels up: data, xonotic-data, qcsrc, server
852 enter "$d0/darkplaces" verbose
853 if [ x"$BAD_TARGETS" = x" " ]; then
854 echo "Warning: invalid empty client, default clients will be used."
857 verbose make $MAKEFLAGS clean
859 for T in $TARGETS; do
860 verbose make $MAKEFLAGS STRIP=: "$@" "$T"
862 for T in $BAD_TARGETS; do
863 echo "Warning: discarded invalid client $T."
866 verbose "$SELF" update-maps
869 if [ -n "$WE_HATE_OUR_USERS" ]; then
871 export PATH="$d0/misc/buildfiles/win32:$d0/d0_blind_id/.libs:$PATH"
872 elif [ x"`uname`" = x"Darwin" ]; then
873 export DYLD_LIBRARY_PATH="$d0/misc/buildfiles/osx/Xonotic-SDL.app/Contents/MacOS:$d0/d0_blind_id/.libs"
874 export DYLD_FRAMEWORK_PATH="$d0/misc/buildfiles/osx/Xonotic-SDL.app/Contents/Frameworks"
877 export LD_LIBRARY_PATH="$d0/d0_blind_id/.libs"
881 sdl|glx|agl|dedicated)
890 if ! [ -x "darkplaces/darkplaces$client" ]; then
891 if [ -x "darkplaces/darkplaces$client.exe" ]; then
894 echo "Client darkplaces/darkplaces$client not found, aborting"
898 set -- "darkplaces/darkplaces$client" -xonotic -mygames "$@"
900 # if pulseaudio is running: USE IT
901 if [ -z "$SDL_AUDIODRIVER" ] && ! [ -n "$WE_HATE_OUR_USERS" ] && ! [ x"`uname`" = x"Darwin" ]; then
902 if ps -C pulseaudio >/dev/null; then
903 if ldd /usr/lib/libSDL.so 2>/dev/null | grep pulse >/dev/null; then
904 export SDL_AUDIODRIVER=pulse
911 if [ -n "$USE_GDB" ]; then
912 set -- gdb --args "$@"
913 elif which gdb >/dev/null 2>&1; then
914 set -- gdb --batch -x savecore.gdb --args "$@"
915 elif which catchsegv >/dev/null 2>&1; then
916 set -- catchsegv "$@"
920 if [ -f xonotic.core ]; then
921 if yesno "The program has CRASHED. Do you want to examine the core dump?"; then
922 gdb "$binary" xonotic.core
923 #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
924 # tar cvzf xonotic.core.tar.gz xonotic.core darkplaces/*.c darkplaces/*.h
926 # rm -f xonotic.core.tar.gz
928 echo "The core dump can be examined later by"
929 echo " gdb $binary xonotic.core"
935 if [ x"$1" = x"-k" ]; then
940 if verbose cd "$d0/$d"; then
952 patchdir=`mktemp -d -t save-patches.XXXXXX`
954 enter "$d0/$d" verbose
955 git branch -v -v | cut -c 3- | {
957 while read -r BRANCH REV UPSTREAM TEXT; do
960 UPSTREAM=${UPSTREAM#\[}
961 UPSTREAM=${UPSTREAM%\]}
962 UPSTREAM=${UPSTREAM%:*}
966 UPSTREAM=origin/"`repobranch "$d"`"
970 if [ x"$REV" = x"->" ]; then
973 if git format-patch -o "$patchdir/$i" "$UPSTREAM".."$BRANCH"; then
974 echo "$d" > "$patchdir/$i/info.txt"
975 echo "$BRANCH" >> "$patchdir/$i/info.txt"
976 echo "$UPSTREAM" >> "$patchdir/$i/info.txt"
977 echo "$TRACK" >> "$patchdir/$i/info.txt"
980 rm -rf "$patchdir/$i"
985 ( cd "$patchdir" && tar cvzf - . ) > "$outfile"
990 patchdir=`mktemp -d -t restore-patches.XXXXXX`
991 ( cd "$patchdir" && tar xvzf - ) < "$infile"
993 for P in "$patchdir"/*/info.txt; do
1000 verbose git checkout HEAD^0
1001 verbose git branch -D "$BRANCH"
1002 if [ x"$TRACK" = x"true" ]; then
1003 verbose git checkout --track -b "$BRANCH" "$UPSTREAM"
1005 verbose git branch -b "$BRANCH" "$UPSTREAM"
1017 report=$report"$*$LF"
1022 report=$report" $*$LF"
1027 o=`"$@" | sed 's/^/ /' || true`
1031 enter "$d0/$d" verbose
1032 base="`repobranch "$d"`"
1034 for ref in `git for-each-ref --format='%(refname)' refs/remotes/origin/`; do
1035 case "${ref#refs/remotes/origin/}" in
1048 if [ -n "$branch" ]; then
1049 if [ x"$branch" != x"${ref#refs/remotes/origin/}" ]; then
1058 l0=`git rev-list "$base".."$ref" | wc -l`
1059 l1=`git rev-list master.."$ref" | wc -l`
1060 if [ $l0 -gt $l1 ]; then
1067 reportecho " Branch $ref:"
1068 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1069 logdata=`git log --color "$realbase".."$ref"`
1070 if [ -z "$logdata" ]; then
1071 reportecho4 "--> not merging, no changes vs master"
1072 if yesno "Branch \"$ref\" probably should get deleted. Do it?" ''; then
1073 git push origin :"${ref#refs/remotes/origin/}"
1074 reportecho4 "--> branch deleted"
1077 diffdata=`git diff --color --find-copies-harder --ignore-space-change "$realbase"..."$ref"`
1078 if [ -z "$diffdata" ]; then
1079 reportecho4 "--> not merging, no changes vs master, branch contains redundant history"
1080 if yesno "Branch \"$ref\" probably should get deleted. Do it?" '{ echo "$logdata"; } | less -r'; then
1081 git push origin :"${ref#refs/remotes/origin/}"
1082 reportecho4 "--> branch deleted"
1084 elif [ -z "$branch" ] && [ -n "$note" ]; then
1085 reportdo4 echo "$note"
1086 reportecho4 "--> not merging, already had this one rejected before"
1087 elif yesno "Branch \"$ref\" may want to get merged. Do it?" '{ echo "$logdata"; echo "$diffdata"; } | less -r'; then
1088 git checkout "$realbase"
1089 org=`git rev-parse HEAD`
1090 if ! git merge --no-ff "$ref" 2>&1 | tee "$t" && ! { git ls-files -u | grep ' 1 ' >/dev/null; }; then
1091 git reset --hard "$org"
1092 GIT_NOTES_REF=refs/notes/admin-merge git notes edit -m "Merge failed:$LF`cat "$t"`" "$ref"
1094 reportecho4 "--> merge failed"
1095 elif ! "$SELF" compile 2>&1 | tee "$t"; then
1096 git reset --hard "$org"
1097 GIT_NOTES_REF=refs/notes/admin-merge git notes edit -m "Compile failed:$LF`cat "$t"`" "$ref"
1099 reportecho4 "--> compile failed"
1100 elif ! yesno "Still merge \"$ref\" into `git symbolic-ref HEAD` of $d? Maybe you want to test first."; then
1101 git reset --hard "$org"
1102 GIT_NOTES_REF=refs/notes/admin-merge git notes edit "$ref"
1103 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1104 if [ x"$note" = x"del" ]; then
1105 git push origin :"${ref#refs/remotes/origin/}"
1106 reportecho4 "--> test failed, branch deleted"
1107 elif [ -n "$note" ]; then
1108 reportdo4 echo "$note"
1109 reportecho4 "--> test failed"
1111 reportecho4 "--> test failed, postponed"
1115 case ",`repoflags "$d"`," in
1117 # we do quite a mess here... luckily we know $org
1118 git fetch # svn needs to be current
1119 git rebase -i --onto origin/master "$org"
1120 git svn dcommit --add-author-from
1121 git reset --hard "$org"
1124 git push origin HEAD
1127 reportecho4 "--> MERGED"
1128 if yesno "Delete original branch \"$ref\"?"; then
1129 git push origin :"${ref#refs/remotes/origin/}"
1130 reportecho4 "--> branch deleted"
1134 GIT_NOTES_REF=refs/notes/admin-merge git notes edit "$ref"
1135 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1136 if [ x"$note" = x"del" ]; then
1137 git push origin :"${ref#refs/remotes/origin/}"
1138 reportecho4 "--> branch deleted"
1139 elif [ -n "$note" ]; then
1140 reportdo4 echo "$note"
1141 reportecho4 "--> rejected"
1143 reportecho4 "--> postponed"
1152 echo "$report" | ssh nexuiz@rm.endoftheinternet.org cat '>>' public_html/xonotic-merge-notes.txt
1164 # ./all clean [-m] [-f | -fu | -fU] [-r] [-D]
1165 # ./all clean --reclone
1168 if [ x"$1" = x"--reclone" ]; then
1175 elif [ x"$1" = x"-f" ]; then
1177 elif [ x"$1" = x"-u" ]; then
1179 elif [ x"$1" = x"-U" ]; then
1182 elif [ x"$1" = x"-fu" ]; then
1185 elif [ x"$1" = x"-fU" ]; then
1189 elif [ x"$1" = x"-m" ]; then
1191 elif [ x"$1" = x"-r" ]; then
1193 elif [ x"$1" = x"-D" ]; then
1206 if $gotoupstream; then
1208 msg "Must also use -f (delete local changes) when using -u"
1211 if $gotomaster; then
1212 if $fetchupstream; then
1213 verbose git fetch origin
1214 verbose git remote prune origin
1216 verbose git checkout -f "`repobranch "$d"`"
1217 verbose git reset --hard origin/"`repobranch "$d"`"
1219 r=`git symbolic-ref HEAD`
1221 rem=`git config "branch.$r.remote" || echo origin`
1222 bra=`git config "branch.$r.merge" || echo "$r"`
1223 upstream="$rem/${bra#refs/heads/}"
1224 if $fetchupstream; then
1225 verbose git fetch "$rem"
1226 verbose git remote prune "$rem"
1228 if ! git rev-parse "$upstream" >/dev/null 2>&1; then
1229 upstream="origin/`repobranch "$d"`"
1231 verbose git reset --hard "$upstream"
1233 elif $gotomaster; then
1235 verbose git checkout -f "`repobranch "$d"`"
1236 verbose git reset --hard
1238 verbose git checkout "`repobranch "$d"`"
1241 verbose git reset --hard
1243 if $rmuntracked; then
1246 verbose git clean -df
1249 verbose git clean -xdf
1253 if $killbranches; then
1254 git for-each-ref --format='%(refname)' refs/heads/ | while IFS= read -r B; do
1255 if [ x"$B" != x"`git symbolic-ref HEAD`" ]; then
1256 verbose git branch -D "${B#refs/heads/}"
1259 git rev-parse refs/heads/master >/dev/null 2>&1 || verbose git branch -t master origin/master || true
1260 git rev-parse "refs/heads/`repobranch "$d"`" >/dev/null 2>&1 || verbose git branch -t "`repobranch "$d"`" origin/"`repobranch "$d"`" || true
1265 # release building goes here
1267 #"$SELF" each git clean -fxd
1268 case "$RELEASETYPE" in
1270 msg "Building a BETA"
1273 msg "Building a RELEASE"
1276 echo >&2 -n "$ESC[2J$ESC[H"
1283 msg " +---------------------------------------------------------.---+"
1285 msg " +---------------------------------------------------------^---+"
1287 msg " | / \ This is the official release build system. |"
1288 msg " | | | If you are not a member of the Xonotic Core Team, |"
1289 msg " | | STOP | you are not supposed to use this script and should |"
1290 msg " | | | instead use ./all compile to compile the engine |"
1291 msg " | \____/ and game code. |"
1293 msg " | [ I understand ] |"
1294 msg " +-------------------------------------------------------------+"
1296 # A LOT of build infrastructure is required:
1299 # - .ssh/config must be configured so the following
1300 # host names are reachable and have a compile
1301 # infrastructure set up:
1302 # - xonotic-build-linux32 (with gcc on x86)
1303 # - xonotic-build-linux64 (with gcc on x86_64)
1304 # - xonotic-build-win32 (with i586-mingw32msvc-g++)
1305 # - xonotic-build-win64 (with amd64-mingw32msvc-g++
1306 # and x86_64-w64-mingw32-g++)
1307 # - xonotic-build-osx (with Xcode and SDL.framework)
1308 # - AMD Compressonator installed in WINE
1309 # - ResEdit installed in WINE
1310 # - a lot of other requirements you will figure out
1311 # while reading the error messages
1312 # - environment variable RELEASETYPE set
1313 # - optionally, environment variable RELEASEDATE set
1318 verbose rm -rf Xonotic Xonotic*.zip
1319 verbose mkdir -p Xonotic
1320 if [ -n "$RELEASEDATE" ]; then
1321 verbose echo "$RELEASEDATE" > Xonotic/stamp.txt
1323 verbose date +%Y%m%d > Xonotic/stamp.txt
1325 verbose git archive --format=tar HEAD -- Docs misc server xonotic-linux-glx.sh xonotic-linux-sdl.sh misc/buildfiles key_0.d0pk | {
1327 verbose mkdir data fteqcc source source/darkplaces source/fteqcc
1329 verbose rm -rf misc/builddeps
1330 verbose mv misc/buildfiles/win32/* . || true
1331 verbose mv misc/buildfiles/win64 bin64 || true
1332 verbose mv misc/buildfiles/osx/* . || true
1333 verbose rm -rf misc/buildfiles
1334 verbose rm -rf misc/pki
1337 verbose cd darkplaces
1338 verbose git archive --format=tar HEAD
1340 verbose cd Xonotic/source/darkplaces
1345 verbose git archive --format=tar HEAD
1347 verbose cd Xonotic/source/fteqcc
1351 verbose cd data/xonotic-data.pk3dir
1352 verbose git archive --format=tar HEAD -- qcsrc Makefile
1354 verbose cd Xonotic/source
1357 rm -f Xonotic/key_15.d0pk
1359 release-compile-run)
1368 if [ -n "$targetfiles" ]; then
1369 case " $HOSTS_THAT_ARE_DISABLED " in
1374 case " $HOSTS_THAT_ARE_MYSELF " in
1376 verbose rsync --delete -zLvaSHP "$srcdir"/ "$buildpath/"
1377 verbose rsync --delete -zLvaSHP "$depsdir"/ "$buildpath.deps/"
1378 verbose ln -snf "$buildpath.deps" "$buildpath/.deps"
1379 verbose eval make -C "$buildpath" clean $maketargets $makeflags
1380 for f in $targetfiles; do
1381 verbose mv "$buildpath/${f%:*}" "${f##*:}" || true
1385 verbose rsync --delete -zLvaSHP "$srcdir"/ "$host:$buildpath/"
1386 verbose rsync --delete -zLvaSHP "$depsdir"/ "$host:$buildpath.deps/"
1387 verbose ssh "$host" "ln -snf $buildpath.deps $buildpath/.deps && cd $buildpath && nice -`nice` make clean $maketargets $makeflags"
1388 for f in $targetfiles; do
1389 verbose rsync -zvaSHP "$host:$buildpath/${f%:*}" "${f##*:}" || true
1393 # now rebrand the binaries...
1394 for f in $targetfiles; do
1395 #verbose "$d0/misc/tools/rebrand-darkplaces-engine.sh" "${XONOTIC_BRAND:-$d0/misc/tools/xonotic.brand}" "${f##*:}" || true
1398 verbose "$d0/misc/tools/change-icon-of-exe.sh" "$d0/misc/logos/icons_ico/xonotic.ico" "$f"
1400 d=`mktemp -d -t rebrand.XXXXXX`
1402 echo "-mygames" > darkplaces.opt
1403 zip -9r darkplaces.zip darkplaces.opt
1416 fteqcc_maketargets=$3
1418 darkplaces_maketargets=$5
1420 host=xonotic-build-$suffix
1421 verbose "$SELF" release-compile-run "$host" /tmp/fteqcc.build."$suffix" "$fteqcc_maketargets" "$makeflags" "Xonotic/source/fteqcc" "$d0/misc/builddeps/dp.$suffix" "$fteqcc_files"
1422 verbose "$SELF" release-compile-run "$host" /tmp/Darkplaces.build."$suffix" "$darkplaces_maketargets" "$makeflags" "Xonotic/source/darkplaces" "$d0/misc/builddeps/dp.$suffix" "$darkplaces_files"
1424 release-engine-win32)
1425 verbose "$SELF" release-compile win32 \
1426 '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' \
1427 win 'fteqcc.exe:Xonotic/fteqcc/fteqcc.exe' \
1429 verbose "$SELF" release-compile win32 \
1430 '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' \
1432 release 'darkplaces.exe:Xonotic/xonotic.exe darkplaces-sdl.exe:Xonotic/xonotic-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-dedicated.exe'
1434 release-engine-win64)
1435 verbose "$SELF" release-compile win64 \
1436 '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' \
1437 win 'fteqcc.exe:Xonotic/fteqcc/fteqcc-x64.exe' \
1438 'sv-release sdl-release' 'darkplaces-sdl.exe:Xonotic/xonotic-x64-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-x64-dedicated.exe'
1439 verbose "$SELF" release-compile win64 \
1440 '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' \
1442 cl-release 'darkplaces.exe:Xonotic/xonotic-x64.exe'
1445 # gcc on OSX is buggy, needs -fno-reorder-blocks for a release build to succeed
1446 verbose "$SELF" release-compile osx \
1447 '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"' \
1448 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.osx' \
1449 'sv-release sdl-release' 'darkplaces-sdl:Xonotic/Xonotic-SDL.app/Contents/MacOS/xonotic-osx-sdl-bin darkplaces-dedicated:Xonotic/xonotic-osx-dedicated'
1450 verbose "$SELF" release-compile osx \
1451 '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"' \
1453 'cl-release' 'darkplaces-agl:Xonotic/Xonotic.app/Contents/MacOS/xonotic-osx-agl-bin'
1455 release-engine-linux32)
1456 verbose "$SELF" release-compile linux32 \
1457 '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' \
1458 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.linux32' \
1459 release 'darkplaces-glx:Xonotic/xonotic-linux32-glx darkplaces-sdl:Xonotic/xonotic-linux32-sdl darkplaces-dedicated:Xonotic/xonotic-linux32-dedicated'
1461 release-engine-linux64)
1462 verbose "$SELF" release-compile linux64 \
1463 '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' \
1464 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.linux64' \
1465 release 'darkplaces-glx:Xonotic/xonotic-linux64-glx darkplaces-sdl:Xonotic/xonotic-linux64-sdl darkplaces-dedicated:Xonotic/xonotic-linux64-dedicated'
1468 verbose "$SELF" release-engine-linux32 &
1469 verbose "$SELF" release-engine-linux64 &
1470 verbose "$SELF" release-engine-win32 &
1471 verbose "$SELF" release-engine-win64 &
1472 verbose "$SELF" release-engine-osx &
1481 verbose "$SELF" update-maps
1484 case "$RELEASETYPE" in
1486 verbose make -C Xonotic/source FTEQCC="../fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 clean all
1489 verbose make -C Xonotic/source FTEQCC="../fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 FTEQCCFLAGS_WATERMARK= clean all
1492 verbose rm -f Xonotic/source/*/fteqcc.log
1494 release-buildpk3-transform-raw)
1497 release-buildpk3-transform-normal)
1500 # texture: convert to jpeg and dds
1501 verbose export do_jpeg=true
1502 verbose export jpeg_qual_rgb=95
1503 verbose export jpeg_qual_a=99
1504 verbose export do_dds=true
1505 verbose export dds_flags=
1506 verbose export do_ogg=false
1507 verbose export del_src=true
1508 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1510 release-buildpk3-transform-low)
1513 # texture: convert to jpeg and dds
1514 # music: reduce bitrate
1515 verbose export do_jpeg=true
1516 verbose export jpeg_qual_rgb=80
1517 verbose export jpeg_qual_a=95
1518 verbose export do_dds=false
1519 verbose export do_ogg=true
1520 verbose export ogg_qual=1
1521 verbose export del_src=true
1522 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1524 release-buildpk3-transform-lowdds)
1527 # texture: convert to jpeg and dds
1528 # music: reduce bitrate
1529 verbose export do_jpeg=false
1530 verbose export do_jpeg_if_not_dds=true
1531 verbose export jpeg_qual_rgb=80
1532 verbose export jpeg_qual_a=95
1533 verbose export do_dds=true
1534 verbose export dds_flags=
1535 verbose export do_ogg=true
1536 verbose export ogg_qual=1
1537 verbose export del_src=true
1538 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1551 verbose rm -rf Xonotic/temp
1552 verbose mkdir -p Xonotic/temp
1555 verbose git archive --format=tar HEAD
1557 verbose cd Xonotic/temp
1560 verbose cd Xonotic/temp
1561 if [ x"$src" = x"data/xonotic-data.pk3dir" ]; then
1562 verbose cp ../source/progs.dat .
1563 verbose cp ../source/csprogs.dat .
1564 verbose cp ../source/menu.dat .
1565 verbose rm -rf qcsrc
1566 gv=`grep "^gameversion " "defaultXonotic.cfg" | awk '{ print $2 }'`
1567 major=$(($gv / 10000))
1568 minor=$(($gv / 100 - $major * 100))
1569 patch=$(($gv - $major * 10000 - $minor * 100))
1570 versionstr="$major.$minor.$patch"
1571 case "$RELEASETYPE" in
1573 versionstr="$versionstr""beta"
1577 s/^set g_xonoticversion [^ ]* /set g_xonoticversion $versionstr /;
1578 s/^gameversion_min [0-9]*/gameversion_min $(( ($gv / 100) * 100 - 100 ))/;
1579 s/^gameversion_max [0-9]*/gameversion_max $(( ($gv / 100) * 100 + 199 ))/;
1580 " defaultXonotic.cfg
1582 verbose cd gfx/menu/luminos
1583 verbose cp "$d0"/mediasource/gfx/menu/luminos_versionbuilder/background_l2.svg .
1584 verbose "$d0"/mediasource/gfx/menu/luminos_versionbuilder/versionbuilder "$versionstr"
1585 verbose rm background_l2.svg
1588 if [ x"$src" = x"data/xonotic-maps.pk3dir" ]; then
1589 for X in ../../data/*-????????????????????????????????????????-????????????????????????????????????????.pk3; do
1590 if [ -f "$X" ]; then
1592 verbose rm -f maps/*.log maps/*.irc maps/*.lin
1596 verbose export git_src_repo="$d0/$src" # skip hash-object
1597 verbose "$SELF" release-buildpk3-transform-$transform "Xonotic/temp"
1598 verbose mkzip "../../$dst" *
1600 verbose rm -rf Xonotic/temp
1603 stamp=`cat Xonotic/stamp.txt`
1609 dst="data/xonotic-$stamp-${dst#data/xonotic-}"
1615 while [ "$#" -gt 1 ]; do
1616 verbose "$SELF" release-buildpk3 "$src" "Xonotic/$dst$2.pk3" "$1"
1622 verbose "$SELF" release-buildpk3s data/font-nimbussansl.pk3dir raw ''
1623 verbose "$SELF" release-buildpk3s data/xonotic-data.pk3dir normal '' raw '-raw' low '-low' lowdds '-lowdds'
1624 verbose "$SELF" release-buildpk3s data/xonotic-maps.pk3dir normal '' raw '-raw' low '-low' lowdds '-lowdds'
1625 verbose "$SELF" release-buildpk3s data/xonotic-music.pk3dir raw '' low '-low'
1626 verbose "$SELF" release-buildpk3s data/xonotic-nexcompat.pk3dir low ''
1628 release-pack-needsx11)
1631 verbose startx "$SELF" release-pack -- /usr/bin/Xvfb :7
1634 verbose "$SELF" release-pack
1639 stamp=`cat Xonotic/stamp.txt`
1640 # exe and dll files do not need +x, so this makes them eligible for 7zip compression too
1641 chmod a-x Xonotic/*.exe Xonotic/*.dll || true
1642 # let's pass crypto import laws of some nasty countries
1643 crypto_libs=`find Xonotic -name \*d0_rijndael\*`
1644 if [ -n "$crypto_libs" ]; then
1645 verbose mkzip Xonotic-$stamp-crypto.zip \
1649 # build the archives
1650 verbose mkzip Xonotic-$stamp-engine.zip \
1652 Xonotic/bin64/*.dll \
1655 Xonotic/xonotic.exe \
1656 Xonotic/source/darkplaces/
1657 verbose cp Xonotic-$stamp-engine.zip Xonotic-$stamp-common.zip
1658 verbose mkzip Xonotic-$stamp-common.zip \
1659 Xonotic/source/fteqcc/ \
1660 Xonotic/source/qcsrc/ \
1665 Xonotic/key_0.d0pk \
1666 Xonotic/data/font-nimbussansl-$stamp.pk3
1667 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp.zip
1668 verbose mkzip0 Xonotic-$stamp.zip \
1669 Xonotic/data/xonotic-$stamp-data.pk3 \
1670 Xonotic/data/xonotic-$stamp-maps.pk3 \
1671 Xonotic/data/xonotic-$stamp-music.pk3 \
1672 Xonotic/data/xonotic-$stamp-nexcompat.pk3
1673 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp-low.zip
1674 verbose mkzip0 Xonotic-$stamp-low.zip \
1675 Xonotic/data/xonotic-$stamp-data-low.pk3 \
1676 Xonotic/data/xonotic-$stamp-maps-low.pk3 \
1677 Xonotic/data/xonotic-$stamp-music-low.pk3
1678 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp-lowdds.zip
1679 verbose mkzip0 Xonotic-$stamp-lowdds.zip \
1680 Xonotic/data/xonotic-$stamp-data-lowdds.pk3 \
1681 Xonotic/data/xonotic-$stamp-maps-lowdds.pk3 \
1682 Xonotic/data/xonotic-$stamp-music-low.pk3
1683 verbose mv Xonotic-$stamp-common.zip Xonotic-$stamp-high.zip
1684 verbose mkzip0 Xonotic-$stamp-high.zip \
1685 Xonotic/data/xonotic-$stamp-data-raw.pk3 \
1686 Xonotic/data/xonotic-$stamp-maps-raw.pk3 \
1687 Xonotic/data/xonotic-$stamp-music.pk3 \
1688 Xonotic/data/xonotic-$stamp-nexcompat.pk3
1691 verbose "$SELF" release-prepare
1692 verbose "$SELF" release-maps
1693 verbose "$SELF" release-engine
1694 verbose "$SELF" release-qc
1695 verbose "$SELF" release-pack-needsx11
1696 verbose "$SELF" release-zip
1701 echo " $SELF admin-merge [<branch>]"
1702 echo " $SELF branch <branch>"
1703 echo " $SELF branch <remote> <branch> [<srcbranch>]"
1704 echo " $SELF branches"
1705 echo " $SELF checkout|switch <branch>"
1706 echo " $SELF checkout|switch <remote>/<branch>"
1707 echo " $SELF clean [-m] [-f | -fu | -fU] [-r] [-D]"
1708 echo " $SELF clean --reclone"
1709 echo " $SELF compile [-c] [-r] [-0]"
1710 echo " $SELF each|foreach [-k] command..."
1711 echo " $SELF fix_upstream_rebase"
1712 echo " $SELF keygen"
1714 echo " $SELF push|commit [-s]"
1715 echo " $SELF release"
1716 echo " $SELF restore-patches"
1717 echo " $SELF run [sdl|glx|wgl|agl|dedicated] options..."
1718 echo " $SELF save-patches"
1719 echo " $SELF update-maps"
1720 echo " $SELF update|pull [-N] [-s | -h [-p] | -g [-p]] [-l de|nl|default]"