Comments
Patch
@@ -38,6 +38,7 @@ import tempfile
import textwrap
import time
import traceback
+import warnings
import zlib
from . import (
@@ -155,6 +156,31 @@ def bitsfrom(container):
bits |= bit
return bits
+# python 2.6 still have deprecation warning enabled by default. We do not want
+# to display anything to standard user so detect if we are running test and
+# only use python deprecation warning in this case.
+_dowarn = bool(encoding.environ.get('HGEMITWARNINGS'))
+if _dowarn:
+ # explicitly unfilter our warning for python 2.7
+ #
+ # The option of setting PYTHONWARNINGS in the test runner was investigated.
+ # However, module name set through PYTHONWARNINGS was exactly matched, so
+ # we cannot set 'mercurial' and have it match eg: 'mercurial.scmutil'. This
+ # makes the whole PYTHONWARNINGS thing useless for our usecase.
+ warnings.filterwarnings('default', '', DeprecationWarning, 'mercurial')
+ warnings.filterwarnings('default', '', DeprecationWarning, 'hgext')
+ warnings.filterwarnings('default', '', DeprecationWarning, 'hgext3rd')
+
+def nouideprecwarn(msg, version, stacklevel=1):
+ """Issue an python native deprecation warning
+
+ This is a noop outside of tests, use 'ui.deprecwarn' when possible.
+ """
+ if _dowarn:
+ msg += ("\n(compatibility will be dropped after Mercurial-%s,"
+ " update your code.)") % version
+ warnings.warn(msg, DeprecationWarning, stacklevel + 1)
+
DIGESTS = {
'md5': hashlib.md5,
'sha1': hashlib.sha1,
@@ -884,6 +884,7 @@ class Test(unittest.TestCase):
env = os.environ.copy()
if sysconfig is not None:
env['PYTHONUSERBASE'] = sysconfig.get_config_var('userbase')
+ env['HGEMITWARNINGS'] = '1'
env['TESTTMP'] = self._testtmp
env['HOME'] = self._testtmp
# This number should match portneeded in _getport
@@ -3,7 +3,7 @@
> """A small extension that tests our developer warnings
> """
>
- > from mercurial import cmdutil, repair
+ > from mercurial import cmdutil, repair, util
>
> cmdtable = {}
> command = cmdutil.command(cmdtable)
@@ -58,6 +58,9 @@
> def foobar(ui):
> ui.deprecwarn('foorbar is deprecated, go shopping', '42.1337')
> foobar(ui)
+ > @command('nouiwarning', [], '')
+ > def nouiwarning(ui, repo):
+ > util.nouideprecwarn('this is a test', '13.37')
> EOF
$ cat << EOF >> $HGRCPATH
@@ -163,4 +166,15 @@ Test programming error failure:
Traceback (most recent call last):
mercurial.error.ProgrammingError: transaction requires locking
+Old style deprecation warning
+
+ $ hg nouiwarning
+ $TESTTMP/buggylocking.py:61: DeprecationWarning: this is a test
+ (compatibility will be dropped after Mercurial-13.37, update your code.)
+ util.nouideprecwarn('this is a test', '13.37')
+
+(disabled outside of test run)
+
+ $ HGEMITWARNINGS= hg nouiwarning
+
$ cd ..