Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH v2 1/2] dblink: case insensitive support for bug #524236
Date: Mon, 17 Nov 2014 01:29:37
Message-Id: 1416187767-10240-1-git-send-email-zmedico@gentoo.org
In Reply to: Re: [gentoo-portage-dev] [PATCH 1/2] dblink: case insensitive support for bug #524236 by Brian Dolbec
1 This adds dblink._contents_contains, _contents_keys, and
2 _contents_map_key methods that provide an interface for contents
3 operations with "implicit" case handling. The new methods are
4 implemented in a separate ContentsCaseSensitivityManager class,
5 in order to avoid adding more bloat to vartree.py.
6
7 X-Gentoo-Bug: 524236
8 X-Gentoo-Url: https://bugs.gentoo.org/show_bug.cgi?id=524236
9 ---
10 .../dbapi/_ContentsCaseSensitivityManager.py | 54 ++++++++++++++++++++++
11 pym/portage/dbapi/vartree.py | 8 ++++
12 2 files changed, 62 insertions(+)
13 create mode 100644 pym/portage/dbapi/_ContentsCaseSensitivityManager.py
14
15 diff --git a/pym/portage/dbapi/_ContentsCaseSensitivityManager.py b/pym/portage/dbapi/_ContentsCaseSensitivityManager.py
16 new file mode 100644
17 index 0000000..6b8301d
18 --- /dev/null
19 +++ b/pym/portage/dbapi/_ContentsCaseSensitivityManager.py
20 @@ -0,0 +1,54 @@
21 +# Copyright 2014 Gentoo Foundation
22 +# Distributed under the terms of the GNU General Public License v2
23 +
24 +class ContentsCaseSensitivityManager(object):
25 +
26 + def __init__(self, db):
27 +
28 + self.getcontents = db.getcontents
29 +
30 + if "case-insensitive-fs" in db.settings.features:
31 + self.unmap_key = self._unmap_key_case_insensitive
32 + self.contains = self._contains_case_insensitive
33 + self.keys = self._keys_case_insensitive
34 + else:
35 + self.unmap_key = self._unmap_key_case_sensitive
36 + self.contains = self._contains_case_sensitive
37 + self.keys = self._keys_case_sensitive
38 +
39 + self._contents_insensitive = None
40 + self._reverse_key_map = None
41 +
42 + def clear_cache(self):
43 + self._contents_insensitive = None
44 + self._reverse_key_map = None
45 +
46 + def _case_insensitive_init(self):
47 + self._contents_insensitive = dict(
48 + (k.lower(), v) for k, v in self.getcontents().items())
49 + self._reverse_key_map = dict(
50 + (k.lower(), k) for k in self.getcontents())
51 +
52 + def _keys_case_insensitive(self):
53 + if self._contents_insensitive is None:
54 + self._case_insensitive_init()
55 + return iter(self._contents_insensitive)
56 +
57 + def _contains_case_insensitive(self, key):
58 + if self._contents_insensitive is None:
59 + self._case_insensitive_init()
60 + return key.lower() in self._contents_insensitive
61 +
62 + def _unmap_key_case_insensitive(self, key):
63 + if self._reverse_key_map is None:
64 + self._case_insensitive_init()
65 + return self._reverse_key_map[key]
66 +
67 + def _keys_case_sensitive(self):
68 + return iter(self.getcontents())
69 +
70 + def _contains_case_sensitive(self, key):
71 + return key in self.getcontents()
72 +
73 + def _unmap_key_case_sensitive(self, key):
74 + return key
75 diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
76 index 8b06f4c..22f41d0 100644
77 --- a/pym/portage/dbapi/vartree.py
78 +++ b/pym/portage/dbapi/vartree.py
79 @@ -69,6 +69,7 @@ from _emerge.EbuildPhase import EbuildPhase
80 from _emerge.emergelog import emergelog
81 from _emerge.MiscFunctionsProcess import MiscFunctionsProcess
82 from _emerge.SpawnProcess import SpawnProcess
83 +from ._ContentsCaseSensitivityManager import ContentsCaseSensitivityManager
84
85 import errno
86 import fnmatch
87 @@ -1526,6 +1527,12 @@ class dblink(object):
88 # compliance with RESTRICT=preserve-libs.
89 self._preserve_libs = "preserve-libs" in mysettings.features
90
91 + manager = ContentsCaseSensitivityManager(self)
92 + self._contents_case_sensitivity_manager = manager
93 + self._contents_unmap_key = manager.unmap_key
94 + self._contents_contains = manager.contains
95 + self._contents_keys = manager.keys
96 +
97 def __hash__(self):
98 return hash(self._hash_key)
99
100 @@ -1612,6 +1619,7 @@ class dblink(object):
101 self.contentscache = None
102 self._contents_inodes = None
103 self._contents_basenames = None
104 + self._contents_case_sensitivity_manager.clear_cache()
105
106 def getcontents(self):
107 """
108 --
109 2.0.4

Replies