* Lele Gaifax [Thu, 29 Jun 2006 15:54:02 +0200]:

> Adeodato Simó wrote:
> >I think the result is more robust, so I hope you consider it for
> >inclusion (suggestions welcome, too). If you ack it, then I'll allocate
> >more time to fix the rest of backends

> > will send a darcs changeset when it's complete.

> Will wait, then :)

Okay. You can find below the changelog entry for the patch, and the
patch itself can be pulled from [1] or wgetted from [2].

  [1] http://chistera.yi.org/~adeodato/code/tailor/tailor.dato
  [2] http://chistera.yi.org/~adeodato/tmp/2006-07-06/tzinfo.dpatch

You already reviewed tailor-tzinfo1.diff. I'm attaching two more unidiff
patches now:

  - tailor-tzinfo2.diff, which updates the rest of backends, as promised

  - tailor-tzinfo1-to-2.diff, which includes the updates made to files
    already touched in tailor-tzinfo1.diff

> Your patch seems quite good to me. Did you run the tests? I think that
> they exercise only the source parsers, ie Changeset creation, but anyway...

Yes, I did. There were a bunch of failures for comparing datetimes with
timezone to datetimes without it, which were being created in the test
itself, so I updated those tests. The rest passed.

Please do not hesitate to raise any concern you may have about specific
portions of the patch.

Cheers,

-- 
Adeodato Simó                                     dato at net.com.org.es
Debian Developer                                  adeodato at debian.org
 
                        Listening to: Maximilian Hecker - Full Of Voices
[general] Ensure Changeset.date always has timezone information

This patch modifies all source backends to always set the tzinfo member of
every Changeset.date they create, and all target backends to make proper use
of it at commit time. This should solve all offset errors in dates for
commits, and making tailor robust with respect implementing a "timezone"
option for a project.

Summary of the needed changes:

  + vcpx:

    - tzinfo.py: new file, taken from pytz sources. Provides definitions for
      two basic tzinfo classes: UTC, and FixedOffset.

    - changes.py: make "date" member a property, with a setter function that
      raises an exception if the provided date does not have a not-None tzinfo
      member. Prefer this to silently setting it to UTC, which may be a wrong
      assumption.

  + vcpx/repository:

    - [source] cvs.py, cvsps.py darcs.py, monotone.py, svn.py: Changeset.date
      was always created in UTC; explicitly set date.tzinfo to UTC from
      tzinfo.py.

    - [source] bzr.py, git.py, hg.py: an UTC date was created from timestamp
      and offset; instead, create a date in the proper FixedOffset timezone.

    - [source] tla.py: an UTC date was created from the Standard-date header;
      however, a Date header with the local date is also provided: add new
      function __parse_date() that can calculate the timezone from these two
      headers, and use it.

    - [target] cvs.py, cvsps.py: str(date) was assumed not to contain timezone
      information; make date a tzinfo-less datetime prior to str()'ing it.

    - [target] cdv.py, darcs.py, monotone.py, svn.py: Changeset.date was
      assumed to be UTC; make the appropriate conversion prior to using it.

    - [target] cg.py, git.py: include "%z" in the strftime format specifier
      for GIT_AUTHOR_DATE.

    - [target] bzr.py, hg.py: do not use time.mktime() to calculate the
      timestamp, since it takes into account local timezone; use
      calendar.timegm() instead, which gives an UTC timestamp. And provide an
      appropriate timezone to the underlying commit() function.

  + vcpx/tests:

    - cvs.py, cvsps.py, darcs.py, svn.py: set tzinfo=UTC in datetimes that get
      created to be compared to cset.date.
--- vcpx/changes.py     
+++ vcpx/changes.py     2006-07-02 17:40:42 +0000
@@ -51,7 +51,6 @@
 
 
 from textwrap import TextWrapper
-from tzinfo import UTC
 from re import compile, MULTILINE
 
 itemize_re = compile('^[ ]*[-*] ', MULTILINE)
@@ -102,13 +101,21 @@
     """Refill changelogs"""
 
