7 |
7 |
8 from demandload import demandload |
8 from demandload import demandload |
9 from node import * |
9 from node import * |
10 from i18n import gettext as _ |
10 from i18n import gettext as _ |
11 demandload(globals(), 'os sys') |
11 demandload(globals(), 'os sys') |
12 demandload(globals(), 'mdiff util templater cStringIO') |
12 demandload(globals(), 'mdiff util templater cStringIO patch') |
13 |
13 |
14 revrangesep = ':' |
14 revrangesep = ':' |
15 |
15 |
16 def revpair(ui, repo, revs): |
16 def revpair(ui, repo, revs): |
17 '''return pair of nodes, given list of revisions. second item can |
17 '''return pair of nodes, given list of revisions. second item can |
194 '(%d%% similar)\n') % |
194 '(%d%% similar)\n') % |
195 (oldrel, newrel, score * 100)) |
195 (oldrel, newrel, score * 100)) |
196 if not dry_run: |
196 if not dry_run: |
197 repo.copy(old, new, wlock=wlock) |
197 repo.copy(old, new, wlock=wlock) |
198 |
198 |
|
199 class uibuffer(object): |
|
200 # Implement and delegate some ui protocol. Save hunks of |
|
201 # output for later display in the desired order. |
|
202 def __init__(self, ui): |
|
203 self.ui = ui |
|
204 self.hunk = {} |
|
205 self.header = {} |
|
206 self.quiet = ui.quiet |
|
207 self.verbose = ui.verbose |
|
208 self.debugflag = ui.debugflag |
|
209 self.lastheader = None |
|
210 def note(self, *args): |
|
211 if self.verbose: |
|
212 self.write(*args) |
|
213 def status(self, *args): |
|
214 if not self.quiet: |
|
215 self.write(*args) |
|
216 def debug(self, *args): |
|
217 if self.debugflag: |
|
218 self.write(*args) |
|
219 def write(self, *args): |
|
220 self.hunk.setdefault(self.rev, []).extend(args) |
|
221 def write_header(self, *args): |
|
222 self.header.setdefault(self.rev, []).extend(args) |
|
223 def mark(self, rev): |
|
224 self.rev = rev |
|
225 def flush(self, rev): |
|
226 if rev in self.header: |
|
227 h = "".join(self.header[rev]) |
|
228 if h != self.lastheader: |
|
229 self.lastheader = h |
|
230 self.ui.write(h) |
|
231 del self.header[rev] |
|
232 if rev in self.hunk: |
|
233 self.ui.write("".join(self.hunk[rev])) |
|
234 del self.hunk[rev] |
|
235 return 1 |
|
236 return 0 |
|
237 |
199 class changeset_printer(object): |
238 class changeset_printer(object): |
200 '''show changeset information when templating not requested.''' |
239 '''show changeset information when templating not requested.''' |
201 |
240 |
202 def __init__(self, ui, repo): |
241 def __init__(self, ui, repo, patch, buffered): |
203 self.ui = ui |
242 self.ui = ui |
204 self.repo = repo |
243 self.repo = repo |
|
244 self.buffered = buffered |
|
245 self.patch = patch |
|
246 if buffered: |
|
247 self.ui = uibuffer(ui) |
|
248 |
|
249 def flush(self, rev): |
|
250 return self.ui.flush(rev) |
205 |
251 |
206 def show(self, rev=0, changenode=None, brinfo=None, copies=None): |
252 def show(self, rev=0, changenode=None, brinfo=None, copies=None): |
207 '''show a single changeset or file revision''' |
253 '''show a single changeset or file revision''' |
|
254 if self.buffered: |
|
255 self.ui.mark(rev) |
208 log = self.repo.changelog |
256 log = self.repo.changelog |
209 if changenode is None: |
257 if changenode is None: |
210 changenode = log.node(rev) |
258 changenode = log.node(rev) |
211 elif not rev: |
259 elif not rev: |
212 rev = log.rev(changenode) |
260 rev = log.rev(changenode) |
278 else: |
326 else: |
279 self.ui.write(_("summary: %s\n") % |
327 self.ui.write(_("summary: %s\n") % |
280 description.splitlines()[0]) |
328 description.splitlines()[0]) |
281 self.ui.write("\n") |
329 self.ui.write("\n") |
282 |
330 |
283 class changeset_templater(object): |
331 self.showpatch(changenode) |
|
332 |
|
333 def showpatch(self, node): |
|
334 if self.patch: |
|
335 prev = self.repo.changelog.parents(node)[0] |
|
336 patch.diff(self.repo, prev, node, fp=self.ui) |
|
337 self.ui.write("\n") |
|
338 |
|
339 class changeset_templater(changeset_printer): |
284 '''format changeset information.''' |
340 '''format changeset information.''' |
285 |
341 |
286 def __init__(self, ui, repo, mapfile, dest=None): |
342 def __init__(self, ui, repo, patch, mapfile, buffered): |
|
343 changeset_printer.__init__(self, ui, repo, patch, buffered) |
287 self.t = templater.templater(mapfile, templater.common_filters, |
344 self.t = templater.templater(mapfile, templater.common_filters, |
288 cache={'parent': '{rev}:{node|short} ', |
345 cache={'parent': '{rev}:{node|short} ', |
289 'manifest': '{rev}:{node|short}', |
346 'manifest': '{rev}:{node|short}', |
290 'filecopy': '{name} ({source})'}) |
347 'filecopy': '{name} ({source})'}) |
291 self.ui = ui |
|
292 self.dest = dest |
|
293 self.repo = repo |
|
294 |
348 |
295 def use_template(self, t): |
349 def use_template(self, t): |
296 '''set template string to use''' |
350 '''set template string to use''' |
297 self.t.cache['changeset'] = t |
351 self.t.cache['changeset'] = t |
298 |
352 |
299 def show(self, rev=0, changenode=None, brinfo=None, copies=[], **props): |
353 def show(self, rev=0, changenode=None, brinfo=None, copies=[], **props): |
300 '''show a single changeset or file revision''' |
354 '''show a single changeset or file revision''' |
|
355 if self.buffered: |
|
356 self.ui.mark(rev) |
301 log = self.repo.changelog |
357 log = self.repo.changelog |
302 if changenode is None: |
358 if changenode is None: |
303 changenode = log.node(rev) |
359 changenode = log.node(rev) |
304 elif not rev: |
360 elif not rev: |
305 rev = log.rev(changenode) |
361 rev = log.rev(changenode) |
450 elif 'header' in self.t: |
505 elif 'header' in self.t: |
451 key = 'header' |
506 key = 'header' |
452 else: |
507 else: |
453 key = '' |
508 key = '' |
454 if key: |
509 if key: |
455 dest.write_header(templater.stringify(self.t(key, **props))) |
510 h = templater.stringify(self.t(key, **props)) |
|
511 if self.buffered: |
|
512 self.ui.write_header(h) |
|
513 else: |
|
514 self.ui.write(h) |
456 if self.ui.debugflag and 'changeset_debug' in self.t: |
515 if self.ui.debugflag and 'changeset_debug' in self.t: |
457 key = 'changeset_debug' |
516 key = 'changeset_debug' |
458 elif self.ui.quiet and 'changeset_quiet' in self.t: |
517 elif self.ui.quiet and 'changeset_quiet' in self.t: |
459 key = 'changeset_quiet' |
518 key = 'changeset_quiet' |
460 elif self.ui.verbose and 'changeset_verbose' in self.t: |
519 elif self.ui.verbose and 'changeset_verbose' in self.t: |
461 key = 'changeset_verbose' |
520 key = 'changeset_verbose' |
462 else: |
521 else: |
463 key = 'changeset' |
522 key = 'changeset' |
464 dest.write(templater.stringify(self.t(key, **props))) |
523 self.ui.write(templater.stringify(self.t(key, **props))) |
|
524 self.showpatch(changenode) |
465 except KeyError, inst: |
525 except KeyError, inst: |
466 raise util.Abort(_("%s: no key named '%s'") % (self.t.mapfile, |
526 raise util.Abort(_("%s: no key named '%s'") % (self.t.mapfile, |
467 inst.args[0])) |
527 inst.args[0])) |
468 except SyntaxError, inst: |
528 except SyntaxError, inst: |
469 raise util.Abort(_('%s: %s') % (self.t.mapfile, inst.args[0])) |
529 raise util.Abort(_('%s: %s') % (self.t.mapfile, inst.args[0])) |
480 write_header = write |
540 write_header = write |
481 |
541 |
482 def __getattr__(self, key): |
542 def __getattr__(self, key): |
483 return getattr(self.fp, key) |
543 return getattr(self.fp, key) |
484 |
544 |
485 def show_changeset(ui, repo, opts): |
545 def show_changeset(ui, repo, opts, buffered=False): |
486 """show one changeset using template or regular display. |
546 """show one changeset using template or regular display. |
487 |
547 |
488 Display format will be the first non-empty hit of: |
548 Display format will be the first non-empty hit of: |
489 1. option 'template' |
549 1. option 'template' |
490 2. option 'style' |
550 2. option 'style' |
492 4. [ui] setting 'style' |
552 4. [ui] setting 'style' |
493 If all of these values are either the unset or the empty string, |
553 If all of these values are either the unset or the empty string, |
494 regular display via changeset_printer() is done. |
554 regular display via changeset_printer() is done. |
495 """ |
555 """ |
496 # options |
556 # options |
|
557 patch = opts.get('patch') |
497 tmpl = opts.get('template') |
558 tmpl = opts.get('template') |
498 mapfile = None |
559 mapfile = None |
499 if tmpl: |
560 if tmpl: |
500 tmpl = templater.parsestring(tmpl, quoted=False) |
561 tmpl = templater.parsestring(tmpl, quoted=False) |
501 else: |
562 else: |
513 if not os.path.split(mapfile)[0]: |
574 if not os.path.split(mapfile)[0]: |
514 mapname = (templater.templatepath('map-cmdline.' + mapfile) |
575 mapname = (templater.templatepath('map-cmdline.' + mapfile) |
515 or templater.templatepath(mapfile)) |
576 or templater.templatepath(mapfile)) |
516 if mapname: mapfile = mapname |
577 if mapname: mapfile = mapname |
517 try: |
578 try: |
518 t = changeset_templater(ui, repo, mapfile) |
579 t = changeset_templater(ui, repo, patch, mapfile, buffered) |
519 except SyntaxError, inst: |
580 except SyntaxError, inst: |
520 raise util.Abort(inst.args[0]) |
581 raise util.Abort(inst.args[0]) |
521 if tmpl: t.use_template(tmpl) |
582 if tmpl: t.use_template(tmpl) |
522 return t |
583 return t |
523 return changeset_printer(ui, repo) |
584 return changeset_printer(ui, repo, patch, buffered) |
524 |
585 |