annotate hgext/hgcia.py @ 16365:5d61e007d957

mq: use exact matching in the second dirstate walking for efficiency of 'qnew' 'hg qnew' with pattern/-I/-X creates matching object with them, and uses it twice for 'dirstate.walk()': via 'repo.status()' and 'repo.commit()'. this may cause full manifest scan in the second 'dirstate.walk()', even though mq already knows complete target filenames at the first 'dirstate.walk()'. this patch creates exact matching object also in this case, and use it at 'repo.commit()' invocation to avoid full manifest scan in the second 'dirstate.walk()'. even though 'inclsubs' is added to 'pats' for original matching object, it is also passed to exact matching object, because subrepositories are deleted from result of 'dirstate.walk()' at the end of it.
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
date Thu, 05 Apr 2012 23:52:06 +0900
parents 55a85a55f020
children cfb6682961b8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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)
12d119ae39bc hgcia: use reST syntax for literal block
Martin Geisler <mg@lazybytes.net>
parents: 9136
diff changeset
25 # You can use mailto: URLs to send by email, eg
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
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
49 import xmlrpclib
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
50 from xml.sax import saxutils
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
51
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
52 socket_timeout = 30 # seconds
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
53 try:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
54 # 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
55 # when cia.vc is having problems. requires python >= 2.3:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
56 import socket
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 except:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
59 pass
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
60
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
61 HGCIA_VERSION = '0.1'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
62 HGCIA_URL = 'http://hg.kublai.com/mercurial/hgcia'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
63
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
64
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
65 class ciamsg(object):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
66 """ A CIA message """
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
67 def __init__(self, cia, ctx):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
68 self.cia = cia
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
69 self.ctx = ctx
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
70 self.url = self.cia.url
14314
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
71 if self.url:
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
72 self.url += self.cia.root
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
73
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
74 def fileelem(self, path, uri, action):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
75 if uri:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
76 uri = ' uri=%s' % saxutils.quoteattr(uri)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
77 return '<file%s action=%s>%s</file>' % (
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
78 uri, saxutils.quoteattr(action), saxutils.escape(path))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
79
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
80 def fileelems(self):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
81 n = self.ctx.node()
13878
a8d13ee0ce68 misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents: 13551
diff changeset
82 f = self.cia.repo.status(self.ctx.p1().node(), n)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
83 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
84 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
85 url = url[:-1]
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
86 elems = []
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
87 for path in f[0]:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
88 uri = '%s/diff/%s/%s' % (url, short(n), path)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
89 elems.append(self.fileelem(path, url and uri, 'modify'))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
90 for path in f[1]:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
91 # TODO: copy/rename ?
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
92 uri = '%s/file/%s/%s' % (url, short(n), path)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
93 elems.append(self.fileelem(path, url and uri, 'add'))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
94 for path in f[2]:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
95 elems.append(self.fileelem(path, '', 'remove'))
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 return '\n'.join(elems)
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 def sourceelem(self, project, module=None, branch=None):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
100 msg = ['<source>', '<project>%s</project>' % saxutils.escape(project)]
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
101 if module:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
102 msg.append('<module>%s</module>' % saxutils.escape(module))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
103 if branch:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
104 msg.append('<branch>%s</branch>' % saxutils.escape(branch))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
105 msg.append('</source>')
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 return '\n'.join(msg)
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 def diffstat(self):
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8541
diff changeset
110 class patchbuf(object):
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
111 def __init__(self):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
112 self.lines = []
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
113 # diffstat is stupid
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
114 self.name = 'cia'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
115 def write(self, data):
15776
55a85a55f020 hgcia: fix diffstat support
Matt Mackall <mpm@selenic.com>
parents: 14850
diff changeset
116 self.lines += data.splitlines(True)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
117 def close(self):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
118 pass
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
119
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
120 n = self.ctx.node()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
121 pbuf = patchbuf()
10611
e764f24a45ee patch/diff: move patch.export() to cmdutil.export()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10529
diff changeset
122 cmdutil.export(self.cia.repo, [n], fp=pbuf)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
123 return patch.diffstat(pbuf.lines) or ''
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
124
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
125 def logmsg(self):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
126 diffstat = self.cia.diffstat and self.diffstat() or ''
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
127 self.cia.ui.pushbuffer()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
128 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
129 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
130 url=self.url, diffstat=diffstat,
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
131 webroot=self.cia.root)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
132 return self.cia.ui.popbuffer()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
133
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
134 def xml(self):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
135 n = short(self.ctx.node())
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
136 src = self.sourceelem(self.cia.project, module=self.cia.module,
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
137 branch=self.ctx.branch())
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
138 # unix timestamp
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
139 dt = self.ctx.date()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
140 timestamp = dt[0]
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
141
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
142 author = saxutils.escape(self.ctx.user())
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
143 rev = '%d:%s' % (self.ctx.rev(), n)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
144 log = saxutils.escape(self.logmsg())
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
145
14850
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
146 url = self.url
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
147 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
148 url = url[:-1]
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
149 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
150
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
151 msg = """
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
152 <message>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
153 <generator>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
154 <name>Mercurial (hgcia)</name>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
155 <version>%s</version>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
156 <url>%s</url>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
157 <user>%s</user>
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 %s
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
160 <body>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
161 <commit>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
162 <author>%s</author>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
163 <version>%s</version>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
164 <log>%s</log>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
165 %s
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
166 <files>%s</files>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
167 </commit>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
168 </body>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
169 <timestamp>%d</timestamp>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
170 </message>
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
171 """ % \
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
172 (HGCIA_VERSION, saxutils.escape(HGCIA_URL),
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
173 saxutils.escape(self.cia.user), src, author, rev, log, url,
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
174 self.fileelems(), timestamp)
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 return msg
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
177
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
178
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
179 class hgcia(object):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
180 """ CIA notification class """
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
181
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
182 deftemplate = '{desc}'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
183 dstemplate = '{desc}\n-- \n{diffstat}'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
184
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
185 def __init__(self, ui, repo):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
186 self.ui = ui
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
187 self.repo = repo
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
188
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
189 self.ciaurl = self.ui.config('cia', 'url', 'http://cia.vc')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
190 self.user = self.ui.config('cia', 'user')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
191 self.project = self.ui.config('cia', 'project')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
192 self.module = self.ui.config('cia', 'module')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
193 self.diffstat = self.ui.configbool('cia', 'diffstat')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
194 self.emailfrom = self.ui.config('email', 'from')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
195 self.dryrun = self.ui.configbool('cia', 'test')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
196 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
197 # 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
198 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
199 self.root = self.strip(self.repo.root)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
200
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
201 style = self.ui.config('cia', 'style')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
202 template = self.ui.config('cia', 'template')
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
203 if not template:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
204 template = self.diffstat and self.dstemplate or self.deftemplate
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
205 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
206 t = cmdutil.changeset_templater(self.ui, self.repo, False, None,
fece056bf240 add --git option to commands supporting --patch (log, incoming, history, tip)
Jim Correia <jim.correia@pobox.com>
parents: 7438
diff changeset
207 style, False)
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
208 t.use_template(template)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
209 self.templater = t
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
210
14314
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
211 def strip(self, path):
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
212 '''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
213
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
214 path = util.pconvert(path)
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
215 count = self.stripcount
14850
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
216 if count < 0:
a95242af945c hgcia: Set default value of strip to -1 (issue2891)
Cédric Krier <ced@b2ck.com>
parents: 14314
diff changeset
217 return ''
14314
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
218 while count > 0:
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
219 c = path.find('/')
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
220 if c == -1:
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
221 break
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
222 path = path[c + 1:]
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
223 count -= 1
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
224 return path
c322890b03e6 hgcia: Handle URL like in notify (issue2406)
Cédric Krier <ced@b2ck.com>
parents: 13878
diff changeset
225
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
226 def sendrpc(self, msg):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
227 srv = xmlrpclib.Server(self.ciaurl)
10529
076e8a8000a3 hgcia: report RPC errors
Brendan Cully <brendan@kublai.com>
parents: 10263
diff changeset
228 res = srv.hub.deliver(msg)
13551
bbfae32f178e hgcia: accept "queued." xmlrpc return as success
Georg Brandl <georg@python.org>
parents: 11750
diff changeset
229 if res is not True and res != 'queued.':
10529
076e8a8000a3 hgcia: report RPC errors
Brendan Cully <brendan@kublai.com>
parents: 10263
diff changeset
230 raise util.Abort(_('%s returned an error: %s') %
076e8a8000a3 hgcia: report RPC errors
Brendan Cully <brendan@kublai.com>
parents: 10263
diff changeset
231 (self.ciaurl, res))
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
232
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
233 def sendemail(self, address, data):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
234 p = email.Parser.Parser()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
235 msg = p.parsestr(data)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
236 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
237 msg['To'] = address
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
238 msg['From'] = self.emailfrom
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
239 msg['Subject'] = 'DeliverXML'
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
240 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
241 msgtext = msg.as_string()
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
242
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
243 self.ui.status(_('hgcia: sending update to %s\n') % address)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
244 mail.sendmail(self.ui, util.email(self.emailfrom),
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
245 [address], msgtext)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
246
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
247
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
248 def hook(ui, repo, hooktype, node=None, url=None, **kwargs):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
249 """ send CIA notification """
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
250 def sendmsg(cia, ctx):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
251 msg = ciamsg(cia, ctx).xml()
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
252 if cia.dryrun:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
253 ui.write(msg)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
254 elif cia.ciaurl.startswith('mailto:'):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
255 if not cia.emailfrom:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
256 raise util.Abort(_('email.from must be defined when '
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
257 'sending by email'))
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
258 cia.sendemail(cia.ciaurl[7:], msg)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
259 else:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
260 cia.sendrpc(msg)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
261
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
262 n = bin(node)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
263 cia = hgcia(ui, repo)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
264 if not cia.user:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9260
diff changeset
265 ui.debug('cia: no user 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 not cia.project:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9260
diff changeset
268 ui.debug('cia: no project specified')
7438
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
269 return
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
270 if hooktype == 'changegroup':
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
271 start = repo.changelog.rev(n)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
272 end = len(repo.changelog)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
273 for rev in xrange(start, end):
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
274 n = repo.changelog.node(rev)
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)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
277 else:
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
278 ctx = repo.changectx(n)
b80b944836ec Add hgcia to hgext
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
279 sendmsg(cia, ctx)