123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #!/usr/bin/env python3
- #
- # This script removes the given package entries in the bundled_packages JSON files. This is used by the PluginInstall
- # CMake module.
- #
- import argparse
- import collections
- import json
- import os
- import sys
- ## Finds all JSON files in the given directory recursively and returns a list of those files in absolute paths.
- #
- # \param work_dir The directory to look for JSON files recursively.
- # \return A list of JSON files in absolute paths that are found in the given directory.
- def find_json_files(work_dir: str) -> list:
- json_file_list = []
- for root, dir_names, file_names in os.walk(work_dir):
- for file_name in file_names:
- abs_path = os.path.abspath(os.path.join(root, file_name))
- json_file_list.append(abs_path)
- return json_file_list
- ## Removes the given entries from the given JSON file. The file will modified in-place.
- #
- # \param file_path The JSON file to modify.
- # \param entries A list of strings as entries to remove.
- # \return None
- def remove_entries_from_json_file(file_path: str, entries: list) -> None:
- try:
- with open(file_path, "r", encoding = "utf-8") as f:
- package_dict = json.load(f, object_hook = collections.OrderedDict)
- except Exception as e:
- msg = "Failed to load '{file_path}' as a JSON file. This file will be ignored Exception: {e}"\
- .format(file_path = file_path, e = e)
- sys.stderr.write(msg + os.linesep)
- return
- for entry in entries:
- if entry in package_dict:
- del package_dict[entry]
- print("[INFO] Remove entry [{entry}] from [{file_path}]".format(file_path = file_path, entry = entry))
- try:
- with open(file_path, "w", encoding = "utf-8", newline = "\n") as f:
- json.dump(package_dict, f, indent = 4)
- except Exception as e:
- msg = "Failed to write '{file_path}' as a JSON file. Exception: {e}".format(file_path = file_path, e = e)
- raise IOError(msg)
- def main() -> None:
- parser = argparse.ArgumentParser("mod_bundled_packages_json")
- parser.add_argument("-d", "--dir", dest = "work_dir",
- help = "The directory to look for bundled packages JSON files, recursively.")
- parser.add_argument("entries", metavar = "ENTRIES", type = str, nargs = "+")
- args = parser.parse_args()
- json_file_list = find_json_files(args.work_dir)
- for json_file_path in json_file_list:
- remove_entries_from_json_file(json_file_path, args.entries)
- if __name__ == "__main__":
- main()
|