mercurial/cmdutil.py
changeset 3738 cb48cd27d3f4
parent 3718 7db88b094b14
child 3814 120be84f33de
equal deleted inserted replaced
3737:9f5c46c50118 3738:cb48cd27d3f4
     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)
   511             else:
   487             else:
   512                 key = ''
   488                 key = ''
   513             if key:
   489             if key:
   514                 h = templater.stringify(self.t(key, **props))
   490                 h = templater.stringify(self.t(key, **props))
   515                 if self.buffered:
   491                 if self.buffered:
   516                     self.ui.write_header(h)
   492                     self.header[rev] = h
   517                 else:
   493                 else:
   518                     self.ui.write(h)
   494                     self.ui.write(h)
   519             if self.ui.debugflag and 'changeset_debug' in self.t:
   495             if self.ui.debugflag and 'changeset_debug' in self.t:
   520                 key = 'changeset_debug'
   496                 key = 'changeset_debug'
   521             elif self.ui.quiet and 'changeset_quiet' in self.t:
   497             elif self.ui.quiet and 'changeset_quiet' in self.t:
   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: