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@push.git.xonotic.org/" ]; then
591 base=ssh://xonotic@push.git.xonotic.org/
594 if [ x"$1" = x"-N" ]; then
596 elif [ x"$1" = x"-p" ]; then
597 pushbase=ssh://xonotic@push.git.xonotic.org/
598 elif [ x"$1" = x"-ps" ]; then
599 pushbase=ssh://xonotic@push.git.xonotic.org/
600 elif [ x"$1" = x"-ph" ]; then
601 pushbase=http://push.git.xonotic.org/login/xonotic/
602 elif [ x"$1" = x"-s" ]; then
603 base=ssh://xonotic@push.git.xonotic.org/
604 elif [ x"$1" = x"-g" ]; then
605 base=git://git.xonotic.org/xonotic/
607 elif [ x"$1" = x"-h" ]; then
608 base=http://git.xonotic.org/xonotic/
610 elif [ x"$1" = x"-l" ]; then
618 msg "Invalid location!"
619 msg "Possible locations for the -l option:"
620 msg " nl (Netherlands, run by merlijn)"
621 msg " de (Germany, run by divVerent)"
622 msg " us (United States of America, run by detrate)"
623 msg " best (find automatically)"
624 msg " default (currently nl)"
637 if [ x"`git config xonotic.all.mirrorselection 2>/dev/null || true`" != x"done" ]; then
644 # if we fetched via ssh://, switch to git:// for fetching and keep using ssh:// for pushing
648 base=git://git.xonotic.org/xonotic/
651 newbase=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,:// .git.xonotic.org/,"`
654 if location=`bestmirror $newbase"xonotic.git" de us nl:'*6/5'`; then # 20% malus to the NL server to not overload it too much
655 git config xonotic.all.mirrorselection done
672 *://*.git.xonotic.org/*)
673 location=${base%%.git.xonotic.org/*}
674 location=${location##*://}
682 if [ -n "$location" ]; then
683 base=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,://$location.git.xonotic.org/,"`
685 base=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,://git.xonotic.org/,"`
687 pushbase=`$ECHO "$pushbase" | sed "s,://\(.*\.\)\?git.xonotic.org/,://xonotic@push.git.xonotic.org/,"`
688 if [ x"$base" != x"$oldbase" ] || [ x"$pushbase" != x"$oldpushbase" ]; then
690 pushurl=`repopushurl .`
691 fix_git_config "$url" "$pushurl"
693 elif $allow_pull; then
698 pushurl=`repopushurl "$d"`
699 branch=`repobranch "$d"`
700 if [ -f "$d0/$d/.git/config" ]; then
701 # if we have .no file, skip
702 if [ -f "$d0/$d.no" ]; then
703 msg "Repository $d disabled by a .no file, delete $d.no to enable; thus, not updated"
707 enter "$d0/$d" verbose
708 r=`git symbolic-ref HEAD`
710 if git config branch.$r.remote >/dev/null 2>&1; then
711 if ! verbose git pull; then
712 fix_upstream_rebase_mergefail || true
713 check_mergeconflict "$d"
714 $ECHO "Pulling failed. Press ENTER to continue, or Ctrl-C to abort."
717 fix_upstream_rebase_mergeok || true
722 checkself "$cmd" "$@"
724 verbose git remote prune origin
728 if [ -d "$d0/$d" ]; then
729 if yesno "$d0/$d is in the way, get rid of it and reclone?"; then
730 verbose rm -rf "$d0/$d"
732 echo "Note: $d0/$d will stay broken."
736 verbose git clone "$url" "$d0/$d"
737 enter "$d0/$d" verbose
738 fix_git_config "$url" "$pushurl"
739 if [ "$branch" != "master" ]; then
740 verbose git checkout --track -b "$branch" origin/"$branch"
747 misc/tools/xonotic-map-compiler-autobuild download
751 if [ x"$1" = x"-f" ]; then
757 if [ -z "$branch" ]; then
760 branch=${remote#origin/}
769 if [ -n "$checkoutflags" ]; then
770 set -- -f "$@" # to make checkself work again
774 enter "$d0/$d" verbose
776 if [ -n "$b" ] && git rev-parse "refs/heads/$b" >/dev/null 2>&1; then
778 verbose git checkout $checkoutflags "$b"
779 elif [ -n "$b" ] && git rev-parse "refs/remotes/$remote/$b" >/dev/null 2>&1; then
781 verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
784 if git rev-parse "refs/heads/$b" >/dev/null 2>&1; then
785 verbose git checkout $checkoutflags "$b"
786 elif git rev-parse "refs/remotes/$remote/$b" >/dev/null 2>&1; then
787 verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
789 $ECHO "WTF? Not even branch $b doesn't exist in $d"
794 checkself "$cmd" "$@"
798 $ECHO "The requested branch was not found in any repository."
806 if [ -z "$branch" ]; then
810 if [ -z "$branch" ]; then
813 r=`git symbolic-ref HEAD`
820 dv=`visible_repo_name "$d"`
821 enter "$d0/$d" verbose
822 if git rev-parse "refs/heads/$branch" >/dev/null 2>&1; then
823 $ECHO "Already having this branch in $dv."
825 if yesno "Branch in $dv?"; then
826 if [ -n "$srcbranch" ]; then
829 b=origin/"`repobranch "$d"`"
830 verbose git fetch origin || true
832 # TODO do this without pushing
833 verbose git checkout -b "$branch" "$b"
834 verbose git config "branch.$branch.remote" "$remote"
835 verbose git config "branch.$branch.merge" "refs/heads/$branch"
845 cd "$d0/$d" # am in a pipe, shouldn't use enter
846 git branch -r -v -v | cut -c 3- | sed "s/^(no branch)/(no_branch)/" | sed "s,^,$d ,"
851 while read -r d BRANCH REV TEXT; do
852 if [ x"$BRANCH" = x"`repobranch "$d"`" ]; then
855 if [ x"$REV" = x"->" ]; then
858 BRANCH=${BRANCH#remotes/}
859 ID=`$ECHO "$BRANCH" | tr -c "A-Za-z0-9." "_"`
860 branches_list="$branches_list $BRANCH" # TEH SORT MAKEZ IT UNIEQ
861 eval "r=\$branches_repos_$ID"
863 eval "branches_repos_$ID=\$r"
865 $ECHO -n "$branches_list" | xargs -n 1 $ECHO | sort -u | while IFS= read -r BRANCH; do
866 ID=`$ECHO "$BRANCH" | tr -c "A-Za-z0-9." "_"`
867 eval "r=\$branches_repos_$ID"
868 printf "%-60s %s\n" "$BRANCH" "$r"
875 dv=`visible_repo_name "$d"`
876 enter "$d0/$d" verbose
877 r=`git symbolic-ref HEAD`
879 if git log HEAD..origin/"`repobranch "$d"`" | grep .; then
880 # we have uncommitted changes
881 if yesno "Could merge from \"`repobranch "$d"`\" into \"$r\" in $dv. Do it?"; then
882 if ! verbose git merge origin/"`repobranch "$d"`"; then
883 check_mergeconflict "$d"
884 exit 1 # this should ALWAYS be fatal
894 dv=`visible_repo_name "$d"`
895 enter "$d0/$d" verbose
896 r=`git symbolic-ref HEAD`
898 diffdata=`git diff --color HEAD`
899 if [ -n "$diffdata" ]; then
900 # we have uncommitted changes
901 if yesno "Uncommitted changes in \"$r\" in $dv. Commit?" '$ECHO "$diffdata" | less -r'; then
902 verbose git commit -a
905 rem=`git config "branch.$r.remote" || $ECHO origin`
906 bra=`git config "branch.$r.merge" || $ECHO "$r"`
907 upstream="$rem/${bra#refs/heads/}"
908 if ! git rev-parse "$upstream" >/dev/null 2>&1; then
909 upstream="origin/`repobranch "$d"`"
911 logdata=`git log --color "$upstream".."$r"`
912 if [ -n "$logdata" ]; then
913 if yesno "Push \"$r\" in $dv?" '$ECHO "$logdata" | less -r'; then
914 verbose git push "$rem" HEAD
917 if [ x"$submit" = x"-s" ]; then
920 verbose git push "$rem" HEAD:"${bra%%/*}/finished/${bra#*/}"
934 snowleopardhack=false
935 if [ -z "$CC" ]; then
936 export CC="gcc -DSUPPORTIPV6"
961 case "`$CC -dumpversion`" in
962 [5-9]*|[1-9][0-9]*|4.[3-9]*|4.[1-9][0-9]*)
964 # -march=native is broken < 4.3
965 if $CC -mtune=native -march=native misc/tools/conftest.c -o conftest >/dev/null 2>&1; then
966 export CC="$CC -mtune=native -march=native"
970 if [ -n "$WE_HATE_OUR_USERS" ]; then
971 export CC="$CC -fno-common"
980 if [ -n "$WE_HATE_OUR_USERS" ]; then
981 TARGETS="sv-$debug cl-$debug"
982 elif [ x"`uname`" = x"Darwin" ]; then
985 TARGETS="sv-$debug cl-$debug sdl-$debug"
988 # AGL cannot be compiled on systems with a kernel > 10.x (Snow Leopard)
990 TARGETS="sv-$debug sdl-$debug"
993 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"
995 TARGETS="sv-$debug cl-$debug sdl-$debug"
997 if [ $# -gt 0 ] && [ x"$1" = x"" ]; then
998 # if we give the command make the arg "", it will surely fail (invalid filename),
999 # so better handle it as an empty client option
1002 elif [ -n "$1" ]; then
1004 TARGETS_SAVE=$TARGETS
1009 TARGETS="$TARGETS sdl-debug"
1012 TARGETS="$TARGETS cl-debug"
1013 if $snowleopardhack; then
1014 export CC="$CC -arch i386"
1018 TARGETS="$TARGETS cl-debug"
1021 TARGETS="$TARGETS sv-debug"
1024 BAD_TARGETS="$BAD_TARGETS $X"
1028 if [ -n "$TARGETS" ]; then # at least a valid client
1030 else # no valid client, let's assume this option is not meant to be a client then
1031 TARGETS=$TARGETS_SAVE
1035 if [ -z "$MAKEFLAGS" ]; then
1036 if [ -f /proc/cpuinfo ]; then
1037 ncpus=$((`grep -c '^processor :' /proc/cpuinfo || true`+0))
1038 if [ $ncpus -gt 1 ]; then
1042 if [ -n "$WE_HATE_OUR_USERS" ]; then
1043 MAKEFLAGS="$MAKEFLAGS DP_MAKE_TARGET=mingw LIB_JPEG= CFLAGS_LIBJPEG="
1048 if ! verbose $CC misc/tools/conftest.c -o conftest; then
1050 msg "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
1051 msg "~~~~~~~~~~ COMPILER ~~~~~~~~~~"
1052 msg "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
1053 msg "~~~~~~~~~~~~~~_...._~~~~~~~~~~"
1054 msg "~~~~~~~~~~~,-' \\\`-._~~~~~~"
1055 msg "~~~~~~~~~~/ --. >< \\~~~~~"
1056 msg "~~~~~~~~~/ (*)> -<: \\~~~~"
1057 msg "~~~~~~~~~( ^~-' (*) )~~~~"
1058 msg "~~~~~~~~~\\ ^+-_/ |~~~~"
1059 msg "~~~~~~~~~~\\ {vvv} |~~~~"
1060 msg "~~~~~~~~~~,\\ , {^^^},/~~~~~"
1061 msg "~~~~~~~~,/ \`---.....-'~~W~~~~"
1062 msg "~~~~~~,/ \\_____/_\\_W~~/~~~~~"
1063 msg "~~~~~/ /~~~\\__/~~~~~~"
1064 msg "~~~~/ /~~~~~~~~~~~~~~"
1065 msg "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
1066 msg "~~~~~~~ Y U NO COMPILE ~~~~~~~"
1067 msg "~~~~~~~~~~~~ CODE ~~~~~~~~~~~~"
1068 msg "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
1074 verbose cd "$d0/d0_blind_id"
1075 if ! $compiled0; then
1076 # compilation of crypto library failed
1077 # use binaries then, if we can...
1079 if [ -n "$WE_HATE_OUR_USERS" ]; then
1080 verbose cp "$d0/misc/buildfiles/win32/libd0_blind_id"-* .libs/
1081 verbose cp "$d0/misc/buildfiles/win32/libd0_rijndael"-* .libs/
1082 verbose cp "$d0/misc/buildfiles/win32/libgmp"-* .libs/
1088 #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_blind_id".* .libs/
1089 #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_rijndael".* .libs/
1090 #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libgmp".* .libs/
1091 MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/ DP_CRYPTO_RIJNDAEL_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/"
1094 #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_blind_id".* .libs/
1095 #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_rijndael".* .libs/
1096 #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libgmp".* .libs/
1097 MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/ DP_CRYPTO_RIJNDAEL_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/"
1105 verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_blind_id".* .libs/
1106 verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_rijndael".* .libs/
1116 if [ -f Makefile ]; then
1117 verbose make $MAKEFLAGS distclean
1120 if ! [ -f Makefile ]; then
1121 verbose sh autogen.sh
1124 verbose make $MAKEFLAGS
1127 verbose cd "$d0/fteqcc"
1129 verbose make $MAKEFLAGS clean
1131 verbose make $MAKEFLAGS
1133 verbose cd "$d0/data/xonotic-data.pk3dir"
1135 verbose make FTEQCC="../../../../fteqcc/fteqcc.bin" "$@" $MAKEFLAGS clean
1137 verbose make FTEQCC="../../../../fteqcc/fteqcc.bin" "$@" $MAKEFLAGS
1138 # 4 levels up: data, xonotic-data, qcsrc, server
1140 verbose cd "$d0/darkplaces"
1141 if [ x"$BAD_TARGETS" = x" " ]; then
1142 $ECHO "Warning: invalid empty client, default clients will be used."
1145 verbose make $MAKEFLAGS clean
1147 for T in $TARGETS; do
1148 verbose make $MAKEFLAGS STRIP=: "$@" "$T"
1150 for T in $BAD_TARGETS; do
1151 $ECHO "Warning: discarded invalid client $T."
1154 verbose "$SELF" update-maps
1157 if [ -n "$WE_HATE_OUR_USERS" ]; then
1159 export PATH="$d0/misc/buildfiles/win32:$d0/d0_blind_id/.libs:$PATH"
1160 elif [ x"`uname`" = x"Darwin" ]; then
1161 export DYLD_LIBRARY_PATH="$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS:$d0/d0_blind_id/.libs"
1162 export DYLD_FRAMEWORK_PATH="$d0/misc/buildfiles/osx/Xonotic.app/Contents/Frameworks"
1165 export LD_LIBRARY_PATH="$d0/d0_blind_id/.libs"
1169 sdl|glx|agl|dedicated)
1178 if ! [ -x "darkplaces/darkplaces$client" ]; then
1179 if [ -x "darkplaces/darkplaces$client.exe" ]; then
1182 $ECHO "Client darkplaces/darkplaces$client not found, aborting"
1186 set -- "darkplaces/darkplaces$client" -xonotic "$@"
1188 # if pulseaudio is running: USE IT
1189 if [ -z "$SDL_AUDIODRIVER" ] && ! [ -n "$WE_HATE_OUR_USERS" ] && ! [ x"`uname`" = x"Darwin" ]; then
1190 if ps -C pulseaudio >/dev/null; then
1191 if ldd /usr/lib/libSDL.so 2>/dev/null | grep pulse >/dev/null; then
1192 export SDL_AUDIODRIVER=pulse
1199 if [ x"$USE_GDB" = x"yes" ]; then
1200 set -- gdb --args "$@"
1201 elif [ x"$USE_GDB" = x"core" ] && which gdb >/dev/null 2>&1; then
1202 set -- gdb --batch -x savecore.gdb --args "$@"
1203 elif which catchsegv >/dev/null 2>&1; then
1204 set -- catchsegv "$@"
1208 if [ -f xonotic.core ]; then
1209 if yesno "The program has CRASHED. Do you want to examine the core dump?"; then
1210 gdb "$binary" xonotic.core
1211 #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
1212 # tar cvzf xonotic.core.tar.gz xonotic.core darkplaces/*.c darkplaces/*.h
1214 # rm -f xonotic.core.tar.gz
1216 $ECHO "The core dump can be examined later by"
1217 $ECHO " gdb $binary xonotic.core"
1224 if [ x"$1" = x"-k" ]; then
1229 if verbose cd "$d0/$d"; then
1230 if $keep_going; then
1231 verbose "$@" || true
1241 patchdir=`mktemp -d -t save-patches.XXXXXX`
1243 enter "$d0/$d" verbose
1244 git branch -v -v | cut -c 3- | {
1246 while read -r BRANCH REV UPSTREAM TEXT; do
1249 UPSTREAM=${UPSTREAM#\[}
1250 UPSTREAM=${UPSTREAM%\]}
1251 UPSTREAM=${UPSTREAM%:*}
1255 UPSTREAM=origin/"`repobranch "$d"`"
1259 if [ x"$REV" = x"->" ]; then
1262 if git format-patch -o "$patchdir/$i" "$UPSTREAM".."$BRANCH"; then
1263 $ECHO "$d" > "$patchdir/$i/info.txt"
1264 $ECHO "$BRANCH" >> "$patchdir/$i/info.txt"
1265 $ECHO "$UPSTREAM" >> "$patchdir/$i/info.txt"
1266 $ECHO "$TRACK" >> "$patchdir/$i/info.txt"
1269 rm -rf "$patchdir/$i"
1274 ( cd "$patchdir" && tar cvzf - . ) > "$outfile"
1279 patchdir=`mktemp -d -t restore-patches.XXXXXX`
1280 ( cd "$patchdir" && tar xvzf - ) < "$infile"
1282 for P in "$patchdir"/*/info.txt; do
1287 read -r UPSTREAM <&3
1289 verbose git checkout HEAD^0
1290 verbose git branch -D "$BRANCH"
1291 if [ x"$TRACK" = x"true" ]; then
1292 verbose git checkout --track -b "$BRANCH" "$UPSTREAM"
1294 verbose git branch -b "$BRANCH" "$UPSTREAM"
1313 report=$report"$*$LF"
1318 report=$report" $*$LF"
1323 o=`"$@" | sed 's/^/ /' || true`
1329 # sorry, fteqcc repo is managed manually
1333 enter "$d0/$d" verbose
1334 base="`repobranch "$d"`"
1336 for ref in `git for-each-ref --format='%(refname)' refs/remotes/origin/`; do
1337 case "${ref#refs/remotes/origin/}" in
1350 if [ -n "$branch" ]; then
1351 if [ x"$branch" != x"${ref#refs/remotes/origin/}" ]; then
1360 l0=`git rev-list "$base".."$ref" | wc -l`
1361 l1=`git rev-list master.."$ref" | wc -l`
1362 if [ $l0 -gt $l1 ]; then
1369 reportecho " Branch $ref:"
1370 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1371 logdata=`git log --color "$realbase".."$ref"`
1372 if [ -z "$logdata" ]; then
1373 reportecho4 "--> not merging, no changes vs master"
1374 if yesno "Branch \"$ref\" probably should get deleted. Do it?" ''; then
1375 git push origin :"${ref#refs/remotes/origin/}"
1376 reportecho4 "--> branch deleted"
1379 diffdata=`git diff --color --find-copies-harder --ignore-space-change "$realbase"..."$ref"`
1380 if [ -z "$diffdata" ]; then
1381 reportecho4 "--> not merging, no changes vs master, branch contains redundant history"
1382 if yesno "Branch \"$ref\" probably should get deleted. Do it?" '{ $ECHO "$logdata"; } | less -r'; then
1383 git push origin :"${ref#refs/remotes/origin/}"
1384 reportecho4 "--> branch deleted"
1386 elif $only_delete; then
1387 reportecho4 "--> skipped in delete-only run"
1388 elif [ -z "$branch" ] && [ -n "$note" ]; then
1389 reportdo4 $ECHO "$note"
1390 reportecho4 "--> not merging, already had this one rejected before"
1391 elif yesno "Branch \"$ref\" may want to get merged. Do it?" '{ $ECHO "$logdata"; $ECHO "$diffdata"; } | less -r'; then
1392 git checkout "$realbase"
1393 org=`git rev-parse HEAD`
1394 if ! git merge --no-ff "$ref" 2>&1 | tee "$t" && ! { git ls-files -u | grep ' 1 ' >/dev/null; }; then
1395 git reset --hard "$org"
1396 GIT_NOTES_REF=refs/notes/admin-merge git notes edit -m "Merge failed:$LF`cat "$t"`" "$ref"
1398 reportecho4 "--> merge failed"
1399 elif ! "$SELF" compile 2>&1 | tee "$t"; then
1400 git reset --hard "$org"
1401 GIT_NOTES_REF=refs/notes/admin-merge git notes edit -m "Compile failed:$LF`cat "$t"`" "$ref"
1403 reportecho4 "--> compile failed"
1404 elif ! yesno "Still merge \"$ref\" into `git symbolic-ref HEAD` of $d? Maybe you want to test first."; then
1405 git reset --hard "$org"
1406 GIT_NOTES_REF=refs/notes/admin-merge git notes edit "$ref"
1407 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1408 if [ x"$note" = x"del" ]; then
1409 git push origin :"${ref#refs/remotes/origin/}"
1410 reportecho4 "--> test failed, branch deleted"
1411 elif [ -n "$note" ]; then
1412 reportdo4 $ECHO "$note"
1413 reportecho4 "--> test failed"
1415 reportecho4 "--> test failed, postponed"
1418 # apply crlf, or other cleanup filters (non-behavioural changes)
1420 find . -type f -exec touch {} \;
1421 git commit -a --amend -C HEAD || true # don't fail if nothing to commit
1424 case ",`repoflags "$d"`," in
1426 # we do quite a mess here... luckily we know $org
1427 git fetch # svn needs to be current
1428 git rebase -i --onto origin/master "$org"
1429 git svn dcommit --add-author-from
1430 git reset --hard "$org"
1433 git push origin HEAD
1436 reportecho4 "--> MERGED"
1437 if yesno "Delete original branch \"$ref\"?"; then
1438 git push origin :"${ref#refs/remotes/origin/}"
1439 reportecho4 "--> branch deleted"
1443 GIT_NOTES_REF=refs/notes/admin-merge git notes edit "$ref"
1444 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1445 if [ x"$note" = x"del" ]; then
1446 git push origin :"${ref#refs/remotes/origin/}"
1447 reportecho4 "--> branch deleted"
1448 elif [ -n "$note" ]; then
1449 reportdo4 $ECHO "$note"
1450 reportecho4 "--> rejected"
1452 reportecho4 "--> postponed"
1461 $ECHO "$report" | ssh nexuiz@rm.endoftheinternet.org cat '>>' public_html/xonotic-merge-notes.txt
1473 # ./all clean [-m] [-f | -fu | -fU] [-r] [-D]
1474 # ./all clean --reclone
1477 if [ x"$X" = x"--reclone" ]; then
1484 elif [ x"$X" = x"-f" ]; then
1486 elif [ x"$X" = x"-u" ]; then
1488 elif [ x"$X" = x"-U" ]; then
1491 elif [ x"$X" = x"-fu" ]; then
1494 elif [ x"$X" = x"-fU" ]; then
1498 elif [ x"$X" = x"-m" ]; then
1500 elif [ x"$X" = x"-r" ]; then
1502 elif [ x"$X" = x"-D" ]; then
1504 elif $ECHO "$X" | grep '^-FFFF*UUUU*$' >/dev/null; then
1507 msg " ,--'-\\P/\`\\ FFFFFFF"
1508 msg " __/_ B/,-.\\ FFFFFFF"
1509 msg " / _\\ (// O\\\\ FFFFFF"
1510 msg "| (O \`) _\\._ _)\\ FFFUU"
1511 msg "| |___/.^d0~~\"\\ \\ UUUU"
1512 msg "| |\`~' \\ | UUUU"
1513 msg "| | __,C>|| UUUU"
1514 msg "\\ /_ ,-/,-' | UUUU"
1515 msg " \\\\_ \\_>~' / UUUU-"
1518 msg "Unknown arg: $X"
1527 if $gotoupstream; then
1529 msg "Must also use -f (delete local changes) when using -u"
1532 if $gotomaster; then
1533 if $fetchupstream; then
1534 verbose git fetch origin
1535 verbose git remote prune origin
1537 verbose git checkout -f "`repobranch "$d"`"
1538 verbose git reset --hard origin/"`repobranch "$d"`"
1540 r=`git symbolic-ref HEAD`
1542 rem=`git config "branch.$r.remote" || $ECHO origin`
1543 bra=`git config "branch.$r.merge" || $ECHO "$r"`
1544 upstream="$rem/${bra#refs/heads/}"
1545 if $fetchupstream; then
1546 verbose git fetch "$rem"
1547 verbose git remote prune "$rem"
1549 if ! git rev-parse "$upstream" >/dev/null 2>&1; then
1550 upstream="origin/`repobranch "$d"`"
1552 verbose git reset --hard "$upstream"
1554 elif $gotomaster; then
1556 verbose git checkout -f "`repobranch "$d"`"
1557 verbose git reset --hard
1559 verbose git checkout "`repobranch "$d"`"
1562 verbose git reset --hard
1564 if $rmuntracked; then
1567 verbose git clean -df || true
1570 verbose git clean -xdf || true
1574 if $killbranches; then
1575 git for-each-ref --format='%(refname)' refs/heads/ | while IFS= read -r B; do
1576 if [ x"$B" != x"`git symbolic-ref HEAD`" ]; then
1577 verbose git branch -D "${B#refs/heads/}"
1580 git rev-parse refs/heads/master >/dev/null 2>&1 || verbose git branch --track master origin/master || true
1581 git rev-parse "refs/heads/`repobranch "$d"`" >/dev/null 2>&1 || verbose git branch --track "`repobranch "$d"`" origin/"`repobranch "$d"`" || true
1583 checkself "$cmd" "$@"
1587 # release building goes here
1589 #"$SELF" each git clean -fxd
1590 case "$RELEASETYPE" in
1592 $ECHO >&2 -n "$ESC[2J$ESC[H"
1599 msg " +---------------------------------------------------------.---+"
1601 msg " +---------------------------------------------------------^---+"
1603 msg " | / \ This is the official release build system. |"
1604 msg " | | | If you are not a member of the Xonotic Core Team, |"
1605 msg " | | STOP | you are not supposed to use this script and should |"
1606 msg " | | | instead use ./all compile to compile the engine |"
1607 msg " | \____/ and game code. |"
1609 msg " | [ I understand ] |"
1610 msg " +-------------------------------------------------------------+"
1612 # A LOT of build infrastructure is required:
1615 # - .ssh/config must be configured so the following
1616 # host names are reachable and have a compile
1617 # infrastructure set up:
1618 # - xonotic-build-linux32 (with gcc on x86)
1619 # - xonotic-build-linux64 (with gcc on x86_64)
1620 # - xonotic-build-win32 (with i586-mingw32msvc-g++)
1621 # - xonotic-build-win64 (with amd64-mingw32msvc-g++
1622 # and x86_64-w64-mingw32-g++)
1623 # - xonotic-build-osx (with Xcode and SDL.framework)
1624 # - AMD Compressonator installed in WINE
1625 # - ResEdit installed in WINE
1626 # - a lot of other requirements you will figure out
1627 # while reading the error messages
1628 # - environment variable RELEASETYPE set
1629 # - optionally, environment variable RELEASEDATE set
1634 msg "Building a FINISHED RELEASE"
1637 msg "Building a $RELEASETYPE"
1640 verbose rm -rf Xonotic Xonotic*.zip
1641 verbose mkdir -p Xonotic
1642 if [ -n "$RELEASEDATE" ]; then
1643 verbose $ECHO "$RELEASEDATE" > Xonotic/stamp.txt
1645 verbose date +%Y%m%d > Xonotic/stamp.txt
1647 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
1650 verbose mkdir data fteqcc source source/darkplaces source/fteqcc source/d0_blind_id mapping
1651 verbose rm -rf misc/builddeps
1652 verbose mv misc/buildfiles/win32 bin32 || true
1653 verbose mv bin32/SDL.dll . || true
1654 verbose mv misc/buildfiles/win64 bin64 || true
1655 verbose mv misc/buildfiles/osx/* . || true
1656 verbose rm -rf misc/buildfiles
1657 verbose rm -rf misc/pki
1659 release_git_extract_dir "darkplaces" "Xonotic/source/darkplaces" .
1660 release_git_extract_dir "fteqcc" "Xonotic/source/fteqcc" .
1661 release_git_extract_dir "data/xonotic-data.pk3dir" "Xonotic/source" qcsrc Makefile
1662 release_git_extract_dir "d0_blind_id" "Xonotic/source/d0_blind_id" .
1664 verbose cd Xonotic/source/d0_blind_id
1665 verbose sh autogen.sh
1667 rm -f Xonotic/key_15.d0pk
1669 verbose cd Xonotic/mapping
1670 verbose wget http://www.icculus.org/netradiant/files/netradiant-1.5.0-20120113.tar.bz2
1671 verbose wget http://www.icculus.org/netradiant/files/netradiant-1.5.0-20120113-win32-7z.exe
1672 for X in *-7z.exe; do
1676 # TODO possibly include other tools?
1679 release-compile-run)
1688 if [ -n "$targetfiles" ]; then
1689 case " $HOSTS_THAT_ARE_DISABLED " in
1694 case " $HOSTS_THAT_ARE_MYSELF " in
1696 verbose rsync --delete -zLvaSHP "$srcdir"/ "$buildpath/"
1697 verbose rsync --delete -zLvaSHP "$depsdir"/ "$buildpath.deps/"
1698 verbose ln -snf "$buildpath.deps" "$buildpath/.deps"
1699 verbose eval make -C "$buildpath" clean $maketargets $makeflags
1700 for f in $targetfiles; do
1701 verbose mv "$buildpath/${f%:*}" "${f##*:}" || true
1705 verbose rsync --delete -zLvaSHP "$srcdir"/ "$host:$buildpath/"
1706 verbose rsync --delete -zLvaSHP "$depsdir"/ "$host:$buildpath.deps/"
1707 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"
1708 for f in $targetfiles; do
1709 verbose rsync -zvaSHP "$host:$buildpath/${f%:*}" "${f##*:}" || true
1713 # now rebrand the binaries...
1714 for f in $targetfiles; do
1715 #verbose "$d0/misc/tools/rebrand-darkplaces-engine.sh" "${XONOTIC_BRAND:-$d0/misc/tools/xonotic.brand}" "${f##*:}" || true
1717 Xonotic/xonotic*.exe)
1718 verbose "$d0/misc/tools/change-icon-of-exe.sh" "$d0/misc/logos/icons_ico/xonotic.ico" "${f##*:}"
1727 fteqcc_maketargets=$3
1729 darkplaces_maketargets=$5
1731 host=xonotic-build-$suffix
1732 verbose "$SELF" release-compile-run "$host" /tmp/fteqcc.build."$suffix" "$fteqcc_maketargets" "$makeflags" "Xonotic/source/fteqcc" "$d0/misc/builddeps/dp.$suffix" "$fteqcc_files"
1733 verbose "$SELF" release-compile-run "$host" /tmp/Darkplaces.build."$suffix" "$darkplaces_maketargets" "$makeflags" "Xonotic/source/darkplaces" "$d0/misc/builddeps/dp.$suffix" "$darkplaces_files"
1735 release-engine-win32)
1736 verbose "$SELF" release-compile win32 \
1737 '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' \
1738 win 'fteqcc.exe:Xonotic/fteqcc/fteqcc.exe' \
1740 verbose "$SELF" release-compile win32 \
1741 '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' \
1743 release 'darkplaces.exe:Xonotic/xonotic.exe darkplaces-sdl.exe:Xonotic/xonotic-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-dedicated.exe'
1745 release-engine-win64)
1746 verbose "$SELF" release-compile win64 \
1747 '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' \
1748 win 'fteqcc.exe:Xonotic/fteqcc/fteqcc-x64.exe' \
1749 'sv-release sdl-release' 'darkplaces-sdl.exe:Xonotic/xonotic-x64-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-x64-dedicated.exe'
1750 verbose "$SELF" release-compile win64 \
1751 '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' \
1753 cl-release 'darkplaces.exe:Xonotic/xonotic-x64.exe'
1756 # gcc on OSX is buggy, needs -fno-reorder-blocks for a release build to succeed
1757 verbose "$SELF" release-compile osx \
1758 '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"' \
1759 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.osx' \
1760 'sv-release sdl-release' 'darkplaces-sdl:Xonotic/Xonotic.app/Contents/MacOS/xonotic-osx-sdl-bin darkplaces-dedicated:Xonotic/xonotic-osx-dedicated'
1762 release-engine-linux32)
1763 verbose "$SELF" release-compile linux32 \
1764 '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' \
1765 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.linux32' \
1766 release 'darkplaces-glx:Xonotic/xonotic-linux32-glx darkplaces-sdl:Xonotic/xonotic-linux32-sdl darkplaces-dedicated:Xonotic/xonotic-linux32-dedicated'
1768 release-engine-linux64)
1769 verbose "$SELF" release-compile linux64 \
1770 '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' \
1771 all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.linux64' \
1772 release 'darkplaces-glx:Xonotic/xonotic-linux64-glx darkplaces-sdl:Xonotic/xonotic-linux64-sdl darkplaces-dedicated:Xonotic/xonotic-linux64-dedicated'
1775 verbose "$SELF" release-engine-linux32 &
1776 verbose "$SELF" release-engine-linux64 &
1777 verbose "$SELF" release-engine-win32 &
1778 verbose "$SELF" release-engine-win64 &
1779 verbose "$SELF" release-engine-osx &
1788 verbose "$SELF" update-maps
1791 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
1792 verbose rm -f Xonotic/source/qcsrc/*/fteqcc.log
1794 release-buildpk3-transform-raw)
1797 release-buildpk3-transform-normal)
1800 # texture: convert to jpeg and dds
1801 verbose export do_jpeg=true
1802 verbose export jpeg_qual_rgb=97
1803 verbose export jpeg_qual_a=99
1804 verbose export do_dds=false
1805 verbose export do_ogg=true
1806 verbose export ogg_ogg=false
1807 verbose export del_src=true
1808 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1810 release-buildpk3-transform-normaldds)
1813 # texture: convert to jpeg and dds
1814 # music: reduce bitrate
1815 verbose export do_jpeg=false
1816 verbose export do_jpeg_if_not_dds=true
1817 verbose export jpeg_qual_rgb=95
1818 verbose export jpeg_qual_a=99
1819 verbose export do_dds=true
1820 verbose export dds_flags=
1821 verbose export do_ogg=true
1822 verbose export ogg_ogg=false
1823 verbose export del_src=true
1824 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1826 release-buildpk3-transform-low)
1829 # texture: convert to jpeg and dds
1830 # music: reduce bitrate
1831 verbose export do_jpeg=true
1832 verbose export jpeg_qual_rgb=80
1833 verbose export jpeg_qual_a=97
1834 verbose export do_dds=false
1835 verbose export do_ogg=true
1836 verbose export ogg_qual=1
1837 verbose export del_src=true
1838 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1840 release-buildpk3-transform-lowdds)
1843 # texture: convert to jpeg and dds
1844 # music: reduce bitrate
1845 verbose export do_jpeg=false
1846 verbose export do_jpeg_if_not_dds=true
1847 verbose export jpeg_qual_rgb=80
1848 verbose export jpeg_qual_a=99
1849 verbose export do_dds=true
1850 verbose export dds_flags=
1851 verbose export do_ogg=true
1852 verbose export ogg_qual=1
1853 verbose export del_src=true
1854 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1856 release-buildpk3-transform-mapping)
1859 # remove stuff radiant has no use for
1860 verbose find . -name \*_norm.\* -exec rm -f {} \;
1861 verbose find . -name \*_bump.\* -exec rm -f {} \;
1862 verbose find . -name \*_glow.\* -exec rm -f {} \;
1863 verbose find . -name \*_gloss.\* -exec rm -f {} \;
1864 verbose find . -name \*_pants.\* -exec rm -f {} \;
1865 verbose find . -name \*_shirt.\* -exec rm -f {} \;
1866 verbose find . -name \*_reflect.\* -exec rm -f {} \;
1867 verbose find . -not \( -name \*.tga -o -name \*.png -o -name \*.jpg \) -exec rm -f {} \;
1868 # texture: convert to jpeg and dds
1869 # music: reduce bitrate
1870 verbose export do_jpeg=true
1871 verbose export jpeg_qual_rgb=80
1872 verbose export jpeg_qual_a=97
1873 verbose export do_dds=false
1874 verbose export do_ogg=true
1875 verbose export ogg_qual=1
1876 verbose export del_src=true
1877 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1891 verbose rm -rf Xonotic/temp
1892 release_timereport "deleted temp directory"
1893 verbose mkdir -p Xonotic/temp
1894 release_git_extract_dir "$src" "Xonotic/temp" .
1895 release_timereport "extracted data"
1896 verbose cd Xonotic/temp
1897 if [ x"$src" = x"data/xonotic-data.pk3dir" ]; then
1898 verbose cp ../source/progs.dat .
1899 verbose cp ../source/csprogs.dat .
1900 verbose cp ../source/menu.dat .
1901 verbose rm -rf qcsrc
1902 gv=`grep "^gameversion " "defaultXonotic.cfg" | awk '{ print $2 }'`
1903 major=$(($gv / 10000))
1904 minor=$((($gv / 100) - ($major * 100)))
1905 patch=$(($gv - ($major * 10000) - ($minor * 100)))
1906 versionstr="$major.$minor.$patch"
1907 case "$RELEASETYPE" in
1911 versionstr="$versionstr$RELEASETYPE"
1914 if [ $gv -lt 9900 ]; then
1915 # pre-1.0: compatible with any other pre-1.0
1917 s/^set g_xonoticversion [^ ]* /set g_xonoticversion $versionstr /;
1918 s/^gameversion_min [0-9]*/gameversion_min 0/;
1919 s/^gameversion_max [0-9]*/gameversion_max 9999/;
1920 " < defaultXonotic.cfg > defaultXonotic.cfg.new
1924 s/^set g_xonoticversion [^ ]* /set g_xonoticversion $versionstr /;
1925 s/^gameversion_min [0-9]*/gameversion_min $(( ($gv / 100) * 100 - 100 ))/;
1926 s/^gameversion_max [0-9]*/gameversion_max $(( ($gv / 100) * 100 + 199 ))/;
1927 " < defaultXonotic.cfg > defaultXonotic.cfg.new
1929 mv defaultXonotic.cfg.new defaultXonotic.cfg
1930 case "$RELEASETYPE" in
1932 echo "" >> defaultXonotic.cfg
1933 echo "// nicer menu" >> defaultXonotic.cfg
1934 echo "set menu_watermark \"\"" >> defaultXonotic.cfg
1938 verbose cd gfx/menu/luminos
1939 verbose rm -f background_l2.tga background_ingame_l2.tga
1940 verbose cp "$d0"/mediasource/gfx/menu/luminos_versionbuilder/background_l2.svg .
1941 verbose "$d0"/mediasource/gfx/menu/luminos_versionbuilder/versionbuilder "$versionstr"
1942 verbose rm background_l2.svg
1945 if [ x"$src" = x"data/xonotic-maps.pk3dir" ]; then
1946 for X in ../../data/*-????????????????????????????????????????-????????????????????????????????????????.pk3; do
1947 if [ -f "$X" ]; then
1949 verbose rm -f maps/*.log maps/*.irc maps/*.lin
1953 verbose export git_src_repo="$d0/$src" # skip hash-object
1954 release_timereport "processed data"
1955 verbose "$SELF" release-buildpk3-transform-$transform "Xonotic/temp"
1956 release_timereport "transformed data"
1957 find . -type f -size +4k | verbose "$d0"/misc/tools/symlink-deduplicate.sh
1958 release_timereport "deduplicated data"
1959 verbose mkzipr "../../$dst" *
1960 release_timereport "zipped data"
1962 verbose rm -rf Xonotic/temp
1963 release_timereport "deleted temp directory again"
1966 stamp=`cat Xonotic/stamp.txt`
1972 dst="data/xonotic-$stamp-${dst#data/xonotic-}"
1978 while [ "$#" -gt 1 ]; do
1979 verbose "$SELF" release-buildpk3 "$src" "Xonotic/$dst$2.pk3" "$1"
1985 verbose "$SELF" release-buildpk3s data/font-nimbussansl.pk3dir raw ''
1986 verbose "$SELF" release-buildpk3s data/font-xolonium.pk3dir raw ''
1987 verbose "$SELF" release-buildpk3s data/xonotic-data.pk3dir normal '-high' low '-low' normaldds ''
1988 verbose "$SELF" release-buildpk3s data/xonotic-maps.pk3dir normal '-high' low '-low' normaldds '' mapping '-mapping'
1989 verbose "$SELF" release-buildpk3s data/xonotic-music.pk3dir raw '' low '-low'
1990 verbose "$SELF" release-buildpk3s data/xonotic-nexcompat.pk3dir normal '-high' normaldds ''
1992 release-pack-needsx11)
1995 verbose startx "$SELF" release-pack -- /usr/bin/Xvfb :7
1998 verbose "$SELF" release-pack
2003 stamp=`cat Xonotic/stamp.txt`
2004 # exe and dll files do not need +x, so this makes them eligible for 7zip compression too
2005 chmod a-x Xonotic/*.exe Xonotic/*.dll || true
2006 # let's pass crypto import laws of some nasty countries
2007 crypto_libs=`find Xonotic -name \*d0_rijndael\*.so -o -name \*d0_rijndael\*.dylib -o -name \*d0_rijndael\*.dll -o -name \*d0_rijndael\*.c`
2008 if [ -n "$crypto_libs" ]; then
2009 verbose mkzip Xonotic-$stamp-crypto.zip \
2011 Xonotic/COPYING Xonotic/GPL-2 Xonotic/GPL-3
2014 # build the archives
2015 verbose mkzip Xonotic-$stamp-enginesource.zip \
2016 Xonotic/source/darkplaces/ \
2017 Xonotic/COPYING Xonotic/GPL-2 Xonotic/GPL-3
2018 verbose cp Xonotic-$stamp-enginesource.zip Xonotic-$stamp-engine.zip
2019 verbose mkzip Xonotic-$stamp-engine.zip \
2021 Xonotic/bin32/*.dll \
2022 Xonotic/bin64/*.dll \
2026 verbose cp Xonotic-$stamp-engine.zip Xonotic-$stamp-common.zip
2027 verbose mkzip Xonotic-$stamp-common.zip \
2028 Xonotic/source/fteqcc/ \
2029 Xonotic/source/qcsrc/ \
2034 Xonotic/key_0.d0pk \
2035 Xonotic/data/font-nimbussansl-$stamp.pk3 \
2036 Xonotic/data/font-xolonium-$stamp.pk3
2037 verbose cp Xonotic-$stamp-enginesource.zip Xonotic-$stamp-source.zip
2038 verbose mkzip Xonotic-$stamp-source.zip \
2039 Xonotic/source/fteqcc/ \
2040 Xonotic/source/qcsrc/ \
2042 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp.zip
2043 verbose mkzip0 Xonotic-$stamp.zip \
2044 Xonotic/data/xonotic-$stamp-data.pk3 \
2045 Xonotic/data/xonotic-$stamp-maps.pk3 \
2046 Xonotic/data/xonotic-$stamp-music.pk3 \
2047 Xonotic/data/xonotic-$stamp-nexcompat.pk3
2048 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp-low.zip
2049 verbose mkzip0 Xonotic-$stamp-low.zip \
2050 Xonotic/data/xonotic-$stamp-data-low.pk3 \
2051 Xonotic/data/xonotic-$stamp-maps-low.pk3 \
2052 Xonotic/data/xonotic-$stamp-music-low.pk3
2053 verbose mv Xonotic-$stamp-common.zip Xonotic-$stamp-high.zip
2054 verbose mkzip Xonotic-$stamp-high.zip \
2056 verbose mkzip0 Xonotic-$stamp-high.zip \
2057 Xonotic/data/xonotic-$stamp-data-high.pk3 \
2058 Xonotic/data/xonotic-$stamp-maps-high.pk3 \
2059 Xonotic/data/xonotic-$stamp-music.pk3 \
2060 Xonotic/data/xonotic-$stamp-nexcompat-high.pk3
2061 verbose mkzip Xonotic-$stamp-mappingsupport.zip \
2063 verbose mkzip0 Xonotic-$stamp-mappingsupport.zip \
2064 Xonotic/data/xonotic-$stamp-maps-mapping.pk3
2067 verbose "$SELF" release-prepare
2068 verbose "$SELF" release-maps
2069 verbose "$SELF" release-engine
2070 verbose "$SELF" release-qc
2071 verbose "$SELF" release-pack-needsx11
2072 verbose "$SELF" release-zip
2077 $ECHO " $SELF admin-merge [<branch>]"
2078 $ECHO " $SELF branch <branch>"
2079 $ECHO " $SELF branch <remote> <branch> [<srcbranch>]"
2080 $ECHO " $SELF branches"
2081 $ECHO " $SELF checkout|switch <branch>"
2082 $ECHO " $SELF checkout|switch <remote>/<branch>"
2083 $ECHO " $SELF clean [-m] [-f | -fu | -fU] [-r] [-D]"
2084 $ECHO " $SELF clean --reclone"
2085 $ECHO " $SELF compile [-c] [-r|-p] [-0] [sdl|glx|wgl|agl|dedicated]"
2086 $ECHO " $SELF each|foreach [-k] command..."
2087 $ECHO " $SELF fix_upstream_rebase"
2088 $ECHO " $SELF keygen"
2089 $ECHO " $SELF merge"
2090 $ECHO " $SELF push|commit [-s]"
2091 $ECHO " $SELF restore-patches"
2092 $ECHO " $SELF run [sdl|glx|wgl|agl|dedicated] options..."
2093 $ECHO " $SELF save-patches"
2094 $ECHO " $SELF update-maps"
2095 $ECHO " $SELF update|pull [-N] [-s | -h [-p] | -g [-p]] [-l de|nl|default]"