@@ -310,6 +310,12 @@ def parse_args(args=None):
310310 dest = "include_milestones" ,
311311 help = "include milestones in backup" ,
312312 )
313+ parser .add_argument (
314+ "--security-advisories" ,
315+ action = "store_true" ,
316+ dest = "include_security_advisories" ,
317+ help = "include security advisories in backup" ,
318+ )
313319 parser .add_argument (
314320 "--repositories" ,
315321 action = "store_true" ,
@@ -1718,6 +1724,9 @@ def backup_repositories(args, output_directory, repositories):
17181724 if args .include_milestones or args .include_everything :
17191725 backup_milestones (args , repo_cwd , repository , repos_template )
17201726
1727+ if args .include_security_advisories or args .include_everything :
1728+ backup_security_advisories (args , repo_cwd , repository , repos_template )
1729+
17211730 if args .include_labels or args .include_everything :
17221731 backup_labels (args , repo_cwd , repository , repos_template )
17231732
@@ -1934,6 +1943,41 @@ def backup_milestones(args, repo_cwd, repository, repos_template):
19341943 )
19351944
19361945
1946+ def backup_security_advisories (args , repo_cwd , repository , repos_template ):
1947+ advisory_cwd = os .path .join (repo_cwd , "security-advisories" )
1948+ if args .skip_existing and os .path .isdir (advisory_cwd ):
1949+ return
1950+
1951+ logger .info ("Retrieving {0} security advisories" .format (repository ["full_name" ]))
1952+ mkdir_p (repo_cwd , advisory_cwd )
1953+
1954+ template = "{0}/{1}/security-advisories" .format (repos_template , repository ["full_name" ])
1955+
1956+ _advisories = retrieve_data (args , template )
1957+
1958+ advisories = {}
1959+ for advisory in _advisories :
1960+ advisories [advisory ["ghsa_id" ]] = advisory
1961+
1962+ written_count = 0
1963+ for ghsa_id , advisory in list (advisories .items ()):
1964+ advisory_file = "{0}/{1}.json" .format (advisory_cwd , ghsa_id )
1965+ if json_dump_if_changed (advisory , advisory_file ):
1966+ written_count += 1
1967+
1968+ total = len (advisories )
1969+ if written_count == total :
1970+ logger .info ("Saved {0} security advisories to disk" .format (total ))
1971+ elif written_count == 0 :
1972+ logger .info ("{0} security advisories unchanged, skipped write" .format (total ))
1973+ else :
1974+ logger .info (
1975+ "Saved {0} of {1} security advisories to disk ({2} unchanged)" .format (
1976+ written_count , total , total - written_count
1977+ )
1978+ )
1979+
1980+
19371981def backup_labels (args , repo_cwd , repository , repos_template ):
19381982 label_cwd = os .path .join (repo_cwd , "labels" )
19391983 output_file = "{0}/labels.json" .format (label_cwd )
0 commit comments