Patchwork [04,of,10] py3: use unicode literals in pycompat.py

login
register
mail settings
Submitter Pulkit Goyal
Date Aug. 2, 2016, 8:27 p.m.
Message ID <bed55202ebb207a4a7a5.1470169646@pulkit-goyal>
Download mbox | patch
Permalink /patch/16043/
State Changes Requested
Headers show

Comments

Pulkit Goyal - Aug. 2, 2016, 8:27 p.m.
# HG changeset patch
# User Pulkit Goyal <7895pulkit@gmail.com>
# Date 1470165929 -19800
#      Wed Aug 03 00:55:29 2016 +0530
# Node ID bed55202ebb207a4a7a532135c808e2b62ec6ac8
# Parent  184be5c73cededc590bca889b6c17889345e1039
py3: use unicode literals in pycompat.py

The items list literals later in the file are using string literals.
These will get rewritten to bytes literals courtesy of our module
importer. We add some code to convert them back to str and use the
appropriate type for arguments to .replace().
Yuya Nishihara - Aug. 3, 2016, 1:43 p.m.
On Wed, 03 Aug 2016 01:57:26 +0530, Pulkit Goyal wrote:
> # HG changeset patch
> # User Pulkit Goyal <7895pulkit@gmail.com>
> # Date 1470165929 -19800
> #      Wed Aug 03 00:55:29 2016 +0530
> # Node ID bed55202ebb207a4a7a532135c808e2b62ec6ac8
> # Parent  184be5c73cededc590bca889b6c17889345e1039
> py3: use unicode literals in pycompat.py
           ^^^^^^^^^^^^^^^^
Nit: strictly speaking, this patch doesn't (always) use unicode literals.

> The items list literals later in the file are using string literals.
> These will get rewritten to bytes literals courtesy of our module
> importer. We add some code to convert them back to str and use the
> appropriate type for arguments to .replace().
> 
> diff -r 184be5c73ced -r bed55202ebb2 mercurial/pycompat.py
> --- a/mercurial/pycompat.py	Wed Aug 03 00:45:11 2016 +0530
> +++ b/mercurial/pycompat.py	Wed Aug 03 00:55:29 2016 +0530
> @@ -42,8 +42,10 @@
>      copies items from origin to alias
>      """
>      def hgcase(item):
> -        return item.replace('_', '').lower()
> +        return item.replace(u'_', u'').lower()
>      for item in items:
> +        if not isinstance(item, str):
> +            item = item.decode(u'latin1')

If _alias() expects a list of bytes items, I'd rather do item.decode() without
checking its type.

>          try:
>              setattr(alias, hgcase(item), getattr(origin, item))

Patch

diff -r 184be5c73ced -r bed55202ebb2 mercurial/pycompat.py
--- a/mercurial/pycompat.py	Wed Aug 03 00:45:11 2016 +0530
+++ b/mercurial/pycompat.py	Wed Aug 03 00:55:29 2016 +0530
@@ -42,8 +42,10 @@ 
     copies items from origin to alias
     """
     def hgcase(item):
-        return item.replace('_', '').lower()
+        return item.replace(u'_', u'').lower()
     for item in items:
+        if not isinstance(item, str):
+            item = item.decode(u'latin1')
         try:
             setattr(alias, hgcase(item), getattr(origin, item))
         except AttributeError:
diff -r 184be5c73ced -r bed55202ebb2 tests/test-check-py3-compat.t
--- a/tests/test-check-py3-compat.t	Wed Aug 03 00:45:11 2016 +0530
+++ b/tests/test-check-py3-compat.t	Wed Aug 03 00:55:29 2016 +0530
@@ -15,96 +15,96 @@ 
 #if py3exe
   $ hg files 'set:(**.py)' | sed 's|\\|/|g' | xargs $PYTHON3 contrib/check-py3-compat.py
   doc/hgmanpage.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
-  hgext/acl.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  hgext/acl.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   hgext/automv.py: error importing module: <SyntaxError> invalid syntax (commands.py, line *) (line *) (glob)
-  hgext/blackbox.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/bugzilla.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/censor.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/chgserver.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/children.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/churn.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/clonebundles.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  hgext/blackbox.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/bugzilla.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/censor.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/chgserver.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/children.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/churn.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/clonebundles.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   hgext/color.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
   hgext/convert/bzr.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
