From 0e0c7098e1fd5d9d1e93312e56c588a7000ef1fa Mon Sep 17 00:00:00 2001 From: KaySar12 Date: Tue, 20 May 2025 16:59:27 +0700 Subject: [PATCH] feat: enhance git diff visualization with tree structure --- scripts/interpreter/gen_commit.py | 55 +++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/scripts/interpreter/gen_commit.py b/scripts/interpreter/gen_commit.py index d417d1f..08a1e45 100755 --- a/scripts/interpreter/gen_commit.py +++ b/scripts/interpreter/gen_commit.py @@ -205,14 +205,38 @@ async def commit_and_push_submodules(): print(f"Submodule '{name}' stderr:\n{stderr.decode()}") +def format_tree_output(project_path, project_diff, submodule_diffs): + tree = f"šŸ“¦ {os.path.basename(project_path)}\n" + tree += "└── šŸ“ Changes:\n" + if project_diff: + tree += indent_lines(project_diff, level=2) + else: + tree += indent_lines("āœ“ No changes", level=2) + + if submodule_diffs: + tree += "\n└── šŸ“š Submodules:" + for sub_path, diff in submodule_diffs.items(): + sub_name = os.path.basename(sub_path) + tree += f"\n └── šŸ“¦ {sub_name}\n" + if diff: + tree += indent_lines(diff, level=3, prefix="└── šŸ“ Changes:\n") + else: + tree += " └── āœ“ No changes" + return tree + + +def indent_lines(text, level=1, prefix=""): + indent = " " * level + if prefix: + return f"{indent}{prefix}{indent}{text.replace(chr(10), f'{chr(10)}{indent}')}" + return f"{indent}{text.replace(chr(10), f'{chr(10)}{indent}')}" + + async def push_code(): git_user, git_pass, project_path = get_git_credentials() os.chdir(project_path) print(f"Changed to project path: {project_path}") - - - # Rest of the push_code function remains the same proc = await asyncio.create_subprocess_exec( "git", "remote", @@ -227,8 +251,13 @@ async def push_code(): git_repo = stdout.decode().strip().replace(".git", "").replace("https://", "") remote_url = f"https://{git_user}:{git_pass}@{git_repo}" + # Get main project diff before committing + project_diff = get_git_diff(project_path) + + # Commit & push submodules await commit_and_push_submodules() + # Generate and commit main project commit_msg = gen_commit(project_path) print(f"Generated commit message:\n{commit_msg}\n") @@ -244,21 +273,21 @@ async def push_code(): cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE ) stdout, stderr = await proc.communicate() - if proc.returncode != 0: - print(f"Command failed: {cmd}") - print(stderr.decode()) - elif stderr: - # Not an error; just info output - print(stderr.decode()) - submodule_diffs = {} + if stdout: + print(stdout.decode()) + if stderr: + print(stderr.decode()) + + # Prepare submodule diff tree + submodule_diffs = {} if await has_submodules(): submodule_info = await get_submodule_info() for path in submodule_info: submodule_diffs[path] = get_git_diff(path) - # Format and print the tree output - tree_output = format_tree_output(project_path, submodule_diffs) - print("\nProject Status:") + # Show tree output + tree_output = format_tree_output(project_path, project_diff, submodule_diffs) + print("\nšŸ“¦ Project Tree View:") print(tree_output) print()