| #!/bin/bash -eu |
| # Copyright 2019 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| # |
| # This is a script crafted to make our Android friends' lives easier: when run |
| # on their copy of toolchain-utils, this script will do all of the necessary |
| # merging/branch creation/etc. to make keeping things up-to-date trivial. |
| # |
| # For example, |
| # https://android-review.googlesource.com/c/platform/external/toolchain-utils/+/1132504/1 |
| |
| local_branch_name="merge_with_upstream" |
| local_upstream="aosp/master" |
| remote="aosp" |
| remote_branch="${remote}/upstream-mirror-master" |
| |
| my_dir="$(dirname "$(readlink -m "$0")")" |
| cd "${my_dir}" |
| |
| ensure_head_is_upstream_main() { |
| local current_rev main_rev |
| current_rev="$(git rev-parse HEAD)" |
| main_rev="$(git rev-parse ${local_upstream})" |
| if [[ "${current_rev}" != "${main_rev}" ]]; then |
| echo "Please checkout ${local_upstream} and rerun this" >&2 |
| exit |
| fi |
| } |
| |
| ensure_no_local_branch_present() { |
| if ! git rev-parse "${local_branch_name}" >& /dev/null; then |
| return 0 |
| fi |
| |
| echo -n "${local_branch_name} is a valid branch already. Delete? [y/N] " >&2 |
| |
| local line |
| read -r line |
| if [[ "${line}" != y* && "${line}" != Y* ]]; then |
| echo "Aborted" >&2 |
| exit 1 |
| fi |
| |
| # If we're *on* that branch, deleting it is difficult. Always detach. |
| git checkout --detach || return |
| git branch -D "${local_branch_name}" |
| } |
| |
| get_merge_commit_list() { |
| local merge_base |
| merge_base="$(git merge-base HEAD ${remote_branch})" |
| git log --oneline "${merge_base}..${remote_branch}" |
| } |
| |
| ensure_head_is_upstream_main |
| ensure_no_local_branch_present |
| |
| echo "Ensuring repository is up-to-date..." |
| git fetch "${remote}" |
| repo start "${local_branch_name}" |
| |
| commit_list="$(get_merge_commit_list)" |
| num_commits="$(wc -l <<< "${commit_list}")" |
| commit_message="Merging ${num_commits} commit(s) from Chromium's toolchain-utils |
| |
| Merged commit digest: |
| $(sed 's/^/ /' <<< "${commit_list}") |
| " |
| |
| git merge "${remote_branch}" -m "${commit_message}" |
| echo 'NOTE: When you try to `repo upload`, repo might show a scary warning' |
| echo 'about the number of changes are being uploaded. That should be fine,' |
| echo 'since repo will only create CLs for commits not known to our remote.' |