mercurial/dispatch.py
changeset 27623 b3376fba4ab9
parent 27615 4030d3b79953
child 27628 707d66afce21
equal deleted inserted replaced
27622:0bc71f45d362 27623:b3376fba4ab9
    57     sim = lambda x: difflib.SequenceMatcher(None, value, x).ratio()
    57     sim = lambda x: difflib.SequenceMatcher(None, value, x).ratio()
    58     # The cutoff for similarity here is pretty arbitrary. It should
    58     # The cutoff for similarity here is pretty arbitrary. It should
    59     # probably be investigated and tweaked.
    59     # probably be investigated and tweaked.
    60     return [s for s in symbols if sim(s) > 0.6]
    60     return [s for s in symbols if sim(s) > 0.6]
    61 
    61 
       
    62 def _reportsimilar(write, similar):
       
    63     if len(similar) == 1:
       
    64         write(_("(did you mean %s?)\n") % similar[0])
       
    65     elif similar:
       
    66         ss = ", ".join(sorted(similar))
       
    67         write(_("(did you mean one of %s?)\n") % ss)
       
    68 
    62 def _formatparse(write, inst):
    69 def _formatparse(write, inst):
    63     similar = []
    70     similar = []
    64     if isinstance(inst, error.UnknownIdentifier):
    71     if isinstance(inst, error.UnknownIdentifier):
    65         # make sure to check fileset first, as revset can invoke fileset
    72         # make sure to check fileset first, as revset can invoke fileset
    66         similar = _getsimilar(inst.symbols, inst.function)
    73         similar = _getsimilar(inst.symbols, inst.function)
    69                          (inst.args[1], inst.args[0]))
    76                          (inst.args[1], inst.args[0]))
    70         if (inst.args[0][0] == ' '):
    77         if (inst.args[0][0] == ' '):
    71             write(_("unexpected leading whitespace\n"))
    78             write(_("unexpected leading whitespace\n"))
    72     else:
    79     else:
    73         write(_("hg: parse error: %s\n") % inst.args[0])
    80         write(_("hg: parse error: %s\n") % inst.args[0])
    74         if similar:
    81         _reportsimilar(write, similar)
    75             if len(similar) == 1:
       
    76                 write(_("(did you mean %r?)\n") % similar[0])
       
    77             else:
       
    78                 ss = ", ".join(sorted(similar))
       
    79                 write(_("(did you mean one of %s?)\n") % ss)
       
    80 
    82 
    81 def dispatch(req):
    83 def dispatch(req):
    82     "run the command specified in req.args"
    84     "run the command specified in req.args"
    83     if req.ferr:
    85     if req.ferr:
    84         ferr = req.ferr
    86         ferr = req.ferr
   260         except (error.UnknownCommand, error.Abort):
   262         except (error.UnknownCommand, error.Abort):
   261             suggested = False
   263             suggested = False
   262             if len(inst.args) == 2:
   264             if len(inst.args) == 2:
   263                 sim = _getsimilar(inst.args[1], inst.args[0])
   265                 sim = _getsimilar(inst.args[1], inst.args[0])
   264                 if sim:
   266                 if sim:
   265                     ui.warn(_('(did you mean one of %s?)\n') %
   267                     _reportsimilar(ui.warn, sim)
   266                             ', '.join(sorted(sim)))
       
   267                     suggested = True
   268                     suggested = True
   268             if not suggested:
   269             if not suggested:
   269                 commands.help_(ui, 'shortlist')
   270                 commands.help_(ui, 'shortlist')
   270     except error.InterventionRequired as inst:
   271     except error.InterventionRequired as inst:
   271         ui.warn("%s\n" % inst)
   272         ui.warn("%s\n" % inst)