jeffrey4l
1/5/2016 - 5:50 PM

Get the OpenStack repo list

Get the OpenStack repo list

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import github
import argparse
import codecs
import logging


DESCRIPTION=u'''

获取 openstack 和 openstack-dev 下所有仓库的列表,输出格式为:

    组织名 仓库名 仓库地址

username 和 password 不是必须的。但是不填写时,会受到 Github Rate Limit[0].
有认证的访问限制是每小时5000次。没有认证的访问限制是每小时60次。

[0] https://developer.github.com/v3/#rate-limiting
'''

def main():
    parser = argparse.ArgumentParser(
        description=DESCRIPTION,
        formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument('-u', '--username',
                        help='Usename to connect github')
    parser.add_argument('-p', '--password',
                        help='Password to connect github')
    parser.add_argument('-o', '--output',
                        help='Outout file. Default is stdout')
    parser.add_argument('-O', '--organization',
                        default='openstack,openstack-dev',
                        help='Organization to crawl repos from github')
    parser.add_argument('-d', '--debug',
                        action='store_true',
                        help='Show debug message')
    parser.add_argument('-v', '--verbose',
                        action='store_true',
                        help='Show verbse message')

    conf = parser.parse_args()
    log_level = logging.WARNING
    if conf.verbose:
        log_level = logging.INFO
    if conf.debug:
        log_level = logging.DEBUG

    logging.basicConfig(level=log_level)
    log = logging.getLogger()
    
    gh = github.Github(conf.username, conf.password)

    repos = []
    for org in conf.organization.strip().split(','):
        organization = gh.get_organization(org)
        for repo in organization.get_repos():
            log.info('Get: %s %s %s', org, repo.name, repo.clone_url)
            repos.append((organization, repo))

    if conf.output:
        with codecs.open(conf.output, 'w', 'utf8') as output:
            for org, repo in repos:
                output.write('{} {} {}\n'.format(org.login,
                                               repo.name,
                                               repo.clone_url))
    else:
        for org, repo in repos:
            print('{} {} {}'.format(org.login,
                                    repo.name,
                                    repo.clone_url))

if __name__ == "__main__":
    main()
#!/bin/bash

GIT_BASE='https://github.com'

if [ -e devstack ]; then
    cd devstack
    git pull --quiet
else
    git clone --depth 1 --quiet https://github.com/openstack-dev/devstack.git 
    cd devstack
fi

source stackrc

set -o posix
for repo in $(set | grep -v GITREPO | grep REPO | grep 'openstack');
do
    name=$(echo $repo|awk -F "=" '{print substr(tolower($1),0,length($1)-5)}')
    url=$(echo $repo|awk -F "=" '{print $2}')
    GITREPO[$name]=$url
done

for name in ${!GITREPO[@]}
do
    echo ${GITREPO[$name]}
done