Store patches meta info in patches configs (#470)

* Add PyYAML submodule

https://github.com/yaml/pyyaml

* Install PyYAML on bootstrap

* Ignore dirty state of the pyyaml submodule

It creates a "build" directory under its root when built.

* Use argparse in the apply-patches script

And provide a target arch as a named argument.

* Store patches meta info in patches configs

Use a patches config to defines order of patches,
specify a patch owner, and provide a description for a patch.

It should help us to avoid order collisions, make merge conflicts explicit,
and help find owners since git blame might not be reliable
because of frequent changes during Chromium upgrades.
This commit is contained in:
Alexey Kuzmin 2018-03-20 21:26:39 +03:00 коммит произвёл Charles Kerr
Родитель dceeb59d3f
Коммит 38c34c5446
26 изменённых файлов: 597 добавлений и 123 удалений

4
.gitmodules поставляемый
Просмотреть файл

@ -5,3 +5,7 @@
path = vendor/boto
url = https://github.com/piotrbulinski/boto.git
ignore = untracked
[submodule "vendor/pyyaml"]
path = vendor/pyyaml
url = https://github.com/yaml/pyyaml.git
ignore = dirty

10
patches-mas/.patches.yaml Normal file
Просмотреть файл

@ -0,0 +1,10 @@
repo: src
patches:
-
owners: zcbenz
file: 001-blink_no_private_api.patch
descripion: null
-
owners: zcbenz
file: 002-no_private_api.patch
descripion: null

Просмотреть файл

@ -0,0 +1,38 @@
repo: src
patches:
-
owners: null
file: 005-Add-support-for-using-seccomp_bpf-on-mips64el.patch
descripion: null
-
owners: null
file: 006-Set-kernal-page-size-to-16K-on-loongson-MIPS-archtec.patch
descripion: null
-
owners: null
file: 007-Add-mips64el-redhat-linux-to-gcc_toolchain-for-mips6.patch
descripion: null
-
owners: null
file: 009-Fix-mips-cross-toolchain-build-src-crypto-ec-p256-64.patch
descripion: null
-
owners: null
file: 010-Fix-error-about-relocation-truncated-to-fit-R_MIPS_C.patch
descripion: null
-
owners: zcbenz
file: 011-backport-sqlite-8a87f7e.patch
descripion: null
-
owners: zcbenz
file: 012-backport-sqlite-9851f2e.patch
descripion: null
-
owners: zcbenz
file: 013-backport-sqlite-3d8ec48.patch
descripion: null
-
owners: zcbenz
file: 014-support-old-nss.patch
descripion: null

6
patches-mips64el/third_party/ffmpeg/.patches.yaml поставляемый Normal file
Просмотреть файл

@ -0,0 +1,6 @@
repo: src/third_party/ffmpeg
patches:
-
owners: zcbenz
file: 002-Fix-build_ffmpeg-with-cross-prefix-mips64el-redhat-l.patch
descripion: null

Просмотреть файл

@ -0,0 +1,6 @@
repo: src/v8
patches:
-
owners: zcbenz
file: 002-Fix-v8-loongson-page-size.patch
descripion: null

329
patches/.patches.yaml Normal file
Просмотреть файл

@ -0,0 +1,329 @@
repo: src
patches:
-
owners: alespergl
file: 001-build_gn.patch
descripion: null
-
owners: alespergl, deepak1556
file: 002-dcheck.patch
descripion: |
This disables some debug checks which currently fail when running the Electron
test suite. In general there should be sustained effort to have all debug checks
enabled. If you want to help, choose one of the diffs below and remove it. Then
build Electron (debug configuration) and make sure all tests pass on the CI
systems. Unfortunately the tests don't always cover the check failures, so it's
good to also run some non-trivial Electron app to verify.
Apart from getting rid of a whole diff, you may also be able to replace one diff
with another which enables at least some of the previously disabled checks. For
example, the checks might be disabled for a whole build target, but actually
only one or two specific checks fail. Then it's better to simply comment out the
failing checks and allow the rest of the target to have them enabled.
Please keep the following lists updated.
The ELECTRON_NO_DCHECK build flag disables debug checks universally.
This patch applies the flag to the following GN targets:
third_party/WebKit/Source/core/loader:loader
url:url
These files have debug checks explicitly commented out:
base/memory/weak_ptr.cc
base/process/kill_win.cc
components/viz/service/display/program_binding.h
content/browser/frame_host/navigation_controller_impl.cc
content/browser/frame_host/render_frame_host_impl.cc
content/browser/renderer_host/render_widget_host_view_mac.mm
ppapi/host/ppapi_host.cc
third_party/WebKit/Source/core/dom/Node.cpp
third_party/WebKit/Source/platform/wtf/text/StringImpl.h
ui/base/clipboard/clipboard_win.cc
-
owners: zcbenz
file: 003-accelerator.patch
descripion: null
-
owners: alespergl
file: 004-allow_new_privs.patch
descripion: null
-
owners: null
file: 005-app_indicator_icon_menu.patch
descripion: null
-
owners: zcbenz
file: 006-blink_file_path.patch
descripion: null
-
owners: zcbenz
file: 007-blink_local_frame.patch
descripion: |
According to electron/electron#3699, it is unreliable to use |unload|
event for process.exit('exit'), so we have to do that in
willReleaseScriptContext.
However Chromium then disallowed scripting in willReleaseScriptContext
in https://codereview.chromium.org/1657583002, and crash will happen
when there is code doing that.
This patch reverts the change to fix the crash in Electron.
-
owners: null
file: 008-blink_world_context.patch
descripion: null
-
owners: zcbenz
file: 009-browser_compositor_mac.patch
descripion: null
-
owners: null
file: 010-browser_plugin_wheel.patch
descripion: null
-
owners: null
file: 011-build_toolchain_win_patch.patch
descripion: |
Patch the Windows build toolchain to generate unique PDB names
When the PDB files generated by the `static_library` build are
packaged for distribution they are all copied to a single folder,
some of the PDB files have identical names so they end up
overwriting each other. The missing PDB files cause linker warnings
when building Electron in Release mode, and make it more difficult
to debug release builds.
This patch modifies the PDB naming convention for the
`static_library` build configuration to ensure PDB names are unique.
For example, instead of generating `obj/ui/base/base_cc.pdb` the
build will now generate `obj/ui/base/obj_ui_base_base_cc.pdb`.
-
owners: zcbenz
file: 012-can_create_window.patch
descripion: null
-
owners: null
file: 013-compositor_delegate.patch
descripion: null
-
owners: null
file: 016-desktop_screen_win.patch
descripion: null
-
owners: zcbenz
file: 017-disable_hidden.patch
descripion: null
-
owners: zcbenz
file: 018-dom_storage_map.patch
descripion: null
-
owners: zcbenz
file: 019-frame_host_manager.patch
descripion: null
-
owners: null
file: 020-guest_view.patch
descripion: null
-
owners: tonyganch
file: 021-latency_info.patch
descripion: null
-
owners: zcbenz
file: 023-net_url_request_job.patch
descripion: null
-
owners: MarshallOfSound
file: 024-new_site_instance.patch
descripion: null
-
owners: alexeykuzmin
file: 025-no_stack_dumping.patch
descripion: null
-
owners: deepak1556
file: 026-out_of_process_instance.patch
descripion: null
-
owners: alexeykuzmin
file: 027-protobuf_build_gn.patch
descripion: null
-
owners: null
file: 028-render_widget_host_view_base.patch
descripion: null
-
owners: zcbenz
file: 029-render_widget_host_view_mac.patch
descripion: null
-
owners: deepak1556
file: 030-resource_request_details.patch
descripion: null
-
owners: null
file: 031-scoped_clipboard_writer.patch
descripion: null
-
owners: deepak1556
file: 032-stream_resource_handler.patch
descripion: null
-
owners: null
file: 034-thread_capabilities.patch
descripion: |
Chromium automatically drops all capabilities of renderer threads in
Linux, which may cause issues in a context like Electron, where the main
and renderer threads are supposed to keep inherited permissions over the
system.
See https://github.com/atom/electron/issues/3666
-
owners: zcbenz
file: 035-use_transparent_window.patch
descripion: null
-
owners: null
file: 036-web_contents.patch
descripion: null
-
owners: miniak
file: 037-webgl_context_attributes.patch
descripion: null
-
owners: null
file: 038-webview_cross_drag.patch
descripion: null
-
owners: zcbenz
file: 040-worker_context_will_destroy.patch
descripion: null
-
owners: null
file: 042-webui_in_subframes.patch
descripion: null
-
owners: alexeykuzmin
file: 045-export_blink_webdisplayitemlist.patch
descripion: null
-
owners: alexeykuzmin
file: 046-statically_build_power_save_blocker.patch
descripion: null
-
owners: gavignus
file: 047-browser_plugin_guest.patch
descripion: null
-
owners: alexeykuzmin
file: 048-disable_user_gesture_requirement_for_beforeunload_dialogs.patch
descripion: See https://github.com/electron/electron/issues/10754
-
owners: alexeykuzmin
file: 049-restore_adding_custom_cors_enabled_schemes.patch
descripion: null
-
owners: alexeykuzmin
file: 052-fix_blink_property_tree_state_to_tree_string_usage.patch
descripion: Should probably be removed since we already have DCHECKs enabled.
-
owners: deepak1556
file: 052-latency_histogram_macros.patch
descripion: null
-
owners: alexeykuzmin
file: 063-backport_140d82d6f8e2.patch
descripion: null
-
owners: alexeykuzmin
file: 064-backport_4dfcf263240a.patch
descripion: null
-
owners: alexeykuzmin
file: 065-backport_81e7f1791035.patch
descripion: null
-
owners: alexeykuzmin
file: 066-backport_99b48b47f11f.patch
descripion: null
-
owners: alexeykuzmin
file: 067-backport_1ed08ea9dbb0.patch
descripion: null
-
owners: alexeykuzmin
file: 068-backport_97f5f9df6988.patch
descripion: null
-
owners: alexeykuzmin
file: 071-add_atomic_lib_to_dependencies_even_for_sysroot_builds.patch
descripion: null
-
owners: zcbenz
file: 073-gin_enable_disable_v8_platform.patch
descripion: null
-
owners: alexeykuzmin
file: 074-backport_015a8b82b8e1.patch
descripion: null
-
owners: deepak1556
file: 074-disable-recursive-surface-sync.patch
descripion: null
-
owners: alexeykuzmin
file: 075-backport_a6977980088b.patch
descripion: null
-
owners: null
file: 075-can_disable_desktop_capture_throttling.patch
descripion: null
-
owners: alexeykuzmin
file: 076-backport_72f0a9302524.patch
descripion: null
-
owners: codebytere
file: 076_patch_catalog_vuln.patch
descripion: |
Several services require "app" capability from all other services
(wildcard), which is in itself probably a Bad Thing; but it's
especially bad now because the catalog service exposes module
directory access through its app capability.
This changes the catalog manifest to move the capability to a
different more specific capability, and updates two of its
consumers.
-
owners: alexeykuzmin
file: 077-backport_22c1deb1bcd1.patch
descripion: null
-
owners: null
file: 077-fix-touchpad-lagging-issue.patch
descripion: |
Fixes the touchpad lagging issue: https://crbug.com/713907, https://crbug.com/793036.
Backported from https://crrev.com/c/867070.
-
owners: alexeykuzmin
file: 078-backport_ea2ad20b708c.patch
descripion: null
-
owners: alexeykuzmin
file: 079-backport_d3131378a4ef.patch
descripion: null
-
owners: alexeykuzmin
file: 080-backport_1d39d46571bb.patch
descripion: null
-
owners: deepak1556
file: 081-blink-worker-enable-csp-in-file-scheme.patch
descripion: null
-
owners: zcbenz
file: 082-fix-arm64-linking-error.patch
descripion: Do not use system freetype for arm64

Просмотреть файл

@ -1,38 +1,3 @@
This disables some debug checks which currently fail when running the Electron
test suite. In general there should be sustained effort to have all debug checks
enabled. If you want to help, choose one of the diffs below and remove it. Then
build Electron (debug configuration) and make sure all tests pass on the CI
systems. Unfortunately the tests don't always cover the check failures, so it's
good to also run some non-trivial Electron app to verify.
Apart from getting rid of a whole diff, you may also be able to replace one diff
with another which enables at least some of the previously disabled checks. For
example, the checks might be disabled for a whole build target, but actually
only one or two specific checks fail. Then it's better to simply comment out the
failing checks and allow the rest of the target to have them enabled.
Please keep the following lists updated.
The ELECTRON_NO_DCHECK build flag disables debug checks universally.
This patch applies the flag to the following GN targets:
third_party/WebKit/Source/core/loader:loader
url:url
These files have debug checks explicitly commented out:
base/memory/weak_ptr.cc
base/process/kill_win.cc
components/viz/service/display/program_binding.h
content/browser/frame_host/navigation_controller_impl.cc
content/browser/frame_host/render_frame_host_impl.cc
content/browser/renderer_host/render_widget_host_view_mac.mm
ppapi/host/ppapi_host.cc
third_party/WebKit/Source/core/dom/Node.cpp
third_party/WebKit/Source/platform/wtf/text/StringImpl.h
ui/base/clipboard/clipboard_win.cc
diff --git a/base/logging.h b/base/logging.h
index 582fb89868cd..24d3e82232b6 100644
--- a/base/logging.h

Просмотреть файл

@ -1,14 +1,3 @@
According to electron/electron#3699, it is unreliable to use |unload|
event for process.exit('exit'), so we have to do that in
willReleaseScriptContext.
However Chromium then disallowed scripting in willReleaseScriptContext
in https://codereview.chromium.org/1657583002, and crash will happen
when there is code doing that.
This patch reverts the change to fix the crash in Electron.
diff --git a/third_party/WebKit/Source/core/frame/LocalFrame.cpp b/third_party/WebKit/Source/core/frame/LocalFrame.cpp
index 97a5393d40b4..04f88dd2ea15 100644
--- a/third_party/WebKit/Source/core/frame/LocalFrame.cpp

Просмотреть файл

@ -1,11 +1,3 @@
Chromium automatically drops all capabilities of renderer threads in
Linux, which may cause issues in a context like Electron, where the main
and renderer threads are supposed to keep inherited permissions over the
system.
See https://github.com/atom/electron/issues/3666
diff --git a/sandbox/linux/services/credentials.cc b/sandbox/linux/services/credentials.cc
index 50a109e..3ee9159 100644
--- a/sandbox/linux/services/credentials.cc

Просмотреть файл

@ -1,13 +1,3 @@
Several services require "app" capability from all other services
(wildcard), which is in itself probably a Bad Thing; but it's
especially bad now because the catalog service exposes module
directory access through its app capability.
This changes the catalog manifest to move the capability to a
different more specific capability, and updates two of its
consumers.
---
diff --git a/services/catalog/manifest.json b/services/catalog/manifest.json
index 4fd82fd..4b31651 100644
--- a/services/catalog/manifest.json

Просмотреть файл

@ -1,6 +1,3 @@
Fix touchpad lagging issue. port from crrev.com/c/867070
---
diff --git a/gpu/ipc/in_process_command_buffer.cc b/gpu/ipc/in_process_command_buffer.cc
index f5ac52f17443..414a7f647028 100644
--- a/gpu/ipc/in_process_command_buffer.cc

6
patches/third_party/angle/.patches.yaml поставляемый Normal file
Просмотреть файл

@ -0,0 +1,6 @@
repo: src/third_party/angle
patches:
-
owners: alespergl
file: 001-dcheck.patch
descripion: null

9
patches/third_party/ffmpeg/.patches.yaml поставляемый Normal file
Просмотреть файл

@ -0,0 +1,9 @@
repo: src/third_party/ffmpeg
patches:
-
owners: alespergl
file: 001-build_gn.patch
descripion: |
Chromium's Mac toolchain sets the "install_name" linker parameter only
when "is_component_build" is true, but we want to set even if it's false,
because we are making a dylib which will be distributed inside a bundle.

Просмотреть файл

@ -1,14 +1,11 @@
diff --git a/BUILD.gn b/BUILD.gn
index fb2b163..6891861 100755
index 6ebb34b68d..9d17fc30c5 100755
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -407,6 +407,13 @@ if (is_component_ffmpeg) {
@@ -420,6 +420,10 @@ if (is_component_ffmpeg) {
# So we can append below and assume they're defined.
ldflags = []
+ # Chromium's Mac toolchain sets the "install_name" linker parameter only
+ # when "is_component_build" is true, but we want to set even if it's false,
+ # because we are making a dylib which will be distributed inside a bundle.
+ if (!is_component_build && is_mac) {
+ ldflags += [ "-Wl,-install_name,@rpath/libffmpeg.dylib" ]
+ }

10
patches/third_party/icu/.patches.yaml поставляемый Normal file
Просмотреть файл

@ -0,0 +1,10 @@
repo: src/third_party/icu
patches:
-
owners: alespergl
file: 001-build_gn.patch
descripion: null
-
owners: zcbenz
file: 002-no_inline_default_constructor.patch
descripion: null

6
patches/third_party/skia/.patches.yaml поставляемый Normal file
Просмотреть файл

@ -0,0 +1,6 @@
repo: src/third_party/skia
patches:
-
owners: alespergl
file: 001-dcheck.patch
descripion: null

18
patches/third_party/webrtc/.patches.yaml поставляемый Normal file
Просмотреть файл

@ -0,0 +1,18 @@
repo: src/third_party/webrtc
patches:
-
owners: alexeykuzmin
file: 001-backport_7f90e2cceda.patch
descripion: "https://webrtc-review.googlesource.com/9384"
-
owners: alexeykuzmin
file: 001-fix_laggy_mouse_during_desktop_capture.patch
descripion: null
-
owners: null
file: 002-webrtc-desktop_capturer_mac.patch
descripion: null
-
owners: null
file: 003-webrtc-rwlock_null.patch
descripion: null

70
patches/v8/.patches.yaml Normal file
Просмотреть файл

@ -0,0 +1,70 @@
repo: src/v8
patches:
-
owners: alespergl
file: 001-build_gn.patch
descripion: null
-
owners: zcbenz
file: 003-array_buffer.patch
descripion: null
-
owners: zcbenz
file: 004-mksnapshot.patch
descripion: null
-
owners: zcbenz
file: 006-ostreams.patch
descripion: null
-
owners: alexeykuzmin
file: 007-export_platform.patch
descripion: null
-
owners: codebytere
file: 024-cherry_pick_37a3a15c3.patch
descripion: null
-
owners: alespergl
file: 026-backport_3ecb047.patch
descripion: |
Fixes security bug
https://bugs.chromium.org/p/project-zero/issues/detail?id=1445
-
owners: alespergl
file: 027-backport_a2b91ed.patch
descripion: |
Fixes security bug
https://bugs.chromium.org/p/project-zero/issues/detail?id=1446
-
owners: codebytere
file: 032-cherry_pick_c690f54d95802.patch
descripion: null
-
owners: codebytere
file: 033-cherry_pick_98c40a4bae915.patch
descripion: null
-
owners: codebytere
file: 035-backport_14ac02c.patch
descripion: null
-
owners: codebytere
file: 037-backport_76c3ac5.patch
descripion: null
-
owners: codebytere
file: 039-cherry_pick_c3458a8.patch
descripion: null
-
owners: codebytere
file: 040-cherry_pick_50f7455.patch
descripion: null
-
owners: codebytere
file: 041-cherry_pick_ac0fe8ec.patch
descripion: null
-
owners: alespergl
file: 099-dcheck.patch
descripion: null

Просмотреть файл

@ -1,6 +1,3 @@
Fixes security bug
https://bugs.chromium.org/p/project-zero/issues/detail?id=1445
diff --git a/src/objects.h b/src/objects.h
index 895d92ba31..700cb84a51 100644
--- a/src/objects.h

Просмотреть файл

@ -1,6 +1,3 @@
Fixes security bug
https://bugs.chromium.org/p/project-zero/issues/detail?id=1446
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc
index 125ca932f7..dd8e4a1745 100644
--- a/src/deoptimizer.cc

Просмотреть файл

@ -1,10 +1,11 @@
#!/usr/bin/env python
import argparse
import os
import subprocess
import sys
from patch import apply_patches_from_directory
from lib.patches import PatchesConfig
SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
@ -16,10 +17,12 @@ SRC_DIR = os.path.join(SOURCE_ROOT, SRC)
def main():
args = parse_args()
folders = [PATCHES_DIR]
if os.environ.has_key('MAS_BUILD'):
folders.append(PATCHES_MAS_DIR)
if sys.argv[1] == 'mips64el':
if args.target_arch == 'mips64el':
folders.append(PATCHES_MIPS64EL_DIR)
for folder in folders:
@ -34,14 +37,25 @@ def main():
def apply_patches_for_dir(directory):
for root, dirs, files in os.walk(directory):
prefix = os.path.relpath(root, directory)
repo = SRC if prefix == '.' else os.path.join(SRC, prefix)
config = PatchesConfig.from_directory(root)
patches_list = config.get_patches_list()
if patches_list is None:
continue
(success, failed_patches) = apply_patches_from_directory(repo, root)
(success, failed_patches) = patches_list.apply()
if not success:
patch_path = failed_patches[0].get_file_path()
return '{0} failed to apply'.format(os.path.basename(patch_path))
def parse_args():
parser = argparse.ArgumentParser(description='Apply all required patches.')
parser.add_argument('-t', '--target-arch',
help='Target architecture')
return parser.parse_args()
if __name__ == '__main__':
sys.exit(main())

Просмотреть файл

@ -26,6 +26,10 @@ def main():
# do so some modules like multiprocessing would break.
shutil.copy(os.path.join('bin', 's3put'), os.path.join('bin', 's3put.py'))
# Install PyYAML.
with util.scoped_cwd(os.path.join('vendor', 'pyyaml')):
subprocess.call([sys.executable, 'setup.py', 'install', '--user'])
if __name__ == '__main__':
sys.exit(main())

Просмотреть файл

@ -1,4 +1,9 @@
# import yaml # TODO: Use for PatchesConfig.
import os
import sys
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(os.path.join(PROJECT_ROOT, 'vendor', 'pyyaml', 'lib'))
import yaml
from git import apply as git_apply
@ -22,6 +27,9 @@ class PatchesList:
def __init__(self, patches):
self.patches = patches
def __len__(self):
return len(self.patches)
def apply(self, reverse=False, stop_on_error=True):
all_patches_applied = True
failed_patches = []
@ -44,37 +52,45 @@ class PatchesList:
class PatchesConfig:
def __init__(self, path):
raise
@staticmethod
def from_directory(dir_path, config_name='.patches.yaml'):
config_path = os.path.join(dir_path, config_name)
return PatchesConfig(config_path)
self.path = path
self.contents = None
self.is_parsed = False
def __init__(self, config_path):
self.path = config_path
def __parse(self):
contents = None
if os.path.isfile(self.path):
with open(self.path, 'r') as stream:
try:
self.contents = yaml.load(stream)
except yaml.YAMLError as exc:
print(exc)
contents = yaml.load(stream)
except yaml.YAMLError as e:
print(e)
self.is_parsed = True
return contents
def __parse_if_needed(self):
if not self.is_parsed:
self.__parse()
def __create_patch(self, raw_data, base_directory, repo_path):
relative_file_path = raw_data['file']
absolute_file_path = os.path.join(base_directory, relative_file_path)
def __create_patch(self, repo_path, raw_data):
file_path = raw_data['file']
return Patch(file_path, repo_path)
return Patch(absolute_file_path, repo_path)
def get_patches_list(self):
self.__parse_if_needed()
if self.contents is None:
config_contents = self.__parse()
if config_contents is None:
return None
repo_path = self.contents['repo'] # TODO: Make it absolute.
raw_patches_data = self.contents['patches']
patches = [self.__create_patch(repo_path, data) for data in raw_patches_data]
repo_path = config_contents['repo']
if sys.platform == 'win32':
repo_path = repo_path.replace('/', '\\')
return patches
patches_data = config_contents['patches']
base_directory = os.path.dirname(self.path)
patches = [self.__create_patch(data, base_directory, repo_path) for data in patches_data]
patches_list = PatchesList(patches)
return patches_list

Просмотреть файл

@ -11,7 +11,7 @@ import os
import subprocess
import sys
from lib.patches import Patch, PatchesList
from lib.patches import Patch, PatchesList, PatchesConfig
def main():
@ -24,7 +24,7 @@ def main():
reverse = args.reverse
if directory:
(success, failed_patches) = apply_patches_from_directory(repo, directory, force, reverse)
(success, failed_patches) = apply_patches_from_directory(directory, force, reverse)
else:
(success, failed_patches) = apply_patches(repo, patches, force, reverse)
@ -44,21 +44,18 @@ def apply_patches(repo_path, patches_paths, force=False, reverse=False):
return patches_list.apply(reverse=reverse, stop_on_error=stop_on_error)
def apply_patches_from_directory(repo, directory, force=False, reverse=False):
# TODO(alexeykuzmin): Use PatchesConfig instead.
# First, get list of ".patch" files.
directory_children = [os.path.join(directory, child) for child in os.listdir(directory)]
patch_files = [path for path in directory_children if os.path.isfile(path) and path.endswith('.patch')]
def apply_patches_from_directory(directory, force=False, reverse=False):
config = PatchesConfig.from_directory(directory)
patches_list = config.get_patches_list()
# Notify user if we didn't find any patch files.
if len(patch_files) == 0:
print 'Warning: No "*.patch" files found in the "{0}" folder.'.format(directory)
if patches_list is None or len(patches_list) == 0:
print 'Warning: No patches found in the "{0}" folder.'.format(directory)
return (True, [])
# Then try to apply patches.
sorted_patch_files = sorted(patch_files, reverse=reverse)
return apply_patches(repo, sorted_patch_files, force=force, reverse=reverse)
stop_on_error = not force
return patches_list.apply(reverse=reverse, stop_on_error=stop_on_error)
def parse_args():
@ -66,14 +63,20 @@ def parse_args():
parser.add_argument('-f', '--force', default=False, action='store_true',
help='Do not stop on the first failed patch.')
parser.add_argument('-R', '--reverse', default=False, action='store_true', help='Apply patches in reverse.')
parser.add_argument('-r', '--repo', required=True, help='Path to a repository root folder.')
parser.add_argument('-r', '--repo', help='Path to a repository root folder.')
paths_group = parser.add_mutually_exclusive_group(required=True)
paths_group.add_argument('-d', '--directory',
help='Path to a directory with "*.patch" files. If present, -p/--patch is ignored.')
help='Path to a directory with patches. If present, -p/--patch is ignored.')
paths_group.add_argument('-p', '--patch', nargs='*', help='Path(s) to a patch file(s).')
return parser.parse_args()
args = parser.parse_args()
# Additional rules.
if args.patch is not None and args.repo is None:
parser.error("Repository path (-r/--repo) is required when you supply patches list.")
return args
if __name__ == '__main__':

Просмотреть файл

@ -217,7 +217,7 @@ def gclient_sync(version, force, git_cache):
def apply_patches(target_arch):
script_path = os.path.join(SOURCE_ROOT, 'script', 'apply-patches')
script_arguments = [target_arch]
script_arguments = ['--target-arch', target_arch]
return subprocess.call([sys.executable, script_path] + script_arguments)

1
vendor/pyyaml поставляемый Submodule

@ -0,0 +1 @@
Subproject commit 7e026bfee9cc0bddeb1bbca0c4a0bcd826c2bfdf