From 735bb5fe6d4ea058ae68bc533f132d8d66a9c9ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian-Samuel=20Geb=C3=BChr?= Date: Thu, 13 Jul 2023 09:50:42 +0200 Subject: [PATCH] Add merge functionality --- mastodon_blocklist_deploy/cli.py | 38 +++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/mastodon_blocklist_deploy/cli.py b/mastodon_blocklist_deploy/cli.py index 31946d0..217d9ca 100644 --- a/mastodon_blocklist_deploy/cli.py +++ b/mastodon_blocklist_deploy/cli.py @@ -7,7 +7,8 @@ import os import toml from mastodon_blocklist_deploy.models import Instance -from mastodon_blocklist_deploy.helpers import blocklist_to_markdown, blocklist_to_toml, blocklist_to_csv, blocklist_to_json +from mastodon_blocklist_deploy.helpers import blocklist_to_markdown, blocklist_to_toml, blocklist_to_csv, \ + blocklist_to_json def load_blocklist_file(filename: str) -> [Instance]: @@ -63,13 +64,37 @@ def exporter(blocklist, output=None, format: str = "toml", private: bool = False print(exported_text) +def merge(input_file, merge_target, format: str = "toml", private: bool = False, overwrite=False): + input_blocklist = load_blocklist_file(input_file) + merge_target_blocklist = load_blocklist_file(merge_target) + for input_instance in input_blocklist: + # If the block is already there with the same parameters we do nothing + if input_instance in merge_target_blocklist: + continue + # Check if there is a domain in the merge target where the input domain is similar + try: + merge_target_instance = [merge_target_instance for merge_target_instance in merge_target if input_instance.domain == merge_target_instance.domain][0] + if not overwrite: + key_input = "" + while key_input not in ("i", "O"): + print(f"Different settings for {input_instance.domain} detected.") + print(f"In the input blocklist the setting is\n{input_instance} whereas it's {merge_target_instance} in the merge target") + key_input = input("Keep input (i) or original (o) [i/O]") + elif key_input == "i": + merge_target_blocklist.append(merge_target_instance) + else: + merge_target_blocklist.append(input_instance) + except KeyError: + pass + def cli(): parser = argparse.ArgumentParser(description='Deploy blocklist updates to a mastodon server') - parser.add_argument('action', choices=['diff', 'deploy', 'export'], + parser.add_argument('action', choices=['diff', 'deploy', 'export', 'merge'], help="Either use 'diff' to check the difference between local blockĺist and the blocklist on " "the server, 'deploy' to apply the current local blocklist or 'export' to export the remote " - "blocklist into a local file.") + "blocklist into a local file. merge can be used to merge a blocklist (given by -i) into " + "another (-o)") parser.add_argument('-s', '--server', help="The address of the server where you want to deploy (e.g. " "mastodon.social)") parser.add_argument('-t', '--token', help="Authorization token") @@ -92,8 +117,6 @@ def cli(): else: token = os.getenv('MBD_TOKEN') - - """if there is a remote blocklist provided load this instead of fetching it from a server (for debugging reasons)""" if args.remote_blocklist: with open(args.remote_blocklist) as f: @@ -102,7 +125,7 @@ def cli(): remote_blocklist = load_blocklist_from_instance(server=args.server, token=token) """Load local blocklist only when needed""" - if args.action in ["diff", "deploy"]: + if args.action in ["diff", "deploy", "merge"]: if args.input_file: blocklist_filename = args.input_file else: @@ -120,6 +143,9 @@ def cli(): Instance.apply_blocks_from_diff(diffs, args.server, token, args.no_delete) elif args.action == "export": exporter(remote_blocklist, args.output, args.format, args.private) + elif args.action == "merge": + merge(args.input_file, args.output, args.format, args.private) + if __name__ == "__main__": cli()