diff options
Diffstat (limited to 'services/settings/dumps/gen_last_modified.py')
-rw-r--r-- | services/settings/dumps/gen_last_modified.py | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/services/settings/dumps/gen_last_modified.py b/services/settings/dumps/gen_last_modified.py new file mode 100644 index 0000000000..d03f8fc096 --- /dev/null +++ b/services/settings/dumps/gen_last_modified.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +# 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/. + +import glob +import json +import os + +import buildconfig +import mozpack.path as mozpath + + +def get_last_modified(full_path_to_remote_settings_dump_file): + """ + Get the last_modified for the given file name. + - File must exist + - Must be a JSON dictionary with a data list and a timestamp, + e.g. `{"data": [], "timestamp": 42}` + - Every element in `data` should contain a "last_modified" key. + - The first element must have the highest "last_modified" value. + """ + with open(full_path_to_remote_settings_dump_file, "r", encoding="utf-8") as f: + changeset = json.load(f) + + records = changeset["data"] + assert isinstance(records, list) + last_modified = changeset.get("timestamp") + assert isinstance( + last_modified, int + ), f"{full_path_to_remote_settings_dump_file} is missing the timestamp. See Bug 1725660" + + return last_modified + + +def main(output): + """ + Generates a JSON file that maps "bucket/collection" to the last_modified + value within. + + Returns a set of the file locations of the recorded RemoteSettings dumps, + so that the build backend can invoke this script again when needed. + + The validity of the JSON file is verified through unit tests at + services/settings/test/unit/test_remote_settings_dump_lastmodified.js + """ + # The following build targets currently use RemoteSettings dumps: + # Firefox https://searchfox.org/mozilla-central/rev/94d6086481754e154b6f042820afab6bc9900a30/browser/installer/package-manifest.in#281-285 # NOQA: E501 + # Firefox for Android https://searchfox.org/mozilla-central/rev/94d6086481754e154b6f042820afab6bc9900a30/mobile/android/installer/package-manifest.in#88-91 # NOQA: E501 + # Thunderbird https://searchfox.org/comm-central/rev/89f957706bbda77e5f34e64e117e7ce121bb5d83/mail/installer/package-manifest.in#280-285 # NOQA: E501 + # SeaMonkey https://searchfox.org/comm-central/rev/89f957706bbda77e5f34e64e117e7ce121bb5d83/suite/installer/package-manifest.in#307-309 # NOQA: E501 + assert buildconfig.substs["MOZ_BUILD_APP"] in ( + "browser", + "mobile/android", + "comm/mail", + "comm/suite", + ), ( + "Cannot determine location of Remote Settings " + f"dumps for platform {buildconfig.substs['MOZ_BUILD_APP']}" + ) + + dumps_locations = [] + if buildconfig.substs["MOZ_BUILD_APP"] == "browser": + dumps_locations += ["services/settings/dumps/"] + elif buildconfig.substs["MOZ_BUILD_APP"] == "mobile/android": + dumps_locations += ["services/settings/dumps/"] + elif buildconfig.substs["MOZ_BUILD_APP"] == "comm/mail": + dumps_locations += ["services/settings/dumps/"] + dumps_locations += ["comm/mail/app/settings/dumps/"] + elif buildconfig.substs["MOZ_BUILD_APP"] == "comm/suite": + dumps_locations += ["services/settings/dumps/"] + + remotesettings_dumps = {} + for dumps_location in dumps_locations: + dumps_root_dir = mozpath.join(buildconfig.topsrcdir, *dumps_location.split("/")) + for path in glob.iglob(mozpath.join(dumps_root_dir, "*", "*.json")): + folder, filename = os.path.split(path) + bucket = os.path.basename(folder) + collection, _ = os.path.splitext(filename) + remotesettings_dumps[f"{bucket}/{collection}"] = path + + output_dict = {} + input_files = set() + + for key, input_file in remotesettings_dumps.items(): + input_files.add(input_file) + output_dict[key] = get_last_modified(input_file) + + json.dump(output_dict, output, sort_keys=True) + return input_files |