blob: 6962088ee98734f01c701b59dd3db1df661bc0c5 [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Update our pinned copy of node to match Chromium."""
import logging
import re
import sys
import libdot
# Where in Chromium's tree they maintain their hashes.
URI_BASE = ('https://chromium.googlesource.com/chromium/src/+/HEAD/'
'third_party/node')
URI_LIN = '/'.join((URI_BASE, 'linux', 'node-linux-x64.tar.gz.sha1'))
URI_MAC = '/'.join((URI_BASE, 'mac', 'node-darwin-x64.tar.gz.sha1'))
URI_WIN = '/'.join((URI_BASE, 'win', 'node.exe.sha1'))
# File which records the node hashes.
HASH_FILE = libdot.BIN_DIR / 'node'
def update(uri, var):
"""Update |var| in our tree with the hash data from |uri|."""
new_hash = fetch_data(uri)
logging.info('Updating %s with hash %s', var, new_hash)
# Read the current file.
lines = HASH_FILE.read_text(encoding='utf-8').splitlines()
# Try to update the variable in the file.
matcher = re.compile(r"%s = '(.*)'" % (var,))
for i, line in enumerate(lines):
match = matcher.match(line)
if match:
old_hash = match.group(1)
if new_hash != old_hash:
logging.info(' Old hash was %s', old_hash)
lines[i] = f"{var} = '{new_hash}'"
break
else:
logging.info(' Hash up-to-date already')
return
else:
logging.error('Unable to locate %s setting in %s', var, HASH_FILE)
sys.exit(1)
# Write out the new file content.
HASH_FILE.write_text('\n'.join(lines) + '\n', encoding='utf-8')
def fetch_data(uri):
"""Read the gitiles base64 encoded data from |uri|."""
data = libdot.fetch_data(f'{uri}?format=TEXT', b64=True)
return data.getvalue().decode('utf-8').strip()
def get_parser():
"""Get a command line parser."""
parser = libdot.ArgumentParser(description=__doc__)
return parser
def main(argv):
"""The main func!"""
parser = get_parser()
_opts = parser.parse_args(argv)
update(URI_LIN, 'NODE_LINUX_HASH')
update(URI_MAC, 'NODE_MAC_HASH')
update(URI_WIN, 'NODE_WIN_HASH')
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))