forked from rez0n/simple-bitbucket-backup
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsimple-bitbucket-backup.py
executable file
·103 lines (88 loc) · 2.86 KB
/
simple-bitbucket-backup.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import urllib.request
import json
import base64
import shutil
import datetime
import os
import errno
import config
import subprocess
bbuser = config.user
bbpass = config.password
storage = config.path
now = datetime.datetime.now().strftime("%Y-%m-%d-%H%M")
credentials = base64.b64encode("{0}:{1}".format(
bbuser, bbpass).encode()).decode("ascii")
headers = {'Authorization': "Basic " + credentials}
def req(url):
request = urllib.request.Request(
url=url, headers=headers)
response = urllib.request.urlopen(request)
response_data = json.loads(response.read().decode('utf-8'))
response.close()
return response_data
def download(url, save_path, name):
if not os.path.exists(os.path.dirname(save_path + name)):
try:
os.makedirs(os.path.dirname(save_path + name))
except OSError as exc:
if exc.errno != errno.EEXIST:
raise
try:
request = urllib.request.Request(
url=url, headers=headers)
resp = urllib.request.urlopen(request)
with resp as response, open(save_path + name, 'wb') as out_file:
shutil.copyfileobj(response, out_file)
except urllib.error.HTTPError as err:
if err.code == 404:
print('404 on: ' + url)
else:
raise
def get_repo_list():
resp = req('https://bitbucket.org/api/2.0/repositories/?role=member')
repo_list = {}
for repo in resp['values']:
repo_list[repo['name']] = repo['full_name']
while resp.get('next'):
resp = req(resp['next'])
for repo in resp['values']:
repo_list[repo['name']]=repo['full_name']
return repo_list
def get_all_downloads():
repo_list = get_repo_list()
'''
Repository list to backup in dict
{'MyLovelyRepo': 'username/mylovelyrepo', 'MyWorkRepo': 'google/userdatacollector'}
'''
download_list = {}
for full_name in repo_list.values():
branches = []
resp = req('https://bitbucket.org/api/2.0/repositories/%s/refs/branches' % full_name)
for branch in resp['values']:
branches.append(branch['name'])
download_list[full_name] = branches
return download_list
def do_backup():
download_list = get_all_downloads()
backup_path = storage + now + '/'
for full_name, branch in download_list.items():
for branch in branch:
print(full_name + ':' + branch)
download(
'https://bitbucket.org/%s/get/%s.zip' % (full_name, branch),
backup_path + full_name + '/',
branch + '-' + now + '.zip'
)
def do_clone():
print('cloning...')
repo_list = get_repo_list()
for full_name in repo_list.values():
print(full_name)
subprocess.run(["git", "clone", "https://"+bbuser+":"+bbpass+"@bitbucket.org:/"+full_name+".git", storage+"/"+full_name+".git"])
if config.gitclone:
do_clone()
else:
do_backup()