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 patch') |
12 demandload(globals(), 'mdiff util templater patch') |
13 |
13 |
14 revrangesep = ':' |
14 revrangesep = ':' |
15 |
15 |
16 def revpair(repo, revs): |
16 def revpair(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 |
|
238 class changeset_printer(object): |
199 class changeset_printer(object): |
239 '''show changeset information when templating not requested.''' |
200 '''show changeset information when templating not requested.''' |
240 |
201 |
241 def __init__(self, ui, repo, patch, brinfo, buffered): |
202 def __init__(self, ui, repo, patch, brinfo, buffered): |
242 self.ui = ui |
203 self.ui = ui |
243 self.repo = repo |
204 self.repo = repo |
244 self.buffered = buffered |
205 self.buffered = buffered |
245 self.patch = patch |
206 self.patch = patch |
246 self.brinfo = brinfo |
207 self.brinfo = brinfo |
247 if buffered: |
208 self.header = {} |
248 self.ui = uibuffer(ui) |
209 self.hunk = {} |
|
210 self.lastheader = None |
249 |
211 |
250 def flush(self, rev): |
212 def flush(self, rev): |
251 return self.ui.flush(rev) |
213 if rev in self.header: |
252 |
214 h = self.header[rev] |
253 def show(self, rev=0, changenode=None, copies=None): |
215 if h != self.lastheader: |
|
216 self.lastheader = h |
|
217 self.ui.write(h) |
|
218 del self.header[rev] |
|
219 if rev in self.hunk: |
|
220 self.ui.write(self.hunk[rev]) |
|
221 del self.hunk[rev] |
|
222 return 1 |
|
223 return 0 |
|
224 |
|
225 def show(self, rev=0, changenode=None, copies=None, **props): |
|
226 if self.buffered: |
|
227 self.ui.pushbuffer() |
|
228 self._show(rev, changenode, copies, props) |
|
229 self.hunk[rev] = self.ui.popbuffer() |
|
230 else: |
|
231 self._show(rev, changenode, copies, props) |
|
232 |
|
233 def _show(self, rev, changenode, copies, props): |
254 '''show a single changeset or file revision''' |
234 '''show a single changeset or file revision''' |
255 if self.buffered: |
|
256 self.ui.mark(rev) |
|
257 log = self.repo.changelog |
235 log = self.repo.changelog |
258 if changenode is None: |
236 if changenode is None: |
259 changenode = log.node(rev) |
237 changenode = log.node(rev) |
260 elif not rev: |
238 elif not rev: |
261 rev = log.rev(changenode) |
239 rev = log.rev(changenode) |
350 |
328 |
351 def use_template(self, t): |
329 def use_template(self, t): |
352 '''set template string to use''' |
330 '''set template string to use''' |
353 self.t.cache['changeset'] = t |
331 self.t.cache['changeset'] = t |
354 |
332 |
355 def show(self, rev=0, changenode=None, copies=[], **props): |
333 def _show(self, rev, changenode, copies, props): |
356 '''show a single changeset or file revision''' |
334 '''show a single changeset or file revision''' |
357 if self.buffered: |
|
358 self.ui.mark(rev) |
|
359 log = self.repo.changelog |
335 log = self.repo.changelog |
360 if changenode is None: |
336 if changenode is None: |
361 changenode = log.node(rev) |
337 changenode = log.node(rev) |
362 elif not rev: |
338 elif not rev: |
363 rev = log.rev(changenode) |
339 rev = log.rev(changenode) |
529 except KeyError, inst: |
505 except KeyError, inst: |
530 raise util.Abort(_("%s: no key named '%s'") % (self.t.mapfile, |
506 raise util.Abort(_("%s: no key named '%s'") % (self.t.mapfile, |
531 inst.args[0])) |
507 inst.args[0])) |
532 except SyntaxError, inst: |
508 except SyntaxError, inst: |
533 raise util.Abort(_('%s: %s') % (self.t.mapfile, inst.args[0])) |
509 raise util.Abort(_('%s: %s') % (self.t.mapfile, inst.args[0])) |
534 |
|
535 class stringio(object): |
|
536 '''wrap cStringIO for use by changeset_templater.''' |
|
537 def __init__(self): |
|
538 self.fp = cStringIO.StringIO() |
|
539 |
|
540 def write(self, *args): |
|
541 for a in args: |
|
542 self.fp.write(a) |
|
543 |
|
544 write_header = write |
|
545 |
|
546 def __getattr__(self, key): |
|
547 return getattr(self.fp, key) |
|
548 |
510 |
549 def show_changeset(ui, repo, opts, buffered=False): |
511 def show_changeset(ui, repo, opts, buffered=False): |
550 """show one changeset using template or regular display. |
512 """show one changeset using template or regular display. |
551 |
513 |
552 Display format will be the first non-empty hit of: |
514 Display format will be the first non-empty hit of: |