-
-
Save thet/c1ce413bdabc771cba1b to your computer and use it in GitHub Desktop.
| """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)) |
@eubnara your revision looks good. I'd add a default value for host_name, defaulting to api.github.com, though.
Thanks for this @thet. Really saved me a ton of time!
One note for those who come later. If you have two-factor authentication (2FA) enabled on your account, you can't use this script with your username and password because it's doing "basic" authentication. However, you can get around this by using a personal access token that has the right permissions. You can then use basic authentication with the token as your id/username and x-oauth-basic as your password.
My fork has a fallback that works for username/password or for auth token. Just pass the token as the password. The username is ultimately ingnored. Thanks @thet and @rajrsingh for this example and the auth token howto.
Seems outfile needs to exist even on first run.
I wrote a simple solution using PyGithub if anyone else is having issues with this script.
from github import Github
g = Github("YOUR_ACCESS_TOKEN")
for repo in g.get_user().get_repos():
print(g.get_user().add_to_watched(repo))
Hello, I'd like to thank you. Your code is the one I wanted. Thanks to your code, I can easily add 'watching' status to all repositories in specific organization. Anyway, I would like to suggest a little bit update this code. If you don't mind, could you see my fork?
https://gist.github.com/eubnara/57a2d5c68e2bdef1f29e832afaed1587