envsetup: cmremote,cmgerrit,cmrebase,mka,reposync
Add the cm specific functions (cmremote, cmgerrit, cmrebase,
mka, reposync) that are present in the gingerbread branch
Change-Id: If28a5a206b8bb9ead5242c60f6c1e6af27141b57
diff --git a/envsetup.sh b/envsetup.sh
index dba64ee..d126ebc 100644
--- a/envsetup.sh
+++ b/envsetup.sh
@@ -18,6 +18,11 @@
- sepgrep: Greps on all local sepolicy files.
- sgrep: Greps on all local source files.
- godir: Go to the directory containing a file.
+- cmremote: Add git remote for CM Gerrit Review
+- cmgerrit: A Git wrapper that fetches/pushes patch from/to CM Gerrit Review
+- cmrebase: Rebase a Gerrit change and push it again
+- mka: Builds using SCHED_BATCH on all processors
+- reposync: Parallel repo sync using ionice and SCHED_BATCH
Environemnt options:
- SANITIZE_HOST: Set to 'true' to use ASAN for all host modules. Note that
@@ -1393,7 +1398,325 @@
\cd $T/$pathname
}
-# Force JAVA_HOME to point to java 1.7 if it isn't already set.
+function cmremote()
+{
+ git remote rm cmremote 2> /dev/null
+ if [ ! -d .git ]
+ then
+ echo .git directory not found. Please run this from the root directory of the Android repository you wish to set up.
+ fi
+ GERRIT_REMOTE=$(cat .git/config | grep git://github.com | awk '{ print $NF }' | sed s#git://github.com/##g)
+ if [ -z "$GERRIT_REMOTE" ]
+ then
+ echo Unable to set up the git remote, are you in the root of the repo?
+ return 0
+ fi
+ CMUSER=`git config --get review.review.cyanogenmod.com.username`
+ if [ -z "$CMUSER" ]
+ then
+ git remote add cmremote ssh://review.cyanogenmod.com:29418/$GERRIT_REMOTE
+ else
+ git remote add cmremote ssh://$CMUSER@review.cyanogenmod.com:29418/$GERRIT_REMOTE
+ fi
+ echo You can now push to "cmremote".
+}
+
+function cmgerrit() {
+ if [ $# -eq 0 ]; then
+ $FUNCNAME help
+ return 1
+ fi
+ local user=`git config --get review.review.cyanogenmod.com.username`
+ local review=`git config --get remote.github.review`
+ local project=`git config --get remote.github.projectname`
+ local command=$1
+ shift
+ case $command in
+ help)
+ if [ $# -eq 0 ]; then
+ cat <<EOF
+Usage:
+ $FUNCNAME COMMAND [OPTIONS] [CHANGE-ID[/PATCH-SET]][{@|^|~|:}ARG] [-- ARGS]
+
+Commands:
+ fetch Just fetch the change as FETCH_HEAD
+ help Show this help, or for a specific command
+ pull Pull a change into current branch
+ push Push HEAD or a local branch to Gerrit for a specific branch
+
+Any other Git commands that support refname would work as:
+ git fetch URL CHANGE && git COMMAND OPTIONS FETCH_HEAD{@|^|~|:}ARG -- ARGS
+
+See '$FUNCNAME help COMMAND' for more information on a specific command.
+
+Example:
+ $FUNCNAME checkout -b topic 1234/5
+works as:
+ git fetch http://DOMAIN/p/PROJECT refs/changes/34/1234/5 \\
+ && git checkout -b topic FETCH_HEAD
+will checkout a new branch 'topic' base on patch-set 5 of change 1234.
+Patch-set 1 will be fetched if omitted.
+EOF
+ return
+ fi
+ case $1 in
+ __cmg_*) echo "For internal use only." ;;
+ changes|for)
+ if [ "$FUNCNAME" = "cmgerrit" ]; then
+ echo "'$FUNCNAME $1' is deprecated."
+ fi
+ ;;
+ help) $FUNCNAME help ;;
+ fetch|pull) cat <<EOF
+usage: $FUNCNAME $1 [OPTIONS] CHANGE-ID[/PATCH-SET]
+
+works as:
+ git $1 OPTIONS http://DOMAIN/p/PROJECT \\
+ refs/changes/HASH/CHANGE-ID/{PATCH-SET|1}
+
+Example:
+ $FUNCNAME $1 1234
+will $1 patch-set 1 of change 1234
+EOF
+ ;;
+ push) cat <<EOF
+usage: $FUNCNAME push [OPTIONS] [LOCAL_BRANCH:]REMOTE_BRANCH
+
+works as:
+ git push OPTIONS ssh://USER@DOMAIN:29418/PROJECT \\
+ {LOCAL_BRANCH|HEAD}:refs/for/REMOTE_BRANCH
+
+Example:
+ $FUNCNAME push fix6789:gingerbread
+will push local branch 'fix6789' to Gerrit for branch 'gingerbread'.
+HEAD will be pushed from local if omitted.
+EOF
+ ;;
+ *)
+ $FUNCNAME __cmg_err_not_supported $1 && return
+ cat <<EOF
+usage: $FUNCNAME $1 [OPTIONS] CHANGE-ID[/PATCH-SET][{@|^|~|:}ARG] [-- ARGS]
+
+works as:
+ git fetch http://DOMAIN/p/PROJECT \\
+ refs/changes/HASH/CHANGE-ID/{PATCH-SET|1} \\
+ && git $1 OPTIONS FETCH_HEAD{@|^|~|:}ARG -- ARGS
+EOF
+ ;;
+ esac
+ ;;
+ __cmg_get_ref)
+ $FUNCNAME __cmg_err_no_arg $command $# && return 1
+ local change_id patchset_id hash
+ case $1 in
+ */*)
+ change_id=${1%%/*}
+ patchset_id=${1#*/}
+ ;;
+ *)
+ change_id=$1
+ patchset_id=1
+ ;;
+ esac
+ hash=$(($change_id % 100))
+ case $hash in
+ [0-9]) hash="0$hash" ;;
+ esac
+ echo "refs/changes/$hash/$change_id/$patchset_id"
+ ;;
+ fetch|pull)
+ $FUNCNAME __cmg_err_no_arg $command $# help && return 1
+ $FUNCNAME __cmg_err_not_repo && return 1
+ local change=$1
+ shift
+ git $command $@ http://$review/p/$project \
+ $($FUNCNAME __cmg_get_ref $change) || return 1
+ ;;
+ push)
+ $FUNCNAME __cmg_err_no_arg $command $# help && return 1
+ $FUNCNAME __cmg_err_not_repo && return 1
+ if [ -z "$user" ]; then
+ echo >&2 "Gerrit username not found."
+ return 1
+ fi
+ local local_branch remote_branch
+ case $1 in
+ *:*)
+ local_branch=${1%:*}
+ remote_branch=${1##*:}
+ ;;
+ *)
+ local_branch=HEAD
+ remote_branch=$1
+ ;;
+ esac
+ shift
+ git push $@ ssh://$user@$review:29418/$project \
+ $local_branch:refs/for/$remote_branch || return 1
+ ;;
+ changes|for)
+ if [ "$FUNCNAME" = "cmgerrit" ]; then
+ echo >&2 "'$FUNCNAME $command' is deprecated."
+ fi
+ ;;
+ __cmg_err_no_arg)
+ if [ $# -lt 2 ]; then
+ echo >&2 "'$FUNCNAME $command' missing argument."
+ elif [ $2 -eq 0 ]; then
+ if [ -n "$3" ]; then
+ $FUNCNAME help $1
+ else
+ echo >&2 "'$FUNCNAME $1' missing argument."
+ fi
+ else
+ return 1
+ fi
+ ;;
+ __cmg_err_not_repo)
+ if [ -z "$review" -o -z "$project" ]; then
+ echo >&2 "Not currently in any reviewable repository."
+ else
+ return 1
+ fi
+ ;;
+ __cmg_err_not_supported)
+ $FUNCNAME __cmg_err_no_arg $command $# && return
+ case $1 in
+ #TODO: filter more git commands that don't use refname
+ init|add|rm|mv|status|clone|remote|bisect|config|stash)
+ echo >&2 "'$FUNCNAME $1' is not supported."
+ ;;
+ *) return 1 ;;
+ esac
+ ;;
+ #TODO: other special cases?
+ *)
+ $FUNCNAME __cmg_err_not_supported $command && return 1
+ $FUNCNAME __cmg_err_no_arg $command $# help && return 1
+ $FUNCNAME __cmg_err_not_repo && return 1
+ local args="$@"
+ local change pre_args refs_arg post_args
+ case "$args" in
+ *--\ *)
+ pre_args=${args%%-- *}
+ post_args="-- ${args#*-- }"
+ ;;
+ *) pre_args="$args" ;;
+ esac
+ args=($pre_args)
+ pre_args=
+ if [ ${#args[@]} -gt 0 ]; then
+ change=${args[${#args[@]}-1]}
+ fi
+ if [ ${#args[@]} -gt 1 ]; then
+ pre_args=${args[0]}
+ for ((i=1; i<${#args[@]}-1; i++)); do
+ pre_args="$pre_args ${args[$i]}"
+ done
+ fi
+ while ((1)); do
+ case $change in
+ ""|--)
+ $FUNCNAME help $command
+ return 1
+ ;;
+ *@*)
+ if [ -z "$refs_arg" ]; then
+ refs_arg="@${change#*@}"
+ change=${change%%@*}
+ fi
+ ;;
+ *~*)
+ if [ -z "$refs_arg" ]; then
+ refs_arg="~${change#*~}"
+ change=${change%%~*}
+ fi
+ ;;
+ *^*)
+ if [ -z "$refs_arg" ]; then
+ refs_arg="^${change#*^}"
+ change=${change%%^*}
+ fi
+ ;;
+ *:*)
+ if [ -z "$refs_arg" ]; then
+ refs_arg=":${change#*:}"
+ change=${change%%:*}
+ fi
+ ;;
+ *) break ;;
+ esac
+ done
+ $FUNCNAME fetch $change \
+ && git $command $pre_args FETCH_HEAD$refs_arg $post_args \
+ || return 1
+ ;;
+ esac
+}
+
+function cmrebase() {
+ local repo=$1
+ local refs=$2
+ local pwd="$(pwd)"
+ local dir="$(gettop)/$repo"
+
+ if [ -z $repo ] || [ -z $refs ]; then
+ echo "CyanogenMod Gerrit Rebase Usage: "
+ echo " cmrebase <path to project> <patch IDs on Gerrit>"
+ echo " The patch IDs appear on the Gerrit commands that are offered."
+ echo " They consist on a series of numbers and slashes, after the text"
+ echo " refs/changes. For example, the ID in the following command is 26/8126/2"
+ echo ""
+ echo " git[...]ges_apps_Camera refs/changes/26/8126/2 && git cherry-pick FETCH_HEAD"
+ echo ""
+ return
+ fi
+
+ if [ ! -d $dir ]; then
+ echo "Directory $dir doesn't exist in tree."
+ return
+ fi
+ cd $dir
+ repo=$(cat .git/config | grep git://github.com | awk '{ print $NF }' | sed s#git://github.com/##g)
+ echo "Starting branch..."
+ repo start tmprebase .
+ echo "Bringing it up to date..."
+ repo sync .
+ echo "Fetching change..."
+ git fetch "http://review.cyanogenmod.com/p/$repo" "refs/changes/$refs" && git cherry-pick FETCH_HEAD
+ if [ "$?" != "0" ]; then
+ echo "Error cherry-picking. Not uploading!"
+ return
+ fi
+ echo "Uploading..."
+ repo upload .
+ echo "Cleaning up..."
+ repo abandon tmprebase .
+ cd $pwd
+}
+
+function mka() {
+ case `uname -s` in
+ Darwin)
+ make -j `sysctl hw.ncpu|cut -d" " -f2` "$@"
+ ;;
+ *)
+ schedtool -B -n 1 -e ionice -n 1 make -j `cat /proc/cpuinfo | grep "^processor" | wc -l` "$@"
+ ;;
+ esac
+}
+
+function reposync() {
+ case `uname -s` in
+ Darwin)
+ repo sync -j 4 "$@"
+ ;;
+ *)
+ schedtool -B -n 1 -e ionice -n 1 repo sync -j 4 "$@"
+ ;;
+ esac
+}
+# Force JAVA_HOME to point to java 1.7 or java 1.6 if it isn't already set.
#
# Note that the MacOS path for java 1.7 includes a minor revision number (sigh).
# For some reason, installing the JDK doesn't make it show up in the