You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by tr...@apache.org on 2017/12/31 01:49:15 UTC

svn commit: r1819712 - in /subversion/branches/swig-py3/subversion/bindings/swig/python: svn/ tests/ tests/trac/versioncontrol/

Author: troycurtisjr
Date: Sun Dec 31 01:49:15 2017
New Revision: 1819712

URL: http://svn.apache.org/viewvc?rev=1819712&view=rev
Log:
On branch swig-py3: Create and use a wrapper function to efficiently retrieve
lists from dict object on Python 2 and 3.

Wrapping dict methods such as keys() and values() in list() works to create a
independent list, but on Python 2 two distinct lists are created which is
inefficient.

* subversion/bindings/swig/python/svn/core.py
  Create a new utility function, _as_list(), and remove now unnecessary
  _bi_list alias.
  (svn.core._unprefix_names, svn.core.__all__): Use new _as_list() function in
   place of list() on dict output.

* subversion/bindings/swig/python/svn/client.py,
  subversion/bindings/swig/python/svn/delta.py,
  subversion/bindings/swig/python/svn/diff.py,
  subversion/bindings/swig/python/svn/fs.py,
  subversion/bindings/swig/python/svn/ra.py,
  subversion/bindings/swig/python/svn/repos.py,
  subversion/bindings/swig/python/svn/wc.py,
  subversion/bindings/swig/python/tests/mergeinfo.py,
  subversion/bindings/swig/python/tests/ra.py,
  subversion/bindings/swig/python/tests/repository.py,
  subversion/bindings/swig/python/tests/trac/versioncontrol/svn_fs.py,
  subversion/bindings/swig/python/tests/wc.py
  (svn.client.__all__,
   svn.delta.__all__,
   svn.diff.__all__,
   svn.fs.__all__,
   svn.fs.entries,
   svn.ra.__all__,
   svn.repos.__all__,
   svn.wc.__all__,
   SubversionMergeinfoTestCase.test_mergeinfo_leakage__incorrect_range_t_refcounts,
   SubversionRepositoryAccessTestCase.test_delta_driver_commit,
   SubversionRepositoryAccessTestCase.test_get_log2,
   SubversionChangeset.get_changes,
   SubversionChangeset.get_properties,
   SubversionRepositoryTestCase.test_get_logs,
   SubversionWorkingCopyTestCase.test_entries_read,
   SubversionWorkingCopyTestCase.test_diff_editor4):
  Use new _as_list() function in place of list() on dict output.

Found By: danielsh, brane
    

Modified:
    subversion/branches/swig-py3/subversion/bindings/swig/python/svn/client.py
    subversion/branches/swig-py3/subversion/bindings/swig/python/svn/core.py
    subversion/branches/swig-py3/subversion/bindings/swig/python/svn/delta.py
    subversion/branches/swig-py3/subversion/bindings/swig/python/svn/diff.py
    subversion/branches/swig-py3/subversion/bindings/swig/python/svn/fs.py
    subversion/branches/swig-py3/subversion/bindings/swig/python/svn/ra.py
    subversion/branches/swig-py3/subversion/bindings/swig/python/svn/repos.py
    subversion/branches/swig-py3/subversion/bindings/swig/python/svn/wc.py
    subversion/branches/swig-py3/subversion/bindings/swig/python/tests/mergeinfo.py
    subversion/branches/swig-py3/subversion/bindings/swig/python/tests/ra.py
    subversion/branches/swig-py3/subversion/bindings/swig/python/tests/repository.py
    subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/svn_fs.py
    subversion/branches/swig-py3/subversion/bindings/swig/python/tests/wc.py

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/svn/client.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/svn/client.py?rev=1819712&r1=1819711&r2=1819712&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/svn/client.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/svn/client.py Sun Dec 31 01:49:15 2017
@@ -24,9 +24,8 @@
 ######################################################################
 
 from libsvn.client import *
-from svn.core import _unprefix_names, _bi_list
+from svn.core import _unprefix_names, _as_list
 _unprefix_names(locals(), 'svn_client_')
 _unprefix_names(locals(), 'SVN_CLIENT_')
-__all__ = [x for x in _bi_list(locals()) if x.lower().startswith('svn_')]
+__all__ = [x for x in _as_list(locals()) if x.lower().startswith('svn_')]
 del _unprefix_names
-del _bi_list

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/svn/core.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/svn/core.py?rev=1819712&r1=1819711&r2=1819712&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/svn/core.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/svn/core.py Sun Dec 31 01:49:15 2017
@@ -28,17 +28,6 @@ import libsvn.core as _libsvncore
 import atexit as _atexit
 import sys
 
-# Many of the subversion modules unprefix their names to make
-# the exported methods more natural.  Several have 'list' which
-# conflicts with the builtin 'list'.  Put all the python 2/3
-# conditional import here to reduce code in the other modules
-try:
-  # Python >= 3.0
-  from builtins import list as _bi_list
-except ImportError:
-  # Python < 3.0
-  from __builtin__ import list as _bi_list
-
 # __all__ is defined later, since some svn_* functions are implemented below.
 
 class SubversionException(Exception):
@@ -100,6 +89,20 @@ class SubversionException(Exception):
       child = cls(message, apr_err, child, file, line)
     return child
 
+# This function is useful for common Python 2/3 code. It prevents the double
+# memory hit of simply wrapping values/keys/items calls on dictionaries on
+# python 2, but ensuring an independent list is returned in Python 3.
+def _as_list(seq):
+  """Returns the given sequence or iterator as a list.
+
+  If already a list, simply returns the list, otherwise a list is constructed
+  using the given object.
+  """
+  if isinstance(seq, list):
+    return seq
+
+  return list(seq)
+
 def _cleanup_application_pool():
   """Cleanup the application pool before exiting"""
   if application_pool and application_pool.valid():
@@ -107,7 +110,7 @@ def _cleanup_application_pool():
 _atexit.register(_cleanup_application_pool)
 
 def _unprefix_names(symbol_dict, from_prefix, to_prefix = ''):
-  for name, value in list(symbol_dict.items()):
+  for name, value in _as_list(symbol_dict.items()):
     if name.startswith(from_prefix):
       symbol_dict[to_prefix + name[len(from_prefix):]] = value
 
@@ -330,7 +333,7 @@ def run_app(func, *args, **kw):
 # 'run_app'
 # 'svn_relpath__internal_style' 'svn_uri__is_ancestor'
 # 'svn_tristate__from_word' 'svn_tristate__to_word'
