OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2014 The Chromium Authors. All rights reserved. | 2 # Copyright 2014 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 # TODO(hinoka): Use logging. | 6 # TODO(hinoka): Use logging. |
7 | 7 |
8 import cStringIO | 8 import cStringIO |
9 import codecs | 9 import codecs |
10 import collections | 10 import collections |
(...skipping 988 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
999 (line, diff)) | 999 (line, diff)) |
1000 | 1000 |
1001 current_diff = '' | 1001 current_diff = '' |
1002 current_diff += '%s\n' % line | 1002 current_diff += '%s\n' % line |
1003 if current_header: | 1003 if current_header: |
1004 # We hit EOF, gotta save the last diff. | 1004 # We hit EOF, gotta save the last diff. |
1005 result.append((current_header, current_diff)) | 1005 result.append((current_header, current_diff)) |
1006 return result | 1006 return result |
1007 | 1007 |
1008 | 1008 |
1009 def get_svn_patch(patch_url): | |
1010 """Fetch patch from patch_url, return list of (filename, diff)""" | |
1011 svn_exe = 'svn.bat' if sys.platform.startswith('win') else 'svn' | |
1012 patch_data = call(svn_exe, 'cat', patch_url) | |
1013 return parse_diff(patch_data) | |
1014 | |
1015 | |
1016 def apply_svn_patch(patch_root, patches, whitelist=None, blacklist=None): | |
1017 """Expects a list of (filename, diff), applies it on top of patch_root.""" | |
1018 if whitelist: | |
1019 patches = [(name, diff) for name, diff in patches if name in whitelist] | |
1020 elif blacklist: | |
1021 patches = [(name, diff) for name, diff in patches if name not in blacklist] | |
1022 diffs = [diff for _, diff in patches] | |
1023 patch = ''.join(diffs) | |
1024 | |
1025 if patch: | |
1026 print '===Patching files===' | |
1027 for filename, _ in patches: | |
1028 print 'Patching %s' % filename | |
1029 try: | |
1030 call(PATCH_TOOL, '-p0', '--remove-empty-files', '--force', '--forward', | |
1031 stdin_data=patch, cwd=patch_root, tries=1) | |
1032 for filename, _ in patches: | |
1033 full_filename = path.abspath(path.join(patch_root, filename)) | |
1034 git('add', full_filename, cwd=path.dirname(full_filename)) | |
1035 except SubprocessFailed as e: | |
1036 raise PatchFailed(e.message, e.code, e.output) | |
1037 | |
1038 def apply_rietveld_issue(issue, patchset, root, server, _rev_map, _revision, | 1009 def apply_rietveld_issue(issue, patchset, root, server, _rev_map, _revision, |
1039 email_file, key_file, whitelist=None, blacklist=None): | 1010 email_file, key_file, whitelist=None, blacklist=None): |
1040 apply_issue_bin = ('apply_issue.bat' if sys.platform.startswith('win') | 1011 apply_issue_bin = ('apply_issue.bat' if sys.platform.startswith('win') |
1041 else 'apply_issue') | 1012 else 'apply_issue') |
1042 cmd = [apply_issue_bin, | 1013 cmd = [apply_issue_bin, |
1043 # The patch will be applied on top of this directory. | 1014 # The patch will be applied on top of this directory. |
1044 '--root_dir', root, | 1015 '--root_dir', root, |
1045 # Tell apply_issue how to fetch the patch. | 1016 # Tell apply_issue how to fetch the patch. |
1046 '--issue', issue, | 1017 '--issue', issue, |
1047 '--server', server, | 1018 '--server', server, |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1258 revision = get_target_revision(deps_name, deps_data.get('url', None), | 1229 revision = get_target_revision(deps_name, deps_data.get('url', None), |
1259 revisions) | 1230 revisions) |
1260 if not revision: | 1231 if not revision: |
1261 continue | 1232 continue |
1262 # TODO(hinoka): Catch SVNRevisionNotFound error maybe? | 1233 # TODO(hinoka): Catch SVNRevisionNotFound error maybe? |
1263 git('fetch', 'origin', cwd=deps_name) | 1234 git('fetch', 'origin', cwd=deps_name) |
1264 force_revision(deps_name, revision) | 1235 force_revision(deps_name, revision) |
1265 | 1236 |
1266 | 1237 |
1267 def ensure_checkout(solutions, revisions, first_sln, target_os, target_os_only, | 1238 def ensure_checkout(solutions, revisions, first_sln, target_os, target_os_only, |
1268 patch_root, issue, patchset, patch_url, rietveld_server, | 1239 patch_root, issue, patchset, rietveld_server, |
1269 gerrit_repo, gerrit_ref, gerrit_rebase_patch_ref, | 1240 gerrit_repo, gerrit_ref, gerrit_rebase_patch_ref, |
1270 revision_mapping, apply_issue_email_file, | 1241 revision_mapping, apply_issue_email_file, |
1271 apply_issue_key_file, buildspec, gyp_env, shallow, runhooks, | 1242 apply_issue_key_file, buildspec, gyp_env, shallow, runhooks, |
1272 refs, git_cache_dir, gerrit_reset): | 1243 refs, git_cache_dir, gerrit_reset): |
1273 # Get a checkout of each solution, without DEPS or hooks. | 1244 # Get a checkout of each solution, without DEPS or hooks. |
1274 # Calling git directly because there is no way to run Gclient without | 1245 # Calling git directly because there is no way to run Gclient without |
1275 # invoking DEPS. | 1246 # invoking DEPS. |
1276 print 'Fetching Git checkout' | 1247 print 'Fetching Git checkout' |
1277 | 1248 |
1278 git_ref = git_checkout(solutions, revisions, shallow, refs, git_cache_dir) | 1249 git_ref = git_checkout(solutions, revisions, shallow, refs, git_cache_dir) |
1279 | 1250 |
1280 patches = None | |
1281 if patch_url: | |
1282 patches = get_svn_patch(patch_url) | |
1283 | |
1284 print '===Processing patch solutions===' | 1251 print '===Processing patch solutions===' |
1285 already_patched = [] | 1252 already_patched = [] |
1286 patch_root = patch_root or '' | 1253 patch_root = patch_root or '' |
1287 applied_gerrit_patch = False | 1254 applied_gerrit_patch = False |
1288 print 'Patch root is %r' % patch_root | 1255 print 'Patch root is %r' % patch_root |
1289 for solution in solutions: | 1256 for solution in solutions: |
1290 print 'Processing solution %r' % solution['name'] | 1257 print 'Processing solution %r' % solution['name'] |
1291 if (patch_root == solution['name'] or | 1258 if (patch_root == solution['name'] or |
1292 solution['name'].startswith(patch_root + '/')): | 1259 solution['name'].startswith(patch_root + '/')): |
1293 relative_root = solution['name'][len(patch_root) + 1:] | 1260 relative_root = solution['name'][len(patch_root) + 1:] |
1294 target = '/'.join([relative_root, 'DEPS']).lstrip('/') | 1261 target = '/'.join([relative_root, 'DEPS']).lstrip('/') |
1295 print ' relative root is %r, target is %r' % (relative_root, target) | 1262 print ' relative root is %r, target is %r' % (relative_root, target) |
1296 if patches: | 1263 if issue: |
1297 apply_svn_patch(patch_root, patches, whitelist=[target]) | |
1298 already_patched.append(target) | |
1299 elif issue: | |
1300 apply_rietveld_issue(issue, patchset, patch_root, rietveld_server, | 1264 apply_rietveld_issue(issue, patchset, patch_root, rietveld_server, |
1301 revision_mapping, git_ref, apply_issue_email_file, | 1265 revision_mapping, git_ref, apply_issue_email_file, |
1302 apply_issue_key_file, whitelist=[target]) | 1266 apply_issue_key_file, whitelist=[target]) |
1303 already_patched.append(target) | 1267 already_patched.append(target) |
1304 elif gerrit_ref: | 1268 elif gerrit_ref: |
1305 apply_gerrit_ref(gerrit_repo, gerrit_ref, patch_root, gerrit_reset, | 1269 apply_gerrit_ref(gerrit_repo, gerrit_ref, patch_root, gerrit_reset, |
1306 gerrit_rebase_patch_ref) | 1270 gerrit_rebase_patch_ref) |
1307 applied_gerrit_patch = True | 1271 applied_gerrit_patch = True |
1308 | 1272 |
1309 # Ensure our build/ directory is set up with the correct .gclient file. | 1273 # Ensure our build/ directory is set up with the correct .gclient file. |
(...skipping 15 matching lines...) Expand all Loading... |
1325 # Run gclient runhooks if we're on an official builder. | 1289 # Run gclient runhooks if we're on an official builder. |
1326 # TODO(hinoka): Remove this when the official builders run their own | 1290 # TODO(hinoka): Remove this when the official builders run their own |
1327 # runhooks step. | 1291 # runhooks step. |
1328 gclient_runhooks(gyp_env) | 1292 gclient_runhooks(gyp_env) |
1329 | 1293 |
1330 # Finally, ensure that all DEPS are pinned to the correct revision. | 1294 # Finally, ensure that all DEPS are pinned to the correct revision. |
1331 dir_names = [sln['name'] for sln in solutions] | 1295 dir_names = [sln['name'] for sln in solutions] |
1332 ensure_deps_revisions(gclient_output.get('solutions', {}), | 1296 ensure_deps_revisions(gclient_output.get('solutions', {}), |
1333 dir_names, revisions) | 1297 dir_names, revisions) |
1334 # Apply the rest of the patch here (sans DEPS) | 1298 # Apply the rest of the patch here (sans DEPS) |
1335 if patches: | 1299 if issue: |
1336 apply_svn_patch(patch_root, patches, blacklist=already_patched) | |
1337 elif issue: | |
1338 apply_rietveld_issue(issue, patchset, patch_root, rietveld_server, | 1300 apply_rietveld_issue(issue, patchset, patch_root, rietveld_server, |
1339 revision_mapping, git_ref, apply_issue_email_file, | 1301 revision_mapping, git_ref, apply_issue_email_file, |
1340 apply_issue_key_file, blacklist=already_patched) | 1302 apply_issue_key_file, blacklist=already_patched) |
1341 elif gerrit_ref and not applied_gerrit_patch: | 1303 elif gerrit_ref and not applied_gerrit_patch: |
1342 # If gerrit_ref was for solution's main repository, it has already been | 1304 # If gerrit_ref was for solution's main repository, it has already been |
1343 # applied above. This chunk is executed only for patches to DEPS-ed in | 1305 # applied above. This chunk is executed only for patches to DEPS-ed in |
1344 # git repositories. | 1306 # git repositories. |
1345 apply_gerrit_ref(gerrit_repo, gerrit_ref, patch_root, gerrit_reset, | 1307 apply_gerrit_ref(gerrit_repo, gerrit_ref, patch_root, gerrit_reset, |
1346 gerrit_rebase_patch_ref) | 1308 gerrit_rebase_patch_ref) |
1347 | 1309 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1405 parse = optparse.OptionParser() | 1367 parse = optparse.OptionParser() |
1406 | 1368 |
1407 parse.add_option('--issue', help='Issue number to patch from.') | 1369 parse.add_option('--issue', help='Issue number to patch from.') |
1408 parse.add_option('--patchset', | 1370 parse.add_option('--patchset', |
1409 help='Patchset from issue to patch from, if applicable.') | 1371 help='Patchset from issue to patch from, if applicable.') |
1410 parse.add_option('--apply_issue_email_file', | 1372 parse.add_option('--apply_issue_email_file', |
1411 help='--email-file option passthrough for apply_patch.py.') | 1373 help='--email-file option passthrough for apply_patch.py.') |
1412 parse.add_option('--apply_issue_key_file', | 1374 parse.add_option('--apply_issue_key_file', |
1413 help='--private-key-file option passthrough for ' | 1375 help='--private-key-file option passthrough for ' |
1414 'apply_patch.py.') | 1376 'apply_patch.py.') |
1415 parse.add_option('--patch_url', help='Optional URL to SVN patch.') | |
1416 parse.add_option('--root', dest='patch_root', | 1377 parse.add_option('--root', dest='patch_root', |
1417 help='DEPRECATED: Use --patch_root.') | 1378 help='DEPRECATED: Use --patch_root.') |
1418 parse.add_option('--patch_root', help='Directory to patch on top of.') | 1379 parse.add_option('--patch_root', help='Directory to patch on top of.') |
1419 parse.add_option('--rietveld_server', | 1380 parse.add_option('--rietveld_server', |
1420 default='codereview.chromium.org', | 1381 default='codereview.chromium.org', |
1421 help='Rietveld server.') | 1382 help='Rietveld server.') |
1422 parse.add_option('--gerrit_repo', | 1383 parse.add_option('--gerrit_repo', |
1423 help='Gerrit repository to pull the ref from.') | 1384 help='Gerrit repository to pull the ref from.') |
1424 parse.add_option('--gerrit_ref', help='Gerrit ref to apply.') | 1385 parse.add_option('--gerrit_ref', help='Gerrit ref to apply.') |
1425 parse.add_option('--gerrit_no_rebase_patch_ref', action='store_true', | 1386 parse.add_option('--gerrit_no_rebase_patch_ref', action='store_true', |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1574 first_sln=first_sln, | 1535 first_sln=first_sln, |
1575 | 1536 |
1576 # Also, target os variables for gclient. | 1537 # Also, target os variables for gclient. |
1577 target_os=specs.get('target_os', []), | 1538 target_os=specs.get('target_os', []), |
1578 target_os_only=specs.get('target_os_only', False), | 1539 target_os_only=specs.get('target_os_only', False), |
1579 | 1540 |
1580 # Then, pass in information about how to patch. | 1541 # Then, pass in information about how to patch. |
1581 patch_root=options.patch_root, | 1542 patch_root=options.patch_root, |
1582 issue=options.issue, | 1543 issue=options.issue, |
1583 patchset=options.patchset, | 1544 patchset=options.patchset, |
1584 patch_url=options.patch_url, | |
1585 rietveld_server=options.rietveld_server, | 1545 rietveld_server=options.rietveld_server, |
1586 gerrit_repo=options.gerrit_repo, | 1546 gerrit_repo=options.gerrit_repo, |
1587 gerrit_ref=options.gerrit_ref, | 1547 gerrit_ref=options.gerrit_ref, |
1588 gerrit_rebase_patch_ref=not options.gerrit_no_rebase_patch_ref, | 1548 gerrit_rebase_patch_ref=not options.gerrit_no_rebase_patch_ref, |
1589 revision_mapping=options.revision_mapping, | 1549 revision_mapping=options.revision_mapping, |
1590 apply_issue_email_file=options.apply_issue_email_file, | 1550 apply_issue_email_file=options.apply_issue_email_file, |
1591 apply_issue_key_file=options.apply_issue_key_file, | 1551 apply_issue_key_file=options.apply_issue_key_file, |
1592 | 1552 |
1593 # For official builders. | 1553 # For official builders. |
1594 buildspec=buildspec, | 1554 buildspec=buildspec, |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1742 except Exception: | 1702 except Exception: |
1743 # Unexpected failure. | 1703 # Unexpected failure. |
1744 emit_flag(options.flag_file) | 1704 emit_flag(options.flag_file) |
1745 raise | 1705 raise |
1746 else: | 1706 else: |
1747 emit_flag(options.flag_file) | 1707 emit_flag(options.flag_file) |
1748 | 1708 |
1749 | 1709 |
1750 if __name__ == '__main__': | 1710 if __name__ == '__main__': |
1751 sys.exit(main()) | 1711 sys.exit(main()) |
OLD | NEW |