mercurial/commands.py
changeset 3646 b4ad640a3bcf
parent 3634 770c4fc03b8e
child 3648 b984dcb1df71
equal deleted inserted replaced
3645:b2c47652e8e3 3646:b4ad640a3bcf
     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 re sys signal imp urllib pdb shlex")
    11 demandload(globals(), "os re sys signal imp urllib pdb shlex")
    12 demandload(globals(), "fancyopts ui hg util lock revlog templater bundlerepo")
    12 demandload(globals(), "fancyopts ui hg util lock revlog bundlerepo")
    13 demandload(globals(), "difflib patch tempfile time")
    13 demandload(globals(), "difflib patch tempfile time")
    14 demandload(globals(), "traceback errno version atexit bz2")
    14 demandload(globals(), "traceback errno version atexit bz2")
    15 demandload(globals(), "archival changegroup cmdutil hgweb.server sshserver")
    15 demandload(globals(), "archival changegroup cmdutil hgweb.server sshserver")
    16 
    16 
    17 class UnknownCommand(Exception):
    17 class UnknownCommand(Exception):
   293         if fh is not None:
   293         if fh is not None:
   294             fh.close()
   294             fh.close()
   295         if cleanup is not None:
   295         if cleanup is not None:
   296             os.unlink(cleanup)
   296             os.unlink(cleanup)
   297 
   297 
   298 class changeset_printer(object):
       
   299     '''show changeset information when templating not requested.'''
       
   300 
       
   301     def __init__(self, ui, repo):
       
   302         self.ui = ui
       
   303         self.repo = repo
       
   304 
       
   305     def show(self, rev=0, changenode=None, brinfo=None, copies=None):
       
   306         '''show a single changeset or file revision'''
       
   307         log = self.repo.changelog
       
   308         if changenode is None:
       
   309             changenode = log.node(rev)
       
   310         elif not rev:
       
   311             rev = log.rev(changenode)
       
   312 
       
   313         if self.ui.quiet:
       
   314             self.ui.write("%d:%s\n" % (rev, short(changenode)))
       
   315             return
       
   316 
       
   317         changes = log.read(changenode)
       
   318         date = util.datestr(changes[2])
       
   319         extra = changes[5]
       
   320         branch = extra.get("branch")
       
   321 
       
   322         hexfunc = self.ui.debugflag and hex or short
       
   323 
       
   324         parents = log.parentrevs(rev)
       
   325         if not self.ui.debugflag:
       
   326             if parents[1] == nullrev:
       
   327                 if parents[0] >= rev - 1:
       
   328                     parents = []
       
   329                 else:
       
   330                     parents = [parents[0]]
       
   331         parents = [(p, hexfunc(log.node(p))) for p in parents]
       
   332 
       
   333         self.ui.write(_("changeset:   %d:%s\n") % (rev, hexfunc(changenode)))
       
   334 
       
   335         if branch:
       
   336             self.ui.write(_("branch:      %s\n") % branch)
       
   337         for tag in self.repo.nodetags(changenode):
       
   338             self.ui.write(_("tag:         %s\n") % tag)
       
   339         for parent in parents:
       
   340             self.ui.write(_("parent:      %d:%s\n") % parent)
       
   341 
       
   342         if brinfo and changenode in brinfo:
       
   343             br = brinfo[changenode]
       
   344             self.ui.write(_("branch:      %s\n") % " ".join(br))
       
   345 
       
   346         if self.ui.debugflag:
       
   347             self.ui.write(_("manifest:    %d:%s\n") %
       
   348                           (self.repo.manifest.rev(changes[0]), hex(changes[0])))
       
   349         self.ui.write(_("user:        %s\n") % changes[1])
       
   350         self.ui.write(_("date:        %s\n") % date)
       
   351 
       
   352         if self.ui.debugflag:
       
   353             files = self.repo.status(log.parents(changenode)[0], changenode)[:3]
       
   354             for key, value in zip([_("files:"), _("files+:"), _("files-:")],
       
   355                                   files):
       
   356                 if value:
       
   357                     self.ui.write("%-12s %s\n" % (key, " ".join(value)))
       
   358         elif changes[3] and self.ui.verbose:
       
   359             self.ui.write(_("files:       %s\n") % " ".join(changes[3]))
       
   360         if copies and self.ui.verbose:
       
   361             copies = ['%s (%s)' % c for c in copies]
       
   362             self.ui.write(_("copies:      %s\n") % ' '.join(copies))
       
   363 
       
   364         if extra and self.ui.debugflag:
       
   365             extraitems = extra.items()
       
   366             extraitems.sort()
       
   367             for key, value in extraitems:
       
   368                 self.ui.write(_("extra:       %s=%s\n")
       
   369                               % (key, value.encode('string_escape')))
       
   370 
       
   371         description = changes[4].strip()
       
   372         if description:
       
   373             if self.ui.verbose:
       
   374                 self.ui.write(_("description:\n"))
       
   375                 self.ui.write(description)
       
   376                 self.ui.write("\n\n")
       
   377             else:
       
   378                 self.ui.write(_("summary:     %s\n") %
       
   379                               description.splitlines()[0])
       
   380         self.ui.write("\n")
       
   381 
       
   382 def show_changeset(ui, repo, opts):
       
   383     """show one changeset using template or regular display.
       
   384 
       
   385     Display format will be the first non-empty hit of:
       
   386     1. option 'template'
       
   387     2. option 'style'
       
   388     3. [ui] setting 'logtemplate'
       
   389     4. [ui] setting 'style'
       
   390     If all of these values are either the unset or the empty string,
       
   391     regular display via changeset_printer() is done.
       
   392     """
       
   393     # options
       
   394     tmpl = opts.get('template')
       
   395     mapfile = None
       
   396     if tmpl:
       
   397         tmpl = templater.parsestring(tmpl, quoted=False)
       
   398     else:
       
   399         mapfile = opts.get('style')
       
   400         # ui settings
       
   401         if not mapfile:
       
   402             tmpl = ui.config('ui', 'logtemplate')
       
   403             if tmpl:
       
   404                 tmpl = templater.parsestring(tmpl)
       
   405             else:
       
   406                 mapfile = ui.config('ui', 'style')
       
   407 
       
   408     if tmpl or mapfile:
       
   409         if mapfile:
       
   410             if not os.path.split(mapfile)[0]:
       
   411                 mapname = (templater.templatepath('map-cmdline.' + mapfile)
       
   412                            or templater.templatepath(mapfile))
       
   413                 if mapname: mapfile = mapname
       
   414         try:
       
   415             t = templater.changeset_templater(ui, repo, mapfile)
       
   416         except SyntaxError, inst:
       
   417             raise util.Abort(inst.args[0])
       
   418         if tmpl: t.use_template(tmpl)
       
   419         return t
       
   420     return changeset_printer(ui, repo)
       
   421 
       
   422 def setremoteconfig(ui, opts):
   298 def setremoteconfig(ui, opts):
   423     "copy remote options to ui tree"
   299     "copy remote options to ui tree"
   424     if opts.get('ssh'):
   300     if opts.get('ssh'):
   425         ui.setconfig("ui", "ssh", opts['ssh'])
   301         ui.setconfig("ui", "ssh", opts['ssh'])
   426     if opts.get('remotecmd'):
   302     if opts.get('remotecmd'):
  1561     br = None
  1437     br = None
  1562     if opts['branches']:
  1438     if opts['branches']:
  1563         ui.warn(_("the --branches option is deprecated, "
  1439         ui.warn(_("the --branches option is deprecated, "
  1564                   "please use 'hg branches' instead\n"))
  1440                   "please use 'hg branches' instead\n"))
  1565         br = repo.branchlookup(heads)
  1441         br = repo.branchlookup(heads)
  1566     displayer = show_changeset(ui, repo, opts)
  1442     displayer = cmdutil.show_changeset(ui, repo, opts)
  1567     for n in heads:
  1443     for n in heads:
  1568         displayer.show(changenode=n, brinfo=br)
  1444         displayer.show(changenode=n, brinfo=br)
  1569 
  1445 
  1570 def identify(ui, repo):
  1446 def identify(ui, repo):
  1571     """print information about the working copy
  1447     """print information about the working copy
  1708         if opts['rev']:
  1584         if opts['rev']:
  1709             revs = [other.lookup(rev) for rev in opts['rev']]
  1585             revs = [other.lookup(rev) for rev in opts['rev']]
  1710         o = other.changelog.nodesbetween(incoming, revs)[0]
  1586         o = other.changelog.nodesbetween(incoming, revs)[0]
  1711         if opts['newest_first']:
  1587         if opts['newest_first']:
  1712             o.reverse()
  1588             o.reverse()
  1713         displayer = show_changeset(ui, other, opts)
  1589         displayer = cmdutil.show_changeset(ui, other, opts)
  1714         for n in o:
  1590         for n in o:
  1715             parents = [p for p in other.changelog.parents(n) if p != nullid]
  1591             parents = [p for p in other.changelog.parents(n) if p != nullid]
  1716             if opts['no_merges'] and len(parents) == 2:
  1592             if opts['no_merges'] and len(parents) == 2:
  1717                 continue
  1593                 continue
  1718             displayer.show(changenode=n)
  1594             displayer.show(changenode=n)
  1877             dcache[:] = [man, repo.manifest.readdelta(man)]
  1753             dcache[:] = [man, repo.manifest.readdelta(man)]
  1878         if fn in dcache[1]:
  1754         if fn in dcache[1]:
  1879             return ncache[fn].get(dcache[1][fn])
  1755             return ncache[fn].get(dcache[1][fn])
  1880         return None
  1756         return None
  1881 
  1757 
  1882     displayer = show_changeset(ui, repo, opts)
  1758     displayer = cmdutil.show_changeset(ui, repo, opts)
  1883     for st, rev, fns in changeiter:
  1759     for st, rev, fns in changeiter:
  1884         if st == 'window':
  1760         if st == 'window':
  1885             du = dui(ui)
  1761             du = dui(ui)
  1886             displayer.ui = du
  1762             displayer.ui = du
  1887         elif st == 'add':
  1763         elif st == 'add':
  2013         ui.status(_("no changes found\n"))
  1889         ui.status(_("no changes found\n"))
  2014         return
  1890         return
  2015     o = repo.changelog.nodesbetween(o, revs)[0]
  1891     o = repo.changelog.nodesbetween(o, revs)[0]
  2016     if opts['newest_first']:
  1892     if opts['newest_first']:
  2017         o.reverse()
  1893         o.reverse()
  2018     displayer = show_changeset(ui, repo, opts)
  1894     displayer = cmdutil.show_changeset(ui, repo, opts)
  2019     for n in o:
  1895     for n in o:
  2020         parents = [p for p in repo.changelog.parents(n) if p != nullid]
  1896         parents = [p for p in repo.changelog.parents(n) if p != nullid]
  2021         if opts['no_merges'] and len(parents) == 2:
  1897         if opts['no_merges'] and len(parents) == 2:
  2022             continue
  1898             continue
  2023         displayer.show(changenode=n)
  1899         displayer.show(changenode=n)
  2054     br = None
  1930     br = None
  2055     if branches is not None:
  1931     if branches is not None:
  2056         ui.warn(_("the --branches option is deprecated, "
  1932         ui.warn(_("the --branches option is deprecated, "
  2057                   "please use 'hg branches' instead\n"))
  1933                   "please use 'hg branches' instead\n"))
  2058         br = repo.branchlookup(p)
  1934         br = repo.branchlookup(p)
  2059     displayer = show_changeset(ui, repo, opts)
  1935     displayer = cmdutil.show_changeset(ui, repo, opts)
  2060     for n in p:
  1936     for n in p:
  2061         if n != nullid:
  1937         if n != nullid:
  2062             displayer.show(changenode=n, brinfo=br)
  1938             displayer.show(changenode=n, brinfo=br)
  2063 
  1939 
  2064 def paths(ui, repo, search=None):
  1940 def paths(ui, repo, search=None):
  2681     br = None
  2557     br = None
  2682     if opts['branches']:
  2558     if opts['branches']:
  2683         ui.warn(_("the --branches option is deprecated, "
  2559         ui.warn(_("the --branches option is deprecated, "
  2684                   "please use 'hg branches' instead\n"))
  2560                   "please use 'hg branches' instead\n"))
  2685         br = repo.branchlookup([n])
  2561         br = repo.branchlookup([n])
  2686     show_changeset(ui, repo, opts).show(changenode=n, brinfo=br)
  2562     cmdutil.show_changeset(ui, repo, opts).show(changenode=n, brinfo=br)
  2687     if opts['patch']:
  2563     if opts['patch']:
  2688         patch.diff(repo, repo.changelog.parents(n)[0], n)
  2564         patch.diff(repo, repo.changelog.parents(n)[0], n)
  2689 
  2565 
  2690 def unbundle(ui, repo, fname, **opts):
  2566 def unbundle(ui, repo, fname, **opts):
  2691     """apply a changegroup file
  2567     """apply a changegroup file
  2750             if branch in br[x]:
  2626             if branch in br[x]:
  2751                 found.append(x)
  2627                 found.append(x)
  2752         if len(found) > 1:
  2628         if len(found) > 1:
  2753             repo.ui.warn(_("Found multiple heads for %s\n") % branch)
  2629             repo.ui.warn(_("Found multiple heads for %s\n") % branch)
  2754             for x in found:
  2630             for x in found:
  2755                 show_changeset(ui, repo, {}).show(changenode=x, brinfo=br)
  2631                 cmdutil.show_changeset(ui, repo, {}).show(
       
  2632                     changenode=x, brinfo=br)
  2756             raise util.Abort("")
  2633             raise util.Abort("")
  2757         if len(found) == 1:
  2634         if len(found) == 1:
  2758             node = found[0]
  2635             node = found[0]
  2759             repo.ui.warn(_("Using head %s for branch %s\n")
  2636             repo.ui.warn(_("Using head %s for branch %s\n")
  2760                          % (short(node), branch))
  2637                          % (short(node), branch))