Commit a522da39 authored by Peter Marshall's avatar Peter Marshall Committed by Commit Bot

[tools] Remove node backport script and leave a readme

There is a better maintained script in node-code-utils which properly
bumps the version numbers for each of the LTS branches, which is more
useful. Node collaborators also use this script, so it will make
backports more uniform.

Change-Id: If5449b8a801c4bd14f39d59b7af52cc959989be7
Reviewed-on: https://chromium-review.googlesource.com/c/1328927Reviewed-by: 's avatarYang Guo <yangguo@chromium.org>
Commit-Queue: Peter Marshall <petermarshall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#57393}
parent aa351c24
# Node.js Backports
We no longer maintain our own backport script.
For backporting V8 changes to Node.js, there is a useful script in
[node-core-utils][1]. You can use the `git node v8 backport` command, which will
bump the necessary V8 version numbers depending on the specific branch.
See the [Node.js documentation][2] on V8 backports for a guide.
[1]: https://github.com/nodejs/node-core-utils
[2]: https://github.com/nodejs/node/blob/master/doc/guides/maintaining-V8.md
#!/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, increment patch level, 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 re
import sys
TARGET_SUBDIR = os.path.join("deps", "v8")
VERSION_FILE = os.path.join("include", "v8-version.h")
VERSION_PATTERN = r'(?<=#define V8_PATCH_LEVEL )\d+'
def FileToText(file_name):
with open(file_name) as f:
return f.read()
def TextToFile(text, file_name):
with open(file_name, "w") as f:
f.write(text)
def Clean(options):
print ">> Cleaning target directory."
subprocess.check_call(["git", "clean", "-fd"],
cwd = os.path.join(options.node_path, TARGET_SUBDIR))
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 UpdateVersion(options):
print ">> Increment patch level."
version_file = os.path.join(options.node_path, TARGET_SUBDIR, VERSION_FILE)
text = FileToText(version_file)
def increment(match):
patch = int(match.group(0))
return str(patch + 1)
text = re.sub(VERSION_PATTERN, increment, text, flags=re.MULTILINE)
TextToFile(text, version_file)
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 = "--no-edit" if options.no_review else "--edit"
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)
Clean(options)
try:
CherryPick(options)
UpdateVersion(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:])
#!/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.
import os
import shutil
import subprocess
import sys
import tempfile
import unittest
import backport_node
# Base paths.
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
TEST_DATA = os.path.join(BASE_DIR, 'testdata')
def gitify(path):
files = os.listdir(path)
subprocess.check_call(['git', 'init'], cwd=path)
subprocess.check_call(['git', 'add'] + files, cwd=path)
subprocess.check_call(['git', 'commit', '-m', 'Initial'], cwd=path)
class TestUpdateNode(unittest.TestCase):
def setUp(self):
self.workdir = tempfile.mkdtemp(prefix='tmp_test_node_')
def tearDown(self):
shutil.rmtree(self.workdir)
def testUpdate(self):
v8_cwd = os.path.join(self.workdir, 'v8')
node_cwd = os.path.join(self.workdir, 'node')
# Set up V8 test fixture.
shutil.copytree(src=os.path.join(TEST_DATA, 'v8'), dst=v8_cwd)
gitify(v8_cwd)
# Set up node test fixture.
shutil.copytree(src=os.path.join(TEST_DATA, 'node'), dst=node_cwd)
gitify(os.path.join(node_cwd))
# Add a patch.
with open(os.path.join(v8_cwd, 'v8_foo'), 'w') as f:
f.write('zonk')
subprocess.check_call(['git', 'add', 'v8_foo'], cwd=v8_cwd)
subprocess.check_call(['git', 'commit', '-m', "Title\n\nBody"], cwd=v8_cwd)
commit = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=v8_cwd).strip()
# Run update script.
backport_node.Main([v8_cwd, node_cwd, commit, "--no-review"])
# Check message.
message = subprocess.check_output(['git', 'log', '-1', '--format=%B'], cwd=node_cwd)
self.assertIn('Original commit message:\n\n Title\n\n Body', message)
# Check patch.
gitlog = subprocess.check_output(
['git', 'diff', 'master', '--cached', '--', 'deps/v8/v8_foo'],
cwd=node_cwd,
)
self.assertIn('+zonk', gitlog.strip())
# Check version.
version_file = os.path.join(node_cwd, "deps", "v8", "include", "v8-version.h")
self.assertIn('#define V8_PATCH_LEVEL 4322', backport_node.FileToText(version_file))
if __name__ == "__main__":
unittest.main()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment