* 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