import streamlit as st import requests import os import shutil import zipfile from github import Github from git import Repo from datetime import datetime import base64 def download_github_repo(url, local_path): if os.path.exists(local_path): shutil.rmtree(local_path) Repo.clone_from(url, local_path) def create_zip_file(source_dir, output_filename): shutil.make_archive(output_filename, 'zip', source_dir) def create_repo(g, repo_name): user = g.get_user() return user.create_repo(repo_name) def push_to_github(local_path, repo, github_token): repo_url = f"https://{github_token}@github.com/{repo.full_name}.git" local_repo = Repo(local_path) if 'origin' in [remote.name for remote in local_repo.remotes]: origin = local_repo.remote('origin') origin.set_url(repo_url) else: origin = local_repo.create_remote('origin', repo_url) if not local_repo.heads: local_repo.git.checkout('-b', 'main') current_branch = 'main' else: current_branch = local_repo.active_branch.name local_repo.git.add(A=True) if local_repo.is_dirty(): local_repo.git.commit('-m', 'Initial commit') origin.push(refspec=f'{current_branch}:{current_branch}') def get_base64_download_link(file_path, file_name): with open(file_path, "rb") as file: contents = file.read() base64_encoded = base64.b64encode(contents).decode() return f'Download {file_name}' def main(): st.title("GitHub Repository Cloner and Uploader") st.sidebar.title("How to Get Your GitHub Token") st.sidebar.markdown(""" 1. Go to your GitHub account settings 2. Click on 'Developer settings' in the left sidebar 3. Click on 'Personal access tokens' and then 'Tokens (classic)' 4. Click 'Generate new token' and select 'Generate new token (classic)' 5. Give your token a descriptive name 6. Select the following scopes: - repo (all) - delete_repo 7. Click 'Generate token' at the bottom of the page 8. Copy your new token immediately (you won't be able to see it again!) **Important:** Keep your token secret and secure. Treat it like a password! """) source_repo = st.text_input("Source GitHub Repository URL", value="https://github.com/AaronCWacker/AIExamples-8-24-Streamlit/") github_token = os.environ.get("GITHUB") if not github_token: github_token = st.text_input("GitHub Personal Access Token", type="password", help="Paste your GitHub token here. See sidebar for instructions on how to get it.") checkin_clone = st.checkbox("Checkin Clone", value=False) if st.button("Clone"): if not github_token: st.error("Please enter a GitHub token. See the sidebar for instructions.") return with st.spinner("Processing..."): try: timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") new_repo_name = f"AIExample-Clone-{timestamp}" local_path = f"./temp_repo_{timestamp}" download_github_repo(source_repo, local_path) zip_filename = f"{new_repo_name}.zip" create_zip_file(local_path, zip_filename[:-4]) # Remove .zip extension for make_archive st.markdown(get_base64_download_link(zip_filename, zip_filename), unsafe_allow_html=True) if checkin_clone: g = Github(github_token) new_repo = create_repo(g, new_repo_name) push_to_github(local_path, new_repo, github_token) # Upload zip file to the new repository repo = g.get_repo(new_repo.full_name) with open(zip_filename, 'rb') as file: content = file.read() repo.create_file(zip_filename, f"Add {zip_filename}", content, branch="main") st.success(f"Repository cloned and uploaded successfully to {new_repo.html_url}!") else: st.success("Repository cloned successfully! Use the download link above to get the zip file.") except Exception as e: st.error(f"An error occurred: {str(e)}") finally: if os.path.exists(local_path): shutil.rmtree(local_path) if os.path.exists(zip_filename): os.remove(zip_filename) if __name__ == "__main__": main()