Skip to content

Instantly share code, notes, and snippets.

@ryjen
Created February 23, 2024 07:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryjen/a33bd3fb962f970a200976af0036d9f0 to your computer and use it in GitHub Desktop.
Save ryjen/a33bd3fb962f970a200976af0036d9f0 to your computer and use it in GitHub Desktop.
List Repositories for xarg actions
#!/usr/bin/env python
import argparse
import json
import logging
import os
import re
import sys
import requests
import requests.auth
GITHUB_API = "https://api.github.com"
GITLAB_API = "https://api.gitlab.com"
BITBUCKET_API = "https://api.bitbucket.org"
re_link = re.compile('<(?P<url>[^>]+)>; rel="(?P<rel>[^"]+)"')
LOG = logging.getLogger("repolist")
def parse_args():
p = argparse.ArgumentParser()
p.add_argument("--github-token")
p.add_argument("--gitlab-token")
p.add_argument("--bitbucket-token")
p.add_argument(
"--debug", "-d", action="store_const", const=logging.DEBUG, dest="loglevel"
)
p.set_defaults(loglevel=logging.INFO)
return p.parse_args()
def split_link(links):
linkmap = {}
for link in links.split(", "):
mo = re_link.match(link)
if not mo:
continue
linkmap[mo.group("rel")] = mo.group("url")
return linkmap
def list_repos(token, api):
password = "x-oauth-basic"
auth = requests.auth.HTTPBasicAuth(token, password)
url = "%s/user/repos" % api
repos = []
LOG.info("reading list of repositories")
while True:
r = requests.get(url, auth=auth)
r.raise_for_status()
repos.extend(r.json())
if "link" not in r.headers:
break
links = split_link(r.headers["link"])
if "next" not in links:
break
url = links["next"]
LOG.info("found %d repositories", len(repos))
print("\n".join(x["url"] for x in repos))
def main():
args = parse_args()
logging.basicConfig(level=args.loglevel)
reqlog = logging.getLogger("requests")
reqlog.setLevel(logging.WARN)
if args.github_token:
list_repos(args.github_token, GITHUB_API)
if args.gitlab_token:
list_repos(args.gitlab_token, GITLAB_API)
if args.bitbucket_token:
list_repos(args.bitbucket_token, BITBUCKET_API)
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment