#!/usr/bin/env bash # Copyright (c) 2012 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. branch_name="" checkout_branch=no create_branch=no quiet=no svn_lkgr= while [ $# -gt 0 ]; do case "$1" in --checkout|--force-branch) checkout_branch=yes create_branch=yes ;; --closest) use_closest=yes ;; --create) create_branch=yes ;; -n|--name) branch_name=$2 create_branch=yes shift ;; -q|--quiet) quiet=yes ;; -r|--revision) svn_lkgr="$2" shift ;; *) echo "Unknown option: $1" echo "Usage:" echo " --checkout Create a branch and check it out." echo " --create Create a branch." echo " --closest Use closest git commit to the target svn revision." echo " Otherwise --checkout may be required to create" echo " a git commit for a specific svn revision." echo " -n, --name Specify the name of branch to create or reset." echo " This will force the branch using 'git branch -f '." echo " -q, --quiet Quiet." echo " -r, --revision Svn revision number use instead of server provided lkgr." exit 1 ;; esac shift done if [ -z "$svn_lkgr" ]; then svn_lkgr=`curl -s http://chromium-status.appspot.com/lkgr` if [ $? != 0 -o -z "$svn_lkgr" ]; then echo 'Could not get svn lkgr from chromium-status.appspot.com/lkgr' exit 1 fi fi if [ "${svn_lkgr:0:1}" = "r" ]; then svn_lkgr="${svn_lkgr:1}" fi # Run a trivial git-svn command to force it to update the revision cache # (which causes spew that might otherwise confuse the next command). git svn info > /dev/null if [ $? != 0 ]; then cat <&2 Could not run a trivial git-svn command. You probably need to set up your working directory for git-svn, by following these instructions: http://code.google.com/p/chromium/wiki/UsingNewGit#Initial_checkout EOF exit 1 fi git_lkgr=`git svn find-rev r${svn_lkgr}` if [ $? != 0 -o -z "$git_lkgr" ]; then cat <&2 Could not map svn revision ${svn_lkgr} to a git commit. You may need to 'git fetch' and try again. EOF exit 1 fi set -o pipefail closest_commit=`git rev-list --ancestry-path \ --grep='SVN changes up to revision [0-9]*' \ ${git_lkgr}..refs/remotes/origin/master | tail -1` if [ $? != 0 -o -z "$closest_commit" ]; then closest_commit= closest_svn_commit= else closest_svn_commit=`git rev-list -n 1 ${closest_commit}^1` if [ $? != 0 -o -z "$closest_svn_commit" ]; then cat <&2 I am thoroughly confused. Please file a bug report at http://new.crbug.com. EOF exit 1 fi closest_svn=`git svn find-rev ${closest_svn_commit}` fi if [ "${use_closest}" = "yes" ]; then svn_lkgr="${closest_svn}" git_lkgr="${closest_svn_commit}" fi # Determine lkgr_branch: if [ "${branch_name}" != "" ]; then # Use the provided name for the branch. lkgr_branch="${branch_name}" # If the branch already exists, force the update to it. git rev-parse --verify -q "${branch_name}" >/dev/null if [ $? -eq 0 ]; then old_branch_value=`git rev-parse "${branch_name}"` echo "Will update branch ${lkgr_branch}, it previously was at ${old_branch_value}." force_branch="--force" fi else # Pick a name for the new branch. Use `git rev-parse` to make sure the branch # doesn't already exist; if it does, iterate an integer suffix to uniquify it. lkgr_branch="lkgr_r${svn_lkgr}" digit=1 git rev-parse --verify -q "${lkgr_branch}" >/dev/null while [ $? -eq 0 ]; do lkgr_branch="lkgr_r${svn_lkgr}_${digit}" digit=`expr $digit + 1` git rev-parse --verify -q "${lkgr_branch}" >/dev/null done fi if [ "${closest_svn_commit}" = "${git_lkgr}" ]; then echo "${closest_commit}" if [ "$create_branch" = "yes" ]; then echo "Creating branch ${lkgr_branch}" git branch ${force_branch} "${lkgr_branch}" "${closest_commit}" || exit 1 fi if [ "$checkout_branch" = "yes" ]; then git checkout "${lkgr_branch}" fi exit 0 elif [ "${quiet}" = "yes" ]; then exit 1 elif [ "${checkout_branch}" = "no" ]; then echo "There is no master commit which corresponds exactly to svn revision ${svn_lkgr}." echo "Call 'git lkgr --checkout' to create a branch with a commit to match ${svn_lkgr}." if [ -n "$closest_commit" ]; then echo "The closest commit is r${closest_svn}, ${closest_commit}." echo "Use the --closest option to use the closest instead of the target revision." fi exit 0 fi current_head=`git branch | grep '^\*' | cut -c3-` if [ "${current_head}" = "(no branch)" ]; then current_head=`git rev-parse HEAD` fi git checkout --detach "${git_lkgr}" && python tools/deps2git/deps2git.py -d DEPS -o .DEPS.git -w .. && git add .DEPS.git && python tools/deps2git/deps2submodules.py .DEPS.git && git commit -m "SVN changes up to revision $svn_lkgr" && git branch ${force_branch} "${lkgr_branch}" HEAD if [ $? != 0 ]; then cat <