summaryrefslogtreecommitdiffstats
path: root/toolkit/components/glean/build_scripts/mach_commands.py
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/glean/build_scripts/mach_commands.py')
-rw-r--r--toolkit/components/glean/build_scripts/mach_commands.py227
1 files changed, 227 insertions, 0 deletions
diff --git a/toolkit/components/glean/build_scripts/mach_commands.py b/toolkit/components/glean/build_scripts/mach_commands.py
new file mode 100644
index 0000000000..d385e53605
--- /dev/null
+++ b/toolkit/components/glean/build_scripts/mach_commands.py
@@ -0,0 +1,227 @@
+# 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/.
+
+from mach.decorators import Command, CommandArgument
+
+LICENSE_HEADER = """# 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/.
+"""
+
+GENERATED_HEADER = """
+### This file was AUTOMATICALLY GENERATED by `./mach update-glean-tags`
+### DO NOT edit it by hand.
+"""
+
+
+@Command(
+ "data-review",
+ category="misc",
+ description="Generate a skeleton data review request form for a given bug's data",
+)
+@CommandArgument(
+ "bug", default=None, nargs="?", type=str, help="bug number or search pattern"
+)
+def data_review(command_context, bug=None):
+ # Get the metrics_index's list of metrics indices
+ # by loading the index as a module.
+ import sys
+ from os import path
+
+ sys.path.append(path.join(path.dirname(__file__), path.pardir))
+ from pathlib import Path
+
+ from glean_parser import data_review
+ from metrics_index import metrics_yamls
+
+ return data_review.generate(
+ bug, [Path(command_context.topsrcdir) / x for x in metrics_yamls]
+ )
+
+
+@Command(
+ "perf-data-review",
+ category="misc",
+ description="Generate a skeleton performance data review request form for a given bug's data",
+)
+@CommandArgument(
+ "bug", default=None, nargs="?", type=str, help="bug number or search pattern"
+)
+def perf_data_review(command_context, bug=None):
+ # Get the metrics_index's list of metrics indices
+ # by loading the index as a module.
+ import sys
+ from os import path
+
+ sys.path.append(path.join(path.dirname(__file__), path.pardir))
+ from metrics_index import metrics_yamls
+
+ sys.path.append(path.dirname(__file__))
+ from pathlib import Path
+
+ import perf_data_review
+
+ return perf_data_review.generate(
+ bug, [Path(command_context.topsrcdir) / x for x in metrics_yamls]
+ )
+
+
+@Command(
+ "update-glean-tags",
+ category="misc",
+ description=(
+ "Creates a list of valid glean tags based on in-tree bugzilla component definitions"
+ ),
+)
+def update_glean_tags(command_context):
+ from pathlib import Path
+
+ import yaml
+ from mozbuild.backend.configenvironment import ConfigEnvironment
+ from mozbuild.frontend.reader import BuildReader
+
+ config = ConfigEnvironment(
+ command_context.topsrcdir,
+ command_context.topobjdir,
+ defines=command_context.defines,
+ substs=command_context.substs,
+ )
+
+ reader = BuildReader(config)
+ bug_components = set()
+ for p in reader.read_topsrcdir():
+ if p.get("BUG_COMPONENT"):
+ bug_components.add(p["BUG_COMPONENT"])
+
+ tags_filename = (Path(__file__).parent / "../tags.yaml").resolve()
+
+ tags = {"$schema": "moz://mozilla.org/schemas/glean/tags/1-0-0"}
+ for bug_component in bug_components:
+ product = bug_component.product.strip()
+ component = bug_component.component.strip()
+ tags["{} :: {}".format(product, component)] = {
+ "description": "The Bugzilla component which applies to this object."
+ }
+
+ open(tags_filename, "w").write(
+ "{}\n{}\n\n".format(LICENSE_HEADER, GENERATED_HEADER)
+ + yaml.dump(tags, width=78, explicit_start=True)
+ )
+
+
+def replace_in_file(path, pattern, replace):
+ """
+ Replace `pattern` with `replace` in the file `path`.
+ The file is modified on disk.
+
+ Returns `True` if exactly one replacement happened.
+ `False` otherwise.
+ """
+
+ import re
+
+ with open(path, "r+") as file:
+ data = file.read()
+ data, subs_made = re.subn(pattern, replace, data, flags=re.MULTILINE)
+
+ file.seek(0)
+ file.write(data)
+ file.truncate()
+
+ if subs_made != 1:
+ return False
+
+ return True
+
+
+def replace_in_file_or_die(path, pattern, replace):
+ """
+ Replace `pattern` with `replace` in the file `path`.
+ The file is modified on disk.
+
+ If not exactly one occurrence of `pattern` was replaced it will exit with exit code 1.
+ """
+
+ import sys
+
+ success = replace_in_file(path, pattern, replace)
+ if not success:
+ print(f"ERROR: Failed to replace one occurrence in {path}")
+ print(f" Pattern: {pattern}")
+ print(f" Replace: {replace}")
+ print("File was modified. Check the diff.")
+ sys.exit(1)
+
+
+@Command(
+ "update-glean",
+ category="misc",
+ description="Update Glean to the given version",
+)
+@CommandArgument("version", help="Glean version to upgrade to")
+def update_glean(command_context, version):
+ import textwrap
+ from pathlib import Path
+
+ topsrcdir = Path(command_context.topsrcdir)
+
+ replace_in_file_or_die(
+ topsrcdir / "build.gradle",
+ r'gleanVersion = "[0-9.]+"',
+ f'gleanVersion = "{version}"',
+ )
+ replace_in_file_or_die(
+ topsrcdir / "toolkit" / "components" / "glean" / "Cargo.toml",
+ r'^glean = "[0-9.]+"',
+ f'glean = "{version}"',
+ )
+ replace_in_file_or_die(
+ topsrcdir / "toolkit" / "components" / "glean" / "api" / "Cargo.toml",
+ r'^glean = "[0-9.]+"',
+ f'glean = "{version}"',
+ )
+ replace_in_file_or_die(
+ topsrcdir / "gfx" / "wr" / "webrender" / "Cargo.toml",
+ r'^glean = "[0-9.]+"',
+ f'glean = "{version}"',
+ )
+ replace_in_file_or_die(
+ topsrcdir / "python" / "sites" / "mach.txt",
+ r"glean-sdk==[0-9.]+",
+ f"glean-sdk=={version}",
+ )
+
+ instructions = f"""
+ We've edited most of the necessary files to require Glean SDK {version}.
+
+ You will have to edit the following files yourself:
+
+ gfx/wr/wr_glyph_rasterizer/Cargo.toml
+
+ Then, to ensure Glean and Firefox's other Rust dependencies are appropriately vendored,
+ please run the following commands:
+
+ cargo update -p glean
+ ./mach vendor rust --ignore-modified
+
+ `./mach vendor rust` may identify version mismatches.
+ Please consult the Updating the Glean SDK docs for assistance:
+ https://firefox-source-docs.mozilla.org/toolkit/components/glean/dev/updating_sdk.html
+
+ The Glean SDK is already vetted and no additional vetting for it is necessary.
+ To prune the configuration file after vendoring run:
+
+ ./mach cargo vet prune
+
+ Then, to update webrender which independently relies on the Glean SDK, run:
+
+ cd gfx/wr
+ cargo update -p glean
+
+ Then, to ensure all is well, build Firefox and run the FOG tests.
+ Instructions can be found here:
+ https://firefox-source-docs.mozilla.org/toolkit/components/glean/dev/testing.html
+ """
+
+ print(textwrap.dedent(instructions))