mercurial/commands.py
changeset 1402 9d2c2e6b32b5
parent 1400 cf9a1233738a
child 1404 67e20e27d8df
equal deleted inserted replaced
1401:fbf2b10011aa 1402:9d2c2e6b32b5
   177                 num = repo.changelog.rev(repo.lookup(val))
   177                 num = repo.changelog.rev(repo.lookup(val))
   178             except KeyError:
   178             except KeyError:
   179                 try:
   179                 try:
   180                     num = revlog.rev(revlog.lookup(val))
   180                     num = revlog.rev(revlog.lookup(val))
   181                 except KeyError:
   181                 except KeyError:
   182                     raise util.Abort('invalid revision identifier %s', val)
   182                     raise util.Abort(_('invalid revision identifier %s'), val)
   183         return num
   183         return num
   184     seen = {}
   184     seen = {}
   185     for spec in revs:
   185     for spec in revs:
   186         if spec.find(revrangesep) >= 0:
   186         if spec.find(revrangesep) >= 0:
   187             start, end = spec.split(revrangesep, 1)
   187             start, end = spec.split(revrangesep, 1)
   237                 c = expander[c]()
   237                 c = expander[c]()
   238             newname.append(c)
   238             newname.append(c)
   239             i += 1
   239             i += 1
   240         return ''.join(newname)
   240         return ''.join(newname)
   241     except KeyError, inst:
   241     except KeyError, inst:
   242         raise util.Abort("invalid format spec '%%%s' in output file name",
   242         raise util.Abort(_("invalid format spec '%%%s' in output file name"),
   243                     inst.args[0])
   243                     inst.args[0])
   244 
   244 
   245 def make_file(repo, r, pat, node=None,
   245 def make_file(repo, r, pat, node=None,
   246               total=None, seqno=None, revwidth=None, mode='wb', pathname=None):
   246               total=None, seqno=None, revwidth=None, mode='wb', pathname=None):
   247     if not pat or pat == '-':
   247     if not pat or pat == '-':
   331                if ui.debugflag or p != nullid]
   331                if ui.debugflag or p != nullid]
   332     if not ui.debugflag and len(parents) == 1 and parents[0][0] == rev-1:
   332     if not ui.debugflag and len(parents) == 1 and parents[0][0] == rev-1:
   333         parents = []
   333         parents = []
   334 
   334 
   335     if ui.verbose:
   335     if ui.verbose:
   336         ui.write("changeset:   %d:%s\n" % (rev, hex(changenode)))
   336         ui.write(_("changeset:   %d:%s\n") % (rev, hex(changenode)))
   337     else:
   337     else:
   338         ui.write("changeset:   %d:%s\n" % (rev, short(changenode)))
   338         ui.write(_("changeset:   %d:%s\n") % (rev, short(changenode)))
   339 
   339 
   340     for tag in repo.nodetags(changenode):
   340     for tag in repo.nodetags(changenode):
   341         ui.status("tag:         %s\n" % tag)
   341         ui.status(_("tag:         %s\n") % tag)
   342     for parent in parents:
   342     for parent in parents:
   343         ui.write("parent:      %d:%s\n" % parent)
   343         ui.write(_("parent:      %d:%s\n") % parent)
   344 
   344 
   345     if brinfo and changenode in brinfo:
   345     if brinfo and changenode in brinfo:
   346         br = brinfo[changenode]
   346         br = brinfo[changenode]
   347         ui.write("branch:      %s\n" % " ".join(br))
   347         ui.write(_("branch:      %s\n") % " ".join(br))
   348 
   348 
   349     ui.debug("manifest:    %d:%s\n" % (repo.manifest.rev(changes[0]),
   349     ui.debug(_("manifest:    %d:%s\n") % (repo.manifest.rev(changes[0]),
   350                                       hex(changes[0])))
   350                                       hex(changes[0])))
   351     ui.status("user:        %s\n" % changes[1])
   351     ui.status(_("user:        %s\n") % changes[1])
   352     ui.status("date:        %s\n" % date)
   352     ui.status(_("date:        %s\n") % date)
   353 
   353 
   354     if ui.debugflag:
   354     if ui.debugflag:
   355         files = repo.changes(log.parents(changenode)[0], changenode)
   355         files = repo.changes(log.parents(changenode)[0], changenode)
   356         for key, value in zip(["files:", "files+:", "files-:"], files):
   356         for key, value in zip([_("files:"), _("files+:"), _("files-:")], files):
   357             if value:
   357             if value:
   358                 ui.note("%-12s %s\n" % (key, " ".join(value)))
   358                 ui.note("%-12s %s\n" % (key, " ".join(value)))
   359     else:
   359     else:
   360         ui.note("files:       %s\n" % " ".join(changes[3]))
   360         ui.note(_("files:       %s\n") % " ".join(changes[3]))
   361 
   361 
   362     description = changes[4].strip()
   362     description = changes[4].strip()
   363     if description:
   363     if description:
   364         if ui.verbose:
   364         if ui.verbose:
   365             ui.status("description:\n")
   365             ui.status(_("description:\n"))
   366             ui.status(description)
   366             ui.status(description)
   367             ui.status("\n\n")
   367             ui.status("\n\n")
   368         else:
   368         else:
   369             ui.status("summary:     %s\n" % description.splitlines()[0])
   369             ui.status(_("summary:     %s\n") % description.splitlines()[0])
   370     ui.status("\n")
   370     ui.status("\n")
   371 
   371 
   372 def show_version(ui):
   372 def show_version(ui):
   373     """output version and copyright information"""
   373     """output version and copyright information"""
   374     ui.write("Mercurial Distributed SCM (version %s)\n"
   374     ui.write(_("Mercurial Distributed SCM (version %s)\n")
   375              % version.get_version())
   375              % version.get_version())
   376     ui.status(
   376     ui.status(_(
   377         "\nCopyright (C) 2005 Matt Mackall <mpm@selenic.com>\n"
   377         "\nCopyright (C) 2005 Matt Mackall <mpm@selenic.com>\n"
   378         "This is free software; see the source for copying conditions. "
   378         "This is free software; see the source for copying conditions. "
   379         "There is NO\nwarranty; "
   379         "There is NO\nwarranty; "
   380         "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
   380         "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
   381     )
   381     ))
   382 
   382 
   383 def help_(ui, cmd=None, with_version=False):
   383 def help_(ui, cmd=None, with_version=False):
   384     """show help for a given command or all commands"""
   384     """show help for a given command or all commands"""
   385     option_lists = []
   385     option_lists = []
   386     if cmd and cmd != 'shortlist':
   386     if cmd and cmd != 'shortlist':
   399 
   399 
   400         if not ui.quiet:
   400         if not ui.quiet:
   401             # aliases
   401             # aliases
   402             aliases = ', '.join(key.split('|')[1:])
   402             aliases = ', '.join(key.split('|')[1:])
   403             if aliases:
   403             if aliases:
   404                 ui.write("\naliases: %s\n" % aliases)
   404                 ui.write(_("\naliases: %s\n") % aliases)
   405 
   405 
   406             # options
   406             # options
   407             if i[1]:
   407             if i[1]:
   408                 option_lists.append(("options", i[1]))
   408                 option_lists.append(("options", i[1]))
   409 
   409 
   410     else:
   410     else:
   411         # program name
   411         # program name
   412         if ui.verbose or with_version:
   412         if ui.verbose or with_version:
   413             show_version(ui)
   413             show_version(ui)
   414         else:
   414         else:
   415             ui.status("Mercurial Distributed SCM\n")
   415             ui.status(_("Mercurial Distributed SCM\n"))
   416         ui.status('\n')
   416         ui.status('\n')
   417 
   417 
   418         # list of commands
   418         # list of commands
   419         if cmd == "shortlist":
   419         if cmd == "shortlist":
   420             ui.status('basic commands (use "hg help" '
   420             ui.status(_('basic commands (use "hg help" '
   421                       'for the full list or option "-v" for details):\n\n')
   421                         'for the full list or option "-v" for details):\n\n'))
   422         elif ui.verbose:
   422         elif ui.verbose:
   423             ui.status('list of commands:\n\n')
   423             ui.status(_('list of commands:\n\n'))
   424         else:
   424         else:
   425             ui.status('list of commands (use "hg help -v" '
   425             ui.status(_('list of commands (use "hg help -v" '
   426                       'to show aliases and global options):\n\n')
   426                         'to show aliases and global options):\n\n'))
   427 
   427 
   428         h = {}
   428         h = {}
   429         cmds = {}
   429         cmds = {}
   430         for c, e in table.items():
   430         for c, e in table.items():
   431             f = c.split("|")[0]
   431             f = c.split("|")[0]
   460         opt_output.append(("\n%s:\n" % title, None))
   460         opt_output.append(("\n%s:\n" % title, None))
   461         for shortopt, longopt, default, desc in options:
   461         for shortopt, longopt, default, desc in options:
   462             opt_output.append(("%2s%s" % (shortopt and "-%s" % shortopt,
   462             opt_output.append(("%2s%s" % (shortopt and "-%s" % shortopt,
   463                                           longopt and " --%s" % longopt),
   463                                           longopt and " --%s" % longopt),
   464                                "%s%s" % (desc,
   464                                "%s%s" % (desc,
   465                                          default and " (default: %s)" % default
   465                                          default and _(" (default: %s)") % default
   466                                          or "")))
   466                                          or "")))
   467 
   467 
   468     if opt_output:
   468     if opt_output:
   469         opts_len = max([len(line[0]) for line in opt_output if line[1]])
   469         opts_len = max([len(line[0]) for line in opt_output if line[1]])
   470         for first, second in opt_output:
   470         for first, second in opt_output:
   478 def add(ui, repo, *pats, **opts):
   478 def add(ui, repo, *pats, **opts):
   479     '''add the specified files on the next commit'''
   479     '''add the specified files on the next commit'''
   480     names = []
   480     names = []
   481     for src, abs, rel, exact in walk(repo, pats, opts):
   481     for src, abs, rel, exact in walk(repo, pats, opts):
   482         if exact:
   482         if exact:
   483             if ui.verbose: ui.status('adding %s\n' % rel)
   483             if ui.verbose: ui.status(_('adding %s\n') % rel)
   484             names.append(abs)
   484             names.append(abs)
   485         elif repo.dirstate.state(abs) == '?':
   485         elif repo.dirstate.state(abs) == '?':
   486             ui.status('adding %s\n' % rel)
   486             ui.status(_('adding %s\n') % rel)
   487             names.append(abs)
   487             names.append(abs)
   488     repo.add(names)
   488     repo.add(names)
   489 
   489 
   490 def addremove(ui, repo, *pats, **opts):
   490 def addremove(ui, repo, *pats, **opts):
   491     """add all new files, delete all missing files"""
   491     """add all new files, delete all missing files"""
   492     add, remove = [], []
   492     add, remove = [], []
   493     for src, abs, rel, exact in walk(repo, pats, opts):
   493     for src, abs, rel, exact in walk(repo, pats, opts):
   494         if src == 'f' and repo.dirstate.state(abs) == '?':
   494         if src == 'f' and repo.dirstate.state(abs) == '?':
   495             add.append(abs)
   495             add.append(abs)
   496             if ui.verbose or not exact:
   496             if ui.verbose or not exact:
   497                 ui.status('adding ', rel, '\n')
   497                 ui.status(_('adding %s\n') % rel)
   498         if repo.dirstate.state(abs) != 'r' and not os.path.exists(rel):
   498         if repo.dirstate.state(abs) != 'r' and not os.path.exists(rel):
   499             remove.append(abs)
   499             remove.append(abs)
   500             if ui.verbose or not exact:
   500             if ui.verbose or not exact:
   501                 ui.status('removing ', rel, '\n')
   501                 ui.status(_('removing %s\n') % rel)
   502     repo.add(add)
   502     repo.add(add)
   503     repo.remove(remove)
   503     repo.remove(remove)
   504 
   504 
   505 def annotate(ui, repo, *pats, **opts):
   505 def annotate(ui, repo, *pats, **opts):
   506     """show changeset information per file line"""
   506     """show changeset information per file line"""
   511     def getname(rev):
   511     def getname(rev):
   512         cl = repo.changelog.read(repo.changelog.node(rev))
   512         cl = repo.changelog.read(repo.changelog.node(rev))
   513         return trimuser(ui, cl[1], rev, ucache)
   513         return trimuser(ui, cl[1], rev, ucache)
   514 
   514 
   515     if not pats:
   515     if not pats:
   516         raise util.Abort('at least one file name or pattern required')
   516         raise util.Abort(_('at least one file name or pattern required'))
   517 
   517 
   518     opmap = [['user', getname], ['number', str], ['changeset', getnode]]
   518     opmap = [['user', getname], ['number', str], ['changeset', getnode]]
   519     if not opts['user'] and not opts['changeset']:
   519     if not opts['user'] and not opts['changeset']:
   520         opts['number'] = 1
   520         opts['number'] = 1
   521 
   521 
   526     change = repo.changelog.read(node)
   526     change = repo.changelog.read(node)
   527     mmap = repo.manifest.read(change[0])
   527     mmap = repo.manifest.read(change[0])
   528 
   528 
   529     for src, abs, rel, exact in walk(repo, pats, opts):
   529     for src, abs, rel, exact in walk(repo, pats, opts):
   530         if abs not in mmap:
   530         if abs not in mmap:
   531             ui.warn("warning: %s is not in the repository!\n" % rel)
   531             ui.warn(_("warning: %s is not in the repository!\n") % rel)
   532             continue
   532             continue
   533 
   533 
   534         f = repo.file(abs)
   534         f = repo.file(abs)
   535         if not opts['text'] and util.binary(f.read(mmap[abs])):
   535         if not opts['text'] and util.binary(f.read(mmap[abs])):
   536             ui.write("%s: binary file\n" % rel)
   536             ui.write(_("%s: binary file\n") % rel)
   537             continue
   537             continue
   538 
   538 
   539         lines = f.annotate(mmap[abs])
   539         lines = f.annotate(mmap[abs])
   540         pieces = []
   540         pieces = []
   541 
   541 
   584                 n = mf[abs]
   584                 n = mf[abs]
   585             except (hg.RepoError, KeyError):
   585             except (hg.RepoError, KeyError):
   586                 try:
   586                 try:
   587                     n = r.lookup(rev)
   587                     n = r.lookup(rev)
   588                 except KeyError, inst:
   588                 except KeyError, inst:
   589                     raise util.Abort('cannot find file %s in rev %s', rel, rev)
   589                     raise util.Abort(_('cannot find file %s in rev %s'), rel, rev)
   590         else:
   590         else:
   591             n = r.tip()
   591             n = r.tip()
   592         fp = make_file(repo, r, opts['output'], node=n, pathname=abs)
   592         fp = make_file(repo, r, opts['output'], node=n, pathname=abs)
   593         fp.write(r.read(n))
   593         fp.write(r.read(n))
   594 
   594 
   596     """make a copy of an existing repository"""
   596     """make a copy of an existing repository"""
   597     if dest is None:
   597     if dest is None:
   598         dest = os.path.basename(os.path.normpath(source))
   598         dest = os.path.basename(os.path.normpath(source))
   599 
   599 
   600     if os.path.exists(dest):
   600     if os.path.exists(dest):
   601         raise util.Abort("destination '%s' already exists", dest)
   601         raise util.Abort(_("destination '%s' already exists"), dest)
   602 
   602 
   603     dest = os.path.realpath(dest)
   603     dest = os.path.realpath(dest)
   604 
   604 
   605     class Dircleanup:
   605     class Dircleanup:
   606         def __init__(self, dir_):
   606         def __init__(self, dir_):
   668     d.close()
   668     d.close()
   669 
   669 
   670 def commit(ui, repo, *pats, **opts):
   670 def commit(ui, repo, *pats, **opts):
   671     """commit the specified files or all outstanding changes"""
   671     """commit the specified files or all outstanding changes"""
   672     if opts['text']:
   672     if opts['text']:
   673         ui.warn("Warning: -t and --text is deprecated,"
   673         ui.warn(_("Warning: -t and --text is deprecated,"
   674                 " please use -m or --message instead.\n")
   674                   " please use -m or --message instead.\n"))
   675     message = opts['message'] or opts['text']
   675     message = opts['message'] or opts['text']
   676     logfile = opts['logfile']
   676     logfile = opts['logfile']
   677 
   677 
   678     if message and logfile:
   678     if message and logfile:
   679         raise util.Abort('options --message and --logfile are mutually '
   679         raise util.Abort(_('options --message and --logfile are mutually '
   680                          'exclusive')
   680                            'exclusive'))
   681     if not message and logfile:
   681     if not message and logfile:
   682         try:
   682         try:
   683             if logfile == '-':
   683             if logfile == '-':
   684                 message = sys.stdin.read()
   684                 message = sys.stdin.read()
   685             else:
   685             else:
   686                 message = open(logfile).read()
   686                 message = open(logfile).read()
   687         except IOError, inst:
   687         except IOError, inst:
   688             raise util.Abort("can't read commit message '%s': %s" %
   688             raise util.Abort(_("can't read commit message '%s': %s") %
   689                              (logfile, inst.strerror))
   689                              (logfile, inst.strerror))
   690 
   690 
   691     if opts['addremove']:
   691     if opts['addremove']:
   692         addremove(ui, repo, *pats, **opts)
   692         addremove(ui, repo, *pats, **opts)
   693     cwd = repo.getcwd()
   693     cwd = repo.getcwd()
   706     except ValueError, inst:
   706     except ValueError, inst:
   707         raise util.Abort(str(inst))
   707         raise util.Abort(str(inst))
   708 
   708 
   709 def docopy(ui, repo, pats, opts):
   709 def docopy(ui, repo, pats, opts):
   710     if not pats:
   710     if not pats:
   711         raise util.Abort('no source or destination specified')
   711         raise util.Abort(_('no source or destination specified'))
   712     elif len(pats) == 1:
   712     elif len(pats) == 1:
   713         raise util.Abort('no destination specified')
   713         raise util.Abort(_('no destination specified'))
   714     pats = list(pats)
   714     pats = list(pats)
   715     dest = pats.pop()
   715     dest = pats.pop()
   716     sources = []
   716     sources = []
   717 
   717 
   718     def okaytocopy(abs, rel, exact):
   718     def okaytocopy(abs, rel, exact):
   719         reasons = {'?': 'is not managed',
   719         reasons = {'?': _('is not managed'),
   720                    'a': 'has been marked for add'}
   720                    'a': _('has been marked for add')}
   721         reason = reasons.get(repo.dirstate.state(abs))
   721         reason = reasons.get(repo.dirstate.state(abs))
   722         if reason:
   722         if reason:
   723             if exact: ui.warn('%s: not copying - file %s\n' % (rel, reason))
   723             if exact: ui.warn(_('%s: not copying - file %s\n') % (rel, reason))
   724         else:
   724         else:
   725             return True
   725             return True
   726 
   726 
   727     for src, abs, rel, exact in walk(repo, pats, opts):
   727     for src, abs, rel, exact in walk(repo, pats, opts):
   728         if okaytocopy(abs, rel, exact):
   728         if okaytocopy(abs, rel, exact):
   729             sources.append((abs, rel, exact))
   729             sources.append((abs, rel, exact))
   730     if not sources:
   730     if not sources:
   731         raise util.Abort('no files to copy')
   731         raise util.Abort(_('no files to copy'))
   732 
   732 
   733     cwd = repo.getcwd()
   733     cwd = repo.getcwd()
   734     absdest = util.canonpath(repo.root, cwd, dest)
   734     absdest = util.canonpath(repo.root, cwd, dest)
   735     reldest = util.pathto(cwd, absdest)
   735     reldest = util.pathto(cwd, absdest)
   736     if os.path.exists(reldest):
   736     if os.path.exists(reldest):
   738     else:
   738     else:
   739         destisfile = len(sources) == 1 or repo.dirstate.state(absdest) != '?'
   739         destisfile = len(sources) == 1 or repo.dirstate.state(absdest) != '?'
   740 
   740 
   741     if destisfile:
   741     if destisfile:
   742         if opts['parents']:
   742         if opts['parents']:
   743             raise util.Abort('with --parents, destination must be a directory')
   743             raise util.Abort(_('with --parents, destination must be a directory'))
   744         elif len(sources) > 1:
   744         elif len(sources) > 1:
   745             raise util.Abort('with multiple sources, destination must be a '
   745             raise util.Abort(_('with multiple sources, destination must be a '
   746                              'directory')
   746                                'directory'))
   747     errs, copied = 0, []
   747     errs, copied = 0, []
   748     for abs, rel, exact in sources:
   748     for abs, rel, exact in sources:
   749         if opts['parents']:
   749         if opts['parents']:
   750             mydest = os.path.join(dest, rel)
   750             mydest = os.path.join(dest, rel)
   751         elif destisfile:
   751         elif destisfile:
   753         else:
   753         else:
   754             mydest = os.path.join(dest, os.path.basename(rel))
   754             mydest = os.path.join(dest, os.path.basename(rel))
   755         myabsdest = util.canonpath(repo.root, cwd, mydest)
   755         myabsdest = util.canonpath(repo.root, cwd, mydest)
   756         myreldest = util.pathto(cwd, myabsdest)
   756         myreldest = util.pathto(cwd, myabsdest)
   757         if not opts['force'] and repo.dirstate.state(myabsdest) not in 'a?':
   757         if not opts['force'] and repo.dirstate.state(myabsdest) not in 'a?':
   758             ui.warn('%s: not overwriting - file already managed\n' % myreldest)
   758             ui.warn(_('%s: not overwriting - file already managed\n') % myreldest)
   759             continue
   759             continue
   760         mydestdir = os.path.dirname(myreldest) or '.'
   760         mydestdir = os.path.dirname(myreldest) or '.'
   761         if not opts['after']:
   761         if not opts['after']:
   762             try:
   762             try:
   763                 if opts['parents']: os.makedirs(mydestdir)
   763                 if opts['parents']: os.makedirs(mydestdir)
   764                 elif not destisfile: os.mkdir(mydestdir)
   764                 elif not destisfile: os.mkdir(mydestdir)
   765             except OSError, inst:
   765             except OSError, inst:
   766                 if inst.errno != errno.EEXIST: raise
   766                 if inst.errno != errno.EEXIST: raise
   767         if ui.verbose or not exact:
   767         if ui.verbose or not exact:
   768             ui.status('copying %s to %s\n' % (rel, myreldest))
   768             ui.status(_('copying %s to %s\n') % (rel, myreldest))
   769         if not opts['after']:
   769         if not opts['after']:
   770             try:
   770             try:
   771                 shutil.copyfile(rel, myreldest)
   771                 shutil.copyfile(rel, myreldest)
   772                 shutil.copymode(rel, myreldest)
   772                 shutil.copymode(rel, myreldest)
   773             except shutil.Error, inst:
   773             except shutil.Error, inst:
   774                 raise util.Abort(str(inst))
   774                 raise util.Abort(str(inst))
   775             except IOError, inst:
   775             except IOError, inst:
   776                 if inst.errno == errno.ENOENT:
   776                 if inst.errno == errno.ENOENT:
   777                     ui.warn('%s: deleted in working copy\n' % rel)
   777                     ui.warn(_('%s: deleted in working copy\n') % rel)
   778                 else:
   778                 else:
   779                     ui.warn('%s: cannot copy - %s\n' % (rel, inst.strerror))
   779                     ui.warn(_('%s: cannot copy - %s\n') % (rel, inst.strerror))
   780                 errs += 1
   780                 errs += 1
   781                 continue
   781                 continue
   782         repo.copy(abs, myabsdest)
   782         repo.copy(abs, myabsdest)
   783         copied.append((abs, rel, exact))
   783         copied.append((abs, rel, exact))
   784     if errs:
   784     if errs:
   785         ui.warn('(consider using --after)\n')
   785         ui.warn(_('(consider using --after)\n'))
   786     return errs, copied
   786     return errs, copied
   787 
   787 
   788 def copy(ui, repo, *pats, **opts):
   788 def copy(ui, repo, *pats, **opts):
   789     """mark files as copied for the next commit"""
   789     """mark files as copied for the next commit"""
   790     errs, copied = docopy(ui, repo, pats, opts)
   790     errs, copied = docopy(ui, repo, pats, opts)
   809     m2 = repo.manifest.read(m2n)
   809     m2 = repo.manifest.read(m2n)
   810     errors = 0
   810     errors = 0
   811     for f in dc:
   811     for f in dc:
   812         state = repo.dirstate.state(f)
   812         state = repo.dirstate.state(f)
   813         if state in "nr" and f not in m1:
   813         if state in "nr" and f not in m1:
   814             ui.warn("%s in state %s, but not in manifest1\n" % (f, state))
   814             ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
   815             errors += 1
   815             errors += 1
   816         if state in "a" and f in m1:
   816         if state in "a" and f in m1:
   817             ui.warn("%s in state %s, but also in manifest1\n" % (f, state))
   817             ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
   818             errors += 1
   818             errors += 1
   819         if state in "m" and f not in m1 and f not in m2:
   819         if state in "m" and f not in m1 and f not in m2:
   820             ui.warn("%s in state %s, but not in either manifest\n" %
   820             ui.warn(_("%s in state %s, but not in either manifest\n") %
   821                     (f, state))
   821                     (f, state))
   822             errors += 1
   822             errors += 1
   823     for f in m1:
   823     for f in m1:
   824         state = repo.dirstate.state(f)
   824         state = repo.dirstate.state(f)
   825         if state not in "nrm":
   825         if state not in "nrm":
   826             ui.warn("%s in manifest1, but listed as state %s" % (f, state))
   826             ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
   827             errors += 1
   827             errors += 1
   828     if errors:
   828     if errors:
   829         raise util.Abort(".hg/dirstate inconsistent with current parent's manifest")
   829         raise util.Abort(_(".hg/dirstate inconsistent with current parent's manifest"))
   830 
   830 
   831 def debugconfig(ui):
   831 def debugconfig(ui):
   832     """show combined config settings from all hgrc files"""
   832     """show combined config settings from all hgrc files"""
   833     try:
   833     try:
   834         repo = hg.repository(ui)
   834         repo = hg.repository(ui)
   860         ui.write("%c %3o %10d %s %s\n"
   860         ui.write("%c %3o %10d %s %s\n"
   861                  % (dc[file_][0], dc[file_][1] & 0777, dc[file_][2],
   861                  % (dc[file_][0], dc[file_][1] & 0777, dc[file_][2],
   862                     time.strftime("%x %X",
   862                     time.strftime("%x %X",
   863                                   time.localtime(dc[file_][3])), file_))
   863                                   time.localtime(dc[file_][3])), file_))
   864     for f in repo.dirstate.copies:
   864     for f in repo.dirstate.copies:
   865         ui.write("copy: %s -> %s\n" % (repo.dirstate.copies[f], f))
   865         ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copies[f], f))
   866 
   866 
   867 def debugdata(ui, file_, rev):
   867 def debugdata(ui, file_, rev):
   868     """dump the contents of an data file revision"""
   868     """dump the contents of an data file revision"""
   869     r = revlog.revlog(file, file_[:-2] + ".i", file_)
   869     r = revlog.revlog(file, file_[:-2] + ".i", file_)
   870     try:
   870     try:
   871         ui.write(r.revision(r.lookup(rev)))
   871         ui.write(r.revision(r.lookup(rev)))
   872     except KeyError:
   872     except KeyError:
   873         raise util.Abort('invalid revision identifier %s', rev)
   873         raise util.Abort(_('invalid revision identifier %s'), rev)
   874 
   874 
   875 def debugindex(ui, file_):
   875 def debugindex(ui, file_):
   876     """dump the contents of an index file"""
   876     """dump the contents of an index file"""
   877     r = revlog.revlog(file, file_, "")
   877     r = revlog.revlog(file, file_, "")
   878     ui.write("   rev    offset  length   base linkrev" +
   878     ui.write("   rev    offset  length   base linkrev" +
   908             n = r.lookup(rev)
   908             n = r.lookup(rev)
   909     else:
   909     else:
   910         n = r.tip()
   910         n = r.tip()
   911     m = r.renamed(n)
   911     m = r.renamed(n)
   912     if m:
   912     if m:
   913         ui.write("renamed from %s:%s\n" % (m[0], hex(m[1])))
   913         ui.write(_("renamed from %s:%s\n") % (m[0], hex(m[1])))
   914     else:
   914     else:
   915         ui.write("not renamed\n")
   915         ui.write(_("not renamed\n"))
   916 
   916 
   917 def debugwalk(ui, repo, *pats, **opts):
   917 def debugwalk(ui, repo, *pats, **opts):
   918     """show how files match on given patterns"""
   918     """show how files match on given patterns"""
   919     items = list(walk(repo, pats, opts))
   919     items = list(walk(repo, pats, opts))
   920     if not items:
   920     if not items:
   934     if len(revs) > 0:
   934     if len(revs) > 0:
   935         node1 = revs[0]
   935         node1 = revs[0]
   936     if len(revs) > 1:
   936     if len(revs) > 1:
   937         node2 = revs[1]
   937         node2 = revs[1]
   938     if len(revs) > 2:
   938     if len(revs) > 2:
   939         raise util.Abort("too many revisions to diff")
   939         raise util.Abort(_("too many revisions to diff"))
   940 
   940 
   941     fns, matchfn, anypats = matchpats(repo, repo.getcwd(), pats, opts)
   941     fns, matchfn, anypats = matchpats(repo, repo.getcwd(), pats, opts)
   942 
   942 
   943     dodiff(sys.stdout, ui, repo, node1, node2, fns, match=matchfn,
   943     dodiff(sys.stdout, ui, repo, node1, node2, fns, match=matchfn,
   944            text=opts['text'])
   944            text=opts['text'])
   968         fp.close()
   968         fp.close()
   969 
   969 
   970 def export(ui, repo, *changesets, **opts):
   970 def export(ui, repo, *changesets, **opts):
   971     """dump the header and diffs for one or more changesets"""
   971     """dump the header and diffs for one or more changesets"""
   972     if not changesets:
   972     if not changesets:
   973         raise util.Abort("export requires at least one changeset")
   973         raise util.Abort(_("export requires at least one changeset"))
   974     seqno = 0
   974     seqno = 0
   975     revs = list(revrange(ui, repo, changesets))
   975     revs = list(revrange(ui, repo, changesets))
   976     total = len(revs)
   976     total = len(revs)
   977     revwidth = max(map(len, revs))
   977     revwidth = max(map(len, revs))
   978     ui.note(len(revs) > 1 and "Exporting patches:\n" or "Exporting patch:\n")
   978     ui.note(len(revs) > 1 and _("Exporting patches:\n") or _("Exporting patch:\n"))
   979     for cset in revs:
   979     for cset in revs:
   980         seqno += 1
   980         seqno += 1
   981         doexport(ui, repo, cset, seqno, total, revwidth, opts)
   981         doexport(ui, repo, cset, seqno, total, revwidth, opts)
   982 
   982 
   983 def forget(ui, repo, *pats, **opts):
   983 def forget(ui, repo, *pats, **opts):
   985     forget = []
   985     forget = []
   986     for src, abs, rel, exact in walk(repo, pats, opts):
   986     for src, abs, rel, exact in walk(repo, pats, opts):
   987         if repo.dirstate.state(abs) == 'a':
   987         if repo.dirstate.state(abs) == 'a':
   988             forget.append(abs)
   988             forget.append(abs)
   989             if ui.verbose or not exact:
   989             if ui.verbose or not exact:
   990                 ui.status('forgetting ', rel, '\n')
   990                 ui.status(_('forgetting %s\n') % rel)
   991     repo.forget(forget)
   991     repo.forget(forget)
   992 
   992 
   993 def grep(ui, repo, pattern, *pats, **opts):
   993 def grep(ui, repo, pattern, *pats, **opts):
   994     """search for a pattern in specified files and revisions"""
   994     """search for a pattern in specified files and revisions"""
   995     reflags = 0
   995     reflags = 0
  1120 
  1120 
  1121 def identify(ui, repo):
  1121 def identify(ui, repo):
  1122     """print information about the working copy"""
  1122     """print information about the working copy"""
  1123     parents = [p for p in repo.dirstate.parents() if p != nullid]
  1123     parents = [p for p in repo.dirstate.parents() if p != nullid]
  1124     if not parents:
  1124     if not parents:
  1125         ui.write("unknown\n")
  1125         ui.write(_("unknown\n"))
  1126         return
  1126         return
  1127 
  1127 
  1128     hexfunc = ui.verbose and hex or short
  1128     hexfunc = ui.verbose and hex or short
  1129     (c, a, d, u) = repo.changes()
  1129     (c, a, d, u) = repo.changes()
  1130     output = ["%s%s" % ('+'.join([hexfunc(parent) for parent in parents]),
  1130     output = ["%s%s" % ('+'.join([hexfunc(parent) for parent in parents]),
  1145     patches = (patch1,) + patches
  1145     patches = (patch1,) + patches
  1146 
  1146 
  1147     if not opts['force']:
  1147     if not opts['force']:
  1148         (c, a, d, u) = repo.changes()
  1148         (c, a, d, u) = repo.changes()
  1149         if c or a or d:
  1149         if c or a or d:
  1150             raise util.Abort("outstanding uncommitted changes")
  1150             raise util.Abort(_("outstanding uncommitted changes"))
  1151 
  1151 
  1152     d = opts["base"]
  1152     d = opts["base"]
  1153     strip = opts["strip"]
  1153     strip = opts["strip"]
  1154 
  1154 
  1155     mailre = re.compile(r'(?:From |[\w-]+:)')
  1155     mailre = re.compile(r'(?:From |[\w-]+:)')
  1159     diffre = re.compile(r'(?:Index:[ \t]|diff[ \t]|RCS file: |' +
  1159     diffre = re.compile(r'(?:Index:[ \t]|diff[ \t]|RCS file: |' +
  1160                         'retrieving revision [0-9]+(\.[0-9]+)*$|' +
  1160                         'retrieving revision [0-9]+(\.[0-9]+)*$|' +
  1161                         '(---|\*\*\*)[ \t])')
  1161                         '(---|\*\*\*)[ \t])')
  1162 
  1162 
  1163     for patch in patches:
  1163     for patch in patches:
  1164         ui.status("applying %s\n" % patch)
  1164         ui.status(_("applying %s\n") % patch)
  1165         pf = os.path.join(d, patch)
  1165         pf = os.path.join(d, patch)
  1166 
  1166 
  1167         message = []
  1167         message = []
  1168         user = None
  1168         user = None
  1169         hgpatch = False
  1169         hgpatch = False
  1170         for line in file(pf):
  1170         for line in file(pf):
  1171             line = line.rstrip()
  1171             line = line.rstrip()
  1172             if (not message and not hgpatch and
  1172             if (not message and not hgpatch and
  1173                    mailre.match(line) and not opts['force']):
  1173                    mailre.match(line) and not opts['force']):
  1174                 if len(line) > 35: line = line[:32] + '...'
  1174                 if len(line) > 35: line = line[:32] + '...'
  1175                 raise util.Abort('first line looks like a '
  1175                 raise util.Abort(_('first line looks like a '
  1176                                  'mail header: ' + line)
  1176                                    'mail header: ') + line)
  1177             if diffre.match(line):
  1177             if diffre.match(line):
  1178                 break
  1178                 break
  1179             elif hgpatch:
  1179             elif hgpatch:
  1180                 # parse values when importing the result of an hg export
  1180                 # parse values when importing the result of an hg export
  1181                 if line.startswith("# User "):
  1181                 if line.startswith("# User "):
  1182                     user = line[7:]
  1182                     user = line[7:]
  1183                     ui.debug('User: %s\n' % user)
  1183                     ui.debug(_('User: %s\n') % user)
  1184                 elif not line.startswith("# ") and line:
  1184                 elif not line.startswith("# ") and line:
  1185                     message.append(line)
  1185                     message.append(line)
  1186                     hgpatch = False
  1186                     hgpatch = False
  1187             elif line == '# HG changeset patch':
  1187             elif line == '# HG changeset patch':
  1188                 hgpatch = True
  1188                 hgpatch = True
  1190             else:
  1190             else:
  1191                 message.append(line)
  1191                 message.append(line)
  1192 
  1192 
  1193         # make sure message isn't empty
  1193         # make sure message isn't empty
  1194         if not message:
  1194         if not message:
  1195             message = "imported patch %s\n" % patch
  1195             message = _("imported patch %s\n") % patch
  1196         else:
  1196         else:
  1197             message = "%s\n" % '\n'.join(message)
  1197             message = "%s\n" % '\n'.join(message)
  1198         ui.debug('message:\n%s\n' % message)
  1198         ui.debug(_('message:\n%s\n') % message)
  1199 
  1199 
  1200         files = util.patch(strip, pf, ui)
  1200         files = util.patch(strip, pf, ui)
  1201 
  1201 
  1202         if len(files) > 0:
  1202         if len(files) > 0:
  1203             addremove(ui, repo, *files)
  1203             addremove(ui, repo, *files)
  1206 def incoming(ui, repo, source="default", **opts):
  1206 def incoming(ui, repo, source="default", **opts):
  1207     """show new changesets found in source"""
  1207     """show new changesets found in source"""
  1208     source = ui.expandpath(source)
  1208     source = ui.expandpath(source)
  1209     other = hg.repository(ui, source)
  1209     other = hg.repository(ui, source)
  1210     if not other.local():
  1210     if not other.local():
  1211         raise util.Abort("incoming doesn't work for remote repositories yet")
  1211         raise util.Abort(_("incoming doesn't work for remote repositories yet"))
  1212     o = repo.findincoming(other)
  1212     o = repo.findincoming(other)
  1213     if not o:
  1213     if not o:
  1214         return
  1214         return
  1215     o = other.newer(o)
  1215     o = other.newer(o)
  1216     for n in o:
  1216     for n in o:
  1353     if search:
  1353     if search:
  1354         for name, path in ui.configitems("paths"):
  1354         for name, path in ui.configitems("paths"):
  1355             if name == search:
  1355             if name == search:
  1356                 ui.write("%s\n" % path)
  1356                 ui.write("%s\n" % path)
  1357                 return
  1357                 return
  1358         ui.warn("not found!\n")
  1358         ui.warn(_("not found!\n"))
  1359         return 1
  1359         return 1
  1360     else:
  1360     else:
  1361         for name, path in ui.configitems("paths"):
  1361         for name, path in ui.configitems("paths"):
  1362             ui.write("%s = %s\n" % (name, path))
  1362             ui.write("%s = %s\n" % (name, path))
  1363 
  1363 
  1364 def pull(ui, repo, source="default", **opts):
  1364 def pull(ui, repo, source="default", **opts):
  1365     """pull changes from the specified source"""
  1365     """pull changes from the specified source"""
  1366     source = ui.expandpath(source)
  1366     source = ui.expandpath(source)
  1367     ui.status('pulling from %s\n' % (source))
  1367     ui.status(_('pulling from %s\n') % (source))
  1368 
  1368 
  1369     if opts['ssh']:
  1369     if opts['ssh']:
  1370         ui.setconfig("ui", "ssh", opts['ssh'])
  1370         ui.setconfig("ui", "ssh", opts['ssh'])
  1371     if opts['remotecmd']:
  1371     if opts['remotecmd']:
  1372         ui.setconfig("ui", "remotecmd", opts['remotecmd'])
  1372         ui.setconfig("ui", "remotecmd", opts['remotecmd'])
  1375     r = repo.pull(other)
  1375     r = repo.pull(other)
  1376     if not r:
  1376     if not r:
  1377         if opts['update']:
  1377         if opts['update']:
  1378             return update(ui, repo)
  1378             return update(ui, repo)
  1379         else:
  1379         else:
  1380             ui.status("(run 'hg update' to get a working copy)\n")
  1380             ui.status(_("(run 'hg update' to get a working copy)\n"))
  1381 
  1381 
  1382     return r
  1382     return r
  1383 
  1383 
  1384 def push(ui, repo, dest="default-push", force=False, ssh=None, remotecmd=None):
  1384 def push(ui, repo, dest="default-push", force=False, ssh=None, remotecmd=None):
  1385     """push changes to the specified destination"""
  1385     """push changes to the specified destination"""
  1396     return r
  1396     return r
  1397 
  1397 
  1398 def rawcommit(ui, repo, *flist, **rc):
  1398 def rawcommit(ui, repo, *flist, **rc):
  1399     "raw commit interface"
  1399     "raw commit interface"
  1400     if rc['text']:
  1400     if rc['text']:
  1401         ui.warn("Warning: -t and --text is deprecated,"
  1401         ui.warn(_("Warning: -t and --text is deprecated,"
  1402                 " please use -m or --message instead.\n")
  1402                   " please use -m or --message instead.\n"))
  1403     message = rc['message'] or rc['text']
  1403     message = rc['message'] or rc['text']
  1404     if not message and rc['logfile']:
  1404     if not message and rc['logfile']:
  1405         try:
  1405         try:
  1406             message = open(rc['logfile']).read()
  1406             message = open(rc['logfile']).read()
  1407         except IOError:
  1407         except IOError:
  1408             pass
  1408             pass
  1409     if not message and not rc['logfile']:
  1409     if not message and not rc['logfile']:
  1410         raise util.Abort("missing commit message")
  1410         raise util.Abort(_("missing commit message"))
  1411 
  1411 
  1412     files = relpath(repo, list(flist))
  1412     files = relpath(repo, list(flist))
  1413     if rc['files']:
  1413     if rc['files']:
  1414         files += open(rc['files']).read().splitlines()
  1414         files += open(rc['files']).read().splitlines()
  1415 
  1415 
  1428     """remove the specified files on the next commit"""
  1428     """remove the specified files on the next commit"""
  1429     names = []
  1429     names = []
  1430     def okaytoremove(abs, rel, exact):
  1430     def okaytoremove(abs, rel, exact):
  1431         c, a, d, u = repo.changes(files = [abs])
  1431         c, a, d, u = repo.changes(files = [abs])
  1432         reason = None
  1432         reason = None
  1433         if c: reason = 'is modified'
  1433         if c: reason = _('is modified')
  1434         elif a: reason = 'has been marked for add'
  1434         elif a: reason = _('has been marked for add')
  1435         elif u: reason = 'is not managed'
  1435         elif u: reason = _('is not managed')
  1436         if reason:
  1436         if reason:
  1437             if exact: ui.warn('not removing %s: file %s\n' % (rel, reason))
  1437             if exact: ui.warn(_('not removing %s: file %s\n') % (rel, reason))
  1438         else:
  1438         else:
  1439             return True
  1439             return True
  1440     for src, abs, rel, exact in walk(repo, (pat,) + pats, opts):
  1440     for src, abs, rel, exact in walk(repo, (pat,) + pats, opts):
  1441         if okaytoremove(abs, rel, exact):
  1441         if okaytoremove(abs, rel, exact):
  1442             if ui.verbose or not exact: ui.status('removing %s\n' % rel)
  1442             if ui.verbose or not exact: ui.status(_('removing %s\n') % rel)
  1443             names.append(abs)
  1443             names.append(abs)
  1444     for name in names:
  1444     for name in names:
  1445         try:
  1445         try:
  1446             os.unlink(name)
  1446             os.unlink(name)
  1447         except OSError, inst:
  1447         except OSError, inst:
  1451 def rename(ui, repo, *pats, **opts):
  1451 def rename(ui, repo, *pats, **opts):
  1452     """rename files; equivalent of copy + remove"""
  1452     """rename files; equivalent of copy + remove"""
  1453     errs, copied = docopy(ui, repo, pats, opts)
  1453     errs, copied = docopy(ui, repo, pats, opts)
  1454     names = []
  1454     names = []
  1455     for abs, rel, exact in copied:
  1455     for abs, rel, exact in copied:
  1456         if ui.verbose or not exact: ui.status('removing %s\n' % rel)
  1456         if ui.verbose or not exact: ui.status(_('removing %s\n') % rel)
  1457         try:
  1457         try:
  1458             os.unlink(rel)
  1458             os.unlink(rel)
  1459         except OSError, inst:
  1459         except OSError, inst:
  1460             if inst.errno != errno.ENOENT: raise
  1460             if inst.errno != errno.ENOENT: raise
  1461         names.append(abs)
  1461         names.append(abs)
  1503         return ret
  1503         return ret
  1504 
  1504 
  1505     r = repo.update(node, False, True, choose, False)
  1505     r = repo.update(node, False, True, choose, False)
  1506     for n in relnames:
  1506     for n in relnames:
  1507         if n not in chosen:
  1507         if n not in chosen:
  1508             ui.warn('error: no matches for %s\n' % n)
  1508             ui.warn(_('error: no matches for %s\n') % n)
  1509             r = 1
  1509             r = 1
  1510     sys.stdout.flush()
  1510     sys.stdout.flush()
  1511     return r
  1511     return r
  1512 
  1512 
  1513 def root(ui, repo):
  1513 def root(ui, repo):
  1603             try:
  1603             try:
  1604                 addr = socket.gethostbyaddr(addr)[0]
  1604                 addr = socket.gethostbyaddr(addr)[0]
  1605             except socket.error:
  1605             except socket.error:
  1606                 pass
  1606                 pass
  1607         if port != 80:
  1607         if port != 80:
  1608             ui.status('listening at http://%s:%d/\n' % (addr, port))
  1608             ui.status(_('listening at http://%s:%d/\n') % (addr, port))
  1609         else:
  1609         else:
  1610             ui.status('listening at http://%s/\n' % addr)
  1610             ui.status(_('listening at http://%s/\n') % addr)
  1611     httpd.serve_forever()
  1611     httpd.serve_forever()
  1612 
  1612 
  1613 def status(ui, repo, *pats, **opts):
  1613 def status(ui, repo, *pats, **opts):
  1614     '''show changed files in the working directory
  1614     '''show changed files in the working directory
  1615 
  1615 
  1622     cwd = repo.getcwd()
  1622     cwd = repo.getcwd()
  1623     files, matchfn, anypats = matchpats(repo, cwd, pats, opts)
  1623     files, matchfn, anypats = matchpats(repo, cwd, pats, opts)
  1624     (c, a, d, u) = [[util.pathto(cwd, x) for x in n]
  1624     (c, a, d, u) = [[util.pathto(cwd, x) for x in n]
  1625                     for n in repo.changes(files=files, match=matchfn)]
  1625                     for n in repo.changes(files=files, match=matchfn)]
  1626 
  1626 
  1627     changetypes = [('modified', 'M', c),
  1627     changetypes = [(_('modified'), 'M', c),
  1628                    ('added', 'A', a),
  1628                    (_('added'), 'A', a),
  1629                    ('removed', 'R', d),
  1629                    (_('removed'), 'R', d),
  1630                    ('unknown', '?', u)]
  1630                    (_('unknown'), '?', u)]
  1631 
  1631 
  1632     end = opts['print0'] and '\0' or '\n'
  1632     end = opts['print0'] and '\0' or '\n'
  1633 
  1633 
  1634     for opt, char, changes in ([ct for ct in changetypes if opts[ct[0]]]
  1634     for opt, char, changes in ([ct for ct in changetypes if opts[ct[0]]]
  1635                                or changetypes):
  1635                                or changetypes):
  1642             ui.write(format % f)
  1642             ui.write(format % f)
  1643 
  1643 
  1644 def tag(ui, repo, name, rev=None, **opts):
  1644 def tag(ui, repo, name, rev=None, **opts):
  1645     """add a tag for the current tip or a given revision"""
  1645     """add a tag for the current tip or a given revision"""
  1646     if opts['text']:
  1646     if opts['text']:
  1647         ui.warn("Warning: -t and --text is deprecated,"
  1647         ui.warn(_("Warning: -t and --text is deprecated,"
  1648                 " please use -m or --message instead.\n")
  1648                   " please use -m or --message instead.\n"))
  1649     if name == "tip":
  1649     if name == "tip":
  1650         raise util.Abort("the name 'tip' is reserved")
  1650         raise util.Abort(_("the name 'tip' is reserved"))
  1651     if rev:
  1651     if rev:
  1652         r = hex(repo.lookup(rev))
  1652         r = hex(repo.lookup(rev))
  1653     else:
  1653     else:
  1654         r = hex(repo.changelog.tip())
  1654         r = hex(repo.changelog.tip())
  1655 
  1655 
  1656     if name.find(revrangesep) >= 0:
  1656     if name.find(revrangesep) >= 0:
  1657         raise util.Abort("'%s' cannot be used in a tag name" % revrangesep)
  1657         raise util.Abort(_("'%s' cannot be used in a tag name") % revrangesep)
  1658 
  1658 
  1659     if opts['local']:
  1659     if opts['local']:
  1660         repo.opener("localtags", "a").write("%s %s\n" % (r, name))
  1660         repo.opener("localtags", "a").write("%s %s\n" % (r, name))
  1661         return
  1661         return
  1662 
  1662 
  1663     (c, a, d, u) = repo.changes()
  1663     (c, a, d, u) = repo.changes()
  1664     for x in (c, a, d, u):
  1664     for x in (c, a, d, u):
  1665         if ".hgtags" in x:
  1665         if ".hgtags" in x:
  1666             raise util.Abort("working copy of .hgtags is changed "
  1666             raise util.Abort(_("working copy of .hgtags is changed "
  1667                              "(please commit .hgtags manually)")
  1667                                "(please commit .hgtags manually)"))
  1668 
  1668 
  1669     repo.wfile(".hgtags", "ab").write("%s %s\n" % (r, name))
  1669     repo.wfile(".hgtags", "ab").write("%s %s\n" % (r, name))
  1670     if repo.dirstate.state(".hgtags") == '?':
  1670     if repo.dirstate.state(".hgtags") == '?':
  1671         repo.add([".hgtags"])
  1671         repo.add([".hgtags"])
  1672 
  1672 
  1673     message = (opts['message'] or opts['text'] or
  1673     message = (opts['message'] or opts['text'] or
  1674                "Added tag %s for changeset %s" % (name, r))
  1674                _("Added tag %s for changeset %s") % (name, r))
  1675     try:
  1675     try:
  1676         repo.commit([".hgtags"], message, opts['user'], opts['date'])
  1676         repo.commit([".hgtags"], message, opts['user'], opts['date'])
  1677     except ValueError, inst:
  1677     except ValueError, inst:
  1678         raise util.Abort(str(inst))
  1678         raise util.Abort(str(inst))
  1679 
  1679 
  1697 def unbundle(ui, repo, fname):
  1697 def unbundle(ui, repo, fname):
  1698     """apply a changegroup file"""
  1698     """apply a changegroup file"""
  1699     f = urllib.urlopen(fname)
  1699     f = urllib.urlopen(fname)
  1700 
  1700 
  1701     if f.read(4) != "HG10":
  1701     if f.read(4) != "HG10":
  1702         raise util.Abort("%s: not a Mercurial bundle file" % fname)
  1702         raise util.Abort(_("%s: not a Mercurial bundle file") % fname)
  1703 
  1703 
  1704     def bzgenerator(f):
  1704     def bzgenerator(f):
  1705         zd = bz2.BZ2Decompressor()
  1705         zd = bz2.BZ2Decompressor()
  1706         for chunk in f:
  1706         for chunk in f:
  1707             yield zd.decompress(chunk)
  1707             yield zd.decompress(chunk)
  1743         found = []
  1743         found = []
  1744         for x in br:
  1744         for x in br:
  1745             if branch in br[x]:
  1745             if branch in br[x]:
  1746                 found.append(x)
  1746                 found.append(x)
  1747         if len(found) > 1:
  1747         if len(found) > 1:
  1748             ui.warn("Found multiple heads for %s\n" % branch)
  1748             ui.warn(_("Found multiple heads for %s\n") % branch)
  1749             for x in found:
  1749             for x in found:
  1750                 show_changeset(ui, repo, changenode=x, brinfo=br)
  1750                 show_changeset(ui, repo, changenode=x, brinfo=br)
  1751             return 1
  1751             return 1
  1752         if len(found) == 1:
  1752         if len(found) == 1:
  1753             node = found[0]
  1753             node = found[0]
  1754             ui.warn("Using head %s for branch %s\n" % (short(node), branch))
  1754             ui.warn(_("Using head %s for branch %s\n") % (short(node), branch))
  1755         else:
  1755         else:
  1756             ui.warn("branch %s not found\n" % (branch))
  1756             ui.warn(_("branch %s not found\n") % (branch))
  1757             return 1
  1757             return 1
  1758     else:
  1758     else:
  1759         node = node and repo.lookup(node) or repo.changelog.tip()
  1759         node = node and repo.lookup(node) or repo.changelog.tip()
  1760     return repo.update(node, allow=merge, force=clean)
  1760     return repo.update(node, allow=merge, force=clean)
  1761 
  1761 
  1766 # Command options and aliases are listed here, alphabetically
  1766 # Command options and aliases are listed here, alphabetically
  1767 
  1767 
  1768 table = {
  1768 table = {
  1769     "^add":
  1769     "^add":
  1770         (add,
  1770         (add,
  1771          [('I', 'include', [], 'include path in search'),
  1771          [('I', 'include', [], _('include path in search')),
  1772           ('X', 'exclude', [], 'exclude path from search')],
  1772           ('X', 'exclude', [], _('exclude path from search'))],
  1773          "hg add [OPTION]... [FILE]..."),
  1773          "hg add [OPTION]... [FILE]..."),
  1774     "addremove":
  1774     "addremove":
  1775         (addremove,
  1775         (addremove,
  1776          [('I', 'include', [], 'include path in search'),
  1776          [('I', 'include', [], _('include path in search')),
  1777           ('X', 'exclude', [], 'exclude path from search')],
  1777           ('X', 'exclude', [], _('exclude path from search'))],
  1778          "hg addremove [OPTION]... [FILE]..."),
  1778          _("hg addremove [OPTION]... [FILE]...")),
  1779     "^annotate":
  1779     "^annotate":
  1780         (annotate,
  1780         (annotate,
  1781          [('r', 'rev', '', 'revision'),
  1781          [('r', 'rev', '', _('revision')),
  1782           ('a', 'text', None, 'treat all files as text'),
  1782           ('a', 'text', None, _('treat all files as text')),
  1783           ('u', 'user', None, 'show user'),
  1783           ('u', 'user', None, _('show user')),
  1784           ('n', 'number', None, 'show revision number'),
  1784           ('n', 'number', None, _('show revision number')),
  1785           ('c', 'changeset', None, 'show changeset'),
  1785           ('c', 'changeset', None, _('show changeset')),
  1786           ('I', 'include', [], 'include path in search'),
  1786           ('I', 'include', [], _('include path in search')),
  1787           ('X', 'exclude', [], 'exclude path from search')],
  1787           ('X', 'exclude', [], _('exclude path from search'))],
  1788          'hg annotate [OPTION]... FILE...'),
  1788          _('hg annotate [OPTION]... FILE...')),
  1789     "bundle":
  1789     "bundle":
  1790         (bundle,
  1790         (bundle,
  1791          [],
  1791          [],
  1792          'hg bundle FILE DEST'),
  1792          _('hg bundle FILE DEST')),
  1793     "cat":
  1793     "cat":
  1794         (cat,
  1794         (cat,
  1795          [('I', 'include', [], 'include path in search'),
  1795          [('I', 'include', [], _('include path in search')),
  1796           ('X', 'exclude', [], 'exclude path from search'),
  1796           ('X', 'exclude', [], _('exclude path from search')),
  1797           ('o', 'output', "", 'output to file'),
  1797           ('o', 'output', "", _('output to file')),
  1798           ('r', 'rev', '', 'revision')],
  1798           ('r', 'rev', '', _('revision'))],
  1799          'hg cat [OPTION]... FILE...'),
  1799          _('hg cat [OPTION]... FILE...')),
  1800     "^clone":
  1800     "^clone":
  1801         (clone,
  1801         (clone,
  1802          [('U', 'noupdate', None, 'skip update after cloning'),
  1802          [('U', 'noupdate', None, _('skip update after cloning')),
  1803           ('e', 'ssh', "", 'ssh command'),
  1803           ('e', 'ssh', "", _('ssh command')),
  1804           ('', 'pull', None, 'use pull protocol to copy metadata'),
  1804           ('', 'pull', None, _('use pull protocol to copy metadata')),
  1805           ('', 'remotecmd', "", 'remote hg command')],
  1805           ('', 'remotecmd', "", _('remote hg command'))],
  1806          'hg clone [OPTION]... SOURCE [DEST]'),
  1806          _('hg clone [OPTION]... SOURCE [DEST]')),
  1807     "^commit|ci":
  1807     "^commit|ci":
  1808         (commit,
  1808         (commit,
  1809          [('A', 'addremove', None, 'run add/remove during commit'),
  1809          [('A', 'addremove', None, _('run add/remove during commit')),
  1810           ('I', 'include', [], 'include path in search'),
  1810           ('I', 'include', [], _('include path in search')),
  1811           ('X', 'exclude', [], 'exclude path from search'),
  1811           ('X', 'exclude', [], _('exclude path from search')),
  1812           ('m', 'message', "", 'commit message'),
  1812           ('m', 'message', "", _('commit message')),
  1813           ('t', 'text', "", 'commit message (deprecated: use -m)'),
  1813           ('t', 'text', "", _('commit message (deprecated: use -m)')),
  1814           ('l', 'logfile', "", 'commit message file'),
  1814           ('l', 'logfile', "", _('commit message file')),
  1815           ('d', 'date', "", 'date code'),
  1815           ('d', 'date', "", _('date code')),
  1816           ('u', 'user', "", 'user')],
  1816           ('u', 'user', "", _('user'))],
  1817          'hg commit [OPTION]... [FILE]...'),
  1817          _('hg commit [OPTION]... [FILE]...')),
  1818     "copy|cp": (copy,
  1818     "copy|cp": (copy,
  1819              [('I', 'include', [], 'include path in search'),
  1819              [('I', 'include', [], _('include path in search')),
  1820               ('X', 'exclude', [], 'exclude path from search'),
  1820               ('X', 'exclude', [], _('exclude path from search')),
  1821               ('A', 'after', None, 'record a copy after it has happened'),
  1821               ('A', 'after', None, _('record a copy after it has happened')),
  1822               ('f', 'force', None, 'replace destination if it exists'),
  1822               ('f', 'force', None, _('replace destination if it exists')),
  1823               ('p', 'parents', None, 'append source path to dest')],
  1823               ('p', 'parents', None, _('append source path to dest'))],
  1824              'hg copy [OPTION]... [SOURCE]... DEST'),
  1824              _('hg copy [OPTION]... [SOURCE]... DEST')),
  1825     "debugancestor": (debugancestor, [], 'debugancestor INDEX REV1 REV2'),
  1825     "debugancestor": (debugancestor, [], _('debugancestor INDEX REV1 REV2')),
  1826     "debugcheckstate": (debugcheckstate, [], 'debugcheckstate'),
  1826     "debugcheckstate": (debugcheckstate, [], _('debugcheckstate')),
  1827     "debugconfig": (debugconfig, [], 'debugconfig'),
  1827     "debugconfig": (debugconfig, [], _('debugconfig')),
  1828     "debugsetparents": (debugsetparents, [], 'debugsetparents REV1 [REV2]'),
  1828     "debugsetparents": (debugsetparents, [], _('debugsetparents REV1 [REV2]')),
  1829     "debugstate": (debugstate, [], 'debugstate'),
  1829     "debugstate": (debugstate, [], _('debugstate')),
  1830     "debugdata": (debugdata, [], 'debugdata FILE REV'),
  1830     "debugdata": (debugdata, [], _('debugdata FILE REV')),
  1831     "debugindex": (debugindex, [], 'debugindex FILE'),
  1831     "debugindex": (debugindex, [], _('debugindex FILE')),
  1832     "debugindexdot": (debugindexdot, [], 'debugindexdot FILE'),
  1832     "debugindexdot": (debugindexdot, [], _('debugindexdot FILE')),
  1833     "debugrename": (debugrename, [], 'debugrename FILE [REV]'),
  1833     "debugrename": (debugrename, [], _('debugrename FILE [REV]')),
  1834     "debugwalk":
  1834     "debugwalk":
  1835         (debugwalk,
  1835         (debugwalk,
  1836          [('I', 'include', [], 'include path in search'),
  1836          [('I', 'include', [], _('include path in search')),
  1837           ('X', 'exclude', [], 'exclude path from search')],
  1837           ('X', 'exclude', [], _('exclude path from search'))],
  1838          'debugwalk [OPTION]... [FILE]...'),
  1838          _('debugwalk [OPTION]... [FILE]...')),
  1839     "^diff":
  1839     "^diff":
  1840         (diff,
  1840         (diff,
  1841          [('r', 'rev', [], 'revision'),
  1841          [('r', 'rev', [], _('revision')),
  1842           ('a', 'text', None, 'treat all files as text'),
  1842           ('a', 'text', None, _('treat all files as text')),
  1843           ('I', 'include', [], 'include path in search'),
  1843           ('I', 'include', [], _('include path in search')),
  1844           ('X', 'exclude', [], 'exclude path from search')],
  1844           ('X', 'exclude', [], _('exclude path from search'))],
  1845          'hg diff [-a] [-I] [-X] [-r REV1 [-r REV2]] [FILE]...'),
  1845          _('hg diff [-a] [-I] [-X] [-r REV1 [-r REV2]] [FILE]...')),
  1846     "^export":
  1846     "^export":
  1847         (export,
  1847         (export,
  1848          [('o', 'output', "", 'output to file'),
  1848          [('o', 'output', "", _('output to file')),
  1849           ('a', 'text', None, 'treat all files as text')],
  1849           ('a', 'text', None, _('treat all files as text'))],
  1850          "hg export [-a] [-o OUTFILE] REV..."),
  1850          _("hg export [-a] [-o OUTFILE] REV...")),
  1851     "forget":
  1851     "forget":
  1852         (forget,
  1852         (forget,
  1853          [('I', 'include', [], 'include path in search'),
  1853          [('I', 'include', [], _('include path in search')),
  1854           ('X', 'exclude', [], 'exclude path from search')],
  1854           ('X', 'exclude', [], _('exclude path from search'))],
  1855          "hg forget [OPTION]... FILE..."),
  1855          _("hg forget [OPTION]... FILE...")),
  1856     "grep":
  1856     "grep":
  1857         (grep,
  1857         (grep,
  1858          [('0', 'print0', None, 'end fields with NUL'),
  1858          [('0', 'print0', None, _('end fields with NUL')),
  1859           ('I', 'include', [], 'include path in search'),
  1859           ('I', 'include', [], _('include path in search')),
  1860           ('X', 'exclude', [], 'include path in search'),
  1860           ('X', 'exclude', [], _('include path in search')),
  1861           ('', 'all', None, 'print all revisions with matches'),
  1861           ('', 'all', None, _('print all revisions with matches')),
  1862           ('i', 'ignore-case', None, 'ignore case when matching'),
  1862           ('i', 'ignore-case', None, _('ignore case when matching')),
  1863           ('l', 'files-with-matches', None, 'print names of files and revs with matches'),
  1863           ('l', 'files-with-matches', None, _('print names of files and revs with matches')),
  1864           ('n', 'line-number', None, 'print line numbers'),
  1864           ('n', 'line-number', None, _('print line numbers')),
  1865           ('r', 'rev', [], 'search in revision rev'),
  1865           ('r', 'rev', [], _('search in revision rev')),
  1866           ('u', 'user', None, 'print user who made change')],
  1866           ('u', 'user', None, _('print user who made change'))],
  1867          "hg grep [OPTION]... PATTERN [FILE]..."),
  1867          _("hg grep [OPTION]... PATTERN [FILE]...")),
  1868     "heads":
  1868     "heads":
  1869         (heads,
  1869         (heads,
  1870          [('b', 'branches', None, 'find branch info')],
  1870          [('b', 'branches', None, _('find branch info'))],
  1871          'hg heads [-b]'),
  1871          _('hg heads [-b]')),
  1872     "help": (help_, [], 'hg help [COMMAND]'),
  1872     "help": (help_, [], _('hg help [COMMAND]')),
  1873     "identify|id": (identify, [], 'hg identify'),
  1873     "identify|id": (identify, [], _('hg identify')),
  1874     "import|patch":
  1874     "import|patch":
  1875         (import_,
  1875         (import_,
  1876          [('p', 'strip', 1, 'path strip'),
  1876          [('p', 'strip', 1, _('path strip')),
  1877           ('f', 'force', None, 'skip check for outstanding changes'),
  1877           ('f', 'force', None, _('skip check for outstanding changes')),
  1878           ('b', 'base', "", 'base path')],
  1878           ('b', 'base', "", _('base path'))],
  1879          "hg import [-f] [-p NUM] [-b BASE] PATCH..."),
  1879          _("hg import [-f] [-p NUM] [-b BASE] PATCH...")),
  1880     "incoming|in": (incoming,
  1880     "incoming|in": (incoming,
  1881          [('p', 'patch', None, 'show patch')],
  1881          [('p', 'patch', None, _('show patch'))],
  1882          'hg incoming [-p] [SOURCE]'),
  1882          _('hg incoming [-p] [SOURCE]')),
  1883     "^init": (init, [], 'hg init [DEST]'),
  1883     "^init": (init, [], _('hg init [DEST]')),
  1884     "locate":
  1884     "locate":
  1885         (locate,
  1885         (locate,
  1886          [('r', 'rev', '', 'revision'),
  1886          [('r', 'rev', '', _('revision')),
  1887           ('0', 'print0', None, 'end filenames with NUL'),
  1887           ('0', 'print0', None, _('end filenames with NUL')),
  1888           ('f', 'fullpath', None, 'print complete paths'),
  1888           ('f', 'fullpath', None, _('print complete paths')),
  1889           ('I', 'include', [], 'include path in search'),
  1889           ('I', 'include', [], _('include path in search')),
  1890           ('X', 'exclude', [], 'exclude path from search')],
  1890           ('X', 'exclude', [], _('exclude path from search'))],
  1891          'hg locate [OPTION]... [PATTERN]...'),
  1891          _('hg locate [OPTION]... [PATTERN]...')),
  1892     "^log|history":
  1892     "^log|history":
  1893         (log,
  1893         (log,
  1894          [('I', 'include', [], 'include path in search'),
  1894          [('I', 'include', [], _('include path in search')),
  1895           ('X', 'exclude', [], 'exclude path from search'),
  1895           ('X', 'exclude', [], _('exclude path from search')),
  1896           ('b', 'branch', None, 'show branches'),
  1896           ('b', 'branch', None, _('show branches')),
  1897           ('k', 'keyword', [], 'search for a keyword'),
  1897           ('k', 'keyword', [], _('search for a keyword')),
  1898           ('r', 'rev', [], 'revision'),
  1898           ('r', 'rev', [], _('revision')),
  1899           ('p', 'patch', None, 'show patch')],
  1899           ('p', 'patch', None, _('show patch'))],
  1900          'hg log [-I] [-X] [-r REV]... [-p] [FILE]'),
  1900          _('hg log [-I] [-X] [-r REV]... [-p] [FILE]')),
  1901     "manifest": (manifest, [], 'hg manifest [REV]'),
  1901     "manifest": (manifest, [], _('hg manifest [REV]')),
  1902     "outgoing|out": (outgoing,
  1902     "outgoing|out": (outgoing,
  1903          [('p', 'patch', None, 'show patch')],
  1903          [('p', 'patch', None, _('show patch'))],
  1904          'hg outgoing [-p] [DEST]'),
  1904          _('hg outgoing [-p] [DEST]')),
  1905     "parents": (parents, [], 'hg parents [REV]'),
  1905     "parents": (parents, [], _('hg parents [REV]')),
  1906     "paths": (paths, [], 'hg paths [NAME]'),
  1906     "paths": (paths, [], _('hg paths [NAME]')),
  1907     "^pull":
  1907     "^pull":
  1908         (pull,
  1908         (pull,
  1909          [('u', 'update', None, 'update working directory'),
  1909          [('u', 'update', None, _('update working directory')),
  1910           ('e', 'ssh', "", 'ssh command'),
  1910           ('e', 'ssh', "", _('ssh command')),
  1911           ('', 'remotecmd', "", 'remote hg command')],
  1911           ('', 'remotecmd', "", _('remote hg command'))],
  1912          'hg pull [-u] [-e FILE] [--remotecmd FILE] [SOURCE]'),
  1912          _('hg pull [-u] [-e FILE] [--remotecmd FILE] [SOURCE]')),
  1913     "^push":
  1913     "^push":
  1914         (push,
  1914         (push,
  1915          [('f', 'force', None, 'force push'),
  1915          [('f', 'force', None, _('force push')),
  1916           ('e', 'ssh', "", 'ssh command'),
  1916           ('e', 'ssh', "", _('ssh command')),
  1917           ('', 'remotecmd', "", 'remote hg command')],
  1917           ('', 'remotecmd', "", _('remote hg command'))],
  1918          'hg push [-f] [-e FILE] [--remotecmd FILE] [DEST]'),
  1918          _('hg push [-f] [-e FILE] [--remotecmd FILE] [DEST]')),
  1919     "rawcommit":
  1919     "rawcommit":
  1920         (rawcommit,
  1920         (rawcommit,
  1921          [('p', 'parent', [], 'parent'),
  1921          [('p', 'parent', [], _('parent')),
  1922           ('d', 'date', "", 'date code'),
  1922           ('d', 'date', "", _('date code')),
  1923           ('u', 'user', "", 'user'),
  1923           ('u', 'user', "", _('user')),
  1924           ('F', 'files', "", 'file list'),
  1924           ('F', 'files', "", _('file list')),
  1925           ('m', 'message', "", 'commit message'),
  1925           ('m', 'message', "", _('commit message')),
  1926           ('t', 'text', "", 'commit message (deprecated: use -m)'),
  1926           ('t', 'text', "", _('commit message (deprecated: use -m)')),
  1927           ('l', 'logfile', "", 'commit message file')],
  1927           ('l', 'logfile', "", _('commit message file'))],
  1928          'hg rawcommit [OPTION]... [FILE]...'),
  1928          _('hg rawcommit [OPTION]... [FILE]...')),
  1929     "recover": (recover, [], "hg recover"),
  1929     "recover": (recover, [], _("hg recover")),
  1930     "^remove|rm": (remove,
  1930     "^remove|rm": (remove,
  1931                    [('I', 'include', [], 'include path in search'),
  1931                    [('I', 'include', [], _('include path in search')),
  1932                     ('X', 'exclude', [], 'exclude path from search')],
  1932                     ('X', 'exclude', [], _('exclude path from search'))],
  1933                    "hg remove [OPTION]... FILE..."),
  1933                    _("hg remove [OPTION]... FILE...")),
  1934     "rename|mv": (rename,
  1934     "rename|mv": (rename,
  1935                   [('I', 'include', [], 'include path in search'),
  1935                   [('I', 'include', [], _('include path in search')),
  1936                    ('X', 'exclude', [], 'exclude path from search'),
  1936                    ('X', 'exclude', [], _('exclude path from search')),
  1937                    ('A', 'after', None, 'record a copy after it has happened'),
  1937                    ('A', 'after', None, _('record a copy after it has happened')),
  1938                    ('f', 'force', None, 'replace destination if it exists'),
  1938                    ('f', 'force', None, _('replace destination if it exists')),
  1939                    ('p', 'parents', None, 'append source path to dest')],
  1939                    ('p', 'parents', None, _('append source path to dest'))],
  1940                   'hg rename [OPTION]... [SOURCE]... DEST'),
  1940                   _('hg rename [OPTION]... [SOURCE]... DEST')),
  1941     "^revert":
  1941     "^revert":
  1942         (revert,
  1942         (revert,
  1943          [("n", "nonrecursive", None, "don't recurse into subdirs"),
  1943          [("n", "nonrecursive", None, _("don't recurse into subdirs")),
  1944           ("r", "rev", "", "revision")],
  1944           ("r", "rev", "", _("revision"))],
  1945          "hg revert [-n] [-r REV] [NAME]..."),
  1945          _("hg revert [-n] [-r REV] [NAME]...")),
  1946     "root": (root, [], "hg root"),
  1946     "root": (root, [], _("hg root")),
  1947     "^serve":
  1947     "^serve":
  1948         (serve,
  1948         (serve,
  1949          [('A', 'accesslog', '', 'access log file'),
  1949          [('A', 'accesslog', '', _('access log file')),
  1950           ('E', 'errorlog', '', 'error log file'),
  1950           ('E', 'errorlog', '', _('error log file')),
  1951           ('p', 'port', 0, 'listen port'),
  1951           ('p', 'port', 0, _('listen port')),
  1952           ('a', 'address', '', 'interface address'),
  1952           ('a', 'address', '', _('interface address')),
  1953           ('n', 'name', "", 'repository name'),
  1953           ('n', 'name', "", _('repository name')),
  1954           ('', 'stdio', None, 'for remote clients'),
  1954           ('', 'stdio', None, _('for remote clients')),
  1955           ('t', 'templates', "", 'template directory'),
  1955           ('t', 'templates', "", _('template directory')),
  1956           ('', 'style', "", 'template style'),
  1956           ('', 'style', "", _('template style')),
  1957           ('6', 'ipv6', None, 'use IPv6 in addition to IPv4')],
  1957           ('6', 'ipv6', None, _('use IPv6 in addition to IPv4'))],
  1958          "hg serve [OPTION]..."),
  1958          _("hg serve [OPTION]...")),
  1959     "^status":
  1959     "^status":
  1960         (status,
  1960         (status,
  1961          [('m', 'modified', None, 'show only modified files'),
  1961          [('m', 'modified', None, _('show only modified files')),
  1962           ('a', 'added', None, 'show only added files'),
  1962           ('a', 'added', None, _('show only added files')),
  1963           ('r', 'removed', None, 'show only removed files'),
  1963           ('r', 'removed', None, _('show only removed files')),
  1964           ('u', 'unknown', None, 'show only unknown (not tracked) files'),
  1964           ('u', 'unknown', None, _('show only unknown (not tracked) files')),
  1965           ('n', 'no-status', None, 'hide status prefix'),
  1965           ('n', 'no-status', None, _('hide status prefix')),
  1966           ('0', 'print0', None, 'end filenames with NUL'),
  1966           ('0', 'print0', None, _('end filenames with NUL')),
  1967           ('I', 'include', [], 'include path in search'),
  1967           ('I', 'include', [], _('include path in search')),
  1968           ('X', 'exclude', [], 'exclude path from search')],
  1968           ('X', 'exclude', [], _('exclude path from search'))],
  1969          "hg status [OPTION]... [FILE]..."),
  1969          _("hg status [OPTION]... [FILE]...")),
  1970     "tag":
  1970     "tag":
  1971         (tag,
  1971         (tag,
  1972          [('l', 'local', None, 'make the tag local'),
  1972          [('l', 'local', None, _('make the tag local')),
  1973           ('m', 'message', "", 'commit message'),
  1973           ('m', 'message', "", _('commit message')),
  1974           ('t', 'text', "", 'commit message (deprecated: use -m)'),
  1974           ('t', 'text', "", _('commit message (deprecated: use -m)')),
  1975           ('d', 'date', "", 'date code'),
  1975           ('d', 'date', "", _('date code')),
  1976           ('u', 'user', "", 'user')],
  1976           ('u', 'user', "", _('user'))],
  1977          'hg tag [OPTION]... NAME [REV]'),
  1977          _('hg tag [OPTION]... NAME [REV]')),
  1978     "tags": (tags, [], 'hg tags'),
  1978     "tags": (tags, [], _('hg tags')),
  1979     "tip": (tip, [], 'hg tip'),
  1979     "tip": (tip, [], _('hg tip')),
  1980     "unbundle":
  1980     "unbundle":
  1981         (unbundle,
  1981         (unbundle,
  1982          [],
  1982          [],
  1983          'hg unbundle FILE'),
  1983          _('hg unbundle FILE')),
  1984     "undo": (undo, [], 'hg undo'),
  1984     "undo": (undo, [], _('hg undo')),
  1985     "^update|up|checkout|co":
  1985     "^update|up|checkout|co":
  1986         (update,
  1986         (update,
  1987          [('b', 'branch', "", 'checkout the head of a specific branch'),
  1987          [('b', 'branch', "", _('checkout the head of a specific branch')),
  1988           ('m', 'merge', None, 'allow merging of conflicts'),
  1988           ('m', 'merge', None, _('allow merging of conflicts')),
  1989           ('C', 'clean', None, 'overwrite locally modified files')],
  1989           ('C', 'clean', None, _('overwrite locally modified files'))],
  1990          'hg update [-b TAG] [-m] [-C] [REV]'),
  1990          _('hg update [-b TAG] [-m] [-C] [REV]')),
  1991     "verify": (verify, [], 'hg verify'),
  1991     "verify": (verify, [], _('hg verify')),
  1992     "version": (show_version, [], 'hg version'),
  1992     "version": (show_version, [], _('hg version')),
  1993 }
  1993 }
  1994 
  1994 
  1995 globalopts = [
  1995 globalopts = [
  1996     ('R', 'repository', "", 'repository root directory'),
  1996     ('R', 'repository', "", _('repository root directory')),
  1997     ('', 'cwd', '', 'change working directory'),
  1997     ('', 'cwd', '', _('change working directory')),
  1998     ('y', 'noninteractive', None, 'run non-interactively'),
  1998     ('y', 'noninteractive', None, _('run non-interactively')),
  1999     ('q', 'quiet', None, 'quiet mode'),
  1999     ('q', 'quiet', None, _('quiet mode')),
  2000     ('v', 'verbose', None, 'verbose mode'),
  2000     ('v', 'verbose', None, _('verbose mode')),
  2001     ('', 'debug', None, 'debug mode'),
  2001     ('', 'debug', None, _('debug mode')),
  2002     ('', 'debugger', None, 'start debugger'),
  2002     ('', 'debugger', None, _('start debugger')),
  2003     ('', 'traceback', None, 'print traceback on exception'),
  2003     ('', 'traceback', None, _('print traceback on exception')),
  2004     ('', 'time', None, 'time how long the command takes'),
  2004     ('', 'time', None, _('time how long the command takes')),
  2005     ('', 'profile', None, 'profile'),
  2005     ('', 'profile', None, _('profile')),
  2006     ('', 'version', None, 'output version information and exit'),
  2006     ('', 'version', None, _('output version information and exit')),
  2007     ('h', 'help', None, 'display help and exit'),
  2007     ('h', 'help', None, _('display help and exit')),
  2008 ]
  2008 ]
  2009 
  2009 
  2010 norepo = ("clone init version help debugancestor debugconfig debugdata"
  2010 norepo = ("clone init version help debugancestor debugconfig debugdata"
  2011           " debugindex debugindexdot paths")
  2011           " debugindex debugindexdot paths")
  2012 
  2012 
  2075     for x in u.extensions():
  2075     for x in u.extensions():
  2076         if x[1]:
  2076         if x[1]:
  2077             try:
  2077             try:
  2078                 mod = imp.load_source(x[0], x[1])
  2078                 mod = imp.load_source(x[0], x[1])
  2079             except:
  2079             except:
  2080                 u.warn("*** failed to import extension %s\n" % x[1])
  2080                 u.warn(_("*** failed to import extension %s\n") % x[1])
  2081                 continue
  2081                 continue
  2082         else:
  2082         else:
  2083             def importh(name):
  2083             def importh(name):
  2084                 mod = __import__(name)
  2084                 mod = __import__(name)
  2085                 components = name.split('.')
  2085                 components = name.split('.')
  2087                     mod = getattr(mod, comp)
  2087                     mod = getattr(mod, comp)
  2088                 return mod
  2088                 return mod
  2089             try:
  2089             try:
  2090                 mod = importh(x[0])
  2090                 mod = importh(x[0])
  2091             except:
  2091             except:
  2092                 u.warn("failed to import extension %s\n" % x[0])
  2092                 u.warn(_("failed to import extension %s\n") % x[0])
  2093                 continue
  2093                 continue
  2094 
  2094 
  2095         external.append(mod)
  2095         external.append(mod)
  2096     for x in external:
  2096     for x in external:
  2097         cmdtable = getattr(x, 'cmdtable', {})
  2097         cmdtable = getattr(x, 'cmdtable', {})
  2098         for t in cmdtable:
  2098         for t in cmdtable:
  2099             if t in table:
  2099             if t in table:
  2100                 u.warn("module %s overrides %s\n" % (x.__name__, t))
  2100                 u.warn(_("module %s overrides %s\n") % (x.__name__, t))
  2101         table.update(cmdtable)
  2101         table.update(cmdtable)
  2102 
  2102 
  2103     try:
  2103     try:
  2104         cmd, func, args, options, cmdoptions = parse(args)
  2104         cmd, func, args, options, cmdoptions = parse(args)
  2105     except ParseError, inst:
  2105     except ParseError, inst:
  2106         if inst.args[0]:
  2106         if inst.args[0]:
  2107             u.warn("hg %s: %s\n" % (inst.args[0], inst.args[1]))
  2107             u.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1]))
  2108             help_(u, inst.args[0])
  2108             help_(u, inst.args[0])
  2109         else:
  2109         else:
  2110             u.warn("hg: %s\n" % inst.args[1])
  2110             u.warn(_("hg: %s\n") % inst.args[1])
  2111             help_(u, 'shortlist')
  2111             help_(u, 'shortlist')
  2112         sys.exit(-1)
  2112         sys.exit(-1)
  2113     except UnknownCommand, inst:
  2113     except UnknownCommand, inst:
  2114         u.warn("hg: unknown command '%s'\n" % inst.args[0])
  2114         u.warn(_("hg: unknown command '%s'\n") % inst.args[0])
  2115         help_(u, 'shortlist')
  2115         help_(u, 'shortlist')
  2116         sys.exit(1)
  2116         sys.exit(1)
  2117 
  2117 
  2118     if options["time"]:
  2118     if options["time"]:
  2119         def get_times():
  2119         def get_times():
  2122                 t = (t[0], t[1], t[2], t[3], time.clock())
  2122                 t = (t[0], t[1], t[2], t[3], time.clock())
  2123             return t
  2123             return t
  2124         s = get_times()
  2124         s = get_times()
  2125         def print_time():
  2125         def print_time():
  2126             t = get_times()
  2126             t = get_times()
  2127             u.warn("Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n" %
  2127             u.warn(_("Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
  2128                 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
  2128                 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
  2129         atexit.register(print_time)
  2129         atexit.register(print_time)
  2130 
  2130 
  2131     u.updateopts(options["verbose"], options["debug"], options["quiet"],
  2131     u.updateopts(options["verbose"], options["debug"], options["quiet"],
  2132               not options["noninteractive"])
  2132               not options["noninteractive"])
  2181                 pdb.post_mortem(sys.exc_info()[2])
  2181                 pdb.post_mortem(sys.exc_info()[2])
  2182             if options['traceback']:
  2182             if options['traceback']:
  2183                 traceback.print_exc()
  2183                 traceback.print_exc()
  2184             raise
  2184             raise
  2185     except hg.RepoError, inst:
  2185     except hg.RepoError, inst:
  2186         u.warn("abort: ", inst, "!\n")
  2186         u.warn(_("abort: "), inst, "!\n")
  2187     except revlog.RevlogError, inst:
  2187     except revlog.RevlogError, inst:
  2188         u.warn("abort: ", inst, "!\n")
  2188         u.warn(_("abort: "), inst, "!\n")
  2189     except SignalInterrupt:
  2189     except SignalInterrupt:
  2190         u.warn("killed!\n")
  2190         u.warn(_("killed!\n"))
  2191     except KeyboardInterrupt:
  2191     except KeyboardInterrupt:
  2192         try:
  2192         try:
  2193             u.warn("interrupted!\n")
  2193             u.warn(_("interrupted!\n"))
  2194         except IOError, inst:
  2194         except IOError, inst:
  2195             if inst.errno == errno.EPIPE:
  2195             if inst.errno == errno.EPIPE:
  2196                 if u.debugflag:
  2196                 if u.debugflag:
  2197                     u.warn("\nbroken pipe\n")
  2197                     u.warn(_("\nbroken pipe\n"))
  2198             else:
  2198             else:
  2199                 raise
  2199                 raise
  2200     except IOError, inst:
  2200     except IOError, inst:
  2201         if hasattr(inst, "code"):
  2201         if hasattr(inst, "code"):
  2202             u.warn("abort: %s\n" % inst)
  2202             u.warn(_("abort: %s\n") % inst)
  2203         elif hasattr(inst, "reason"):
  2203         elif hasattr(inst, "reason"):
  2204             u.warn("abort: error: %s\n" % inst.reason[1])
  2204             u.warn(_("abort: error: %s\n") % inst.reason[1])
  2205         elif hasattr(inst, "args") and inst[0] == errno.EPIPE:
  2205         elif hasattr(inst, "args") and inst[0] == errno.EPIPE:
  2206             if u.debugflag:
  2206             if u.debugflag:
  2207                 u.warn("broken pipe\n")
  2207                 u.warn(_("broken pipe\n"))
  2208         elif getattr(inst, "strerror", None):
  2208         elif getattr(inst, "strerror", None):
  2209             if getattr(inst, "filename", None):
  2209             if getattr(inst, "filename", None):
  2210                 u.warn("abort: %s - %s\n" % (inst.strerror, inst.filename))
  2210                 u.warn(_("abort: %s - %s\n") % (inst.strerror, inst.filename))
  2211             else:
  2211             else:
  2212                 u.warn("abort: %s\n" % inst.strerror)
  2212                 u.warn(_("abort: %s\n") % inst.strerror)
  2213         else:
  2213         else:
  2214             raise
  2214             raise
  2215     except OSError, inst:
  2215     except OSError, inst:
  2216         if hasattr(inst, "filename"):
  2216         if hasattr(inst, "filename"):
  2217             u.warn("abort: %s: %s\n" % (inst.strerror, inst.filename))
  2217             u.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
  2218         else:
  2218         else:
  2219             u.warn("abort: %s\n" % inst.strerror)
  2219             u.warn(_("abort: %s\n") % inst.strerror)
  2220     except util.Abort, inst:
  2220     except util.Abort, inst:
  2221         u.warn('abort: ', inst.args[0] % inst.args[1:], '\n')
  2221         u.warn(_('abort: '), inst.args[0] % inst.args[1:], '\n')
  2222         sys.exit(1)
  2222         sys.exit(1)
  2223     except TypeError, inst:
  2223     except TypeError, inst:
  2224         # was this an argument error?
  2224         # was this an argument error?
  2225         tb = traceback.extract_tb(sys.exc_info()[2])
  2225         tb = traceback.extract_tb(sys.exc_info()[2])
  2226         if len(tb) > 2: # no
  2226         if len(tb) > 2: # no
  2227             raise
  2227             raise
  2228         u.debug(inst, "\n")
  2228         u.debug(inst, "\n")
  2229         u.warn("%s: invalid arguments\n" % cmd)
  2229         u.warn(_("%s: invalid arguments\n") % cmd)
  2230         help_(u, cmd)
  2230         help_(u, cmd)
  2231     except UnknownCommand, inst:
  2231     except UnknownCommand, inst:
  2232         u.warn("hg: unknown command '%s'\n" % inst.args[0])
  2232         u.warn(_("hg: unknown command '%s'\n") % inst.args[0])
  2233         help_(u, 'shortlist')
  2233         help_(u, 'shortlist')
  2234     except SystemExit:
  2234     except SystemExit:
  2235         # don't catch this in the catch-all below
  2235         # don't catch this in the catch-all below
  2236         raise
  2236         raise
  2237     except:
  2237     except:
  2238         u.warn("** unknown exception encountered, details follow\n")
  2238         u.warn(_("** unknown exception encountered, details follow\n"))
  2239         u.warn("** report bug details to mercurial@selenic.com\n")
  2239         u.warn(_("** report bug details to mercurial@selenic.com\n"))
  2240         raise
  2240         raise
  2241 
  2241 
  2242     sys.exit(-1)
  2242     sys.exit(-1)