5 if [ -n "$ZSH_VERSION" ]; then
8 if [ -z "$ECHO" ]; then
9 if echo "\\\\" | grep .. >/dev/null; then
16 # I use this in EVERY shell script ;)
22 while ! [ -f ./all ]; do
23 if [ x"`pwd`" = x"/" ]; then
24 $ECHO "Cannot find myself."
25 $ECHO "Please run this script with the working directory inside a Xonotic checkout."
33 # If we are on WINDOWS:
38 # Windows hates users. So this script has to copy itself elsewhere first...
39 cp "$SELF" ../all.xonotic.sh
40 export WE_HATE_OUR_USERS=1
41 exec ../all.xonotic.sh "$@"
49 $ECHO >&2 "$ESC""[1m$*$ESC""[m"
52 self=`git hash-object "$SELF"`
55 self_new=`git hash-object "$SELF"`
56 if [ x"$self" != x"$self_new" ]; then
57 msg "./all has changed."
58 if [ -z "$XONOTIC_FORBID_RERUN_ALL" ]; then
59 msg "Rerunning the requested operation to make sure."
60 export XONOTIC_FORBID_RERUN_ALL=1
63 msg "Please try $SELF update, and then retry your requested operation."
80 $ECHO "the root directory"
90 if git ls-files -u | grep ' 1 '; then
92 $ECHO "MERGE CONFLICT."
93 $ECHO "change into the \"$1\" project directory, and then:"
94 $ECHO "- edit the files mentioned above with your favorite editor,"
95 $ECHO " and fix the conflicts (marked with <<<<<<< blocks)"
96 $ECHO "- for binary files, you can select the files using"
97 $ECHO " git checkout --ours or git checkout --theirs"
98 $ECHO "- when done with a file, 'git add' the file"
99 $ECHO "- when done, 'git commit'"
108 while [ x"$yesno" != x"y" -a x"$yesno" != x"n" ]; do
111 if ! IFS= read -r yesno; then
122 check_mergeconflict "$1"
127 data/xonotic-data.pk3dir | | master |
128 data/xonotic-music.pk3dir | | master |
129 data/xonotic-nexcompat.pk3dir | | master | no
130 darkplaces | | div0-stable | svn
131 netradiant | | master |
132 div0-gittools | | master | no
133 d0_blind_id | | master |
134 data/xonotic-maps.pk3dir | | master |
135 mediasource | | master | no
136 fteqcc | | xonotic-stable | noautocrlf
138 # todo: in darkplaces, change repobranch to div0-stable
140 repos=`$ECHO "$repos_urls" | grep . | cut -d '|' -f 1 | tr -d ' '`
142 base=`git config remote.origin.url`
145 base=${base%xonotic.git}
148 $ECHO "The main repo is not xonotic.git, what have you done?"
152 pushbase=`git config remote.origin.pushurl || true`
155 pushbase=${pushbase%xonotic.git}
160 $ECHO "The main repo is not xonotic.git, what have you done?"
167 repo_t=`$ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 2 | tr -d ' '`
168 if [ -n "$repo_t" ]; then
178 if [ x"$1" = x"." ]; then
179 $ECHO "$base""xonotic.git"
181 $ECHO "$base${1##*/}.git"
188 [ -n "$pushbase" ] || return 0
189 repo_t=`$ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 2 | tr -d ' '`
190 if [ -n "$repo_t" ]; then
195 $ECHO "$pushbase$repo_t"
199 if [ x"$1" = x"." ]; then
200 $ECHO "$pushbase""xonotic.git"
202 $ECHO "$pushbase${1##*/}.git"
209 repo_t=`$ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 3 | tr -d ' '`
210 if [ -n "$repo_t" ]; then
219 $ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 4 | tr -d ' '
227 # if we have .no file, skip
228 if [ -f "$d.no" ]; then
229 msg "Repository $d disabled by a .no file, delete $d.no to enable"
232 # if .yes file exists, always keep it
233 if [ -f "$d.yes" ]; then
234 msg "Repository $d enabled by a .yes file"
238 # if we have the dir, always keep it
240 msg "Repository $d enabled because it already exists"
244 # if we have matching pk3, skip
245 if [ x"$p" != x"$d" ] && [ -f "$p" ]; then
246 msg "Repository $d disabled by matching .pk3 file, delete $p or create $d.yes to enable"
249 # if "no" flag is set, skip
252 msg "Repository $d disabled by default, create $d.yes to enable"
257 msg "Repository $d enabled by default"
264 if [ "$#" = 0 ]; then
274 release_args="$cmd $*"
275 msg "*** $release_args: start"
276 release_starttime=`date +%s`
279 release_endtime=`date +%s`
280 release_deltatime=$(($release_endtime - $release_starttime))
281 msg "*** $release_args: $release_deltatime seconds"
283 trap release_end EXIT
284 release_tempstarttime=$release_starttime
287 release_endtime=`date +%s` # RELEASE NOW!!!
289 release_deltatime=$(($release_endtime - $release_tempstarttime))
290 msg "**** $release_args: $*: $release_deltatime seconds"
292 release_tempstarttime=$release_endtime
294 release_git_extract_dir()
296 release_src=$1; shift
297 release_dst=$1; shift
298 # try to create a hardlink
299 if ln -f "$release_src/.git/HEAD" "$release_dst/.hardlink-test"; then
300 rm -f "$release_dst/.hardlink-test"
302 verbose cd "$release_src"
303 git ls-files HEAD -- "$@"
305 while IFS= read -r F; do
306 case "$F" in */*) mkdir -p "$release_dst/${F%/*}" ;; esac
307 verbose ln -f "$release_src/$F" "$release_dst/$F"
312 verbose cd "$release_src"
313 verbose git archive --format=tar HEAD -- "$@"
315 verbose cd "$release_dst"
323 fix_upstream_rebase()
325 if [ -z "$r_me" ] || [ -z "$r_other" ]; then
329 # one of the two sides of the merge should be remote upstream, or all is fine
330 r_r=`git symbolic-ref HEAD`
331 r_r=${r_r#refs/heads/}
332 r_rem=`git config "branch.$r_rem.remote" || $ECHO origin`
333 r_bra=`git config "branch.$r_bra.merge" || $ECHO "$r_r"`
334 r_bra=${r_bra#refs/heads/}
335 if [ x"$r_me" != x"`git rev-parse "$r_rem/$r_bra"`" ]; then
336 if [ x"$r_other" != x"`git rev-parse "$r_rem/$r_bra"`" ]; then
341 r_base=`git merge-base "$r_me" "$r_other"`
343 # no merge-base? upstream did filter-branch
344 if [ -n "$r_base" ]; then
345 # otherwise, check if the two histories are "similar"
346 r_l_me=`git log --pretty="format:%s" "$r_other".."$r_me" | grep -v "^Merge" | sort -u`
347 r_l_other=`git log --pretty="format:%s" "$r_me".."$r_other" | grep -v "^Merge" | sort -u`
349 # heuristics: upstream rebase/filter-branch if more than 50% of the commits of one of the sides are in the other too
350 r_lc_me=`$ECHO "$r_l_me" | wc -l`
351 r_lc_other=`$ECHO "$r_l_other" | wc -l`
352 r_lc_together=`{ $ECHO "$r_l_me"; $ECHO "$r_l_other"; } | sort -u | wc -l`
353 r_lc_same=$(($r_lc_me + $r_lc_other - $r_lc_together))
355 if [ $(( $r_lc_same * 2 )) -gt $(( $r_lc_me )) ] || [ $(( $r_lc_same * 2 )) -gt $(( $r_lc_other )) ]; then
356 if yesno "Probable upstream rebase detected, automatically fix?" 'git log --oneline --graph --date-order --left-right "$r_other"..."$r_me"'; then
357 git reset --hard "$r_me"
367 fix_upstream_rebase_mergeok()
369 r_me=`git rev-parse --revs-only HEAD^1 2>/dev/null || true`
370 r_other=`git rev-parse --revs-only HEAD^2 2>/dev/null || true`
374 fix_upstream_rebase_mergefail()
376 r_me=`git rev-parse --revs-only HEAD 2>/dev/null || true`
377 r_other=`git rev-parse --revs-only MERGE_HEAD 2>/dev/null || true`
383 if ! [ -f ".git/config" ]; then
384 $ECHO "Not a git repository. Bailing out to not cause damage."
387 verbose git config remote.origin.url "$1"
389 verbose git config remote.origin.pushurl "$2"
391 verbose git config --unset remote.origin.pushurl || true
393 verbose git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
394 case ",`repoflags "$d"`," in
396 verbose git config --unset core.autocrlf || true
399 verbose git config core.autocrlf input
402 if [ -z "`git config push.default || true`" ]; then
403 verbose git config push.default current # or is tracking better?
405 verbose git config filter.mapclean.clean "tr -d '\r' | grep '^[^/]'"
406 verbose git config filter.mapclean.smudge "cat"
412 case "$RELEASETYPE" in
422 find "$@" -exec touch -d "2001-01-01 01:01:01 +0000" {} \+ # ugly hack to make the pk3 files rsync-friendly
424 find "$@" -xtype f \( -executable -or -type l \) -print > "$ziplist"
425 7za a -tzip $sevenzipflags -x@"$ziplist" "$archive" "$@" || true
426 zip $zipflags -y -@<"$ziplist" "$archive" || true
433 case "$RELEASETYPE" in
444 find "$@" -xtype f \( -executable -or -type l \) -print > "$ziplist"
445 7za a -tzip $sevenzipflags -x@"$ziplist" "$archive" "$@" || true
446 zip $zipflags -y -@<"$ziplist" "$archive" || true
453 zip -0ry "$archive" "$@"
458 # first result is to be ignored, but we use it to check status
459 git ls-remote "$1" refs/heads/master >/dev/null 2>&1 || return 1
460 { time -p git ls-remote "$1" refs/heads/master; } 2>&1 >/dev/null | head -n 1 | cut -d ' ' -f 2 | tr -d . | sed 's,^0*,,'
461 # unit: clock ticks (depends on what "time" returns
469 if ! { time -p true; } >/dev/null 2>&1; then
470 msg "Cannot do timing in this shell"
488 if t=`mirrorspeed "$m"`; then
490 tt=$(($t$op)) # fudge factor
491 msg "$m -> $t$op = $tt ticks"
492 if [ -z "$bestt" ] || [ "$tt" -lt "$bestt" ]; then
503 if [ -n "$bestin" ]; then
504 msg "Best mirror seems to be $pre$bestin$suf"
514 enter "$d0/$d" verbose
515 verbose fix_upstream_rebase_mergefail && verbose fix_upstream_rebase_mergeok
521 pushurl=`repopushurl "$d"`
522 branch=`repobranch "$d"`
523 if [ -f "$d0/$d/.git/config" ]; then
525 fix_git_config "$url" "$pushurl"
531 # enable the ssh URL for pushing
534 if [ -f ~/.ssh/id_rsa.pub ]; then
536 msg "A key already exists and no new one will be generated. If you"
537 msg "already have done the procedure for getting your key approved, you"
538 msg "can skip the following paragraph and already use the repository."
540 msg "To get access, your key has to be approved first. For that, visit"
541 msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
542 msg "the \"Support\" tracker in the \"Repository\" category where you"
543 msg "apply for access and paste the following output into the issue:"
545 msg "`cat ~/.ssh/id_rsa.pub`"
547 msg "Note that you will only have write access to branches that start"
548 msg "with your user name."
549 elif [ -f ~/.ssh/id_dsa.pub ]; then
551 msg "A key already exists and no new one will be generated. If you"
552 msg "already have done the procedure for getting your key approved, you"
553 msg "can skip the following paragraph and already use the repository."
555 msg "To get access, your key has to be approved first. For that, visit"
556 msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
557 msg "the \"Support\" tracker in the \"Repository\" category where you"
558 msg "apply for access and paste the following output into the issue:"
560 msg "`cat ~/.ssh/id_dsa.pub`"
562 msg "Note that you will only have write access to branches that start"
563 msg "with your user name."
566 msg "No key has been generated yet. One will be generated now."
567 msg "If other people are using your computer, it is recommended"
568 msg "to specify a passphrase. Otherwise you can simply hit ENTER"
569 msg "when asked for a passphrase."
571 ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
573 msg "To get access, your key has to be approved first. For that, visit"
574 msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
575 msg "the \"Support\" tracker in the \"Repository\" category where you"
576 msg "apply for access and paste the following output into the issue:"
578 msg "`cat ~/.ssh/id_rsa.pub`"
580 msg "Note that you will only have write access to branches that start"
581 msg "with your user name."
588 oldpushbase=$pushbase
589 # transition old URLs
590 if [ x"$base" = x"ssh://xonotic@git.xonotic.org/" ]; then
591 base=ssh://xonotic@push.git.xonotic.org/
593 if [ x"$pushbase" = x"ssh://xonotic@git.xonotic.org/" ]; then
594 pushbase=ssh://xonotic@push.git.xonotic.org/
597 if [ x"$1" = x"-N" ]; then
599 elif [ x"$1" = x"-p" ]; then
600 pushbase=ssh://xonotic@push.git.xonotic.org/
601 elif [ x"$1" = x"-ps" ]; then
602 pushbase=ssh://xonotic@push.git.xonotic.org/
603 elif [ x"$1" = x"-ph" ]; then
604 pushbase=http://push.git.xonotic.org/login/xonotic/
605 elif [ x"$1" = x"-s" ]; then
606 base=ssh://xonotic@push.git.xonotic.org/
607 elif [ x"$1" = x"-g" ]; then
608 base=git://git.xonotic.org/xonotic/
610 elif [ x"$1" = x"-h" ]; then
611 base=http://git.xonotic.org/xonotic/
613 elif [ x"$1" = x"-l" ]; then
621 msg "Invalid location!"
622 msg "Possible locations for the -l option:"
623 msg " nl (Netherlands, run by merlijn)"
624 msg " de (Germany, run by divVerent)"
625 msg " us (United States of America, run by detrate)"
626 msg " best (find automatically)"
627 msg " default (currently nl)"
640 if [ x"`git config xonotic.all.mirrorselection 2>/dev/null || true`" != x"done" ]; then
647 # if we fetched via ssh://, switch to git:// for fetching and keep using ssh:// for pushing
651 base=git://git.xonotic.org/xonotic/
654 newbase=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,:// .git.xonotic.org/,"`
657 if location=`bestmirror $newbase"xonotic.git" de us nl:'*6/5'`; then # 20% malus to the NL server to not overload it too much
658 git config xonotic.all.mirrorselection done
675 *://*.git.xonotic.org/*)
676 location=${base%%.git.xonotic.org/*}
677 location=${location##*://}
685 if [ -n "$location" ]; then
686 base=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,://$location.git.xonotic.org/,"`
688 base=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,://git.xonotic.org/,"`
690 pushbase=`$ECHO "$pushbase" | sed "s,://\(.*\.\)\?git.xonotic.org/,://xonotic@push.git.xonotic.org/,"`
691 if [ x"$base" != x"$oldbase" ] || [ x"$pushbase" != x"$oldpushbase" ]; then
693 pushurl=`repopushurl .`
694 fix_git_config "$url" "$pushurl"
696 elif $allow_pull; then
701 pushurl=`repopushurl "$d"`
702 branch=`repobranch "$d"`
703 if [ -f "$d0/$d/.git/config" ]; then
704 # if we have .no file, skip
705 if [ -f "$d0/$d.no" ]; then
706 msg "Repository $d disabled by a .no file, delete $d.no to enable; thus, not updated"
710 enter "$d0/$d" verbose
711 r=`git symbolic-ref HEAD`
713 if git config branch.$r.remote >/dev/null 2>&1; then
714 if ! verbose git pull; then
715 fix_upstream_rebase_mergefail || true
716 check_mergeconflict "$d"
717 $ECHO "Pulling failed. Press ENTER to continue, or Ctrl-C to abort."
720 fix_upstream_rebase_mergeok || true
725 checkself "$cmd" "$@"
727 verbose git remote prune origin
731 if [ -d "$d0/$d" ]; then
732 if yesno "$d0/$d is in the way, get rid of it and reclone?"; then
733 verbose rm -rf "$d0/$d"
735 echo "Note: $d0/$d will stay broken."
739 verbose git clone "$url" "$d0/$d"
740 enter "$d0/$d" verbose
741 fix_git_config "$url" "$pushurl"
742 if [ "$branch" != "master" ]; then
743 verbose git checkout --track -b "$branch" origin/"$branch"
750 misc/tools/xonotic-map-compiler-autobuild download
754 if [ x"$1" = x"-f" ]; then
760 if [ -z "$branch" ]; then
763 branch=${remote#origin/}
772 if [ -n "$checkoutflags" ]; then
773 set -- -f "$@" # to make checkself work again
777 enter "$d0/$d" verbose
779 if [ -n "$b" ] && git rev-parse "refs/heads/$b" >/dev/null 2>&1; then
781 verbose git checkout $checkoutflags "$b"
782 elif [ -n "$b" ] && git rev-parse "refs/remotes/$remote/$b" >/dev/null 2>&1; then
784 verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
787 if git rev-parse "refs/heads/$b" >/dev/null 2>&1; then
788 verbose git checkout $checkoutflags "$b"
789 elif git rev-parse "refs/remotes/$remote/$b" >/dev/null 2>&1; then
790 verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
792 $ECHO "WTF? Not even branch $b doesn't exist in $d"
797 checkself "$cmd" "$@"
801 $ECHO "The requested branch was not found in any repository."
809 if [ -z "$branch" ]; then
813 if [ -z "$branch" ]; then
816 r=`git symbolic-ref HEAD`
823 dv=`visible_repo_name "$d"`
824 enter "$d0/$d" verbose
825 if git rev-parse "refs/heads/$branch" >/dev/null 2>&1; then
826 $ECHO "Already having this branch in $dv."
828 if yesno "Branch in $dv?"; then
829 if [ -n "$srcbranch" ]; then
832 b=origin/"`repobranch "$d"`"
833 verbose git fetch origin || true
835 # TODO do this without pushing
836 verbose git checkout -b "$branch" "$b"
837 verbose git config "branch.$branch.remote" "$remote"
838 verbose git config "branch.$branch.merge" "refs/heads/$branch"
848 cd "$d0/$d" # am in a pipe, shouldn't use enter
849 git branch -r -v -v | cut -c 3- | sed "s/^(no branch)/(no_branch)/" | sed "s,^,$d ,"
854 while read -r d BRANCH REV TEXT; do
855 if [ x"$BRANCH" = x"`repobranch "$d"`" ]; then
858 if [ x"$REV" = x"->" ]; then
861 BRANCH=${BRANCH#remotes/}
862 ID=`$ECHO "$BRANCH" | tr -c "A-Za-z0-9." "_"`
863 branches_list="$branches_list $BRANCH" # TEH SORT MAKEZ IT UNIEQ
864 eval "r=\$branches_repos_$ID"
866 eval "branches_repos_$ID=\$r"
868 $ECHO -n "$branches_list" | xargs -n 1 $ECHO | sort -u | while IFS= read -r BRANCH; do
869 ID=`$ECHO "$BRANCH" | tr -c "A-Za-z0-9." "_"`
870 eval "r=\$branches_repos_$ID"
871 printf "%-60s %s\n" "$BRANCH" "$r"
878 dv=`visible_repo_name "$d"`
879 enter "$d0/$d" verbose
880 r=`git symbolic-ref HEAD`
882 if git log HEAD..origin/"`repobranch "$d"`" | grep .; then
883 # we have uncommitted changes
884 if yesno "Could merge from \"`repobranch "$d"`\" into \"$r\" in $dv. Do it?"; then
885 if ! verbose git merge origin/"`repobranch "$d"`"; then
886 check_mergeconflict "$d"
887 exit 1 # this should ALWAYS be fatal
897 dv=`visible_repo_name "$d"`
898 enter "$d0/$d" verbose
899 r=`git symbolic-ref HEAD`
901 diffdata=`git diff --color HEAD`
902 if [ -n "$diffdata" ]; then
903 # we have uncommitted changes
904 if yesno "Uncommitted changes in \"$r\" in $dv. Commit?" '$ECHO "$diffdata" | less -r'; then
905 verbose git commit -a
908 rem=`git config "branch.$r.remote" || $ECHO origin`
909 bra=`git config "branch.$r.merge" || $ECHO "$r"`
910 upstream="$rem/${bra#refs/heads/}"
911 if ! git rev-parse "$upstream" >/dev/null 2>&1; then
912 upstream="origin/`repobranch "$d"`"
914 logdata=`git log --color "$upstream".."$r"`
915 if [ -n "$logdata" ]; then
916 if yesno "Push \"$r\" in $dv?" '$ECHO "$logdata" | less -r'; then
917 verbose git push "$rem" HEAD
920 if [ x"$submit" = x"-s" ]; then
923 verbose git push "$rem" HEAD:"${bra%%/*}/finished/${bra#*/}"
937 snowleopardhack=false
938 if [ -z "$CC" ]; then
939 export CC="gcc -DSUPPORTIPV6"
964 case "`$CC -dumpversion`" in
965 [5-9]*|[1-9][0-9]*|4.[3-9]*|4.[1-9][0-9]*)
967 # -march=native is broken < 4.3
968 if $CC -mtune=native -march=native misc/tools/conftest.c -o conftest >/dev/null 2>&1; then
969 export CC="$CC -mtune=native -march=native"
973 if [ -n "$WE_HATE_OUR_USERS" ]; then
974 export CC="$CC -fno-common"
983 if [ -n "$WE_HATE_OUR_USERS" ]; then
984 TARGETS="sv-$debug cl-$debug"
985 elif [ x"`uname`" = x"Darwin" ]; then
988 TARGETS="sv-$debug cl-$debug sdl-$debug"
991 # AGL cannot be compiled on systems with a kernel > 10.x (Snow Leopard)
993 TARGETS="sv-$debug sdl-$debug"
996 export CC="$CC -fno-reorder-blocks -I$PWD/misc/buildfiles/osx/Xonotic.app/Contents/Frameworks/SDL.framework/Headers -F$PWD/misc/buildfiles/osx/Xonotic.app/Contents/Frameworks"
998 TARGETS="sv-$debug cl-$debug sdl-$debug"
1000 if [ $# -gt 0 ] && [ x"$1" = x"" ]; then
1001 # if we give the command make the arg "", it will surely fail (invalid filename),
1002 # so better handle it as an empty client option
1005 elif [ -n "$1" ]; then
1007 TARGETS_SAVE=$TARGETS
1012 TARGETS="$TARGETS sdl-debug"
1015 TARGETS="$TARGETS cl-debug"
1016 if $snowleopardhack; then
1017 export CC="$CC -arch i386"
1021 TARGETS="$TARGETS cl-debug"
1024 TARGETS="$TARGETS sv-debug"
1027 BAD_TARGETS="$BAD_TARGETS $X"
1031 if [ -n "$TARGETS" ]; then # at least a valid client
1033 else # no valid client, let's assume this option is not meant to be a client then
1034 TARGETS=$TARGETS_SAVE
1038 if [ -z "$MAKEFLAGS" ]; then
1039 if [ -f /proc/cpuinfo ]; then
1040 ncpus=$((`grep -c '^processor :' /proc/cpuinfo || true`+0))
1041 if [ $ncpus -gt 1 ]; then
1045 if [ -n "$WE_HATE_OUR_USERS" ]; then
1046 MAKEFLAGS="$MAKEFLAGS DP_MAKE_TARGET=mingw LIB_JPEG= CFLAGS_LIBJPEG="
1051 if ! verbose $CC misc/tools/conftest.c -o conftest; then
1053 msg "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
1054 msg "~~~~~~~~~~ COMPILER ~~~~~~~~~~"
1055 msg "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
1056 msg "~~~~~~~~~~~~~~_...._~~~~~~~~~~"
1057 msg "~~~~~~~~~~~,-' \\\`-._~~~~~~"
1058 msg "~~~~~~~~~~/ --. >< \\~~~~~"
1059 msg "~~~~~~~~~/ (*)> -<: \\~~~~"
1060 msg "~~~~~~~~~( ^~-' (*) )~~~~"
1061 msg "~~~~~~~~~\\ ^+-_/ |~~~~"
1062 msg "~~~~~~~~~~\\ {vvv} |~~~~"
1063 msg "~~~~~~~~~~,\\ , {^^^},/~~~~~"
1064 msg "~~~~~~~~,/ \`---.....-'~~W~~~~"
1065 msg "~~~~~~,/ \\_____/_\\_W~~/~~~~~"
1066 msg "~~~~~/ /~~~\\__/~~~~~~"
1067 msg "~~~~/ /~~~~~~~~~~~~~~"
1068 msg "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
1069 msg "~~~~~~~ Y U NO COMPILE ~~~~~~~"
1070 msg "~~~~~~~~~~~~ CODE ~~~~~~~~~~~~"
1071 msg "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
1077 verbose cd "$d0/d0_blind_id"
1078 if ! $compiled0; then
1079 # compilation of crypto library failed
1080 # use binaries then, if we can...
1082 if [ -n "$WE_HATE_OUR_USERS" ]; then
1083 verbose cp "$d0/misc/buildfiles/win32/libd0_blind_id"-* .libs/
1084 verbose cp "$d0/misc/buildfiles/win32/libd0_rijndael"-* .libs/
1085 verbose cp "$d0/misc/buildfiles/win32/libgmp"-* .libs/
1091 #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_blind_id".* .libs/
1092 #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_rijndael".* .libs/
1093 #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libgmp".* .libs/
1094 MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/ DP_CRYPTO_RIJNDAEL_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/"
1097 #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_blind_id".* .libs/
1098 #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_rijndael".* .libs/
1099 #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libgmp".* .libs/
1100 MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/ DP_CRYPTO_RIJNDAEL_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/"
1108 verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_blind_id".* .libs/
1109 verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_rijndael".* .libs/
1119 if [ -f Makefile ]; then
1120 verbose make $MAKEFLAGS distclean
1123 if ! [ -f Makefile ]; then
1124 verbose sh autogen.sh
1127 verbose make $MAKEFLAGS
1130 verbose cd "$d0/fteqcc"
1132 verbose make $MAKEFLAGS clean
1134 verbose make $MAKEFLAGS
1136 verbose cd "$d0/data/xonotic-data.pk3dir"
1138 verbose make FTEQCC="../../../../fteqcc/fteqcc.bin" "$@" $MAKEFLAGS clean
1140 verbose make FTEQCC="../../../../fteqcc/fteqcc.bin" "$@" $MAKEFLAGS
1141 # 4 levels up: data, xonotic-data, qcsrc, server
1143 verbose cd "$d0/darkplaces"
1144 if [ x"$BAD_TARGETS" = x" " ]; then
1145 $ECHO "Warning: invalid empty client, default clients will be used."
1148 verbose make $MAKEFLAGS clean
1150 for T in $TARGETS; do
1151 verbose make $MAKEFLAGS STRIP=: "$@" "$T"
1153 for T in $BAD_TARGETS; do
1154 $ECHO "Warning: discarded invalid client $T."
1157 verbose "$SELF" update-maps
1160 if [ -n "$WE_HATE_OUR_USERS" ]; then
1162 export PATH="$d0/misc/buildfiles/win32:$d0/d0_blind_id/.libs:$PATH"
1163 elif [ x"`uname`" = x"Darwin" ]; then
1164 export DYLD_LIBRARY_PATH="$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS:$d0/d0_blind_id/.libs"
1165 export DYLD_FRAMEWORK_PATH="$d0/misc/buildfiles/osx/Xonotic.app/Contents/Frameworks"
1168 export LD_LIBRARY_PATH="$d0/d0_blind_id/.libs"
1172 sdl|glx|agl|dedicated)
1181 if ! [ -x "darkplaces/darkplaces$client" ]; then
1182 if [ -x "darkplaces/darkplaces$client.exe" ]; then
1185 $ECHO "Client darkplaces/darkplaces$client not found, aborting"
1189 set -- "darkplaces/darkplaces$client" -xonotic "$@"
1191 # if pulseaudio is running: USE IT
1192 if [ -z "$SDL_AUDIODRIVER" ] && ! [ -n "$WE_HATE_OUR_USERS" ] && ! [ x"`uname`" = x"Darwin" ]; then
1193 if ps -C pulseaudio >/dev/null; then
1194 if ldd /usr/lib/libSDL.so 2>/dev/null | grep pulse >/dev/null; then
1195 export SDL_AUDIODRIVER=pulse
1202 if [ x"$USE_GDB" = x"yes" ]; then
1203 set -- gdb --args "$@"
1204 elif [ x"$USE_GDB" = x"core" ] && which gdb >/dev/null 2>&1; then
1205 set -- gdb --batch -x savecore.gdb --args "$@"
1206 elif which catchsegv >/dev/null 2>&1; then
1207 set -- catchsegv "$@"
1211 if [ -f xonotic.core ]; then
1212 if yesno "The program has CRASHED. Do you want to examine the core dump?"; then
1213 gdb "$binary" xonotic.core
1214 #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
1215 # tar cvzf xonotic.core.tar.gz xonotic.core darkplaces/*.c darkplaces/*.h
1217 # rm -f xonotic.core.tar.gz
1219 $ECHO "The core dump can be examined later by"
1220 $ECHO " gdb $binary xonotic.core"
1227 if [ x"$1" = x"-k" ]; then
1232 if verbose cd "$d0/$d"; then
1233 if $keep_going; then
1234 verbose "$@" || true
1244 patchdir=`mktemp -d -t save-patches.XXXXXX`
1246 enter "$d0/$d" verbose
1247 git branch -v -v | cut -c 3- | {
1249 while read -r BRANCH REV UPSTREAM TEXT; do
1252 UPSTREAM=${UPSTREAM#\[}
1253 UPSTREAM=${UPSTREAM%\]}
1254 UPSTREAM=${UPSTREAM%:*}
1258 UPSTREAM=origin/"`repobranch "$d"`"
1262 if [ x"$REV" = x"->" ]; then
1265 if git format-patch -o "$patchdir/$i" "$UPSTREAM".."$BRANCH"; then
1266 $ECHO "$d" > "$patchdir/$i/info.txt"
1267 $ECHO "$BRANCH" >> "$patchdir/$i/info.txt"
1268 $ECHO "$UPSTREAM" >> "$patchdir/$i/info.txt"
1269 $ECHO "$TRACK" >> "$patchdir/$i/info.txt"
1272 rm -rf "$patchdir/$i"
1277 ( cd "$patchdir" && tar cvzf - . ) > "$outfile"
1282 patchdir=`mktemp -d -t restore-patches.XXXXXX`
1283 ( cd "$patchdir" && tar xvzf - ) < "$infile"
1285 for P in "$patchdir"/*/info.txt; do
1290 read -r UPSTREAM <&3
1292 verbose git checkout HEAD^0
1293 verbose git branch -D "$BRANCH"
1294 if [ x"$TRACK" = x"true" ]; then
1295 verbose git checkout --track -b "$BRANCH" "$UPSTREAM"
1297 verbose git branch -b "$BRANCH" "$UPSTREAM"
1316 report=$report"$*$LF"
1321 report=$report" $*$LF"
1326 o=`"$@" | sed 's/^/ /' || true`
1332 # sorry, fteqcc repo is managed manually
1336 enter "$d0/$d" verbose
1337 base="`repobranch "$d"`"
1339 for ref in `git for-each-ref --format='%(refname)' refs/remotes/origin/`; do
1340 case "${ref#refs/remotes/origin/}" in
1353 if [ -n "$branch" ]; then
1354 if [ x"$branch" != x"${ref#refs/remotes/origin/}" ]; then
1363 l0=`git rev-list "$base".."$ref" | wc -l`
1364 l1=`git rev-list master.."$ref" | wc -l`
1365 if [ $l0 -gt $l1 ]; then
1372 reportecho " Branch $ref:"
1373 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1374 logdata=`git log --color "$realbase".."$ref"`
1375 if [ -z "$logdata" ]; then
1376 reportecho4 "--> not merging, no changes vs master"
1377 if yesno "Branch \"$ref\" probably should get deleted. Do it?" ''; then
1378 git push origin :"${ref#refs/remotes/origin/}"
1379 reportecho4 "--> branch deleted"
1382 diffdata=`git diff --color --find-copies-harder --ignore-space-change "$realbase"..."$ref"`
1383 if [ -z "$diffdata" ]; then
1384 reportecho4 "--> not merging, no changes vs master, branch contains redundant history"
1385 if yesno "Branch \"$ref\" probably should get deleted. Do it?" '{ $ECHO "$logdata"; } | less -r'; then
1386 git push origin :"${ref#refs/remotes/origin/}"
1387 reportecho4 "--> branch deleted"
1389 elif $only_delete; then
1390 reportecho4 "--> skipped in delete-only run"
1391 elif [ -z "$branch" ] && [ -n "$note" ]; then
1392 reportdo4 $ECHO "$note"
1393 reportecho4 "--> not merging, already had this one rejected before"
1394 elif yesno "Branch \"$ref\" may want to get merged. Do it?" '{ $ECHO "$logdata"; $ECHO "$diffdata"; } | less -r'; then
1395 git checkout "$realbase"
1396 org=`git rev-parse HEAD`
1397 if ! git merge --no-ff "$ref" 2>&1 | tee "$t" && ! { git ls-files -u | grep ' 1 ' >/dev/null; }; then
1398 git reset --hard "$org"
1399 GIT_NOTES_REF=refs/notes/admin-merge git notes edit -m "Merge failed:$LF`cat "$t"`" "$ref"
1401 reportecho4 "--> merge failed"
1402 elif ! "$SELF" compile 2>&1 | tee "$t"; then
1403 git reset --hard "$org"
1404 GIT_NOTES_REF=refs/notes/admin-merge git notes edit -m "Compile failed:$LF`cat "$t"`" "$ref"
1406 reportecho4 "--> compile failed"
1407 elif ! yesno "Still merge \"$ref\" into `git symbolic-ref HEAD` of $d? Maybe you want to test first."; then
1408 git reset --hard "$org"
1409 GIT_NOTES_REF=refs/notes/admin-merge git notes edit "$ref"
1410 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1411 if [ x"$note" = x"del" ]; then
1412 git push origin :"${ref#refs/remotes/origin/}"
1413 reportecho4 "--> test failed, branch deleted"
1414 elif [ -n "$note" ]; then
1415 reportdo4 $ECHO "$note"
1416 reportecho4 "--> test failed"
1418 reportecho4 "--> test failed, postponed"
1421 # apply crlf, or other cleanup filters (non-behavioural changes)
1423 find . -type f -exec touch {} \;
1424 git commit -a --amend -C HEAD || true # don't fail if nothing to commit
1427 case ",`repoflags "$d"`," in
1429 # we do quite a mess here... luckily we know $org
1430 git fetch # svn needs to be current
1431 git rebase -i --onto origin/master "$org"
1432 git svn dcommit --add-author-from
1433 git reset --hard "$org"
1436 git push origin HEAD
1439 reportecho4 "--> MERGED"
1440 if yesno "Delete original branch \"$ref\"?"; then
1441 git push origin :"${ref#refs/remotes/origin/}"
1442 reportecho4 "--> branch deleted"
1446 GIT_NOTES_REF=refs/notes/admin-merge git notes edit "$ref"
1447 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1448 if [ x"$note" = x"del" ]; then
1449 git push origin :"${ref#refs/remotes/origin/}"
1450 reportecho4 "--> branch deleted"
1451 elif [ -n "$note" ]; then
1452 reportdo4 $ECHO "$note"
1453 reportecho4 "--> rejected"
1455 reportecho4 "--> postponed"
1464 $ECHO "$report" | ssh nexuiz@rm.endoftheinternet.org cat '>>' public_html/xonotic-merge-notes.txt
1476 # ./all clean [-m] [-f | -fu | -fU] [-r] [-D]
1477 # ./all clean --reclone
1480 if [ x"$X" = x"--reclone" ]; then
1487 elif [ x"$X" = x"-f" ]; then
1489 elif [ x"$X" = x"-u" ]; then
1491 elif [ x"$X" = x"-U" ]; then
1494 elif [ x"$X" = x"-fu" ]; then
1497 elif [ x"$X" = x"-fU" ]; then
1501 elif [ x"$X" = x"-m" ]; then
1503 elif [ x"$X" = x"-r" ]; then
1505 elif [ x"$X" = x"-D" ]; then
1507 elif $ECHO "$X" | grep '^-FFFF*UUUU*$' >/dev/null; then
1510 msg " ,--'-\\P/\`\\ FFFFFFF"
1511 msg " __/_ B/,-.\\ FFFFFFF"
1512 msg " / _\\ (// O\\\\ FFFFFF"
1513 msg "| (O \`) _\\._ _)\\ FFFUU"
1514 msg "| |___/.^d0~~\"\\ \\ UUUU"
1515 msg "| |\`~' \\ | UUUU"
1516 msg "| | __,C>|| UUUU"
1517 msg "\\ /_ ,-/,-' | UUUU"
1518 msg " \\\\_ \\_>~' / UUUU-"
1521 msg "Unknown arg: $X"
1530 if $gotoupstream; then
1532 msg "Must also use -f (delete local changes) when using -u"
1535 if $gotomaster; then
1536 if $fetchupstream; then
1537 verbose git fetch origin
1538 verbose git remote prune origin
1540 verbose git checkout -f "`repobranch "$d"`"
1541 verbose git reset --hard origin/"`repobranch "$d"`"
1543 r=`git symbolic-ref HEAD`
1545 rem=`git config "branch.$r.remote" || $ECHO origin`
1546 bra=`git config "branch.$r.merge" || $ECHO "$r"`
1547 upstream="$rem/${bra#refs/heads/}"
1548 if $fetchupstream; then
1549 verbose git fetch "$rem"
1550 verbose git remote prune "$rem"
1552 if ! git rev-parse "$upstream" >/dev/null 2>&1; then
1553 upstream="origin/`repobranch "$d"`"
1555 verbose git reset --hard "$upstream"
1557 elif $gotomaster; then
1559 verbose git checkout -f "`repobranch "$d"`"
1560 verbose git reset --hard
1562 verbose git checkout "`repobranch "$d"`"
1565 verbose git reset --hard
1567 if $rmuntracked; then
1570 verbose git clean -df || true
1573 verbose git clean -xdf || true
1577 if $killbranches; then
1578 git for-each-ref --format='%(refname)' refs/heads/ | while IFS= read -r B; do
1579 if [ x"$B" != x"`git symbolic-ref HEAD`" ]; then
1580 verbose git branch -D "${B#refs/heads/}"
1583 git rev-parse refs/heads/master >/dev/null 2>&1 || verbose git branch --track master origin/master || true
1584 git rev-parse "refs/heads/`repobranch "$d"`" >/dev/null 2>&1 || verbose git branch --track "`repobranch "$d"`" origin/"`repobranch "$d"`" || true
1586 checkself "$cmd" "$@"
1590 # release building goes here
1592 #"$SELF" each git clean -fxd
1593 case "$RELEASETYPE" in
1595 $ECHO >&2 -n "$ESC[2J$ESC[H"
1602 msg " +---------------------------------------------------------.---+"
1604 msg " +---------------------------------------------------------^---+"
1606 msg " | / \ This is the official release build system. |"
1607 msg " | | | If you are not a member of the Xonotic Core Team, |"
1608 msg " | | STOP | you are not supposed to use this script and should |"
1609 msg " | | | instead use ./all compile to compile the engine |"
1610 msg " | \____/ and game code. |"
1612 msg " | [ I understand ] |"
1613 msg " +-------------------------------------------------------------+"
1615 # A LOT of build infrastructure is required:
1618 # - .ssh/config must be configured so the following
1619 # host names are reachable and have a compile
1620 # infrastructure set up:
1621 # - xonotic-build-linux32 (with gcc on x86)
1622 # - xonotic-build-linux64 (with gcc on x86_64)
1623 # - xonotic-build-win32 (with i586-mingw32msvc-g++)
1624 # - xonotic-build-win64 (with amd64-mingw32msvc-g++
1625 # and x86_64-w64-mingw32-g++)
1626 # - xonotic-build-osx (with Xcode and SDL.framework)
1627 # - AMD Compressonator installed in WINE
1628 # - ResEdit installed in WINE
1629 # - a lot of other requirements you will figure out
1630 # while reading the error messages
1631 # - environment variable RELEASETYPE set
1632 # - optionally, environment variable RELEASEDATE set
1637 msg "Building a FINISHED RELEASE"
1640 msg "Building a $RELEASETYPE"
1643 verbose rm -rf Xonotic Xonotic*.zip
1644 verbose mkdir -p Xonotic
1645 if [ -n "$RELEASEDATE" ]; then
1646 verbose $ECHO "$RELEASEDATE" > Xonotic/stamp.txt
1648 verbose date +%Y%m%d > Xonotic/stamp.txt
1650 release_git_extract_dir "." "Xonotic" Docs misc server xonotic-linux-glx.sh xonotic-linux-sdl.sh misc/buildfiles key_0.d0pk COPYING GPL-2 GPL-3
1653 verbose mkdir data fteqcc source source/darkplaces source/fteqcc source/d0_blind_id mapping
1654 verbose rm -rf misc/builddeps
1655 verbose mv misc/buildfiles/win32 bin32 || true
1656 verbose mv bin32/SDL.dll . || true
1657 verbose mv misc/buildfiles/win64 bin64 || true
1658 verbose mv misc/buildfiles/osx/* . || true
1659 verbose rm -rf misc/buildfiles
1660 verbose rm -rf misc/pki
1662 release_git_extract_dir "darkplaces" "Xonotic/source/darkplaces" .
1663 release_git_extract_dir "fteqcc" "Xonotic/source/fteqcc" .
1664 release_git_extract_dir "data/xonotic-data.pk3dir" "Xonotic/source" qcsrc Makefile
1665 release_git_extract_dir "d0_blind_id" "Xonotic/source/d0_blind_id" .
1667 verbose cd Xonotic/source/d0_blind_id
1668 verbose sh autogen.sh
1670 rm -f Xonotic/key_15.d0pk
1672 verbose cd Xonotic/mapping
1673 verbose wget http://www.icculus.org/netradiant/files/netradiant-1.5.0-20120114.tar.bz2
1674 verbose wget http://www.icculus.org/netradiant/files/netradiant-1.5.0-20120114-win32-7z.exe
1675 for X in *-7z.exe; do
1679 # TODO possibly include other tools?
1682 release-compile-run)
1691 if [ -n "$targetfiles" ]; then
1692 case " $HOSTS_THAT_ARE_DISABLED " in
1697 case " $HOSTS_THAT_ARE_MYSELF " in
1699 verbose rsync --delete -zLvaSHP "$srcdir"/ "$buildpath/"
1700 verbose rsync --delete -zLvaSHP "$depsdir"/ "$buildpath.deps/"
1701 verbose ln -snf "$buildpath.deps" "$buildpath/.deps"
1702 verbose eval make -C "$buildpath" clean $maketargets $makeflags
1703 for f in $targetfiles; do
1704 verbose mv "$buildpath/${f%:*}" "${f##*:}" || true
1708 verbose rsync --delete -zLvaSHP "$srcdir"/ "$host:$buildpath/"
1709 verbose rsync --delete -zLvaSHP "$depsdir"/ "$host:$buildpath.deps/"
1710 verbose ssh "$host" "[ -f /etc/profile ] && . /etc/profile; [ -f ~/.profile ] && . ~/.profile; export LC_ALL=C; ln -snf $buildpath.deps $buildpath/.deps && cd $buildpath && nice -`nice` make clean $maketargets $makeflags"
1711 for f in $targetfiles; do
1712 verbose rsync -zvaSHP "$host:$buildpath/${f%:*}" "${f##*:}" || true
1716 # now rebrand the binaries...
1717 for f in $targetfiles; do
1718 #verbose "$d0/misc/tools/rebrand-darkplaces-engine.sh" "${XONOTIC_BRAND:-$d0/misc/tools/xonotic.brand}" "${f##*:}" || true
1720 Xonotic/xonotic*.exe)
1721 verbose "$d0/misc/tools/change-icon-of-exe.sh" "$d0/misc/logos/icons_ico/xonotic.ico" "${f##*:}"
1730 fteqcc_maketargets=$3
1732 darkplaces_maketargets=$5
1734 host=xonotic-build-$suffix
1735 verbose "$SELF" release-compile-run "$host" /tmp/fteqcc.build."$suffix" "$fteqcc_maketargets" "$makeflags" "Xonotic/source/fteqcc" "$d0/misc/builddeps/dp.$suffix" "$fteqcc_files"
1736 verbose "$SELF" release-compile-run "$host" /tmp/Darkplaces.build."$suffix" "$darkplaces_maketargets" "$makeflags" "Xonotic/source/darkplaces" "$d0/misc/builddeps/dp.$suffix" "$darkplaces_files"
1738 release-engine-win32)
1739 verbose "$SELF" release-compile win32 \
1740 'STRIP=: DP_MAKE_TARGET=mingw CC="i586-mingw32msvc-gcc -march=i686 -g1 -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' \
1741 win 'fteqcc.exe:Xonotic/fteqcc/fteqcc.exe' \
1743 verbose "$SELF" release-compile win32 \
1744 'STRIP=: DP_MAKE_TARGET=mingw CC="i586-mingw32msvc-g++ -g1 -Wl,--dynamicbase -Wl,--nxcompat -I.deps/include -L.deps/lib -DUSE_WSPIAPI_H -DSUPPORTIPV6" WINDRES="i586-mingw32msvc-windres" SDL_CONFIG=".deps/bin/sdl-config" LIB_JPEG= CFLAGS_LIBJPEG= WIN32RELEASE=1 D3D=1' \
1746 release 'darkplaces.exe:Xonotic/xonotic.exe darkplaces-sdl.exe:Xonotic/xonotic-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-dedicated.exe'
1748 release-engine-win64)
1749 verbose "$SELF" release-compile win64 \
1750 'STRIP=: DP_MAKE_TARGET=mingw CC="amd64-mingw32msvc-gcc -g1 -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' \
1751 win 'fteqcc.exe:Xonotic/fteqcc/fteqcc-x64.exe' \
1752 'sv-release sdl-release' 'darkplaces-sdl.exe:Xonotic/xonotic-x64-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-x64-dedicated.exe'
1753 verbose "$SELF" release-compile win64 \
1754 'STRIP=: DP_MAKE_TARGET=mingw CC="x86_64-w64-mingw32-g++ -g1 -Wl,--dynamicbase -Wl,--nxcompat -I.deps/include -L.deps/lib -DSUPPORTIPV6" WINDRES="x86_64-w64-mingw32-windres" SDL_CONFIG=".deps/bin/sdl-config" LIB_JPEG= CFLAGS_LIBJPEG= WIN64RELEASE=1 D3D=1' \
1756 cl-release 'darkplaces.exe:Xonotic/xonotic-x64.exe'
1759 # gcc on OSX is buggy, needs -fno-reorder-blocks for a release build to succeed
1760 verbose "$SELF" release-compile osx \
1761 'STRIP=: CC="gcc -g1 -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"' \
1762 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.osx' \
1763 'sv-release sdl-release' 'darkplaces-sdl:Xonotic/Xonotic.app/Contents/MacOS/xonotic-osx-sdl-bin darkplaces-dedicated:Xonotic/xonotic-osx-dedicated'
1765 release-engine-linux32)
1766 verbose "$SELF" release-compile linux32 \
1767 'STRIP=: CC="gcc -m32 -march=i686 -g1 -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' \
1768 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.linux32' \
1769 release 'darkplaces-glx:Xonotic/xonotic-linux32-glx darkplaces-sdl:Xonotic/xonotic-linux32-sdl darkplaces-dedicated:Xonotic/xonotic-linux32-dedicated'
1771 release-engine-linux64)
1772 verbose "$SELF" release-compile linux64 \
1773 'STRIP=: CC="gcc -m64 -g1 -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' \
1774 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.linux64' \
1775 release 'darkplaces-glx:Xonotic/xonotic-linux64-glx darkplaces-sdl:Xonotic/xonotic-linux64-sdl darkplaces-dedicated:Xonotic/xonotic-linux64-dedicated'
1778 verbose "$SELF" release-engine-linux32 &
1779 verbose "$SELF" release-engine-linux64 &
1780 verbose "$SELF" release-engine-win32 &
1781 verbose "$SELF" release-engine-win64 &
1782 verbose "$SELF" release-engine-osx &
1791 verbose "$SELF" update-maps
1794 verbose env GIT_DIR="$d0/data/xonotic-data.pk3dir/.git" make -C Xonotic/source FTEQCC="$d0/Xonotic/fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 clean all
1795 verbose rm -f Xonotic/source/qcsrc/*/fteqcc.log
1797 release-buildpk3-transform-raw)
1800 release-buildpk3-transform-normal)
1803 # texture: convert to jpeg and dds
1804 verbose export do_jpeg=true
1805 verbose export jpeg_qual_rgb=97
1806 verbose export jpeg_qual_a=99
1807 verbose export do_dds=false
1808 verbose export do_ogg=true
1809 verbose export ogg_ogg=false
1810 verbose export del_src=true
1811 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1813 release-buildpk3-transform-normaldds)
1816 # texture: convert to jpeg and dds
1817 # music: reduce bitrate
1818 verbose export do_jpeg=false
1819 verbose export do_jpeg_if_not_dds=true
1820 verbose export jpeg_qual_rgb=95
1821 verbose export jpeg_qual_a=99
1822 verbose export do_dds=true
1823 verbose export dds_flags=
1824 verbose export do_ogg=true
1825 verbose export ogg_ogg=false
1826 verbose export del_src=true
1827 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1829 release-buildpk3-transform-low)
1832 # texture: convert to jpeg and dds
1833 # music: reduce bitrate
1834 verbose export do_jpeg=true
1835 verbose export jpeg_qual_rgb=80
1836 verbose export jpeg_qual_a=97
1837 verbose export do_dds=false
1838 verbose export do_ogg=true
1839 verbose export ogg_qual=1
1840 verbose export del_src=true
1841 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1843 release-buildpk3-transform-lowdds)
1846 # texture: convert to jpeg and dds
1847 # music: reduce bitrate
1848 verbose export do_jpeg=false
1849 verbose export do_jpeg_if_not_dds=true
1850 verbose export jpeg_qual_rgb=80
1851 verbose export jpeg_qual_a=99
1852 verbose export do_dds=true
1853 verbose export dds_flags=
1854 verbose export do_ogg=true
1855 verbose export ogg_qual=1
1856 verbose export del_src=true
1857 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1859 release-buildpk3-transform-mapping)
1862 # remove stuff radiant has no use for
1863 verbose find . -name \*_norm.\* -exec rm -f {} \;
1864 verbose find . -name \*_bump.\* -exec rm -f {} \;
1865 verbose find . -name \*_glow.\* -exec rm -f {} \;
1866 verbose find . -name \*_gloss.\* -exec rm -f {} \;
1867 verbose find . -name \*_pants.\* -exec rm -f {} \;
1868 verbose find . -name \*_shirt.\* -exec rm -f {} \;
1869 verbose find . -name \*_reflect.\* -exec rm -f {} \;
1870 verbose find . -not \( -name \*.tga -o -name \*.png -o -name \*.jpg \) -exec rm -f {} \;
1871 # texture: convert to jpeg and dds
1872 # music: reduce bitrate
1873 verbose export do_jpeg=true
1874 verbose export jpeg_qual_rgb=80
1875 verbose export jpeg_qual_a=97
1876 verbose export do_dds=false
1877 verbose export do_ogg=true
1878 verbose export ogg_qual=1
1879 verbose export del_src=true
1880 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1894 verbose rm -rf Xonotic/temp
1895 release_timereport "deleted temp directory"
1896 verbose mkdir -p Xonotic/temp
1897 release_git_extract_dir "$src" "Xonotic/temp" .
1898 release_timereport "extracted data"
1899 verbose cd Xonotic/temp
1900 if [ x"$src" = x"data/xonotic-data.pk3dir" ]; then
1901 verbose cp ../source/progs.dat .
1902 verbose cp ../source/csprogs.dat .
1903 verbose cp ../source/menu.dat .
1904 verbose rm -rf qcsrc
1905 gv=`grep "^gameversion " "defaultXonotic.cfg" | awk '{ print $2 }'`
1906 major=$(($gv / 10000))
1907 minor=$((($gv / 100) - ($major * 100)))
1908 patch=$(($gv - ($major * 10000) - ($minor * 100)))
1909 versionstr="$major.$minor.$patch"
1910 case "$RELEASETYPE" in
1914 versionstr="$versionstr$RELEASETYPE"
1917 if [ $gv -lt 9900 ]; then
1918 # pre-1.0: compatible with any other pre-1.0
1920 s/^set g_xonoticversion [^ ]* /set g_xonoticversion $versionstr /;
1921 s/^gameversion_min [0-9]*/gameversion_min 0/;
1922 s/^gameversion_max [0-9]*/gameversion_max 9999/;
1923 " < defaultXonotic.cfg > defaultXonotic.cfg.new
1927 s/^set g_xonoticversion [^ ]* /set g_xonoticversion $versionstr /;
1928 s/^gameversion_min [0-9]*/gameversion_min $(( ($gv / 100) * 100 - 100 ))/;
1929 s/^gameversion_max [0-9]*/gameversion_max $(( ($gv / 100) * 100 + 199 ))/;
1930 " < defaultXonotic.cfg > defaultXonotic.cfg.new
1932 mv defaultXonotic.cfg.new defaultXonotic.cfg
1933 case "$RELEASETYPE" in
1935 echo "" >> defaultXonotic.cfg
1936 echo "// nicer menu" >> defaultXonotic.cfg
1937 echo "set menu_watermark \"\"" >> defaultXonotic.cfg
1941 verbose cd gfx/menu/luminos
1942 verbose rm -f background_l2.tga background_ingame_l2.tga
1943 verbose cp "$d0"/mediasource/gfx/menu/luminos_versionbuilder/background_l2.svg .
1944 verbose "$d0"/mediasource/gfx/menu/luminos_versionbuilder/versionbuilder "$versionstr"
1945 verbose rm background_l2.svg
1948 if [ x"$src" = x"data/xonotic-maps.pk3dir" ]; then
1949 for X in ../../data/*-????????????????????????????????????????-????????????????????????????????????????.pk3; do
1950 if [ -f "$X" ]; then
1952 verbose rm -f maps/*.log maps/*.irc maps/*.lin
1956 verbose export git_src_repo="$d0/$src" # skip hash-object
1957 release_timereport "processed data"
1958 verbose "$SELF" release-buildpk3-transform-$transform "Xonotic/temp"
1959 release_timereport "transformed data"
1960 find . -type f -size +4k | verbose "$d0"/misc/tools/symlink-deduplicate.sh
1961 release_timereport "deduplicated data"
1962 verbose mkzipr "../../$dst" *
1963 release_timereport "zipped data"
1965 verbose rm -rf Xonotic/temp
1966 release_timereport "deleted temp directory again"
1969 stamp=`cat Xonotic/stamp.txt`
1975 dst="data/xonotic-$stamp-${dst#data/xonotic-}"
1981 while [ "$#" -gt 1 ]; do
1982 verbose "$SELF" release-buildpk3 "$src" "Xonotic/$dst$2.pk3" "$1"
1988 verbose "$SELF" release-buildpk3s data/font-nimbussansl.pk3dir raw ''
1989 verbose "$SELF" release-buildpk3s data/font-xolonium.pk3dir raw ''
1990 verbose "$SELF" release-buildpk3s data/xonotic-data.pk3dir normal '-high' low '-low' normaldds ''
1991 verbose "$SELF" release-buildpk3s data/xonotic-maps.pk3dir normal '-high' low '-low' normaldds '' mapping '-mapping'
1992 verbose "$SELF" release-buildpk3s data/xonotic-music.pk3dir raw '' low '-low'
1993 verbose "$SELF" release-buildpk3s data/xonotic-nexcompat.pk3dir normal '-high' normaldds ''
1995 release-pack-needsx11)
1998 verbose startx "$SELF" release-pack -- /usr/bin/Xvfb :7
2001 verbose "$SELF" release-pack
2006 stamp=`cat Xonotic/stamp.txt`
2007 # exe and dll files do not need +x, so this makes them eligible for 7zip compression too
2008 chmod a-x Xonotic/*.exe Xonotic/*.dll || true
2009 # let's pass crypto import laws of some nasty countries
2010 crypto_libs=`find Xonotic -name \*d0_rijndael\*.so -o -name \*d0_rijndael\*.dylib -o -name \*d0_rijndael\*.dll -o -name \*d0_rijndael\*.c`
2011 if [ -n "$crypto_libs" ]; then
2012 verbose mkzip Xonotic-$stamp-crypto.zip \
2014 Xonotic/COPYING Xonotic/GPL-2 Xonotic/GPL-3
2017 # build the archives
2018 verbose mkzip Xonotic-$stamp-enginesource.zip \
2019 Xonotic/source/darkplaces/ \
2020 Xonotic/COPYING Xonotic/GPL-2 Xonotic/GPL-3
2021 verbose cp Xonotic-$stamp-enginesource.zip Xonotic-$stamp-engine.zip
2022 verbose mkzip Xonotic-$stamp-engine.zip \
2024 Xonotic/bin32/*.dll \
2025 Xonotic/bin64/*.dll \
2029 verbose cp Xonotic-$stamp-engine.zip Xonotic-$stamp-common.zip
2030 verbose mkzip Xonotic-$stamp-common.zip \
2031 Xonotic/source/fteqcc/ \
2032 Xonotic/source/qcsrc/ \
2037 Xonotic/key_0.d0pk \
2038 Xonotic/data/font-nimbussansl-$stamp.pk3 \
2039 Xonotic/data/font-xolonium-$stamp.pk3
2040 verbose cp Xonotic-$stamp-enginesource.zip Xonotic-$stamp-source.zip
2041 verbose mkzip Xonotic-$stamp-source.zip \
2042 Xonotic/source/fteqcc/ \
2043 Xonotic/source/qcsrc/ \
2045 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp.zip
2046 verbose mkzip0 Xonotic-$stamp.zip \
2047 Xonotic/data/xonotic-$stamp-data.pk3 \
2048 Xonotic/data/xonotic-$stamp-maps.pk3 \
2049 Xonotic/data/xonotic-$stamp-music.pk3 \
2050 Xonotic/data/xonotic-$stamp-nexcompat.pk3
2051 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp-low.zip
2052 verbose mkzip0 Xonotic-$stamp-low.zip \
2053 Xonotic/data/xonotic-$stamp-data-low.pk3 \
2054 Xonotic/data/xonotic-$stamp-maps-low.pk3 \
2055 Xonotic/data/xonotic-$stamp-music-low.pk3
2056 verbose mv Xonotic-$stamp-common.zip Xonotic-$stamp-high.zip
2057 verbose mkzip Xonotic-$stamp-high.zip \
2059 verbose mkzip0 Xonotic-$stamp-high.zip \
2060 Xonotic/data/xonotic-$stamp-data-high.pk3 \
2061 Xonotic/data/xonotic-$stamp-maps-high.pk3 \
2062 Xonotic/data/xonotic-$stamp-music.pk3 \
2063 Xonotic/data/xonotic-$stamp-nexcompat-high.pk3
2064 verbose mkzip Xonotic-$stamp-mappingsupport.zip \
2066 verbose mkzip0 Xonotic-$stamp-mappingsupport.zip \
2067 Xonotic/data/xonotic-$stamp-maps-mapping.pk3
2070 verbose "$SELF" release-prepare
2071 verbose "$SELF" release-maps
2072 verbose "$SELF" release-engine
2073 verbose "$SELF" release-qc
2074 verbose "$SELF" release-pack-needsx11
2075 verbose "$SELF" release-zip
2080 $ECHO " $SELF admin-merge [<branch>]"
2081 $ECHO " $SELF branch <branch>"
2082 $ECHO " $SELF branch <remote> <branch> [<srcbranch>]"
2083 $ECHO " $SELF branches"
2084 $ECHO " $SELF checkout|switch <branch>"
2085 $ECHO " $SELF checkout|switch <remote>/<branch>"
2086 $ECHO " $SELF clean [-m] [-f | -fu | -fU] [-r] [-D]"
2087 $ECHO " $SELF clean --reclone"
2088 $ECHO " $SELF compile [-c] [-r|-p] [-0] [sdl|glx|wgl|agl|dedicated]"
2089 $ECHO " $SELF each|foreach [-k] command..."
2090 $ECHO " $SELF fix_upstream_rebase"
2091 $ECHO " $SELF keygen"
2092 $ECHO " $SELF merge"
2093 $ECHO " $SELF push|commit [-s]"
2094 $ECHO " $SELF restore-patches"
2095 $ECHO " $SELF run [sdl|glx|wgl|agl|dedicated] options..."
2096 $ECHO " $SELF save-patches"
2097 $ECHO " $SELF update-maps"
2098 $ECHO " $SELF update|pull [-N] [-s | -h [-p] | -g [-p]] [-l de|nl|default]"