#!/bin/sh
+# vim: filetype=zsh
set -e
# Windows hates users. So this script has to copy itself elsewhere first...
tname=
cp "$SELF" ../all.xonotic.sh
+ export WE_HATE_OUR_USERS=1
exec ../all.xonotic.sh "$@"
;;
esac
}
repos_urls="
- .
- data/xonotic-data.pk3dir
- data/xonotic-maps.pk3dir
- data/xonotic-music.pk3dir
- data/xonotic-nexcompat.pk3dir
- darkplaces
- fteqcc@git://github.com/Blub/qclib.git
- div0-gittools@git://git.icculus.org/divverent/div0-gittools.git
- netradiant
+. | | master
+data/xonotic-data.pk3dir | | master
+data/xonotic-maps.pk3dir | | master
+data/xonotic-music.pk3dir | | master
+data/xonotic-nexcompat.pk3dir | | master
+darkplaces | | div0-stable
+fteqcc | git://github.com/Blub/qclib.git | master
+div0-gittools | git://git.icculus.org/divverent/div0-gittools.git | master
+netradiant | | master
"
+# todo: in darkplaces, change repobranch to div0-stable
-repos=`for X in $repos_urls; do echo "${X%%@*}"; done`
+repos=`echo "$repos_urls" | grep . | cut -d '|' -f 1 | tr -d ' '`
+
+base=`git config remote.origin.url`
+base=${base%xonotic.git}
+
+repourl()
+{
+ t=`echo "$repos_urls" | grep "^$1 " | cut -d '|' -f 2 | tr -d ' '`
+ if [ -n "$t" ]; then
+ echo "$t"
+ else
+ if [ x"$1" = x"." ]; then
+ echo "$base""xonotic.git"
+ else
+ echo "$base${1##*/}.git"
+ fi
+ fi
+}
+
+repobranch()
+{
+ t=`echo "$repos_urls" | grep "^$1 " | cut -d '|' -f 3 | tr -d ' '`
+ if [ -n "$t" ]; then
+ echo "$t"
+ else
+ echo "master"
+ fi
+}
+
+repos=`for d in $repos; do
+ p="${d%dir}"
+ if [ x"$p" = x"$d" ] || [ -d "$d" ] || ! [ -f "$p" ]; then
+ echo "$d"
+ fi
+done`
if [ "$#" = 0 ]; then
set -- help
case "$cmd" in
update|pull)
- base=`git config remote.origin.url`
- base=${base%xonotic.git}
- for dcomplete in $repos_urls; do
- case "$dcomplete" in
- *@*)
- d=${dcomplete%%@*}
- url=${dcomplete#*@}
- switch=false
- ;;
- *)
- d=${dcomplete%%@*}
- url=$base${d##*/}.git
- switch=true
- ;;
- esac
+ for d in $repos; do
+ url=`repourl "$d"`
+ branch=`repobranch "$d"`
if [ -d "$d0/$d" ]; then
enter "$d0/$d" verbose
- case "$d" in
- .)
- ;;
- *)
- if $switch; then
- verbose git config remote.origin.url "$url"
- fi
- ;;
- esac
+ verbose git config remote.origin.url "$url"
verbose git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
# TODO remove this line later
+ verbose git config core.autocrlf false
+ verbose git config core.safecrlf false # we don't NEED that...
+
r=`git symbolic-ref HEAD`
r=${r#refs/heads/}
if git config branch.$r.remote >/dev/null 2>&1; then
if ! verbose git pull; then
check_mergeconflict "$d"
- exit 1 # FATAL
+ echo "Pulling failed. Press ENTER to continue, or Ctrl-C to abort."
+ read -r DUMMY
fi
fi
cd "$d0"
else
verbose git clone "$url" "$d0/$d"
+ enter "$d0/$d" verbose
+ verbose git checkout "$branch"
+ cd "$d0"
fi
done
;;
exists=true
verbose git checkout --track -b "$branch" "$remote/$branch"
else
- verbose git checkout master
+ verbose git checkout "`repobranch "$d"`"
fi
cd "$d00"
checkself "$cmd" "$@"
branch=$remote
remote=origin
fi
- if [ -z "$srcbranch" ]; then
- srcbranch=master
- fi
if [ -z "$branch" ]; then
for d in $repos; do
enter "$d0/$d"
dv=`visible_repo_name "$d"`
enter "$d0/$d" verbose
a=
- while [ x"$a" != x"y" -a x"$a" != x"n" ]; do
- echo "Branch in $dv?"
- read -r a
- done
- if [ x"$a" = x"y" ]; then
- verbose git push "$remote" "$srcbranch":"$branch"
- verbose git checkout --track -b "$branch" "$remote/$branch"
+ if git rev-parse "refs/heads/$branch" >/dev/null 2>&1; then
+ echo "Already having this branch in $dv."
+ else
+ while [ x"$a" != x"y" -a x"$a" != x"n" ]; do
+ echo "Branch in $dv?"
+ read -r a
+ done
+ if [ x"$a" = x"y" ]; then
+ if [ -n "$srcbranch" ]; then
+ b=$srcbranch
+ else
+ b="`repobranch "$d"`"
+ fi
+ # TODO do this without pushing
+ verbose git push "$remote" "$b":"$branch"
+ verbose git checkout --track -b "$branch" "$remote/$branch"
+ fi
fi
cd "$d0"
done
done
done
;;
+ branches_short)
+ for d in $repos; do
+ cd "$d0/$d" # am in a pipe, shouldn't use enter
+ git branch -a -v -v | cut -c 3- | sed "s,^,$d ,"
+ cd "$d0"
+ done | {
+ branches_list=
+ # branches_repos_*=
+ while read -r d BRANCH REV UPSTREAM TEXT; do
+ case "$UPSTREAM" in
+ \[*)
+ UPSTREAM=${UPSTREAM#\[}
+ UPSTREAM=${UPSTREAM%\]}
+ UPSTREAM=${UPSTREAM%:*}
+ ;;
+ *)
+ TEXT="$UPSTREAM $TEXT"
+ UPSTREAM=
+ ;;
+ esac
+ if [ x"$REV" = x"->" ]; then
+ continue
+ fi
+ BRANCH=${BRANCH#remotes/}
+ ID=`echo "$BRANCH" | tr -c "A-Za-z0-9." "_"`
+ branches_list="$branches_list $BRANCH" # TEH SORT MAKEZ IT UNIEQ
+ eval "r=\$branches_repos_$ID"
+ r="$r $d:$UPSTREAM"
+ eval "branches_repos_$ID=\$r"
+ done
+ echo -n "$branches_list" | xargs -n 1 echo | sort -u | while IFS= read -r BRANCH; do
+ ID=`echo "$BRANCH" | tr -c "A-Za-z0-9." "_"`
+ eval "r=\$branches_repos_$ID"
+ echo "$BRANCH: $r"
+ done
+ }
+ ;;
merge)
for d in $repos; do
dv=`visible_repo_name "$d"`
enter "$d0/$d" verbose
r=`git symbolic-ref HEAD`
r=${r#refs/heads/}
- if git log HEAD..origin/master | grep .; then
+ if git log HEAD..origin/"`repobranch "$d"`" | grep .; then
# we have uncommitted changes
a=
while [ x"$a" != x"y" -a x"$a" != x"n" ]; do
- echo "Could merge from \"master\" into \"$r\" in $dv. Do it?"
+ echo "Could merge from \"`repobranch "$d"`\" into \"$r\" in $dv. Do it?"
read -r a
done
if [ x"$a" = x"y" ]; then
- if ! verbose git merge origin/master; then
+ if ! verbose git merge origin/"`repobranch "$d"`"; then
check_mergeconflict "$d"
exit 1 # this should ALWAYS be fatal
fi
done
;;
push|commit)
+ submit=$1
for d in $repos; do
dv=`visible_repo_name "$d"`
enter "$d0/$d" verbose
verbose git commit -a
fi
fi
- if git log "origin/$r".."$r" | grep .; then
+ rem=`git config "branch.$r.remote" || echo origin`
+ if { git log "$rem/$r".."$r" || git log origin/"`repobranch "$d"`".."$r"; } | grep .; then
a=
while [ x"$a" != x"y" -a x"$a" != x"n" ]; do
echo "Push \"$r\" in $dv?"
read -r a
done
if [ x"$a" = x"y" ]; then
- verbose git push `git config "branch.$r.remote" || echo origin` HEAD
+ verbose git push "$rem" HEAD
fi
fi
+ if [ x"$submit" = x"-s" ]; then
+ case "$r" in
+ */*)
+ verbose git push "$rem" HEAD:"${r%%/*}/finished/${r#*/}"
+ ;;
+ esac
+ fi
cd "$d0"
done
;;
compile)
+ if [ -n "$WE_HATE_OUR_USERS" ]; then
+ TARGETS="sv-debug cl-debug"
+ else
+ TARGETS="sv-debug cl-debug sdl-debug"
+ fi
+ case "$1" in
+ -c)
+ clean=true
+ shift
+ ;;
+ *)
+ clean=false
+ ;;
+ esac
+ case "$1" in
+ sdl)
+ TARGETS="sdl-debug"
+ shift
+ ;;
+ glx|agl|wgl)
+ TARGETS="cl-debug"
+ shift
+ ;;
+ dedicated)
+ TARGETS="sv-debug"
+ shift
+ ;;
+ esac
if [ -z "$MAKEFLAGS" ]; then
if [ -f /proc/cpuinfo ]; then
ncpus=$((`grep -c '^processor :' /proc/cpuinfo`+0))
MAKEFLAGS=-j$ncpus
fi
fi
+ case "`uname`" in
+ Linux|*BSD)
+ MAKEFLAGS="$MAKEFLAGS DP_LINK_TO_LIBJPEG=1"
+ ;;
+ esac
fi
enter "$d0/fteqcc" verbose
+ if $clean; then
+ verbose make $MAKEFLAGS clean
+ fi
verbose make $MAKEFLAGS
enter "$d0/data/xonotic-data.pk3dir" verbose
- verbose make FTEQCC="$d0/fteqcc/fteqcc.bin" $MAKEFLAGS
+ if $clean; then
+ verbose make $MAKEFLAGS clean
+ fi
+ verbose make FTEQCC="$d0/fteqcc/fteqcc.bin" "$@" $MAKEFLAGS
enter "$d0/darkplaces" verbose
- verbose make $MAKEFLAGS sv-debug
- verbose make $MAKEFLAGS cl-debug
- verbose make $MAKEFLAGS sdl-debug
+ if $clean; then
+ verbose make $MAKEFLAGS clean
+ fi
+ for T in $TARGETS; do
+ verbose make $MAKEFLAGS "$@" "$T"
+ done
;;
run)
- client=-sdl
+ if [ -n "$WE_HATE_OUR_USERS" ]; then
+ client=
+ export PATH="$d0/misc/buildfiles/w32:$PATH"
+ elif [ x"`uname`" = x"Darwin" ]; then
+ export DYLD_LIBRARY_PATH="$d0/misc/buildfiles/osx/Nexuiz.app/Contents/MacOS"
+ client=-sdl
+ else
+ client=-sdl
+ fi
case "$1" in
sdl|glx|agl|dedicated)
client=-$1
exit 1
fi
fi
- #verbose "darkplaces/darkplaces$client" -xonotic "$@"
- verbose "darkplaces/darkplaces$client" -nexuiz -customgamename Xonotic -customgamedirname1 data -customgamedirname2 "" -customgamescreenshotname xonotic -customgameuserdirname xonotic "$@"
+ set -- "darkplaces/darkplaces$client" -nexuiz -customgamename Xonotic -customgamedirname1 data -customgamedirname2 "" -customgamescreenshotname xonotic -customgameuserdirname xonotic "$@"
+ if [ -n "$USE_GDB" ]; then
+ set -- gdb --args "$@"
+ fi
+ "$@"
;;
each|foreach)
for d in $repos; do
TRACK=true
;;
*)
- UPSTREAM=origin/master
+ UPSTREAM=origin/"`repobranch "$d"`"
TRACK=false
;;
esac
done
rm -rf "$patchdir"
;;
+ admin-merge)
+ if [ "$#" = 1 ]; then
+ set -- "${1%%/*}" "${1#*/}"
+ fi
+ for d in $repos; do
+ enter "$d0/$d" verbose
+ git rev-parse "$1/$2" || continue
+ # 1. review
+ {
+ git log HEAD.."$1/$2"
+ git diff HEAD..."$1/$2"
+ } | less
+ a=
+ while [ x"$a" != x"y" -a x"$a" != x"n" ]; do
+ echo "Merge \"$1/$2\" into `git symbolic-ref HEAD` of $d?"
+ read -r a
+ done
+ if [ x"$a" = x"y" ]; then
+ git merge "$1/$2"
+ cd "$d0"
+ a=
+ if ! "$SELF" compile; then
+ a=n
+ fi
+ cd "$d0/$d"
+ while [ x"$a" != x"y" -a x"$a" != x"n" ]; do
+ echo "Still merge \"$1/$2\" into `git symbolic-ref HEAD` of $d? Maybe you want to test first."
+ read -r a
+ done
+ if [ x"$a" = x"y" ]; then
+ git push origin HEAD
+ git push "$1" :"$2"
+ else
+ git reset --hard HEAD@{1}
+ fi
+ fi
+ done
+ ;;
*)
echo "Usage:"
echo " $SELF pull"
echo " $SELF merge"
- echo " $SELF push"
+ echo " $SELF push [-s]"
echo " $SELF branches"
echo " $SELF branch [<remote>] <branchname>"
echo " $SELF branch <remote> <branchname> <srcbranchname>"
echo " $SELF checkout [<remote>] <branchname>"
- echo " $SELF compile"
- echo " $SELF run <client> <options>"
+ echo " $SELF compile [-c] [<client>] <options>"
+ echo " $SELF run [<client>] <options>"
echo " $SELF each <command>"
;;
esac