]> git.xonotic.org Git - xonotic/xonotic.git/blobdiff - all
enable the rijndael lib in git builds by default
[xonotic/xonotic.git] / all
diff --git a/all b/all
index 96cd3b5b05ac8c45a92f95491036ea1772004cc6..df9bd21e9df69d3e18e26e0378db5c13e520273b 100755 (executable)
--- a/all
+++ b/all
@@ -2,6 +2,16 @@
 # vim: filetype=zsh
 
 set -e
+if [ -n "$ZSH_VERSION" ]; then
+       setopt SH_WORD_SPLIT
+fi
+if [ -z "$ECHO" ]; then
+       if echo "\\\\" | grep .. >/dev/null; then
+               ECHO=echo
+       else
+               ECHO=`which echo`
+       fi
+fi
 
 # I use this in EVERY shell script ;)
 LF="
@@ -11,8 +21,8 @@ ESC="\e"
 d00=`pwd`
 while ! [ -f ./all ]; do
        if [ x"`pwd`" = x"/" ]; then
-               echo "Cannot find myself."
-               echo "Please run this script with the working directory inside a Xonotic checkout."
+               $ECHO "Cannot find myself."
+               $ECHO "Please run this script with the working directory inside a Xonotic checkout."
                exit 1
        fi
        cd ..
@@ -36,7 +46,7 @@ esac
 
 msg()
 {
-       echo >&2 "$ESC[1m$*$ESC[m"
+       $ECHO >&2 "$ESC""[1m$*$ESC""[m"
 }
 
 self=`git hash-object "$SELF"`
@@ -67,10 +77,10 @@ visible_repo_name()
 {
        case "$1" in
                .)
-                       echo "the root directory"
+                       $ECHO "the root directory"
                        ;;
                *)
-                       echo "\"$1\""
+                       $ECHO "\"$1\""
                        ;;
        esac
 }
@@ -78,16 +88,16 @@ visible_repo_name()
 check_mergeconflict()
 {
        if git ls-files -u | grep ' 1   '; then
-               echo
-               echo "MERGE CONFLICT."
-               echo "change into the \"$1\" project directory, and then:"
-               echo "- edit the files mentioned above with your favorite editor,"
-               echo "  and fix the conflicts (marked with <<<<<<< blocks)"
-               echo "- for binary files, you can select the files using"
-               echo "  git checkout --ours or git checkout --theirs"
-               echo "- when done with a file, 'git add' the file"
-               echo "- when done, 'git commit'"
-               echo
+               $ECHO
+               $ECHO "MERGE CONFLICT."
+               $ECHO "change into the \"$1\" project directory, and then:"
+               $ECHO "- edit the files mentioned above with your favorite editor,"
+               $ECHO "  and fix the conflicts (marked with <<<<<<< blocks)"
+               $ECHO "- for binary files, you can select the files using"
+               $ECHO "  git checkout --ours or git checkout --theirs"
+               $ECHO "- when done with a file, 'git add' the file"
+               $ECHO "- when done, 'git commit'"
+               $ECHO
                exit 1
        fi
 }
@@ -97,7 +107,7 @@ yesno()
        yesno=
        while [ x"$yesno" != x"y" -a x"$yesno" != x"n" ]; do
                eval "$2"
-               echo "$1"
+               $ECHO "$1"
                IFS= read -r yesno
        done
        [ x"$yesno" = x"y" ]
@@ -110,21 +120,21 @@ enter()
 }
 
 repos_urls="
-.                             |                                                   | master      |
-data/xonotic-data.pk3dir      |                                                   | master      |
-data/xonotic-music.pk3dir     |                                                   | master      |
-data/xonotic-nexcompat.pk3dir |                                                   | master      | no
-darkplaces                    |                                                   | div0-stable | svn
-netradiant                    |                                                   | master      |
-div0-gittools                 |                                                   | master      | no
-d0_blind_id                   | git://github.com/divVerent/d0_blind_id.git        | master      |
-data/xonotic-maps.pk3dir      |                                                   | master      |
-mediasource                   |                                                   | master      | no
-fteqcc                        | git://github.com/Blub/qclib.git                   | master      |
+.                             |                                                   | master         |
+data/xonotic-data.pk3dir      |                                                   | master         |
+data/xonotic-music.pk3dir     |                                                   | master         |
+data/xonotic-nexcompat.pk3dir |                                                   | master         | no
+darkplaces                    |                                                   | div0-stable    | svn
+netradiant                    |                                                   | master         |
+div0-gittools                 |                                                   | master         | no
+d0_blind_id                   |                                                   | master         |
+data/xonotic-maps.pk3dir      |                                                   | master         |
+mediasource                   |                                                   | master         | no
+fteqcc                        |                                                   | xonotic-stable | noautocrlf
 "
 # todo: in darkplaces, change repobranch to div0-stable
 
-repos=`echo "$repos_urls" | grep . | cut -d '|' -f 1 | tr -d ' '`
+repos=`$ECHO "$repos_urls" | grep . | cut -d '|' -f 1 | tr -d ' '`
 
 base=`git config remote.origin.url`
 case "$base" in
@@ -132,7 +142,7 @@ case "$base" in
                base=${base%xonotic.git}
                ;;
        *)
-               echo "The main repo is not xonotic.git, what have you done?"
+               $ECHO "The main repo is not xonotic.git, what have you done?"
                exit 1
                ;;
 esac
@@ -144,28 +154,28 @@ case "$pushbase" in
        '')
                ;;
        *)
