| #!/bin/bash -e |
| # |
| # Copyright (c) 2009 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. |
| # |
| # create-chromium-git-src |
| # |
| # Create and configure a local Chromium git repository. |
| # |
| |
| GITSERVER="${GITSERVER:-git.chromium.org}" |
| SVNSERVER="${SVNSERVER:-svn://svn.chromium.org/chrome}" |
| TMP=".create_chromium_git_src.$$" |
| |
| function cleanup { |
| rm -rf "${TMP}" |
| } |
| |
| trap 'cleanup; echo Failure!; tput bel; exit 1' TERM QUIT HUP INT EXIT |
| |
| function get_email { |
| # Get user email address. |
| EMAIL="" |
| while [ "x${EMAIL}" = "x" ]; do |
| echo -n "Email address git should configure in your checkout: " |
| read EMAIL |
| if [ "x${EMAIL}" = "x${EMAIL%@*}" ]; then |
| echo "Invalid email address (must contain @)!" |
| EMAIL="" |
| fi |
| done |
| echo -n "Using ${EMAIL} for email address... " |
| sleep 1 |
| echo OK |
| } |
| |
| # Verify we can write to particular directories. |
| function check_dirs { |
| if [ -d src ]; then |
| echo "Found a src directory, do you already have a Chromium checkout?" |
| exit 1 |
| fi |
| } |
| |
| # Test git and git --version. |
| function test_git { |
| echo -n "Trying git... " |
| local GITV="$(git --version)" || { |
| echo "git isn't installed, please install it" |
| exit 1 |
| } |
| |
| GITV="${GITV##* }" # Only examine last word (i.e. version number) |
| local GITD=( ${GITV//./ } ) # Split version number into decimals |
| if ((GITD[0] < 1 || (GITD[0] == 1 && GITD[1] < 6) )); then |
| echo "git version is ${GITV}, please update to a version later than 1.6" |
| exit 1 |
| fi |
| echo "found git version ${GITV}" |
| } |
| |
| # Test git svn and git svn --version. |
| function test_git_svn { |
| echo -n "Trying git-svn... " |
| rm -rf "${TMP}" |
| git clone git://github.com/git/hello-world.git "${TMP}" &>/dev/null && |
| local GITV="$(cd "${TMP}" && git svn --version)" || { |
| echo "git-svn isn't installed, please install it" |
| exit 1 |
| } |
| |
| GITV="${GITV#* version }" # git svn --version has extra output to remove. |
| GITV="${GITV% (svn*}" |
| local GITD=( ${GITV//./ } ) # Split version number into decimals |
| if ((GITD[0] < 1 || (GITD[0] == 1 && GITD[1] < 6) )); then |
| echo "git version is ${GITV}, please update to a version later than 1.6" |
| exit 1 |
| fi |
| echo "found git-svn version ${GITV}" |
| |
| echo "Testing git svn init..." |
| (cd "${TMP}" && git svn init --username="${EMAIL}" --prefix=origin/ \ |
| -T trunk/src "${SVNSERVER}") & |
| local pid="$!" |
| { sleep 10 && kill "${pid}"; } &>/dev/null & |
| wait "${pid}" &>/dev/null || { |
| echo "Could not initialize repository, is SVN server ${SVNSERVER} correct?" |
| echo "The supplied username and password may be incorrect." |
| exit 1 |
| } |
| } |
| |
| # Verify we can reach our main git URL. |
| function test_git_url { |
| echo -n "Testing Chromium git URL... " |
| mkdir -p "${TMP}" |
| (cd "${TMP}" && |
| rm -rf .git .gitignore && |
| git init && |
| git remote add origin git://"${GITSERVER}"/chromium.git && |
| git remote show origin) &>/dev/null & |
| local pid="$!" |
| { sleep 10 && kill "${pid}"; } &>/dev/null & |
| wait "${pid}" &>/dev/null || { |
| echo "timeout accessing Chromium git URL, is ${GITSERVER} correct?" |
| exit 1 |
| } |
| echo OK |
| } |
| |
| # Grab a clone of the Chromium git repository. |
| function cr_git_clone { |
| echo "Grabbing Chromium git repository..." |
| git clone git://"${GITSERVER}"/chromium.git src || { |
| echo "git clone exited with error" |
| echo "You should probably remove 'src' before retrying" |
| exit 1 |
| } |
| } |
| |
| # Configure the git repository to know about the upstream SVN server. |
| function cr_git_svn_init { |
| echo "Configuring upstream SVN..." |
| (cd src && git svn init --username="${EMAIL}" --prefix=origin/ -T trunk/src \ |
| "${SVNSERVER}") || { |
| echo "'git svn init' exited with error" |
| exit 1 |
| } |
| } |
| |
| # Initialize the SVN history in the repository, also sanity checks our upstream |
| # SVN configuration. |
| function cr_git_svn_fetch { |
| echo "Fetching SVN history..." |
| (cd src && git svn fetch && git pull) || { |
| echo "'git svn fetch' exited with error" |
| exit 1 |
| } |
| } |
| |
| # Remaining configuration of the git repository: |
| # - associate with codereview/rietveld |
| # - set the repository's email address |
| # - disable crlf munging |
| # - grab a stock .gclient file |
| function git_config { |
| echo -n "Associating with Rietveld... " |
| (cd src && git cl config http://src.chromium.org/svn/) |
| echo OK |
| |
| echo -n "Configuring email address... " |
| (cd src && git config user.email "${EMAIL}") |
| echo OK |
| |
| echo -n "Disabling crlf munging... " |
| (cd src && git config --global core.autocrlf false) |
| echo OK |
| |
| echo -n "Creating a .gclient file... " |
| gclient config http://src.chromium.org/svn/trunk/src |
| echo OK |
| } |
| |
| get_email |
| check_dirs |
| test_git |
| test_git_svn |
| test_git_url |
| cr_git_clone |
| cr_git_svn_init |
| cr_git_svn_fetch |
| git_config |
| |
| echo |
| echo "A Chromium Git repository was created in 'src'." |
| echo |
| echo " To create a CL..." |
| echo " Update: git pull && gclient sync" |
| echo " Create and use a branch mychange: git checkout -q -b mychange origin" |
| echo " Edit files and commit: git commit -a -v" |
| echo " Upload CL: git cl upload" |
| echo " Try a change: git try origin" |
| echo " Commit a CL: git cl dcommit" |
| echo " Switch to the trunk: git checkout trunk" |
| echo " Delete a branch mychange: git branch -d mychange" |
| echo |
| echo " If while on a branch you need to switch back to the trunk..." |
| echo " Switch to the trunk: git checkout trunk" |
| echo " List all branches: git branch" |
| echo " Switch to branch mychange: git checkout mychange" |
| echo |
| echo " Examining files and changes..." |
| echo " Log with patches: git log -p" |
| echo " Changes to DEPS: git log -p DEPS" |
| echo " View latest commit: git cat-file commit HEAD" |
| echo |
| echo "You should run: gclient sync" |
| echo |
| trap cleanup EXIT |