You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			209 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
			
		
		
	
	
			209 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Bash
		
	
#!/bin/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 <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 <r> 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 <<EOF 1>&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 <<EOF 1>&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 <<EOF 1>&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 <<EOF
 | 
						|
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
Something went wrong!  Restoring your previous state by checking out
 | 
						|
$current_head
 | 
						|
 | 
						|
Please file a bug report at http://new.crbug.com.
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
 | 
						|
EOF
 | 
						|
  git checkout --force $current_head
 | 
						|
  exit 1
 | 
						|
fi
 | 
						|
 | 
						|
git checkout "${lkgr_branch}"
 | 
						|
 | 
						|
cat <<EOF
 | 
						|
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
The new branch "$lkgr_branch" was branched from this commit:
 | 
						|
 | 
						|
$git_lkgr
 | 
						|
 | 
						|
... which maps to the svn commit r${svn_lkgr}.  The new branch
 | 
						|
has one additional commit, to bring .DEPS.git, .gitmodules, and the
 | 
						|
invisible git submodule files up to date with DEPS.
 | 
						|
 | 
						|
To create a working branch, do this:
 | 
						|
 | 
						|
\$ git branch --track my_new_branch $lkgr_branch
 | 
						|
 | 
						|
'git-cl upload' will do the right thing, i.e., it will cherry-pick all
 | 
						|
your changes from my_new_branch, but *not* the .DEPS.git+.gitmodules+submodules
 | 
						|
commit on $lkgr_branch.
 | 
						|
--------------------------------------------------------------------------------
 | 
						|
 | 
						|
EOF
 |