#!/usr/bin/env python # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. import argparse import datetime import os import re import shutil import tarfile import urllib from subprocess import Popen, PIPE, STDOUT def prepare_upstream(base, commit): upstream_url = 'https://chromium.googlesource.com/libyuv/libyuv' tarball_file = os.path.join(base, 'libyuv.tar.gz') lib_path = os.path.join(base, 'libyuv') print(upstream_url + '/+archive/' + commit + '.tar.gz') urllib.urlretrieve(upstream_url + '/+archive/' + commit + '.tar.gz', tarball_file) shutil.rmtree(lib_path) tarfile.open(tarball_file).extractall(path=lib_path) os.remove(tarball_file) shutil.copy2(os.path.join(lib_path, "LICENSE"), os.path.join(base, "LICENSE")) def get_commit_date(commit): upstream_url = 'https://chromium.googlesource.com/libyuv/libyuv/+/' + commit text = urllib.urlopen(upstream_url).read() regex = r'committer' \ r'.+[^\s]+ ([0-9a-zA-Z: ]+)\s*\+*[0-9]*' date = re.search(regex, text).group(1) return datetime.datetime.strptime(date, "%b %d %H:%M:%S %Y") def cleanup_upstream(base): os.remove(os.path.join(base, 'libyuv/.gitignore')) def apply_patches(base): patches = [ # update gyp build files "update_gyp.patch", # fix build errors 'fix_build_errors.patch', # make mjpeg printfs optional at build time 'make_mjpeg_printfs_optional.patch', # allow disabling of inline ASM and AVX2 code 'allow_disabling_asm_avx2.patch', # add H444ToARGB() variant 'add_H444ToARGB.patch', # fix the x86 mingw-clang build 'bug_1491848.patch', ] for patch in patches: print('\nApplying patch %s' % patch) with open(os.path.join(base, patch)) as f: Popen(["patch", "-p3"], stdin=f, cwd=base).wait() def update_moz_yaml(base, commit, commitdate): moz_yaml_file = os.path.join(base, 'moz.yaml') with open(moz_yaml_file) as f: moz_yaml = f.read() new_moz_yaml = re.sub(r'\n\s+release:.+\n', '\n release: "%s (%s)"\n' % (commit, commitdate), moz_yaml) if moz_yaml != new_moz_yaml: with open(moz_yaml_file, 'w') as f: f.write(new_moz_yaml) def main(): parser = argparse.ArgumentParser(description='Update libyuv') parser.add_argument('--no-patches', dest='no_patches', action="store_true") parser.add_argument('--commit', dest='commit', default='master') args = parser.parse_args() commit = args.commit no_patches = args.no_patches base = os.path.realpath(os.path.dirname(__file__)) prepare_upstream(base, commit) commitdate = get_commit_date(commit) if not no_patches: apply_patches(base) update_moz_yaml(base, commit, commitdate) print('\nPatches applied; ' 'run "hg addremove --similarity 70 libyuv" before committing changes') cleanup_upstream(base) if __name__ == '__main__': main()