"""Set all repositories of a given GitHub organization name for a given user to watching. """ import argparse import json import requests def get_repos(url, repo_list=[], auth=None): req = None if auth: req = requests.get(url, auth=auth) else: req = requests.get(url) if (req.ok): repos = json.loads(req.text or req.content) repo_list += repos links = getattr(req, 'links', None) if links and 'next' in links and 'url' in links['next']: get_repos(links['next']['url'], repo_list=repo_list, auth=auth) return repo_list def main(user, password, org_name, outfile): auth = (user, password) repo_url = 'https://api.github.com/orgs/{0}/repos'.format(org_name) headers = {'Content-Type': 'application/json; charset=UTF-8'} repo_list = get_repos(repo_url, auth=auth) lines = [] with open(outfile) as f: f.seek(0) lines = [it.strip('\n').strip('\r') for it in f] with open(outfile, 'a') as f: for repo in repo_list: repo_name = repo['name'] if repo_name in lines: continue url = 'https://api.github.com/repos/{0}/{1}/subscription'.format( org_name, repo_name ) res = requests.put( url=url, data='{"subscribed": "1"}', headers=headers, auth=auth ) if res.status_code == 200: f.write('{0}\n'.format(repo_name)) print('status {0} | repo {1}'.format( res.status_code, repo_name )) else: print('ERRORE! status {0} | repo {1}'.format( res.status_code, repo_name )) if __name__ == '__main__': parser = argparse.ArgumentParser(description='Watch/unwatch GitHub Repositories', version='%(prog)s 1.0') # noqa parser.add_argument('user', type=str, help='GitHub username') parser.add_argument('password', type=str, help='GitHub password') parser.add_argument('org_name', type=str, help='GitHub organization name') parser.add_argument('--outfile', type=str, default='repos_set.txt', help='Name of the file to write each successful changed repository to. Used for avoiding unnecessart API calls.') # noqa args = parser.parse_args() main(**vars(args))