@@ -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
222225def 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
296333def backup_account (args , output_directory ):
297334 account_cwd = os .path .join (output_directory , 'account' )
0 commit comments