+    def _get_date(self):
+        return self.__date
+
+    def _set_date(self, date):
+        if date and date.tzinfo is None:
+            raise "Tailor bug (please report): Changeset dates must have a 
timezone."
+        self.__date = date
+
+    # date has to be a property because some backends (eg. monotone)
+    # update it after the constructor
+    date = property(_get_date, _set_date)
+
     def __init__(self, revision, date, author, log, entries=None, **other):
         """
         Initialize a new Changeset.
         """
 
-        if date.tzinfo is None:
-            # print "Warning: changeset created with naive datetime"
-            date = date.replace(tzinfo=UTC)
-
         self.revision = revision
         self.date = date
--- vcpx/repository/darcs.py    
+++ vcpx/repository/darcs.py    2006-07-02 17:40:42 +0000
@@ -266,7 +266,7 @@
                 date = l[:28]
                 author = l[30:-1]
                 y,m,d,hh,mm,ss,d1,d2,d3 = strptime(date, "%a %b %d %H:%M:%S %Z 
%Y")
-                date = datetime(y,m,d,hh,mm,ss)
+                date = datetime(y,m,d,hh,mm,ss,0,UTC)
                 l = output.readline()
                 assert (l.startswith('  * ') or
                         l.startswith('  UNDO:') or
--- vcpx/repository/hg.py       
+++ vcpx/repository/hg.py       2006-07-02 17:40:42 +0000
@@ -129,7 +129,7 @@
         (manifest, user, date, files, message) = repo.changelog.read(node)
 
         dt, tz = date
-        date = datetime.fromtimestamp(dt, FixedOffset(-tz/60)) # note the 
minus!
+        date = datetime.fromtimestamp(dt, FixedOffset(-tz/60)) # note the 
minus sign!
 
         manifest = repo.manifest.read(manifest)
 
=== modified file 'vcpx/repository/cdv.py'
--- vcpx/repository/cdv.py      2006-06-24 23:12:08 +0000
+++ vcpx/repository/cdv.py      2006-07-02 17:40:42 +0000
@@ -15,6 +15,7 @@
 from vcpx.shwrap import ExternalCommand
 from vcpx.target import SynchronizableTargetWorkingDir, 
TargetInitializationFailure
 from vcpx.source import ChangesetApplicationFailure
+from vcpx.tzinfo import UTC
 
 
 class CdvRepository(Repository):
@@ -63,7 +64,7 @@
 
         cmd = self.repository.command("-u", encode(author), "commit",
                                       "-m", encode('\n'.join(logmessage)),
-                                      "-D", date.strftime('%Y/%m/%d %H:%M:%S 
UTC'))
+                                      "-D", 
date.astimezone(UTC).strftime('%Y/%m/%d %H:%M:%S UTC'))
 
         if not entries:
             entries = ['...']

=== modified file 'vcpx/repository/cg.py'
--- vcpx/repository/cg.py       2006-06-24 23:12:08 +0000
+++ vcpx/repository/cg.py       2006-07-02 17:40:42 +0000
@@ -87,7 +87,7 @@
         if email:
             env['GIT_AUTHOR_EMAIL']=email
         if date:
-            env['GIT_AUTHOR_DATE']=str(date)
+            env['GIT_AUTHOR_DATE']=date.strftime('%Y-%m-%d %H:%M:%S %z')
         # '-f' flag means we can get empty commits, which
         # shouldn't be a problem.
         cmd = self.repository.command("commit", "-f")

=== modified file 'vcpx/repository/cvs.py'
--- vcpx/repository/cvs.py      2006-06-25 14:30:50 +0000
+++ vcpx/repository/cvs.py      2006-07-02 23:21:30 +0000
@@ -15,6 +15,7 @@
 from vcpx.shwrap import ExternalCommand, STDOUT, PIPE
 from vcpx.source import GetUpstreamChangesetsFailure
 from vcpx.config import ConfigurationError
+from vcpx.tzinfo import UTC
 
 
 class CvsRepository(CvspsRepository):
@@ -151,7 +152,9 @@
     a *serial* number, simply emit a (hopefully) unique signature...
     """
 
-    return "%s by %s" % (timestamp, author)
+    # don't print timezone info, to remain compatible (does not buy us
+    # anything, it being always UTC)
+    return "%s by %s" % (timestamp.replace(tzinfo=None), author)
 
 def _splitGlobalCVSRevision(revision):
     """
@@ -283,7 +286,7 @@
         time = dateparts[1]
         y,m,d = map(int, day.split(day[4]))
         hh,mm,ss = map(int, time.split(':'))
-        date = datetime(y,m,d,hh,mm,ss)
+        date = datetime(y,m,d,hh,mm,ss,0,UTC)
 
         assert info[1].strip()[:8] == 'author: ', infoline
 
@@ -467,7 +470,7 @@
                 # tagged before any files were added to it.  We could
                 # probably get a better date by looking at when the
                 # files were added, but who cares.
-                timestamp = datetime(1900,1,1)
+                timestamp = datetime(1900,1,1).replace(tzinfo=UTC)
             else:
                 # "since" is a revision name read from the state file,
                 # which means it was originally generated by
@@ -475,7 +478,7 @@
                 # %H:%M:%S" matches the format generated by the implicit
                 # call to timestamp.__str__() in getGlobalCVSRevision.
                 y,m,d,hh,mm,ss,d1,d2,d3 = strptime(since, "%Y-%m-%d %H:%M:%S")
-                timestamp = datetime(y,m,d,hh,mm,ss)
+                timestamp = datetime(y,m,d,hh,mm,ss,0,UTC)
             author = "unknown tagger"
             changelog = "tag %s %s" % (timestamp, tags)
             key = (timestamp, author, changelog)
@@ -666,12 +669,12 @@
         self.cvs_version = rev
 
         if ts == 'Result of merge':
-            self.timestamp = datetime.today()
+            self.timestamp = datetime.now(tz=UTC)
         else:
             if ts.startswith('Result of merge+'):
                 ts = ts[16:]
             y,m,d,hh,mm,ss,d1,d2,d3 = strptime(ts, "%a %b %d %H:%M:%S %Y")
-            self.timestamp = datetime(y,m,d,hh,mm,ss)
+            self.timestamp = datetime(y,m,d,hh,mm,ss,0,UTC)
 
         self.cvs_tag = tag
 

=== modified file 'vcpx/repository/cvsps.py'
--- vcpx/repository/cvsps.py    2006-06-25 09:25:52 +0000
+++ vcpx/repository/cvsps.py    2006-07-05 13:54:44 +0000
@@ -19,6 +19,7 @@
 from vcpx.source import UpdatableSourceWorkingDir, 
ChangesetApplicationFailure, \
                         InvocationError
 from vcpx.target import SynchronizableTargetWorkingDir, 
TargetInitializationFailure
+from vcpx.tzinfo import UTC
 
 
 class EmptyRepositoriesFoolsMe(TailorException):
@@ -167,7 +168,7 @@
             cvsdate = pset['date']
             y,m,d = map(int, cvsdate[:10].split('/'))
             hh,mm,ss = map(int, cvsdate[11:19].split(':'))
-            timestamp = datetime(y, m, d, hh, mm, ss)
+            timestamp = datetime(y, m, d, hh, mm, ss, 0, UTC)
             pset['date'] = timestamp
 
             yield Changeset(pset['revision'], timestamp, pset['author'],
@@ -362,7 +363,7 @@
                 "revision '%s'" % revision)
         if timestamp == 'INITIAL':
             initialcset = csets.next()
-            timestamp = initialcset.date.isoformat(sep=' ')
+            timestamp = initialcset.date.replace(tzinfo=None).isoformat(sep=' 
')
         else:
             initialcset = None
 

=== modified file 'vcpx/repository/git.py'
--- vcpx/repository/git.py      2006-07-02 18:08:39 +0000
+++ vcpx/repository/git.py      2006-07-02 19:47:10 +0000
@@ -19,6 +19,7 @@
 from vcpx.source import UpdatableSourceWorkingDir, GetUpstreamChangesetsFailure
 from vcpx.source import ChangesetApplicationFailure
 from vcpx.target import SynchronizableTargetWorkingDir, 
TargetInitializationFailure
+from vcpx.tzinfo import FixedOffset
 
 from vcpx import TailorException
 
@@ -177,7 +178,7 @@
                 tzsecs = (tzsecs / 100 * 60 + tzsecs % 100) * 60
                 if tz < 0:
                     tzsecs = -tzsecs
-                date = datetime.utcfromtimestamp(dt + tzsecs)
+                date = datetime.fromtimestamp(dt, FixedOffset(tzsecs/60))
             if line.startswith('    '):
                 loglines.append(line.lstrip('    '))
 
@@ -314,7 +315,7 @@
             env['GIT_AUTHOR_EMAIL']=email
             env['GIT_COMMITTER_EMAIL']=email
         if date:
-            env['GIT_AUTHOR_DATE']=date.strftime("%Y-%m-%d %H:%M:%S")
+            env['GIT_AUTHOR_DATE']=date.strftime("%Y-%m-%d %H:%M:%S %z")
             env['GIT_COMMITTER_DATE']=env['GIT_AUTHOR_DATE']
         if parent:
             cmd = self.repository.command('commit-tree', treeid, '-p', parent)

=== modified file 'vcpx/repository/monotone.py'
--- vcpx/repository/monotone.py 2006-06-24 23:12:08 +0000
+++ vcpx/repository/monotone.py 2006-07-02 17:40:42 +0000
@@ -21,6 +21,7 @@
                         ChangesetApplicationFailure, 
GetUpstreamChangesetsFailure
 from vcpx.target import SynchronizableTargetWorkingDir, 
TargetInitializationFailure
 from vcpx.changes import Changeset
+from vcpx.tzinfo import UTC
 
 
 MONOTONERC = """\
@@ -190,7 +191,7 @@
                     time = dateparts[1]
                     y,m,d = map(int, day.split(day[4]))
                     hh,mm,ss = map(int, time.split(':'))
-                    date = datetime(y,m,d,hh,mm,ss)
+                    date = datetime(y,m,d,hh,mm,ss,0,UTC)
                     self.dates.append(date)
                     state = self.SINGLE
             elif pr("Branch:"):
@@ -713,6 +714,7 @@
         log.write(encode('\n'.join(logmessage)))
         log.close()
 
+        date = date.astimezone(UTC).replace(tzinfo=None) # monotone wants UTC
         cmd = self.repository.command("commit",
                                       "--author", encode(author),
                                       "--date", date.isoformat(),

=== modified file 'vcpx/repository/tla.py'
--- vcpx/repository/tla.py      2006-06-24 23:12:08 +0000
+++ vcpx/repository/tla.py      2006-07-02 17:40:42 +0000
@@ -49,6 +49,7 @@
 from vcpx.source import UpdatableSourceWorkingDir, 
ChangesetApplicationFailure, \
                         GetUpstreamChangesetsFailure
 from vcpx.target import TargetInitializationFailure
+from vcpx.tzinfo import UTC, FixedOffset
 
 
 class TlaRepository(Repository):
@@ -205,9 +206,8 @@
                 err = "in-version continuations not supported"
             if err:
                 raise GetUpstreamChangesetsFailure(str(err))
-            y,m,d,hh,mm,ss,d1,d2,d3 = strptime(msg['Standard-date'],
-                                               "%Y-%m-%d %H:%M:%S %Z")
-            date = datetime(y,m,d,hh,mm,ss)
+
+            date = self.__parse_date(msg['Date'], msg['Standard-date'])
             author = msg['Creator']
             revision = fqrev
             logmsg = [msg['Summary']]
@@ -221,6 +221,18 @@
             changesets.append(Changeset(revision, date, author, logmsg))
         return changesets
 
+    def __parse_date(self, d1, d2):
+        # d1: Wed Dec 10 15:01:28 EST 2003
+        # d2: 2003-12-10 04:01:28 GMT
+
+        d1 = datetime(*strptime(d1[:19] + d1[-5:], '%a %b %d %H:%M:%S 
%Y')[:6]).replace(tzinfo=UTC)
+        d2 = datetime(*strptime(d2[:19], '%Y-%m-%d 
%H:%M:%S')[:6]).replace(tzinfo=UTC)
+
+        offset = d1 - d2
+        offset = offset.seconds + offset.days * 24 * 3600
+
+        return d1.replace(tzinfo=FixedOffset(offset/60))
+
     def __hide_foreign_entries(self):
         c = ExternalCommand(cwd=self.basedir,
                             command=self.repository.command("tree-lint", 
"-tu"))

=== modified file 'vcpx/tests/cvs.py'
--- vcpx/tests/cvs.py   2006-06-25 09:25:52 +0000
+++ vcpx/tests/cvs.py   2006-07-05 17:11:02 +0000
@@ -10,6 +10,7 @@
 from StringIO import StringIO
 from vcpx.repository.cvs import changesets_from_cvslog, compare_cvs_revs, \
                                 cvs_revs_same_branch, normalize_cvs_rev
+from vcpx.tzinfo import UTC
 
 
 class CvsEntry(TestCase):
@@ -25,21 +26,21 @@
         e = CvsEntry(tagline)
         self.assertEqual(e.filename, 'version.txt')
         self.assertEqual(e.cvs_version, '1.16.2.1')
-        self.assertEqual(e.timestamp, datetime(2004, 7, 13, 12, 49, 2))
+        self.assertEqual(e.timestamp, datetime(2004, 7, 13, 12, 49, 2, 0, UTC))
         self.assertEqual(e.cvs_tag, 'T1.16.2.1')
 
         tagline = "/Validator.py/1.31.2.5/Result of merge+Tue Jul 13 13:43:06 
2004//T1.31.2.5"
         e = CvsEntry(tagline)
         self.assertEqual(e.filename, 'Validator.py')
         self.assertEqual(e.cvs_version, '1.31.2.5')
-        self.assertEqual(e.timestamp, datetime(2004, 7, 13, 13, 43, 6))
+        self.assertEqual(e.timestamp, datetime(2004, 7, 13, 13, 43, 6, 0, UTC))
         self.assertEqual(e.cvs_tag, 'T1.31.2.5')
 
         tagline = "/Makefile.am/1.55/Result of merge//T1.55"
         e = CvsEntry(tagline)
         self.assertEqual(e.filename, 'Makefile.am')
         self.assertEqual(e.cvs_version, '1.55')
-        self.assert_((datetime.today() - e.timestamp) < timedelta(seconds=1))
+        self.assert_((datetime.now(tz=UTC) - e.timestamp) < 
timedelta(seconds=1))
         self.assertEqual(e.cvs_tag, 'T1.55')
 
 
@@ -63,7 +64,7 @@
 
         cset = csets[0]
         self.assertEqual(cset.author, "goodger")
-        self.assertEqual(cset.date, datetime(2004, 6, 3, 13, 50, 58))
+        self.assertEqual(cset.date, datetime(2004, 6, 3, 13, 50, 58, 0, UTC))
         self.assertEqual(cset.log, "Added to project (exctracted from "
                                    "HISTORY.txt)")
         entry = cset.entries[0]
@@ -73,7 +74,7 @@
 
         cset = csets[1]
         self.assertEqual(cset.author, "goodger")
-        self.assertEqual(cset.date, datetime(2004, 6, 10, 2, 17, 20))
+        self.assertEqual(cset.date, datetime(2004, 6, 10, 2, 17, 20, 0, UTC))
         self.assertEqual(cset.log, "")
         entry = cset.entries[0]
         self.assertEqual(entry.name, 'THANKS.txt')
@@ -88,19 +89,19 @@
 
         cset = csets.next()
         self.assertEqual(cset.author, "goodger")
-        self.assertEqual(cset.date, datetime(2004, 4, 27, 19, 51, 07))
-
-        cset = csets.next()
-        self.assertEqual(cset.author, "goodger")
-        self.assertEqual(cset.date, datetime(2004, 6, 17, 2, 8, 48))
-
-        cset = csets.next()
-        self.assertEqual(cset.author, "goodger")
-        self.assertEqual(cset.date, datetime(2004, 6, 17, 2, 51, 31))
-
-        cset = csets.next()
-        self.assertEqual(cset.author, "goodger")
-        self.assertEqual(cset.date, datetime(2004, 6, 17, 21, 46, 50))
+        self.assertEqual(cset.date, datetime(2004, 4, 27, 19, 51, 07, 0, UTC))
+
+        cset = csets.next()
+        self.assertEqual(cset.author, "goodger")
+        self.assertEqual(cset.date, datetime(2004, 6, 17, 2, 8, 48, 0, UTC))
+
+        cset = csets.next()
+        self.assertEqual(cset.author, "goodger")
+        self.assertEqual(cset.date, datetime(2004, 6, 17, 2, 51, 31, 0, UTC))
+
+        cset = csets.next()
+        self.assertEqual(cset.author, "goodger")
+        self.assertEqual(cset.date, datetime(2004, 6, 17, 21, 46, 50, 0, UTC))
         self.assertEqual(cset.log,"support for CSV directive implementation")
         self.assertEqual(len(cset.entries), 2)
 
@@ -114,7 +115,7 @@
 
         cset = csets.next()
         self.assertEqual(cset.author, "felixwiemann")
-        self.assertEqual(cset.date, datetime(2004, 6, 20, 16, 3, 17))
+        self.assertEqual(cset.date, datetime(2004, 6, 20, 16, 3, 17, 0, UTC))
 
     def testDeletedEntry(self):
         """Verify recognition of deleted entries in the cvs log"""
@@ -143,23 +144,23 @@
 
         cset = csets[0]
         self.assertEqual(len(cset.entries), 2)
-        self.assertEqual(cset.date, datetime(1996, 10, 7, 18, 32, 12))
+        self.assertEqual(cset.date, datetime(1996, 10, 7, 18, 32, 12, 0, UTC))
 
         cset = csets[1]
         self.assertEqual(len(cset.entries), 1)
-        self.assertEqual(cset.date, datetime(1996, 10, 14, 13, 56, 50))
+        self.assertEqual(cset.date, datetime(1996, 10, 14, 13, 56, 50, 0, UTC))
         entry = cset.entries[0]
         self.assertEqual(entry.name, 'Doc/libObjCStreams.tex')
 
         cset = csets[2]
         self.assertEqual(len(cset.entries), 1)
-        self.assertEqual(cset.date, datetime(1996, 10, 18, 12, 36, 4))
+        self.assertEqual(cset.date, datetime(1996, 10, 18, 12, 36, 4, 0, UTC))
         entry = cset.entries[0]
         self.assertEqual(entry.name, 'Doc/libPyObjC.tex')
 
         cset = csets[3]
         self.assertEqual(len(cset.entries), 2)
-        self.assertEqual(cset.date, datetime(1996, 10, 18, 13, 48, 45))
+        self.assertEqual(cset.date, datetime(1996, 10, 18, 13, 48, 45, 0, UTC))
 
     def testBranchesInLog(self):
         """Verify the parser groks with the branches info on revision"""
@@ -192,7 +193,7 @@
 
         cset = csets.next()
         self.assertEqual(cset.author, "tiran")
-        self.assertEqual(cset.date, datetime(2004, 8, 6, 20, 13, 30))
+        self.assertEqual(cset.date, datetime(2004, 8, 6, 20, 13, 30, 0, UTC))
         self.assertEqual(cset.log, "Added ExtendingType")
         entry = cset.entries[0]
         self.assertEqual(entry.name, 'docs/ExtendingType.txt')
@@ -201,7 +202,7 @@
 
         cset = csets.next()
         self.assertEqual(cset.author, "tiran")
-        self.assertEqual(cset.date, datetime(2004, 8, 9, 7, 44, 9))
+        self.assertEqual(cset.date, datetime(2004, 8, 9, 7, 44, 9, 0, UTC))
         self.assertEqual(cset.log, """\
 Recoded migration walkers to use a generator instead returning a list to make 
them much more memory efficient.
 
@@ -215,22 +216,22 @@
 
         cset = csets.next()
         self.assertEqual(cset.author, "tiran")
-        self.assertEqual(cset.date, datetime(2004, 8, 13, 13, 15, 46))
+        self.assertEqual(cset.date, datetime(2004, 8, 13, 13, 15, 46, 0, UTC))
         self.assertEqual(cset.log, "Fixed typo")
 
         cset = csets.next()
         self.assertEqual(cset.author, "tiran")
-        self.assertEqual(cset.date, datetime(2004, 8, 13, 13, 21, 24))
+        self.assertEqual(cset.date, datetime(2004, 8, 13, 13, 21, 24, 0, UTC))
         self.assertEqual(cset.log, "Something went wrong ...")
 
         cset = csets.next()
         self.assertEqual(cset.author, "tiran")
-        self.assertEqual(cset.date, datetime(2004, 8, 13, 13, 21, 53))
+        self.assertEqual(cset.date, datetime(2004, 8, 13, 13, 21, 53, 0, UTC))
         self.assertEqual(cset.log, "Somehow I mixed up two sentences")
 
         cset = csets.next()
         self.assertEqual(cset.author, "rochael")
-        self.assertEqual(cset.date, datetime(2004, 8, 13, 13, 59, 55))
+        self.assertEqual(cset.date, datetime(2004, 8, 13, 13, 59, 55, 0, UTC))
         self.assertEqual(cset.log, "removed duplicated ENABLE_TEMPLATE_MIXIN")
         entry = cset.entries[0]
         self.assertEqual(entry.name, 'customconfig.py.example')
@@ -353,10 +354,10 @@
         csets = list(changesets_from_cvslog(log, 'src'))
 
         cset = csets[0]
-        self.assertEqual(cset.date, datetime(1994, 5, 17, 13, 03, 36))
+        self.assertEqual(cset.date, datetime(1994, 5, 17, 13, 03, 36, 0, UTC))
 
         cset = csets[-1]
-        self.assertEqual(cset.date, datetime(1995, 12, 30, 18, 32, 46))
+        self.assertEqual(cset.date, datetime(1995, 12, 30, 18, 32, 46, 0, UTC))
 
 class CvsRevisions(TestCase):
     """Tests the basic CVS revisions handling"""

=== modified file 'vcpx/tests/cvsps.py'
--- vcpx/tests/cvsps.py 2006-06-24 23:12:08 +0000
+++ vcpx/tests/cvsps.py 2006-07-05 16:48:07 +0000
@@ -8,6 +8,7 @@
 from unittest import TestCase
 from datetime import datetime
 from vcpx.repository.cvsps import changesets_from_cvsps
+from vcpx.tzinfo import UTC
 
 
 class CvspsParser(TestCase):
@@ -29,7 +30,7 @@
         cset = csets.next()
         self.assertEqual(cset.revision, '1500')
         self.assertEqual(cset.author, "grubert")
-        self.assertEqual(cset.date, datetime(2004, 5, 9, 17, 54, 22))
+        self.assertEqual(cset.date, datetime(2004, 5, 9, 17, 54, 22, 0, UTC))
         self.assertEqual(cset.log, "Tell the reason for using mbox "
                                    "(not wrapping long lines).")
 

=== modified file 'vcpx/tests/darcs.py'
--- vcpx/tests/darcs.py 2006-07-05 17:05:14 +0000
+++ vcpx/tests/darcs.py 2006-07-05 17:08:35 +0000
@@ -10,6 +10,7 @@
 from StringIO import StringIO
 from vcpx.repository.darcs import changesets_from_darcschanges
 from vcpx.shwrap import ExternalCommand, PIPE
+from vcpx.tzinfo import UTC
 
 
 class DarcsChangesParser(TestCase):
@@ -54,7 +55,7 @@
         self.assertEqual(cset.revision,
                          "Fix the CVS parser to omit already seen changesets")
         self.assertEqual(cset.author, "[EMAIL PROTECTED]")
-        self.assertEqual(cset.date, datetime(2004, 7, 16, 12, 37, 37))
+        self.assertEqual(cset.date, datetime(2004, 7, 16, 12, 37, 37, 0, UTC))
         self.assertEqual(cset.log, "For some unknown reasons....")
         entry = cset.entries[0]
         self.assertEqual(entry.name, 'vcpx/cvs.py')
@@ -63,7 +64,7 @@
         cset = csets.next()
         self.assertEqual(cset.revision,
                          "Svn log parser with test")
-        self.assertEqual(cset.date, datetime(2004, 6, 1, 14, 5, 59))
+        self.assertEqual(cset.date, datetime(2004, 6, 1, 14, 5, 59, 0, UTC))
         self.assertEqual(len(cset.entries), 4)
         self.assertEqual(cset.darcs_hash,
                          
'20040601140559-97f81-b669594864cb35290fbe4848e6645e73057a8caf.gz')
@@ -212,10 +213,10 @@
         csets = changesets_from_darcschanges(log)
 
         cset = csets.next()
-        self.assertEqual(cset.date, datetime(2003, 10, 14, 9, 42, 0))
+        self.assertEqual(cset.date, datetime(2003, 10, 14, 9, 42, 0, 0, UTC))
 
         cset = csets.next()
-        self.assertEqual(cset.date, datetime(2003, 10, 14, 14, 2, 31))
+        self.assertEqual(cset.date, datetime(2003, 10, 14, 14, 2, 31, 0, UTC))
 
     RENAME_THEN_REMOVE_TEST = """
 <changelog>

=== modified file 'vcpx/tests/svn.py'
--- vcpx/tests/svn.py   2006-06-24 23:25:48 +0000
+++ vcpx/tests/svn.py   2006-07-05 16:49:31 +0000
@@ -8,6 +8,7 @@
 from unittest import TestCase
 from datetime import datetime
 from vcpx.repository.svn import changesets_from_svnlog
+from vcpx.tzinfo import UTC
 
 
 class FakeLogger:
@@ -40,7 +41,7 @@
 
         cset = csets.next()
         self.assertEqual(cset.author, 'lele')
-        self.assertEqual(cset.date, datetime(2004,11,12,15,05,37,134366))
+        self.assertEqual(cset.date, datetime(2004,11,12,15,05,37,134366,UTC))
         self.assertEqual(cset.log, 'create tree')
         self.assertEqual(len(cset.entries), 2)
 
@@ -54,7 +55,7 @@
 
         cset = csets.next()
         self.assertEqual(cset.author, 'lele')
-        self.assertEqual(cset.date, datetime(2004,11,12,15,06,04,193650))
+        self.assertEqual(cset.date, datetime(2004,11,12,15,06,04,193650,UTC))
         self.assertEqual(cset.log, 'rename dir')
         self.assertEqual(len(cset.entries), 1)
 
@@ -74,7 +75,7 @@
 
         cset = csets.next()
         self.assertEqual(cset.author, 'anthony')
-        self.assertEqual(cset.date, datetime(2004,11,9,6,54,20,709243))
+        self.assertEqual(cset.date, datetime(2004,11,9,6,54,20,709243,UTC))
         self.assertEqual(cset.log, 'Moving to a /sandbox')
         self.assertEqual(len(cset.entries), 1)
 
@@ -94,7 +95,7 @@
 
         cset = csets[1]
         self.assertEqual(cset.author, 'lele')
-        self.assertEqual(cset.date, datetime(2005,1,8, 17,36,55,174757))
+        self.assertEqual(cset.date, datetime(2005,1,8, 17,36,55,174757,UTC))
         self.assertEqual(cset.log, 'Copy')
         self.assertEqual(len(cset.entries), 1)
 
@@ -104,7 +105,7 @@
         self.assertEqual(entry.old_name, 'file1.txt')
 
         cset = csets[2]
-        self.assertEqual(cset.date, datetime(2005,1,8, 17,42,41,347315))
+        self.assertEqual(cset.date, datetime(2005,1,8, 17,42,41,347315,UTC))
         self.assertEqual(cset.log, 'Remove')
         self.assertEqual(len(cset.entries), 1)
 
@@ -113,7 +114,7 @@
         self.assertEqual(entry.action_kind, entry.DELETED)
 
         cset = csets[3]
-        self.assertEqual(cset.date, datetime(2005,1,8, 17,43,9,909127))
+        self.assertEqual(cset.date, datetime(2005,1,8, 17,43,9,909127,UTC))
         self.assertEqual(cset.log, 'Move')
         self.assertEqual(len(cset.entries), 1)
 
@@ -132,7 +133,7 @@
 
         cset = csets.next()
         self.assertEqual(cset.author, 'cmlenz')
-        self.assertEqual(cset.date, datetime(2005,3,21, 8,34, 2,522947))
+        self.assertEqual(cset.date, datetime(2005,3,21, 8,34, 2,522947,UTC))
         self.assertEqual(len(cset.entries), 7)
 
         entry = cset.entries[0]

_______________________________________________
Tailor mailing list
[email protected]
http://lists.zooko.com/mailman/listinfo/tailor

Reply via email to