view hgext/interhg.py @ 5827:0c29977bd7db

record: refactor record into generic record driver rationale --------- I'd like to make MQ version of record -- qrecord. >From the first glance it seemed to be easy -- the task in essence would be to change call to cmdutil.commit() to something like mq.qrefresh(). As it turned out queue.refresh() and cmdutil.commit() have different semantics -- cmdutil.commit() first scans for changes and then delegate the actual commit to lowlevel func. On the other hand queue.refresh() do it all in once, and I am a bit scary to change it. Maybe the right way would be to first refactor queue.refresh() to use cmdutil.commit() machinery, and then trivially adjust record, but I feel I'm not competent for the task right now. Instead, I propose we refactor record to be some sort of high-level driver, or like a high-level decorator one can say, which will first interactively filter changes, and then delegate commit job to high-level commiter, e.g. 'commit' or 'qrefresh' So, this patch does just that -- refactor record to be generic driver, and update 'hg record' code to use the driver. 'hg qrecord' will follow.
author Kirill Smelkov <kirr@mns.spb.ru>
date Thu, 10 Jan 2008 12:07:13 +0300
parents 18091102a633
children 9f1e6ab76069
line wrap: on
line source

# interhg.py - interhg
#
# Copyright 2007 OHASHI Hideya <ohachige@gmail.com>
#
# Contributor(s):
#   Edward Lee <edward.lee@engineering.uiuc.edu>
#
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
#
# The `interhg' Mercurial extension allows you to change changelog and
# summary text just like InterWiki way.
#
# To enable this extension:
#
#   [extensions]
#   interhg =
#
# These are some example patterns (link to bug tracking, etc.)
#
#   [interhg]
#   issues = s!issue(\d+)!<a href="http://bts/issue\1">issue\1<\/a>!
#   bugzilla = s!((?:bug|b=|(?=#?\d{4,}))(?:\s*#?)(\d+))!<a..=\2">\1</a>!i
#   boldify = s/(^|\s)#(\d+)\b/ <b>#\2<\/b>/
#
# Add any number of names and patterns to match

import re
from mercurial.hgweb import hgweb_mod
from mercurial import templater

orig_escape = templater.common_filters["escape"]

interhg_table = []

def interhg_escape(x):
    escstr = orig_escape(x)
    for regexp, format in interhg_table:
        escstr = regexp.sub(format, escstr)
    return escstr

templater.common_filters["escape"] = interhg_escape

orig_refresh = hgweb_mod.hgweb.refresh

def interhg_refresh(self):
    interhg_table[:] = []
    for key, pattern in self.repo.ui.configitems('interhg'):
        # grab the delimiter from the character after the "s"
        unesc = pattern[1]
        delim = re.escape(unesc)

        # identify portions of the pattern, taking care to avoid escaped
        # delimiters. the replace format and flags are optional, but delimiters
        # are required.
        match = re.match(r'^s%s(.+)(?:(?<=\\\\)|(?<!\\))%s(.*)%s([ilmsux])*$'
                         % (delim, delim, delim), pattern)
        if not match:
            self.repo.ui.warn("interhg: invalid pattern for %s: %s\n"
                              % (key, pattern))
            continue

        # we need to unescape the delimiter for regexp and format
        delim_re = re.compile(r'(?<!\\)\\%s' % delim)
        regexp = delim_re.sub(unesc, match.group(1))
        format = delim_re.sub(unesc, match.group(2))

        # the pattern allows for 6 regexp flags, so set them if necessary
        flagin = match.group(3)
        flags = 0
        if flagin:
            for flag in flagin.upper():
                flags |= re.__dict__[flag]

        try:
            regexp = re.compile(regexp, flags)
            interhg_table.append((regexp, format))
        except re.error:
            self.repo.ui.warn("interhg: invalid regexp for %s: %s\n"
                              % (key, regexp))
    return orig_refresh(self)

hgweb_mod.hgweb.refresh = interhg_refresh