-               echo "The main repo is not xonotic.git, what have you done?"
+               $ECHO "The main repo is not xonotic.git, what have you done?"
                exit 1
                ;;
 esac
 
 repourl()
 {
-       repo_t=`echo "$repos_urls" | grep "^$1 " | cut -d '|' -f 2 | tr -d ' '`
+       repo_t=`$ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 2 | tr -d ' '`
        if [ -n "$repo_t" ]; then
                case "$repo_t" in
                        *://*)
-                               echo "$repo_t"
+                               $ECHO "$repo_t"
                                ;;
                        *)
-                               echo "$base$repo_t"
+                               $ECHO "$base$repo_t"
                                ;;
                esac
        else
                if [ x"$1" = x"." ]; then
-                       echo "$base""xonotic.git"
+                       $ECHO "$base""xonotic.git"
                else
-                       echo "$base${1##*/}.git"
+                       $ECHO "$base${1##*/}.git"
                fi
        fi
 }
@@ -173,37 +183,37 @@ repourl()
 repopushurl()
 {
        [ -n "$pushbase" ] || return 0
-       repo_t=`echo "$repos_urls" | grep "^$1 " | cut -d '|' -f 2 | tr -d ' '`
+       repo_t=`$ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 2 | tr -d ' '`
        if [ -n "$repo_t" ]; then
                case "$repo_t" in
                        *://*)
                                ;;
                        *)
-                               echo "$pushbase$repo_t"
+                               $ECHO "$pushbase$repo_t"
                                ;;
                esac
        else
                if [ x"$1" = x"." ]; then
-                       echo "$pushbase""xonotic.git"
+                       $ECHO "$pushbase""xonotic.git"
                else
-                       echo "$pushbase${1##*/}.git"
+                       $ECHO "$pushbase${1##*/}.git"
                fi
        fi
 }
 
 repobranch()
 {
-       repo_t=`echo "$repos_urls" | grep "^$1 " | cut -d '|' -f 3 | tr -d ' '`
+       repo_t=`$ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 3 | tr -d ' '`
        if [ -n "$repo_t" ]; then
-               echo "$repo_t"
+               $ECHO "$repo_t"
        else
-               echo "master"
+               $ECHO "master"
        fi
 }
 
 repoflags()
 {
-       echo "$repos_urls" | grep "^$1 " | cut -d '|' -f 4 | tr -d ' '
+       $ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 4 | tr -d ' '
 }
 
 listrepos()
@@ -214,13 +224,13 @@ listrepos()
                # if we have the dir, always keep it
                if [ -d "$d" ]; then
                        msg "Repository $d enabled because it already exists"
-                       echo "$d"
+                       $ECHO "$d"
                        continue
                fi
                # if .yes file exists, always keep it
                if [ -f "$d.yes" ]; then
                        msg "Repository $d enabled by a .yes file"
-                       echo "$d"
+                       $ECHO "$d"
                        continue
                fi
                # if we have .no file, skip
@@ -242,7 +252,7 @@ listrepos()
                esac
                # default: enable
                msg "Repository $d enabled by default"
-               echo "$d"
+               $ECHO "$d"
        done
 }
 
@@ -268,9 +278,9 @@ fix_upstream_rebase()
                r_l_other=`git log --pretty="format:%s" "$r_me".."$r_other" | grep -v "^Merge" | sort -u`
 
                # heuristics: upstream rebase/filter-branch if more than 50% of the commits of one of the sides are in the other too
-               r_lc_me=`echo "$r_l_me" | wc -l`
-               r_lc_other=`echo "$r_l_other" | wc -l`
-               r_lc_together=`{ echo "$r_l_me"; echo "$r_l_other"; } | sort -u | wc -l`
+               r_lc_me=`$ECHO "$r_l_me" | wc -l`
+               r_lc_other=`$ECHO "$r_l_other" | wc -l`
+               r_lc_together=`{ $ECHO "$r_l_me"; $ECHO "$r_l_other"; } | sort -u | wc -l`
                r_lc_same=$(($r_lc_me + $r_lc_other - $r_lc_together))
 
                if [ $(( $r_lc_same * 2 )) -gt $(( $r_lc_me )) ] || [ $(( $r_lc_same * 2 )) -gt $(( $r_lc_other )) ]; then
@@ -308,10 +318,19 @@ fix_git_config()
                verbose git config --unset remote.origin.pushurl || true
        fi
        verbose git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
-       verbose git config core.autocrlf input
-       if [ -z "`git config push.default`" ]; then
+       case ",`repoflags "$d"`," in
+               *,noautocrlf,*)
+                       verbose git config --unset core.autocrlf || true
+                       ;;
+               *)
+                       verbose git config core.autocrlf input
+                       ;;
+       esac
+       if [ -z "`git config push.default || true`" ]; then
                verbose git config push.default current # or is tracking better?
        fi
+       verbose git config filter.mapclean.clean "tr -d '\r' | grep '^[^/]'"
+       verbose git config filter.mapclean.smudge "cat"
 }
 
 mkzip()
@@ -330,6 +349,47 @@ mkzip0()
        zip -0y "$@"
 }
 
+mirrorspeed()
+{
+       # first result is to be ignored, but we use it to check status
+       git ls-remote "$1" refs/heads/master >/dev/null 2>&1 || return 1
+       { 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*,,'
+               # unit: clock ticks (depends on what "time" returns
+}
+
+bestmirror()
+{
+       pre=$1; shift
+       suf=$1; shift
+
+       if ! { time -p true; } >/dev/null 2>&1; then
+               return 1
+       fi
+
+       bestin=
+       bestt=
+       for in in "$@"; do
+               m=$pre$in$suf
+               if t=`mirrorspeed "$m"`; then
+                       msg "$m -> $t ticks"
+                       if [ -n "$t" ]; then
+                               if [ -z "$bestt" ] || [ "$t" -lt "$bestt" ]; then
+                                       bestin=$in
+                                       bestt=$t
+                               fi
+                       fi
+               else
+                       msg "$m -> FAIL"
+               fi
+       done
+       if [ -n "$bestin" ]; then
+               msg "Best mirror seems to be $pre$bestin$suf"
+               $ECHO "$bestin"
+       else
+               return 1
+       fi
+}
+
 case "$cmd" in
        fix_upstream_rebase)
                for d in $repos; do
