Compare commits

..

10 Commits
0.6.0 ... 0.7.0

Author SHA1 Message Date
Jose Diaz-Gonzalez
d0e239b3ef Release version 0.7.0 2016-02-02 14:52:07 -05:00
Jose Diaz-Gonzalez
29c9373d9d Merge pull request #32 from albertyw/soft-fail-hooks
Softly fail if not able to read hooks
2016-01-29 03:36:48 -05:00
Jose Diaz-Gonzalez
eb8b22c81c Merge pull request #33 from albertyw/update-readme
Add note about 2-factor auth in readme
2016-01-29 03:35:28 -05:00
Jose Diaz-Gonzalez
03739ce1be Merge pull request #31 from albertyw/fix-private-repos
Fix reading user's private repositories
2016-01-29 03:34:21 -05:00
Albert Wang
d2bb205b4b Add note about 2-factor auth 2016-01-29 00:33:53 -08:00
Albert Wang
17141c1bb6 Softly fail if not able to read hooks 2016-01-29 00:20:53 -08:00
Albert Wang
d362adbbca Make user repository search go through endpoint capable of reading private repositories 2016-01-28 22:52:58 -08:00
Jose Diaz-Gonzalez
89df625e04 Merge pull request #28 from alexmojaki/getpass
Prompt for password if only username given
2016-01-15 10:34:29 -05:00
Alex Hall
675484a215 Update README with new CLI usage 2016-01-12 14:40:29 +02:00
Alex Hall
325f77dcd9 Prompt for password if only username given 2016-01-12 11:18:26 +02:00
4 changed files with 57 additions and 29 deletions

View File

@@ -1,6 +1,18 @@
Changelog Changelog
========= =========
0.7.0 (2016-02-02)
------------------
- Softly fail if not able to read hooks. [Albert Wang]
- Add note about 2-factor auth. [Albert Wang]
- Make user repository search go through endpoint capable of reading
private repositories. [Albert Wang]
- Prompt for password if only username given. [Alex Hall]
0.6.0 (2015-11-10) 0.6.0 (2015-11-10)
------------------ ------------------

View File

@@ -23,15 +23,14 @@ CLI Usage is as follows::
Github Backup [-h] [-u USERNAME] [-p PASSWORD] [-t TOKEN] Github Backup [-h] [-u USERNAME] [-p PASSWORD] [-t TOKEN]
[-o OUTPUT_DIRECTORY] [--starred] [--watched] [--all] [-o OUTPUT_DIRECTORY] [--starred] [--watched] [--all]
[--issues] [--issue-comments] [--issue-events] [--pulls] [--issues] [--issue-comments] [--issue-events] [--pulls]
[--pull-comments] [--pull-commits] [--repositories] [--pull-comments] [--pull-commits] [--labels] [--hooks]
[--wikis] [--labels] [--hooks] [--skip-existing] [--milestones] [--repositories] [--wikis]
[-L [LANGUAGES [LANGUAGES ...]]] [-N NAME_REGEX] [--skip-existing] [-L [LANGUAGES [LANGUAGES ...]]]
[-H GITHUB_HOST] [-O] [-R REPOSITORY] [-P] [-F] [-N NAME_REGEX] [-H GITHUB_HOST] [-O] [-R REPOSITORY]
[--prefer-ssh] [-v] [-P] [-F] [--prefer-ssh] [-v]
USER USER
Backup a github account
Backup a github users account
positional arguments: positional arguments:
USER github username USER github username
@@ -41,7 +40,8 @@ CLI Usage is as follows::
-u USERNAME, --username USERNAME -u USERNAME, --username USERNAME
username for basic auth username for basic auth
-p PASSWORD, --password PASSWORD -p PASSWORD, --password PASSWORD
password for basic auth password for basic auth. If a username is given but
not a password, the password will be prompted for.
-t TOKEN, --token TOKEN -t TOKEN, --token TOKEN
personal access or OAuth token personal access or OAuth token
-o OUTPUT_DIRECTORY, --output-directory OUTPUT_DIRECTORY -o OUTPUT_DIRECTORY, --output-directory OUTPUT_DIRECTORY
@@ -55,10 +55,12 @@ CLI Usage is as follows::
--pulls include pull requests in backup --pulls include pull requests in backup
--pull-comments include pull request review comments in backup --pull-comments include pull request review comments in backup
--pull-commits include pull request commits in backup --pull-commits include pull request commits in backup
--labels include labels in backup
--hooks include hooks in backup (works only when
authenticated)
--milestones include milestones in backup
--repositories include repository clone in backup --repositories include repository clone in backup
--wikis include wiki clone in backup --wikis include wiki clone in backup
--labels include labels in backup
--hooks include web hooks in backup (works only when authenticated)
--skip-existing skip project if a backup directory exists --skip-existing skip project if a backup directory exists
-L [LANGUAGES [LANGUAGES ...]], --languages [LANGUAGES [LANGUAGES ...]] -L [LANGUAGES [LANGUAGES ...]], --languages [LANGUAGES [LANGUAGES ...]]
only allow these languages only allow these languages
@@ -66,7 +68,7 @@ CLI Usage is as follows::
python regex to match names against python regex to match names against
-H GITHUB_HOST, --github-host GITHUB_HOST -H GITHUB_HOST, --github-host GITHUB_HOST
GitHub Enterprise hostname GitHub Enterprise hostname
-O, --organization whether or not this is a query for an organization -O, --organization whether or not this is an organization user
-R REPOSITORY, --repository REPOSITORY -R REPOSITORY, --repository REPOSITORY
name of repository to limit backup to name of repository to limit backup to
-P, --private include private repositories -P, --private include private repositories
@@ -76,3 +78,8 @@ CLI Usage is as follows::
The package can be used to backup an *entire* organization or repository, including issues and wikis in the most appropriate format (clones for wikis, json files for issues). The package can be used to backup an *entire* organization or repository, including issues and wikis in the most appropriate format (clones for wikis, json files for issues).
Authentication
==============
Note: Password-based authentication will fail if you have two-factor authentication enabled.

