Skip to content

Commit deb6fef

Browse files
committed
Merge branch 'support-delete-based-on-age'
* support-delete-based-on-age: gh_release: Add older-than switch to limit deletion by age
2 parents 4e6ae60 + 88f70a4 commit deb6fef

File tree

3 files changed

+31
-3
lines changed

3 files changed

+31
-3
lines changed

CHANGES.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Features (CLI and Python API)
1919

2020
* `delete`:
2121

22-
* Add support for ``--release-type``. Fix issue [#50](https://github.com/j0057/github-release/pull/50). Contributed by [@Flamefire](https://github.com/Flamefire).
22+
* Add support for ``--release-type`` and ``--older-than``. Fix issue [#50](https://github.com/j0057/github-release/pull/50). Contributed by [@Flamefire](https://github.com/Flamefire).
2323

2424

2525
Issues (CLI and Python API)

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ It understands the following commands:
208208
```bash
209209
--keep-pattern KEEP_PATTERN
210210
--type [all, draft, prerelease, release]
211+
--older-than HOURS
211212
--dry-run
212213
--verbose
213214
--help
@@ -476,4 +477,4 @@ It is covered by the Apache License, Version 2.0:
476477
http://www.apache.org/licenses/LICENSE-2.0
477478

478479
The license file was added at revision 0393859 on 2017-02-12, but you may
479-
consider that the license applies to all prior revisions as well.
480+
consider that the license applies to all prior revisions as well.

github_release.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from __future__ import print_function
44

5+
from datetime import tzinfo, timedelta, datetime
56
import fnmatch
67
import glob
78
import json
@@ -27,6 +28,21 @@
2728
_github_api_url = None
2829

2930

31+
class _UTC(tzinfo):
32+
"""UTC"""
33+
34+
ZERO = timedelta(0)
35+
36+
def utcoffset(self, dt):
37+
return self.ZERO
38+
39+
def tzname(self, dt):
40+
return "UTC"
41+
42+
def dst(self, dt):
43+
return self.ZERO
44+
45+
3046
class _NoopProgressReporter(object):
3147
reportProgress = False
3248

@@ -528,6 +544,7 @@ def gh_release_edit(repo_name, current_tag_name,
528544
@click.argument("pattern")
529545
@click.option("--keep-pattern")
530546
@click.option("--release-type", type=click.Choice(['all', 'draft', 'prerelease', 'release']), default='all')
547+
@click.option("--older-than", type=int, default=0)
531548
@click.option("--dry-run", is_flag=True, default=False)
532549
@click.option("--verbose", is_flag=True, default=False)
533550
@click.pass_obj
@@ -537,7 +554,7 @@ def _cli_release_delete(*args, **kwargs):
537554

538555

539556
@_check_for_credentials
540-
def gh_release_delete(repo_name, pattern, keep_pattern=None, release_type='all',
557+
def gh_release_delete(repo_name, pattern, keep_pattern=None, release_type='all', older_than=0,
541558
dry_run=False, verbose=False):
542559
releases = get_releases(repo_name)
543560
candidates = []
@@ -556,6 +573,16 @@ def gh_release_delete(repo_name, pattern, keep_pattern=None, release_type='all',
556573
print('skipping release {0}: type {1} is not {2}'.format(
557574
release['tag_name'], get_release_type(release), release_type))
558575
continue
576+
# Assumes Zulu time.
577+
# See https://stackoverflow.com/questions/127803/how-to-parse-an-iso-8601-formatted-date
578+
utc = _UTC()
579+
rel_date = datetime.strptime(release['created_at'], "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=utc)
580+
rel_age = int((datetime.now(utc) - rel_date).total_seconds() / 60 / 60) # In hours
581+
if older_than > rel_age:
582+
if verbose:
583+
print('skipping release {0}: created less than {1} hours ago ({2}hrs)'.format(
584+
release['tag_name'], older_than, rel_age))
585+
continue
559586
candidates.append(release)
560587
for release in candidates:
561588
print('deleting release {0}'.format(release['tag_name']))

0 commit comments

Comments
 (0)