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