annotate mercurial/changelog.py @ 1321:b47f96a178a3

Clean up date and timezone handling. We used to pass changelog dates around as a "unixtime timezone" string containing a pair of encoded ints. Now, they get passed around as a (unixtime, timezone) tuple of numbers, which makes much more sense.
author Bryan O'Sullivan <bos@serpentine.com>
date Thu, 22 Sep 2005 23:19:47 -0700
parents 71111d796e40
children 085e3fc189b6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1095
0a18374c0769 changelog: adjust imports, comment
mpm@selenic.com
parents: 1089
diff changeset
1 # changelog.py - changelog class for mercurial
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
2 #
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
3 # Copyright 2005 Matt Mackall <mpm@selenic.com>
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
4 #
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
5 # This software may be used and distributed according to the terms
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
6 # of the GNU General Public License, incorporated herein by reference.
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
7
262
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 256
diff changeset
8 from revlog import *
1321
b47f96a178a3 Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1202
diff changeset
9 from demandload import demandload
b47f96a178a3 Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1202
diff changeset
10 demandload(globals(), "os time util")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
11
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
12 class changelog(revlog):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
13 def __init__(self, opener):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
14 revlog.__init__(self, opener, "00changelog.i", "00changelog.d")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
15
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
16 def extract(self, text):
37
a8811676c85a Move hex/bin bits to revlog
mpm@selenic.com
parents: 33
diff changeset
17 if not text:
40
5f87633e1ea2 Date is an int as a string in changelog
mpm@selenic.com
parents: 37
diff changeset
18 return (nullid, "", "0", [], "")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
19 last = text.index("\n\n")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
20 desc = text[last + 2:]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
21 l = text[:last].splitlines()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
22 manifest = bin(l[0])
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
23 user = l[1]
1321
b47f96a178a3 Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1202
diff changeset
24 date = l[2].split(' ')
b47f96a178a3 Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1202
diff changeset
25 time = int(date.pop(0))
b47f96a178a3 Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1202
diff changeset
26 try:
b47f96a178a3 Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1202
diff changeset
27 # various tools did silly things with the time zone field.
b47f96a178a3 Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1202
diff changeset
28 timezone = int(date[0])
b47f96a178a3 Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1202
diff changeset
29 except:
b47f96a178a3 Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1202
diff changeset
30 timezone = 0
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
31 files = l[3:]
1321
b47f96a178a3 Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1202
diff changeset
32 return (manifest, user, (time, timezone), files, desc)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
33
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
34 def read(self, node):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
35 return self.extract(self.revision(node))
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
36
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
37 def add(self, manifest, list, desc, transaction, p1=None, p2=None,
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
38 user=None, date=None):
1195
f92af8d53330 Validate user input of dates when adding a changelog entry.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1095
diff changeset
39 if date:
1196
3738e85ead07 Make date/timezone validation in changelog.add more robust. Add test.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1195
diff changeset
40 # validate explicit (probably user-specified) date and
1197
8deb69818e4b Date validation must check for 32-bit width. Don't use assert to check.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1196
diff changeset
41 # time zone offset. values must fit in signed 32 bits for
8deb69818e4b Date validation must check for 32-bit width. Don't use assert to check.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1196
diff changeset
42 # current 32-bit linux runtimes.
1202
71111d796e40 Commit date validation: more stringent checks, more useful error messages.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1197
diff changeset
43 try:
71111d796e40 Commit date validation: more stringent checks, more useful error messages.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1197
diff changeset
44 when, offset = map(int, date.split(' '))
71111d796e40 Commit date validation: more stringent checks, more useful error messages.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1197
diff changeset
45 except ValueError:
71111d796e40 Commit date validation: more stringent checks, more useful error messages.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1197
diff changeset
46 raise ValueError('invalid date: %r' % date)
1197
8deb69818e4b Date validation must check for 32-bit width. Don't use assert to check.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1196
diff changeset
47 if abs(when) > 0x7fffffff:
8deb69818e4b Date validation must check for 32-bit width. Don't use assert to check.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1196
diff changeset
48 raise ValueError('date exceeds 32 bits: %d' % when)
8deb69818e4b Date validation must check for 32-bit width. Don't use assert to check.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1196
diff changeset
49 if abs(offset) >= 43200:
8deb69818e4b Date validation must check for 32-bit width. Don't use assert to check.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1196
diff changeset
50 raise ValueError('impossible time zone offset: %d' % offset)
1195
f92af8d53330 Validate user input of dates when adding a changelog entry.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1095
diff changeset
51 else:
1321
b47f96a178a3 Clean up date and timezone handling.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1202
diff changeset
52 date = "%d %d" % util.makedate()
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
53 list.sort()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
54 l = [hex(manifest), user, date] + list + ["", desc]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
55 text = "\n".join(l)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
56 return self.addrevision(text, transaction, self.count(), p1, p2)