hgext/hgcia.py
author Anton Shestakov <engored@ya.ru>
Mon, 22 Sep 2014 23:46:38 +0900
branchstable
changeset 22506 6e1fbcb18a75
parent 20667 e96e9f805c19
child 22917 1c38b4063586
permissions -rw-r--r--
hgweb: fail if an invalid command was supplied in url path (issue4071) Traditionally, the way to specify a command for hgweb was to use url query arguments (e.g. "?cmd=batch"). If the command is unknown to hgweb, it gives an error (e.g. "400 no such method: badcmd"). But there's also another way to specify a command: as a url path fragment (e.g. "/graph"). Before, hgweb was made forgiving (looks like it was made in 44c5157474e7) and user could put any unknown command in the url. If hgweb couldn't understand it, it would just silently fall back to the default command, which depends on the actual style (e.g. for paper it's shortlog, for monoblue it's summary). This was inconsistent and was breaking some tools that rely on http status codes (as noted in the issue4071). So this patch changes that behavior to the more consistent one, i.e. hgweb will now return "400 no such method: badcmd". So if some tool was relying on having an invalid command return http status code 200 and also have some information, then it will stop working. That is, if somebody typed foobar when they really meant shortlog (and the user was lucky enough to choose a style where the default command is shortlog too), that fact will now be revealed. Code-wise, the changed if block is only relevant when there's no "?cmd" query parameter (i.e. only when command is specified as a url path fragment), and looks like the removed else branch was there only for falling back to default command. With that removed, the rest of the code works as expected: it looks at the command, and if it's not known, raises a proper ErrorResponse exception with an appropriate message. Evidently, there were no tests that required the old behavior. But, frankly, I don't know any way to tell if anyone actually exploited such forgiving behavior in some in-house tool.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
     1
# Copyright (C) 2007-8 Brendan Cully <brendan@kublai.com>
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9467
diff changeset
     2
#
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9467
diff changeset
     3
# This software may be used and distributed according to the terms of the
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9467
diff changeset
     4
# GNU General Public License version 2 or any later version.
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
     5
8935
f4f0e902b750 extensions: change descriptions for hook-providing extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8894
diff changeset
     6
"""hooks for integrating with the CIA.vc notification service
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
     7
9260
b2f37dbc5952 hgcia: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9208
diff changeset
     8
This is meant to be run as a changegroup or incoming hook. To
b2f37dbc5952 hgcia: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9208
diff changeset
     9
configure it, set the following options in your hgrc::
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    10
9208
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    11
  [cia]
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    12
  # your registered CIA user name
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    13
  user = foo
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    14
  # the name of the project in CIA
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    15
  project = foo
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    16
  # the module (subproject) (optional)
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    17
  #module = foo
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    18
  # Append a diffstat to the log message (optional)
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    19
  #diffstat = False
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    20
  # Template to use for log messages (optional)
14314
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
    21
  #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}
9208
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    22
  # Style to use (optional)
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    23
  #style = foo
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    24
  # The URL of the CIA notification service (optional)
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 16743
diff changeset
    25
  # You can use mailto: URLs to send by email, e.g.
9208
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    26
  # mailto:cia@cia.vc
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    27
  # Make sure to set email.from if you do this.
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    28
  #url = http://cia.vc/
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    29
  # print message instead of sending it (optional)
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    30
  #test = False
14314
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
    31
  # number of slashes to strip for url paths
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
    32
  #strip = 0
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    33
9208
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    34
  [hooks]
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    35
  # one of these:
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    36
  changegroup.cia = python:hgcia.hook
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    37
  #incoming.cia = python:hgcia.hook
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    38
9208
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    39
  [web]
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    40
  # If you want hyperlinks (optional)
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
    41
  baseurl = http://server/path/to/repo
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    42
"""
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    43
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    44
from mercurial.i18n import _
11750
26e413f55b5e hgcia/color: remove star imports
Brodie Rao <brodie@bitheap.org>
parents: 10611
diff changeset
    45
from mercurial.node import bin, short
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    46
from mercurial import cmdutil, patch, templater, util, mail
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    47
import email.Parser
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    48
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 15776
diff changeset
    49
import socket, xmlrpclib
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    50
from xml.sax import saxutils
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16688
diff changeset
    51
testedwith = 'internal'
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    52
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    53
socket_timeout = 30 # seconds
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 15776
diff changeset
    54
if util.safehasattr(socket, 'setdefaulttimeout'):
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    55
    # set a timeout for the socket so you don't have to wait so looooong
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    56
    # when cia.vc is having problems. requires python >= 2.3:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    57
    socket.setdefaulttimeout(socket_timeout)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    58
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    59
HGCIA_VERSION = '0.1'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    60
HGCIA_URL = 'http://hg.kublai.com/mercurial/hgcia'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    61
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    62
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    63
class ciamsg(object):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    64
    """ A CIA message """
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    65
    def __init__(self, cia, ctx):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    66
        self.cia = cia
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    67
        self.ctx = ctx
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    68
        self.url = self.cia.url
