hgext/hgcia.py
author Gregory Szorc <gregory.szorc@gmail.com>
Sat, 27 Feb 2016 18:22:49 -0800
branchstable
changeset 28289 d493d64757eb
parent 26587 56b2bcea2529
permissions -rw-r--r--
hg: obtain lock when creating share from pooled repo (issue5104) There are race conditions between clients performing a shared clone to pooled storage: 1) Clients race to create the new shared repo in the pool directory 2) 1 client is seeding the repo in the pool directory and another goes to share it before it is fully cloned We prevent these race conditions by obtaining a lock in the pool directory that is derived from the name of the repo we will be accessing. To test this, a simple generic "lockdelay" extension has been added. The extension inserts an optional, configurable delay before or after lock acquisition. In the test, we delay 2 seconds after lock acquisition in the first process and 1 second before lock acquisition in the 2nd process. This means the first process has 1s to obtain the lock. There is a race condition here. If we encounter it in the wild, we could change the dummy extension to wait on the lock file to appear instead of relying on timing. But that's more complicated. Let's see what happens first.
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
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25186
diff changeset
    46
from mercurial import cmdutil, patch, util, mail, error
7438
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
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
    51
# Note for extension authors: ONLY specify testedwith = 'internal' for
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
    52
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
    53
# be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
    54
# leave the attribute unspecified.
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16688
diff changeset
    55
testedwith = 'internal'
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    56
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    57
socket_timeout = 30 # seconds
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 15776
diff changeset
    58
if util.safehasattr(socket, 'setdefaulttimeout'):
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    59
    # 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
    60
    # when cia.vc is having problems. requires python >= 2.3:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    61
    socket.setdefaulttimeout(socket_timeout)
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
HGCIA_VERSION = '0.1'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    64
HGCIA_URL = 'http://hg.kublai.com/mercurial/hgcia'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    65
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    66
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    67
class ciamsg(object):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    68
    """ A CIA message """
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    69
    def __init__(self, cia, ctx):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    70
        self.cia = cia
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    71
        self.ctx = ctx
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    72
        self.url = self.cia.url
14314
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
    73
        if self.url:
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
    74
            self.url += self.cia.root
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    75
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    76
    def fileelem(self, path, uri, action):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    77
        if uri:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    78
            uri = ' uri=%s' % saxutils.quoteattr(uri)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    79
        return '<file%s action=%s>%s</file>' % (
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    80
            uri, saxutils.quoteattr(action), saxutils.escape(path))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    81
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    82
    def fileelems(self):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    83
        n = self.ctx.node()
13878
a8d13ee0ce68 misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents: 13551
diff changeset
    84
        f = self.cia.repo.status(self.ctx.p1().node(), n)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    85
        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
    86
        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
    87
            url = url[:-1]
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    88
        elems = []
22917
1c38b4063586 hgcia: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 20667
diff changeset
    89
        for path in f.modified:
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    90
            uri = '%s/diff/%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, 'modify'))
22917
1c38b4063586 hgcia: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 20667
diff changeset
    92
        for path in f.added:
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    93
            # TODO: copy/rename ?
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    94
            uri = '%s/file/%s/%s' % (url, short(n), path)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    95
            elems.append(self.fileelem(path, url and uri, 'add'))
22917
1c38b4063586 hgcia: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 20667
diff changeset
    96
        for path in f.removed:
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    97
            elems.append(self.fileelem(path, '', 'remove'))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    98
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
    99
        return '\n'.join(elems)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   100
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   101
    def sourceelem(self, project, module=None, branch=None):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   102
        msg = ['<source>', '<project>%s</project>' % saxutils.escape(project)]
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   103
        if module:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   104
            msg.append('<module>%s</module>' % saxutils.escape(module))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   105
        if branch:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   106
            msg.append('<branch>%s</branch>' % saxutils.escape(branch))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   107
        msg.append('</source>')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   108
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   109
        return '\n'.join(msg)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   110
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   111
    def diffstat(self):
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8541
diff changeset
   112
        class patchbuf(object):
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   113
            def __init__(self):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   114
                self.lines = []
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   115
                # diffstat is stupid
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   116
                self.name = 'cia'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   117
            def write(self, data):
15776
55a85a55f020 hgcia: fix diffstat support
Matt Mackall <mpm@selenic.com>
parents: 14850
diff changeset
   118
                self.lines += data.splitlines(True)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   119
            def close(self):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   120
                pass
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   121
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   122
        n = self.ctx.node()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   123
        pbuf = patchbuf()
10611
e764f24a45ee patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10529
diff changeset
   124
        cmdutil.export(self.cia.repo, [n], fp=pbuf)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   125
        return patch.diffstat(pbuf.lines) or ''
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   126
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   127
    def logmsg(self):
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22917
diff changeset
   128
        if self.cia.diffstat:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22917
diff changeset
   129
            diffstat = self.diffstat()
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22917
diff changeset
   130
        else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22917
