# 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))