14314
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
    69
        if self.url:
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
    70
            self.url += self.cia.root
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    71
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    72
    def fileelem(self, path, uri, action):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    73
        if uri:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    74
            uri = ' uri=%s' % saxutils.quoteattr(uri)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    75
        return '<file%s action=%s>%s</file>' % (
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    76
            uri, saxutils.quoteattr(action), saxutils.escape(path))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    77
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    78
    def fileelems(self):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    79
        n = self.ctx.node()
13878
a8d13ee0ce68 misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents: 13551
diff changeset
    80
        f = self.cia.repo.status(self.ctx.p1().node(), n)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    81
        url = self.url or ''
14850
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
    82
        if url and url[-1] == '/':
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
    83
            url = url[:-1]
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    84
        elems = []
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    85
        for path in f[0]:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    86
            uri = '%s/diff/%s/%s' % (url, short(n), path)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    87
            elems.append(self.fileelem(path, url and uri, 'modify'))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    88
        for path in f[1]:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    89
            # TODO: copy/rename ?
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    90
            uri = '%s/file/%s/%s' % (url, short(n), path)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    91
            elems.append(self.fileelem(path, url and uri, 'add'))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    92
        for path in f[2]:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    93
            elems.append(self.fileelem(path, '', 'remove'))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    94
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    95
        return '\n'.join(elems)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    96
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    97
    def sourceelem(self, project, module=None, branch=None):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    98
        msg = ['<source>', '<project>%s</project>' % saxutils.escape(project)]
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    99
        if module:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   100
            msg.append('<module>%s</module>' % saxutils.escape(module))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   101
        if branch:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   102
            msg.append('<branch>%s</branch>' % saxutils.escape(branch))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   103
        msg.append('</source>')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   104
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   105
        return '\n'.join(msg)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   106
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   107
    def diffstat(self):
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8541
diff changeset
   108
        class patchbuf(object):
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   109
            def __init__(self):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   110
                self.lines = []
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   111
                # diffstat is stupid
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   112
                self.name = 'cia'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   113
            def write(self, data):
15776
55a85a55f020 hgcia: fix diffstat support
Matt Mackall <mpm@selenic.com>
parents: 14850
diff changeset
   114
                self.lines += data.splitlines(True)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   115
            def close(self):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   116
                pass
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   117
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   118
        n = self.ctx.node()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   119
        pbuf = patchbuf()
10611
e764f24a45ee patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10529
diff changeset
   120
        cmdutil.export(self.cia.repo, [n], fp=pbuf)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   121
        return patch.diffstat(pbuf.lines) or ''
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   122
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   123
    def logmsg(self):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   124
        diffstat = self.cia.diffstat and self.diffstat() or ''
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   125
        self.cia.ui.pushbuffer()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   126
        self.cia.templater.show(self.ctx, changes=self.ctx.changeset(),
14314
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   127
                                baseurl=self.cia.ui.config('web', 'baseurl'),
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   128
                                url=self.url, diffstat=diffstat,
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   129
                                webroot=self.cia.root)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   130
        return self.cia.ui.popbuffer()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   131
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   132
    def xml(self):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   133
        n = short(self.ctx.node())
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   134
        src = self.sourceelem(self.cia.project, module=self.cia.module,
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   135
                              branch=self.ctx.branch())
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   136
        # unix timestamp
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   137
        dt = self.ctx.date()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   138
        timestamp = dt[0]
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   139
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   140
        author = saxutils.escape(self.ctx.user())
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   141
        rev = '%d:%s' % (self.ctx.rev(), n)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   142
        log = saxutils.escape(self.logmsg())
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   143
14850
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
   144
        url = self.url
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
   145
        if url and url[-1] == '/':
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
   146
            url = url[:-1]
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
   147
        url = url and '<url>%s/rev/%s</url>' % (saxutils.escape(url), n) or ''
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   148
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   149
        msg = """
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   150
<message>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   151
  <generator>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   152
    <name>Mercurial (hgcia)</name>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   153
    <version>%s</version>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   154
    <url>%s</url>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   155
    <user>%s</user>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   156
  </generator>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   157
  %s
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   158
  <body>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   159
    <commit>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   160
      <author>%s</author>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   161
      <version>%s</version>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   162
      <log>%s</log>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   163
      %s
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   164
      <files>%s</files>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   165
    </commit>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   166
  </body>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   167
  <timestamp>%d</timestamp>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   168
</message>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   169
""" % \
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   170
            (HGCIA_VERSION, saxutils.escape(HGCIA_URL),
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   171
            saxutils.escape(self.cia.user), src, author, rev, log, url,
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   172
            self.fileelems(), timestamp)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   173
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   174
        return msg
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   175
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   176
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   177
class hgcia(object):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   178
    """ CIA notification class """
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   179
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   180
    deftemplate = '{desc}'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   181
    dstemplate = '{desc}\n-- \n{diffstat}'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   182
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   183
    def __init__(self, ui, repo):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   184
        self.ui = ui
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   185
        self.repo = repo
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   186
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   187
        self.ciaurl = self.ui.config('cia', 'url', 'http://cia.vc')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   188
        self.user = self.ui.config('cia', 'user')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   189
        self.project = self.ui.config('cia', 'project')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   190
        self.module = self.ui.config('cia', 'module')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   191
        self.diffstat = self.ui.configbool('cia', 'diffstat')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   192
        self.emailfrom = self.ui.config('email', 'from')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   193
        self.dryrun = self.ui.configbool('cia', 'test')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   194
        self.url = self.ui.config('web', 'baseurl')
