Mercurial > hg
comparison hgext/extdiff.py @ 45410:2d08dcf8fd9e
extdiff: refactor cmdline and gui calculation login in a separate fn
This is some good logic with handling of many config items and various ways of
specifying it. I want to reuse in `diff --tool` and hence refatcored it in a
separate function of it's own.
author | Pulkit Goyal <7895pulkit@gmail.com> |
---|---|
date | Wed, 02 Sep 2020 19:46:55 +0530 |
parents | a28da102fd36 |
children | 89a2afe31e82 |
comparison
equal
deleted
inserted
replaced
45409:a28da102fd36 | 45410:2d08dcf8fd9e |
---|---|
707 return dodiff( | 707 return dodiff( |
708 ui, repo, self._cmdline + options, pats, opts, guitool=self._isgui | 708 ui, repo, self._cmdline + options, pats, opts, guitool=self._isgui |
709 ) | 709 ) |
710 | 710 |
711 | 711 |
712 def _gettooldetails(ui, cmd, path): | |
713 """ | |
714 returns following things for a | |
715 ``` | |
716 [extdiff] | |
717 <cmd> = <path> | |
718 ``` | |
719 entry: | |
720 | |
721 cmd: command/tool name | |
722 path: path to the tool | |
723 cmdline: the command which should be run | |
724 isgui: whether the tool uses GUI or not | |
725 | |
726 Reads all external tools related configs, whether it be extdiff section, | |
727 diff-tools or merge-tools section, or its specified in an old format or | |
728 the latest format. | |
729 """ | |
730 path = util.expandpath(path) | |
731 if cmd.startswith(b'cmd.'): | |
732 cmd = cmd[4:] | |
733 if not path: | |
734 path = procutil.findexe(cmd) | |
735 if path is None: | |
736 path = filemerge.findexternaltool(ui, cmd) or cmd | |
737 diffopts = ui.config(b'extdiff', b'opts.' + cmd) | |
738 cmdline = procutil.shellquote(path) | |
739 if diffopts: | |
740 cmdline += b' ' + diffopts | |
741 isgui = ui.configbool(b'extdiff', b'gui.' + cmd) | |
742 else: | |
743 if path: | |
744 # case "cmd = path opts" | |
745 cmdline = path | |
746 diffopts = len(pycompat.shlexsplit(cmdline)) > 1 | |
747 else: | |
748 # case "cmd =" | |
749 path = procutil.findexe(cmd) | |
750 if path is None: | |
751 path = filemerge.findexternaltool(ui, cmd) or cmd | |
752 cmdline = procutil.shellquote(path) | |
753 diffopts = False | |
754 isgui = ui.configbool(b'extdiff', b'gui.' + cmd) | |
755 # look for diff arguments in [diff-tools] then [merge-tools] | |
756 if not diffopts: | |
757 key = cmd + b'.diffargs' | |
758 for section in (b'diff-tools', b'merge-tools'): | |
759 args = ui.config(section, key) | |
760 if args: | |
761 cmdline += b' ' + args | |
762 if isgui is None: | |
763 isgui = ui.configbool(section, cmd + b'.gui') or False | |
764 break | |
765 return cmd, path, cmdline, isgui | |
766 | |
767 | |
712 def uisetup(ui): | 768 def uisetup(ui): |
713 for cmd, path in ui.configitems(b'extdiff'): | 769 for cmd, path in ui.configitems(b'extdiff'): |
714 if cmd.startswith(b'opts.') or cmd.startswith(b'gui.'): | 770 if cmd.startswith(b'opts.') or cmd.startswith(b'gui.'): |
715 continue | 771 continue |
716 path = util.expandpath(path) | 772 cmd, path, cmdline, isgui = _gettooldetails(ui, cmd, path) |
717 if cmd.startswith(b'cmd.'): | |
718 cmd = cmd[4:] | |
719 if not path: | |
720 path = procutil.findexe(cmd) | |
721 if path is None: | |
722 path = filemerge.findexternaltool(ui, cmd) or cmd | |
723 diffopts = ui.config(b'extdiff', b'opts.' + cmd) | |
724 cmdline = procutil.shellquote(path) | |
725 if diffopts: | |
726 cmdline += b' ' + diffopts | |
727 isgui = ui.configbool(b'extdiff', b'gui.' + cmd) | |
728 else: | |
729 if path: | |
730 # case "cmd = path opts" | |
731 cmdline = path | |
732 diffopts = len(pycompat.shlexsplit(cmdline)) > 1 | |
733 else: | |
734 # case "cmd =" | |
735 path = procutil.findexe(cmd) | |
736 if path is None: | |
737 path = filemerge.findexternaltool(ui, cmd) or cmd | |
738 cmdline = procutil.shellquote(path) | |
739 diffopts = False | |
740 isgui = ui.configbool(b'extdiff', b'gui.' + cmd) | |
741 # look for diff arguments in [diff-tools] then [merge-tools] | |
742 if not diffopts: | |
743 key = cmd + b'.diffargs' | |
744 for section in (b'diff-tools', b'merge-tools'): | |
745 args = ui.config(section, key) | |
746 if args: | |
747 cmdline += b' ' + args | |
748 if isgui is None: | |
749 isgui = ui.configbool(section, cmd + b'.gui') or False | |
750 break | |
751 command( | 773 command( |
752 cmd, | 774 cmd, |
753 extdiffopts[:], | 775 extdiffopts[:], |
754 _(b'hg %s [OPTION]... [FILE]...') % cmd, | 776 _(b'hg %s [OPTION]... [FILE]...') % cmd, |
755 helpcategory=command.CATEGORY_FILE_CONTENTS, | 777 helpcategory=command.CATEGORY_FILE_CONTENTS, |