Skip to content

Commit bb86f05

Browse files
committed
Merge pull request josegonzalez#4 from klaude/pull_request_support
Add pull request support
2 parents 39b173f + e8387f9 commit bb86f05

2 files changed

Lines changed: 45 additions & 4 deletions

File tree

README.rst

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ CLI Usage is as follows::
2222

2323
Github Backup [-h] [-u USERNAME] [-p PASSWORD] [-t TOKEN]
2424
[-o OUTPUT_DIRECTORY] [--starred] [--watched] [--all]
25-
[--issues] [--issue-comments] [--issue-events]
26-
[--repositories] [--wikis] [--skip-existing]
25+
[--issues] [--issue-comments] [--issue-events] [--pulls]
26+
[--pull-comments] [--pull-commits] [--repositories]
27+
[--wikis] [--skip-existing]
2728
[-L [LANGUAGES [LANGUAGES ...]]] [-N NAME_REGEX]
2829
[-H GITHUB_HOST] [-O] [-R REPOSITORY] [-P] [-F] [-v]
2930
USER
@@ -49,6 +50,9 @@ CLI Usage is as follows::
4950
--issues include issues in backup
5051
--issue-comments include issue comments in backup
5152
--issue-events include issue events in backup
53+
--pulls include pull requests in backup
54+
--pull-comments include pull request review comments in backup
55+
--pull-commits include pull request commits in backup
5256
--repositories include repository clone in backup
5357
--wikis include wiki clone in backup
5458
--skip-existing skip project if a backup directory exists

bin/github-backup

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ def parse_args():
8888
parser.add_argument('--issues', action='store_true', dest='include_issues', help='include issues in backup')
8989
parser.add_argument('--issue-comments', action='store_true', dest='include_issue_comments', help='include issue comments in backup')
9090
parser.add_argument('--issue-events', action='store_true', dest='include_issue_events', help='include issue events in backup')
91+
parser.add_argument('--pulls', action='store_true', dest='include_pulls', help='include pull requests in backup')
92+
parser.add_argument('--pull-comments', action='store_true', dest='include_pull_comments', help='include pull request review comments in backup')
93+
parser.add_argument('--pull-commits', action='store_true', dest='include_pull_commits', help='include pull request commits in backup')
9194
parser.add_argument('--repositories', action='store_true', dest='include_repository', help='include repository clone in backup')
9295
parser.add_argument('--wikis', action='store_true', dest='include_wiki', help='include wiki clone in backup')
9396
parser.add_argument('--skip-existing', action='store_true', dest='skip_existing', help='skip project if a backup directory exists')
@@ -221,10 +224,11 @@ def filter_repositories(args, repositories):
221224

222225
def backup_repositories(args, output_directory, repositories):
223226
log_info('Backing up repositories')
224-
issue_template = 'https://{0}/repos'.format(get_github_api_host(args))
227+
repos_template = 'https://{0}/repos'.format(get_github_api_host(args))
225228
wiki_template = "git@{0}:{1}.wiki.git"
226229

227230
issue_states = ['open', 'closed']
231+
pull_states = ['open', 'closed']
228232
for repository in repositories:
229233
backup_cwd = os.path.join(output_directory, 'repositories')
230234
repo_cwd = os.path.join(backup_cwd, repository['name'])
@@ -268,7 +272,7 @@ def backup_repositories(args, output_directory, repositories):
268272
mkdir_p(backup_cwd, repo_cwd, issue_cwd)
269273

270274
issues = {}
271-
_issue_template = '{0}/{1}/issues'.format(issue_template, repository['full_name'])
275+
_issue_template = '{0}/{1}/issues'.format(repos_template, repository['full_name'])
272276

273277
for issue_state in issue_states:
274278
query_args = {
@@ -292,6 +296,39 @@ def backup_repositories(args, output_directory, repositories):
292296
with open('{0}/{1}.json'.format(issue_cwd, number), 'w') as issue_file:
293297
json.dump(issue, issue_file, sort_keys=True, indent=4, separators=(',', ': '))
294298

299+
if args.include_pulls or args.include_everything:
300+
if args.skip_existing and os.path.isdir('{0}/pulls/.git'.format(repo_cwd)):
301+
continue
302+
303+
log_info('Retrieving {0} pull requests'.format(repository['full_name']))
304+
pulls_cwd = os.path.join(repo_cwd, 'pulls')
305+
mkdir_p(backup_cwd, repo_cwd, pulls_cwd)
306+
307+
pulls = {}
308+
_pulls_template = '{0}/{1}/pulls'.format(repos_template, repository['full_name'])
309+
310+
for pull_state in pull_states:
311+
query_args = {
312+
'filter': 'all',
313+
'state': pull_state
314+
}
315+
316+
_pulls = retrieve_data(args, _pulls_template, query_args=query_args)
317+
for pull in _pulls:
318+
pulls[pull['number']] = pull
319+
320+
log_info('Saving {0} pull requests to disk'.format(len(pulls.keys())))
321+
for number, pull in pulls.iteritems():
322+
comments_template = _pulls_template + '/{0}/comments'
323+
commits_template = _pulls_template + '/{0}/commits'
324+
if args.include_pull_comments or args.include_everything:
325+
pulls[number]['comment_data'] = retrieve_data(args, comments_template.format(number))
326+
if args.include_pull_commits or args.include_everything:
327+
pulls[number]['commit_data'] = retrieve_data(args, commits_template.format(number))
328+
329+
with open('{0}/{1}.json'.format(pulls_cwd, number), 'w') as pull_file:
330+
json.dump(pull, pull_file, sort_keys=True, indent=4, separators=(',', ': '))
331+
295332

296333
def backup_account(args, output_directory):
297334
account_cwd = os.path.join(output_directory, 'account')

0 commit comments

Comments
 (0)