]> git.xonotic.org Git - xonotic/xonotic.git/blob - all
fix default of $CC
[xonotic/xonotic.git] / all
1 #!/bin/sh
2 # vim: filetype=zsh
3
4 set -e
5 if [ -n "$ZSH_VERSION" ]; then
6         setopt SH_WORD_SPLIT
7 fi
8 if [ -z "$ECHO" ]; then
9         if echo "\\\\" | grep .. >/dev/null; then
10                 ECHO=echo
11         else
12                 ECHO=`which echo`
13         fi
14 fi
15
16 # I use this in EVERY shell script ;)
17 LF="
18 "
19 ESC="\e"
20
21 d00=`pwd`
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."
26                 exit 1
27         fi
28         cd ..
29 done
30 export d0=`pwd`
31 SELF="$d0/all"
32
33 # If we are on WINDOWS:
34 case "$0" in
35         all|*/all)
36                 case "`uname`" in
37                         MINGW*|Win*)
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 "$@"
42                                 ;;
43                 esac
44                 ;;
45 esac
46
47 msg()
48 {
49         $ECHO >&2 "$ESC""[1m$*$ESC""[m"
50 }
51
52 self=`git hash-object "$SELF"`
53 checkself()
54 {
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
61                         exec "$SELF" "$@"
62                 else
63                         msg "Please try $SELF update, and then retry your requested operation."
64                         exit 1
65                 fi
66         fi
67         return 0
68 }
69
70 verbose()
71 {
72         msg "+ $*"
73         "$@"
74 }
75
76 visible_repo_name()
77 {
78         case "$1" in
79                 .)
80                         $ECHO "the root directory"
81                         ;;
82                 *)
83                         $ECHO "\"$1\""
84                         ;;
85         esac
86 }
87
88 check_mergeconflict()
89 {
90         if git ls-files -u | grep ' 1   '; then
91                 $ECHO
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'"
100                 $ECHO
101                 exit 1
102         fi
103 }
104
105 yesno()
106 {
107         yesno=
108         while [ x"$yesno" != x"y" -a x"$yesno" != x"n" ]; do
109                 eval "$2"
110                 $ECHO "$1"
111                 if ! IFS= read -r yesno; then
112                         yesno=n
113                         break
114                 fi
115         done
116         [ x"$yesno" = x"y" ]
117 }
118
119 enter()
120 {
121         $2 cd "$1" || exit 1
122         check_mergeconflict "$1"
123 }
124
125 repos_urls="
126 .                             |                                                   | master         |
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
137 "
138 # todo: in darkplaces, change repobranch to div0-stable
139
140 repos=`$ECHO "$repos_urls" | grep . | cut -d '|' -f 1 | tr -d ' '`
141
142 base=`git config remote.origin.url`
143 case "$base" in
144         */xonotic.git)
145                 base=${base%xonotic.git}
146                 ;;
147         *)
148                 $ECHO "The main repo is not xonotic.git, what have you done?"
149                 exit 1
150                 ;;
151 esac
152 pushbase=`git config remote.origin.pushurl || true`
153 case "$pushbase" in
154         */xonotic.git)
155                 pushbase=${pushbase%xonotic.git}
156                 ;;
157         '')
158                 ;;
159         *)
160                 $ECHO "The main repo is not xonotic.git, what have you done?"
161                 exit 1
162                 ;;
163 esac
164
165 repourl()
166 {
167         repo_t=`$ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 2 | tr -d ' '`
168         if [ -n "$repo_t" ]; then
169                 case "$repo_t" in
170                         *://*)
171                                 $ECHO "$repo_t"
172                                 ;;
173                         *)
174                                 $ECHO "$base$repo_t"
175                                 ;;
176                 esac
177         else
178                 if [ x"$1" = x"." ]; then
179                         $ECHO "$base""xonotic.git"
180                 else
181                         $ECHO "$base${1##*/}.git"
182                 fi
183         fi
184 }
185
186 repopushurl()
187 {
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
191                 case "$repo_t" in
192                         *://*)
193                                 ;;
194                         *)
195                                 $ECHO "$pushbase$repo_t"
196                                 ;;
197                 esac
198         else
199                 if [ x"$1" = x"." ]; then
200                         $ECHO "$pushbase""xonotic.git"
201                 else
202                         $ECHO "$pushbase${1##*/}.git"
203                 fi
204         fi
205 }
206
207 repobranch()
208 {
209         repo_t=`$ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 3 | tr -d ' '`
210         if [ -n "$repo_t" ]; then
211                 $ECHO "$repo_t"
212         else
213                 $ECHO "master"
214         fi
215 }
216
217 repoflags()
218 {
219         $ECHO "$repos_urls" | grep "^$1 " | cut -d '|' -f 4 | tr -d ' '
220 }
221
222 listrepos()
223 {
224         for d in $repos; do
225                 p="${d%dir}"
226                 f="`repoflags "$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"
230                         continue
231                 fi
232                 # if .yes file exists, always keep it
233                 if [ -f "$d.yes" ]; then
234                         msg "Repository $d enabled by a .yes file"
235                         $ECHO "$d"
236                         continue
237                 fi
238                 # remove broken clones so they don't mess up stuff
239                 if [ x"$d" != x"." ] && [ -d "$d" ] && ! [ -d "$d/.git" ]; then
240                         msg "$d exists but has no .git subdir. Probably a broken clone. Deleting."
241                         verbose rm -rf "$d"
242                         continue
243                 fi
244                 # if we have the dir, always keep it
245                 if [ -d "$d" ]; then
246                         msg "Repository $d enabled because it already exists"
247                         $ECHO "$d"
248                         continue
249                 fi
250                 # if we have matching pk3, skip
251                 if [ x"$p" != x"$d" ] && [ -f "$p" ]; then
252                         msg "Repository $d disabled by matching .pk3 file, delete $p or create $d.yes to enable"
253                         continue
254                 fi
255                 # if "no" flag is set, skip
256                 case ",$f," in
257                         *,no,*)
258                                 msg "Repository $d disabled by default, create $d.yes to enable"
259                                 continue
260                                 ;;
261                 esac
262                 # default: enable
263                 msg "Repository $d enabled by default"
264                 $ECHO "$d"
265         done
266 }
267
268 repos=`listrepos`
269
270 if [ "$#" = 0 ]; then
271         set -- help
272 fi
273 cmd=$1
274 shift
275
276 case "$cmd" in
277         release|release-*)
278                 export LC_ALL=C
279
280                 release_args="$cmd $*"
281                 msg "*** $release_args: start"
282                 release_starttime=`date +%s`
283                 release_end()
284                 {
285                         release_endtime=`date +%s`
286                         release_deltatime=$(($release_endtime - $release_starttime))
287                         msg "*** $release_args: $release_deltatime seconds"
288                 }
289                 trap release_end EXIT
290                 release_tempstarttime=$release_starttime
291                 release_timereport()
292                 {
293                         release_endtime=`date +%s` # RELEASE NOW!!!
294                         if [ -n "$*" ]; then
295                                 release_deltatime=$(($release_endtime - $release_tempstarttime))
296                                 msg "**** $release_args: $*: $release_deltatime seconds"
297                         fi
298                         release_tempstarttime=$release_endtime
299                 }
300                 release_git_extract_dir()
301                 {
302                         release_src=$1; shift
303                         release_dst=$1; shift
304                         # try to create a hardlink
305                         if ln -f "$release_src/.git/HEAD" "$release_dst/.hardlink-test"; then
306                                 rm -f "$release_dst/.hardlink-test"
307                                 {
308                                         verbose cd "$release_src"
309                                         git ls-files HEAD -- "$@"
310                                 } | {
311                                         while IFS= read -r F; do
312                                                 case "$F" in */*) mkdir -p "$release_dst/${F%/*}" ;; esac
313                                                 verbose ln -f "$release_src/$F" "$release_dst/$F"
314                                         done
315                                 }
316                         else
317                                 {
318                                         verbose cd "$release_src"
319                                         verbose git archive --format=tar HEAD -- "$@"
320                                 } | {
321                                         verbose cd "$release_dst"
322                                         verbose tar xvf -
323                                 }
324                         fi
325                 }
326                 ;;
327 esac
328
329 fix_upstream_rebase()
330 {
331         if [ -z "$r_me" ] || [ -z "$r_other" ]; then
332                 return
333         fi
334
335         # one of the two sides of the merge should be remote upstream, or all is fine
336         r_r=`git symbolic-ref HEAD`
337         r_r=${r_r#refs/heads/}
338         r_rem=`git config "branch.$r_rem.remote" || $ECHO origin`
339         r_bra=`git config "branch.$r_bra.merge" || $ECHO "$r_r"`
340         r_bra=${r_bra#refs/heads/}
341         if [ x"$r_me" != x"`git rev-parse "$r_rem/$r_bra"`" ]; then
342                 if [ x"$r_other" != x"`git rev-parse "$r_rem/$r_bra"`" ]; then
343                         return
344                 fi
345         fi
346
347         r_base=`git merge-base "$r_me" "$r_other"`
348
349         # no merge-base? upstream did filter-branch
350         if [ -n "$r_base" ]; then
351                 # otherwise, check if the two histories are "similar"
352                 r_l_me=`git log --pretty="format:%s" "$r_other".."$r_me" | grep -v "^Merge" | sort -u`
353                 r_l_other=`git log --pretty="format:%s" "$r_me".."$r_other" | grep -v "^Merge" | sort -u`
354
355                 # heuristics: upstream rebase/filter-branch if more than 50% of the commits of one of the sides are in the other too
356                 r_lc_me=`$ECHO "$r_l_me" | wc -l`
357                 r_lc_other=`$ECHO "$r_l_other" | wc -l`
358                 r_lc_together=`{ $ECHO "$r_l_me"; $ECHO "$r_l_other"; } | sort -u | wc -l`
359                 r_lc_same=$(($r_lc_me + $r_lc_other - $r_lc_together))
360
361                 if [ $(( $r_lc_same * 2 )) -gt $(( $r_lc_me )) ] || [ $(( $r_lc_same * 2 )) -gt $(( $r_lc_other )) ]; then
362                         if yesno "Probable upstream rebase detected, automatically fix?" 'git log --oneline --graph --date-order --left-right "$r_other"..."$r_me"'; then
363                                 git reset --hard "$r_me"
364                                 git pull --rebase
365                                 return 1
366                         fi
367                 fi
368         fi
369
370         return 0
371 }
372
373 fix_upstream_rebase_mergeok()
374 {
375         r_me=`git rev-parse --revs-only HEAD^1 2>/dev/null || true`
376         r_other=`git rev-parse --revs-only HEAD^2 2>/dev/null || true`
377         fix_upstream_rebase
378 }
379
380 fix_upstream_rebase_mergefail()
381 {
382         r_me=`git rev-parse --revs-only HEAD 2>/dev/null || true`
383         r_other=`git rev-parse --revs-only MERGE_HEAD 2>/dev/null || true`
384         fix_upstream_rebase
385 }
386
387 fix_git_config()
388 {
389         if ! [ -f ".git/config" ]; then
390                 $ECHO "Not a git repository. Bailing out to not cause damage."
391                 exit 1
392         fi
393         verbose git config remote.origin.url "$1"
394         if [ -n "$2" ]; then
395                 verbose git config remote.origin.pushurl "$2"
396         else
397                 verbose git config --unset remote.origin.pushurl || true
398         fi
399         verbose git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
400         case ",`repoflags "$d"`," in
401                 *,noautocrlf,*)
402                         verbose git config --unset core.autocrlf || true
403                         ;;
404                 *)
405                         verbose git config core.autocrlf input
406                         ;;
407         esac
408         if [ -z "`git config push.default || true`" ]; then
409                 verbose git config push.default current # or is tracking better?
410         fi
411         verbose git config filter.mapclean.clean "tr -d '\r' | grep '^[^/]'"
412         verbose git config filter.mapclean.smudge "cat"
413 }
414
415 mkzipr()
416 {
417         archive=$1; shift
418         case "$RELEASETYPE" in
419                 release)
420                         sevenzipflags=-mx=9
421                         zipflags=-9
422                         ;;
423                 *)
424                         sevenzipflags=-mx=1
425                         zipflags=-1
426                         ;;
427         esac
428         find "$@" -exec touch -d "2001-01-01 01:01:01 +0000" {} \+ # ugly hack to make the pk3 files rsync-friendly
429         ziplist=`mktemp`
430         find "$@" -xtype f \( -executable -or -type l \) -print > "$ziplist"
431         7za a -tzip $sevenzipflags -x@"$ziplist" "$archive" "$@" || true
432         zip         $zipflags -y   -@<"$ziplist" "$archive"      || true
433         rm -f "$ziplist"
434 }
435
436 mkzip()
437 {
438         archive=$1; shift
439         case "$RELEASETYPE" in
440                 release)
441                         sevenzipflags=-mx=9
442                         zipflags=-9
443                         ;;
444                 *)
445                         sevenzipflags=-mx=1
446                         zipflags=-1
447                         ;;
448         esac
449         ziplist=`mktemp`
450         find "$@" -xtype f \( -executable -or -type l \) -print > "$ziplist"
451         7za a -tzip $sevenzipflags -x@"$ziplist" "$archive" "$@" || true
452         zip         $zipflags -y   -@<"$ziplist" "$archive"      || true
453         rm -f "$ziplist"
454 }
455
456 mkzip0()
457 {
458         archive=$1; shift
459         zip -0ry "$archive" "$@"
460 }
461
462 mirrorspeed()
463 {
464         # first result is to be ignored, but we use it to check status
465         git ls-remote "$1" refs/heads/master >/dev/null 2>&1 || return 1
466         { 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*,,'
467                 # unit: clock ticks (depends on what "time" returns
468 }
469
470 bestmirror()
471 {
472         pre=$1; shift
473         suf=$1; shift
474
475         if ! { time -p true; } >/dev/null 2>&1; then
476                 msg "Cannot do timing in this shell"
477                 return 1
478         fi
479
480         bestin=
481         bestt=
482         for mir in "$@"; do
483                 case "$mir" in
484                         *:*)
485                                 in=${mir%%:*}
486                                 op=${mir#*:}
487                                 ;;
488                         *)
489                                 in=$mir
490                                 op=
491                                 ;;
492                 esac
493                 m=$pre$in$suf
494                 if t=`mirrorspeed "$m"`; then
495                         if [ -n "$t" ]; then
496                                 tt=$(($t$op)) # fudge factor
497                                 msg "$m -> $t$op = $tt ticks"
498                                 if [ -z "$bestt" ] || [ "$tt" -lt "$bestt" ]; then
499                                         bestin=$in
500                                         bestt=$tt
501                                 fi
502                         else
503                                 msg "$m -> error"
504                         fi
505                 else
506                         msg "$m -> FAIL"
507                 fi
508         done
509         if [ -n "$bestin" ]; then
510                 msg "Best mirror seems to be $pre$bestin$suf"
511                 $ECHO "$bestin"
512         else
513                 return 1
514         fi
515 }
516
517 case "$cmd" in
518         fix_upstream_rebase)
519                 for d in $repos; do
520                         enter "$d0/$d" verbose
521                         verbose fix_upstream_rebase_mergefail && verbose fix_upstream_rebase_mergeok
522                 done
523                 ;;
524         fix_config)
525                 for d in $repos; do
526                         url=`repourl "$d"`
527                         pushurl=`repopushurl "$d"`
528                         branch=`repobranch "$d"`
529                         if [ -f "$d0/$d/.git/config" ]; then
530                                 verbose cd "$d0/$d"
531                                 fix_git_config "$url" "$pushurl"
532                                 cd "$d0"
533                         fi
534                 done
535                 ;;
536         keygen)
537                 # enable the ssh URL for pushing
538                 "$SELF" update -N -p
539
540                 if [ -f ~/.ssh/id_rsa.pub ]; then
541                         msg ""
542                         msg "A key already exists and no new one will be generated. If you"
543                         msg "already have done the procedure for getting your key approved, you"
544                         msg "can skip the following paragraph and already use the repository."
545                         msg ""
546                         msg "To get access, your key has to be approved first. For that, visit"
547                         msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
548                         msg "the \"Support\" tracker in the \"Repository\" category where you"
549                         msg "apply for access and paste the following output into the issue:"
550                         msg ""
551                         msg "`cat ~/.ssh/id_rsa.pub`"
552                         msg ""
553                         msg "Note that you will only have write access to branches that start"
554                         msg "with your user name."
555                 elif [ -f ~/.ssh/id_dsa.pub ]; then
556                         msg ""
557                         msg "A key already exists and no new one will be generated. If you"
558                         msg "already have done the procedure for getting your key approved, you"
559                         msg "can skip the following paragraph and already use the repository."
560                         msg ""
561                         msg "To get access, your key has to be approved first. For that, visit"
562                         msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
563                         msg "the \"Support\" tracker in the \"Repository\" category where you"
564                         msg "apply for access and paste the following output into the issue:"
565                         msg ""
566                         msg "`cat ~/.ssh/id_dsa.pub`"
567                         msg ""
568                         msg "Note that you will only have write access to branches that start"
569                         msg "with your user name."
570                 else
571                         msg ""
572                         msg "No key has been generated yet. One will be generated now."
573                         msg "If other people are using your computer, it is recommended"
574                         msg "to specify a passphrase. Otherwise you can simply hit ENTER"
575                         msg "when asked for a passphrase."
576                         msg ""
577                         ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
578                         msg ""
579                         msg "To get access, your key has to be approved first. For that, visit"
580                         msg "http://dev.xonotic.org/, then log in, create a \"New Issue\" on"
581                         msg "the \"Support\" tracker in the \"Repository\" category where you"
582                         msg "apply for access and paste the following output into the issue:"
583                         msg ""
584                         msg "`cat ~/.ssh/id_rsa.pub`"
585                         msg ""
586                         msg "Note that you will only have write access to branches that start"
587                         msg "with your user name."
588                 fi
589                 ;;
590         update|pull)
591                 allow_pull=true
592                 location=current
593                 oldbase=$base
594                 oldpushbase=$pushbase
595                 # transition old URLs
596                 if [ x"$base" = x"ssh://xonotic@git.xonotic.org/" ]; then
597                         base=ssh://xonotic@push.git.xonotic.org/
598                 fi
599                 if [ x"$pushbase" = x"ssh://xonotic@git.xonotic.org/" ]; then
600                         pushbase=ssh://xonotic@push.git.xonotic.org/
601                 fi
602                 while :; do
603                         if [ x"$1" = x"-N" ]; then
604                                 allow_pull=false
605                         elif [ x"$1" = x"-p" ]; then
606                                 pushbase=ssh://xonotic@push.git.xonotic.org/
607                         elif [ x"$1" = x"-ps" ]; then
608                                 pushbase=ssh://xonotic@push.git.xonotic.org/
609                         elif [ x"$1" = x"-ph" ]; then
610                                 pushbase=http://push.git.xonotic.org/login/xonotic/
611                         elif [ x"$1" = x"-s" ]; then
612                                 base=ssh://xonotic@push.git.xonotic.org/
613                         elif [ x"$1" = x"-g" ]; then
614                                 base=git://git.xonotic.org/xonotic/
615                                 location=best
616                         elif [ x"$1" = x"-h" ]; then
617                                 base=http://git.xonotic.org/xonotic/
618                                 location=best
619                         elif [ x"$1" = x"-l" ]; then
620                                 case "$2" in
621                                         nl) ;;
622                                         de) ;;
623                                         us) ;;
624                                         best) ;;
625                                         default) ;;
626                                         *)
627                                                 msg "Invalid location!"
628                                                 msg "Possible locations for the -l option:"
629                                                 msg "  nl (Netherlands, run by merlijn)"
630                                                 msg "  de (Germany, run by divVerent)"
631                                                 msg "  us (United States of America, run by detrate)"
632                                                 msg "  best (find automatically)"
633                                                 msg "  default (currently nl)"
634                                                 exit 1
635                                                 ;;
636                                 esac
637                                 location=$2
638                                 shift
639                         else
640                                 break
641                         fi
642                         shift
643                 done
644                 case "$location" in
645                         current)
646                                 if [ x"`git config xonotic.all.mirrorselection 2>/dev/null || true`" != x"done" ]; then
647                                         location=best
648                                 fi
649                                 ;;
650                 esac
651                 case "$location" in
652                         best)
653                                 # if we fetched via ssh://, switch to git:// for fetching and keep using ssh:// for pushing
654                                 case "$base" in
655                                         ssh://*|*/login/*)
656                                                 pushbase=$base
657                                                 base=git://git.xonotic.org/xonotic/
658                                                 ;;
659                                 esac
660                                 newbase=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,:// .git.xonotic.org/,"`
661                                 case "$newbase" in
662                                         *\ *)
663                                                 if location=`bestmirror $newbase"xonotic.git" de us nl:'*6/5'`; then # 20% malus to the NL server to not overload it too much
664                                                         git config xonotic.all.mirrorselection done
665                                                 else
666                                                         location=current
667                                                 fi
668                                                 ;;
669                                         *)
670                                                 location=current
671                                                 ;;
672                                 esac
673                                 ;;
674                 esac
675                 case "$location" in
676                         default)
677                                 location=
678                                 ;;
679                         current)
680                                 case "$base" in
681                                         *://*.git.xonotic.org/*)
682                                                 location=${base%%.git.xonotic.org/*}
683                                                 location=${location##*://}
684                                                 ;;
685                                         *)
686                                                 location=
687                                                 ;;
688                                 esac
689                                 ;;
690                 esac
691                 if [ -n "$location" ]; then
692                         base=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,://$location.git.xonotic.org/,"`
693                 else
694                         base=`$ECHO "$base" | sed "s,://\(.*\.\)\?git.xonotic.org/,://git.xonotic.org/,"`
695                 fi
696                 pushbase=`$ECHO "$pushbase" | sed "s,://\(.*\.\)\?git.xonotic.org/,://xonotic@push.git.xonotic.org/,"`
697                 if [ x"$base" != x"$oldbase" ] || [ x"$pushbase" != x"$oldpushbase" ]; then
698                         url=`repourl .`
699                         pushurl=`repopushurl .`
700                         fix_git_config "$url" "$pushurl"
701                         "$SELF" fix_config
702                 elif $allow_pull; then
703                         "$SELF" fix_config
704                 fi
705                 for d in $repos; do
706                         url=`repourl "$d"`
707                         pushurl=`repopushurl "$d"`
708                         branch=`repobranch "$d"`
709                         if [ -f "$d0/$d/.git/config" ]; then
710                                 # if we have .no file, skip
711                                 if [ -f "$d0/$d.no" ]; then
712                                         msg "Repository $d disabled by a .no file, delete $d.no to enable; thus, not updated"
713                                         continue
714                                 fi
715                                 if $allow_pull; then
716                                         enter "$d0/$d" verbose
717                                         r=`git symbolic-ref HEAD`
718                                         r=${r#refs/heads/}
719                                         if git config branch.$r.remote >/dev/null 2>&1; then
720                                                 if ! verbose git pull; then
721                                                         fix_upstream_rebase_mergefail || true
722                                                         check_mergeconflict "$d"
723                                                         $ECHO "Pulling failed. Press ENTER to continue, or Ctrl-C to abort."
724                                                         read -r DUMMY
725                                                 else
726                                                         fix_upstream_rebase_mergeok || true
727                                                 fi
728                                         fi
729
730                                         cd "$d00"
731                                         checkself "$cmd" "$@"
732                                         cd "$d0/$d"
733                                         verbose git remote prune origin
734                                         cd "$d0"
735                                 fi
736                         else
737                                 if [ -d "$d0/$d" ]; then
738                                         if yesno "$d0/$d is in the way, get rid of it and reclone?"; then
739                                                 verbose rm -rf "$d0/$d"
740                                         else
741                                                 echo "Note: $d0/$d will stay broken."
742                                                 continue
743                                         fi
744                                 fi
745                                 verbose git clone "$url" "$d0/$d"
746                                 enter "$d0/$d" verbose
747                                 fix_git_config "$url" "$pushurl"
748                                 if [ "$branch" != "master" ]; then
749                                         verbose git checkout --track -b "$branch" origin/"$branch"
750                                 fi
751                                 cd "$d0"
752                         fi
753                 done
754                 ;;
755         update-maps)
756                 misc/tools/xonotic-map-compiler-autobuild download
757                 ;;
758         checkout|switch)
759                 checkoutflags=
760                 if [ x"$1" = x"-f" ]; then
761                         checkoutflags=-f
762                         shift
763                 fi
764                 remote=$1
765                 branch=$2
766                 if [ -z "$branch" ]; then
767                         case "$remote" in
768                                 origin/*)
769                                         branch=${remote#origin/}
770                                         remote=origin
771                                         ;;
772                                 *)
773                                         branch=$remote
774                                         remote=origin
775                                         ;;
776                         esac
777                 fi
778                 if [ -n "$checkoutflags" ]; then
779                         set -- -f "$@" # to make checkself work again
780                 fi
781                 exists=false
782                 for d in $repos; do
783                         enter "$d0/$d" verbose
784                         b=$branch
785                         if [ -n "$b" ] && git rev-parse "refs/heads/$b" >/dev/null 2>&1; then
786                                 exists=true
787                                 verbose git checkout $checkoutflags "$b"
788                         elif [ -n "$b" ] && git rev-parse "refs/remotes/$remote/$b" >/dev/null 2>&1; then
789                                 exists=true
790                                 verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
791                         else
792                                 b=`repobranch "$d"`
793                                 if git rev-parse "refs/heads/$b" >/dev/null 2>&1; then
794                                         verbose git checkout $checkoutflags "$b"
795                                 elif git rev-parse "refs/remotes/$remote/$b" >/dev/null 2>&1; then
796                                         verbose git checkout $checkoutflags --track -b "$b" "$remote/$b"
797                                 else
798                                         $ECHO "WTF? Not even branch $b doesn't exist in $d"
799                                         exit 1
800                                 fi
801                         fi
802                         cd "$d00"
803                         checkself "$cmd" "$@"
804                         cd "$d0"
805                 done
806                 if ! $exists; then
807                         $ECHO "The requested branch was not found in any repository."
808                 fi
809                 exec "$SELF" branch
810                 ;;
811         branch)
812                 remote=$1
813                 branch=$2
814                 srcbranch=$3
815                 if [ -z "$branch" ]; then
816                         branch=$remote
817                         remote=origin
818                 fi
819                 if [ -z "$branch" ]; then
820                         for d in $repos; do
821                                 enter "$d0/$d"
822                                 r=`git symbolic-ref HEAD`
823                                 r=${r#refs/heads/}
824                                 $ECHO "$d is at $r"
825                                 cd "$d0"
826                         done
827                 else
828                         for d in $repos; do
829                                 dv=`visible_repo_name "$d"`
830                                 enter "$d0/$d" verbose
831                                 if git rev-parse "refs/heads/$branch" >/dev/null 2>&1; then
832                                         $ECHO "Already having this branch in $dv."
833                                 else
834                                         if yesno "Branch in $dv?"; then
835                                                 if [ -n "$srcbranch" ]; then
836                                                         b=$srcbranch
837                                                 else
838                                                         b=origin/"`repobranch "$d"`"
839                                                         verbose git fetch origin || true
840                                                 fi
841                                                 # TODO do this without pushing
842                                                 verbose git checkout -b "$branch" "$b"
843                                                 verbose git config "branch.$branch.remote" "$remote"
844                                                 verbose git config "branch.$branch.merge" "refs/heads/$branch"
845                                         fi
846                                 fi
847                                 cd "$d0"
848                         done
849                         "$SELF" branch
850                 fi
851                 ;;
852         branches)
853                 for d in $repos; do
854                         cd "$d0/$d" # am in a pipe, shouldn't use enter
855                         git branch -r -v -v | cut -c 3- | sed "s/^(no branch)/(no_branch)/" | sed "s,^,$d ,"
856                         cd "$d0"
857                 done | {
858                         branches_list=
859                         # branches_repos_*=
860                         while read -r d BRANCH REV TEXT; do
861                                 if [ x"$BRANCH" = x"`repobranch "$d"`" ]; then
862                                         continue
863                                 fi
864                                 if [ x"$REV" = x"->" ]; then
865                                         continue
866                                 fi
867                                 BRANCH=${BRANCH#remotes/}
868                                 ID=`$ECHO "$BRANCH" | tr -c "A-Za-z0-9." "_"`
869                                 branches_list="$branches_list $BRANCH" # TEH SORT MAKEZ IT UNIEQ
870                                 eval "r=\$branches_repos_$ID"
871                                 r="$r $d"
872                                 eval "branches_repos_$ID=\$r"
873                         done
874                         $ECHO -n "$branches_list" | xargs -n 1 $ECHO | sort -u | while IFS= read -r BRANCH; do
875                                 ID=`$ECHO "$BRANCH" | tr -c "A-Za-z0-9." "_"`
876                                 eval "r=\$branches_repos_$ID"
877                                 printf "%-60s %s\n" "$BRANCH" "$r"
878                                 #$ECHO "$BRANCH: $r"
879                         done
880                 }
881                 ;;
882         merge)
883                 for d in $repos; do
884                         dv=`visible_repo_name "$d"`
885                         enter "$d0/$d" verbose
886                         r=`git symbolic-ref HEAD`
887                         r=${r#refs/heads/}
888                         if git log HEAD..origin/"`repobranch "$d"`" | grep .; then
889                                 # we have uncommitted changes
890                                 if yesno "Could merge from \"`repobranch "$d"`\" into \"$r\" in $dv. Do it?"; then
891                                         if ! verbose git merge origin/"`repobranch "$d"`"; then
892                                                 check_mergeconflict "$d"
893                                                 exit 1 # this should ALWAYS be fatal
894                                         fi
895                                 fi
896                         fi
897                         cd "$d0"
898                 done
899                 ;;
900         push|commit)
901                 submit=$1
902                 for d in $repos; do
903                         dv=`visible_repo_name "$d"`
904                         enter "$d0/$d" verbose
905                         r=`git symbolic-ref HEAD`
906                         r=${r#refs/heads/}
907                         diffdata=`git diff --color HEAD`
908                         if [ -n "$diffdata" ]; then
909                                 # we have uncommitted changes
910                                 if yesno "Uncommitted changes in \"$r\" in $dv. Commit?" '$ECHO "$diffdata" | less -r'; then
911                                         verbose git commit -a
912                                 fi
913                         fi
914                         rem=`git config "branch.$r.remote" || $ECHO origin`
915                         bra=`git config "branch.$r.merge" || $ECHO "$r"`
916                         upstream="$rem/${bra#refs/heads/}"
917                         if ! git rev-parse "$upstream" >/dev/null 2>&1; then
918                                 upstream="origin/`repobranch "$d"`"
919                         fi
920                         logdata=`git log --color "$upstream".."$r"`
921                         if [ -n "$logdata" ]; then
922                                 if yesno "Push \"$r\" in $dv?" '$ECHO "$logdata" | less -r'; then
923                                         verbose git push "$rem" HEAD
924                                 fi
925                         fi
926                         if [ x"$submit" = x"-s" ]; then
927                                 case "$r" in
928                                         */*)
929                                                 verbose git push "$rem" HEAD:"${bra%%/*}/finished/${bra#*/}"
930                                                 ;;
931                                 esac
932                         fi
933                         cd "$d0"
934                 done
935                 ;;
936         compile)
937                 cleand0=false
938                 cleandp=false
939                 cleanqcc=false
940                 cleanqc=false
941                 compiled0=false
942                 debug=debug
943                 snowleopardhack=false
944                 if [ -z "$CC" ]; then
945                         export CC="gcc"
946                 fi
947                 export CC="$CC -DSUPPORTIPV6"
948                 while :; do
949                         case "$1" in
950                                 -0)
951                                         compiled0=true
952                                         shift
953                                         ;;
954                                 -c)
955                                         cleand0=true
956                                         cleandp=true
957                                         cleanqcc=true
958                                         cleanqc=true
959                                         shift
960                                         ;;
961                                 -r|-p)
962                                         case "$1" in
963                                                 -p)
964                                                         debug=profile
965                                                         ;;
966                                                 -r)
967                                                         debug=release
968                                                         ;;
969                                         esac
970                                         export CC="$CC -g"
971                                         case "`$CC -dumpversion`" in
972                                                 [5-9]*|[1-9][0-9]*|4.[3-9]*|4.[1-9][0-9]*)
973                                                         # gcc 4.3 or higher
974                                                         # -march=native is broken < 4.3
975                                                         if $CC -mtune=native -march=native misc/tools/conftest.c -o conftest >/dev/null 2>&1; then
976                                                                 export CC="$CC -mtune=native -march=native"
977                                                         fi
978                                                         ;;
979                                         esac
980                                         if [ -n "$WE_HATE_OUR_USERS" ]; then
981                                                 export CC="$CC -fno-common"
982                                         fi
983                                         shift
984                                         ;;
985                                 *)
986                                         break
987                                         ;;
988                         esac
989                 done
990                 if [ -n "$WE_HATE_OUR_USERS" ]; then
991                         TARGETS="sv-$debug cl-$debug"
992                 elif [ x"`uname`" = x"Darwin" ]; then
993                         case "`uname -r`" in
994                                 ?.*)
995                                         TARGETS="sv-$debug cl-$debug sdl-$debug"
996                                         ;;
997                                 *)
998                                         # AGL cannot be compiled on systems with a kernel > 10.x (Snow Leopard)
999                                         snowleopardhack=true
1000                                         TARGETS="sv-$debug sdl-$debug"
1001                                         ;;
1002                         esac
1003                         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"
1004                 else
1005                         TARGETS="sv-$debug cl-$debug sdl-$debug"
1006                 fi
1007                 if [ $# -gt 0 ] && [ x"$1" = x"" ]; then
1008                         # if we give the command make the arg "", it will surely fail (invalid filename),
1009                         # so better handle it as an empty client option
1010                         BAD_TARGETS=" "
1011                         shift
1012                 elif [ -n "$1" ]; then
1013                         BAD_TARGETS=
1014                         TARGETS_SAVE=$TARGETS
1015                         TARGETS=
1016                         for X in $1; do
1017                                 case "$X" in
1018                                         sdl)
1019                                                 TARGETS="$TARGETS sdl-debug"
1020                                                 ;;
1021                                         agl)
1022                                                 TARGETS="$TARGETS cl-debug"
1023                                                 if $snowleopardhack; then
1024                                                         export CC="$CC -arch i386"
1025                                                 fi
1026                                                 ;;
1027                                         glx|wgl)
1028                                                 TARGETS="$TARGETS cl-debug"
1029                                                 ;;
1030                                         dedicated)
1031                                                 TARGETS="$TARGETS sv-debug"
1032                                                 ;;
1033                                         *)
1034                                                 BAD_TARGETS="$BAD_TARGETS $X"
1035                                                 ;;
1036                                 esac
1037                         done
1038                         if [ -n "$TARGETS" ]; then # at least a valid client
1039                                 shift
1040                         else # no valid client, let's assume this option is not meant to be a client then
1041                                 TARGETS=$TARGETS_SAVE
1042                                 BAD_TARGETS=
1043                         fi
1044                 fi
1045                 if [ -z "$MAKEFLAGS" ]; then
1046                         if [ -f /proc/cpuinfo ]; then
1047                                 ncpus=$((`grep -c '^processor   :' /proc/cpuinfo || true`+0))
1048                                 if [ $ncpus -gt 1 ]; then
1049                                         MAKEFLAGS=-j$ncpus
1050                                 fi
1051                         fi
1052                         if [ -n "$WE_HATE_OUR_USERS" ]; then
1053                                 MAKEFLAGS="$MAKEFLAGS DP_MAKE_TARGET=mingw LIB_JPEG= CFLAGS_LIBJPEG="
1054                         fi
1055                 fi
1056
1057                 
1058                 if ! verbose $CC misc/tools/conftest.c -o conftest; then
1059                         msg ""
1060                         msg "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
1061                         msg "~~~~~~~~~~ COMPILER ~~~~~~~~~~"
1062                         msg "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
1063                         msg "~~~~~~~~~~~~~~_...._~~~~~~~~~~"
1064                         msg "~~~~~~~~~~~,-'     \\\`-._~~~~~~"
1065                         msg "~~~~~~~~~~/     --. ><  \\~~~~~"
1066                         msg "~~~~~~~~~/      (*)> -<: \\~~~~"
1067                         msg "~~~~~~~~~(     ^~-'  (*) )~~~~"
1068                         msg "~~~~~~~~~\\        ^+-_/  |~~~~"
1069                         msg "~~~~~~~~~~\\       {vvv}  |~~~~"
1070                         msg "~~~~~~~~~~,\\    , {^^^},/~~~~~"
1071                         msg "~~~~~~~~,/  \`---.....-'~~W~~~~"
1072                         msg "~~~~~~,/   \\_____/_\\_W~~/~~~~~"
1073                         msg "~~~~~/          /~~~\\__/~~~~~~"
1074                         msg "~~~~/          /~~~~~~~~~~~~~~"
1075                         msg "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
1076                         msg "~~~~~~~ Y U NO COMPILE ~~~~~~~"
1077                         msg "~~~~~~~~~~~~ CODE ~~~~~~~~~~~~"
1078                         msg "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
1079                         msg ""
1080                         exit 1
1081                 fi
1082                 rm -f conftest
1083
1084                 verbose cd "$d0/d0_blind_id"
1085                 if ! $compiled0; then
1086                         # compilation of crypto library failed
1087                         # use binaries then, if we can...
1088                         mkdir -p .libs
1089                         if [ -n "$WE_HATE_OUR_USERS" ]; then
1090                                 verbose cp "$d0/misc/buildfiles/win32/libd0_blind_id"-* .libs/
1091                                 verbose cp "$d0/misc/buildfiles/win32/libd0_rijndael"-* .libs/
1092                                 verbose cp "$d0/misc/buildfiles/win32/libgmp"-* .libs/
1093                         else
1094                                 case "`uname`" in
1095                                         Linux)
1096                                                 case `uname -m` in
1097                                                         x86_64)
1098                                                                 #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_blind_id".* .libs/
1099                                                                 #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libd0_rijndael".* .libs/
1100                                                                 #verbose cp "$d0/misc/builddeps/dp.linux64/lib/libgmp".* .libs/
1101                                                                 MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/ DP_CRYPTO_RIJNDAEL_STATIC_LIBDIR=../misc/builddeps/dp.linux64/lib/"
1102                                                                 ;;
1103                                                         *86)
1104                                                                 #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_blind_id".* .libs/
1105                                                                 #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libd0_rijndael".* .libs/
1106                                                                 #verbose cp "$d0/misc/builddeps/dp.linux32/lib/libgmp".* .libs/
1107                                                                 MAKEFLAGS="$MAKEFLAGS DP_CRYPTO_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/ DP_CRYPTO_RIJNDAEL_STATIC_LIBDIR=../misc/builddeps/dp.linux32/lib/"
1108                                                                 ;;
1109                                                         *)
1110                                                                 compiled0=true
1111                                                                 ;;
1112                                                 esac
1113                                                 ;;
1114                                         Darwin)
1115                                                 verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_blind_id".* .libs/
1116                                                 verbose cp "$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS/libd0_rijndael".* .libs/
1117                                                 ;;
1118                                         *)
1119                                                 compiled0=true
1120                                                 ;;
1121                                 esac
1122                         fi
1123                 fi
1124                 if $compiled0; then
1125                         if $cleand0; then
1126                                 if [ -f Makefile ]; then
1127                                         verbose make $MAKEFLAGS distclean
1128                                 fi
1129                         fi
1130                         if ! [ -f Makefile ]; then
1131                                 verbose sh autogen.sh
1132                                 verbose ./configure
1133                         fi
1134                         verbose make $MAKEFLAGS
1135                 fi
1136
1137                 verbose cd "$d0/fteqcc"
1138                 if $cleanqcc; then
1139                         verbose make $MAKEFLAGS clean
1140                 fi
1141                 verbose make $MAKEFLAGS
1142
1143                 verbose cd "$d0/data/xonotic-data.pk3dir"
1144                 if $cleanqc; then
1145                         verbose make FTEQCC="../../../../fteqcc/fteqcc.bin" "$@" $MAKEFLAGS clean
1146                 fi
1147                 verbose make FTEQCC="../../../../fteqcc/fteqcc.bin" "$@" $MAKEFLAGS
1148                 # 4 levels up: data, xonotic-data, qcsrc, server
1149
1150                 verbose cd "$d0/darkplaces"
1151                 if [ x"$BAD_TARGETS" = x" " ]; then
1152                         $ECHO "Warning: invalid empty client, default clients will be used."
1153                 fi
1154                 if $cleandp; then
1155                         verbose make $MAKEFLAGS clean
1156                 fi
1157                 for T in $TARGETS; do
1158                         verbose make $MAKEFLAGS STRIP=: "$@" "$T"
1159                 done
1160                 for T in $BAD_TARGETS; do
1161                         $ECHO "Warning: discarded invalid client $T."
1162                 done
1163
1164                 verbose "$SELF" update-maps
1165                 ;;
1166         run)
1167                 if [ -n "$WE_HATE_OUR_USERS" ]; then
1168                         client=
1169                         export PATH="$d0/misc/buildfiles/win32:$d0/d0_blind_id/.libs:$PATH"
1170                 elif [ x"`uname`" = x"Darwin" ]; then
1171                         export DYLD_LIBRARY_PATH="$d0/misc/buildfiles/osx/Xonotic.app/Contents/MacOS:$d0/d0_blind_id/.libs"
1172                         export DYLD_FRAMEWORK_PATH="$d0/misc/buildfiles/osx/Xonotic.app/Contents/Frameworks"
1173                         client=-sdl
1174                 else
1175                         export LD_LIBRARY_PATH="$d0/d0_blind_id/.libs"
1176                         client=-sdl
1177                 fi
1178                 case "$1" in
1179                         sdl|glx|agl|dedicated)
1180                                 client=-$1
1181                                 shift
1182                                 ;;
1183                         wgl)
1184                                 client=
1185                                 shift
1186                                 ;;
1187                 esac
1188                 if ! [ -x "darkplaces/darkplaces$client" ]; then
1189                         if [ -x "darkplaces/darkplaces$client.exe" ]; then
1190                                 client=$client.exe
1191                         else
1192                                 $ECHO "Client darkplaces/darkplaces$client not found, aborting"
1193                                 exit 1
1194                         fi
1195                 fi
1196                 set -- "darkplaces/darkplaces$client" -xonotic "$@"
1197
1198                 # if pulseaudio is running: USE IT
1199                 if [ -z "$SDL_AUDIODRIVER" ] && ! [ -n "$WE_HATE_OUR_USERS" ] && ! [ x"`uname`" = x"Darwin" ]; then
1200                         if ps -C pulseaudio >/dev/null; then
1201                                 if ldd /usr/lib/libSDL.so 2>/dev/null | grep pulse >/dev/null; then
1202                                         export SDL_AUDIODRIVER=pulse
1203                                 fi
1204                         fi
1205                 fi
1206
1207                 binary=$1
1208
1209                 if [ x"$USE_GDB" = x"yes" ]; then
1210                         set -- gdb --args "$@"
1211                 elif [ x"$USE_GDB" = x"core" ] && which gdb >/dev/null 2>&1; then
1212                         set -- gdb --batch -x savecore.gdb --args "$@"
1213                 elif which catchsegv >/dev/null 2>&1; then
1214                         set -- catchsegv "$@"
1215                 fi
1216                 rm -f xonotic.core
1217                 "$@" || true
1218                 if [ -f xonotic.core ]; then
1219                         if yesno "The program has CRASHED. Do you want to examine the core dump?"; then
1220                                 gdb "$binary" xonotic.core
1221                         #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
1222                         #       tar cvzf xonotic.core.tar.gz xonotic.core darkplaces/*.c darkplaces/*.h
1223                         #       # somehow send it
1224                         #       rm -f xonotic.core.tar.gz
1225                         else
1226                                 $ECHO "The core dump can be examined later by"
1227                                 $ECHO "  gdb $binary xonotic.core"
1228                         fi
1229                         exit 1
1230                 fi
1231                 ;;
1232         each|foreach)
1233                 keep_going=false
1234                 if [ x"$1" = x"-k" ]; then
1235                         keep_going=true
1236                         shift
1237                 fi
1238                 for d in $repos; do
1239                         if verbose cd "$d0/$d"; then
1240                                 if $keep_going; then
1241                                         verbose "$@" || true
1242                                 else
1243                                         verbose "$@"
1244                                 fi
1245                                 cd "$d0"
1246                         fi
1247                 done
1248                 ;;
1249         save-patches)
1250                 outfile=$1
1251                 patchdir=`mktemp -d -t save-patches.XXXXXX`
1252                 for d in $repos; do
1253                         enter "$d0/$d" verbose
1254                         git branch -v -v | cut -c 3- | {
1255                                 i=0
1256                                 while read -r BRANCH REV UPSTREAM TEXT; do
1257                                         case "$UPSTREAM" in
1258                                                 \[*)
1259                                                         UPSTREAM=${UPSTREAM#\[}
1260                                                         UPSTREAM=${UPSTREAM%\]}
1261                                                         UPSTREAM=${UPSTREAM%:*}
1262                                                         TRACK=true
1263                                                         ;;
1264                                                 *)
1265                                                         UPSTREAM=origin/"`repobranch "$d"`"
1266                                                         TRACK=false
1267                                                         ;;
1268                                         esac
1269                                         if [ x"$REV" = x"->" ]; then
1270                                                 continue
1271                                         fi
1272                                         if git format-patch -o "$patchdir/$i" "$UPSTREAM".."$BRANCH"; then
1273                                                 $ECHO "$d" > "$patchdir/$i/info.txt"
1274                                                 $ECHO "$BRANCH" >> "$patchdir/$i/info.txt"
1275                                                 $ECHO "$UPSTREAM" >> "$patchdir/$i/info.txt"
1276                                                 $ECHO "$TRACK" >> "$patchdir/$i/info.txt"
1277                                                 i=$(($i+1))
1278                                         else
1279                                                 rm -rf "$patchdir/$i"
1280                                         fi
1281                                 done
1282                         }
1283                 done
1284                 ( cd "$patchdir" && tar cvzf - . ) > "$outfile"
1285                 rm -rf "$patchdir"
1286                 ;;
1287         restore-patches)
1288                 infile=$1
1289                 patchdir=`mktemp -d -t restore-patches.XXXXXX`
1290                 ( cd "$patchdir" && tar xvzf - ) < "$infile"
1291                 # detach the head
1292                 for P in "$patchdir"/*/info.txt; do
1293                         D=${P%/info.txt}
1294                         exec 3<"$P"
1295                         read -r d <&3
1296                         read -r BRANCH <&3
1297                         read -r UPSTREAM <&3
1298                         read -r TRACK <&3
1299                         verbose git checkout HEAD^0
1300                         verbose git branch -D "$BRANCH"
1301                         if [ x"$TRACK" = x"true" ]; then
1302                                 verbose git checkout --track -b "$BRANCH" "$UPSTREAM"
1303                         else
1304                                 verbose git branch -b "$BRANCH" "$UPSTREAM"
1305                         fi
1306                         verbose git am "$D"
1307                 done
1308                 rm -rf "$patchdir"
1309                 ;;
1310         admin-merge)
1311                 branch=$1
1312                 only_delete=false
1313                 case "$branch" in
1314                         -d)
1315                                 branch=
1316                                 only_delete=true
1317                                 ;;
1318                 esac
1319                 t=`mktemp`
1320                 report=""
1321                 reportecho()
1322                 {
1323                         report=$report"$*$LF"
1324                         $ECHO "$*"
1325                 }
1326                 reportecho4()
1327                 {
1328                         report=$report"    $*$LF"
1329                         $ECHO "    $*"
1330                 }
1331                 reportdo4()
1332                 {
1333                         o=`"$@" | sed 's/^/    /' || true`
1334                         reportecho "$o"
1335                 }
1336                 for d in $repos; do
1337                         case "$d" in
1338                                 fteqcc)
1339                                         # sorry, fteqcc repo is managed manually
1340                                         continue
1341                                         ;;
1342                         esac
1343                         enter "$d0/$d" verbose
1344                         base="`repobranch "$d"`"
1345                         reportecho "In $d:"
1346                         for ref in `git for-each-ref --format='%(refname)' refs/remotes/origin/`; do
1347                                 case "${ref#refs/remotes/origin/}" in
1348                                         "$base")
1349                                                 continue
1350                                                 ;;
1351                                         HEAD|master)
1352                                                 continue
1353                                                 ;;
1354                                         */*)
1355                                                 ;;
1356                                         *)
1357                                                 continue
1358                                                 ;;
1359                                 esac
1360                                 if [ -n "$branch" ]; then
1361                                         if [ x"$branch" != x"${ref#refs/remotes/origin/}" ]; then
1362                                                 continue
1363                                         fi
1364                                 fi
1365                                 case "$base" in
1366                                         master)
1367                                                 realbase=$base
1368                                                 ;;
1369                                         *)
1370                                                 l0=`git rev-list "$base".."$ref" | wc -l`
1371                                                 l1=`git rev-list master.."$ref" | wc -l`
1372                                                 if [ $l0 -gt $l1 ]; then
1373                                                         realbase=master
1374                                                 else
1375                                                         realbase=$base
1376                                                 fi
1377                                                 ;;
1378                                 esac
1379                                 reportecho "  Branch $ref:"
1380                                 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1381                                 logdata=`git log --color "$realbase".."$ref"`
1382                                 if [ -z "$logdata" ]; then
1383                                         reportecho4 "--> not merging, no changes vs master"
1384                                         if yesno "Branch \"$ref\" probably should get deleted. Do it?" ''; then
1385                                                 git push origin :"${ref#refs/remotes/origin/}"
1386                                                 reportecho4 "--> branch deleted"
1387                                         fi
1388                                 else
1389                                         diffdata=`git diff --color --find-copies-harder --ignore-space-change "$realbase"..."$ref"`
1390                                         if [ -z "$diffdata" ]; then
1391                                                 reportecho4 "--> not merging, no changes vs master, branch contains redundant history"
1392                                                 if yesno "Branch \"$ref\" probably should get deleted. Do it?" '{ $ECHO "$logdata"; } | less -r'; then
1393                                                         git push origin :"${ref#refs/remotes/origin/}"
1394                                                         reportecho4 "--> branch deleted"
1395                                                 fi
1396                                         elif $only_delete; then
1397                                                 reportecho4 "--> skipped in delete-only run"
1398                                         elif [ -z "$branch" ] && [ -n "$note" ]; then
1399                                                 reportdo4 $ECHO "$note"
1400                                                 reportecho4 "--> not merging, already had this one rejected before"
1401                                         elif yesno "Branch \"$ref\" may want to get merged. Do it?" '{ $ECHO "$logdata"; $ECHO "$diffdata"; } | less -r'; then
1402                                                 git checkout "$realbase"
1403                                                 org=`git rev-parse HEAD`
1404                                                 if ! git merge --no-ff "$ref" 2>&1 | tee "$t" && ! { git ls-files -u | grep ' 1 ' >/dev/null; }; then
1405                                                         git reset --hard "$org"
1406                                                         GIT_NOTES_REF=refs/notes/admin-merge git notes edit -m "Merge failed:$LF`cat "$t"`" "$ref"
1407                                                         reportdo4 cat "$t"
1408                                                         reportecho4 "--> merge failed"
1409                                                 elif ! "$SELF" compile 2>&1 | tee "$t"; then
1410                                                         git reset --hard "$org"
1411                                                         GIT_NOTES_REF=refs/notes/admin-merge git notes edit -m "Compile failed:$LF`cat "$t"`" "$ref"
1412                                                         reportdo4 cat "$t"
1413                                                         reportecho4 "--> compile failed"
1414                                                 elif ! yesno "Still merge \"$ref\" into `git symbolic-ref HEAD` of $d? Maybe you want to test first."; then
1415                                                         git reset --hard "$org"
1416                                                         GIT_NOTES_REF=refs/notes/admin-merge git notes edit "$ref"
1417                                                         note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1418                                                         if [ x"$note" = x"del" ]; then
1419                                                                 git push origin :"${ref#refs/remotes/origin/}"
1420                                                                 reportecho4 "--> test failed, branch deleted"
1421                                                         elif [ -n "$note" ]; then
1422                                                                 reportdo4 $ECHO "$note"
1423                                                                 reportecho4 "--> test failed"
1424                                                         else
1425                                                                 reportecho4 "--> test failed, postponed"
1426                                                         fi
1427                                                 else
1428                                                         # apply crlf, or other cleanup filters (non-behavioural changes)
1429                                                         git reset --hard
1430                                                         find . -type f -exec touch {} \;
1431                                                         git commit -a --amend -C HEAD || true # don't fail if nothing to commit
1432
1433                                                         $ECHO "MERGING"
1434                                                         case ",`repoflags "$d"`," in
1435                                                                 *,svn,*)
1436                                                                         # we do quite a mess here... luckily we know $org
1437                                                                         git fetch # svn needs to be current
1438                                                                         git rebase -i --onto origin/master "$org"
1439                                                                         git svn dcommit --add-author-from
1440                                                                         git reset --hard "$org"
1441                                                                         ;;
1442                                                                 *)
1443                                                                         git push origin HEAD
1444                                                                         ;;
1445                                                         esac
1446                                                         reportecho4 "--> MERGED"
1447                                                         if yesno "Delete original branch \"$ref\"?"; then
1448                                                                 git push origin :"${ref#refs/remotes/origin/}"
1449                                                                 reportecho4 "--> branch deleted"
1450                                                         fi
1451                                                 fi
1452                                         else
1453                                                 GIT_NOTES_REF=refs/notes/admin-merge git notes edit "$ref"
1454                                                 note=`GIT_NOTES_REF=refs/notes/admin-merge git notes show "$ref" 2>/dev/null || true`
1455                                                 if [ x"$note" = x"del" ]; then
1456                                                         git push origin :"${ref#refs/remotes/origin/}"
1457                                                         reportecho4 "--> branch deleted"
1458                                                 elif [ -n "$note" ]; then
1459                                                         reportdo4 $ECHO "$note"
1460                                                         reportecho4 "--> rejected"
1461                                                 else
1462                                                         reportecho4 "--> postponed"
1463                                                 fi
1464                                         fi
1465                                 fi
1466                                 reportecho ""
1467                         done
1468                         reportecho ""
1469                 done
1470                 rm -f "$t"
1471                 $ECHO "$report" | ssh nexuiz@rm.endoftheinternet.org cat '>>' public_html/xonotic-merge-notes.txt
1472                 ;;
1473         clean)
1474                 "$SELF" fix_config
1475                 "$SELF" update -N
1476                 force=false
1477                 gotoupstream=false
1478                 fetchupstream=false
1479                 gotomaster=false
1480                 rmuntracked=false
1481                 killbranches=false
1482                 # usage:
1483                 #   ./all clean [-m] [-f | -fu | -fU] [-r] [-D]
1484                 #   ./all clean --reclone
1485                 found=false
1486                 for X in "$@"; do
1487                         if [ x"$X" = x"--reclone" ]; then
1488                                 force=true
1489                                 fetchupstream=true
1490                                 gotoupstream=true
1491                                 gotomaster=true
1492                                 rmuntracked=true
1493                                 killbranches=true
1494                         elif [ x"$X" = x"-f" ]; then
1495                                 force=true
1496                         elif [ x"$X" = x"-u" ]; then
1497                                 gotoupstream=true
1498                         elif [ x"$X" = x"-U" ]; then
1499                                 gotoupstream=true
1500                                 fetchupstream=true
1501                         elif [ x"$X" = x"-fu" ]; then
1502                                 force=true
1503                                 gotoupstream=true
1504                         elif [ x"$X" = x"-fU" ]; then
1505                                 force=true
1506                                 gotoupstream=true
1507                                 fetchupstream=true
1508                         elif [ x"$X" = x"-m" ]; then
1509                                 gotomaster=true
1510                         elif [ x"$X" = x"-r" ]; then
1511                                 rmuntracked=true
1512                         elif [ x"$X" = x"-D" ]; then
1513                                 killbranches=true
1514                         elif $ECHO "$X" | grep '^-FFFF*UUUU*$' >/dev/null; then
1515                                 msg ''
1516                                 msg "        _____"
1517                                 msg "    ,--'-\\P/\`\\  FFFFFFF"
1518                                 msg " __/_    B/,-.\\  FFFFFFF"
1519                                 msg " /  _\\  (//  O\\\\  FFFFFF"
1520                                 msg "| (O  \`) _\\._ _)\\  FFFUU"
1521                                 msg "| |___/.^d0~~\"\\  \\ UUUU"
1522                                 msg "|     |\`~'     \\ |  UUUU"
1523                                 msg "|     |    __,C>|| UUUU"
1524                                 msg "\\    /_ ,-/,-'   |  UUUU"
1525                                 msg " \\\\_ \\_>~'      /  UUUU-"
1526                                 msg ''
1527                         else
1528                                 msg "Unknown arg: $X"
1529                         fi
1530                         found=true
1531                 done
1532                 if ! $found; then
1533                         rmuntracked=true
1534                 fi
1535                 for d in $repos; do
1536                         verbose cd "$d0/$d"
1537                         if $gotoupstream; then
1538                                 if ! $force; then
1539                                         msg "Must also use -f (delete local changes) when using -u"
1540                                         exit 1
1541                                 fi
1542                                 if $gotomaster; then
1543                                         if $fetchupstream; then
1544                                                 verbose git fetch origin
1545                                                 verbose git remote prune origin
1546                                         fi
1547                                         verbose git checkout -f "`repobranch "$d"`"
1548                                         verbose git reset --hard origin/"`repobranch "$d"`"
1549                                 else
1550                                         r=`git symbolic-ref HEAD`
1551                                         r=${r#refs/heads/}
1552                                         rem=`git config "branch.$r.remote" || $ECHO origin`
1553                                         bra=`git config "branch.$r.merge" || $ECHO "$r"`
1554                                         upstream="$rem/${bra#refs/heads/}"
1555                                         if $fetchupstream; then
1556                                                 verbose git fetch "$rem"
1557                                                 verbose git remote prune "$rem"
1558                                         fi
1559                                         if ! git rev-parse "$upstream" >/dev/null 2>&1; then
1560                                                 upstream="origin/`repobranch "$d"`"
1561                                         fi
1562                                         verbose git reset --hard "$upstream"
1563                                 fi
1564                         elif $gotomaster; then
1565                                 if $force; then
1566                                         verbose git checkout -f "`repobranch "$d"`"
1567                                         verbose git reset --hard
1568                                 else
1569                                         verbose git checkout "`repobranch "$d"`"
1570                                 fi
1571                         elif $force; then
1572                                 verbose git reset --hard
1573                         fi
1574                         if $rmuntracked; then
1575                                 case "$d" in
1576                                         .)
1577                                                 verbose git clean -df || true
1578                                                 ;;
1579                                         *)
1580                                                 verbose git clean -xdf || true
1581                                                 ;;
1582                                 esac
1583                         fi
1584                         if $killbranches; then
1585                                 git for-each-ref --format='%(refname)' refs/heads/ | while IFS= read -r B; do
1586                                         if [ x"$B" != x"`git symbolic-ref HEAD`" ]; then
1587                                                 verbose git branch -D "${B#refs/heads/}"
1588                                         fi
1589                                 done
1590                                 git rev-parse refs/heads/master >/dev/null 2>&1 || verbose git branch --track master origin/master || true
1591                                 git rev-parse "refs/heads/`repobranch "$d"`" >/dev/null 2>&1 || verbose git branch --track "`repobranch "$d"`" origin/"`repobranch "$d"`" || true
1592                         fi
1593                         checkself "$cmd" "$@"
1594                 done
1595                 ;;
1596
1597         # release building goes here
1598         release-prepare)
1599                 #"$SELF" each git clean -fxd
1600                 case "$RELEASETYPE" in
1601                         '')
1602                                 $ECHO >&2 -n "$ESC[2J$ESC[H"
1603                                 msg ""
1604                                 msg ""
1605                                 msg ""
1606                                 msg ""
1607                                 msg ""
1608                                 msg ""
1609                                 msg "        +---------------------------------------------------------.---+"
1610                                 msg "        | NOTE                                                    | X |"
1611                                 msg "        +---------------------------------------------------------^---+"
1612                                 msg "        |   ____                                                      |"
1613                                 msg "        |  /    \  This is the official release build system.         |"
1614                                 msg "        | |      | If you are not a member of the Xonotic Core Team,  |"
1615                                 msg "        | | STOP | you are not supposed to use this script and should |"
1616                                 msg "        | |      | instead use ./all compile to compile the engine    |"
1617                                 msg "        |  \____/  and game code.                                     |"
1618                                 msg "        |                                                             |"
1619                                 msg "        |                      [ I understand ]                       |"
1620                                 msg "        +-------------------------------------------------------------+"
1621                                 sleep 10
1622                                 # A LOT of build infrastructure is required:
1623                                 # - vorbis-tools
1624                                 # - ImageMagick
1625                                 # - .ssh/config must be configured so the following
1626                                 #   host names are reachable and have a compile
1627                                 #   infrastructure set up:
1628                                 #   - xonotic-build-linux32 (with gcc on x86)
1629                                 #   - xonotic-build-linux64 (with gcc on x86_64)
1630                                 #   - xonotic-build-win32 (with i586-mingw32msvc-g++)
1631                                 #   - xonotic-build-win64 (with amd64-mingw32msvc-g++
1632                                 #     and x86_64-w64-mingw32-g++)
1633                                 #   - xonotic-build-osx (with Xcode and SDL.framework)
1634                                 # - AMD Compressonator installed in WINE
1635                                 # - ResEdit installed in WINE
1636                                 # - a lot of other requirements you will figure out
1637                                 #   while reading the error messages
1638                                 # - environment variable RELEASETYPE set
1639                                 # - optionally, environment variable RELEASEDATE set
1640                                 #   (YYYYMMDD)
1641                                 exit 1
1642                                 ;;
1643                         release)
1644                                 msg "Building a FINISHED RELEASE"
1645                                 ;;
1646                         *)
1647                                 msg "Building a $RELEASETYPE"
1648                                 ;;
1649                 esac
1650                 verbose rm -rf Xonotic Xonotic*.zip
1651                 verbose mkdir -p Xonotic
1652                 if [ -n "$RELEASEDATE" ]; then
1653                         verbose $ECHO "$RELEASEDATE" > Xonotic/stamp.txt
1654                 else
1655                         verbose date +%Y%m%d > Xonotic/stamp.txt
1656                 fi
1657                 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
1658                 (
1659                         verbose cd Xonotic
1660                         verbose mkdir data fteqcc source source/darkplaces source/fteqcc source/d0_blind_id mapping
1661                         verbose rm -rf misc/builddeps
1662                         verbose mv misc/buildfiles/win32 bin32 || true
1663                         verbose mv bin32/SDL.dll . || true
1664                         verbose mv misc/buildfiles/win64 bin64 || true
1665                         verbose mv misc/buildfiles/osx/* . || true
1666                         verbose rm -rf misc/buildfiles
1667                         verbose rm -rf misc/pki
1668                 )
1669                 release_git_extract_dir "darkplaces" "Xonotic/source/darkplaces" .
1670                 release_git_extract_dir "fteqcc" "Xonotic/source/fteqcc" .
1671                 release_git_extract_dir "data/xonotic-data.pk3dir" "Xonotic/source" qcsrc Makefile
1672                 release_git_extract_dir "d0_blind_id" "Xonotic/source/d0_blind_id" .
1673                 (
1674                         verbose cd Xonotic/source/d0_blind_id
1675                         verbose sh autogen.sh
1676                 )
1677                 rm -f Xonotic/key_15.d0pk
1678                 {
1679                         verbose cd Xonotic/mapping
1680                         verbose wget http://www.icculus.org/netradiant/files/netradiant-1.5.0-20120114.tar.bz2
1681                         verbose wget http://www.icculus.org/netradiant/files/netradiant-1.5.0-20120114-win32-7z.exe
1682                         for X in *-7z.exe; do
1683                                 7za x "$X"
1684                                 rm -f "$X"
1685                         done
1686                         # TODO possibly include other tools?
1687                 }
1688                 ;;
1689         release-compile-run)
1690                 host=$1
1691                 buildpath=$2
1692                 maketargets=$3
1693                 makeflags=$4
1694                 srcdir=$5
1695                 depsdir=$6
1696                 targetfiles=$7
1697                 set -x
1698                 if [ -n "$targetfiles" ]; then
1699                         case " $HOSTS_THAT_ARE_DISABLED " in
1700                                 *\ $host\ *)
1701                                         exit
1702                                         ;;
1703                         esac
1704                         case " $HOSTS_THAT_ARE_MYSELF " in
1705                                 *\ $host\ *)
1706                                         verbose rsync --delete -zLvaSHP "$srcdir"/ "$buildpath/"
1707                                         verbose rsync --delete -zLvaSHP "$depsdir"/ "$buildpath.deps/"
1708                                         verbose ln -snf "$buildpath.deps" "$buildpath/.deps"
1709                                         verbose eval make -C "$buildpath" clean $maketargets $makeflags
1710                                         for f in $targetfiles; do
1711                                                 verbose mv "$buildpath/${f%:*}" "${f##*:}" || true
1712                                         done
1713                                         ;;
1714                                 *)
1715                                         verbose rsync --delete -zLvaSHP "$srcdir"/ "$host:$buildpath/"
1716                                         verbose rsync --delete -zLvaSHP "$depsdir"/ "$host:$buildpath.deps/"
1717                                         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"
1718                                         for f in $targetfiles; do
1719                                                 verbose rsync -zvaSHP "$host:$buildpath/${f%:*}" "${f##*:}" || true
1720                                         done
1721                                         ;;
1722                         esac
1723                         # now rebrand the binaries...
1724                         for f in $targetfiles; do
1725                                 #verbose "$d0/misc/tools/rebrand-darkplaces-engine.sh" "${XONOTIC_BRAND:-$d0/misc/tools/xonotic.brand}" "${f##*:}" || true
1726                                 case "${f##*:}" in
1727                                         Xonotic/xonotic*.exe)
1728                                                 verbose "$d0/misc/tools/change-icon-of-exe.sh" "$d0/misc/logos/icons_ico/xonotic.ico" "${f##*:}"
1729                                                 ;;
1730                                 esac
1731                         done
1732                 fi
1733                 ;;
1734         release-compile)
1735                 suffix=$1
1736                 makeflags=$2
1737                 fteqcc_maketargets=$3
1738                 fteqcc_files=$4
1739                 darkplaces_maketargets=$5
1740                 darkplaces_files=$6
1741                 host=xonotic-build-$suffix
1742                 verbose "$SELF" release-compile-run "$host" /tmp/fteqcc.build."$suffix" "$fteqcc_maketargets" "$makeflags" "Xonotic/source/fteqcc" "$d0/misc/builddeps/dp.$suffix" "$fteqcc_files"
1743                 verbose "$SELF" release-compile-run "$host" /tmp/Darkplaces.build."$suffix" "$darkplaces_maketargets" "$makeflags" "Xonotic/source/darkplaces" "$d0/misc/builddeps/dp.$suffix" "$darkplaces_files"
1744                 ;;
1745         release-engine-win32)
1746                 verbose "$SELF" release-compile win32 \
1747                         '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' \
1748                         win 'fteqcc.exe:Xonotic/fteqcc/fteqcc.exe' \
1749                         '' ''
1750                 verbose "$SELF" release-compile win32 \
1751                         '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' \
1752                         '' '' \
1753                         release 'darkplaces.exe:Xonotic/xonotic.exe darkplaces-sdl.exe:Xonotic/xonotic-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-dedicated.exe'
1754                 ;;
1755         release-engine-win64)
1756                 verbose "$SELF" release-compile win64 \
1757                         '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' \
1758                         win 'fteqcc.exe:Xonotic/fteqcc/fteqcc-x64.exe' \
1759                         'sv-release sdl-release' 'darkplaces-sdl.exe:Xonotic/xonotic-x64-sdl.exe darkplaces-dedicated.exe:Xonotic/xonotic-x64-dedicated.exe'
1760                 verbose "$SELF" release-compile win64 \
1761                         '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' \
1762                         '' '' \
1763                         cl-release 'darkplaces.exe:Xonotic/xonotic-x64.exe'
1764                 ;;
1765         release-engine-osx)
1766                 # gcc on OSX is buggy, needs -fno-reorder-blocks for a release build to succeed
1767                 verbose "$SELF" release-compile osx \
1768                         '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"' \
1769                         all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.osx' \
1770                         'sv-release sdl-release' 'darkplaces-sdl:Xonotic/Xonotic.app/Contents/MacOS/xonotic-osx-sdl-bin darkplaces-dedicated:Xonotic/xonotic-osx-dedicated'
1771                 ;;
1772         release-engine-linux32)
1773                 verbose "$SELF" release-compile linux32 \
1774                         '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' \
1775                         all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.linux32' \
1776                         release 'darkplaces-glx:Xonotic/xonotic-linux32-glx darkplaces-sdl:Xonotic/xonotic-linux32-sdl darkplaces-dedicated:Xonotic/xonotic-linux32-dedicated'
1777                 ;;
1778         release-engine-linux64)
1779                 verbose "$SELF" release-compile linux64 \
1780                         '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' \
1781                         all 'fteqcc.bin:Xonotic/fteqcc/fteqcc.linux64' \
1782                         release 'darkplaces-glx:Xonotic/xonotic-linux64-glx darkplaces-sdl:Xonotic/xonotic-linux64-sdl darkplaces-dedicated:Xonotic/xonotic-linux64-dedicated'
1783                 ;;
1784         release-engine)
1785                 verbose "$SELF" release-engine-linux32 &
1786                 verbose "$SELF" release-engine-linux64 &
1787                 verbose "$SELF" release-engine-win32 &
1788                 verbose "$SELF" release-engine-win64 &
1789                 verbose "$SELF" release-engine-osx &
1790                 wait %1
1791                 wait %2
1792                 wait %3
1793                 wait %4
1794                 wait %5
1795                 wait
1796                 ;;
1797         release-maps)
1798                 verbose "$SELF" update-maps
1799                 ;;
1800         release-qc)
1801                 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
1802                 verbose rm -f Xonotic/source/qcsrc/*/fteqcc.log
1803                 ;;
1804         release-buildpk3-transform-raw)
1805                 dir=$1
1806                 ;;
1807         release-buildpk3-transform-normal)
1808                 dir=$1
1809                 verbose cd "$dir"
1810                 # texture: convert to jpeg and dds
1811                 verbose export do_jpeg=true
1812                 verbose export jpeg_qual_rgb=97
1813                 verbose export jpeg_qual_a=99
1814                 verbose export do_dds=false
1815                 verbose export do_ogg=true
1816                 verbose export ogg_ogg=false
1817                 verbose export del_src=true
1818                 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1819                 ;;
1820         release-buildpk3-transform-normaldds)
1821                 dir=$1
1822                 verbose cd "$dir"
1823                 # texture: convert to jpeg and dds
1824                 # music: reduce bitrate
1825                 verbose export do_jpeg=false
1826                 verbose export do_jpeg_if_not_dds=true
1827                 verbose export jpeg_qual_rgb=95
1828                 verbose export jpeg_qual_a=99
1829                 verbose export do_dds=true
1830                 verbose export dds_flags=
1831                 verbose export do_ogg=true
1832                 verbose export ogg_ogg=false
1833                 verbose export del_src=true
1834                 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1835                 ;;
1836         release-buildpk3-transform-low)
1837                 dir=$1
1838                 verbose cd "$dir"
1839                 # texture: convert to jpeg and dds
1840                 # music: reduce bitrate
1841                 verbose export do_jpeg=true
1842                 verbose export jpeg_qual_rgb=80
1843                 verbose export jpeg_qual_a=97
1844                 verbose export do_dds=false
1845                 verbose export do_ogg=true
1846                 verbose export ogg_qual=1
1847                 verbose export del_src=true
1848                 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1849                 ;;
1850         release-buildpk3-transform-lowdds)
1851                 dir=$1
1852                 verbose cd "$dir"
1853                 # texture: convert to jpeg and dds
1854                 # music: reduce bitrate
1855                 verbose export do_jpeg=false
1856                 verbose export do_jpeg_if_not_dds=true
1857                 verbose export jpeg_qual_rgb=80
1858                 verbose export jpeg_qual_a=99
1859                 verbose export do_dds=true
1860                 verbose export dds_flags=
1861                 verbose export do_ogg=true
1862                 verbose export ogg_qual=1
1863                 verbose export del_src=true
1864                 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1865                 ;;
1866         release-buildpk3-transform-mapping)
1867                 dir=$1
1868                 verbose cd "$dir"
1869                 # remove stuff radiant has no use for
1870                 verbose find . -name \*_norm.\* -exec rm -f {} \;
1871                 verbose find . -name \*_bump.\* -exec rm -f {} \;
1872                 verbose find . -name \*_glow.\* -exec rm -f {} \;
1873                 verbose find . -name \*_gloss.\* -exec rm -f {} \;
1874                 verbose find . -name \*_pants.\* -exec rm -f {} \;
1875                 verbose find . -name \*_shirt.\* -exec rm -f {} \;
1876                 verbose find . -name \*_reflect.\* -exec rm -f {} \;
1877                 verbose find . -not \( -name \*.tga -o -name \*.png -o -name \*.jpg \) -exec rm -f {} \;
1878                 # texture: convert to jpeg and dds
1879                 # music: reduce bitrate
1880                 verbose export do_jpeg=true
1881                 verbose export jpeg_qual_rgb=80
1882                 verbose export jpeg_qual_a=97
1883                 verbose export do_dds=false
1884                 verbose export do_ogg=true
1885                 verbose export ogg_qual=1
1886                 verbose export del_src=true
1887                 find . -type f -print0 | verbose xargs -0 "$d0"/misc/tools/cached-converter.sh
1888                 ;;
1889         release-buildpk3)
1890                 src=$1
1891                 dst=$2
1892                 transform=$3
1893                 case "$dst" in
1894                         /*)
1895                                 ;;
1896                         */)
1897                                 dst="$PWD/$dst"
1898                                 ;;
1899                 esac
1900                 release_timereport
1901                 verbose rm -rf Xonotic/temp
1902                 release_timereport "deleted temp directory"
1903                 verbose mkdir -p Xonotic/temp
1904                 release_git_extract_dir "$src" "Xonotic/temp" .
1905                 release_timereport "extracted data"
1906                 verbose cd Xonotic/temp
1907                 if [ x"$src" = x"data/xonotic-data.pk3dir" ]; then
1908                         verbose cp ../source/progs.dat .
1909                         verbose cp ../source/csprogs.dat .
1910                         verbose cp ../source/menu.dat .
1911                         verbose rm -rf qcsrc
1912                         gv=`grep "^gameversion " "defaultXonotic.cfg" | awk '{ print $2 }'`
1913                         major=$(($gv / 10000))
1914                         minor=$((($gv / 100) - ($major * 100)))
1915                         patch=$(($gv - ($major * 10000) - ($minor * 100)))
1916                         versionstr="$major.$minor.$patch"
1917                         case "$RELEASETYPE" in
1918                                 release)
1919                                         ;;
1920                                 *)
1921                                         versionstr="$versionstr$RELEASETYPE"
1922                                         ;;
1923                         esac
1924                         if [ $gv -lt 9900 ]; then
1925                                 # pre-1.0: compatible with any other pre-1.0
1926                                 verbose sed "
1927                                         s/^set g_xonoticversion [^ ]* /set g_xonoticversion $versionstr /;
1928                                         s/^gameversion_min [0-9]*/gameversion_min     0/;
1929                                         s/^gameversion_max [0-9]*/gameversion_max  9999/;
1930                                 " < defaultXonotic.cfg > defaultXonotic.cfg.new
1931                         else
1932                                 # >= 1.0
1933                                 verbose sed "
1934                                         s/^set g_xonoticversion [^ ]* /set g_xonoticversion $versionstr /;
1935                                         s/^gameversion_min [0-9]*/gameversion_min $(( ($gv / 100) * 100 - 100 ))/;
1936                                         s/^gameversion_max [0-9]*/gameversion_max $(( ($gv / 100) * 100 + 199 ))/;
1937                                 " < defaultXonotic.cfg > defaultXonotic.cfg.new
1938                         fi
1939                         mv defaultXonotic.cfg.new defaultXonotic.cfg
1940                         case "$RELEASETYPE" in
1941                                 release)
1942                                         echo "" >> defaultXonotic.cfg
1943                                         echo "// nicer menu" >> defaultXonotic.cfg
1944                                         echo "set menu_watermark \"\"" >> defaultXonotic.cfg
1945                                         ;;
1946                         esac
1947                         (
1948                                 verbose cd gfx/menu/luminos
1949                                 verbose rm -f background_l2.tga background_ingame_l2.tga
1950                                 verbose cp "$d0"/mediasource/gfx/menu/luminos_versionbuilder/background_l2.svg .
1951                                 verbose "$d0"/mediasource/gfx/menu/luminos_versionbuilder/versionbuilder "$versionstr"
1952                                 verbose rm background_l2.svg
1953                         )
1954                 fi
1955                 if [ x"$src" = x"data/xonotic-maps.pk3dir" ]; then
1956                         for X in ../../data/*-????????????????????????????????????????-????????????????????????????????????????.pk3; do
1957                                 if [ -f "$X" ]; then
1958                                         verbose unzip "$X"
1959                                         verbose rm -f maps/*.log maps/*.irc maps/*.lin
1960                                 fi
1961                         done
1962                 fi
1963                 verbose export git_src_repo="$d0/$src" # skip hash-object
1964                 release_timereport "processed data"
1965                 verbose "$SELF" release-buildpk3-transform-$transform "Xonotic/temp"
1966                 release_timereport "transformed data"
1967                 find . -type f -size +4k | verbose "$d0"/misc/tools/symlink-deduplicate.sh
1968                 release_timereport "deduplicated data"
1969                 verbose mkzipr "../../$dst" *
1970                 release_timereport "zipped data"
1971                 verbose cd ../..
1972                 verbose rm -rf Xonotic/temp
1973                 release_timereport "deleted temp directory again"
1974                 ;;
1975         release-buildpk3s)
1976                 stamp=`cat Xonotic/stamp.txt`
1977                 src=$1
1978                 shift
1979                 dst=${src%.pk3dir}
1980                 case "$dst" in
1981                         data/xonotic-*)
1982                                 dst="data/xonotic-$stamp-${dst#data/xonotic-}"
1983                                 ;;
1984                         *)
1985                                 dst="$dst-$stamp"
1986                                 ;;
1987                 esac
1988                 while [ "$#" -gt 1 ]; do
1989                         verbose "$SELF" release-buildpk3 "$src" "Xonotic/$dst$2.pk3" "$1"
1990                         shift
1991                         shift
1992                 done
1993                 ;;
1994         release-pack)
1995                 verbose "$SELF" release-buildpk3s data/font-nimbussansl.pk3dir                  raw ''
1996                 verbose "$SELF" release-buildpk3s data/font-xolonium.pk3dir                     raw ''
1997                 verbose "$SELF" release-buildpk3s data/xonotic-data.pk3dir       normal '-high'        low '-low' normaldds ''
1998                 verbose "$SELF" release-buildpk3s data/xonotic-maps.pk3dir       normal '-high'        low '-low' normaldds '' mapping '-mapping'
1999                 verbose "$SELF" release-buildpk3s data/xonotic-music.pk3dir                     raw '' low '-low'
2000                 verbose "$SELF" release-buildpk3s data/xonotic-nexcompat.pk3dir  normal '-high'                   normaldds ''
2001                 ;;
2002         release-pack-needsx11)
2003                 case "$DISPLAY" in
2004                         '')
2005                                 verbose startx "$SELF" release-pack -- /usr/bin/Xvfb :7
2006                                 ;;
2007                         *)
2008                                 verbose "$SELF" release-pack
2009                                 ;;
2010                 esac
2011                 ;;
2012         release-zip)
2013                 stamp=`cat Xonotic/stamp.txt`
2014                 # exe and dll files do not need +x, so this makes them eligible for 7zip compression too
2015                 chmod a-x Xonotic/*.exe Xonotic/*.dll || true
2016                 # let's pass crypto import laws of some nasty countries
2017                 crypto_libs=`find Xonotic -name \*d0_rijndael\*.so -o -name \*d0_rijndael\*.dylib -o -name \*d0_rijndael\*.dll -o -name \*d0_rijndael\*.c`
2018                 if [ -n "$crypto_libs" ]; then
2019                         verbose mkzip Xonotic-$stamp-crypto.zip \
2020                                 $crypto_libs \
2021                                 Xonotic/COPYING Xonotic/GPL-2 Xonotic/GPL-3
2022                         rm -f $crypto_libs
2023                 fi
2024                 # build the archives
2025                 verbose mkzip Xonotic-$stamp-enginesource.zip \
2026                         Xonotic/source/darkplaces/ \
2027                         Xonotic/COPYING Xonotic/GPL-2 Xonotic/GPL-3
2028                 verbose cp Xonotic-$stamp-enginesource.zip Xonotic-$stamp-engine.zip
2029                 verbose mkzip Xonotic-$stamp-engine.zip \
2030                         Xonotic/*.dll \
2031                         Xonotic/bin32/*.dll \
2032                         Xonotic/bin64/*.dll \
2033                         Xonotic/*.app \
2034                         Xonotic/xonotic-* \
2035                         Xonotic/xonotic.exe
2036                 verbose cp Xonotic-$stamp-engine.zip Xonotic-$stamp-common.zip
2037                 verbose mkzip Xonotic-$stamp-common.zip \
2038                         Xonotic/source/fteqcc/ \
2039                         Xonotic/source/qcsrc/ \
2040                         Xonotic/Docs \
2041                         Xonotic/misc \
2042                         Xonotic/fteqcc \
2043                         Xonotic/server \
2044                         Xonotic/key_0.d0pk \
2045                         Xonotic/data/font-nimbussansl-$stamp.pk3 \
2046                         Xonotic/data/font-xolonium-$stamp.pk3
2047                 verbose cp Xonotic-$stamp-enginesource.zip Xonotic-$stamp-source.zip
2048                 verbose mkzip Xonotic-$stamp-source.zip \
2049                         Xonotic/source/fteqcc/ \
2050                         Xonotic/source/qcsrc/ \
2051                         Xonotic/misc/logos
2052                 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp.zip
2053                 verbose mkzip0 Xonotic-$stamp.zip \
2054                         Xonotic/data/xonotic-$stamp-data.pk3 \
2055                         Xonotic/data/xonotic-$stamp-maps.pk3 \
2056                         Xonotic/data/xonotic-$stamp-music.pk3 \
2057                         Xonotic/data/xonotic-$stamp-nexcompat.pk3
2058                 verbose cp Xonotic-$stamp-common.zip Xonotic-$stamp-low.zip
2059                 verbose mkzip0 Xonotic-$stamp-low.zip \
2060                         Xonotic/data/xonotic-$stamp-data-low.pk3 \
2061                         Xonotic/data/xonotic-$stamp-maps-low.pk3 \
2062                         Xonotic/data/xonotic-$stamp-music-low.pk3
2063                 verbose mv Xonotic-$stamp-common.zip Xonotic-$stamp-high.zip
2064                 verbose mkzip Xonotic-$stamp-high.zip \
2065                         Xonotic/mapping
2066                 verbose mkzip0 Xonotic-$stamp-high.zip \
2067                         Xonotic/data/xonotic-$stamp-data-high.pk3 \
2068                         Xonotic/data/xonotic-$stamp-maps-high.pk3 \
2069                         Xonotic/data/xonotic-$stamp-music.pk3 \
2070                         Xonotic/data/xonotic-$stamp-nexcompat-high.pk3
2071                 verbose mkzip Xonotic-$stamp-mappingsupport.zip \
2072                         Xonotic/mapping
2073                 verbose mkzip0 Xonotic-$stamp-mappingsupport.zip \
2074                         Xonotic/data/xonotic-$stamp-maps-mapping.pk3
2075                 ;;
2076         release)
2077                 verbose "$SELF" release-prepare
2078                 verbose "$SELF" release-maps
2079                 verbose "$SELF" release-engine
2080                 verbose "$SELF" release-qc
2081                 verbose "$SELF" release-pack-needsx11
2082                 verbose "$SELF" release-zip
2083                 ;;
2084
2085         *)
2086                 $ECHO "Usage:"
2087                 $ECHO "  $SELF admin-merge [<branch>]"
2088                 $ECHO "  $SELF branch <branch>"
2089                 $ECHO "  $SELF branch <remote> <branch> [<srcbranch>]"
2090                 $ECHO "  $SELF branches"
2091                 $ECHO "  $SELF checkout|switch <branch>"
2092                 $ECHO "  $SELF checkout|switch <remote>/<branch>"
2093                 $ECHO "  $SELF clean [-m] [-f | -fu | -fU] [-r] [-D]"
2094                 $ECHO "  $SELF clean --reclone"
2095                 $ECHO "  $SELF compile [-c] [-r|-p] [-0] [sdl|glx|wgl|agl|dedicated]"
2096                 $ECHO "  $SELF each|foreach [-k] command..."
2097                 $ECHO "  $SELF fix_upstream_rebase"
2098                 $ECHO "  $SELF keygen"
2099                 $ECHO "  $SELF merge"
2100                 $ECHO "  $SELF push|commit [-s]"
2101                 $ECHO "  $SELF restore-patches"
2102                 $ECHO "  $SELF run [sdl|glx|wgl|agl|dedicated] options..."
2103                 $ECHO "  $SELF save-patches"
2104                 $ECHO "  $SELF update-maps"
2105                 $ECHO "  $SELF update|pull [-N] [-s | -h [-p] | -g [-p]] [-l de|nl|default]"
2106                 ;;
2107 esac