Add recipe for v8

BUG=none
R=dpranke@chromium.org,machenbach@chromium.org

Review URL: https://codereview.chromium.org/225743005

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@268466 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/fetch.py b/fetch.py
index 5d595f4..d3bcacd 100755
--- a/fetch.py
+++ b/fetch.py
@@ -111,10 +111,12 @@
   def init(self):
     # Configure and do the gclient checkout.
     self.run_gclient('config', '--spec', self.spec['gclient_spec'])
+    sync_cmd = ['sync']
     if self.options.nohooks:
-      self.run_gclient('sync', '--nohooks')
-    else:
-      self.run_gclient('sync')
+      sync_cmd.append('--nohooks')
+    if self.spec.get('with_branch_heads', False):
+      sync_cmd.append('--with_branch_heads')
+    self.run_gclient(*sync_cmd)
 
     # Configure git.
     wd = os.path.join(self.base, self.root)
@@ -159,10 +161,11 @@
       wd = os.path.join(self.base, real_path)
       if self.options.dry_run:
         print 'cd %s' % wd
-      self.run_git('svn', 'init', '--prefix=origin/', '-T',
+      prefix = svn_spec.get('svn_prefix', 'origin/')
+      self.run_git('svn', 'init', '--prefix=' + prefix, '-T',
                    svn_spec['svn_branch'], svn_spec['svn_url'], cwd=wd)
       self.run_git('config', '--replace', 'svn-remote.svn.fetch',
-                   svn_spec['svn_branch'] + ':refs/remotes/origin/' +
+                   svn_spec['svn_branch'] + ':refs/remotes/' + prefix +
                    svn_spec['svn_ref'], cwd=wd)
       self.run_git('svn', 'fetch', cwd=wd)
 
diff --git a/gclient_scm.py b/gclient_scm.py
index e17702c..b0ca582 100644
--- a/gclient_scm.py
+++ b/gclient_scm.py
@@ -358,6 +358,10 @@
         self._DeleteOrMove(options.force)
         self._Clone(revision, url, options)
       self._UpdateBranchHeads(options, fetch=True)
+      if deps_revision and deps_revision.startswith('branch-heads/'):
+        deps_branch = deps_revision.replace('branch-heads/', '')
+        self._Capture(['branch', deps_branch, deps_revision])
+        self._Capture(['checkout', '--quiet', deps_branch])
       if file_list is not None:
         files = self._Capture(['ls-files']).splitlines()
         file_list.extend([os.path.join(self.checkout_path, f) for f in files])
diff --git a/recipes/v8.py b/recipes/v8.py
new file mode 100644
index 0000000..bfa7916
--- /dev/null
+++ b/recipes/v8.py
@@ -0,0 +1,53 @@
+# Copyright 2014 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.
+
+import sys
+
+import recipe_util  # pylint: disable=F0401
+
+
+# This class doesn't need an __init__ method, so we disable the warning
+# pylint: disable=W0232
+class V8(recipe_util.Recipe):
+  """Basic Recipe class for V8."""
+
+  @staticmethod
+  def fetch_spec(props):
+    ref = 'branch-heads/bleeding_edge'
+    url = 'https://chromium.googlesource.com/external/v8.git@%s' % ref
+    solution = { 'name'   :'v8',
+                 'url'    : url,
+                 'deps_file': '.DEPS.git',
+                 'managed'   : False,
+                 'custom_deps': {},
+                 'safesync_url': '',
+    }
+    spec = {
+      'solutions': [solution],
+      'svn_url': 'https://v8.googlecode.com/svn',
+      'svn_branch': 'branches/bleeding_edge',
+      'svn_ref': 'bleeding_edge',
+      'svn_prefix': 'branch-heads/',
+      'with_branch_heads': True,
+    }
+    checkout_type = 'gclient_git_svn'
+    if props.get('nosvn'):
+      checkout_type = 'gclient_git'
+    spec_type = '%s_spec' % checkout_type
+    return {
+      'type': checkout_type,
+      spec_type: spec,
+    }
+
+  @staticmethod
+  def expected_root(_props):
+    return 'v8'
+
+
+def main(argv=None):
+  return V8().handle_args(argv)
+
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv))