xref: /aosp_15_r20/external/cronet/third_party/libxml/chromium/roll.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6777b538SAndroid Build Coastguard Worker
3*6777b538SAndroid Build Coastguard Worker# Copyright 2017 The Chromium Authors
4*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
5*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Workerimport argparse
8*6777b538SAndroid Build Coastguard Workerimport os
9*6777b538SAndroid Build Coastguard Workerimport os.path
10*6777b538SAndroid Build Coastguard Workerimport shutil
11*6777b538SAndroid Build Coastguard Workerimport subprocess
12*6777b538SAndroid Build Coastguard Workerimport sys
13*6777b538SAndroid Build Coastguard Workerimport stat
14*6777b538SAndroid Build Coastguard Workerimport tempfile
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker# How to patch libxml2 in Chromium:
17*6777b538SAndroid Build Coastguard Worker#
18*6777b538SAndroid Build Coastguard Worker# 1. Write a .patch file and add it to third_party/libxml/chromium.
19*6777b538SAndroid Build Coastguard Worker# 2. Apply the patch in src: patch -p1 <../chromium/foo.patch
20*6777b538SAndroid Build Coastguard Worker# 3. Add the patch to the list of patches in this file.
21*6777b538SAndroid Build Coastguard Worker# 4. Update README.chromium with the provenance of the patch.
22*6777b538SAndroid Build Coastguard Worker# 5. Upload a change with the modified documentation, roll script,
23*6777b538SAndroid Build Coastguard Worker#    patch, applied patch and any other relevant changes like
24*6777b538SAndroid Build Coastguard Worker#    regression tests. Go through the usual review and commit process.
25*6777b538SAndroid Build Coastguard Worker#
26*6777b538SAndroid Build Coastguard Worker# How to roll libxml2 in Chromium:
27*6777b538SAndroid Build Coastguard Worker#
28*6777b538SAndroid Build Coastguard Worker# Prerequisites:
29*6777b538SAndroid Build Coastguard Worker#
30*6777b538SAndroid Build Coastguard Worker# 1. Check out Chromium somewhere on Linux, Mac and Windows.
31*6777b538SAndroid Build Coastguard Worker# 2. On Linux:
32*6777b538SAndroid Build Coastguard Worker#    a. sudo apt-get install libicu-dev
33*6777b538SAndroid Build Coastguard Worker#    b. git clone https://github.com/GNOME/libxml2.git somewhere
34*6777b538SAndroid Build Coastguard Worker# 3. On Mac, install these packages with brew:
35*6777b538SAndroid Build Coastguard Worker#      autoconf automake libtool pkgconfig icu4c
36*6777b538SAndroid Build Coastguard Worker#
37*6777b538SAndroid Build Coastguard Worker# Procedure:
38*6777b538SAndroid Build Coastguard Worker#
39*6777b538SAndroid Build Coastguard Worker# Warning: This process is destructive. Run it on a clean branch.
40*6777b538SAndroid Build Coastguard Worker#
41*6777b538SAndroid Build Coastguard Worker# 1. On Linux, in the libxml2 repo directory:
42*6777b538SAndroid Build Coastguard Worker#    a. git remote update origin
43*6777b538SAndroid Build Coastguard Worker#    b. git checkout origin/master
44*6777b538SAndroid Build Coastguard Worker#
45*6777b538SAndroid Build Coastguard Worker#    This will be the upstream version of libxml you are rolling to.
46*6777b538SAndroid Build Coastguard Worker#
47*6777b538SAndroid Build Coastguard Worker# 2. On Linux, in the Chromium src director:
48*6777b538SAndroid Build Coastguard Worker#    a. third_party/libxml/chromium/roll.py --linux /path/to/libxml2
49*6777b538SAndroid Build Coastguard Worker#
50*6777b538SAndroid Build Coastguard Worker#    If this fails, it may be a patch no longer applies. Reset to
51*6777b538SAndroid Build Coastguard Worker#    head; modify the patch files, this script, and
52*6777b538SAndroid Build Coastguard Worker#    README.chromium; then commit the result and run it again.
53*6777b538SAndroid Build Coastguard Worker#
54*6777b538SAndroid Build Coastguard Worker#    b. Upload a CL, but do not Start Review.
55*6777b538SAndroid Build Coastguard Worker#
56*6777b538SAndroid Build Coastguard Worker# 2. On Windows, in the Chromium src directory:
57*6777b538SAndroid Build Coastguard Worker#    a. git cl patch <Gerrit Issue ID>
58*6777b538SAndroid Build Coastguard Worker#    b. third_party\libxml\chromium\roll.py --win32
59*6777b538SAndroid Build Coastguard Worker#    c. git cl upload
60*6777b538SAndroid Build Coastguard Worker#
61*6777b538SAndroid Build Coastguard Worker# 3. On Mac, in the Chromium src directory:
62*6777b538SAndroid Build Coastguard Worker#    a. git cl patch <Gerrit Issue ID>
63*6777b538SAndroid Build Coastguard Worker#    b. third_party/libxml/chromium/roll.py --mac --icu4c_path=~/homebrew/opt/icu4c
64*6777b538SAndroid Build Coastguard Worker#    c. Make and commit any final changes to README.chromium, BUILD.gn, etc.
65*6777b538SAndroid Build Coastguard Worker#    d. git cl upload
66*6777b538SAndroid Build Coastguard Worker#    e. Complete the review as usual
67*6777b538SAndroid Build Coastguard Worker#
68*6777b538SAndroid Build Coastguard Worker# The --linuxfast argument is an alternative to --linux which also deletes
69*6777b538SAndroid Build Coastguard Worker# files which are not intended to be checked in. This would normally happen at
70*6777b538SAndroid Build Coastguard Worker# the end of the --mac run, but if you want to run the roll script and get to
71*6777b538SAndroid Build Coastguard Worker# the final state without running the configure scripts on all three platforms,
72*6777b538SAndroid Build Coastguard Worker# this is helpful.
73*6777b538SAndroid Build Coastguard Worker
74*6777b538SAndroid Build Coastguard WorkerPATCHES = [
75*6777b538SAndroid Build Coastguard Worker    'undo-sax-deprecation.patch',
76*6777b538SAndroid Build Coastguard Worker    'remove-getentropy.patch',
77*6777b538SAndroid Build Coastguard Worker]
78*6777b538SAndroid Build Coastguard Worker
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker# See libxml2 configure.ac and win32/configure.js to learn what
81*6777b538SAndroid Build Coastguard Worker# options are available. We include every option here to more easily track
82*6777b538SAndroid Build Coastguard Worker# changes from one version to the next, and to be sure we only include what
83*6777b538SAndroid Build Coastguard Worker# we need.
84*6777b538SAndroid Build Coastguard Worker# These two sets of options should be in sync. You can check the
85*6777b538SAndroid Build Coastguard Worker# generated #defines in (win32|mac|linux)/include/libxml/xmlversion.h to confirm
86*6777b538SAndroid Build Coastguard Worker# this.
87*6777b538SAndroid Build Coastguard Worker# We would like to disable python but it introduces a host of build errors
88*6777b538SAndroid Build Coastguard WorkerSHARED_XML_CONFIGURE_OPTIONS = [
89*6777b538SAndroid Build Coastguard Worker    # These options are turned ON
90*6777b538SAndroid Build Coastguard Worker    ('--with-html', 'html=yes'),
91*6777b538SAndroid Build Coastguard Worker    ('--with-icu', 'icu=yes'),
92*6777b538SAndroid Build Coastguard Worker    ('--with-output', 'output=yes'),
93*6777b538SAndroid Build Coastguard Worker    ('--with-push', 'push=yes'),
94*6777b538SAndroid Build Coastguard Worker    ('--with-python', 'python=yes'),
95*6777b538SAndroid Build Coastguard Worker    ('--with-reader', 'reader=yes'),
96*6777b538SAndroid Build Coastguard Worker    ('--with-sax1', 'sax1=yes'),
97*6777b538SAndroid Build Coastguard Worker    ('--with-threads', 'threads=yes'),
98*6777b538SAndroid Build Coastguard Worker    ('--with-tree', 'tree=yes'),
99*6777b538SAndroid Build Coastguard Worker    ('--with-writer', 'writer=yes'),
100*6777b538SAndroid Build Coastguard Worker    ('--with-xpath', 'xpath=yes'),
101*6777b538SAndroid Build Coastguard Worker    # These options are turned OFF
102*6777b538SAndroid Build Coastguard Worker    ('--without-c14n', 'c14n=no'),
103*6777b538SAndroid Build Coastguard Worker    ('--without-catalog', 'catalog=no'),
104*6777b538SAndroid Build Coastguard Worker    ('--without-debug', 'xml_debug=no'),
105*6777b538SAndroid Build Coastguard Worker    ('--without-ftp', 'ftp=no'),
106*6777b538SAndroid Build Coastguard Worker    ('--without-http', 'http=no'),
107*6777b538SAndroid Build Coastguard Worker    ('--without-iconv', 'iconv=no'),
108*6777b538SAndroid Build Coastguard Worker    ('--without-iso8859x', 'iso8859x=no'),
109*6777b538SAndroid Build Coastguard Worker    ('--without-legacy', 'legacy=no'),
110*6777b538SAndroid Build Coastguard Worker    ('--without-lzma', 'lzma=no'),
111*6777b538SAndroid Build Coastguard Worker    ('--without-mem-debug', 'mem_debug=no'),
112*6777b538SAndroid Build Coastguard Worker    ('--without-modules', 'modules=no'),
113*6777b538SAndroid Build Coastguard Worker    ('--without-pattern', 'pattern=no'),
114*6777b538SAndroid Build Coastguard Worker    ('--without-regexps', 'regexps=no'),
115*6777b538SAndroid Build Coastguard Worker    ('--without-schemas', 'schemas=no'),
116*6777b538SAndroid Build Coastguard Worker    ('--without-schematron', 'schematron=no'),
117*6777b538SAndroid Build Coastguard Worker    ('--without-valid', 'valid=no'),
118*6777b538SAndroid Build Coastguard Worker    ('--without-xinclude', 'xinclude=no'),
119*6777b538SAndroid Build Coastguard Worker    ('--without-xptr', 'xptr=no'),
120*6777b538SAndroid Build Coastguard Worker    ('--without-xptr-locs', 'xptr_locs=no'),
121*6777b538SAndroid Build Coastguard Worker    ('--without-zlib', 'zlib=no'),
122*6777b538SAndroid Build Coastguard Worker]
123*6777b538SAndroid Build Coastguard Worker
124*6777b538SAndroid Build Coastguard Worker
125*6777b538SAndroid Build Coastguard Worker# These options are only available in configure.ac for Linux and Mac.
126*6777b538SAndroid Build Coastguard WorkerEXTRA_NIX_XML_CONFIGURE_OPTIONS = [
127*6777b538SAndroid Build Coastguard Worker    '--without-fexceptions',
128*6777b538SAndroid Build Coastguard Worker    '--without-minimum',
129*6777b538SAndroid Build Coastguard Worker    '--without-readline',
130*6777b538SAndroid Build Coastguard Worker    '--without-history',
131*6777b538SAndroid Build Coastguard Worker    '--without-tls',
132*6777b538SAndroid Build Coastguard Worker]
133*6777b538SAndroid Build Coastguard Worker
134*6777b538SAndroid Build Coastguard Worker
135*6777b538SAndroid Build Coastguard Worker# These options are only available in win32/configure.js for Windows.
136*6777b538SAndroid Build Coastguard WorkerEXTRA_WIN32_XML_CONFIGURE_OPTIONS = [
137*6777b538SAndroid Build Coastguard Worker    'walker=no',
138*6777b538SAndroid Build Coastguard Worker]
139*6777b538SAndroid Build Coastguard Worker
140*6777b538SAndroid Build Coastguard Worker
141*6777b538SAndroid Build Coastguard WorkerXML_CONFIGURE_OPTIONS = (
142*6777b538SAndroid Build Coastguard Worker    [option[0] for option in SHARED_XML_CONFIGURE_OPTIONS] +
143*6777b538SAndroid Build Coastguard Worker    EXTRA_NIX_XML_CONFIGURE_OPTIONS)
144*6777b538SAndroid Build Coastguard Worker
145*6777b538SAndroid Build Coastguard Worker
146*6777b538SAndroid Build Coastguard WorkerXML_WIN32_CONFIGURE_OPTIONS = (
147*6777b538SAndroid Build Coastguard Worker    [option[1] for option in SHARED_XML_CONFIGURE_OPTIONS] +
148*6777b538SAndroid Build Coastguard Worker    EXTRA_WIN32_XML_CONFIGURE_OPTIONS)
149*6777b538SAndroid Build Coastguard Worker
150*6777b538SAndroid Build Coastguard Worker
151*6777b538SAndroid Build Coastguard WorkerFILES_TO_REMOVE = [
152*6777b538SAndroid Build Coastguard Worker    'src/DOCBparser.c',
153*6777b538SAndroid Build Coastguard Worker    'src/HACKING',
154*6777b538SAndroid Build Coastguard Worker    'src/INSTALL',
155*6777b538SAndroid Build Coastguard Worker    'src/INSTALL.libxml2',
156*6777b538SAndroid Build Coastguard Worker    'src/MAINTAINERS',
157*6777b538SAndroid Build Coastguard Worker    'src/Makefile.in',
158*6777b538SAndroid Build Coastguard Worker    'src/Makefile.win',
159*6777b538SAndroid Build Coastguard Worker    'src/README.cvs-commits',
160*6777b538SAndroid Build Coastguard Worker    # This is unneeded "legacy" SAX API, even though we enable SAX1.
161*6777b538SAndroid Build Coastguard Worker    'src/SAX.c',
162*6777b538SAndroid Build Coastguard Worker    'src/VxWorks',
163*6777b538SAndroid Build Coastguard Worker    'src/aclocal.m4',
164*6777b538SAndroid Build Coastguard Worker    'src/autogen.sh',
165*6777b538SAndroid Build Coastguard Worker    'src/autom4te.cache',
166*6777b538SAndroid Build Coastguard Worker    'src/bakefile',
167*6777b538SAndroid Build Coastguard Worker    'src/build_glob.py',
168*6777b538SAndroid Build Coastguard Worker    'src/CMakeLists.txt',
169*6777b538SAndroid Build Coastguard Worker    'src/c14n.c',
170*6777b538SAndroid Build Coastguard Worker    'src/catalog.c',
171*6777b538SAndroid Build Coastguard Worker    'src/compile',
172*6777b538SAndroid Build Coastguard Worker    'src/config.guess',
173*6777b538SAndroid Build Coastguard Worker    'src/config.sub',
174*6777b538SAndroid Build Coastguard Worker    'src/configure',
175*6777b538SAndroid Build Coastguard Worker    'src/chvalid.def',
176*6777b538SAndroid Build Coastguard Worker    'src/debugXML.c',
177*6777b538SAndroid Build Coastguard Worker    'src/depcomp',
178*6777b538SAndroid Build Coastguard Worker    'src/doc',
179*6777b538SAndroid Build Coastguard Worker    'src/example',
180*6777b538SAndroid Build Coastguard Worker    'src/fuzz',
181*6777b538SAndroid Build Coastguard Worker    'src/genChRanges.py',
182*6777b538SAndroid Build Coastguard Worker    'src/global.data',
183*6777b538SAndroid Build Coastguard Worker    'src/include/libxml/Makefile.in',
184*6777b538SAndroid Build Coastguard Worker    'src/include/libxml/xmlversion.h',
185*6777b538SAndroid Build Coastguard Worker    'src/include/libxml/xmlwin32version.h',
186*6777b538SAndroid Build Coastguard Worker    'src/include/libxml/xmlwin32version.h.in',
187*6777b538SAndroid Build Coastguard Worker    'src/include/Makefile.in',
188*6777b538SAndroid Build Coastguard Worker    'src/install-sh',
189*6777b538SAndroid Build Coastguard Worker    'src/legacy.c',
190*6777b538SAndroid Build Coastguard Worker    'src/libxml2.doap',
191*6777b538SAndroid Build Coastguard Worker    'src/libxml2.syms',
192*6777b538SAndroid Build Coastguard Worker    'src/ltmain.sh',
193*6777b538SAndroid Build Coastguard Worker    'src/m4',
194*6777b538SAndroid Build Coastguard Worker    'src/macos/libxml2.mcp.xml.sit.hqx',
195*6777b538SAndroid Build Coastguard Worker    'src/missing',
196*6777b538SAndroid Build Coastguard Worker    'src/optim',
197*6777b538SAndroid Build Coastguard Worker    'src/os400',
198*6777b538SAndroid Build Coastguard Worker    'src/python',
199*6777b538SAndroid Build Coastguard Worker    'src/relaxng.c',
200*6777b538SAndroid Build Coastguard Worker    'src/result',
201*6777b538SAndroid Build Coastguard Worker    'src/rngparser.c',
202*6777b538SAndroid Build Coastguard Worker    'src/schematron.c',
203*6777b538SAndroid Build Coastguard Worker    'src/test',
204*6777b538SAndroid Build Coastguard Worker    'src/testOOM.c',
205*6777b538SAndroid Build Coastguard Worker    'src/testOOMlib.c',
206*6777b538SAndroid Build Coastguard Worker    'src/testOOMlib.h',
207*6777b538SAndroid Build Coastguard Worker    'src/vms',
208*6777b538SAndroid Build Coastguard Worker    'src/win32/VC10/config.h',
209*6777b538SAndroid Build Coastguard Worker    'src/win32/configure.js',
210*6777b538SAndroid Build Coastguard Worker    'src/win32/wince',
211*6777b538SAndroid Build Coastguard Worker    'src/xinclude.c',
212*6777b538SAndroid Build Coastguard Worker    'src/xlink.c',
213*6777b538SAndroid Build Coastguard Worker    'src/xml2-config.in',
214*6777b538SAndroid Build Coastguard Worker    'src/xmlcatalog.c',
215*6777b538SAndroid Build Coastguard Worker    'src/xmllint.c',
216*6777b538SAndroid Build Coastguard Worker    'src/xmlmodule.c',
217*6777b538SAndroid Build Coastguard Worker    'src/xmlregexp.c',
218*6777b538SAndroid Build Coastguard Worker    'src/xmlschemas.c',
219*6777b538SAndroid Build Coastguard Worker    'src/xmlschemastypes.c',
220*6777b538SAndroid Build Coastguard Worker    'src/xpointer.c',
221*6777b538SAndroid Build Coastguard Worker    'src/xstc',
222*6777b538SAndroid Build Coastguard Worker    'src/xzlib.c',
223*6777b538SAndroid Build Coastguard Worker    'linux/.deps',
224*6777b538SAndroid Build Coastguard Worker    'linux/doc',
225*6777b538SAndroid Build Coastguard Worker    'linux/example',
226*6777b538SAndroid Build Coastguard Worker    'linux/fuzz',
227*6777b538SAndroid Build Coastguard Worker    'linux/include/private',
228*6777b538SAndroid Build Coastguard Worker    'linux/python',
229*6777b538SAndroid Build Coastguard Worker    'linux/xstc',
230*6777b538SAndroid Build Coastguard Worker]
231*6777b538SAndroid Build Coastguard Worker
232*6777b538SAndroid Build Coastguard Worker
233*6777b538SAndroid Build Coastguard WorkerTHIRD_PARTY_LIBXML_SRC = 'third_party/libxml/src'
234*6777b538SAndroid Build Coastguard Worker
235*6777b538SAndroid Build Coastguard Worker
236*6777b538SAndroid Build Coastguard Workerclass WorkingDir(object):
237*6777b538SAndroid Build Coastguard Worker    """"Changes the working directory and resets it on exit."""
238*6777b538SAndroid Build Coastguard Worker    def __init__(self, path):
239*6777b538SAndroid Build Coastguard Worker        self.prev_path = os.getcwd()
240*6777b538SAndroid Build Coastguard Worker        self.path = path
241*6777b538SAndroid Build Coastguard Worker
242*6777b538SAndroid Build Coastguard Worker    def __enter__(self):
243*6777b538SAndroid Build Coastguard Worker        os.chdir(self.path)
244*6777b538SAndroid Build Coastguard Worker
245*6777b538SAndroid Build Coastguard Worker    def __exit__(self, exc_type, exc_value, traceback):
246*6777b538SAndroid Build Coastguard Worker        if exc_value:
247*6777b538SAndroid Build Coastguard Worker            print('was in %s; %s before that' % (self.path, self.prev_path))
248*6777b538SAndroid Build Coastguard Worker        os.chdir(self.prev_path)
249*6777b538SAndroid Build Coastguard Worker
250*6777b538SAndroid Build Coastguard Worker
251*6777b538SAndroid Build Coastguard Workerdef git(*args):
252*6777b538SAndroid Build Coastguard Worker    """Runs a git subcommand.
253*6777b538SAndroid Build Coastguard Worker
254*6777b538SAndroid Build Coastguard Worker    On Windows this uses the shell because there's a git wrapper
255*6777b538SAndroid Build Coastguard Worker    batch file in depot_tools.
256*6777b538SAndroid Build Coastguard Worker
257*6777b538SAndroid Build Coastguard Worker    Arguments:
258*6777b538SAndroid Build Coastguard Worker        args: The arguments to pass to git.
259*6777b538SAndroid Build Coastguard Worker    """
260*6777b538SAndroid Build Coastguard Worker    command = ['git'] + list(args)
261*6777b538SAndroid Build Coastguard Worker    subprocess.check_call(command, shell=(os.name == 'nt'))
262*6777b538SAndroid Build Coastguard Worker
263*6777b538SAndroid Build Coastguard Worker
264*6777b538SAndroid Build Coastguard Workerdef remove_tracked_and_local_dir(path):
265*6777b538SAndroid Build Coastguard Worker    """Removes the contents of a directory from git, and the filesystem.
266*6777b538SAndroid Build Coastguard Worker
267*6777b538SAndroid Build Coastguard Worker    Arguments:
268*6777b538SAndroid Build Coastguard Worker        path: The path to remove.
269*6777b538SAndroid Build Coastguard Worker    """
270*6777b538SAndroid Build Coastguard Worker    remove_tracked_files([path])
271*6777b538SAndroid Build Coastguard Worker    shutil.rmtree(path, ignore_errors=True)
272*6777b538SAndroid Build Coastguard Worker    os.mkdir(path)
273*6777b538SAndroid Build Coastguard Worker
274*6777b538SAndroid Build Coastguard Worker
275*6777b538SAndroid Build Coastguard Workerdef remove_tracked_files(files_to_remove):
276*6777b538SAndroid Build Coastguard Worker    """Removes tracked files from git.
277*6777b538SAndroid Build Coastguard Worker
278*6777b538SAndroid Build Coastguard Worker    Arguments:
279*6777b538SAndroid Build Coastguard Worker        files_to_remove: The files to remove.
280*6777b538SAndroid Build Coastguard Worker    """
281*6777b538SAndroid Build Coastguard Worker    files_to_remove = [f for f in files_to_remove if os.path.exists(f)]
282*6777b538SAndroid Build Coastguard Worker    if files_to_remove:
283*6777b538SAndroid Build Coastguard Worker        git('rm', '-rf', '--ignore-unmatch', *files_to_remove)
284*6777b538SAndroid Build Coastguard Worker
285*6777b538SAndroid Build Coastguard Worker
286*6777b538SAndroid Build Coastguard Workerdef sed_in_place(input_filename, program):
287*6777b538SAndroid Build Coastguard Worker    """Replaces text in a file.
288*6777b538SAndroid Build Coastguard Worker
289*6777b538SAndroid Build Coastguard Worker    Arguments:
290*6777b538SAndroid Build Coastguard Worker        input_filename: The file to edit.
291*6777b538SAndroid Build Coastguard Worker        program: The sed program to perform edits on the file.
292*6777b538SAndroid Build Coastguard Worker    """
293*6777b538SAndroid Build Coastguard Worker    # OS X's sed requires -e
294*6777b538SAndroid Build Coastguard Worker    subprocess.check_call(['sed', '-i', '-e', program, input_filename])
295*6777b538SAndroid Build Coastguard Worker
296*6777b538SAndroid Build Coastguard Worker
297*6777b538SAndroid Build Coastguard Workerdef check_copying(full_path_to_third_party_libxml_src):
298*6777b538SAndroid Build Coastguard Worker    path = os.path.join(full_path_to_third_party_libxml_src, 'COPYING')
299*6777b538SAndroid Build Coastguard Worker    if not os.path.exists(path):
300*6777b538SAndroid Build Coastguard Worker        return
301*6777b538SAndroid Build Coastguard Worker    with open(path) as f:
302*6777b538SAndroid Build Coastguard Worker        s = f.read()
303*6777b538SAndroid Build Coastguard Worker        if 'GNU' in s:
304*6777b538SAndroid Build Coastguard Worker            raise Exception('check COPYING')
305*6777b538SAndroid Build Coastguard Worker
306*6777b538SAndroid Build Coastguard Worker
307*6777b538SAndroid Build Coastguard Workerdef prepare_libxml_distribution(src_path, libxml2_repo_path, temp_dir):
308*6777b538SAndroid Build Coastguard Worker    """Makes a libxml2 distribution.
309*6777b538SAndroid Build Coastguard Worker
310*6777b538SAndroid Build Coastguard Worker    Args:
311*6777b538SAndroid Build Coastguard Worker        src_path: The path to the Chromium checkout.
312*6777b538SAndroid Build Coastguard Worker        libxml2_repo_path: The path to the local clone of the libxml2 repo.
313*6777b538SAndroid Build Coastguard Worker        temp_dir: A temporary directory to stage the distribution to.
314*6777b538SAndroid Build Coastguard Worker
315*6777b538SAndroid Build Coastguard Worker    Returns: A tuple of commit hash and full path to the archive.
316*6777b538SAndroid Build Coastguard Worker    """
317*6777b538SAndroid Build Coastguard Worker    # If it was necessary to push from a distribution prepared upstream,
318*6777b538SAndroid Build Coastguard Worker    # this is the point to inject it: Return the version string and the
319*6777b538SAndroid Build Coastguard Worker    # distribution tar file.
320*6777b538SAndroid Build Coastguard Worker
321*6777b538SAndroid Build Coastguard Worker    # The libxml2 repo we're pulling changes from should not have
322*6777b538SAndroid Build Coastguard Worker    # local changes. This *should* be a commit that's publicly visible
323*6777b538SAndroid Build Coastguard Worker    # in the upstream repo; reviewers should check this.
324*6777b538SAndroid Build Coastguard Worker    check_clean(libxml2_repo_path)
325*6777b538SAndroid Build Coastguard Worker
326*6777b538SAndroid Build Coastguard Worker    temp_config_path = os.path.join(temp_dir, 'config')
327*6777b538SAndroid Build Coastguard Worker    os.mkdir(temp_config_path)
328*6777b538SAndroid Build Coastguard Worker    temp_src_path = os.path.join(temp_dir, 'src')
329*6777b538SAndroid Build Coastguard Worker    os.mkdir(temp_src_path)
330*6777b538SAndroid Build Coastguard Worker
331*6777b538SAndroid Build Coastguard Worker    with WorkingDir(libxml2_repo_path):
332*6777b538SAndroid Build Coastguard Worker        commit = subprocess.check_output(
333*6777b538SAndroid Build Coastguard Worker            ['git', 'log', '-n', '1', '--pretty=format:%H',
334*6777b538SAndroid Build Coastguard Worker             'HEAD']).decode('ascii')
335*6777b538SAndroid Build Coastguard Worker        subprocess.check_call(
336*6777b538SAndroid Build Coastguard Worker            'git archive HEAD | tar -x -C "%s"' % temp_src_path,
337*6777b538SAndroid Build Coastguard Worker            shell=True)
338*6777b538SAndroid Build Coastguard Worker    with WorkingDir(temp_src_path):
339*6777b538SAndroid Build Coastguard Worker        os.remove('.gitignore')
340*6777b538SAndroid Build Coastguard Worker        for patch in PATCHES:
341*6777b538SAndroid Build Coastguard Worker            print('applying %s' % patch)
342*6777b538SAndroid Build Coastguard Worker            subprocess.check_call(
343*6777b538SAndroid Build Coastguard Worker                'patch -p1 --fuzz=0 < %s' % os.path.join(
344*6777b538SAndroid Build Coastguard Worker                    src_path, THIRD_PARTY_LIBXML_SRC, '..', 'chromium', patch),
345*6777b538SAndroid Build Coastguard Worker                shell=True)
346*6777b538SAndroid Build Coastguard Worker
347*6777b538SAndroid Build Coastguard Worker    with WorkingDir(temp_config_path):
348*6777b538SAndroid Build Coastguard Worker        print('../src/autogen.sh %s' % XML_CONFIGURE_OPTIONS)
349*6777b538SAndroid Build Coastguard Worker        subprocess.check_call(['../src/autogen.sh'] + XML_CONFIGURE_OPTIONS)
350*6777b538SAndroid Build Coastguard Worker        subprocess.check_call(['make', 'dist-all'])
351*6777b538SAndroid Build Coastguard Worker
352*6777b538SAndroid Build Coastguard Worker        # Work out what it is called
353*6777b538SAndroid Build Coastguard Worker        tar_file = subprocess.check_output(
354*6777b538SAndroid Build Coastguard Worker            '''awk '/PACKAGE =/ {p=$3} /VERSION =/ {v=$3} '''
355*6777b538SAndroid Build Coastguard Worker            '''END {printf("%s-%s.tar.xz", p, v)}' Makefile''',
356*6777b538SAndroid Build Coastguard Worker            shell=True).decode('ascii')
357*6777b538SAndroid Build Coastguard Worker        return commit, os.path.abspath(tar_file)
358*6777b538SAndroid Build Coastguard Worker
359*6777b538SAndroid Build Coastguard Worker
360*6777b538SAndroid Build Coastguard Workerdef roll_libxml_linux(src_path, libxml2_repo_path, fast):
361*6777b538SAndroid Build Coastguard Worker    with WorkingDir(src_path):
362*6777b538SAndroid Build Coastguard Worker        # Export the upstream git repo.
363*6777b538SAndroid Build Coastguard Worker        try:
364*6777b538SAndroid Build Coastguard Worker            temp_dir = tempfile.mkdtemp()
365*6777b538SAndroid Build Coastguard Worker            print('temporary directory: %s' % temp_dir)
366*6777b538SAndroid Build Coastguard Worker
367*6777b538SAndroid Build Coastguard Worker            commit, tar_file = prepare_libxml_distribution(
368*6777b538SAndroid Build Coastguard Worker                src_path, libxml2_repo_path, temp_dir)
369*6777b538SAndroid Build Coastguard Worker
370*6777b538SAndroid Build Coastguard Worker            # Remove all of the old libxml to ensure only desired cruft
371*6777b538SAndroid Build Coastguard Worker            # accumulates
372*6777b538SAndroid Build Coastguard Worker            remove_tracked_and_local_dir(THIRD_PARTY_LIBXML_SRC)
373*6777b538SAndroid Build Coastguard Worker
374*6777b538SAndroid Build Coastguard Worker            # Update the libxml repo and export it to the Chromium tree
375*6777b538SAndroid Build Coastguard Worker            with WorkingDir(THIRD_PARTY_LIBXML_SRC):
376*6777b538SAndroid Build Coastguard Worker                subprocess.check_call(
377*6777b538SAndroid Build Coastguard Worker                    'tar xJf %s --strip-components=1' % tar_file,
378*6777b538SAndroid Build Coastguard Worker                    shell=True)
379*6777b538SAndroid Build Coastguard Worker        finally:
380*6777b538SAndroid Build Coastguard Worker            shutil.rmtree(temp_dir)
381*6777b538SAndroid Build Coastguard Worker
382*6777b538SAndroid Build Coastguard Worker        with WorkingDir(THIRD_PARTY_LIBXML_SRC):
383*6777b538SAndroid Build Coastguard Worker            # Put the version number is the README file
384*6777b538SAndroid Build Coastguard Worker            sed_in_place('../README.chromium',
385*6777b538SAndroid Build Coastguard Worker                         's/Version: .*$/Version: %s/' % commit)
386*6777b538SAndroid Build Coastguard Worker
387*6777b538SAndroid Build Coastguard Worker            with WorkingDir('../linux'):
388*6777b538SAndroid Build Coastguard Worker                subprocess.check_call(
389*6777b538SAndroid Build Coastguard Worker                    ['../src/autogen.sh'] + XML_CONFIGURE_OPTIONS)
390*6777b538SAndroid Build Coastguard Worker                check_copying(os.getcwd())
391*6777b538SAndroid Build Coastguard Worker                sed_in_place('config.h', 's/#define HAVE_RAND_R 1//')
392*6777b538SAndroid Build Coastguard Worker
393*6777b538SAndroid Build Coastguard Worker            # Add *everything*
394*6777b538SAndroid Build Coastguard Worker            with WorkingDir('../src'):
395*6777b538SAndroid Build Coastguard Worker                git('add', '*')
396*6777b538SAndroid Build Coastguard Worker                if fast:
397*6777b538SAndroid Build Coastguard Worker                    with WorkingDir('..'):
398*6777b538SAndroid Build Coastguard Worker                        remove_tracked_files(FILES_TO_REMOVE)
399*6777b538SAndroid Build Coastguard Worker                git('commit', '-am', '%s libxml, linux' % commit)
400*6777b538SAndroid Build Coastguard Worker    if fast:
401*6777b538SAndroid Build Coastguard Worker        print('Now upload for review, etc.')
402*6777b538SAndroid Build Coastguard Worker    else:
403*6777b538SAndroid Build Coastguard Worker        print('Now push to Windows and run steps there.')
404*6777b538SAndroid Build Coastguard Worker
405*6777b538SAndroid Build Coastguard Worker
406*6777b538SAndroid Build Coastguard Workerdef roll_libxml_win32(src_path):
407*6777b538SAndroid Build Coastguard Worker    with WorkingDir(src_path):
408*6777b538SAndroid Build Coastguard Worker        # Run the configure script.
409*6777b538SAndroid Build Coastguard Worker        with WorkingDir(os.path.join(THIRD_PARTY_LIBXML_SRC, 'win32')):
410*6777b538SAndroid Build Coastguard Worker            subprocess.check_call(
411*6777b538SAndroid Build Coastguard Worker                ['cscript', '//E:jscript', 'configure.js', 'compiler=msvc'] +
412*6777b538SAndroid Build Coastguard Worker                XML_WIN32_CONFIGURE_OPTIONS)
413*6777b538SAndroid Build Coastguard Worker
414*6777b538SAndroid Build Coastguard Worker            # Add and commit the result.
415*6777b538SAndroid Build Coastguard Worker            shutil.move('../config.h', '../../win32/config.h')
416*6777b538SAndroid Build Coastguard Worker            git('add', '../../win32/config.h')
417*6777b538SAndroid Build Coastguard Worker            shutil.move('../include/libxml/xmlversion.h',
418*6777b538SAndroid Build Coastguard Worker                        '../../win32/include/libxml/xmlversion.h')
419*6777b538SAndroid Build Coastguard Worker            git('add', '../../win32/include/libxml/xmlversion.h')
420*6777b538SAndroid Build Coastguard Worker            git('commit', '--allow-empty', '-m', 'Windows')
421*6777b538SAndroid Build Coastguard Worker            git('clean', '-f')
422*6777b538SAndroid Build Coastguard Worker    print('Now push to Mac and run steps there.')
423*6777b538SAndroid Build Coastguard Worker
424*6777b538SAndroid Build Coastguard Worker
425*6777b538SAndroid Build Coastguard Workerdef roll_libxml_mac(src_path, icu4c_path):
426*6777b538SAndroid Build Coastguard Worker    icu4c_path = os.path.abspath(os.path.expanduser(icu4c_path))
427*6777b538SAndroid Build Coastguard Worker    os.environ["LDFLAGS"] = "-L" + os.path.join(icu4c_path, 'lib')
428*6777b538SAndroid Build Coastguard Worker    os.environ["CPPFLAGS"] = "-I" + os.path.join(icu4c_path, 'include')
429*6777b538SAndroid Build Coastguard Worker    os.environ["PKG_CONFIG_PATH"] = os.path.join(icu4c_path, 'lib/pkgconfig')
430*6777b538SAndroid Build Coastguard Worker
431*6777b538SAndroid Build Coastguard Worker    full_path_to_third_party_libxml = os.path.join(
432*6777b538SAndroid Build Coastguard Worker        src_path, THIRD_PARTY_LIBXML_SRC, '..')
433*6777b538SAndroid Build Coastguard Worker
434*6777b538SAndroid Build Coastguard Worker    with WorkingDir(os.path.join(full_path_to_third_party_libxml, 'mac')):
435*6777b538SAndroid Build Coastguard Worker        subprocess.check_call(['autoreconf', '-i', '../src'])
436*6777b538SAndroid Build Coastguard Worker        os.chmod('../src/configure',
437*6777b538SAndroid Build Coastguard Worker                 os.stat('../src/configure').st_mode | stat.S_IXUSR)
438*6777b538SAndroid Build Coastguard Worker        subprocess.check_call(['../src/configure'] + XML_CONFIGURE_OPTIONS)
439*6777b538SAndroid Build Coastguard Worker        sed_in_place('config.h', 's/#define HAVE_RAND_R 1//')
440*6777b538SAndroid Build Coastguard Worker
441*6777b538SAndroid Build Coastguard Worker    with WorkingDir(full_path_to_third_party_libxml):
442*6777b538SAndroid Build Coastguard Worker        commit = subprocess.check_output(
443*6777b538SAndroid Build Coastguard Worker            ['awk', '/Version:/ {print $2}',
444*6777b538SAndroid Build Coastguard Worker             'README.chromium']).decode('ascii')
445*6777b538SAndroid Build Coastguard Worker        remove_tracked_files(FILES_TO_REMOVE)
446*6777b538SAndroid Build Coastguard Worker        commit_message = 'Roll libxml to %s' % commit
447*6777b538SAndroid Build Coastguard Worker        git('commit', '-am', commit_message)
448*6777b538SAndroid Build Coastguard Worker    print('Now upload for review, etc.')
449*6777b538SAndroid Build Coastguard Worker
450*6777b538SAndroid Build Coastguard Worker
451*6777b538SAndroid Build Coastguard Workerdef check_clean(path):
452*6777b538SAndroid Build Coastguard Worker    with WorkingDir(path):
453*6777b538SAndroid Build Coastguard Worker        status = subprocess.check_output(['git', 'status',
454*6777b538SAndroid Build Coastguard Worker                                          '-s']).decode('ascii')
455*6777b538SAndroid Build Coastguard Worker        if len(status) > 0:
456*6777b538SAndroid Build Coastguard Worker            raise Exception('repository at %s is not clean' % path)
457*6777b538SAndroid Build Coastguard Worker
458*6777b538SAndroid Build Coastguard Worker
459*6777b538SAndroid Build Coastguard Workerdef main():
460*6777b538SAndroid Build Coastguard Worker    src_dir = os.getcwd()
461*6777b538SAndroid Build Coastguard Worker    if not os.path.exists(os.path.join(src_dir, 'third_party')):
462*6777b538SAndroid Build Coastguard Worker        print('error: run this script from the Chromium src directory')
463*6777b538SAndroid Build Coastguard Worker        sys.exit(1)
464*6777b538SAndroid Build Coastguard Worker
465*6777b538SAndroid Build Coastguard Worker    parser = argparse.ArgumentParser(
466*6777b538SAndroid Build Coastguard Worker        description='Roll the libxml2 dependency in Chromium')
467*6777b538SAndroid Build Coastguard Worker    platform = parser.add_mutually_exclusive_group(required=True)
468*6777b538SAndroid Build Coastguard Worker    platform.add_argument('--linux', action='store_true')
469*6777b538SAndroid Build Coastguard Worker    platform.add_argument('--win32', action='store_true')
470*6777b538SAndroid Build Coastguard Worker    platform.add_argument('--mac', action='store_true')
471*6777b538SAndroid Build Coastguard Worker    platform.add_argument('--linuxfast', action='store_true')
472*6777b538SAndroid Build Coastguard Worker    parser.add_argument(
473*6777b538SAndroid Build Coastguard Worker        'libxml2_repo_path',
474*6777b538SAndroid Build Coastguard Worker        type=str,
475*6777b538SAndroid Build Coastguard Worker        nargs='?',
476*6777b538SAndroid Build Coastguard Worker        help='The path to the local clone of the libxml2 git repo.')
477*6777b538SAndroid Build Coastguard Worker    parser.add_argument(
478*6777b538SAndroid Build Coastguard Worker        '--icu4c_path',
479*6777b538SAndroid Build Coastguard Worker        help='The path to the homebrew installation of icu4c.')
480*6777b538SAndroid Build Coastguard Worker    args = parser.parse_args()
481*6777b538SAndroid Build Coastguard Worker
482*6777b538SAndroid Build Coastguard Worker    if args.linux or args.linuxfast:
483*6777b538SAndroid Build Coastguard Worker        libxml2_repo_path = args.libxml2_repo_path
484*6777b538SAndroid Build Coastguard Worker        if not libxml2_repo_path:
485*6777b538SAndroid Build Coastguard Worker            print('Specify the path to the local libxml2 repo clone.')
486*6777b538SAndroid Build Coastguard Worker            sys.exit(1)
487*6777b538SAndroid Build Coastguard Worker        libxml2_repo_path = os.path.abspath(libxml2_repo_path)
488*6777b538SAndroid Build Coastguard Worker        roll_libxml_linux(src_dir, libxml2_repo_path, args.linuxfast)
489*6777b538SAndroid Build Coastguard Worker    elif args.win32:
490*6777b538SAndroid Build Coastguard Worker        roll_libxml_win32(src_dir)
491*6777b538SAndroid Build Coastguard Worker    elif args.mac:
492*6777b538SAndroid Build Coastguard Worker        icu4c_path = args.icu4c_path
493*6777b538SAndroid Build Coastguard Worker        if not icu4c_path:
494*6777b538SAndroid Build Coastguard Worker            print('Specify the path to the homebrew installation of icu4c with --icu4c_path.')
495*6777b538SAndroid Build Coastguard Worker            print('  ex: roll.py --mac --icu4c_path=~/homebrew/opt/icu4c')
496*6777b538SAndroid Build Coastguard Worker            sys.exit(1)
497*6777b538SAndroid Build Coastguard Worker        roll_libxml_mac(src_dir, icu4c_path)
498*6777b538SAndroid Build Coastguard Worker
499*6777b538SAndroid Build Coastguard Worker
500*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__':
501*6777b538SAndroid Build Coastguard Worker    main()
502