@@ -362,9 +422,12 @@ case "$cmd" in
                        msg "To get access, your key has to be approved first. For that, visit"
                        msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
                        msg "the \"Support\" tracker in the \"Repository\" category where you"
-                       msg "apply for access and paste the following output into the ticket:"
+                       msg "apply for access and paste the following output into the issue:"
                        msg ""
                        msg "`cat ~/.ssh/id_rsa.pub`"
+                       msg ""
+                       msg "Note that you will only have write access to branches that start"
+                       msg "with your user name."
                elif [ -f ~/.ssh/id_dsa.pub ]; then
                        msg ""
                        msg "A key already exists and no new one will be generated. If you"
@@ -374,28 +437,36 @@ case "$cmd" in
                        msg "To get access, your key has to be approved first. For that, visit"
                        msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
                        msg "the \"Support\" tracker in the \"Repository\" category where you"
-                       msg "apply for access and paste the following output into the ticket:"
+                       msg "apply for access and paste the following output into the issue:"
                        msg ""
                        msg "`cat ~/.ssh/id_dsa.pub`"
+                       msg ""
+                       msg "Note that you will only have write access to branches that start"
+                       msg "with your user name."
                else
                        msg ""
                        msg "No key has been generated yet. One will be generated now."
                        msg "If other people are using your computer, it is recommended"
-                       msg "to specify a passphrase."
+                       msg "to specify a passphrase. Otherwise you can simply hit ENTER"
+                       msg "when asked for a passphrase."
                        msg ""
-                       ssh-keygen -t rsa -b 4096
+                       ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
                        msg ""
                        msg "To get access, your key has to be approved first. For that, visit"
                        msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
                        msg "the \"Support\" tracker in the \"Repository\" category where you"
-                       msg "apply for access and paste the following output into the ticket:"
+                       msg "apply for access and paste the following output into the issue:"
                        msg ""
                        msg "`cat ~/.ssh/id_rsa.pub`"
+                       msg ""
+                       msg "Note that you will only have write access to branches that start"
+                       msg "with your user name."
                fi
                ;;
        update|pull)
                allow_pull=true
                fix_config=false
+               location=current
                while :; do
                        if [ x"$1" = x"-N" ]; then
                                allow_pull=false
@@ -414,11 +485,70 @@ case "$cmd" in
                        elif [ x"$1" = x"-h" ]; then
                                fix_config=true
                                base=http://git.xonotic.org/xonotic/
+                       elif [ x"$1" = x"-l" ]; then
+                               case "$2" in
+                                       nl) ;;
+                                       de) ;;
+                                       best) ;;
+                                       default) ;;
+                                       *)
+                                               msg "Invalid location!"
+                                               msg "Possible locations for the -l option:"
+                                               msg "  nl (Netherlands, run by merlijn)"
+                                               msg "  de (Germany, run by divVerent)"
+                                               msg "  best (find automatically)"
+                                               msg "  default (currently nl)"
+                                               exit 1
+                                               ;;
+                               esac
+                               fix_config=true
+                               location=$2
+                               shift
                        else
                                break
                        fi
                        shift
                done
