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() |