Index: tools/release/backport_node.py |
diff --git a/tools/release/backport_node.py b/tools/release/backport_node.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..61a931aa03452e18f07c55b63f0c7cf309ad648b |
--- /dev/null |
+++ b/tools/release/backport_node.py |
@@ -0,0 +1,96 @@ |
+#!/usr/bin/env python |
+# Copyright 2017 the V8 project authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+""" |
+Use this script to cherry-pick a V8 commit to backport to a Node.js checkout. |
+ |
+Requirements: |
+ - Node.js checkout to backport to. |
+ - V8 checkout that contains the commit to cherry-pick. |
+ |
+Usage: |
+ $ backport_node.py <path_to_v8> <path_to_node> <commit-hash> |
+ |
+ This will apply the commit to <path_to_node>/deps/v8 and create a commit in |
+ the Node.js checkout and copy over the original commit message. |
+ |
+Optional flags: |
+ --no-review Run `gclient sync` on the V8 checkout before updating. |
+""" |
+ |
+import argparse |
+import os |
+import subprocess |
+import sys |
+ |
+TARGET_SUBDIR = os.path.join("deps", "v8") |
+ |
+def CherryPick(options): |
+ print ">> Apply patch." |
+ patch = subprocess.Popen(["git", "diff-tree", "-p", options.commit], |
+ stdout=subprocess.PIPE, cwd=options.v8_path) |
+ patch.wait() |
+ try: |
+ subprocess.check_output(["git", "apply", "-3", "--directory=%s" % TARGET_SUBDIR], |
+ stdin=patch.stdout, cwd=options.node_path) |
+ except: |
+ print ">> In another shell, please resolve patch conflicts" |
+ print ">> and `git add` affected files." |
+ print ">> Finally continue by entering RESOLVED." |
+ while raw_input("[RESOLVED]") != "RESOLVED": |
+ print ">> You need to type RESOLVED" |
+ |
+def CreateCommit(options): |
+ print ">> Creating commit." |
+ # Find short hash from source. |
+ shorthash = subprocess.check_output( |
+ ["git", "rev-parse", "--short", options.commit], |
+ cwd=options.v8_path).strip() |
+ |
+ # Commit message |
+ title = "deps: backport %s from upstream V8" % shorthash |
+ body = subprocess.check_output( |
+ ["git", "log", options.commit, "-1", "--format=%B"], |
+ cwd=options.v8_path).strip() |
+ body = '\n'.join(" " + line for line in body.splitlines()) |
+ |
+ message = title + "\n\nOriginal commit message:\n\n" + body |
+ |
+ # Create commit at target. |
+ review_message = "" if options.no_review else "-e" |
+ git_commands = [ |
+ ["git", "checkout", "-b", "backport_%s" % shorthash], # new branch |
+ ["git", "add", TARGET_SUBDIR], # add files |
+ ["git", "commit", "-m", message, review_message] # new commit |
+ ] |
+ for command in git_commands: |
+ subprocess.check_call(command, cwd=options.node_path) |
+ |
+def ParseOptions(args): |
+ parser = argparse.ArgumentParser(description="Backport V8 commit to Node.js") |
+ parser.add_argument("v8_path", help="Path to V8 checkout") |
+ parser.add_argument("node_path", help="Path to Node.js checkout") |
+ parser.add_argument("commit", help="Commit to backport") |
+ parser.add_argument("--no-review", action="store_true", |
+ help="Skip editing commit message") |
+ options = parser.parse_args(args) |
+ options.v8_path = os.path.abspath(options.v8_path) |
+ assert os.path.isdir(options.v8_path) |
+ options.node_path = os.path.abspath(options.node_path) |
+ assert os.path.isdir(options.node_path) |
+ return options |
+ |
+def Main(args): |
+ options = ParseOptions(args) |
+ try: |
+ CherryPick(options) |
+ CreateCommit(options) |
+ except: |
+ print ">> Failed. Resetting." |
+ subprocess.check_output(["git", "reset", "--hard"], cwd=options.node_path) |
+ raise |
+ |
+if __name__ == "__main__": |
+ Main(sys.argv[1:]) |