mercurial/changelog.py
author mpm@selenic.com
Thu, 08 Sep 2005 10:49:33 -0700
changeset 1219 56582bb2b869
parent 1202 71111d796e40
child 1321 b47f96a178a3
permissions -rw-r--r--
hgweb: fix scope for RepoError
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1095
0a18374c0769 changelog: adjust imports, comment
mpm@selenic.com
parents: 1094 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
1095
0a18374c0769 changelog: adjust imports, comment
mpm@selenic.com
parents: 1094 1089
diff changeset
     8
import os, time
262
3db700146536 implement demand loading hack
mpm@selenic.com
parents: 256
diff changeset
     9
from revlog import *
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    10
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    11
class changelog(revlog):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    12
    def __init__(self, opener):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    13
        revlog.__init__(self, opener, "00changelog.i", "00changelog.d")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    14
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    15
    def extract(self, text):
37
a8811676c85a Move hex/bin bits to revlog
mpm@selenic.com
parents: 33
diff changeset
    16
        if not text:
40
5f87633e1ea2 Date is an int as a string in changelog
mpm@selenic.com
parents: 37
diff changeset
    17
            return (nullid, "", "0", [], "")
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    18
        last = text.index("\n\n")
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    19
        desc = text[last + 2:]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    20
        l = text[:last].splitlines()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    21
        manifest = bin(l[0])
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    22
        user = l[1]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    23
        date = l[2]
1013
2e8b8da9a86e Deal with repos with missing timezones
mpm@selenic.com
parents: 994
diff changeset
    24
        if " " not in date:
2e8b8da9a86e Deal with repos with missing timezones
mpm@selenic.com
parents: 994
diff changeset
    25
            date += " 0" # some tools used -d without a timezone
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    26
        files = l[3:]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    27
        return (manifest, user, date, files, desc)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    28
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    29
    def read(self, node):
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    30
        return self.extract(self.revision(node))
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    31
203
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
    32
    def add(self, manifest, list, desc, transaction, p1=None, p2=None,
0b486b5e0796 hg rawcommit command
mpm@selenic.com
parents: 200
diff changeset
    33
                  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
    34
        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
    35
            # 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
    36
            # 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
    37
            # 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
    38
            try:
71111d796e40 Commit date validation: more stringent checks, more useful error messages.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1197
diff changeset
    39
                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
    40
            except ValueError:
71111d796e40 Commit date validation: more stringent checks, more useful error messages.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1197
diff changeset
    41
                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
    42
            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
    43
                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
    44
            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
    45
                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
    46
        else:
968
4a9a753e8232 [PATCH] Take DST into account
Samuel Tardieu <sam@rfc1149.net>
parents: 961
diff changeset
    47
            if time.daylight: offset = time.altzone
4a9a753e8232 [PATCH] Take DST into account
Samuel Tardieu <sam@rfc1149.net>
parents: 961
diff changeset
    48
            else: offset = time.timezone
4a9a753e8232 [PATCH] Take DST into account
Samuel Tardieu <sam@rfc1149.net>
parents: 961
diff changeset
    49
            date = "%d %d" % (time.time(), offset)
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    50
        list.sort()
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    51
        l = [hex(manifest), user, date] + list + ["", desc]
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    52
        text = "\n".join(l)
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
    53
        return self.addrevision(text, transaction, self.count(), p1, p2)