Mercurial > hg
comparison mercurial/dispatch.py @ 29132:12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Before this patch, we may or may not load extensions for shell aliases
depending on whether the command is abbreviated or not.
Loading extensions may have useful side effects to shell aliases. For example,
the pager extension does not work for shell aliases.
This patch removes the code checking shell aliases before loading extensions
to give the user a more consistent experience. It may hurt performance for
shell aliases a bit without chg but the correctness seems worth it. It will
also make the behavior consistent with chg since chg will always load all
extensions before running commands.
author | Jun Wu <quark@fb.com> |
---|---|
date | Sat, 07 May 2016 14:12:23 +0100 |
parents | e6dfb0e4eeef |
children | 39149b6036e6 |
comparison
equal
deleted
inserted
replaced
29131:8a66eda46c98 | 29132:12769703d4ba |
---|---|
668 lui = ui.copy() | 668 lui = ui.copy() |
669 lui.readconfig(os.path.join(path, ".hg", "hgrc"), path) | 669 lui.readconfig(os.path.join(path, ".hg", "hgrc"), path) |
670 | 670 |
671 return path, lui | 671 return path, lui |
672 | 672 |
673 def _checkshellalias(lui, ui, args, precheck=True): | 673 def _checkshellalias(lui, ui, args): |
674 """Return the function to run the shell alias, if it is required | 674 """Return the function to run the shell alias, if it is required""" |
675 | |
676 'precheck' is whether this function is invoked before adding | |
677 aliases or not. | |
678 """ | |
679 options = {} | 675 options = {} |
680 | 676 |
681 try: | 677 try: |
682 args = fancyopts.fancyopts(args, commands.globalopts, options) | 678 args = fancyopts.fancyopts(args, commands.globalopts, options) |
683 except fancyopts.getopt.GetoptError: | 679 except fancyopts.getopt.GetoptError: |
684 return | 680 return |
685 | 681 |
686 if not args: | 682 if not args: |
687 return | 683 return |
688 | 684 |
689 if precheck: | 685 cmdtable = commands.table |
690 strict = True | |
691 cmdtable = commands.table.copy() | |
692 addaliases(lui, cmdtable) | |
693 else: | |
694 strict = False | |
695 cmdtable = commands.table | |
696 | 686 |
697 cmd = args[0] | 687 cmd = args[0] |
698 try: | 688 try: |
689 strict = ui.configbool("ui", "strict") | |
699 aliases, entry = cmdutil.findcmd(cmd, cmdtable, strict) | 690 aliases, entry = cmdutil.findcmd(cmd, cmdtable, strict) |
700 except (error.AmbiguousCommand, error.UnknownCommand): | 691 except (error.AmbiguousCommand, error.UnknownCommand): |
701 return | 692 return |
702 | 693 |
703 cmd = aliases[0] | 694 cmd = aliases[0] |
743 os.chdir(cwd[-1]) | 734 os.chdir(cwd[-1]) |
744 | 735 |
745 rpath = _earlygetopt(["-R", "--repository", "--repo"], args) | 736 rpath = _earlygetopt(["-R", "--repository", "--repo"], args) |
746 path, lui = _getlocal(ui, rpath) | 737 path, lui = _getlocal(ui, rpath) |
747 | 738 |
748 # Now that we're operating in the right directory/repository with | |
749 # the right config settings, check for shell aliases | |
750 shellaliasfn = _checkshellalias(lui, ui, args) | |
751 if shellaliasfn: | |
752 return shellaliasfn() | |
753 | |
754 # Configure extensions in phases: uisetup, extsetup, cmdtable, and | 739 # Configure extensions in phases: uisetup, extsetup, cmdtable, and |
755 # reposetup. Programs like TortoiseHg will call _dispatch several | 740 # reposetup. Programs like TortoiseHg will call _dispatch several |
756 # times so we keep track of configured extensions in _loaded. | 741 # times so we keep track of configured extensions in _loaded. |
757 extensions.loadall(lui) | 742 extensions.loadall(lui) |
758 exts = [ext for ext in extensions.extensions() if ext[0] not in _loaded] | 743 exts = [ext for ext in extensions.extensions() if ext[0] not in _loaded] |
770 | 755 |
771 # (reposetup is handled in hg.repository) | 756 # (reposetup is handled in hg.repository) |
772 | 757 |
773 addaliases(lui, commands.table) | 758 addaliases(lui, commands.table) |
774 | 759 |
775 if not lui.configbool("ui", "strict"): | 760 # All aliases and commands are completely defined, now. |
776 # All aliases and commands are completely defined, now. | 761 # Check abbreviation/ambiguity of shell alias. |
777 # Check abbreviation/ambiguity of shell alias again, because shell | 762 shellaliasfn = _checkshellalias(lui, ui, args) |
778 # alias may cause failure of "_parse" (see issue4355) | 763 if shellaliasfn: |
779 shellaliasfn = _checkshellalias(lui, ui, args, precheck=False) | 764 return shellaliasfn() |
780 if shellaliasfn: | |
781 return shellaliasfn() | |
782 | 765 |
783 # check for fallback encoding | 766 # check for fallback encoding |
784 fallback = lui.config('ui', 'fallbackencoding') | 767 fallback = lui.config('ui', 'fallbackencoding') |
785 if fallback: | 768 if fallback: |
786 encoding.fallbackencoding = fallback | 769 encoding.fallbackencoding = fallback |