comparison mercurial/dispatch.py @ 27623:b3376fba4ab9

dispatch: report similar names consistently
author Bryan O'Sullivan <bos@serpentine.com>
date Mon, 04 Jan 2016 21:52:44 -0800
parents 4030d3b79953
children 707d66afce21
comparison
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)