view mercurial/changelog.py @ 1721:801756d0ca84

add pretxncommit hook. hook allows check of changeset after create, but before transaction is committed. hook failure rolls transaction back. makes place for local policies like commit message must contain bug id or reviewer signoff. change also adds parent changeset ids to commit hook environment, because is cheap and useful.
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Tue, 14 Feb 2006 17:13:18 -0800
parents 9d2c2e6b32b5
children 11d12bd6e1dc 74d3f5336b66
line wrap: on
line source

# changelog.py - changelog class for mercurial
#
# Copyright 2005 Matt Mackall <mpm@selenic.com>
#
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.

from revlog import *
from i18n import gettext as _
from demandload import demandload
demandload(globals(), "os time util")

class changelog(revlog):
    def __init__(self, opener):
        revlog.__init__(self, opener, "00changelog.i", "00changelog.d")

    def extract(self, text):
        if not text:
            return (nullid, "", (0, 0), [], "")
        last = text.index("\n\n")
        desc = text[last + 2:]
        l = text[:last].splitlines()
        manifest = bin(l[0])
        user = l[1]
        date = l[2].split(' ')
        time = float(date.pop(0))
        try:
            # various tools did silly things with the time zone field.
            timezone = int(date[0])
        except:
            timezone = 0
        files = l[3:]
        return (manifest, user, (time, timezone), files, desc)

    def read(self, node):
        return self.extract(self.revision(node))

    def add(self, manifest, list, desc, transaction, p1=None, p2=None,
                  user=None, date=None):
        if date:
            # validate explicit (probably user-specified) date and
            # time zone offset. values must fit in signed 32 bits for
            # current 32-bit linux runtimes.
            try:
                when, offset = map(int, date.split(' '))
            except ValueError:
                raise ValueError(_('invalid date: %r') % date)
            if abs(when) > 0x7fffffff:
                raise ValueError(_('date exceeds 32 bits: %d') % when)
            if abs(offset) >= 43200:
                raise ValueError(_('impossible time zone offset: %d') % offset)
        else:
            date = "%d %d" % util.makedate()
        list.sort()
        l = [hex(manifest), user, date] + list + ["", desc]
        text = "\n".join(l)
        return self.addrevision(text, transaction, self.count(), p1, p2)