-__all__ = [s for s in _bi_list(locals())
+__all__ = [s for s in _as_list(locals())
            if (s.startswith('svn_')
                or s.startswith('SVN_')
                or s.startswith('SVNSYNC_')

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/svn/delta.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/svn/delta.py?rev=1819712&r1=1819711&r2=1819712&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/svn/delta.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/svn/delta.py Sun Dec 31 01:49:15 2017
@@ -24,12 +24,11 @@
 ######################################################################
 
 from libsvn.delta import *
-from svn.core import _unprefix_names, _bi_list
+from svn.core import _unprefix_names, _as_list
 _unprefix_names(locals(), 'svn_delta_')
 _unprefix_names(locals(), 'svn_txdelta_', 'tx_')
-__all__ = [x for x in _bi_list(locals()) if x.lower().startswith('svn_')]
+__all__ = [x for x in _as_list(locals()) if x.lower().startswith('svn_')]
 del _unprefix_names
-del _bi_list
 
 class Editor:
 

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/svn/diff.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/svn/diff.py?rev=1819712&r1=1819711&r2=1819712&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/svn/diff.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/svn/diff.py Sun Dec 31 01:49:15 2017
@@ -24,8 +24,7 @@
 ######################################################################
 
 from libsvn.diff import *
-from svn.core import _unprefix_names, _bi_list
+from svn.core import _unprefix_names, _as_list
 _unprefix_names(locals(), 'svn_diff_')
-__all__ = [x for x in _bi_list(locals()) if x.lower().startswith('svn_')]
+__all__ = [x for x in _as_list(locals()) if x.lower().startswith('svn_')]
 del _unprefix_names
-del _bi_list

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/svn/fs.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/svn/fs.py?rev=1819712&r1=1819711&r2=1819712&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/svn/fs.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/svn/fs.py Sun Dec 31 01:49:15 2017
@@ -24,10 +24,10 @@
 ######################################################################
 
 from libsvn.fs import *
-from svn.core import _unprefix_names, Pool
+from svn.core import _unprefix_names, Pool, _as_list
 _unprefix_names(locals(), 'svn_fs_')
 _unprefix_names(locals(), 'SVN_FS_')
-__all__ = [x for x in list(locals()) if x.lower().startswith('svn_')]
+__all__ = [x for x in _as_list(locals()) if x.lower().startswith('svn_')]
 del _unprefix_names
 
 
@@ -45,7 +45,7 @@ import svn.core as _svncore
 def entries(root, path, pool=None):
   "Call dir_entries returning a dictionary mappings names to IDs."
   e = dir_entries(root, path, pool)
-  for name, entry in list(e.items()):
+  for name, entry in _as_list(e.items()):
     e[name] = dirent_t_id_get(entry)
   return e
 

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/svn/ra.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/svn/ra.py?rev=1819712&r1=1819711&r2=1819712&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/svn/ra.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/svn/ra.py Sun Dec 31 01:49:15 2017
@@ -24,12 +24,11 @@
 ######################################################################
 
 from libsvn.ra import *
-from svn.core import _unprefix_names, _bi_list
+from svn.core import _unprefix_names, _as_list
 _unprefix_names(locals(), 'svn_ra_')
 _unprefix_names(locals(), 'SVN_RA_')
-__all__ = [x for x in _bi_list(locals()) if x.lower().startswith('svn_')]
+__all__ = [x for x in _as_list(locals()) if x.lower().startswith('svn_')]
 del _unprefix_names
-del _bi_list
 
 class Callbacks:
   """Base class for callbacks structure for svn.ra.open2.

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/svn/repos.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/svn/repos.py?rev=1819712&r1=1819711&r2=1819712&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/svn/repos.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/svn/repos.py Sun Dec 31 01:49:15 2017
@@ -24,12 +24,11 @@
 ######################################################################
 
 from libsvn.repos import *
-from svn.core import _unprefix_names, Pool, _bi_list
+from svn.core import _unprefix_names, Pool, _as_list
 _unprefix_names(locals(), 'svn_repos_')
 _unprefix_names(locals(), 'SVN_REPOS_')
-__all__ = [x for x in _bi_list(locals()) if x.lower().startswith('svn_')]
+__all__ = [x for x in _as_list(locals()) if x.lower().startswith('svn_')]
 del _unprefix_names
-del _bi_list
 
 
 # Names that are not to be exported

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/svn/wc.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/svn/wc.py?rev=1819712&r1=1819711&r2=1819712&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/svn/wc.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/svn/wc.py Sun Dec 31 01:49:15 2017
@@ -24,12 +24,11 @@
 ######################################################################
 
 from libsvn.wc import *
-from svn.core import _unprefix_names, _bi_list
+from svn.core import _unprefix_names, _as_list
 _unprefix_names(locals(), 'svn_wc_')
 _unprefix_names(locals(), 'SVN_WC_')
-__all__ = [x for x in _bi_list(locals()) if x.lower().startswith('svn_')]
+__all__ = [x for x in _as_list(locals()) if x.lower().startswith('svn_')]
 del _unprefix_names
-del _bi_list
 
 
 class DiffCallbacks2:

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/tests/mergeinfo.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/tests/mergeinfo.py?rev=1819712&r1=1819711&r2=1819712&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/tests/mergeinfo.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/tests/mergeinfo.py Sun Dec 31 01:49:15 2017
@@ -131,7 +131,7 @@ class SubversionMergeinfoTestCase(unitte
     # When reference counting is working properly, each svn_merge_range_t in
     # the returned mergeinfo will have a ref count of 1...
     mergeinfo = core.svn_mergeinfo_parse(self.TEXT_MERGEINFO1)
-    for (path, rangelist) in list(mergeinfo.items()):
+    for (path, rangelist) in core._as_list(mergeinfo.items()):
       # ....and now 2 (incref during iteration of rangelist)
 
       for (i, r) in enumerate(rangelist):

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/tests/ra.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/tests/ra.py?rev=1819712&r1=1819711&r2=1819712&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/tests/ra.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/tests/ra.py Sun Dec 31 01:49:15 2017
@@ -186,7 +186,7 @@ class SubversionRepositoryAccessTestCase
         if file_baton is not None:
           editor.close_file(file_baton, None, pool)
         return dir_baton
-      delta.path_driver(editor, edit_baton, -1, list(all_paths.keys()), driver_cb)
+      delta.path_driver(editor, edit_baton, -1, core._as_list(all_paths.keys()), driver_cb)
       editor.close_edit(edit_baton)
     except:
       try:
@@ -210,7 +210,7 @@ class SubversionRepositoryAccessTestCase
       self.assertEqual(author, info.author)
       self.assertEqual(date, info.date)
       self.assertEqual(message, revprops['svn:log'])
-      for (path, change) in list(changed_paths.items()):
+      for (path, change) in core._as_list(changed_paths.items()):
         path = path.lstrip('/')
         self.assertTrue(path in all_paths)
         if path in to_delete:
@@ -353,7 +353,7 @@ class SubversionRepositoryAccessTestCase
       called[0] = True
       self.assertEqual(log_entry.revision, rev)
       if discover_changed_paths:
-        self.assertEqual(list(log_entry.changed_paths.keys()), ['/bla3'])
+        self.assertEqual(core._as_list(log_entry.changed_paths.keys()), ['/bla3'])
         changed_path = log_entry.changed_paths['/bla3']
         self.assertTrue(changed_path.action in ['A', 'D', 'R', 'M'])
         self.assertEqual(changed_path.copyfrom_path, None)

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/tests/repository.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/tests/repository.py?rev=1819712&r1=1819711&r2=1819712&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/tests/repository.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/tests/repository.py Sun Dec 31 01:49:15 2017
@@ -239,7 +239,7 @@ class SubversionRepositoryTestCase(unitt
     # Count and verify changes
     change_count = 0
     for log in logs:
-      for path_changed in list(log.values()):
+      for path_changed in core._as_list(log.values()):
         change_count += 1
         path_changed.assert_valid()
     self.assertEqual(logs[2]["/tags/v1.1"].action, "A")

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/svn_fs.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/svn_fs.py?rev=1819712&r1=1819711&r2=1819712&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/svn_fs.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/svn_fs.py Sun Dec 31 01:49:15 2017
@@ -349,7 +349,7 @@ class SubversionNode(Node):
 
     def get_properties(self):
         props = fs.node_proplist(self.root, self.scoped_path)
-        for name,value in list(props.items()):
+        for name,value in core._as_list(props.items()):
             props[name] = str(value) # Make sure the value is a proper string
         return props
 
@@ -395,7 +395,7 @@ class SubversionChangeset(Changeset):
         # Variables to record copy/deletes for later move detection
         copies, deletions = {}, {}
         changes = []
-        for path, change in list(editor.changes.items()):
+        for path, change in core._as_list(editor.changes.items()):
             if not self.authz.has_permission(path):
                 # FIXME: what about base_path?
                 continue
@@ -429,7 +429,7 @@ class SubversionChangeset(Changeset):
         # Detect moves by checking for copies whose source was deleted in this
         # change set.
         moves = set()
-        for k,v in list(copies.items()):
+        for k,v in core._as_list(copies.items()):
             if k in deletions:
                 changes[v][2] = Changeset.MOVE
                 # Record the index of the now redundant delete action.

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/tests/wc.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/tests/wc.py?rev=1819712&r1=1819711&r2=1819712&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/tests/wc.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/tests/wc.py Sun Dec 31 01:49:15 2017
@@ -212,7 +212,7 @@ class SubversionWorkingCopyTestCase(unit
 
   def test_entries_read(self):
       entries = wc.entries_read(self.wc, True)
-      keys = list(entries.keys())
+      keys = core._as_list(entries.keys())
       keys.sort()
       self.assertEqual(['', 'branches', 'tags', 'trunk'], keys)
 
@@ -327,7 +327,7 @@ class SubversionWorkingCopyTestCase(unit
     # Save prop changes.
     got_prop_changes = []
     def props_changed(path, propchanges):
-      for (name, value) in list(propchanges.items()):
+      for (name, value) in core._as_list(propchanges.items()):
         (kind, _) = core.svn_property_kind(name)
         if kind != core.svn_prop_regular_kind:
           continue