diff changeset
   131
            diffstat = ''
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   132
        self.cia.ui.pushbuffer()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   133
        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
   134
                                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
   135
                                url=self.url, diffstat=diffstat,
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   136
                                webroot=self.cia.root)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   137
        return self.cia.ui.popbuffer()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   138
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   139
    def xml(self):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   140
        n = short(self.ctx.node())
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   141
        src = self.sourceelem(self.cia.project, module=self.cia.module,
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   142
                              branch=self.ctx.branch())
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   143
        # unix timestamp
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   144
        dt = self.ctx.date()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   145
        timestamp = dt[0]
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   146
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   147
        author = saxutils.escape(self.ctx.user())
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   148
        rev = '%d:%s' % (self.ctx.rev(), n)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   149
        log = saxutils.escape(self.logmsg())
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   150
14850
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
   151
        url = self.url
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
   152
        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
   153
            url = url[:-1]
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
   154
        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
   155
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   156
        msg = """
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   157
<message>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   158
  <generator>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   159
    <name>Mercurial (hgcia)</name>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   160
    <version>%s</version>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   161
    <url>%s</url>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   162
    <user>%s</user>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   163
  </generator>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   164
  %s
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   165
  <body>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   166
    <commit>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   167
      <author>%s</author>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   168
      <version>%s</version>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   169
      <log>%s</log>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   170
      %s
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   171
      <files>%s</files>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   172
    </commit>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   173
  </body>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   174
  <timestamp>%d</timestamp>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   175
</message>
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
            (HGCIA_VERSION, saxutils.escape(HGCIA_URL),
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   178
            saxutils.escape(self.cia.user), src, author, rev, log, url,
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   179
            self.fileelems(), timestamp)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   180
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   181
        return msg
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
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   184
class hgcia(object):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   185
    """ CIA notification class """
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
    deftemplate = '{desc}'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   188
    dstemplate = '{desc}\n-- \n{diffstat}'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   189
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   190
    def __init__(self, ui, repo):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   191
        self.ui = ui
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   192
        self.repo = repo
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   193
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   194
        self.ciaurl = self.ui.config('cia', 'url', 'http://cia.vc')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   195
        self.user = self.ui.config('cia', 'user')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   196
        self.project = self.ui.config('cia', 'project')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   197
        self.module = self.ui.config('cia', 'module')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   198
        self.diffstat = self.ui.configbool('cia', 'diffstat')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   199
        self.emailfrom = self.ui.config('email', 'from')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   200
        self.dryrun = self.ui.configbool('cia', 'test')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   201
        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
   202
        # 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
   203
        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
   204
        self.root = self.strip(self.repo.root)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   205
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   206
        style = self.ui.config('cia', 'style')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   207
        template = self.ui.config('cia', 'template')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   208
        if not template:
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22917
diff changeset
   209
            if self.diffstat:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22917
diff changeset
   210
                template = self.dstemplate
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22917
diff changeset
   211
            else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22917
diff changeset
   212
                template = self.deftemplate
7762
fece056bf240 add --git option to commands supporting --patch (log, incoming, history, tip)
Jim Correia <jim.correia@pobox.com>
parents: 7438
diff changeset
   213
        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
   214
                                        template, style, False)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   215
        self.templater = t
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   216
14314
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   217
    def strip(self, path):
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   218
        '''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
   219
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   220
        path = util.pconvert(path)
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   221
        count = self.stripcount
14850
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
   222
        if count < 0:
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
   223
            return ''
14314
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   224
        while count > 0:
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   225
            c = path.find('/')
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   226
            if c == -1:
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   227
                break
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   228
            path = path[c + 1:]
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   229
            count -= 1
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   230
        return path
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
   231
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   232
    def sendrpc(self, msg):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   233
        srv = xmlrpclib.Server(self.ciaurl)
10529
076e8a8000a3 hgcia: report RPC errors
Brendan Cully <brendan@kublai.com>
parents: 10263
diff changeset
   234
        res = srv.hub.deliver(msg)
13551
bbfae32f178e hgcia: accept "queued." xmlrpc return as success
Georg Brandl <georg@python.org>
parents: 11750
diff changeset
   235
        if res is not True and res != 'queued.':
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25186
diff changeset
   236
            raise error.Abort(_('%s returned an error: %s') %
10529
076e8a8000a3 hgcia: report RPC errors
Brendan Cully <brendan@kublai.com>
parents: 10263
diff changeset
   237
                             (self.ciaurl, res))
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   238
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   239
    def sendemail(self, address, data):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   240
        p = email.Parser.Parser()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   241
        msg = p.parsestr(data)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   242
        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
   243
        msg['To'] = address
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   244
        msg['From'] = self.emailfrom
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   245
        msg['Subject'] = 'DeliverXML'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   246
        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
   247
        msgtext = msg.as_string()
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   248
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   249
        self.ui.status(_('hgcia: sending update to %s\n') % address)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   250
        mail.sendmail(self.ui, util.email(self.emailfrom),
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   251
                      [address], msgtext)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   252
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   253
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   254
def hook(ui, repo, hooktype, node=None, url=None, **kwargs):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   255
    """ send CIA notification """
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   256
    def sendmsg(cia, ctx):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   257
        msg = ciamsg(cia, ctx).xml()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   258
        if cia.dryrun:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   259
            ui.write(msg)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   260
        elif cia.ciaurl.startswith('mailto:'):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   261
            if not cia.emailfrom:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25186
diff changeset
   262
                raise error.Abort(_('email.from must be defined when '
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   263
                                   'sending by email'))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   264
            cia.sendemail(cia.ciaurl[7:], msg)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   265
        else:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   266
            cia.sendrpc(msg)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   267
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   268
    n = bin(node)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   269
    cia = hgcia(ui, repo)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   270
    if not cia.user:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9260
diff changeset
   271
        ui.debug('cia: no user specified')
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   272
        return
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   273
    if not cia.project:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9260
diff changeset
   274
        ui.debug('cia: no project specified')
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   275
        return
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   276
    if hooktype == 'changegroup':
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   277
        start = repo.changelog.rev(n)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   278
        end = len(repo.changelog)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   279
        for rev in xrange(start, end):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   280
            n = repo.changelog.node(rev)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   281
            ctx = repo.changectx(n)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   282
            sendmsg(cia, ctx)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   283
    else:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   284
        ctx = repo.changectx(n)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
   285
        sendmsg(cia, ctx)