Mercurial > public > mercurial-scm > hg
comparison mercurial/extensions.py @ 37974:b45f4c1532c0
extensions: extract closure that looks for commands from disabled module
I'll rewrite this function to not load disabled extensions.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Thu, 03 May 2018 18:15:43 +0900 |
parents | 5b60f7d652f2 |
children | 6e526b0961a8 |
comparison
equal
deleted
inserted
replaced
37973:5b60f7d652f2 | 37974:b45f4c1532c0 |
---|---|
653 | 653 |
654 paths = _disabledpaths() | 654 paths = _disabledpaths() |
655 if name in paths: | 655 if name in paths: |
656 return _disabledhelp(paths[name]) | 656 return _disabledhelp(paths[name]) |
657 | 657 |
658 def _finddisabledcmd(ui, cmd, name, path, strict): | |
659 try: | |
660 mod = loadpath(path, 'hgext.%s' % name) | |
661 except Exception: | |
662 return | |
663 try: | |
664 aliases, entry = cmdutil.findcmd(cmd, | |
665 getattr(mod, 'cmdtable', {}), strict) | |
666 except (error.AmbiguousCommand, error.UnknownCommand): | |
667 return | |
668 except Exception: | |
669 ui.warn(_('warning: error finding commands in %s\n') % path) | |
670 ui.traceback() | |
671 return | |
672 for c in aliases: | |
673 if c.startswith(cmd): | |
674 cmd = c | |
675 break | |
676 else: | |
677 cmd = aliases[0] | |
678 return (cmd, name, mod) | |
679 | |
658 def disabledcmd(ui, cmd, strict=False): | 680 def disabledcmd(ui, cmd, strict=False): |
659 '''import disabled extensions until cmd is found. | 681 '''import disabled extensions until cmd is found. |
660 returns (cmdname, extname, module)''' | 682 returns (cmdname, extname, module)''' |
661 | 683 |
662 paths = _disabledpaths(strip_init=True) | 684 paths = _disabledpaths(strip_init=True) |
663 if not paths: | 685 if not paths: |
664 raise error.UnknownCommand(cmd) | 686 raise error.UnknownCommand(cmd) |
665 | |
666 def findcmd(cmd, name, path): | |
667 try: | |
668 mod = loadpath(path, 'hgext.%s' % name) | |
669 except Exception: | |
670 return | |
671 try: | |
672 aliases, entry = cmdutil.findcmd(cmd, | |
673 getattr(mod, 'cmdtable', {}), strict) | |
674 except (error.AmbiguousCommand, error.UnknownCommand): | |
675 return | |
676 except Exception: | |
677 ui.warn(_('warning: error finding commands in %s\n') % path) | |
678 ui.traceback() | |
679 return | |
680 for c in aliases: | |
681 if c.startswith(cmd): | |
682 cmd = c | |
683 break | |
684 else: | |
685 cmd = aliases[0] | |
686 return (cmd, name, mod) | |
687 | 687 |
688 ext = None | 688 ext = None |
689 # first, search for an extension with the same name as the command | 689 # first, search for an extension with the same name as the command |
690 path = paths.pop(cmd, None) | 690 path = paths.pop(cmd, None) |
691 if path: | 691 if path: |
692 ext = findcmd(cmd, cmd, path) | 692 ext = _finddisabledcmd(ui, cmd, cmd, path, strict=strict) |
693 if not ext: | 693 if not ext: |
694 # otherwise, interrogate each extension until there's a match | 694 # otherwise, interrogate each extension until there's a match |
695 for name, path in paths.iteritems(): | 695 for name, path in paths.iteritems(): |
696 ext = findcmd(cmd, name, path) | 696 ext = _finddisabledcmd(ui, cmd, name, path, strict=strict) |
697 if ext: | 697 if ext: |
698 break | 698 break |
699 if ext: | 699 if ext: |
700 return ext | 700 return ext |
701 | 701 |