Mercurial > public > mercurial-scm > hg
comparison mercurial/extensions.py @ 50925:d718eddf01d9
safehasattr: drop usage in favor of hasattr
The two functions should now be equivalent at least in their usage in core.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 31 Aug 2023 23:56:15 +0200 |
parents | c642c03969ff |
children | 18c8c18993f0 |
comparison
equal
deleted
inserted
replaced
50924:7a8ea1397816 | 50925:d718eddf01d9 |
---|---|
170 | 170 |
171 def _validatecmdtable(ui, cmdtable): | 171 def _validatecmdtable(ui, cmdtable): |
172 """Check if extension commands have required attributes""" | 172 """Check if extension commands have required attributes""" |
173 for c, e in cmdtable.items(): | 173 for c, e in cmdtable.items(): |
174 f = e[0] | 174 f = e[0] |
175 missing = [a for a in _cmdfuncattrs if not util.safehasattr(f, a)] | 175 missing = [a for a in _cmdfuncattrs if not hasattr(f, a)] |
176 if not missing: | 176 if not missing: |
177 continue | 177 continue |
178 msg = b'missing attributes: %s' | 178 msg = b'missing attributes: %s' |
179 msg %= b', '.join([stringutil.forcebytestr(m) for m in missing]) | 179 msg %= b', '.join([stringutil.forcebytestr(m) for m in missing]) |
180 hint = b"use @command decorator to register '%s'" % c | 180 hint = b"use @command decorator to register '%s'" % c |
740 | 740 |
741 exts = {} | 741 exts = {} |
742 | 742 |
743 # The hgext might not have a __file__ attribute (e.g. in PyOxidizer) and | 743 # The hgext might not have a __file__ attribute (e.g. in PyOxidizer) and |
744 # it might not be on a filesystem even if it does. | 744 # it might not be on a filesystem even if it does. |
745 if util.safehasattr(hgext, '__file__'): | 745 if hasattr(hgext, '__file__'): |
746 extpath = os.path.dirname( | 746 extpath = os.path.dirname( |
747 util.abspath(pycompat.fsencode(hgext.__file__)) | 747 util.abspath(pycompat.fsencode(hgext.__file__)) |
748 ) | 748 ) |
749 try: | 749 try: |
750 files = os.listdir(extpath) | 750 files = os.listdir(extpath) |
855 import hgext | 855 import hgext |
856 from hgext import __index__ # pytype: disable=import-error | 856 from hgext import __index__ # pytype: disable=import-error |
857 | 857 |
858 # The extensions are filesystem based, so either an error occurred | 858 # The extensions are filesystem based, so either an error occurred |
859 # or all are enabled. | 859 # or all are enabled. |
860 if util.safehasattr(hgext, '__file__'): | 860 if hasattr(hgext, '__file__'): |
861 return | 861 return |
862 | 862 |
863 if name in _order: # enabled | 863 if name in _order: # enabled |
864 return | 864 return |
865 else: | 865 else: |
985 return [name for name, mod in _extensions.items() if mod is None] | 985 return [name for name, mod in _extensions.items() if mod is None] |
986 | 986 |
987 | 987 |
988 def moduleversion(module): | 988 def moduleversion(module): |
989 '''return version information from given module as a string''' | 989 '''return version information from given module as a string''' |
990 if util.safehasattr(module, 'getversion') and callable(module.getversion): | 990 if hasattr(module, 'getversion') and callable(module.getversion): |
991 try: | 991 try: |
992 version = module.getversion() | 992 version = module.getversion() |
993 except Exception: | 993 except Exception: |
994 version = b'unknown' | 994 version = b'unknown' |
995 | 995 |
996 elif util.safehasattr(module, '__version__'): | 996 elif hasattr(module, '__version__'): |
997 version = module.__version__ | 997 version = module.__version__ |
998 else: | 998 else: |
999 version = b'' | 999 version = b'' |
1000 if isinstance(version, (list, tuple)): | 1000 if isinstance(version, (list, tuple)): |
1001 version = b'.'.join(pycompat.bytestr(o) for o in version) | 1001 version = b'.'.join(pycompat.bytestr(o) for o in version) |