Skip to content

Commit 54a9872

Browse files
authored
Merge pull request #475 from lukasbestle/feat/security-advisories
feat: Backup of repository security advisories
2 parents 858731e + a175ac3 commit 54a9872

File tree

3 files changed

+51
-4
lines changed

3 files changed

+51
-4
lines changed

README.rst

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ CLI Help output::
4343
[--watched] [--followers] [--following] [--all]
4444
[--issues] [--issue-comments] [--issue-events] [--pulls]
4545
[--pull-comments] [--pull-commits] [--pull-details]
46-
[--labels] [--hooks] [--milestones] [--repositories]
47-
[--bare] [--no-prune] [--lfs] [--wikis] [--gists]
48-
[--starred-gists] [--skip-archived] [--skip-existing]
46+
[--labels] [--hooks] [--milestones] [--security-advisories]
47+
[--repositories] [--bare] [--no-prune] [--lfs] [--wikis]
48+
[--gists] [--starred-gists] [--skip-archived] [--skip-existing]
4949
[-L [LANGUAGES ...]] [-N NAME_REGEX] [-H GITHUB_HOST]
5050
[-O] [-R REPOSITORY] [-P] [-F] [--prefer-ssh] [-v]
5151
[--keychain-name OSX_KEYCHAIN_ITEM_NAME]
@@ -101,6 +101,8 @@ CLI Help output::
101101
--hooks include hooks in backup (works only when
102102
authenticated)
103103
--milestones include milestones in backup
104+
--security-advisories
105+
include security advisories in backup
104106
--repositories include repository clone in backup
105107
--bare clone bare repositories
106108
--no-prune disable prune option for git fetch
@@ -401,7 +403,7 @@ Quietly and incrementally backup useful Github user data (public and private rep
401403
export FINE_ACCESS_TOKEN=SOME-GITHUB-TOKEN
402404
GH_USER=YOUR-GITHUB-USER
403405

404-
github-backup -f $FINE_ACCESS_TOKEN --prefer-ssh -o ~/github-backup/ -l error -P -i --all-starred --starred --watched --followers --following --issues --issue-comments --issue-events --pulls --pull-comments --pull-commits --labels --milestones --repositories --wikis --releases --assets --attachments --pull-details --gists --starred-gists $GH_USER
406+
github-backup -f $FINE_ACCESS_TOKEN --prefer-ssh -o ~/github-backup/ -l error -P -i --all-starred --starred --watched --followers --following --issues --issue-comments --issue-events --pulls --pull-comments --pull-commits --labels --milestones --security-advisories --repositories --wikis --releases --assets --attachments --pull-details --gists --starred-gists $GH_USER
405407
406408
Debug an error/block or incomplete backup into a temporary directory. Omit "incremental" to fill a previous incomplete backup. ::
407409

github_backup/github_backup.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
19371981
def 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)

tests/test_all_starred.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ def _create_mock_args(self, **overrides):
3737
args.include_labels = False
3838
args.include_hooks = False
3939
args.include_milestones = False
40+
args.include_security_advisories = False
4041
args.include_releases = False
4142
args.include_assets = False
4243
args.include_attachments = False

0 commit comments

Comments
 (0)