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 1/2] dblink: case insensitive support for bug #524236
Date: Sun, 16 Nov 2014 10:42:20
Message-Id: 1416134515-31943-1-git-send-email-zmedico@gentoo.org
In Reply to: Re: [gentoo-portage-dev] [PATCH] FEATURES=case-insensitive-fs for bug #524236 by Zac Medico
1 This adds dblink._contents_contains, _contents_iter, and _contents_key
2 methods that provide an interface for contents operations with "implicit"
3 case handling.
4
5 X-Gentoo-Bug: 524236
6 X-Gentoo-Url: https://bugs.gentoo.org/show_bug.cgi?id=524236
7 ---
8 pym/portage/dbapi/vartree.py | 43 +++++++++++++++++++++++++++++++++++++++++++
9 1 file changed, 43 insertions(+)
10
11 diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
12 index 8b06f4c..2d1003f 100644
13 --- a/pym/portage/dbapi/vartree.py
14 +++ b/pym/portage/dbapi/vartree.py
15 @@ -1515,6 +1515,8 @@ class dblink(object):
16 self.contentscache = None
17 self._contents_inodes = None
18 self._contents_basenames = None
19 + self._contents_case_insensitive = None
20 + self._contents_case_reverse_map = None
21 self._linkmap_broken = False
22 self._device_path_map = {}
23 self._hardlink_merge_map = {}
24 @@ -1526,6 +1528,15 @@ class dblink(object):
25 # compliance with RESTRICT=preserve-libs.
26 self._preserve_libs = "preserve-libs" in mysettings.features
27
28 + if "case-insensitive-fs" in self.settings.features:
29 + self._contents_key = self._contents_key_case_insensitive
30 + self._contents_contains = self._contents_contains_case_insensitive
31 + self._contents_iter = self._contents_iter_case_insensitive
32 + else:
33 + self._contents_key = self._contents_key_case_sensitive
34 + self._contents_contains = self._contents_contains_case_sensitive
35 + self._contents_iter = self._contents_iter_case_sensitive
36 +
37 def __hash__(self):
38 return hash(self._hash_key)
39
40 @@ -1612,6 +1623,8 @@ class dblink(object):
41 self.contentscache = None
42 self._contents_inodes = None
43 self._contents_basenames = None
44 + self._contents_case_insensitive = None
45 + self._contents_case_reverse_map = None
46
47 def getcontents(self):
48 """
49 @@ -1716,6 +1729,36 @@ class dblink(object):
50 self.contentscache = pkgfiles
51 return pkgfiles
52
53 + def _contents_case_insensitive_init(self):
54 + self._contents_case_insensitive = dict(
55 + (k.lower(), v) for k, v in self.getcontents().items())
56 + self._contents_case_reverse_map = dict(
57 + (k.lower(), k) for k in self.getcontents())
58 +
59 + def _contents_iter_case_insensitive(self):
60 + if self._contents_case_insensitive is None:
61 + self._contents_case_insensitive_init()
62 + return iter(self._contents_case_insensitive)
63 +
64 + def _contents_key_case_insensitive(self, key):
65 + if self._contents_case_reverse_map is None:
66 + self._contents_case_insensitive_init()
67 + return self._contents_case_reverse_map[key]
68 +
69 + def _contents_contains_case_insensitive(self, key):
70 + if self._contents_case_insensitive is None:
71 + self._contents_case_insensitive_init()
72 + return key.lower() in self._contents_case_insensitive
73 +
74 + def _contents_key_case_sensitive(self, key):
75 + return key
76 +
77 + def _contents_iter_case_sensitive(self):
78 + return iter(self.getcontents())
79 +
80 + def _contents_contains_case_sensitive(self, key):
81 + return key in self.getcontents()
82 +
83 def _prune_plib_registry(self, unmerge=False,
84 needed=None, preserve_paths=None):
85 # remove preserved libraries that don't have any consumers left
86 --
87 2.0.4

Replies