Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import git | |
| import os | |
| import tempfile | |
| import shutil | |
| def is_text_file(file_path): | |
| """Check if a file is likely to be a text file.""" | |
| try: | |
| with open(file_path, 'r', encoding='utf-8') as f: | |
| f.read(1024) # Try to read the first 1024 bytes | |
| return True | |
| except UnicodeDecodeError: | |
| return False | |
| except Exception: | |
| return False | |
| def clone_and_concatenate(repo_url): | |
| # Create a temporary directory | |
| temp_dir = tempfile.mkdtemp() | |
| output_file = os.path.join(temp_dir, "concatenated_files.txt") | |
| try: | |
| # Clone the repository | |
| git.Repo.clone_from(repo_url, temp_dir) | |
| # Walk through all files in the repository | |
| with open(output_file, 'w', encoding='utf-8') as outfile: | |
| for root, dirs, files in os.walk(temp_dir): | |
| # Skip .git directory | |
| if '.git' in dirs: | |
| dirs.remove('.git') | |
| for file in files: | |
| if file == "concatenated_files.txt": | |
| continue | |
| file_path = os.path.join(root, file) | |
| relative_path = os.path.relpath(file_path, temp_dir) | |
| # Check if the file is a text file | |
| if is_text_file(file_path): | |
| try: | |
| with open(file_path, 'r', encoding='utf-8') as infile: | |
| outfile.write(f"\n\n{'='*80}\n") | |
| outfile.write(f"File: {relative_path}\n") | |
| outfile.write(f"{'='*80}\n\n") | |
| outfile.write(infile.read()) | |
| except Exception as e: | |
| outfile.write(f"\nError reading file {relative_path}: {str(e)}\n") | |
| except Exception as e: | |
| # Clean up the temporary directory | |
| shutil.rmtree(temp_dir) | |
| return None, f"Error: {str(e)}" | |
| return output_file, "Repository cloned and files concatenated successfully!" | |
| # Create the Gradio interface | |
| iface = gr.Interface( | |
| fn=clone_and_concatenate, | |
| inputs=gr.Textbox(label="Git Repository URL"), | |
| outputs=[ | |
| gr.File(label="Concatenated Files"), | |
| gr.Textbox(label="Status") | |
| ], | |
| title="Git Repository File Concatenator", | |
| description="Enter a Git repository URL to clone it and concatenate all text files into a single downloadable file.", | |
| examples=[["https://github.com/username/repository"]] | |
| ) | |
| # Launch the app | |
| if __name__ == "__main__": | |
| iface.launch() |