Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Unified Diff: tools/release/backport_node.py

Issue 2838843002: [tools] add script to simplify backporting patch to Node.js (Closed)
Patch Set: address comments Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tools/release/test_backport_node.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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:])
« no previous file with comments | « no previous file | tools/release/test_backport_node.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698