diff --git a/hgext3rd/age.py b/hgext3rd/age.py new file mode 100644 --- /dev/null +++ b/hgext3rd/age.py @@ -0,0 +1,66 @@ +# age.py +# +# Copyright 2017 Facebook, Inc. +# +# This software may be used and distributed according to the terms of the +# GNU General Public License version 2 or any later version. +""" +a revset predicate for filtering by changeset age. + +Adds the `age()` revset predicate. + +This revset predicate differs from the built-in `date` by providing a more +granular way of considering relative time rather than absolute time. + +The built-in `date()` predicate does provide full day resolution, so +`age("])(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s?)?$') + +@revsetpredicate('age(string)') +def age(repo, subset, x): + """Changesets that are older or newer than a specific age. + + The age range can be specified in days, hours, minutes or seconds: + + - ``<30d`` : Newer than 30 days old + - ``>4h30m``: Older than 4 hours 30 minutes old + - ``<15s`` : Newer than 15 seconds old + + If no unit is specified, seconds are assumed. + """ + agerange = revsetlang.getstring(x, 'age requires an age range') + m = _rangeparser.match(agerange) + if not m: + raise error.ParseError('invalid age range for age predicate') + dirn, days, hours, minutes, seconds = m.groups() + cutoff = time.time() + cutoff -= int(days or 0) * 60 * 60 * 24 + cutoff -= int(hours or 0) * 60 * 60 + cutoff -= int(minutes or 0) * 60 + cutoff -= int(seconds or 0) + + def newer(x): + return repo[x].date()[0] > cutoff + + def older(x): + return repo[x].date()[0] < cutoff + + if dirn == '<': + return subset.filter(newer, condrepr=('', agerange)) + else: + return subset.filter(older, condrepr=('', agerange)) diff --git a/tests/test-age.t b/tests/test-age.t new file mode 100644 --- /dev/null +++ b/tests/test-age.t @@ -0,0 +1,87 @@ + + $ cat << EOF >> $HGRCPATH + > [extensions] + > age=$TESTDIR/../hgext3rd/age.py + > EOF + +Setup repo + $ hg init repo + $ cd repo + $ now=`date +%s` + $ touch file1 + $ hg add file1 + $ for delta in 31536000 86401 86369 3800 420 5 + > do + > commit_time=`expr $now - $delta` + > echo "$delta" > file1 + > hg commit -d "$commit_time 0" -m "Changeset $delta seconds ago" + > done + +Check age ranges + $ hg log -T '{rev} {desc}\n' -r 'age("<30")' + 5 Changeset 5 seconds ago + $ hg log -T '{rev} {desc}\n' -r 'age("<7m30s")' + 4 Changeset 420 seconds ago + 5 Changeset 5 seconds ago + $ hg log -T '{rev} {desc}\n' -r 'age("<1h4m")' + 3 Changeset 3800 seconds ago + 4 Changeset 420 seconds ago + 5 Changeset 5 seconds ago + $ hg log -T '{rev} {desc}\n' -r 'age("<1d")' + 2 Changeset 86369 seconds ago + 3 Changeset 3800 seconds ago + 4 Changeset 420 seconds ago + 5 Changeset 5 seconds ago + $ hg log -T '{rev} {desc}\n' -r 'age("<364d23h59m")' + 1 Changeset 86401 seconds ago + 2 Changeset 86369 seconds ago + 3 Changeset 3800 seconds ago + 4 Changeset 420 seconds ago + 5 Changeset 5 seconds ago + $ hg log -T '{rev} {desc}\n' -r 'age(">1s")' + 0 Changeset 31536000 seconds ago + 1 Changeset 86401 seconds ago + 2 Changeset 86369 seconds ago + 3 Changeset 3800 seconds ago + 4 Changeset 420 seconds ago + 5 Changeset 5 seconds ago + $ hg log -T '{rev} {desc}\n' -r 'age(">1m")' + 0 Changeset 31536000 seconds ago + 1 Changeset 86401 seconds ago + 2 Changeset 86369 seconds ago + 3 Changeset 3800 seconds ago + 4 Changeset 420 seconds ago + $ hg log -T '{rev} {desc}\n' -r 'age(">1h")' + 0 Changeset 31536000 seconds ago + 1 Changeset 86401 seconds ago + 2 Changeset 86369 seconds ago + 3 Changeset 3800 seconds ago + $ hg log -T '{rev} {desc}\n' -r 'age(">1d")' + 0 Changeset 31536000 seconds ago + 1 Changeset 86401 seconds ago + $ hg log -T '{rev} {desc}\n' -r 'age(">365d")' + 0 Changeset 31536000 seconds ago + $ hg log -T '{rev} {desc}\n' -r 'age("<64m")' + 3 Changeset 3800 seconds ago + 4 Changeset 420 seconds ago + 5 Changeset 5 seconds ago + $ hg log -T '{rev} {desc}\n' -r 'age("<60m500s")' + 3 Changeset 3800 seconds ago + 4 Changeset 420 seconds ago + 5 Changeset 5 seconds ago + $ hg log -T '{rev} {desc}\n' -r 'age("<1h500s")' + 3 Changeset 3800 seconds ago + 4 Changeset 420 seconds ago + 5 Changeset 5 seconds ago + $ hg log -T '{rev} {desc}\n' -r 'age("invalid")' + hg: parse error: invalid age range for age predicate + [255] + $ hg log -T '{rev} {desc}\n' -r 'age("1h")' + hg: parse error: invalid age range for age predicate + [255] + $ hg log -T '{rev} {desc}\n' -r 'age("<3m2h")' + hg: parse error: invalid age range for age predicate + [255] + $ hg log -T '{rev} {desc}\n' -r 'age(">3h2h")' + hg: parse error: invalid age range for age predicate + [255]