+               case "$location" in
+                       best)
+                               newbase=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,:// .git.xonotic.org/,"`
+                               case "$newbase" in
+                                       *\ *)
+                                               if location=`bestmirror $newbase"xonotic.git" de nl`; then
+                                                       :
+                                               else
+                                                       location=current
+                                               fi
+                                               ;;
+                                       *)
+                                               location=current
+                                               ;;
+                               esac
+                               ;;
+               esac
+               case "$location" in
+                       default)
+                               location=
+                               ;;
+                       current)
+                               case "$base" in
+                                       *://*.git.xonotic.org/*)
+                                               location=${base%%.git.xonotic.org/*}
+                                               location=${location##*://}
+                                               ;;
+                                       *)
+                                               location=
+                                               ;;
+                               esac
+                               ;;
+               esac
+               if [ -n "$location" ]; then
+                       base=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,://$location.git.xonotic.org/,"`
+                       pushbase=`$ECHO "$pushbase" | sed "s,://\(.*\.\)\?git.xonotic.org/,://$location.git.xonotic.org/,"`
+               else
+                       base=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,://git.xonotic.org/,"`
+                       pushbase=`$ECHO "$pushbase" | sed "s,://\(.*\.\)\?git.xonotic.org/,://git.xonotic.org/,"`
+               fi
                if $fix_config; then
                        url=`repourl .`
                        pushurl=`repopushurl .`
@@ -440,7 +570,7 @@ case "$cmd" in
                                                if ! verbose git pull; then
                                                        fix_upstream_rebase_mergefail || true
                                                        check_mergeconflict "$d"
-                                                       echo "Pulling failed. Press ENTER to continue, or Ctrl-C to abort."
+                                                       $ECHO "Pulling failed. Press ENTER to continue, or Ctrl-C to abort."
                                                        read -r DUMMY
                                                else
                                                        fix_upstream_rebase_mergeok || true
@@ -506,7 +636,7 @@ case "$cmd" in
                                        exists=true
                                        verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
                                else
-                                       echo "WTF? Not even branch $b doesn't exist in $d"
+                                       $ECHO "WTF? Not even branch $b doesn't exist in $d"
                                        exit 1
                                fi
                        fi
@@ -515,7 +645,7 @@ case "$cmd" in
                        cd "$d0"
                done
                if ! $exists; then
-                       echo "The requested branch was not found in any repository."
+                       $ECHO "The requested branch was not found in any repository."
                fi
                exec "$SELF" branch
                ;;
@@ -532,7 +662,7 @@ case "$cmd" in
                                enter "$d0/$d"
                                r=`git symbolic-ref HEAD`
                                r=${r#refs/heads/}
-                               echo "$d is at $r"
+                               $ECHO "$d is at $r"
                                cd "$d0"
                        done
                else
@@ -540,7 +670,7 @@ case "$cmd" in
                                dv=`visible_repo_name "$d"`
                                enter "$d0/$d" verbose
                                if git rev-parse "refs/heads/$branch" >/dev/null 2>&1; then
-                                       echo "Already having this branch in $dv."
+                                       $ECHO "Already having this branch in $dv."
                                else
                                        if yesno "Branch in $dv?"; then
                                                if [ -n "$srcbranch" ]; then
@@ -576,17 +706,17 @@ case "$cmd" in
                                        continue
                                fi
                                BRANCH=${BRANCH#remotes/}
-                               ID=`echo "$BRANCH" | tr -c "A-Za-z0-9." "_"`
+                               ID=`$ECHO "$BRANCH" | tr -c "A-Za-z0-9." "_"`
                                branches_list="$branches_list $BRANCH" # TEH SORT MAKEZ IT UNIEQ
                                eval "r=\$branches_repos_$ID"
                                r="$r $d"
                                eval "branches_repos_$ID=\$r"
                        done
-                       echo -n "$branches_list" | xargs -n 1 echo | sort -u | while IFS= read -r BRANCH; do
-                               ID=`echo "$BRANCH" | tr -c "A-Za-z0-9." "_"`
+                       $ECHO -n "$branches_list" | xargs -n 1 $ECHO | sort -u | while IFS= read -r BRANCH; do
+                               ID=`$ECHO "$BRANCH" | tr -c "A-Za-z0-9." "_"`
                                eval "r=\$branches_repos_$ID"
                                printf "%-60s %s\n" "$BRANCH" "$r"
-                               #echo "$BRANCH: $r"
+                               #$ECHO "$BRANCH: $r"
                        done
                }
                ;;
@@ -618,19 +748,19 @@ case "$cmd" in
                        diffdata=`git diff --color HEAD`
                        if [ -n "$diffdata" ]; then
                                # we have uncommitted changes
-                               if yesno "Uncommitted changes in \"$r\" in $dv. Commit?" 'echo "$diffdata" | less -r'; then
+                               if yesno "Uncommitted changes in \"$r\" in $dv. Commit?" '$ECHO "$diffdata" | less -r'; then
                                        verbose git commit -a
                                fi
                        fi
-                       rem=`git config "branch.$r.remote" || echo origin`
-                       bra=`git config "branch.$r.merge" || echo "$r"`
+                       rem=`git config "branch.$r.remote" || $ECHO origin`
+                       bra=`git config "branch.$r.merge" || $ECHO "$r"`
                        upstream="$rem/${bra#refs/heads/}"
                        if ! git rev-parse "$upstream" >/dev/null 2>&1; then
                                upstream="origin/`repobranch "$d"`"
                        fi
                        logdata=`git log --color "$upstream".."$r"`
                        if [ -n "$logdata" ]; then
-                               if yesno "Push \"$r\" in $dv?" 'echo "$logdata" | less -r'; then
+                               if yesno "Push \"$r\" in $dv?" '$ECHO "$logdata" | less -r'; then
                                        verbose git push "$rem" HEAD
                                fi
                        fi
@@ -651,6 +781,7 @@ case "$cmd" in
                cleanqc=false
                compiled0=false
                debug=debug
+               snowleopardhack=false
                if [ -z "$CC" ]; then
                        export CC="gcc -DSUPPORTIPV6"
                fi
@@ -658,6 +789,7 @@ case "$cmd" in
                        case "$1" in
                                -0)
                                        compiled0=true
+                                       shift
                                        ;;
                                -c)
                                        cleand0=true
@@ -668,7 +800,17 @@ case "$cmd" in
                                        ;;
                                -r)
                                        debug=release
-                                       export CC="$CC -g -mtune=native -march=native"
+                                       export CC="$CC -g"
+                                       case "`$CC -dumpversion`" in
+                                               [5-9]*|[1-9][0-9]*|4.[3-9]*|4.[1-9][0-9]*)
+                                                       # gcc 4.3 or higher
+                                                       # -march=native is broken < 4.3
+                                                       export CC="$CC -mtune=native -march=native"
+                                                       ;;
+                                       esac
+                                       if [ -n "$WE_HATE_OUR_USERS" ]; then
+                                               export CC="$CC -fno-common"
+                                       fi
                                        shift
                                        ;;
                                *)
@@ -685,10 +827,11 @@ case "$cmd" in
                                        ;;
                                *)
                                        # AGL cannot be compiled on systems with a kernel > 10.x (Snow Leopard)
+                                       snowleopardhack=true
                                        TARGETS="sv-$debug sdl-$debug"
                                        ;;
                        esac
-                       export CC="$CC -I$PWD/misc/buildfiles/osx/Xonotic-SDL.app/Contents/Frameworks/SDL.framework/Headers -F$PWD/misc/buildfiles/osx/Xonotic-SDL.app/Contents/Frameworks"
+                       export CC="$CC -fno-reorder-blocks -I$PWD/misc/buildfiles/osx/Xonotic-SDL.app/Contents/Frameworks/SDL.framework/Headers -F$PWD/misc/buildfiles/osx/Xonotic-SDL.app/Contents/Frameworks"
                else
                        TARGETS="sv-$debug cl-$debug sdl-$debug"
                fi
@@ -706,7 +849,13 @@ case "$cmd" in
                                        sdl)
                                                TARGETS="$TARGETS sdl-debug"
                                                ;;
-                                       glx|agl|wgl)
+                                       agl)
+                                               TARGETS="$TARGETS cl-debug"
+                                               if $snowleopardhack; then
+                                                       export CC="$CC -arch i386"
+                                               fi
+                                               ;;
+                                       glx|wgl)
                                                TARGETS="$TARGETS cl-debug"
                                                ;;
                                        dedicated)
@@ -743,20 +892,23 @@ case "$cmd" in
                        mkdir -p .libs
                        if [ -n "$WE_HATE_OUR_USERS" ]; then
                                verbose cp "$d0/misc/buildfiles/win32/libd0_blind_id"-* .libs/
+                               verbose cp "$d0/misc/buildfiles/win32/libd0_rijndael"-* .libs/
                                verbose cp "$d0/misc/buildfiles/win32/libgmp"-* .libs/
                        else
                                case "`uname`" in
                                        Linux)
                                                case `uname -m` in
                                                        x86_64)
-                                                               verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_blind_id".* .libs/
-                                                               verbose cp "$d0/misc/builddeps/dp.linux64/lib/libgmp".* .libs/
-                                                               MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/"
+                                                               #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_blind_id".* .libs/
+                                                               #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_rijndael".* .libs/
+                                                               #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libgmp".* .libs/
+                                                               MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/ DP_CRYPTO_RIJNDAEL_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/"
                                                                ;;
                                                        *86)
-                                                               verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_blind_id".* .libs/
-                                                               verbose cp "$d0/misc/builddeps/dp.linux32/lib/libgmp".* .libs/
-                                                               MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/"
+                                                               #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_blind_id".* .libs/
+                                                               #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_rijndael".* .libs/
+                                                               #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libgmp".* .libs/
+                                                               MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/ DP_CRYPTO_RIJNDAEL_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/"
                                                                ;;
                                                        *)
                                                                compiled0=true
@@ -765,6 +917,7 @@ case "$cmd" in
                                                ;;
                                        Darwin)
                                                verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_blind_id".* .libs/
+                                               verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_rijndael".* .libs/
                                                ;;
                                        *)
                                                compiled0=true
@@ -793,13 +946,14 @@ case "$cmd" in
 
                enter "$d0/data/xonotic-data.pk3dir" verbose
                if $cleanqc; then
-                       verbose make FTEQCC="$d0/fteqcc/fteqcc.bin" "$@" $MAKEFLAGS clean
+                       verbose make FTEQCC="../../../../fteqcc/fteqcc.bin" "$@" $MAKEFLAGS clean
                fi
-               verbose make FTEQCC="$d0/fteqcc/fteqcc.bin" "$@" $MAKEFLAGS
+               verbose make FTEQCC="../../../../fteqcc/fteqcc.bin" "$@" $MAKEFLAGS
+               # 4 levels up: data, xonotic-data, qcsrc, server
 
                enter "$d0/darkplaces" verbose
                if [ x"$BAD_TARGETS" = x" " ]; then
-                       echo "Warning: invalid empty client, default clients will be used."
+                       $ECHO "Warning: invalid empty client, default clients will be used."
                fi
                if $cleandp; then
                        verbose make $MAKEFLAGS clean
@@ -808,7 +962,7 @@ case "$cmd" in
                        verbose make $MAKEFLAGS STRIP=: "$@" "$T"
                done
                for T in $BAD_TARGETS; do
-                       echo "Warning: discarded invalid client $T."
+                       $ECHO "Warning: discarded invalid client $T."
                done
 
                verbose "$SELF" update-maps
@@ -839,7 +993,7 @@ case "$cmd" in
                        if [ -x "darkplaces/darkplaces$client.exe" ]; then
                                client=$client.exe
                        else
-                               echo "Client darkplaces/darkplaces$client not found, aborting"
+                               $ECHO "Client darkplaces/darkplaces$client not found, aborting"
                                exit 1
                        fi
                fi
@@ -873,9 +1027,10 @@ case "$cmd" in
                        #       # somehow send it
                        #       rm -f xonotic.core.tar.gz
                        else
-                               echo "The core dump can be examined later by"
-                               echo "  gdb $binary xonotic.core"
+                               $ECHO "The core dump can be examined later by"
+                               $ECHO "  gdb $binary xonotic.core"
                        fi
+                       exit 1
                fi
                ;;
        each|foreach)
@@ -919,10 +1074,10 @@ case "$cmd" in
                                                continue
                                        fi
                                        if git format-patch -o "$patchdir/$i" "$UPSTREAM".."$BRANCH"; then
-                                               echo "$d" > "$patchdir/$i/info.txt"
-                                               echo "$BRANCH" >> "$patchdir/$i/info.txt"
-                                               echo "$UPSTREAM" >> "$patchdir/$i/info.txt"
-                                               echo "$TRACK" >> "$patchdir/$i/info.txt"
+                                               $ECHO "$d" > "$patchdir/$i/info.txt"
+                                               $ECHO "$BRANCH" >> "$patchdir/$i/info.txt"
+                                               $ECHO "$UPSTREAM" >> "$patchdir/$i/info.txt"
+                                               $ECHO "$TRACK" >> "$patchdir/$i/info.txt"
                                                i=$(($i+1))
                                        else
                                                rm -rf "$patchdir/$i"
@@ -963,12 +1118,12 @@ case "$cmd" in
                reportecho()
                {
                        report=$report"$*$LF"
-                       echo "$*"
+                       $ECHO "$*"
                }
                reportecho4()
                {
                        report=$report"    $*$LF"
-                       echo "    $*"
+                       $ECHO "    $*"
                }
                reportdo4()
                {
@@ -976,6 +1131,12 @@ case "$cmd" in
                        reportecho "$o"
                }
                for d in $repos; do
+                       case "$d" in
+                               fteqcc)
+                                       # sorry, fteqcc repo is managed manually
+                                       continue
+                                       ;;
+                       esac
                        enter "$d0/$d" verbose
                        base="`repobranch "$d"`"
                        reportecho "In $d:"
@@ -1025,14 +1186,14 @@ case "$cmd" in
                                        diffdata=`git diff --color --find-copies-harder --ignore-space-change "$realbase"..."$ref"`
                                        if [ -z "$diffdata" ]; then
                                                reportecho4 "--> not merging, no changes vs master, branch contains redundant history"
-                                               if yesno "Branch \"$ref\" probably should get deleted. Do it?" '{ echo "$logdata"; } | less -r'; then
+                                               if yesno "Branch \"$ref\" probably should get deleted. Do it?" '{ $ECHO "$logdata"; } | less -r'; then
                                                        git push origin :"${ref#refs/remotes/origin/}"
                                                        reportecho4 "--> branch deleted"
                                                fi
                                        elif [ -z "$branch" ] && [ -n "$note" ]; then
-                                               reportdo4 echo "$note"
+                                               reportdo4 $ECHO "$note"
                                                reportecho4 "--> not merging, already had this one rejected before"
-                                       elif yesno "Branch \"$ref\" may want to get merged. Do it?" '{ echo "$logdata"; echo "$diffdata"; } | less -r'; then
+                                       elif yesno "Branch \"$ref\" may want to get merged. Do it?" '{ $ECHO "$logdata"; $ECHO "$diffdata"; } | less -r'; then
                                                git checkout "$realbase"
                                                org=`git rev-parse HEAD`
                                                if ! git merge --no-ff "$ref" 2>&1 | tee "$t" && ! { git ls-files -u | grep ' 1 ' >/dev/null; }; then
@@ -1053,13 +1214,18 @@ case "$cmd" in
                                                                git push origin :"${ref#refs/remotes/origin/}"
                                                                reportecho4 "--> test failed, branch deleted"
                                                        elif [ -n "$note" ]; then
-                                                               reportdo4 echo "$note"
+                                                               reportdo4 $ECHO "$note"
                                                                reportecho4 "--> test failed"
                                                        else
                                                                reportecho4 "--> test failed, postponed"
                                                        fi
                                                else
-                                                       echo "MERGING"
+                                                       # apply crlf, or other cleanup filters (non-behavioural changes)
+                                                       git reset --hard
+                                                       find . -type f -exec touch {} \;
+                                                       git commit -a --amend -C HEAD || true # don't fail if nothing to commit
+
+                                                       $ECHO "MERGING"
                                                        case ",`repoflags "$d"`," in
                                                                *,svn,*)
                                                                        # we do quite a mess here... luckily we know $org
@@ -1085,7 +1251,7 @@ case "$cmd" in
                                                        git push origin :"${ref#refs/remotes/origin/}"
                                                        reportecho4 "--> branch deleted"
                                                elif [ -n "$note" ]; then
-                                                       reportdo4 echo "$note"
+                                                       reportdo4 $ECHO "$note"
                                                        reportecho4 "--> rejected"
                                                else
                                                        reportecho4 "--> postponed"
@@ -1097,7 +1263,7 @@ case "$cmd" in
                        reportecho ""
                done
                rm -f "$t"
-               echo "$report" | ssh nexuiz@rm.endoftheinternet.org cat '>>' public_html/xonotic-merge-notes.txt
+               $ECHO "$report" | ssh nexuiz@rm.endoftheinternet.org cat '>>' public_html/xonotic-merge-notes.txt
                ;;
        clean)
                "$SELF" fix_config
@@ -1112,36 +1278,49 @@ case "$cmd" in
                #   ./all clean [-m] [-f | -fu | -fU] [-r] [-D]
                #   ./all clean --reclone
                found=false
-               while :; do
-                       if [ x"$1" = x"--reclone" ]; then
+               for X in "$@"; do
+                       if [ x"$X" = x"--reclone" ]; then
                                force=true
                                fetchupstream=true
                                gotoupstream=true
                                gotomaster=true
                                rmuntracked=true
                                killbranches=true
-                       elif [ x"$1" = x"-f" ]; then
+                       elif [ x"$X" = x"-f" ]; then
                                force=true
-                       elif [ x"$1" = x"-u" ]; then
+                       elif [ x"$X" = x"-u" ]; then
                                gotoupstream=true
-                       elif [ x"$1" = x"-U" ]; then
+                       elif [ x"$X" = x"-U" ]; then
                                gotoupstream=true
                                fetchupstream=true
-                       elif [ x"$1" = x"-fu" ]; then
+                       elif [ x"$X" = x"-fu" ]; then
                                force=true
                                gotoupstream=true
-                       elif [ x"$1" = x"-fU" ]; then
+                       elif [ x"$X" = x"-fU" ]; then
                                force=true
                                gotoupstream=true
                                fetchupstream=true
-                       elif [ x"$1" = x"-m" ]; then
+                       elif [ x"$X" = x"-m" ]; then
                                gotomaster=true
-                       elif [ x"$1" = x"-r" ]; then
+                       elif [ x"$X" = x"-r" ]; then
                                rmuntracked=true
-                       elif [ x"$1" = x"-D" ]; then
+                       elif [ x"$X" = x"-D" ]; then
                                killbranches=true
+                       elif $ECHO "$X" | grep '^-FFFF*UUUU*$' >/dev/null; then
+                               msg ''
+                               msg "        _____"
+                               msg "    ,--'-\\P/\`\\  FFFFFFF"
+                               msg " __/_    B/,-.\\  FFFFFFF"
+                               msg " /  _\\  (//  O\\\\  FFFFFF"
+                               msg "| (O  \`) _\\._ _)\\  FFFUU"
+                               msg "| |___/.^d0~~\"\\  \\ UUUU"
+                               msg "|     |\`~'     \\ |  UUUU"
+                               msg "|     |    __,C>|| UUUU"
+                               msg "\\    /_ ,-/,-'   |  UUUU"
+                               msg " \\\\_ \\_>~'      /  UUUU-"
+                               msg ''
                        else
-                               break
+                               msg "Unknown arg: $X"
                        fi
                        found=true
                        shift
@@ -1166,8 +1345,8 @@ case "$cmd" in
                                else
                                        r=`git symbolic-ref HEAD`
                                        r=${r#refs/heads/}
-                                       rem=`git config "branch.$r.remote" || echo origin`
-                                       bra=`git config "branch.$r.merge" || echo "$r"`
+                                       rem=`git config "branch.$r.remote" || $ECHO origin`
+                                       bra=`git config "branch.$r.merge" || $ECHO "$r"`
                                        upstream="$rem/${bra#refs/heads/}"
                                        if $fetchupstream; then
                                                verbose git fetch "$rem"
@@ -1191,10 +1370,10 @@ case "$cmd" in
                        if $rmuntracked; then
                                case "$d" in
                                        .)
-                                               verbose git clean -df
+                                               verbose git clean -df || true
                                                ;;
                                        *)
-                                               verbose git clean -xdf
+                                               verbose git clean -xdf || true
                                                ;;
                                esac
                        fi
@@ -1204,9 +1383,10 @@ case "$cmd" in
                                                verbose git branch -D "${B#refs/heads/}"
                                        fi
                                done
-                               git rev-parse refs/heads/master >/dev/null 2>&1 || verbose git branch -t master origin/master || true
-                               git rev-parse "refs/heads/`repobranch "$d"`" >/dev/null 2>&1 || verbose git branch -t "`repobranch "$d"`" origin/"`repobranch "$d"`" || true
+                               git rev-parse refs/heads/master >/dev/null 2>&1 || verbose git branch --track master origin/master || true
+                               git rev-parse "refs/heads/`repobranch "$d"`" >/dev/null 2>&1 || verbose git branch --track "`repobranch "$d"`" origin/"`repobranch "$d"`" || true
                        fi
+                       checkself "$cmd" "$@"
                done
                ;;
 
@@ -1221,7 +1401,7 @@ case "$cmd" in
                                msg "Building a RELEASE"
                                ;;
                        *)
-                               echo >&2 -n "$ESC[2J$ESC[H"
+                               $ECHO >&2 -n "$ESC[2J$ESC[H"
                                msg ""
                                msg ""
                                msg ""
@@ -1266,7 +1446,7 @@ case "$cmd" in
                verbose rm -rf Xonotic Xonotic*.zip
                verbose mkdir -p Xonotic
                if [ -n "$RELEASEDATE" ]; then
-                       verbose echo "$RELEASEDATE" > Xonotic/stamp.txt
+                       verbose $ECHO "$RELEASEDATE" > Xonotic/stamp.txt
                else
                        verbose date +%Y%m%d > Xonotic/stamp.txt
                fi
@@ -1341,18 +1521,18 @@ case "$cmd" in
                        # now rebrand the binaries...
                        for f in $targetfiles; do
                                #verbose "$d0/misc/tools/rebrand-darkplaces-engine.sh" "${XONOTIC_BRAND:-$d0/misc/tools/xonotic.brand}" "${f##*:}" || true
-                               case "$f" in
+                               case "${f##*:}" in
                                        xonotic*.exe)
-                                               verbose "$d0/misc/tools/change-icon-of-exe.sh" "$d0/misc/logos/icons_ico/xonotic.ico" "$f"
+                                               verbose "$d0/misc/tools/change-icon-of-exe.sh" "$d0/misc/logos/icons_ico/xonotic.ico" "${f##*:}"
                                                (
                                                        d=`mktemp -d -t rebrand.XXXXXX`
                                                        cd "$d"
-                                                       echo "-mygames" > darkplaces.opt
+                                                       $ECHO "-mygames" > darkplaces.opt
                                                        zip -9r darkplaces.zip darkplaces.opt
                                                        cat darkplaces.zip
                                                        cd "$d0"
                                                        rm -rf "$d"
-                                               ) >> "$f"
+                                               ) >> "${f##*:}"
                                                ;;
                                esac
                        done
@@ -1431,10 +1611,11 @@ case "$cmd" in
        release-qc)
                case "$RELEASETYPE" in
                        beta)
-                               verbose make -C Xonotic/source FTEQCC="$d0/Xonotic/fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 clean all
+                               verbose make -C Xonotic/source FTEQCC="../../../fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 clean all
+                               # back out of: source/qcsrc/server
                                ;;
                        release)
-                               verbose make -C Xonotic/source FTEQCC="$d0/Xonotic/fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 FTEQCCFLAGS_WATERMARK= clean all
+                               verbose make -C Xonotic/source FTEQCC="../../../fteqcc/fteqcc.linux32" XON_BUILDSYSTEM=1 FTEQCCFLAGS_WATERMARK= clean all
                                ;;
                esac
                verbose rm -f Xonotic/source/*/fteqcc.log
@@ -1462,7 +1643,7 @@ case "$cmd" in
                # music: reduce bitrate
                verbose export do_jpeg=true
                verbose export jpeg_qual_rgb=80
-               verbose export jpeg_qual_a=95
+               verbose export jpeg_qual_a=97
                verbose export do_dds=false
                verbose export do_ogg=true
                verbose export ogg_qual=1
@@ -1477,7 +1658,7 @@ case "$cmd" in
                verbose export do_jpeg=false
                verbose export do_jpeg_if_not_dds=true
                verbose export jpeg_qual_rgb=80
-               verbose export jpeg_qual_a=95
+               verbose export jpeg_qual_a=99
                verbose export do_dds=true
                verbose export dds_flags=
                verbose export do_ogg=true
@@ -1568,8 +1749,8 @@ case "$cmd" in
                ;;
        release-pack)
                verbose "$SELF" release-buildpk3s data/font-nimbussansl.pk3dir             raw ''
