Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@felipepodesta
Forked from kennethreitz/sync.py
Created July 22, 2011 13:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save felipepodesta/1099498 to your computer and use it in GitHub Desktop.
Save felipepodesta/1099498 to your computer and use it in GitHub Desktop.
GitHub Syncer. Clones or Pulls all GitHub repos (including watched list).
#!/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 git@github.com:%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('..')
print
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment