Last active
June 29, 2016 07:07
-
-
Save egemenyildiz/ae32bfbb8fd5ba35c7302b70ce58790a to your computer and use it in GitHub Desktop.
clone back-up all projects from a bitbucket team/account
This file contains hidden or 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/python | |
# -*- coding: utf-8 -*- | |
import json | |
import argparse | |
import getpass | |
import subprocess | |
import base64 | |
import urllib2 | |
""" | |
!!! set your public ssh key in your bitbucket account settings !!!s | |
~/$ python clonebb.py --help | |
usage: clonebb.py [-h] [-l LANGUAGE] [-d CLONE_DIR] account | |
positional arguments: | |
account bitbucket team/account name | |
optional arguments: | |
-h, --help show this help message and exit | |
-l LANGUAGE, --language LANGUAGE | |
only clone projects written in this language | |
-d CLONE_DIR, --clone-dir CLONE_DIR | |
dir to clone project(s) | |
""" | |
CLONE_DIR = None | |
CLONE_URL = '[email protected]:{team}/{slug}.git' | |
TEAM_INFO_URL = 'https://bitbucket.org/!api/1.0/users/{team}' | |
def run_command(command, shell=True): | |
process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=shell) | |
proc_stdout = process.communicate()[0].strip() | |
return proc_stdout | |
def get_credentials(): | |
return raw_input('bitbucket username?\n'), getpass.getpass(prompt='bitbucket pass?\n') | |
def gti(team_name): | |
username, password = get_credentials() | |
auth = base64.encodestring('%s:%s' % (username, password)).replace('\n', '') | |
request = urllib2.Request(TEAM_INFO_URL.format(team=team_name)) | |
request.add_header("Authorization", "Basic %s" % auth) | |
result = urllib2.urlopen(request) | |
return json.loads(result.read()) | |
def clone_repo(slug, team): | |
run_command( | |
'cd {clone_dir} && git clone {git_uri}'.format( | |
git_uri=CLONE_URL.format( | |
team=team, | |
slug=slug | |
), | |
clone_dir=CLONE_DIR | |
) | |
) | |
def main(): | |
global CLONE_DIR | |
parser = argparse.ArgumentParser() | |
parser.add_argument("account", help="bitbucket team/account name", | |
type=lambda s: unicode(s, 'utf8')) | |
parser.add_argument("-l", "--language", help="only clone projects written in this language", | |
type=lambda s: unicode(s, 'utf8')) | |
parser.add_argument("-d", "--clone-dir", help="dir to clone project(s)", | |
type=lambda s: unicode(s, 'utf8'), default='.') | |
args = parser.parse_args() | |
CLONE_DIR = args.clone_dir | |
language = args.language | |
team_info = gti(args.account) | |
print "Cloning project(s)... " | |
for project in team_info['repositories']: | |
if language: | |
if project['language'] != language: | |
continue | |
clone_repo(project['slug'], args.account) | |
print "\nDone!" | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment