Mercurial > hg > mercurial-crew-with-dirclash
comparison hgext/notify.py @ 3739:16f8e7d1dd54
fix notify with new ui buffering
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Fri, 01 Dec 2006 01:28:20 -0600 |
parents | 2956948b81f3 |
children | 1e0b94cfba0e 1305ba7dee88 |
comparison
equal
deleted
inserted
replaced
3738:cb48cd27d3f4 | 3739:16f8e7d1dd54 |
---|---|
66 # push changes to, they can manage their own subscriptions. | 66 # push changes to, they can manage their own subscriptions. |
67 | 67 |
68 from mercurial.demandload import * | 68 from mercurial.demandload import * |
69 from mercurial.i18n import gettext as _ | 69 from mercurial.i18n import gettext as _ |
70 from mercurial.node import * | 70 from mercurial.node import * |
71 demandload(globals(), 'mercurial:commands,patch,cmdutil,templater,util,mail') | 71 demandload(globals(), 'mercurial:patch,cmdutil,templater,util,mail') |
72 demandload(globals(), 'email.Parser fnmatch socket time') | 72 demandload(globals(), 'email.Parser fnmatch socket time') |
73 | 73 |
74 # template for single changeset can include email headers. | 74 # template for single changeset can include email headers. |
75 single_template = ''' | 75 single_template = ''' |
76 Subject: changeset in {webroot}: {desc|firstline|strip} | 76 Subject: changeset in {webroot}: {desc|firstline|strip} |
105 self.ui.readsections(cfg, 'usersubs', 'reposubs') | 105 self.ui.readsections(cfg, 'usersubs', 'reposubs') |
106 self.repo = repo | 106 self.repo = repo |
107 self.stripcount = int(self.ui.config('notify', 'strip', 0)) | 107 self.stripcount = int(self.ui.config('notify', 'strip', 0)) |
108 self.root = self.strip(self.repo.root) | 108 self.root = self.strip(self.repo.root) |
109 self.domain = self.ui.config('notify', 'domain') | 109 self.domain = self.ui.config('notify', 'domain') |
110 self.sio = cmdutil.stringio() | |
111 self.subs = self.subscribers() | 110 self.subs = self.subscribers() |
112 | 111 |
113 mapfile = self.ui.config('notify', 'style') | 112 mapfile = self.ui.config('notify', 'style') |
114 template = (self.ui.config('notify', hooktype) or | 113 template = (self.ui.config('notify', hooktype) or |
115 self.ui.config('notify', 'template')) | 114 self.ui.config('notify', 'template')) |
116 self.t = cmdutil.changeset_templater(self.ui, self.repo, mapfile, | 115 self.t = cmdutil.changeset_templater(self.ui, self.repo, |
117 self.sio) | 116 False, None, mapfile, False) |
118 if not mapfile and not template: | 117 if not mapfile and not template: |
119 template = deftemplates.get(hooktype) or single_template | 118 template = deftemplates.get(hooktype) or single_template |
120 if template: | 119 if template: |
121 template = templater.parsestring(template, quoted=False) | 120 template = templater.parsestring(template, quoted=False) |
122 self.t.use_template(template) | 121 self.t.use_template(template) |
175 def skipsource(self, source): | 174 def skipsource(self, source): |
176 '''true if incoming changes from this source should be skipped.''' | 175 '''true if incoming changes from this source should be skipped.''' |
177 ok_sources = self.ui.config('notify', 'sources', 'serve').split() | 176 ok_sources = self.ui.config('notify', 'sources', 'serve').split() |
178 return source not in ok_sources | 177 return source not in ok_sources |
179 | 178 |
180 def send(self, node, count): | 179 def send(self, node, count, data): |
181 '''send message.''' | 180 '''send message.''' |
182 | 181 |
183 p = email.Parser.Parser() | 182 p = email.Parser.Parser() |
184 self.sio.seek(0) | 183 msg = p.parsestr(data) |
185 msg = p.parse(self.sio) | |
186 | 184 |
187 def fix_subject(): | 185 def fix_subject(): |
188 '''try to make subject line exist and be useful.''' | 186 '''try to make subject line exist and be useful.''' |
189 | 187 |
190 subject = msg['Subject'] | 188 subject = msg['Subject'] |
235 | 233 |
236 def diff(self, node, ref): | 234 def diff(self, node, ref): |
237 maxdiff = int(self.ui.config('notify', 'maxdiff', 300)) | 235 maxdiff = int(self.ui.config('notify', 'maxdiff', 300)) |
238 if maxdiff == 0: | 236 if maxdiff == 0: |
239 return | 237 return |
240 fp = cmdutil.stringio() | |
241 prev = self.repo.changelog.parents(node)[0] | 238 prev = self.repo.changelog.parents(node)[0] |
242 patch.diff(self.repo, prev, ref, fp=fp) | 239 self.ui.pushbuffer() |
243 difflines = fp.getvalue().splitlines(1) | 240 patch.diff(self.repo, prev, ref) |
241 difflines = self.ui.popbuffer().splitlines(1) | |
244 if self.ui.configbool('notify', 'diffstat', True): | 242 if self.ui.configbool('notify', 'diffstat', True): |
245 s = patch.diffstat(difflines) | 243 s = patch.diffstat(difflines) |
246 self.sio.write('\ndiffstat:\n\n' + s) | 244 self.ui.write('\ndiffstat:\n\n' + s) |
247 if maxdiff > 0 and len(difflines) > maxdiff: | 245 if maxdiff > 0 and len(difflines) > maxdiff: |
248 self.sio.write(_('\ndiffs (truncated from %d to %d lines):\n\n') % | 246 self.ui.write(_('\ndiffs (truncated from %d to %d lines):\n\n') % |
249 (len(difflines), maxdiff)) | 247 (len(difflines), maxdiff)) |
250 difflines = difflines[:maxdiff] | 248 difflines = difflines[:maxdiff] |
251 elif difflines: | 249 elif difflines: |
252 self.sio.write(_('\ndiffs (%d lines):\n\n') % len(difflines)) | 250 self.ui.write(_('\ndiffs (%d lines):\n\n') % len(difflines)) |
253 self.sio.write(*difflines) | 251 self.ui.write(*difflines) |
254 | 252 |
255 def hook(ui, repo, hooktype, node=None, source=None, **kwargs): | 253 def hook(ui, repo, hooktype, node=None, source=None, **kwargs): |
256 '''send email notifications to interested subscribers. | 254 '''send email notifications to interested subscribers. |
257 | 255 |
258 if used as changegroup hook, send one email for all changesets in | 256 if used as changegroup hook, send one email for all changesets in |
264 if n.skipsource(source): | 262 if n.skipsource(source): |
265 ui.debug(_('notify: changes have source "%s" - skipping\n') % | 263 ui.debug(_('notify: changes have source "%s" - skipping\n') % |
266 source) | 264 source) |
267 return | 265 return |
268 node = bin(node) | 266 node = bin(node) |
267 ui.pushbuffer() | |
269 if hooktype == 'changegroup': | 268 if hooktype == 'changegroup': |
270 start = repo.changelog.rev(node) | 269 start = repo.changelog.rev(node) |
271 end = repo.changelog.count() | 270 end = repo.changelog.count() |
272 count = end - start | 271 count = end - start |
273 for rev in xrange(start, end): | 272 for rev in xrange(start, end): |
275 n.diff(node, repo.changelog.tip()) | 274 n.diff(node, repo.changelog.tip()) |
276 else: | 275 else: |
277 count = 1 | 276 count = 1 |
278 n.node(node) | 277 n.node(node) |
279 n.diff(node, node) | 278 n.diff(node, node) |
280 n.send(node, count) | 279 data = ui.popbuffer() |
280 n.send(node, count, data) |