Spaces:
Sleeping
Sleeping
import gradio as gr | |
import subprocess | |
import tempfile | |
import os | |
import shutil | |
from urllib.parse import urlparse | |
def validate_repo_url(url): | |
if not url: | |
return False | |
if '/' in url and len(url.split('/')) == 2: | |
return True | |
try: | |
result = urlparse(url) | |
return all([result.scheme, result.netloc]) | |
except: | |
return False | |
def create_download_file(content): | |
if not content: | |
return None | |
try: | |
temp_file = tempfile.NamedTemporaryFile(delete=False, mode='w', suffix='.txt') | |
temp_file.write(content) | |
temp_file.close() | |
return temp_file.name | |
except Exception as e: | |
print(f"Error creating download file: {str(e)}") | |
return None | |
def pack_repository(repo_url, branch, gh_token, output_style, remove_comments, remove_empty_lines, security_check): | |
if not repo_url: | |
return "Error: Please provide a repository URL", None | |
if not validate_repo_url(repo_url): | |
return "Error: Invalid repository URL format", None | |
temp_dir = None | |
try: | |
temp_dir = tempfile.mkdtemp() | |
cmd = ["npx", "repomix"] | |
cmd.extend(["--remote", repo_url]) | |
if branch: | |
cmd.extend(["--remote-branch", branch]) | |
if gh_token: | |
cmd.extend(["--token", gh_token]) | |
cmd.extend(["--style", output_style]) | |
if remove_comments: | |
cmd.append("--remove-comments") | |
if remove_empty_lines: | |
cmd.append("--remove-empty-lines") | |
if not security_check: | |
cmd.append("--no-security-check") | |
output_file = os.path.join(temp_dir, "repomix-output.txt") | |
cmd.extend(["-o", output_file]) | |
result = subprocess.run( | |
cmd, | |
capture_output=True, | |
text=True, | |
cwd=temp_dir | |
) | |
if result.returncode != 0: | |
return f"Error running Repomix: {result.stderr}", None | |
if not os.path.exists(output_file): | |
return f"Error: Output file was not created. Repomix output: {result.stdout}\n{result.stderr}", None | |
try: | |
with open(output_file, 'r', encoding='utf-8') as f: | |
content = f.read() | |
download_path = create_download_file(content) | |
return content, download_path | |
except Exception as e: | |
return f"Error reading output file: {str(e)}", None | |
except Exception as e: | |
return f"Error: {str(e)}", None | |
finally: | |
if temp_dir and os.path.exists(temp_dir): | |
try: | |
shutil.rmtree(temp_dir) | |
except Exception as e: | |
print(f"Warning: Could not remove temporary directory: {str(e)}") | |
with gr.Blocks(title="Repo to TXT", theme=gr.themes.Soft()) as demo: | |
with gr.Row(): | |
with gr.Column(): | |
repo_url = gr.Textbox( | |
label="Repository URL or GitHub Shorthand", | |
placeholder="e.g., https://github.com/user/repo or user/repo" | |
) | |
branch = gr.Textbox( | |
label="Branch/Tag/Commit (optional)", | |
placeholder="e.g., main, master, v1.0.0" | |
) | |
gh_token = gr.Textbox( | |
label="GitHub Token (for private repos)", | |
placeholder="ghp_xxxxxxxxxxxxxx", | |
type="password" | |
) | |
with gr.Row(): | |
output_style = gr.Radio( | |
choices=["plain", "xml", "markdown"], | |
value="plain", | |
label="Output Style" | |
) | |
with gr.Row(): | |
remove_comments = gr.Checkbox( | |
label="Remove Comments", | |
value=False | |
) | |
remove_empty_lines = gr.Checkbox( | |
label="Remove Empty Lines", | |
value=False | |
) | |
security_check = gr.Checkbox( | |
label="Enable Security Check", | |
value=True | |
) | |
pack_button = gr.Button("Pack Repository", variant="primary") | |
with gr.Row(): | |
output_text = gr.TextArea( | |
label="Output", | |
placeholder="Packed repository content will appear here...", | |
lines=20, | |
show_copy_button=True | |
) | |
with gr.Row(): | |
download_button = gr.File( | |
label="Download Output", | |
file_count="single", | |
type="filepath", | |
interactive=False | |
) | |
pack_button.click( | |
fn=pack_repository, | |
inputs=[repo_url, branch, gh_token, output_style, remove_comments, remove_empty_lines, security_check], | |
outputs=[output_text, download_button] | |
) | |
if __name__ == "__main__": | |
demo.launch() |