Add merge functionality

This commit is contained in:
moanos [he/him] 2023-07-13 09:50:42 +02:00
parent 2180f28c78
commit 735bb5fe6d

View File

@ -7,7 +7,8 @@ import os
import toml import toml
from mastodon_blocklist_deploy.models import Instance 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]: 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) 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(): def cli():
parser = argparse.ArgumentParser(description='Deploy blocklist updates to a mastodon server') 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 " 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 " "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. " parser.add_argument('-s', '--server', help="The address of the server where you want to deploy (e.g. "
"mastodon.social)") "mastodon.social)")
parser.add_argument('-t', '--token', help="Authorization token") parser.add_argument('-t', '--token', help="Authorization token")
@ -92,8 +117,6 @@ def cli():
else: else:
token = os.getenv('MBD_TOKEN') 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 there is a remote blocklist provided load this instead of fetching it from a server (for debugging reasons)"""
if args.remote_blocklist: if args.remote_blocklist:
with open(args.remote_blocklist) as f: with open(args.remote_blocklist) as f:
@ -102,7 +125,7 @@ def cli():
remote_blocklist = load_blocklist_from_instance(server=args.server, token=token) remote_blocklist = load_blocklist_from_instance(server=args.server, token=token)
"""Load local blocklist only when needed""" """Load local blocklist only when needed"""
if args.action in ["diff", "deploy"]: if args.action in ["diff", "deploy", "merge"]:
if args.input_file: if args.input_file:
blocklist_filename = args.input_file blocklist_filename = args.input_file
else: else:
@ -120,6 +143,9 @@ def cli():
Instance.apply_blocks_from_diff(diffs, args.server, token, args.no_delete) Instance.apply_blocks_from_diff(diffs, args.server, token, args.no_delete)
elif args.action == "export": elif args.action == "export":
exporter(remote_blocklist, args.output, args.format, args.private) 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__": if __name__ == "__main__":
cli() cli()