-
-
Save felipepodesta/1099497 to your computer and use it in GitHub Desktop.
GitHub Syncer. Clones or Pulls all GitHub repos (including watched list).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
"""Kenneth Reitz's GitHub Syncer | |
This script uses the GitHub API to get a list of all forked, mirrored, public, and | |
private repos in your GitHub account. If the repo already exists locally, it will | |
update it via git-pull. Otherwise, it will properly clone the repo. | |
It will organize your repos into the following directory structure: | |
+ repos | |
├── forks (public fork repos) | |
├── mirrors (public mirror repos) | |
├── private (private repos) | |
├── public (public repos) | |
├── watched (public watched repos) | |
└── sync.py (this script) | |
Requires Ask Solem's github2 (http://pypi.python.org/pypi/github2). | |
Inspired by Gisty (http://github.com/swdyh/gisty). | |
""" | |
import os | |
from commands import getoutput as cmd | |
from github2.client import Github | |
# GitHub configurations | |
GITHUB_USER = cmd('git config github.user') | |
GITHUB_TOKEN = cmd('git config github.token') | |
# API Object | |
github = Github(username=GITHUB_USER, api_token=GITHUB_TOKEN) | |
# repo slots | |
repos = {} | |
repos['watched'] = [r for r in github.repos.watching(GITHUB_USER)] | |
repos['private'] = [] | |
repos['mirrors'] = [] | |
repos['public'] = [] | |
repos['forks'] = [] | |
# Collect GitHub repos via API | |
for repo in github.repos.list(): | |
if repo.private: | |
repos['private'].append(repo) | |
elif repo.fork: | |
repos['forks'].append(repo) | |
elif 'mirror' in repo.description.lower(): | |
# mirrors owned by self if mirror in description... | |
repos['mirrors'].append(repo) | |
else: | |
repos['public'].append(repo) | |
for org, repos in repos.iteritems(): | |
for repo in repos: | |
# create org directory (safely) | |
try: | |
os.makedirs(org) | |
except OSError: | |
pass | |
# enter org dir | |
os.chdir(org) | |
# I own the repo | |
private = True if org in ('private', 'fork', 'mirror') else False | |
# just `git pull` if it's already there | |
if os.path.exists(repo.name): | |
os.chdir(repo.name) | |
print('Updating repo: %s' % (repo.name)) | |
os.system('git pull') | |
os.chdir('..') | |
else: | |
if private: | |
print('Cloning private repo: %s' % (repo.name)) | |
os.system('git clone [email protected]:%s/%s.git' % (repo.owner, repo.name)) | |
else: | |
print('Cloning repo: %s' % (repo.name)) | |
os.system('git clone git://github.com/%s/%s.git' % (repo.owner, repo.name)) | |
# return to base | |
os.chdir('..') | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment