Skip to content

Instantly share code, notes, and snippets.

@controversial
Last active November 29, 2019 10:44
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save controversial/bfbe6a75c43aae827f76a7abbf6e2570 to your computer and use it in GitHub Desktop.
Save controversial/bfbe6a75c43aae827f76a7abbf6e2570 to your computer and use it in GitHub Desktop.
# Tool to sort organization repos by star count, as a workaround for https://github.com/isaacs/github/issues/201.
# It would be *awesome* if GitHub could implement this...
import requests, json
USERNAME = "YOUR_USERNAME_HERE"
PASSWORD = "YOUR_PASSWORD_HERE"
def parse_links(linkstr):
# At the end of paging, 'last' is no longer returned as second link
if 'rel="prev"' in linkstr.split(",")[1]:
return False
else:
return linkstr.split(",")[0].split(";")[0].strip(" <>")
def get_repos(org_name):
repos = []
link = "https://api.github.com/orgs/{}/repos?per_page=100&page=1".format(org_name)
while link:
req=requests.get(link, auth=(USERNAME, PASSWORD))
repos.extend([(r["name"], r["stargazers_count"]) for r in json.loads(req.text)])
link = parse_links(req.headers["link"])
return repos
def get_sorted_repos(org_name):
repos = get_repos(org_name)
sortedRepos = sorted(repos, key=lambda x: x[1])
return reversed(sortedRepos)
def pretty_print_repos(org_name, num_repos=None):
repos = get_sorted_repos(org_name)
if num_repos:
repos = list(repos)[:num_repos]
for i, (repo, stars) in enumerate(repos):
print("{}: {} ({} stars)".format(i+1, repo, stars))
if __name__ == "__main__":
pretty_print_repos("Mozilla", 100)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment