]> git.wh0rd.org - home.git/blobdiff - .bin/r
cvs-import: modernize a bit
[home.git] / .bin / r
diff --git a/.bin/r b/.bin/r
index 7d4fc61ba03743c8acadbbe31f183cb352d091a7..31377ef2866dded8d9445aff59aa04c96c4df276 100755 (executable)
--- a/.bin/r
+++ b/.bin/r
@@ -56,6 +56,33 @@ repo_root() {
        echo "${root}"
 }
 
+process_reviewers() {
+       local r arr=()
+       for r in ${*//,/ } ; do
+               case ${r} in
+               *OWNERS)
+                       local owners=$(
+                               awk -F'@' '
+                                       ($2 == "chromium.org" || $2 == "google.com") {list = list "," $1}
+                                       END {print substr(list, 2)}
+                               ' "${r}"
+                       )
+                       if [[ -z ${owners} ]] ; then
+                               err "cannot find OWNERS list"
+                       else
+                               echo "Auto setting reviewers to: ${owners}"
+                       fi
+                       arr+=( ${owners} )
+                       ;;
+               *)
+                       arr+=( "${r}" )
+                       ;;
+               esac
+       done
+       reviewers=$(printf '%s,' "${arr[@]}")
+       reviewers=${reviewers%,}
+}
+
 case ${acmd:-${cmd}} in
 rebase)
        if [[ $1 == "all" ]] ; then
@@ -143,7 +170,15 @@ clean)
        mj_finish
        exit
        ;;
-sb-push)
+sb)
+       sb_cmd=$1
+       case ${sb_cmd} in
+       pull) ;;
+       push) ;;
+       f|fetch) sb_cmd="fetch" ;;
+       *) err "unknown sandbox command: $1"
+       esac
+
        sync_branch="v"
 
        root=$(repo_root)
@@ -172,8 +207,17 @@ sb-push)
                printf '### (%*i/%i %3i%%) %s\n' \
                        ${#tcnt} $((cnt++)) ${tcnt} $(( cnt * 100 / tcnt )) ${proj}
                src="${sync_branch}"
-               g l -1 ${src} >& /dev/null || src=
-               mj_child g push --force ${remote}/${proj} ${src}:refs/sandbox/${USER}/${sync_branch} >/dev/null
+               case ${sb_cmd} in
+               push)
+                       g l -1 ${src} >& /dev/null || src=
+                       mj_child g push --force ${remote}/${proj} ${src}:refs/sandbox/${USER}/${sync_branch} >/dev/null
+                       ;;
+               pull)
+                       ;;
+               fetch)
+                       mj_child g fetch ${remote}/${proj} refs/sandbox/${USER}/${sync_branch}:refs/remotes/sb/${sync_branch} >/dev/null
+                       ;;
+               esac
        done < <(echo "${rlist}")
        mj_finish
 
@@ -186,13 +230,15 @@ g-push)
        fi
        branch=${branch#refs/heads/}
        if ! remote_branch=$(g cfg --get "branch.${branch}.merge") ; then
-               err "could not figure out remote branch"
+               echo "could not figure out remote branch; using ${branch}"
+               remote_branch=${branch}
        fi
        if ! remote=$(g cfg --get "branch.${branch}.remote") ; then
                for remote in cros-internal cros origin ; do
                         g cfg --get "remote.${remote}.url" >/dev/null && break
                done
        fi
+       review=$(g cfg --get "remote.${remote}.review")
        remote_branch=${remote_branch#refs/heads/}
 
        git_args=()
@@ -200,10 +246,10 @@ g-push)
        while [[ $# -gt 0 ]] ; do
                case $1 in
                --re)
-                       reviewers=$2
+                       process_reviewers "$2"
                        shift
                        ;;
-               -n|--dry-run)
+               -n|--dry-run|--draft)
                        git_args+=( $1 )
                        ;;
                *)
@@ -213,12 +259,18 @@ g-push)
                shift
        done
 
+       ref_spec="${branch}:refs/for/${remote_branch}"
        if [[ -n ${reviewers} ]] ; then
                reviewers=( ${reviewers//,/ } )
-               git_args+=( "--receive-pack=git receive-pack ${reviewers[*]/#/--reviewer=}" )
+               if [[ ${review} != ssh://* ]] ; then
+                       gob_args=$(printf 'r=%s,' "${reviewers[@]}")
+                       ref_spec+="%${gob_args%,}"
+               else
+                       git_args+=( "--receive-pack=git receive-pack ${reviewers[*]/#/--reviewer=}" )
+               fi
        fi
 
-       vr git push "${git_args[@]}" ${remote} ${branch}:refs/for/${remote_branch} && exit
+       vr git push "${git_args[@]}" ${remote} ${ref_spec} && exit
        err "could not figure out remote to push to"
        ;;
 sync)
@@ -229,17 +281,10 @@ upload)
        while [[ $# -gt 0 ]] ; do
                case $1 in
                --re)
-                       if [[ $2 == *"OWNERS" ]] ; then
-                               owners=$(awk -F'@' '{list = list "," $1} END {print substr(list, 2)}' "$2")
-                               if [[ -z ${owners} ]] ; then
-                                       err "cannot find OWNERS list"
-                               else
-                                       echo "Auto setting reviewers to: ${owners}"
-                               fi
-                               args+=( --re "${owners}" )
-                               shift 2
-                               continue
-                       fi
+                       process_reviewers "$2"
+                       args+=( --re "${reviewers}" )
+                       shift 2
+                       continue
                        ;;
                esac
                args+=( "$1" )