90 lines
2.5 KiB
Python
Executable File
90 lines
2.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import argparse
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
from subprocess import check_output
|
|
|
|
CONFIG = Path.home() / ".config" / "git-ids.json"
|
|
|
|
|
|
def load() -> dict[str, list[str]]:
|
|
if not CONFIG.is_file():
|
|
return {}
|
|
return json.loads(CONFIG.read_text())
|
|
|
|
|
|
def store(d: dict[str, list[str]]):
|
|
CONFIG.parent.mkdir(parents=True, exist_ok=True)
|
|
CONFIG.write_text(json.dumps(d, indent=2))
|
|
print("Saved.")
|
|
|
|
|
|
def cmd_get(args: argparse.Namespace):
|
|
n = load().get(args.alias)
|
|
if n is None:
|
|
exit(128)
|
|
print("\n".join(n))
|
|
|
|
|
|
def cmd_add(args: argparse.Namespace):
|
|
store({args.alias: [args.name, args.email], **load()})
|
|
|
|
|
|
def cmd_add_all(_):
|
|
f = load()
|
|
log = check_output('git log --pretty="%an%n%ae%n%n"', shell=True).decode().strip().split("\n\n")
|
|
log = {tuple(l.strip().split('\n')) for l in log}
|
|
log = {l for l in log if l not in f.values()}
|
|
print(log)
|
|
|
|
# Filter out no-reply
|
|
new_log = []
|
|
for n, _ in log:
|
|
same_name = [(n1, e) for n1, e in log if n1 == n]
|
|
filtered = [(n, e) for n, e in same_name if "noreply.github.com" not in e]
|
|
if len(filtered):
|
|
new_log += filtered
|
|
else:
|
|
new_log += same_name
|
|
log = new_log
|
|
|
|
for l in log:
|
|
a = input(f"Do you want {l} to be added?\nType in an alias if yes, otherwise type enter.\n> ").strip()
|
|
if a:
|
|
f[a] = l
|
|
store(f)
|
|
|
|
|
|
def cmd_list(_):
|
|
print("\n".join(f"{n}: {e[0]}, {e[1]}" for n, e in load().items()))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
raw_args = sys.argv[1:]
|
|
if not raw_args:
|
|
raw_args = ['-h']
|
|
|
|
par = argparse.ArgumentParser("Git ID List")
|
|
sp = par.add_subparsers()
|
|
|
|
get = sp.add_parser("get", usage="Get an identity")
|
|
get.set_defaults(handler=cmd_get)
|
|
get.add_argument("alias", help="Alias of the author")
|
|
|
|
add = sp.add_parser("add", usage="Add an identity")
|
|
add.set_defaults(handler=cmd_add)
|
|
add.add_argument("alias", help="Short alias of the author")
|
|
add.add_argument("name", help="Name shown in git log")
|
|
add.add_argument("email", help="Email shown in git log")
|
|
|
|
add = sp.add_parser("add-all", usage="Ask to add each identity from current git log")
|
|
add.set_defaults(handler=cmd_add_all)
|
|
|
|
add = sp.add_parser("list", usage="List identities")
|
|
add.set_defaults(handler=cmd_list)
|
|
|
|
args = par.parse_args(raw_args)
|
|
if hasattr(args, "handler"):
|
|
args.handler(args)
|