141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org#!/bin/bash
241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# Copyright 2013 the V8 project authors. All rights reserved.
341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# Redistribution and use in source and binary forms, with or without
441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# modification, are permitted provided that the following conditions are
541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# met:
641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org#
741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org#     * Redistributions of source code must retain the above copyright
841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org#       notice, this list of conditions and the following disclaimer.
941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org#     * Redistributions in binary form must reproduce the above
1041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org#       copyright notice, this list of conditions and the following
1141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org#       disclaimer in the documentation and/or other materials provided
1241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org#       with the distribution.
1341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org#     * Neither the name of Google Inc. nor the names of its
1441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org#       contributors may be used to endorse or promote products derived
1541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org#       from this software without specific prior written permission.
1641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org#
1741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
2941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
3041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org########## Global variable definitions
3141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
3241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgBASE_URL="https://code.google.com/p/v8/source/list"
3341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgVERSION="src/version.cc"
3441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgMAJOR="MAJOR_VERSION"
3541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgMINOR="MINOR_VERSION"
3641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgBUILD="BUILD_NUMBER"
3741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgPATCH="PATCH_LEVEL"
3841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
3941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgV8="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
4041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
4141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org########## Function definitions
4241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
4341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgcd $V8
4441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
4541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgusage() {
4641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgcat << EOF
4741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgusage: $0 OPTIONS
4841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
4941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgFetches V8 revision information from a git-svn checkout.
5041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
5141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgOPTIONS:
5241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  -h    Show this message.
5341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
5441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  -i    Print revision info for all branches matching the V8 version.
5541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org          Example usage: $0 -i 3.19.10$
5641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org          Output format: [Git hash] [SVN revision] [V8 version]
5741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
5841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  -v    Print the V8 version tag for a trunk SVN revision.
5941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org          Example usage: $0 -v 14981
6041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org          Output format: [V8 version]
6141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
6241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  -m    Print all patches that were merged to the specified V8 branch.
6341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org          Example usage: $0 -m 3.18
6441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org          Output format: [V8 version] [SVN revision] [SVN patch merged]*.
6541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
6641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  -p    Print all patches merged to a specific V8 point-release.
6741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org          Example usage: $0 -p 3.19.12.1
6841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org          Output format: [SVN patch merged]*
6941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
7041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  -u    Print a link to all SVN revisions between two V8 revision tags.
7141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org          Example usage: $0 -u 3.19.10:3.19.11
7241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgEOF
7341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
7441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
7541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgtags() {
7641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  git for-each-ref --format="%(objectname) %(refname:short)" refs/remotes/svn
7741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
7841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
7941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgtag_revision() {
8041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  cut -d" " -f1
8141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
8241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
8341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgtag_log() {
8441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  git log --format="%h %ci %ce %s" -1 $1
8541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
8641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
8741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgv8_hash() {
8841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  tags | grep "svn/tags/$1$" | tag_revision
8941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
9041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
9141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgpoint_merges() {
9241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  echo $1 | grep -o "r[0-9]\+"
9341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
9441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
9541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orghash_to_svn() {
9641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  git svn log -1 --oneline $1 | cut -d" " -f1
9741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
9841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
9941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgtag_version() {
10041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  tags | grep svn/tags/$1 | while read tag; do
10141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    id=$(echo $tag | grep -o "[^/]*$")
10241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    rev=$(echo $tag | tag_revision)
10341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    svn=$(hash_to_svn $rev)
10441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    echo $rev $svn $id
10541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  done
10641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
10741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
10841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgsvn_rev() {
10941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  git svn find-rev $2 svn/$1
11041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
11141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
11241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgv8_rev() {
11341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  cd $(git rev-parse --show-toplevel)
11441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  rev=$(git show $1:$VERSION \
11541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      | grep "#define" \
11641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      | grep "$MAJOR\|$MINOR\|$BUILD\|$PATCH" \
11741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      | grep -o "[0-9]\+$" \
11841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      | tr "\\n" ".")
11941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  echo ${rev%?}
12041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
12141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
12241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgmerges_to_branch() {
12341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  git cherry -v svn/trunk svn/$1 | while read merge; do
12441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    h=$(echo $merge | cut -d" " -f2)
12541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    svn=$(svn_rev $1 $h)
12641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    merges=$(echo $merge | grep -o "r[0-9]\+")
12741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    rev=$(v8_rev $h)
12841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    echo $rev r$svn $merges
12941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  done
13041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
13141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
13241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgurl_for() {
13341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  first=$(svn_rev trunk $(v8_hash $(echo $1 | cut -d":" -f1)))
13441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  last=$(svn_rev trunk $(v8_hash $(echo $1 | cut -d":" -f2)))
13541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  num=$[ $last - $first]
13641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  echo "$BASE_URL?num=$num&start=$last"
13741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
13841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
13941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org########## Option parsing
14041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
14141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgwhile getopts ":hi:v:m:p:u:" OPTION ; do
14241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  case $OPTION in
14341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    h)  usage
14441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org        exit 0
14541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org        ;;
14641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    i)  tag_version $OPTARG
14741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org        ;;
14841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    v)  v8_rev $(svn_rev trunk r$OPTARG)
14941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org        ;;
15041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    m)  merges_to_branch $OPTARG
15141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org        ;;
15241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    p)  echo $(point_merges "$(tag_log $(v8_hash $OPTARG)^1)")
15341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org        ;;
15441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    u)  url_for $OPTARG
15541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org        ;;
15641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org    ?)  echo "Illegal option: -$OPTARG"
15741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org        usage
15841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org        exit 1
15941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org        ;;
16041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  esac
16141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgdone
162