#!/bin/bash # Copyright 2021 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. # # Script to create a commit to merge cros/main into cros/chromeos with a useful # commit message. # # Basic usage to upload a merge to gerrit: # # $ repo start uprev . # $ ./tools/chromeos/create_merge # $ git push cros HEAD:refs/for/chromeos # # To merge with a specific commit, use: ./tools/chromeos/create_merge $SHA set -e if [ "$1" == "--dry-run-only" ]; then DRY_RUN_ONLY=true shift fi LOCAL_BRANCH=$(git branch --show-current) REMOTE_NAME=$(git config "branch.${LOCAL_BRANCH}.remote") URL=$(git remote get-url "${REMOTE_NAME}") DEFAULT_TARGET="${REMOTE_NAME}/main" MERGE_TARGET="${1:-${DEFAULT_TARGET}}" commit_list() { git log --oneline --decorate=no --no-color "HEAD..${MERGE_TARGET}" } prerequisites() { if [[ -e "${LOCAL_BRANCH}" ]] || [[ -e "${REMOTE_NAME}" ]] || [[ -e "${URL}" ]]; then echo "This script requires the local repository to be on" \ "a tracking branch." exit 1 fi if [[ -n $(git status -s) ]]; then echo "Working directory is not clean:" git status -s exit 1 fi if [[ -z "$(commit_list)" ]]; then echo "Nothing to merge." exit 0 fi } cq_depends() { git log --no-color "HEAD..${MERGE_TARGET}" --pretty=email | grep ^Cq-Depend: | sort -u } bug_references() { git log --no-color "HEAD..${MERGE_TARGET}" --pretty=email | grep ^BUG= | grep -vi ^BUG=none | sort -u } merge_message() { local old=$(git rev-parse HEAD) local new=$(git rev-parse "${MERGE_TARGET}") local count=$(commit_list | wc -l) local notes="$(date +%F)" if [[ -n "$(cq_depends)" ]]; then notes="${notes}, cq-depend" fi if [ "${DRY_RUN_ONLY}" = true ]; then echo "Merge dry run (${notes})" else echo "Merge ${count} commits from ${MERGE_TARGET} (${notes})" fi echo "" commit_list echo "" echo "${URL}/+log/${old}..${new}" echo "" if [ "${DRY_RUN_ONLY}" != true ]; then bug_references fi echo "TEST=CQ" echo "" cq_depends if [ "${DRY_RUN_ONLY}" = true ]; then echo "Commit: false" fi } main() { prerequisites git merge -X theirs --no-ff "${MERGE_TARGET}" -m "$(merge_message)" git --no-pager log -n 1 } main