-  hgext/convert/common.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/convert/convcmd.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/convert/cvs.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/convert/cvsps.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/convert/darcs.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  hgext/convert/common.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/convert/convcmd.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/convert/cvs.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/convert/cvsps.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/convert/darcs.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   hgext/convert/filemap.py: error importing module: <SystemError> Parent module 'hgext.convert' not loaded, cannot perform relative import (line *) (glob)
-  hgext/convert/git.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/convert/gnuarch.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/convert/hg.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/convert/monotone.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/convert/p4.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/convert/subversion.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  hgext/convert/git.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/convert/gnuarch.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/convert/hg.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/convert/monotone.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/convert/p4.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/convert/subversion.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   hgext/convert/transport.py: error importing module: <ImportError> No module named 'svn.client' (line *) (glob)
-  hgext/eol.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  hgext/eol.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   hgext/extdiff.py: error importing module: <SyntaxError> invalid syntax (archival.py, line *) (line *) (glob)
-  hgext/factotum.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/fetch.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/fsmonitor/state.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/fsmonitor/watchmanclient.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/gpg.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/graphlog.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/hgk.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/highlight/highlight.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  hgext/factotum.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/fetch.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/fsmonitor/state.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/fsmonitor/watchmanclient.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/gpg.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/graphlog.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/hgk.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/highlight/highlight.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   hgext/histedit.py: error importing module: <SyntaxError> invalid syntax (bundle2.py, line *) (line *) (glob)
-  hgext/journal.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/keyword.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/largefiles/basestore.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/largefiles/lfcommands.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/largefiles/lfutil.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  hgext/journal.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/keyword.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/largefiles/basestore.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/largefiles/lfcommands.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/largefiles/lfutil.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   hgext/largefiles/localstore.py: error importing module: <SystemError> Parent module 'hgext.largefiles' not loaded, cannot perform relative import (line *) (glob)
   hgext/largefiles/overrides.py: error importing module: <SyntaxError> invalid syntax (archival.py, line *) (line *) (glob)
   hgext/largefiles/proto.py: error importing: <SyntaxError> invalid syntax (bundle2.py, line *) (error at httppeer.py:*) (glob)
-  hgext/largefiles/remotestore.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/largefiles/reposetup.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/largefiles/storefactory.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/largefiles/uisetup.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  hgext/largefiles/remotestore.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/largefiles/reposetup.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/largefiles/storefactory.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/largefiles/uisetup.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   hgext/largefiles/wirestore.py: error importing module: <SystemError> Parent module 'hgext.largefiles' not loaded, cannot perform relative import (line *) (glob)
-  hgext/mq.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/notify.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/pager.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/patchbomb.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/purge.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/rebase.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/record.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/relink.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/schemes.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  hgext/share.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  hgext/mq.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/notify.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/pager.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/patchbomb.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/purge.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/rebase.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/record.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/relink.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/schemes.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  hgext/share.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   hgext/shelve.py: error importing module: <SyntaxError> invalid syntax (bundle2.py, line 992) (line *) (glob)
-  hgext/strip.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  hgext/strip.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   hgext/transplant.py: error importing: <SyntaxError> invalid syntax (bundle2.py, line 992) (error at bundlerepo.py:*) (glob)
-  hgext/win32text.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  hgext/win32text.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   mercurial/archival.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
-  mercurial/bookmarks.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/branchmap.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  mercurial/bookmarks.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/branchmap.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   mercurial/bundle2.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
   mercurial/bundlerepo.py: error importing module: <SyntaxError> invalid syntax (bundle2.py, line *) (line *) (glob)
-  mercurial/byterange.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/changegroup.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/changelog.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/cmdutil.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  mercurial/byterange.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/changegroup.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/changelog.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/cmdutil.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   mercurial/commands.py: invalid syntax: invalid syntax (<unknown>, line *) (glob)
-  mercurial/commandserver.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/config.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/context.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/copies.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/crecord.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/destutil.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/dirstate.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/discovery.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/dispatch.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/exchange.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/extensions.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/filelog.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/filemerge.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/fileset.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/formatter.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/graphmod.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/help.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/hg.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  mercurial/commandserver.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/config.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/context.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/copies.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/crecord.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/destutil.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/dirstate.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/discovery.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/dispatch.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/exchange.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/extensions.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/filelog.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/filemerge.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/fileset.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/formatter.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/graphmod.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/help.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/hg.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   mercurial/hgweb/common.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
   mercurial/hgweb/hgweb_mod.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
   mercurial/hgweb/hgwebdir_mod.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
@@ -114,28 +114,28 @@ 
   mercurial/hgweb/webcommands.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
   mercurial/hgweb/webutil.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
   mercurial/hgweb/wsgicgi.py: error importing module: <SystemError> Parent module 'mercurial.hgweb' not loaded, cannot perform relative import (line *) (glob)
-  mercurial/hook.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/httpconnection.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  mercurial/hook.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/httpconnection.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   mercurial/httppeer.py: error importing module: <SyntaxError> invalid syntax (bundle2.py, line *) (line *) (glob)
-  mercurial/keepalive.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/localrepo.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/lock.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/mail.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/manifest.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/match.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/mdiff.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/merge.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/minirst.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/namespaces.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/obsolete.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/patch.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/pathutil.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/peer.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  mercurial/keepalive.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/localrepo.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/lock.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/mail.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/manifest.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/match.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/mdiff.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/merge.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/minirst.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/namespaces.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/obsolete.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/patch.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/pathutil.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/peer.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   mercurial/pure/mpatch.py: error importing module: <ImportError> cannot import name 'pycompat' (line *) (glob)
   mercurial/pure/osutil.py: error importing module: <ImportError> cannot import name 'policy' (line *) (glob)
   mercurial/pure/parsers.py: error importing module: <ImportError> No module named 'mercurial.pure.node' (line *) (glob)
-  mercurial/pushkey.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
-  mercurial/pvec.py: error importing: <TypeError> getattr(): attribute name must be string (error at pycompat.py:*) (glob)
+  mercurial/pushkey.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
+  mercurial/pvec.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   mercurial/registrar.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)
   mercurial/repair.py: error importing module: <SyntaxError> invalid syntax (bundle2.py, line *) (line *) (glob)
   mercurial/repoview.py: error importing: <TypeError> getattr(): attribute name must be string (error at util.py:*) (glob)