awacke1's picture
Create app.py
8e44cb9 verified
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'<a href="data:application/zip;base64,{base64_encoded}" download="{file_name}">Download {file_name}</a>'
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()