# # # patch "tracvc/mtn/__init__.py" # from [411daf691977f08697a65acf867ea343729ca4b4] # to [befcb26995a601b2c0fed16f9f37e27538866500] # # patch "tracvc/mtn/backend.py" # from [3fca2e4241da08d5d13d44958b32216c0921e8de] # to [13d143ad877b77218cec242a0cb1e2b3ad9fd0a5] # ============================================================ --- tracvc/mtn/__init__.py 411daf691977f08697a65acf867ea343729ca4b4 +++ tracvc/mtn/__init__.py befcb26995a601b2c0fed16f9f37e27538866500 @@ -1,5 +1,5 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -__version__ = '0.0.7' +__version__ = '0.0.8' ============================================================ --- tracvc/mtn/backend.py 3fca2e4241da08d5d13d44958b32216c0921e8de +++ tracvc/mtn/backend.py 13d143ad877b77218cec242a0cb1e2b3ad9fd0a5 @@ -31,21 +31,25 @@ from trac.config import Option, ListOpti from trac.util import shorten_line, escape from trac.core import Component, implements, TracError from trac.config import Option, ListOption -from trac import __version__ as trac_version -from pkg_resources import parse_version from time import strptime from tracvc.mtn.automate import MTN, AutomateException from tracvc.mtn.util import get_oldpath, get_parent, Memoize from tracvc.mtn.cache import CacheManager +from trac.util.datefmt import format_datetime as format_datetime_trac import re try: from trac.versioncontrol.web_ui import IPropertyRenderer - has_property_renderer = True except ImportError: - has_property_renderer = False + IPropertyRenderer = None +try: + from trac.util.datefmt import utc +except ImportError: + utc = None + + DATE_RULE = re.compile(r'\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}') REVID_RULE = re.compile(r'^[0-9a-f]{40}$') @@ -126,8 +130,11 @@ class MonotoneConnector(Component): binary = INTERFACE_VERSIONS.get(interface, None) self.version = "interface: %s" % interface if binary: - self.version += ", binary (guessed): %s" % binary - self.env.systeminfo.append(('Monotone', self.version)) + self.version += ", binary (guessed): %s" % binary + try: + self.env.systeminfo.append(('Monotone', self.version)) + except AttributeError: + pass # no systeminfo in 0.10 return self.repos[path] # IWikiSyntaxProvider methods @@ -173,27 +180,39 @@ class MonotoneConnector(Component): # Datetime handling changed somewhere between 0.10 and 0.11. We try to # support both variants for a while. -if parse_version(trac_version) < parse_version("0.11dev"): +if utc: + from datetime import datetime - def parse_date(rawdate): + def parse_datetime(raw): """ - Convert a monotone date string into a unix timestamp. + Convert a monotone date string into a datetime object. """ - from calendar import timegm - return timegm(strptime(rawdate + " UTC","%Y-%m-%dT%H:%M:%S %Z")) + return datetime(tzinfo=utc, + *strptime(raw, "%Y-%m-%dT%H:%M:%S")[:6]) -else: + def format_datetime(t): + """ + Convert a datetime object into an monotone date string. + """ + return format_datetime_trac(t, "%Y-%m-%dT%H:%M:%S", tzinfo=utc) + - def parse_date(rawdate): +else: # legacy + from calendar import timegm + + def parse_datetime(raw): """ - Convert a monotone date string into a datetime object. + Convert a monotone date string into a unix timestamp. """ - from datetime import datetime - from trac.util.datefmt import utc - date = datetime(*strptime(rawdate, "%Y-%m-%dT%H:%M:%S")[:6]) - return date.replace(tzinfo=utc) + return timegm(strptime(raw + " UTC","%Y-%m-%dT%H:%M:%S %Z")) + def format_datetime(t): + """ + Convert a unix timestamp into an monotone date string. + """ + return format_datetime_trac(t, "%Y-%m-%dT%H:%M:%S", gmt=True) + def dates(certvals): """ Parse the raw dates and return a sorted list. @@ -202,7 +221,7 @@ def dates(certvals): for rawdate in certvals: # strip the date before parsing rawdate = DATE_RULE.search(rawdate).group() - result.append(parse_date(rawdate)) + result.append(parse_datetime(rawdate)) result.sort() return result @@ -252,19 +271,9 @@ class MonotoneRepository(Repository): """ Generate Changesets belonging to the given time period (start, stop). """ - nodes = self.mtn.leaves() - seen = set() - while nodes: - current = nodes.pop(0) - time = self.get_dates(current)[0] - if time < start: - continue # assume none of the parents is younger - elif time < stop: - yield self.get_changeset(current) - for parent in self.mtn.parents(current): - if parent not in seen: - seen.add(parent) - nodes.append(parent) + for rev in self.mtn.select('l:%s/e:%s' % + (format_datetime(start), format_datetime(stop))): + yield self.get_changeset(rev) def get_node(self, path, rev=None): """ @@ -611,7 +620,7 @@ class MonotoneChangeset(Changeset): oldpath = get_oldpath(path, changeset.renamed) yield path, Node.FILE, Changeset.EDIT, oldpath, oldrev - if has_property_renderer: + if IPropertyRenderer: def get_properties(self): properties = {} properties['Parent'] = ', '.join(self.mtn.parents(self.rev))