-               verbose "$SELF" release-buildpk3s data/xonotic-data.pk3dir       normal '' raw '-raw' low '-low' lowdds '-lowdds'
-               verbose "$SELF" release-buildpk3s data/xonotic-maps.pk3dir       normal '' raw '-raw' low '-low' lowdds '-lowdds'
+               verbose "$SELF" release-buildpk3s data/xonotic-data.pk3dir       normal ''            low '-low' lowdds '-lowdds'
+               verbose "$SELF" release-buildpk3s data/xonotic-maps.pk3dir       normal ''            low '-low' lowdds '-lowdds'
                verbose "$SELF" release-buildpk3s data/xonotic-music.pk3dir                raw ''     low '-low'
                verbose "$SELF" release-buildpk3s data/xonotic-nexcompat.pk3dir                       low ''
                ;;
@@ -1623,17 +1804,17 @@ case "$cmd" in
                        Xonotic/data/xonotic-$stamp-data-low.pk3 \
                        Xonotic/data/xonotic-$stamp-maps-low.pk3 \
                        Xonotic/data/xonotic-$stamp-music-low.pk3
-               verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp-lowdds.zip
+#              verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp-high.zip
+#              verbose mkzip0 Xonotic-$stamp-high.zip \
+#                      Xonotic/data/xonotic-$stamp-data-raw.pk3 \
+#                      Xonotic/data/xonotic-$stamp-maps-raw.pk3 \
+#                      Xonotic/data/xonotic-$stamp-music.pk3 \
+#                      Xonotic/data/xonotic-$stamp-nexcompat.pk3
+               verbose mv Xonotic-$stamp-common.zip Xonotic-$stamp-lowdds.zip
                verbose mkzip0 Xonotic-$stamp-lowdds.zip \
                        Xonotic/data/xonotic-$stamp-data-lowdds.pk3 \
                        Xonotic/data/xonotic-$stamp-maps-lowdds.pk3 \
                        Xonotic/data/xonotic-$stamp-music-low.pk3
