"""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)) |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
Show comment Hide comment
eubnara
commented
Jan 26, 2017
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? |
@eubnara your revision looks good. I'd add a default value for host_name, defaulting to |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
Show comment Hide comment
rajrsingh
Feb 20, 2018
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.
rajrsingh
commented
Feb 20, 2018
•
edited
edited
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 |
This comment has been minimized.
Show comment
Hide comment
This comment has been minimized.
Show comment Hide comment
msarahan
Apr 10, 2018
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.
msarahan
commented
Apr 10, 2018
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. |
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