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