Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

build: export matching patches #41287

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
42 changes: 15 additions & 27 deletions patches/config.json
@@ -1,27 +1,15 @@
{
"src/electron/patches/chromium": "src",

"src/electron/patches/boringssl": "src/third_party/boringssl/src",

"src/electron/patches/devtools_frontend": "src/third_party/devtools-frontend/src",

"src/electron/patches/ffmpeg": "src/third_party/ffmpeg",

"src/electron/patches/v8": "src/v8",

"src/electron/patches/node": "src/third_party/electron_node",

"src/electron/patches/nan": "src/third_party/nan",

"src/electron/patches/perfetto": "src/third_party/perfetto",

"src/electron/patches/squirrel.mac": "src/third_party/squirrel.mac",

"src/electron/patches/Mantle": "src/third_party/squirrel.mac/vendor/Mantle",

"src/electron/patches/ReactiveObjC": "src/third_party/squirrel.mac/vendor/ReactiveObjC",

"src/electron/patches/webrtc": "src/third_party/webrtc",

"src/electron/patches/reclient-configs": "src/third_party/engflow-reclient-configs"
}
[
{ "patch_dir": "src/electron/patches/chromium", "repo": "src" },
{ "patch_dir": "src/electron/patches/boringssl", "repo": "src/third_party/boringssl/src" },
{ "patch_dir": "src/electron/patches/devtools_frontend", "repo": "src/third_party/devtools-frontend/src" },
{ "patch_dir": "src/electron/patches/ffmpeg", "repo": "src/third_party/ffmpeg" },
{ "patch_dir": "src/electron/patches/v8", "repo": "src/v8" },
{ "patch_dir": "src/electron/patches/node", "repo": "src/third_party/electron_node" },
{ "patch_dir": "src/electron/patches/nan", "repo": "src/third_party/nan" },
{ "patch_dir": "src/electron/patches/perfetto", "repo": "src/third_party/perfetto" },
{ "patch_dir": "src/electron/patches/squirrel.mac", "repo": "src/third_party/squirrel.mac" },
{ "patch_dir": "src/electron/patches/Mantle", "repo": "src/third_party/squirrel.mac/vendor/Mantle" },
{ "patch_dir": "src/electron/patches/ReactiveObjC", "repo": "src/third_party/squirrel.mac/vendor/ReactiveObjC" },
{ "patch_dir": "src/electron/patches/webrtc", "repo": "src/third_party/webrtc" },
{ "patch_dir": "src/electron/patches/reclient-configs", "repo": "src/third_party/engflow-reclient-configs" }
]
34 changes: 22 additions & 12 deletions script/apply_all_patches.py
Expand Up @@ -3,19 +3,30 @@
import argparse
import json
import os
import warnings

from lib import git
from lib.patches import patch_from_dir


def apply_patches(dirs):
threeway = os.environ.get("ELECTRON_USE_THREE_WAY_MERGE_FOR_PATCHES")
for patch_dir, repo in dirs.items():
if os.path.exists(repo):
git.import_patches(repo=repo, patch_data=patch_from_dir(patch_dir),
threeway=threeway is not None,
committer_name="Electron Scripts", committer_email="scripts@electron")

THREEWAY = "ELECTRON_USE_THREE_WAY_MERGE_FOR_PATCHES" in os.environ

def apply_patches(target):
repo = target.get('repo')
if not os.path.exists(repo):
warnings.warn('repo not found: %s' % repo)
return
patch_dir = target.get('patch_dir')
git.import_patches(
committer_email="scripts@electron",
committer_name="Electron Scripts",
patch_data=patch_from_dir(patch_dir),
repo=repo,
threeway=THREEWAY,
)

def apply_config(config):
for target in config:
apply_patches(target)

def parse_args():
parser = argparse.ArgumentParser(description='Apply Electron patches')
Expand All @@ -26,9 +37,8 @@ def parse_args():


def main():
configs = parse_args().config
for config_json in configs:
apply_patches(json.load(config_json))
for config_json in parse_args().config:
apply_config(json.load(config_json))


if __name__ == '__main__':
Expand Down
23 changes: 18 additions & 5 deletions script/export_all_patches.py
Expand Up @@ -3,14 +3,27 @@
import argparse
import json
import os
import warnings

from lib import git


