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> |