X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=.bin%2Fr;h=641ed64216f64361682698934e69d155acb561f4;hb=c6a724ca581a2ac547cdab694176ace15fbbad8c;hp=31377ef2866dded8d9445aff59aa04c96c4df276;hpb=f8260dbddb5fe268af322c854c26f56c39c61597;p=home.git diff --git a/.bin/r b/.bin/r index 31377ef..641ed64 100755 --- a/.bin/r +++ b/.bin/r @@ -3,6 +3,10 @@ g() { git "$@"; } err() { printf '%b\n' "$*" 1>&2; exit 1; } vr() { echo "$@"; "$@"; } +case $1 in +-x) set -x; shift;; +esac + case $1 in ""|-*) ;; l) @@ -13,6 +17,11 @@ s) cmd=sync shift ;; +rb-all) + cmd=rebase + shift + set -- all "$@" + ;; *) cmd=$1 shift @@ -50,7 +59,7 @@ mj_finish() { repo_root() { local root=${PWD} - while [[ ! -d ${root}/.repo && ${root} != "/" ]] ; do + while [[ ! -d ${root}/.repo && ${root:-/} != "/" ]] ; do root=${root%/*} done echo "${root}" @@ -83,6 +92,46 @@ process_reviewers() { 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 @@ -94,18 +143,26 @@ rebase) 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) if [[ -n ${out} ]] ; then while read line ; do - if [[ ${line} == "# "* ]] ; then + case ${line} in + "Fast-forwarded "*) ;; + "# "*) line="${line#[#] }" printf '%s### %s%-40s%s: %s\n' \ "${BRACKET}" "${GOOD}" "${line%%:*}" "${NORMAL}" "${line#*:}" - else - echo "${line}" - fi + ;; + *) + printf '%s### %s%-40s%s: ERROR: %s\n' \ + "${BRACKET}" "${BAD}" "${dir}" "${NORMAL}" "${line}" + ;; + esac done < <(echo "${out}") fi _mj_child @@ -121,7 +178,7 @@ rebase) { if ($0 ~ "^[*] *[(]no branch[)]") { next - } else if ($0 ~ "^[*] *[(]detached from ") { + } else if ($0 ~ "^[*] *[(](HEAD )?detached (from|at) ") { next } else if ($1 == "*") { b = $2 @@ -294,9 +351,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 python2 $(find_repo) ${acmd:-${cmd}} "$@"