X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=.bin%2Fr;h=83816bd0bc68f54c698d89e1d77d0162f39a5397;hb=bc85e5e04184cb992b8398fdf36a41633b95f50e;hp=6a86466c38ecdedb3e53527b7699c15e4699ac62;hpb=d3bdab7a0f168e65849b2bc8863d9d7a8ef123aa;p=home.git diff --git a/.bin/r b/.bin/r index 6a86466..83816bd 100755 --- a/.bin/r +++ b/.bin/r @@ -4,19 +4,14 @@ err() { printf '%b\n' "$*" 1>&2; exit 1; } vr() { echo "$@"; "$@"; } case $1 in -""|-*) ;; -l) - cmd=list - shift - ;; -s) - cmd=sync - shift - ;; -*) - cmd=$1 +-x) set -x; shift;; +esac + +case $1 in +rb-all) + cmd=rebase shift - acmd=$(git config --get "alias.${cmd}" | sed 's: -.*::') + set -- all "$@" ;; esac @@ -50,36 +45,99 @@ mj_finish() { repo_root() { local root=${PWD} - while [[ ! -d ${root}/.repo && ${root} != "/" ]] ; do + while [[ ! -d ${root}/.repo && ${root:-/} != "/" ]] ; do root=${root%/*} done echo "${root}" } +process_reviewers() { + local r arr=() + for r in ${*//,/ } ; do + case ${r} in + OWNERS*|*/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%,} +} + +find_repo() { + # Diff projects have diff versions of repo. Find a compatible one. + local root=$(repo_root) + + # Use the manifest repo URL. + local manifest_dir="${root}/.repo/manifests.git" + local d + + # Default to the local repo if it's there. + local search=( + "${root}/.repo/repo" + ) + + case $(g --git-dir="${manifest_dir}" config remote.origin.url) in + *android*) + search+=( + /usr/local/src/repo + ~/src/repo + ) + ;; + *chromium*|*chrome*) + search+=( + ~/depot_tools + ~/chromiumos/depot_tools + /usr/local/src/depot_tools + ~/src/depot_tools + ) + ;; + esac + for d in "${search[@]}" ; do + if [[ -x ${d}/repo ]] ; then + echo "${d}"/repo + return + fi + done + + # Fallback: use $PATH. + type -P repo +} + case ${acmd:-${cmd}} in rebase) if [[ $1 == "all" ]] ; then shift if [[ $# -eq 0 ]] ; then - eval $(bash-colors --env | sed 's:^:export :') + eval "$(bash-colors --env | sed 's:^:export :')" root=$(repo_root) mj_init while read -a line ; do dir=${line[0]} proj=${line[2]} - cd "${root}/${dir}" + if ! cd "${root}/${dir}" ; then + echo "bad ${proj}" + continue + fi ( - out=$(env _proj=${proj} r rb all . 2>&1) + out=$(r rb-all . 2>&1) if [[ -n ${out} ]] ; then - while read line ; do - if [[ ${line} == "# "* ]] ; then - line="${line#[#] }" - printf '%s### %s%-40s%s: %s\n' \ - "${BRACKET}" "${GOOD}" "${line%%:*}" "${NORMAL}" "${line#*:}" - else - echo "${line}" - fi - done < <(echo "${out}") + head=$(printf "%-40s" "${proj}") + echo "${out}" | sed "s:^:${head} :" fi _mj_child ) & @@ -90,36 +148,7 @@ rebase) #exec r forall -p -c 'r rb all .' & /dev/null || src= - mj_child g push --force ${remote}/${proj} ${src}:refs/sandbox/${USER}/${sync_branch} >/dev/null - done < <(echo "${rlist}") - mj_finish - - exit 0 - ;; -g-push) - # For the times when repo is being stupid, push directly to gerrit myself. - if ! branch=$(g symbolic-ref -q HEAD) ; then - err "could not figure out active branch" - fi - branch=${branch#refs/heads/} - if ! remote_branch=$(g cfg --get "branch.${branch}.merge") ; then - 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=() - reviewers="" - while [[ $# -gt 0 ]] ; do - case $1 in - --re) - reviewers=$2 - shift + 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 ;; - -n|--dry-run|--draft) - git_args+=( $1 ) + pull) ;; - *) - err "unknown option: $1" + fetch) + mj_child g fetch ${remote}/${proj} refs/sandbox/${USER}/${sync_branch}:refs/remotes/sb/${sync_branch} >/dev/null ;; esac - shift - done - - ref_spec="${branch}:refs/for/${remote_branch}" - if [[ -n ${reviewers} ]] ; then - reviewers=( ${reviewers//,/ } ) - 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 + done < <(echo "${rlist}") + mj_finish - vr git push "${git_args[@]}" ${remote} ${ref_spec} && exit - err "could not figure out remote to push to" - ;; -sync) - set -- -j16 -c "$@" + exit 0 ;; upload) args=() 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" ) @@ -257,9 +243,14 @@ upload) ;; email) email=${1:-${USER}@chromium.org} + + root=$(repo_root) + git --git-dir="${root}/.repo/manifests.git" cfg user.email "${email}" + git --git-dir="${root}/.repo/repo/.git" cfg user.email "${email}" + cmd='forall' - set -- -c "git cfg user.email ${email}" + set -- -c "git cfg user.email '${email}'" ;; esac -exec repo ${acmd:-${cmd}} "$@" +exec $(find_repo) ${acmd:-${cmd}} "$@"