def export_patches(dirs, dry_run):
for patch_dir, repo in dirs.items():
if os.path.exists(repo):
git.export_patches(repo=repo, out_dir=patch_dir, dry_run=dry_run)
def export_patches(target, dry_run):
repo = target.get('repo')
if not os.path.exists(repo):
warnings.warn('repo not found: %s' % repo)
return
git.export_patches(
dry_run=dry_run,
grep=target.get('grep'),
out_dir=target.get('patch_dir'),
repo=repo
)


def export_config(config, dry_run):
for target in config:
export_patches(target, dry_run)


def parse_args():
Expand All @@ -28,7 +41,7 @@ def main():
configs = parse_args().config
dry_run = parse_args().dry_run
for config_json in configs:
export_patches(json.load(config_json), dry_run)
export_config(json.load(config_json), dry_run)


if __name__ == '__main__':
Expand Down
4 changes: 3 additions & 1 deletion script/git-export-patches
Expand Up @@ -10,13 +10,15 @@ def main(argv):
parser.add_argument("-o", "--output",
help="directory into which exported patches will be written",
required=True)
parser.add_argument("--grep",
help="only export patches matching a keyword")
parser.add_argument("patch_range",
nargs='?',
help="range of patches to export. Defaults to all commits since the "
"most recent tag or remote branch.")
args = parser.parse_args(argv)

git.export_patches('.', args.output, patch_range=args.patch_range)
git.export_patches('.', args.output, patch_range=args.patch_range, grep=args.grep)


if __name__ == '__main__':
Expand Down
15 changes: 14 additions & 1 deletion script/lib/git.py
Expand Up @@ -149,6 +149,7 @@ def format_patch(repo, since):
'format-patch',
'--keep-subject',
'--no-stat',
'--notes',
'--stdout',

# Per RFC 3676 the signature is separated from the body by a line with
Expand Down Expand Up @@ -181,6 +182,16 @@ def split_patches(patch_data):
patches[-1].append(line)
return patches

def filter_patches(patches, key):
"""Return patches that include the specified key"""
if key is None:
return patches
matches = []
for patch in patches:
if any(key in line for line in patch):
matches.append(patch)
continue
return matches

def munge_subject_to_filename(subject):
"""Derive a suitable filename from a commit's subject"""
Expand Down Expand Up @@ -227,7 +238,7 @@ def remove_patch_filename(patch):
force_keep_next_line = l.startswith('Subject: ')


def export_patches(repo, out_dir, patch_range=None, dry_run=False):
def export_patches(repo, out_dir, patch_range=None, dry_run=False, grep=None):
if not os.path.exists(repo):
sys.stderr.write(
"Skipping patches in {} because it does not exist.\n".format(repo)
Expand All @@ -239,6 +250,8 @@ def export_patches(repo, out_dir, patch_range=None, dry_run=False):
num_patches, repo, patch_range[0:7]))
patch_data = format_patch(repo, patch_range)
patches = split_patches(patch_data)
if grep:
patches = filter_patches(patches, grep)

try:
os.mkdir(out_dir)
Expand Down
5 changes: 2 additions & 3 deletions script/lint.js
Expand Up @@ -201,10 +201,9 @@ const LINTERS = [{
process.exit(1);
}

const config = JSON.parse(fs.readFileSync(patchesConfig, 'utf8'));
for (const key of Object.keys(config)) {
for (const target of JSON.parse(fs.readFileSync(patchesConfig, 'utf8'))) {
// The directory the config points to should exist
const targetPatchesDir = path.resolve(__dirname, '../../..', key);
const targetPatchesDir = path.resolve(__dirname, '../../..', target.patch_dir);
if (!fs.existsSync(targetPatchesDir)) {
console.error(`target patch directory: "${targetPatchesDir}" does not exist`);
process.exit(1);
Expand Down
4 changes: 3 additions & 1 deletion script/patches-mtime-cache.py
Expand Up @@ -12,7 +12,9 @@


def patched_file_paths(patches_config):
for patch_dir, repo in patches_config.items():
for target in patches_config:
patch_dir = target.get('patch_dir')
repo = target.get('repo')
for line in patch_from_dir(patch_dir).split("\n"):
if line.startswith("+++"):
yield posixpath.join(repo, line[6:])
Expand Down