diff --git a/vimtabdiff.py b/vimtabdiff.py index dc07043..1e961d0 100755 --- a/vimtabdiff.py +++ b/vimtabdiff.py @@ -4,7 +4,8 @@ import os,sys import argparse import pathlib import itertools -from pathlib import Path +import tempfile +import subprocess def parse_args(): parser = argparse.ArgumentParser(description="Show diff in vim tab pages") @@ -12,11 +13,12 @@ def parse_args(): parser.add_argument("pathB") return parser.parse_args() -def get_dir_info(dirname: Path): +def get_dir_info(dirname): if not dirname: return [],[] dirs, files = [], [] - for p in dirname.iterdir(): + dirp = pathlib.Path(dirname) + for p in dirp.iterdir(): if p.is_dir(): dirs.append(p) else: @@ -26,14 +28,14 @@ def get_dir_info(dirname: Path): def get_pairs(aItems, bItems): aItems = [(item, 'A') for item in aItems] bItems = [(item, 'B') for item in bItems] - items = sorted(aItems + bItems) - for _, items in itertools.groupby(items, lambda item: item[0].name): + abItems = aItems + bItems + abItems.sort(key= lambda item: (item[0].name, item[1])) + for _, items in itertools.groupby(abItems, lambda item: item[0].name): items = list(items) if len(items) == 2: (aItem, _), (bItem, _) = items yield aItem, bItem else: - assert(len(items) == 1) (item, tag), = items if tag == 'A': yield item, None @@ -41,8 +43,8 @@ def get_pairs(aItems, bItems): yield None, item def get_file_pairs(a, b): - aDirs, aFiles = get_dir_info(Path(a)) - bDirs, bFiles = get_dir_info(Path(b)) + aDirs, aFiles = get_dir_info(a) + bDirs, bFiles = get_dir_info(b) yield from get_pairs(aFiles, bFiles) for aDir, bDir in get_pairs(aDirs, bDirs): yield from get_file_pairs(aDir, bDir) @@ -50,8 +52,14 @@ def get_file_pairs(a, b): def main(): args = parse_args() print("Helloworld") - for a, b in get_file_pairs(args.pathA, args.pathB): - print(f"{a=}, {b=}") + vimCmdFile = tempfile.NamedTemporaryFile(mode='w', delete=False) + with vimCmdFile: + for a, b in get_file_pairs(args.pathA, args.pathB): + aPath = str(a) if a else "/dev/null" + bPath = str(b) if b else "/dev/null" + print(f"tabedit {aPath} | diffthis | vsp {bPath} | diffthis", file=vimCmdFile) + print(f"""call delete("{vimCmdFile.name}")""", file=vimCmdFile) + subprocess.run(["vim", "-S", vimCmdFile.name]) if __name__ == '__main__': main()