mirror of
https://github.com/josegonzalez/python-github-backup.git
synced 2025-12-05 16:18:02 +01:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
63441ebfbc | ||
|
|
7ad324225e | ||
|
|
885e94a102 | ||
|
|
9e1800f56e | ||
|
|
d057ee0d04 | ||
|
|
64562f2460 | ||
|
|
f7f9ffd017 | ||
|
|
048ef04e2a | ||
|
|
b1acfed83a | ||
|
|
18e78a4d66 | ||
|
|
1ed5427043 | ||
|
|
c2e3665ed8 | ||
|
|
0a30a92fe4 | ||
|
|
cc52587f52 |
@@ -1 +1 @@
|
||||
__version__ = '0.39.0'
|
||||
__version__ = '0.41.0'
|
||||
|
||||
@@ -11,7 +11,6 @@ import datetime
|
||||
import errno
|
||||
import getpass
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import select
|
||||
@@ -28,6 +27,7 @@ from urllib.request import urlopen
|
||||
from urllib.request import Request
|
||||
from urllib.request import HTTPRedirectHandler
|
||||
from urllib.request import build_opener
|
||||
from http.client import IncompleteRead
|
||||
|
||||
try:
|
||||
from . import __version__
|
||||
@@ -41,6 +41,7 @@ FNULL = open(os.devnull, 'w')
|
||||
def _get_log_date():
|
||||
return datetime.datetime.isoformat(datetime.datetime.now())
|
||||
|
||||
|
||||
def log_info(message):
|
||||
"""
|
||||
Log message (str) or messages (List[str]) to stdout
|
||||
@@ -132,7 +133,7 @@ def mask_password(url, secret='*****'):
|
||||
return url.replace(parsed.password, secret)
|
||||
|
||||
|
||||
def parse_args(args = None):
|
||||
def parse_args(args=None):
|
||||
parser = argparse.ArgumentParser(description='Backup a github account')
|
||||
parser.add_argument('user',
|
||||
metavar='USER',
|
||||
@@ -436,6 +437,21 @@ def retrieve_data_gen(args, template, query_args=None, single_request=False):
|
||||
r, errors = _get_response(request, auth, template)
|
||||
|
||||
status_code = int(r.getcode())
|
||||
# Check if we got correct data
|
||||
try:
|
||||
response = json.loads(r.read().decode('utf-8'))
|
||||
except IncompleteRead:
|
||||
log_warning("Incomplete read error detected")
|
||||
read_error = True
|
||||
except json.decoder.JSONDecodeError:
|
||||
log_warning("JSON decode error detected")
|
||||
read_error = True
|
||||
except TimeoutError:
|
||||
log_warning("Tiemout error detected")
|
||||
read_error = True
|
||||
else:
|
||||
read_error = False
|
||||
|
||||
# be gentle with API request limit and throttle requests if remaining requests getting low
|
||||
limit_remaining = int(r.headers.get('x-ratelimit-remaining', 0))
|
||||
if args.throttle_limit and limit_remaining <= args.throttle_limit:
|
||||
@@ -446,21 +462,37 @@ def retrieve_data_gen(args, template, query_args=None, single_request=False):
|
||||
time.sleep(args.throttle_pause)
|
||||
|
||||
retries = 0
|
||||
while retries < 3 and status_code == 502:
|
||||
log_warning('API request returned HTTP 502: Bad Gateway. Retrying in 5 seconds')
|
||||
while retries < 3 and (status_code == 502 or read_error):
|
||||
log_warning('API request failed. Retrying in 5 seconds')
|
||||
retries += 1
|
||||
time.sleep(5)
|
||||
request = _construct_request(per_page, page, query_args, template, auth, as_app=args.as_app) # noqa
|
||||
r, errors = _get_response(request, auth, template)
|
||||
|
||||
status_code = int(r.getcode())
|
||||
try:
|
||||
response = json.loads(r.read().decode('utf-8'))
|
||||
read_error = False
|
||||
except IncompleteRead:
|
||||
log_warning("Incomplete read error detected")
|
||||
read_error = True
|
||||
except json.decoder.JSONDecodeError:
|
||||
log_warning("JSON decode error detected")
|
||||
read_error = True
|
||||
except TimeoutError:
|
||||
log_warning("Tiemout error detected")
|
||||
read_error = True
|
||||
|
||||
if status_code != 200:
|
||||
template = 'API request returned HTTP {0}: {1}'
|
||||
errors.append(template.format(status_code, r.reason))
|
||||
raise Exception(', '.join(errors))
|
||||
|
||||
response = json.loads(r.read().decode('utf-8'))
|
||||
if read_error:
|
||||
template = 'API request problem reading response for {0}'
|
||||
errors.append(template.format(request))
|
||||
raise Exception(', '.join(errors))
|
||||
|
||||
if len(errors) == 0:
|
||||
if type(response) == list:
|
||||
for resp in response:
|
||||
@@ -1074,16 +1106,17 @@ def fetch_repository(name,
|
||||
masked_remote_url,
|
||||
local_dir))
|
||||
if bare_clone:
|
||||
git_command = ['git', 'clone', '--mirror', remote_url, local_dir]
|
||||
logging_subprocess(git_command, None)
|
||||
if lfs_clone:
|
||||
git_command = ['git', 'lfs', 'clone', '--mirror', remote_url, local_dir]
|
||||
else:
|
||||
git_command = ['git', 'clone', '--mirror', remote_url, local_dir]
|
||||
git_command = ['git', 'lfs', 'fetch', '--all', '--prune']
|
||||
logging_subprocess(git_command, None, cwd=local_dir)
|
||||
else:
|
||||
if lfs_clone:
|
||||
git_command = ['git', 'lfs', 'clone', remote_url, local_dir]
|
||||
else:
|
||||
git_command = ['git', 'clone', remote_url, local_dir]
|
||||
logging_subprocess(git_command, None)
|
||||
logging_subprocess(git_command, None)
|
||||
|
||||
|
||||
def backup_account(args, output_directory):
|
||||
|
||||
Reference in New Issue
Block a user