mirror of
https://github.com/facebook/sapling.git
synced 2024-10-09 00:14:35 +03:00
5d3d0e1d77
Mercurial extensions are not meant to be normal python package/module. Yet the lack of an official location to install them means that a lot of them actually install as root level python package, polluting the global Python package namespace and risking collision with more legit packages. As we recently discovered, core python actually support namespace package. A way for multiples distinct "distribution" to share a common top level package without fear of installation headache. (Namespace package allow submodule installed in different location (of the 'sys.path') to be imported properly. So we are fine as long as extension includes a proper 'hgext3rd.__init__.py' to declare the namespace package.) Therefore we introduce a 'hgext3rd' namespace packages and search for extension in it. We'll then recommend third extensions to install themselves in it. Strictly speaking we could just get third party extensions to install in 'hgext' as it is also a namespace package. However, this would make the integration of formerly third party extensions in the main distribution more complicated as the third party install would overwrite the file from the main install. Moreover, having an explicit split between third party and core extensions seems like a good idea. The name 'hgext3rd' have been picked because it is short and seems explicit enough. Other alternative I could think of where: - hgextcontrib - hgextother - hgextunofficial
74 lines
2.6 KiB
Perl
74 lines
2.6 KiB
Perl
$ echo 'raise Exception("bit bucket overflow")' > badext.py
|
|
$ abspathexc=`pwd`/badext.py
|
|
|
|
$ cat >baddocext.py <<EOF
|
|
> """
|
|
> baddocext is bad
|
|
> """
|
|
> EOF
|
|
$ abspathdoc=`pwd`/baddocext.py
|
|
|
|
$ cat <<EOF >> $HGRCPATH
|
|
> [extensions]
|
|
> gpg =
|
|
> hgext.gpg =
|
|
> badext = $abspathexc
|
|
> baddocext = $abspathdoc
|
|
> badext2 =
|
|
> EOF
|
|
|
|
$ hg -q help help 2>&1 |grep extension
|
|
*** failed to import extension badext from $TESTTMP/badext.py: bit bucket overflow
|
|
*** failed to import extension badext2: No module named badext2
|
|
|
|
show traceback
|
|
|
|
$ hg -q help help --traceback 2>&1 | egrep ' extension|^Exception|Traceback|ImportError'
|
|
*** failed to import extension badext from $TESTTMP/badext.py: bit bucket overflow
|
|
Traceback (most recent call last):
|
|
Exception: bit bucket overflow
|
|
*** failed to import extension badext2: No module named badext2
|
|
Traceback (most recent call last):
|
|
ImportError: No module named badext2
|
|
|
|
names of extensions failed to load can be accessed via extensions.notloaded()
|
|
|
|
$ cat <<EOF > showbadexts.py
|
|
> from mercurial import cmdutil, commands, extensions
|
|
> cmdtable = {}
|
|
> command = cmdutil.command(cmdtable)
|
|
> @command('showbadexts', norepo=True)
|
|
> def showbadexts(ui, *pats, **opts):
|
|
> ui.write('BADEXTS: %s\n' % ' '.join(sorted(extensions.notloaded())))
|
|
> EOF
|
|
$ hg --config extensions.badexts=showbadexts.py showbadexts 2>&1 | grep '^BADEXTS'
|
|
BADEXTS: badext badext2
|
|
|
|
show traceback for ImportError of hgext.name if debug is set
|
|
(note that --debug option isn't applied yet when loading extensions)
|
|
|
|
$ (hg -q help help --traceback --config ui.debug=True 2>&1) \
|
|
> | grep -v '^ ' \
|
|
> | egrep 'extension..[^p]|^Exception|Traceback|ImportError|not import'
|
|
*** failed to import extension badext from $TESTTMP/badext.py: bit bucket overflow
|
|
Traceback (most recent call last):
|
|
Exception: bit bucket overflow
|
|
could not import hgext.badext2 (No module named *badext2): trying badext2 (glob)
|
|
Traceback (most recent call last):
|
|
ImportError: No module named *badext2 (glob)
|
|
could not import hgext3rd.badext2 (No module named badext2): trying badext2
|
|
Traceback (most recent call last):
|
|
ImportError: No module named badext2
|
|
*** failed to import extension badext2: No module named badext2
|
|
Traceback (most recent call last):
|
|
ImportError: No module named badext2
|
|
|
|
confirm that there's no crash when an extension's documentation is bad
|
|
|
|
$ hg help --keyword baddocext
|
|
*** failed to import extension badext from $TESTTMP/badext.py: bit bucket overflow
|
|
*** failed to import extension badext2: No module named badext2
|
|
Topics:
|
|
|
|
extensions Using Additional Features
|