Gentoo Archives: gentoo-portage-dev

From: Brian Dolbec <dolsen@g.o>
To: gentoo-portage-dev@l.g.o
Subject: Re: [gentoo-portage-dev] [PATCH v3 1/2] dblink: case insensitive support for bug #524236
Date: Mon, 17 Nov 2014 22:09:18
Message-Id: 20141117140906.7187e794.dolsen@gentoo.org
In Reply to: [gentoo-portage-dev] [PATCH v3 1/2] dblink: case insensitive support for bug #524236 by Zac Medico
1 On Mon, 17 Nov 2014 12:29:37 -0800
2 Zac Medico <zmedico@g.o> wrote:
3
4 > This adds a dblink._contents attribute with methods that provide
5 > an interface for contents operations with "implicit" case handling.
6 > The new methods are implemented in a separate
7 > ContentsCaseSensitivityManager class, in order to avoid adding more
8 > bloat to vartree.py.
9 >
10 > X-Gentoo-Bug: 524236
11 > X-Gentoo-Url: https://bugs.gentoo.org/show_bug.cgi?id=524236
12 > ---
13 ...
14 > +class ContentsCaseSensitivityManager(object):
15 > + """
16 > + Implicitly handles case transformations that are needed for
17 > + case-insensitive support.
18 > + """
19 > +
20 > + def __init__(self, db):
21 > + """
22 > + @param db: A dblink instance
23 > + @type db: vartree.dblink
24 > + """
25
26
27 Thank you :) looks much better now ;)
28
29 Both 1/2, 2/2 look good now. Clear to merge :)
30
31
32
33 > + self.getcontents = db.getcontents
34 > +
35 > + if "case-insensitive-fs" in db.settings.features:
36 > + self.unmap_key =
37 > self._unmap_key_case_insensitive
38 > + self.contains =
39 > self._contains_case_insensitive
40 > + self.keys = self._keys_case_insensitive
41 > +
42 > + self._contents_insensitive = None
43 > + self._reverse_key_map = None
44 > +
45 > + def clear_cache(self):
46 > + """
47 > + Clear all cached contents data.
48 > + """
49 > + self._contents_insensitive = None
50 > + self._reverse_key_map = None
51 > +
52 > + def keys(self):
53 > + """
54 > + Iterate over all contents keys, which are
55 > transformed to
56 > + lowercase when appropriate, for use in
57 > case-insensitive
58 > + comparisons.
59 > + @rtype: iterator
60 > + @return: An iterator over all the contents keys
61 > + """
62 > + return iter(self.getcontents())
63 > +
64 > + def contains(self, key):
65 > + """
66 > + Check if the given key is contained in the contents,
67 > using
68 > + case-insensitive comparison when appropriate.
69 > + @param key: A filesystem path (including ROOT and
70 > EPREFIX)
71 > + @type key: str
72 > + @rtype: bool
73 > + @return: True if the given key is contained in the
74 > contents,
75 > + False otherwise
76 > + """
77 > + return key in self.getcontents()
78 > +
79 > + def unmap_key(self, key):
80 > + """
81 > + Map a key (from the keys method) back to its
82 > case-preserved
83 > + form.
84 > + @param key: A filesystem path (including ROOT and
85 > EPREFIX)
86 > + @type key: str
87 > + @rtype: str
88 > + @return: The case-preserved form of key
89 > + """
90 > + return key
91 > +
92 > + def _case_insensitive_init(self):
93 > + """
94 > + Initialize data structures for case-insensitive
95 > support.
96 > + """
97 > + self._contents_insensitive = dict(
98 > + (k.lower(), v) for k, v in
99 > self.getcontents().items())
100 > + self._reverse_key_map = dict(
101 > + (k.lower(), k) for k in self.getcontents())
102 > +
103 > + def _keys_case_insensitive(self):
104 > + if self._contents_insensitive is None:
105 > + self._case_insensitive_init()
106 > + return iter(self._contents_insensitive)
107 > +
108 > + _keys_case_insensitive.__doc__ = keys.__doc__
109 > +
110 > + def _contains_case_insensitive(self, key):
111 > + if self._contents_insensitive is None:
112 > + self._case_insensitive_init()
113 > + return key.lower() in self._contents_insensitive
114 > +
115 > + _contains_case_insensitive.__doc__ = contains.__doc__
116 > +
117 > + def _unmap_key_case_insensitive(self, key):
118 > + if self._reverse_key_map is None:
119 > + self._case_insensitive_init()
120 > + return self._reverse_key_map[key]
121 > +
122 > + _unmap_key_case_insensitive.__doc__ = unmap_key.__doc__
123 > diff --git a/pym/portage/dbapi/vartree.py
124 > b/pym/portage/dbapi/vartree.py index 8b06f4c..81059b1 100644
125 > --- a/pym/portage/dbapi/vartree.py
126 > +++ b/pym/portage/dbapi/vartree.py
127 > @@ -69,6 +69,7 @@ from _emerge.EbuildPhase import EbuildPhase
128 > from _emerge.emergelog import emergelog
129 > from _emerge.MiscFunctionsProcess import MiscFunctionsProcess
130 > from _emerge.SpawnProcess import SpawnProcess
131 > +from ._ContentsCaseSensitivityManager import
132 > ContentsCaseSensitivityManager
133 > import errno
134 > import fnmatch
135 > @@ -1525,6 +1526,7 @@ class dblink(object):
136 > # When necessary, this attribute is modified for
137 > # compliance with RESTRICT=preserve-libs.
138 > self._preserve_libs = "preserve-libs" in
139 > mysettings.features
140 > + self._contents = ContentsCaseSensitivityManager(self)
141 >
142 > def __hash__(self):
143 > return hash(self._hash_key)
144 > @@ -1612,6 +1614,7 @@ class dblink(object):
145 > self.contentscache = None
146 > self._contents_inodes = None
147 > self._contents_basenames = None
148 > + self._contents.clear_cache()
149 >
150 > def getcontents(self):
151 > """
152
153
154
155 --
156 Brian Dolbec <dolsen>