View File

@@ -7,6 +7,7 @@ import base64
import calendar import calendar
import codecs import codecs
import errno import errno
import getpass
import json import json
import logging import logging
import os import os
@@ -109,7 +110,9 @@ def parse_args():
parser.add_argument('-p', parser.add_argument('-p',
'--password', '--password',
dest='password', dest='password',
help='password for basic auth') help='password for basic auth. '
'If a username is given but not a password, the '
'password will be prompted for.')
parser.add_argument('-t', parser.add_argument('-t',
'--token', '--token',
dest='token', dest='token',
@@ -219,17 +222,18 @@ def parse_args():
def get_auth(args): def get_auth(args):
auth = None
if args.token: if args.token:
auth = base64.b64encode(args.token + ':' + 'x-oauth-basic') return base64.b64encode(args.token + ':' + 'x-oauth-basic')
elif args.username and args.password:
auth = base64.b64encode(args.username + ':' + args.password) if args.username:
elif args.username and not args.password: if not args.password:
log_error('You must specify a password for basic auth') args.password = getpass.getpass()
elif args.password and not args.username: return base64.b64encode(args.username + ':' + args.password)
if args.password:
log_error('You must specify a username for basic auth') log_error('You must specify a username for basic auth')
return auth return None
def get_github_api_host(args): def get_github_api_host(args):
@@ -378,9 +382,8 @@ def _request_url_error(template, retry_timeout):
def retrieve_repositories(args): def retrieve_repositories(args):
log_info('Retrieving repositories') log_info('Retrieving repositories')
single_request = False single_request = False
template = 'https://{0}/users/{1}/repos'.format( template = 'https://{0}/user/repos'.format(
get_github_api_host(args), get_github_api_host(args))
args.user)
if args.organization: if args.organization:
template = 'https://{0}/orgs/{1}/repos'.format( template = 'https://{0}/orgs/{1}/repos'.format(
get_github_api_host(args), get_github_api_host(args),
@@ -398,6 +401,9 @@ def retrieve_repositories(args):
def filter_repositories(args, repositories): def filter_repositories(args, repositories):
log_info('Filtering repositories') log_info('Filtering repositories')
repositories = [r for r in repositories if r['owner']['login'] == args.user]
name_regex = None name_regex = None
if args.name_regex: if args.name_regex:
name_regex = re.compile(args.name_regex) name_regex = re.compile(args.name_regex)
@@ -594,11 +600,14 @@ def backup_hooks(args, repo_cwd, repository, repos_template):
output_file = '{0}/hooks.json'.format(hook_cwd) output_file = '{0}/hooks.json'.format(hook_cwd)
template = '{0}/{1}/hooks'.format(repos_template, template = '{0}/{1}/hooks'.format(repos_template,
repository['full_name']) repository['full_name'])
_backup_data(args, try:
'hooks', _backup_data(args,
template, 'hooks',
output_file, template,
hook_cwd) output_file,
hook_cwd)
except SystemExit:
log_info("Unable to read hooks, skipping")
def fetch_repository(name, remote_url, local_dir, skip_existing=False): def fetch_repository(name, remote_url, local_dir, skip_existing=False):

View File

@@ -1 +1 @@
__version__ = '0.6.0' __version__ = '0.7.0'