#!/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