14850
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
   195
        # Default to -1 for backward compatibility
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
   196
        self.stripcount = int(self.ui.config('cia', 'strip', -1))
14314
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   197
        self.root = self.strip(self.repo.root)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   198
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   199
        style = self.ui.config('cia', 'style')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   200
        template = self.ui.config('cia', 'template')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   201
        if not template:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   202
            template = self.diffstat and self.dstemplate or self.deftemplate
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   203
        template = templater.parsestring(template, quoted=False)
7762
fece056bf240 add --git option to commands supporting --patch (log, incoming, history, tip)
Jim Correia <jim.correia@pobox.com>
parents: 7438
diff changeset
   204
        t = cmdutil.changeset_templater(self.ui, self.repo, False, None,
20667
e96e9f805c19 changeset_templater: remove use_template method
Matt Mackall <mpm@selenic.com>
parents: 17424
diff changeset
   205
                                        template, style, False)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   206
        self.templater = t
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   207
14314
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   208
    def strip(self, path):
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   209
        '''strip leading slashes from local path, turn into web-safe path.'''
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   210
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   211
        path = util.pconvert(path)
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   212
        count = self.stripcount
14850
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
   213
        if count < 0:
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
   214
            return ''
14314
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   215
        while count > 0:
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   216
            c = path.find('/')
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   217
            if c == -1:
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   218
                break
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   219
            path = path[c + 1:]
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   220
            count -= 1
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   221
        return path
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   222
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   223
    def sendrpc(self, msg):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   224
        srv = xmlrpclib.Server(self.ciaurl)
10529
076e8a8000a3 hgcia: report RPC errors
Brendan Cully <brendan@kublai.com>
parents: 10263
diff changeset
   225
        res = srv.hub.deliver(msg)
13551
bbfae32f178e hgcia: accept "queued." xmlrpc return as success
Georg Brandl <georg@python.org>
parents: 11750
diff changeset
   226
        if res is not True and res != 'queued.':
10529
076e8a8000a3 hgcia: report RPC errors
Brendan Cully <brendan@kublai.com>
parents: 10263
diff changeset
   227
            raise util.Abort(_('%s returned an error: %s') %
076e8a8000a3 hgcia: report RPC errors
Brendan Cully <brendan@kublai.com>
parents: 10263
diff changeset
   228
                             (self.ciaurl, res))
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   229
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   230
    def sendemail(self, address, data):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   231
        p = email.Parser.Parser()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   232
        msg = p.parsestr(data)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   233
        msg['Date'] = util.datestr(format="%a, %d %b %Y %H:%M:%S %1%2")
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   234
        msg['To'] = address
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   235
        msg['From'] = self.emailfrom
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   236
        msg['Subject'] = 'DeliverXML'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   237
        msg['Content-type'] = 'text/xml'
9136
31177742f54a for calls expecting bool args, pass bool instead of int
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9062
diff changeset
   238
        msgtext = msg.as_string()
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   239
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   240
        self.ui.status(_('hgcia: sending update to %s\n') % address)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   241
        mail.sendmail(self.ui, util.email(self.emailfrom),
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   242
                      [address], msgtext)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   243
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   244
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   245
def hook(ui, repo, hooktype, node=None, url=None, **kwargs):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   246
    """ send CIA notification """
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   247
    def sendmsg(cia, ctx):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   248
        msg = ciamsg(cia, ctx).xml()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   249
        if cia.dryrun:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   250
            ui.write(msg)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   251
        elif cia.ciaurl.startswith('mailto:'):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   252
            if not cia.emailfrom:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   253
                raise util.Abort(_('email.from must be defined when '
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   254
                                   'sending by email'))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   255
            cia.sendemail(cia.ciaurl[7:], msg)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   256
        else:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   257
            cia.sendrpc(msg)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   258
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   259
    n = bin(node)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   260
    cia = hgcia(ui, repo)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   261
    if not cia.user:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9260
diff changeset
   262
        ui.debug('cia: no user specified')
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   263
        return
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   264
    if not cia.project:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9260
diff changeset
   265
        ui.debug('cia: no project specified')
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   266
        return
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   267
    if hooktype == 'changegroup':
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   268
        start = repo.changelog.rev(n)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   269
        end = len(repo.changelog)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   270
        for rev in xrange(start, end):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   271
            n = repo.changelog.node(rev)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   272
            ctx = repo.changectx(n)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   273
            sendmsg(cia, ctx)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   274
    else:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   275
        ctx = repo.changectx(n)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   276
        sendmsg(cia, ctx)