-               verbose mv Xonotic-$stamp-common.zip Xonotic-$stamp-high.zip
-               verbose mkzip0 Xonotic-$stamp-high.zip \
-                       Xonotic/data/xonotic-$stamp-data-raw.pk3 \
-                       Xonotic/data/xonotic-$stamp-maps-raw.pk3 \
-                       Xonotic/data/xonotic-$stamp-music.pk3 \
-                       Xonotic/data/xonotic-$stamp-nexcompat.pk3
                ;;
        release)
                verbose "$SELF" release-prepare
@@ -1645,25 +1826,26 @@ case "$cmd" in
                ;;
 
        *)
-               echo "Usage:"
-               echo "  $SELF admin-merge [<branch>]"
-               echo "  $SELF branch <branch>"
-               echo "  $SELF branch <remote> <branch> [<srcbranch>]"
-               echo "  $SELF branches"
-               echo "  $SELF checkout|switch <branch>"
-               echo "  $SELF checkout|switch <remote>/<branch>"
-               echo "  $SELF clean [-m] [-f | -fu | -fU] [-r] [-D]"
-               echo "  $SELF clean --reclone"
-               echo "  $SELF compile [-c]"
-               echo "  $SELF each|foreach [-k] command..."
-               echo "  $SELF fix_upstream_rebase"
-               echo "  $SELF merge"
-               echo "  $SELF push|commit [-s]"
-               echo "  $SELF release"
-               echo "  $SELF restore-patches"
-               echo "  $SELF run [sdl|glx|wgl|agl|dedicated] options..."
-               echo "  $SELF save-patches"
-               echo "  $SELF update-maps"
-               echo "  $SELF update|pull [-N]"
+               $ECHO "Usage:"
+               $ECHO "  $SELF admin-merge [<branch>]"
+               $ECHO "  $SELF branch <branch>"
+               $ECHO "  $SELF branch <remote> <branch> [<srcbranch>]"
+               $ECHO "  $SELF branches"
+               $ECHO "  $SELF checkout|switch <branch>"
+               $ECHO "  $SELF checkout|switch <remote>/<branch>"
+               $ECHO "  $SELF clean [-m] [-f | -fu | -fU] [-r] [-D]"
+               $ECHO "  $SELF clean --reclone"
+               $ECHO "  $SELF compile [-c] [-r] [-0]"
+               $ECHO "  $SELF each|foreach [-k] command..."
+               $ECHO "  $SELF fix_upstream_rebase"
+               $ECHO "  $SELF keygen"
+               $ECHO "  $SELF merge"
+               $ECHO "  $SELF push|commit [-s]"
+               $ECHO "  $SELF release"
+               $ECHO "  $SELF restore-patches"
+               $ECHO "  $SELF run [sdl|glx|wgl|agl|dedicated] options..."
+               $ECHO "  $SELF save-patches"
+               $ECHO "  $SELF update-maps"
+               $ECHO "  $SELF update|pull [-N] [-s | -h [-p] | -g [-p]] [-l de|nl|default]"
                ;;
 esac