From 7e73cf9e780e38e010eff533a4bc1158b6f0f8e5 Mon Sep 17 00:00:00 2001 From: Flamefire Date: Sat, 13 Oct 2018 11:29:53 +0200 Subject: [PATCH 1/2] gh_release: Speed-up release deletion Avoid retrieving release metadata from github when iterating over releases selected for deletion. --- CHANGES.md | 4 ++++ github_release.py | 5 ++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index c030c40..3ae61ca 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -20,6 +20,10 @@ Issues (CLI and Python API) * Fix use python 3 support + * ``delete`` command: + + * Speed-up release deletion. See [PR#51](https://github.com/j0057/github-release/pull/51). Contributed by [@Flamefire](https://github.com/Flamefire) + 1.5.8 ===== diff --git a/github_release.py b/github_release.py index 4d86b98..aee3544 100755 --- a/github_release.py +++ b/github_release.py @@ -538,9 +538,8 @@ def gh_release_delete(repo_name, pattern, keep_pattern=None, if keep_pattern is not None: if fnmatch.fnmatch(release['tag_name'], keep_pattern): continue - candidates.append(release['tag_name']) - for tag_name in candidates: - release = get_release(repo_name, tag_name) + candidates.append(release) + for release in candidates: print('deleting release {0}'.format(release['tag_name'])) if dry_run: continue From fc7e693177f17bef281fd45a1b678ae36d5f62dd Mon Sep 17 00:00:00 2001 From: Flamefire Date: Sat, 13 Oct 2018 11:27:22 +0200 Subject: [PATCH 2/2] gh_release: Support deleting releases based on release type This commit updates the release delete subcommand to support deleting based on release type: 'draft', 'prerelease' or 'release'. Co-authored-by: Jean-Christophe Fillion-Robin --- CHANGES.md | 11 +++++++++++ README.md | 14 +++++++++++++- github_release.py | 20 +++++++++++++++++++- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 3ae61ca..a493b69 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,17 @@ CLI * ``release-notes``: Report a meaningful error if user omitted to set ``EDITOR`` env. variable. + +Features (CLI and Python API) +----------------------------- + +* ``delete`` command: + + * `delete`: + + * Add support for ``--release-type``. Fix issue [#50](https://github.com/j0057/github-release/pull/50). Contributed by [@Flamefire](https://github.com/Flamefire). + + Issues (CLI and Python API) --------------------------- diff --git a/README.md b/README.md index 0a133d7..88b5e81 100644 --- a/README.md +++ b/README.md @@ -185,6 +185,7 @@ It understands the following commands: --publish --prerelease --target-commitish TARGET_COMMITISH + --help [ASSET_PATTERN]... ``` @@ -199,8 +200,19 @@ It understands the following commands: --prerelease/--release --dry-run --verbose + --help ``` +* delete: + +```bash + --keep-pattern KEEP_PATTERN + --type [all, draft, prerelease, release] + --dry-run + --verbose + --help + [ASSET_PATTERN]... +``` ## ``asset`` command @@ -464,4 +476,4 @@ It is covered by the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 The license file was added at revision 0393859 on 2017-02-12, but you may -consider that the license applies to all prior revisions as well. \ No newline at end of file +consider that the license applies to all prior revisions as well. diff --git a/github_release.py b/github_release.py index aee3544..2750fef 100755 --- a/github_release.py +++ b/github_release.py @@ -255,6 +255,18 @@ def print_release_info(release, title=None, indent=""): print_asset_info(i, asset, indent=indent) +def get_release_type(release): + """Return the type of the release + + Either 'draft', 'prerelease' (no draft) or 'release' (neither) + """ + if release['draft']: + return 'draft' + if release['prerelease']: + return 'prerelease' + return 'release' + + def get_releases(repo_name, verbose=False): releases = [] @@ -515,6 +527,7 @@ def gh_release_edit(repo_name, current_tag_name, @gh_release.command("delete") @click.argument("pattern") @click.option("--keep-pattern") +@click.option("--release-type", type=click.Choice(['all', 'draft', 'prerelease', 'release']), default='all') @click.option("--dry-run", is_flag=True, default=False) @click.option("--verbose", is_flag=True, default=False) @click.pass_obj @@ -524,7 +537,7 @@ def _cli_release_delete(*args, **kwargs): @_check_for_credentials -def gh_release_delete(repo_name, pattern, keep_pattern=None, +def gh_release_delete(repo_name, pattern, keep_pattern=None, release_type='all', dry_run=False, verbose=False): releases = get_releases(repo_name) candidates = [] @@ -538,6 +551,11 @@ def gh_release_delete(repo_name, pattern, keep_pattern=None, if keep_pattern is not None: if fnmatch.fnmatch(release['tag_name'], keep_pattern): continue + if release_type != 'all' and release_type != get_release_type(release): + if verbose: + print('skipping release {0}: type {1} is not {2}'.format( + release['tag_name'], get_release_type(release), release_type)) + continue candidates.append(release) for release in candidates: print('deleting release {0}'.format(release['tag_name']))