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) |