CalleCaje's picture
feat: create git repository explorer app with diff, tree, and README viewing capabilities
bd89e7e
import gradio as gr
import sys
from git_diff_utils import get_latest_commit_diff
from git_tree_utils import get_repo_tree_structure, print_tree
from git_readme_utils import get_repo_readme
def get_diff(repo_source, commit_depth=1):
"""
Get the diff of a specific commit from a git repository.
Args:
repo_source (str): Path to local repository or URL to remote repository
commit_depth (int, optional): How many commits back to check (default=1 for latest commit)
Returns:
str: The git diff output formatted as text
"""
try:
commit_depth = int(commit_depth)
if commit_depth < 1:
return "Error: commit_depth must be a positive integer"
except ValueError:
return "Error: commit_depth must be an integer"
print(f"Getting diff for repository: {repo_source} (commit depth: {commit_depth})")
diff = get_latest_commit_diff(repo_source, commit_depth)
return diff
def get_tree(repo_source, commit_depth=1):
"""
Get the tree structure of a git repository at a specific commit.
Args:
repo_source (str): Path to local repository or URL to remote repository
commit_depth (int, optional): How many commits back to check (default=1 for latest commit)
Returns:
str: The formatted tree structure as text
"""
try:
commit_depth = int(commit_depth)
if commit_depth < 1:
return "Error: commit_depth must be a positive integer"
except ValueError:
return "Error: commit_depth must be an integer"
print(f"Getting tree structure for repository: {repo_source} (commit depth: {commit_depth})")
tree = get_repo_tree_structure(repo_source, commit_depth)
if isinstance(tree, dict):
# Capture the output of print_tree to a string
import io
from contextlib import redirect_stdout
f = io.StringIO()
with redirect_stdout(f):
print("Repository Structure:")
print_tree(tree)
output = f.getvalue()
return output
else:
return tree # Error message
def get_readme(repo_source, commit_depth=1):
"""
Get the README content from a git repository at a specific commit.
Args:
repo_source (str): Path to local repository or URL to remote repository
commit_depth (int, optional): How many commits back to check (default=1 for latest commit)
Returns:
str: The content of the README file or an error message
"""
try:
commit_depth = int(commit_depth)
if commit_depth < 1:
return "Error: commit_depth must be a positive integer"
except ValueError:
return "Error: commit_depth must be an integer"
print(f"Getting README for repository: {repo_source} (commit depth: {commit_depth})")
result = get_repo_readme(repo_source, commit_depth)
if isinstance(result, tuple):
readme_file, readme_content = result
return f"README File: {readme_file}\n\n{readme_content}"
else:
return result # Error message
# Create the Gradio interface
with gr.Blocks(title="Git Repository Explorer") as demo:
gr.Markdown("# Git Repository Explorer")
# Feature selection
feature = gr.Radio(
choices=["View Commit Diff", "View Repository Structure", "View README"],
value="View Commit Diff",
label="Select Feature"
)
# Common inputs for all features
with gr.Row():
with gr.Column():
repo_input = gr.Textbox(
label="Repository Path or URL",
placeholder="Enter local path or remote URL (e.g., https://github.com/username/repo.git)",
lines=1
)
depth_input = gr.Number(
label="Commit Depth",
value=1,
minimum=1,
step=1,
info="How many commits back to check (1 = latest commit)"
)
submit_btn = gr.Button("Execute", variant="primary")
# Output area
output = gr.TextArea(
label="Output",
lines=20,
max_lines=50,
show_copy_button=True
)
# Function to handle feature selection and execution
def process_request(feature_selection, repo_source, commit_depth):
if feature_selection == "View Commit Diff":
return get_diff(repo_source, commit_depth)
elif feature_selection == "View Repository Structure":
return get_tree(repo_source, commit_depth)
elif feature_selection == "View README":
return get_readme(repo_source, commit_depth)
return "Please select a feature"
# Update button text based on feature selection
def update_button_text(feature_selection):
if feature_selection == "View Commit Diff":
return "Get Diff"
elif feature_selection == "View Repository Structure":
return "Get Tree Structure"
elif feature_selection == "View README":
return "Get README"
return "Execute"
# Update output label based on feature selection
def update_output_label(feature_selection):
if feature_selection == "View Commit Diff":
return "Diff Output"
elif feature_selection == "View Repository Structure":
return "Repository Structure"
elif feature_selection == "View README":
return "README Content"
return "Output"
# Set up events
feature.change(fn=update_button_text, inputs=feature, outputs=submit_btn)
feature.change(fn=update_output_label, inputs=feature, outputs=output)
submit_btn.click(
fn=process_request,
inputs=[feature, repo_input, depth_input],
outputs=output
)
gr.Markdown("""
### Instructions:
1. Select the feature you want to use
2. Enter a git repository path or URL
3. Specify how many commits back to check (default: 1 for the latest commit)
4. Click the execute button
This tool can handle both local repositories and remote URLs automatically.
#### Features:
- **View Commit Diff**: Shows the differences made in a specific commit
- **View Repository Structure**: Displays the tree structure of the repository at a specific commit
- **View README**: Shows the content of the README file if present in the repository
""")
# Launch the app with MCP server enabled
if __name__ == "__main__":
#demo.launch(share=True, mcp_server=True)
demo.launch(share=False, server_name="0.0.0.0", server_port=7860, mcp_server=True)