Skip to content

Instantly share code, notes, and snippets.

@taskylizard
Forked from pdashford/gh-download.py
Created January 17, 2022 09:08
Show Gist options
  • Select an option

  • Save taskylizard/502493c63b4602c1f011f0da7b3012b2 to your computer and use it in GitHub Desktop.

Select an option

Save taskylizard/502493c63b4602c1f011f0da7b3012b2 to your computer and use it in GitHub Desktop.
Python script to download folders from Github repo
"""
Downloads folders from github repo
Requires PyGithub
pip install PyGithub
"""
import os
import sys
import base64
import shutil
import getopt
from github import Github
from github import GithubException
def get_sha_for_tag(repository, tag):
"""
Returns a commit PyGithub object for the specified repository and tag.
"""
branches = repository.get_branches()
matched_branches = [match for match in branches if match.name == tag]
if matched_branches:
return matched_branches[0].commit.sha
tags = repository.get_tags()
matched_tags = [match for match in tags if match.name == tag]
if not matched_tags:
raise ValueError('No Tag or Branch exists with that name')
return matched_tags[0].commit.sha
def download_directory(repository, sha, server_path):
"""
Download all contents at server_path with commit tag sha in
the repository.
"""
if os.path.exists(server_path):
shutil.rmtree(server_path)
os.makedirs(server_path)
contents = repository.get_dir_contents(server_path, ref=sha)
for content in contents:
print "Processing %s" % content.path
if content.type == 'dir':
os.makedirs(content.path)
download_directory(repository, sha, content.path)
else:
try:
path = content.path
file_content = repository.get_contents(path, ref=sha)
file_data = base64.b64decode(file_content.content)
file_out = open(content.path, "w+")
file_out.write(file_data)
file_out.close()
except (GithubException, IOError) as exc:
print('Error processing %s: %s', content.path, exc)
def usage():
"""
Prints the usage command lines
"""
print "usage: gh-download --token=token --org=org --repo=repo --branch=branch --folder=folder"
def main(argv):
"""
Main function block
"""
try:
opts, args = getopt.getopt(argv, "t:o:r:b:f:", ["token=", "org=", "repo=", "branch=", "folder="])
except getopt.GetoptError as err:
print str(err)
usage()
sys.exit(2)
for opt, arg in opts:
if opt in ("-t", "--token"):
token = arg
elif opt in ("-o", "--org"):
org = arg
elif opt in ("-r", "--repo"):
repo = arg
elif opt in ("-b", "--branch"):
branch = arg
elif opt in ("-f", "--folder"):
folder = arg
github = Github(token)
organization = github.get_organization(org)
repository = organization.get_repo(repo)
sha = get_sha_for_tag(repository, branch)
download_directory(repository, sha, folder)
if __name__ == "__main__":
"""
Entry point
"""
main(sys.argv[1:])
@burgeeblue
Copy link

Whether you're managing salary caps or going for the perfect playoff run, Retro Bowl is a must-play for sports fans and retro gaming lovers alike.

@farhanali67h-jpg
Copy link

This blog will guide you through the common problems you might face and provide you with solutions to make obtaining your PNP clearance easy. So, whether you’re applying for a new police clearance , a visa, or simply need an updated document, read on and learn how to get your PNP clearance easily.

@slopeballgame
Copy link

This script lets you download entire folders from a GitHub repo with ease! You can also try out awesome FNF Mods at fnfmods.io for new music and super fun rhythm challenges.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment