| Index: tools/llvm/merge-tool.sh
|
| ===================================================================
|
| --- tools/llvm/merge-tool.sh (revision 6231)
|
| +++ tools/llvm/merge-tool.sh (working copy)
|
| @@ -1,7 +1,7 @@
|
| #!/bin/bash
|
| -# Copyright 2010 The Native Client Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can
|
| -# be found in the LICENSE file.
|
| +# Copyright 2011 The Native Client Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| #
|
| ######################################################################
|
| #
|
| @@ -19,131 +19,113 @@
|
| fi
|
|
|
| source tools/llvm/common-tools.sh
|
| +readonly NACL_ROOT="$(pwd)"
|
| +SetScriptPath "${NACL_ROOT}/tools/llvm/merge-tool.sh"
|
| +SetLogDirectory "${NACL_ROOT}/toolchain/hg-log"
|
| +readonly SCRIPT_PATH="$0"
|
| ######################################################################
|
|
|
| # Location of the mercurial repositories
|
| # These should match the values in utman.sh
|
| readonly TC_SRC="$(pwd)/hg"
|
| -readonly TC_SRC_LLVM="${TC_SRC}/llvm"
|
| -readonly TC_SRC_LLVM_GCC="${TC_SRC}/llvm-gcc"
|
| +readonly TC_SRC_UPSTREAM="${TC_SRC}/upstream"
|
|
|
| -# Location of the upstream LLVM repository
|
| -readonly MASTER_LLVM_BASE="http://llvm.org/svn/llvm-project"
|
| -readonly MASTER_LLVM_URL="${MASTER_LLVM_BASE}/llvm/trunk"
|
| -readonly MASTER_LLVM_GCC_URL="${MASTER_LLVM_BASE}/llvm-gcc-4.2/trunk"
|
| +readonly PREDIFF="${TC_SRC}/prediff"
|
| +readonly POSTDIFF="${TC_SRC}/postdiff"
|
|
|
| -readonly MASTER_LLVM="${TC_SRC}/master-llvm"
|
| -readonly MASTER_LLVM_GCC="${TC_SRC}/master-llvm-gcc"
|
|
|
| +# These variables should be set to the directories containing svn checkouts
|
| +# of the upstream LLVM and LLVM-GCC repositories, respectively. These variables
|
| +# must be specified in the environment to this script.
|
| +readonly MASTER_LLVM=${MASTER_LLVM:-}
|
| +readonly MASTER_LLVM_GCC=${MASTER_LLVM_GCC:-}
|
|
|
| -BASEDIR="$(pwd)"
|
| +# TODO(pdox): Refactor repository checkout into a separate script
|
| +# so that we don't need to invoke utman.
|
| utman() {
|
| - pushd "${BASEDIR}" > /dev/null
|
| - tools/llvm/utman.sh "$@"
|
| - popd > /dev/null
|
| + UTMAN_UPSTREAM=true "${NACL_ROOT}"/tools/llvm/utman.sh "$@"
|
| }
|
| -hg-pull-llvm() { utman hg-pull-llvm "$@" ; }
|
| -hg-pull-llvm-gcc() { utman hg-pull-llvm-gcc "$@" ; }
|
| -hg-checkout-llvm() { utman hg-checkout-llvm "$@" ; }
|
| -hg-checkout-llvm-gcc() { utman hg-checkout-llvm-gcc "$@" ; }
|
| +hg-checkout-upstream() { utman hg-checkout-upstream "$@" ; }
|
|
|
| -#@ all - Do LLVM and LLVM-GCC merge (all steps)
|
| -all() {
|
| +check-svn-repos() {
|
| + if [ -z "${MASTER_LLVM}" ] ||
|
| + [ -z "${MASTER_LLVM_GCC}" ]; then
|
| + Fatal "You must set environmental variables MASTER_LLVM and MASTER_LLVM_GCC"
|
| + fi
|
| + MERGE_REVISION=$(get-merge-revision)
|
| + Banner "MERGE REVISION: ${MERGE_REVISION}"
|
| +}
|
| +
|
| +#@ auto - Non-interactive merge
|
| +auto() {
|
| + INTERACTIVE_MERGE=false
|
| + export DISPLAY=""
|
| + merge-all
|
| +}
|
| +
|
| +#@ manual - Interactive merge
|
| +manual() {
|
| + INTERACTIVE_MERGE=true
|
| + merge-all
|
| +}
|
| +
|
| +#+ merge-all - Merge all the things
|
| +merge-all() {
|
| + hg-checkout-upstream
|
| assert-clean
|
| + setup-hgrc
|
|
|
| - checkout-all
|
| - choose-revision
|
| + generate-pre-diff
|
|
|
| - update-llvm-gcc-vendor
|
| - merge-llvm-gcc
|
| - diff-diff-llvm-gcc
|
| + commit-vendor
|
| + hg-merge
|
|
|
| - update-llvm-vendor
|
| - merge-llvm
|
| - diff-diff-llvm
|
| + generate-post-diff
|
|
|
| + if ${INTERACTIVE_MERGE}; then
|
| + vim-diff-diff
|
| + else
|
| + dump-diff-diff
|
| + fi
|
| +
|
| echo "********************************************************************"
|
| echo "The llvm and llvm-gcc working directories are now in a merged state."
|
| echo "Before you commit and push, you should build PNaCl and run all tests."
|
| - echo "For example:"
|
| - echo " tools/llvm/utman.sh clean"
|
| - echo " tools/llvm/utman.sh all"
|
| - echo " tools/llvm/utman.sh test-all"
|
| - echo " tests/spec2k/bot_spec.sh 2 <spec-dir>"
|
| - echo " tests/spec2k/bot_spec.sh 3 <spec-dir>"
|
| echo ""
|
| echo "Expect lots of bugs. You may need to fix and rebuild several times."
|
| echo "When you are confident all tests are passing, you can commit and push"
|
| - echo "the merged working directories with:"
|
| + echo "the merged working directory with:"
|
| echo " tools/llvm/merge-tool.sh final-commit"
|
| echo "********************************************************************"
|
| }
|
|
|
| +setup-hgrc() {
|
| + cp "${NACL_ROOT}/tools/llvm/hgrc" \
|
| + "${TC_SRC_UPSTREAM}/.hg/hgrc"
|
| +}
|
| +
|
| assert-clean() {
|
| - if [ -d "${MASTER_LLVM}" ]; then
|
| - svn-assert-no-changes "${MASTER_LLVM}"
|
| - fi
|
| + svn-assert-no-changes "${MASTER_LLVM}"
|
| + svn-assert-no-changes "${MASTER_LLVM_GCC}"
|
|
|
| - if [ -d "${MASTER_LLVM_GCC}" ]; then
|
| - svn-assert-no-changes "${MASTER_LLVM_GCC}"
|
| - fi
|
| -
|
| - if [ -d "${TC_SRC_LLVM}" ]; then
|
| - hg-assert-no-changes "${TC_SRC_LLVM}"
|
| - hg-assert-no-outgoing "${TC_SRC_LLVM}"
|
| - fi
|
| -
|
| - if [ -d "${TC_SRC_LLVM_GCC}" ]; then
|
| - hg-assert-no-changes "${TC_SRC_LLVM_GCC}"
|
| - hg-assert-no-outgoing "${TC_SRC_LLVM_GCC}"
|
| - fi
|
| + hg-assert-no-changes "${TC_SRC_UPSTREAM}"
|
| + hg-assert-no-outgoing "${TC_SRC_UPSTREAM}"
|
| }
|
|
|
| #@ clean - Clean/revert mercurial repositories
|
| clean() {
|
| StepBanner "CLEAN - Cleaning repositories"
|
| - Banner "WARNING: All local changes to hg/llvm and hg/llvm-gcc will be erased"
|
| - if ! confirm-yes "Are you sure you want to do this?" ; then
|
| - echo "Cancelled"
|
| - exit -1
|
| - fi
|
| - if ! confirm-yes "Are you really, really sure you want do this?" ; then
|
| - echo "Cancelled"
|
| - exit -1
|
| - fi
|
| - clean-llvm
|
| - clean-llvm-gcc
|
| + clean-upstream
|
| }
|
|
|
| -#+ clean-llvm
|
| -clean-llvm() {
|
| - StepBanner "CLEAN" "Cleaning hg llvm repository"
|
| - rm -rf "${TC_SRC_LLVM}"
|
| +#+ clean-upstream
|
| +clean-upstream() {
|
| + StepBanner "CLEAN" "Cleaning hg upstream repository"
|
| + rm -rf "${TC_SRC_UPSTREAM}"
|
| }
|
|
|
| -#+ clean-llvm-gcc
|
| -clean-llvm-gcc() {
|
| - StepBanner "CLEAN" "Cleaning hg llvm-gcc repository"
|
| - rm -rf "${TC_SRC_LLVM_GCC}"
|
| -}
|
| -
|
| -#@ checkout-all - Checkout repositories
|
| -checkout-all() {
|
| - StepBanner "checkout-all - Checkout all repositories"
|
| -
|
| - # Checkout LLVM repositories
|
| - StepBanner "checkout-all" "Checking out SVN repositories"
|
| - svn-checkout "${MASTER_LLVM_URL}" "${MASTER_LLVM}"
|
| - svn-checkout "${MASTER_LLVM_GCC_URL}" "${MASTER_LLVM_GCC}"
|
| -
|
| - # Checkout the hg repositories
|
| - StepBanner "checkout-all" "Checking out HG repositories"
|
| - hg-checkout-llvm
|
| - hg-checkout-llvm-gcc
|
| -}
|
| -
|
| -#+ get-revision - Get the current SVN revision
|
| -get-revision() {
|
| +#+ get-merge-revision - Get the current SVN revision
|
| +get-merge-revision() {
|
| local llvm_rev=$(svn-get-revision "${MASTER_LLVM}")
|
| local llvm_gcc_rev=$(svn-get-revision "${MASTER_LLVM_GCC}")
|
|
|
| @@ -155,215 +137,95 @@
|
| echo "${llvm_rev}"
|
| }
|
|
|
| -#@ choose-revision - Choose LLVM revision
|
| -choose-revision() {
|
| - StepBanner "choose-revision - Choose LLVM Revision"
|
| - echo
|
| - echo "Go to http://google1.osuosl.org:8011/ for LLVM build status"
|
| - echo
|
| - local rev
|
| - while true; do
|
| - echo -n "Please enter an LLVM revision (or 'tip'): "
|
| - read rev
|
| - if [[ "$rev" == "tip" ]]; then
|
| - break
|
| - fi
|
| - if [[ "$rev" =~ ^[0-9]+$ ]]; then
|
| - break
|
| - fi
|
| - echo "Invalid input."
|
| - done
|
| -
|
| - # Update the SVN repositories to ${rev}
|
| - StepBanner "choose-revision" "Updating LLVM repository to ${rev}"
|
| - svn-update "${MASTER_LLVM}" "${rev}"
|
| - svn-update "${MASTER_LLVM_GCC}" "${rev}"
|
| +#+ generate-pre-diff - Generate vendor:pnacl-sfi diff prior to merge
|
| +generate-pre-diff() {
|
| + spushd "${TC_SRC_UPSTREAM}"
|
| + hg diff -r vendor:pnacl-sfi &> "${PREDIFF}"
|
| + spopd
|
| }
|
|
|
| -#@ update-llvm-vendor - Apply update to vendor branch for llvm
|
| -update-llvm-vendor() {
|
| - local fnid="update-llvm-vendor"
|
| - StepBanner "${fnid} - Freshen hg 'vendor' branch"
|
| -
|
| - StepBanner "${fnid}" "Verifying repository state"
|
| - svn-assert-no-changes "${MASTER_LLVM}"
|
| - hg-assert-no-changes "${TC_SRC_LLVM}"
|
| - hg-assert-no-outgoing "${TC_SRC_LLVM}"
|
| -
|
| - StepBanner "${fnid}" "hg pull (llvm)"
|
| - hg-pull-llvm
|
| -
|
| - StepBanner "${fnid}" "switch to hg branch vendor (llvm)"
|
| - hg-update "${TC_SRC_LLVM}" vendor
|
| - StepBanner "${fnid}" "Delete existing vendor source"
|
| - rm -rf "${TC_SRC_LLVM}/llvm-trunk"
|
| -
|
| - StepBanner "${fnid}" "Exporting svn to hg (llvm)"
|
| - RunWithLog "${fnid}" \
|
| - svn export "${MASTER_LLVM}" "${TC_SRC_LLVM}/llvm-trunk"
|
| -
|
| - StepBanner "${fnid}" "Updating hg file list (llvm)"
|
| - spushd "${TC_SRC_LLVM}"
|
| - RunWithLog "${fnid}" hg add
|
| - RunWithLog "${fnid}" hg remove -A
|
| +#+ generate-post-diff - Generate vendor:pnacl-sfi diff after merge
|
| +generate-post-diff() {
|
| + spushd "${TC_SRC_UPSTREAM}"
|
| + hg diff -r vendor &> "${POSTDIFF}"
|
| spopd
|
| -
|
| - hg-status-check LLVM "${TC_SRC_LLVM}"
|
| -
|
| - local rev=$(get-revision)
|
| - StepBanner "${fnid} - Commit hg 'vendor' branch (llvm)"
|
| - hg-commit "${TC_SRC_LLVM}" "Updating vendor to r${rev}"
|
| }
|
|
|
| -#@ update-llvm-gcc-vendor - Apply update to vendor branch for llvm-gcc
|
| -update-llvm-gcc-vendor() {
|
| - local fnid="update-llvm-gcc-vendor"
|
| - StepBanner "${fnid}" "hg pull (llvm-gcc)"
|
| - hg-pull-llvm-gcc
|
| +#@ commit-vendor - Apply new commit to vendor branch
|
| +commit-vendor() {
|
| + local stepid="commit-vendor"
|
| + StepBanner "Committing vendor"
|
|
|
| - StepBanner "${fnid}" "Verifying repository state"
|
| - svn-assert-no-changes "${MASTER_LLVM_GCC}"
|
| - hg-assert-no-changes "${TC_SRC_LLVM_GCC}"
|
| - hg-assert-no-outgoing "${TC_SRC_LLVM_GCC}"
|
| + StepBanner "${stepid}" "Switching to hg vendor branch"
|
|
|
| - StepBanner "${fnid}" "switch to hg branch vendor (llvm-gcc)"
|
| - hg-update "${TC_SRC_LLVM_GCC}" vendor
|
| + hg-update "${TC_SRC_UPSTREAM}" vendor
|
|
|
| - StepBanner "${fnid}" "Delete existing vendor source"
|
| - rm -rf "${TC_SRC_LLVM_GCC}/llvm-gcc-4.2"
|
| + StepBanner "${stepid}" "Exporting svn to hg"
|
| + rm -rf "${TC_SRC_UPSTREAM}/llvm"
|
| + svn export "${MASTER_LLVM}" "${TC_SRC_UPSTREAM}/llvm"
|
|
|
| - StepBanner "${fnid}" "Exporting svn to hg (llvm-gcc)"
|
| - RunWithLog "${fnid}" \
|
| - svn export "${MASTER_LLVM_GCC}" "${TC_SRC_LLVM_GCC}/llvm-gcc-4.2"
|
| + rm -rf "${TC_SRC_UPSTREAM}/llvm-gcc"
|
| + svn export "${MASTER_LLVM_GCC}" "${TC_SRC_UPSTREAM}/llvm-gcc"
|
|
|
| - StepBanner "${fnid}" "Updating hg file list (llvm-gcc)"
|
| - spushd "${TC_SRC_LLVM_GCC}"
|
| - RunWithLog "${fnid}" hg add
|
| - RunWithLog "${fnid}" hg remove -A
|
| + StepBanner "${stepid}" "Updating hg file list"
|
| + spushd "${TC_SRC_UPSTREAM}"
|
| + hg add
|
| + hg remove -A
|
| spopd
|
|
|
| - hg-status-check LLVM-GCC "${TC_SRC_LLVM_GCC}"
|
| -
|
| - local rev=$(get-revision)
|
| - StepBanner "${fnid} - Commit hg 'vendor' branch (llvm-gcc)"
|
| - hg-commit "${TC_SRC_LLVM_GCC}" "Updating vendor to r${rev}"
|
| + StepBanner "${stepid}" "Committing vendor branch"
|
| + hg-commit "${TC_SRC_UPSTREAM}" "Updating vendor to r${MERGE_REVISION}"
|
| }
|
|
|
| -#@ merge-llvm-gcc - Merge and resolve conflicts for llvm-gcc
|
| -merge-llvm-gcc() {
|
| - StepBanner "merge-llvm-gcc - Merge and resolve conflicts"
|
| +#@ hg-merge - Merge and resolve conflicts for llvm
|
| +hg-merge() {
|
| + StepBanner "hg-merge - Merge and resolve conflicts"
|
|
|
| - StepBanner "merge-llvm-gcc" "Switch to pnacl-sfi branch"
|
| - hg-assert-no-changes "${TC_SRC_LLVM_GCC}"
|
| - hg-update "${TC_SRC_LLVM_GCC}" pnacl-sfi
|
| + StepBanner "hg-merge" "Switching to pnacl-sfi branch"
|
| + hg-update "${TC_SRC_UPSTREAM}" pnacl-sfi
|
| + hg-assert-no-changes "${TC_SRC_UPSTREAM}"
|
|
|
| - StepBanner "merge-llvm-gcc" "Merging vendor into pnacl-sfi"
|
| - spushd "${TC_SRC_LLVM_GCC}"
|
| + StepBanner "hg-merge" "Merging vendor into pnacl-sfi"
|
| + spushd "${TC_SRC_UPSTREAM}"
|
| hg merge -r vendor
|
| spopd
|
| }
|
|
|
| -#@ merge-llvm - Merge and resolve conflicts for llvm
|
| -merge-llvm() {
|
| - StepBanner "merge-llvm - Merge and resolve conflicts"
|
| -
|
| - StepBanner "merge-llvm" "Switch to pnacl-sfi branch"
|
| - hg-assert-no-changes "${TC_SRC_LLVM}"
|
| - hg-update "${TC_SRC_LLVM}" pnacl-sfi
|
| -
|
| - StepBanner "merge-llvm" "Merging vendor into pnacl-sfi"
|
| - spushd "${TC_SRC_LLVM}"
|
| - hg merge -r vendor
|
| - spopd
|
| +#@ vim-diff-diff - Review diff-diff using vim
|
| +vim-diff-diff() {
|
| + vimdiff "${PREDIFF}" "${POSTDIFF}"
|
| }
|
|
|
| -#@ diff-diff-llvm - Review diff-diff
|
| -diff-diff-llvm() {
|
| - (
|
| - echo "Type 'q' to exit less"
|
| - echo "---------------------------------------------------"
|
| - tools/llvm/diff-diff.py "${TC_SRC_LLVM}"
|
| - ) 2>&1 | less
|
| -
|
| - if ! confirm-yes "Does the diff-diff for LLVM look correct"; then
|
| - echo "Cancelling."
|
| - echo "hg repositories remain in uncommitted state."
|
| - echo "Use 'tools/llvm/merge-tool.sh clean' to clean them"
|
| - exit -1
|
| - fi
|
| +#@ dump-diff-diff - Review diff-diff
|
| +dump-diff-diff() {
|
| + diff "${PREDIFF}" "${POSTDIFF}"
|
| }
|
|
|
| -#@ diff-diff-llvm-gcc - Review diff-diff
|
| -diff-diff-llvm-gcc() {
|
| - (
|
| - echo "Type 'q' to exit less"
|
| - echo "---------------------------------------------------"
|
| - tools/llvm/diff-diff.py "${TC_SRC_LLVM_GCC}"
|
| - ) 2>&1 | less
|
| -
|
| - if ! confirm-yes "Does the diff-diff for LLVM-GCC look correct"; then
|
| - echo "Cancelling."
|
| - echo "hg repositories remain in uncommitted state."
|
| - echo "Use 'tools/llvm/merge-tool.sh clean' to clean them"
|
| - exit -1
|
| - fi
|
| -}
|
| -
|
| final-commit() {
|
| StepBanner "final-commit" "Committing and pushing merge"
|
| - hg-assert-is-merge "${TC_SRC_LLVM}"
|
| - hg-assert-is-merge "${TC_SRC_LLVM_GCC}"
|
| - hg-assert-branch "${TC_SRC_LLVM}" pnacl-sfi
|
| - hg-assert-branch "${TC_SRC_LLVM_GCC}" pnacl-sfi
|
| + hg-assert-is-merge "${TC_SRC_UPSTREAM}"
|
| + hg-assert-branch "${TC_SRC_UPSTREAM}" pnacl-sfi
|
|
|
| - Banner "CAUTION: This step will COMMIT and PUSH changes to the repository."
|
| - echo
|
| - if ! confirm-yes "Is the merged working directory passing all tests?" ; then
|
| - echo "Cancelled"
|
| - exit -1
|
| + if ${INTERACTIVE_MERGE}; then
|
| + Banner "CAUTION: This step will COMMIT and PUSH changes to the repository."
|
| + echo
|
| + if ! confirm-yes "Is the merged working directory passing all tests?" ; then
|
| + echo "Cancelled"
|
| + exit -1
|
| + fi
|
| + if ! confirm-yes "Are you really sure you want to do this?" ; then
|
| + echo "Cancelled"
|
| + exit -1
|
| + fi
|
| fi
|
| - if ! confirm-yes "Are you really sure you want to do this?" ; then
|
| - echo "Cancelled"
|
| - exit -1
|
| - fi
|
|
|
| - local rev=$(get-revision)
|
| + StepBanner "final-commit" "Committing pnacl-sfi branch"
|
| + hg-commit "${TC_SRC_UPSTREAM}" "Merged up to r${MERGE_REVISION}"
|
|
|
| - StepBanner "final-commit - Committing hg pnacl-sfi branch (llvm)"
|
| - hg-commit "${TC_SRC_LLVM}" "Merged up to r${rev}"
|
| -
|
| - StepBanner "final-commit - Committing hg pnacl-sfi branch (llvm-gcc)"
|
| - hg-commit "${TC_SRC_LLVM_GCC}" "Merged up to r${rev}"
|
| -
|
| - StepBanner "final-commit - Pushing (llvm)"
|
| - hg-push "${TC_SRC_LLVM}"
|
| -
|
| - StepBanner "final-commit - Pushing (llvm-gcc)"
|
| - hg-push "${TC_SRC_LLVM_GCC}"
|
| + StepBanner "final-commit" "Pushing to hg/upstream"
|
| + hg-push "${TC_SRC_UPSTREAM}"
|
| }
|
|
|
| -#+ hg-status-check <name> <repo> - Allow the user to check hg status for problems
|
| -hg-status-check() {
|
| - local name="$1"
|
| - local repo="$2"
|
| - spushd "${repo}"
|
| - (
|
| - echo "Please verify hg status for ${name}:"
|
| - echo "Hit q to exit 'less'"
|
| - echo "---------------------------------------------------"
|
| - hg status
|
| - echo "---------------------------------------------------"
|
| - ) 2>&1 | less
|
| - spopd
|
| -
|
| - if ! confirm-yes "Does the status for ${name} look correct"; then
|
| - echo "Cancelling vendor update."
|
| - echo "hg repositories remain in uncommitted state."
|
| - echo "Use 'tools/llvm/merge-tool.sh clean' to clean them"
|
| - exit -1
|
| - fi
|
| -}
|
| -
|
| #@ help - Usage information.
|
| help() {
|
| Usage
|
| @@ -377,4 +239,5 @@
|
| exit 1
|
| fi
|
|
|
| +check-svn-repos
|
| "$@"
|
|
|