From: Zac Medico <zmedico@gentoo.org>
To: gentoo-portage-dev@lists.gentoo.org
Cc: Zac Medico <zmedico@gentoo.org>
Subject: [gentoo-portage-dev] [PATCH v3 1/2] dblink: case insensitive support for bug #524236
Date: Mon, 17 Nov 2014 12:29:37 -0800 [thread overview]
Message-ID: <1416256178-18009-1-git-send-email-zmedico@gentoo.org> (raw)
In-Reply-To: <20141116205810.24331079.dolsen@gentoo.org>
This adds a dblink._contents attribute with methods that provide
an interface for contents operations with "implicit" case handling.
The new methods are implemented in a separate
ContentsCaseSensitivityManager class, in order to avoid adding more
bloat to vartree.py.
X-Gentoo-Bug: 524236
X-Gentoo-Url: https://bugs.gentoo.org/show_bug.cgi?id=524236
---
.../dbapi/_ContentsCaseSensitivityManager.py | 93 ++++++++++++++++++++++
pym/portage/dbapi/vartree.py | 3 +
2 files changed, 96 insertions(+)
create mode 100644 pym/portage/dbapi/_ContentsCaseSensitivityManager.py
diff --git a/pym/portage/dbapi/_ContentsCaseSensitivityManager.py b/pym/portage/dbapi/_ContentsCaseSensitivityManager.py
new file mode 100644
index 0000000..c479ec9
--- /dev/null
+++ b/pym/portage/dbapi/_ContentsCaseSensitivityManager.py
@@ -0,0 +1,93 @@
+# Copyright 2014 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+class ContentsCaseSensitivityManager(object):
+ """
+ Implicitly handles case transformations that are needed for
+ case-insensitive support.
+ """
+
+ def __init__(self, db):
+ """
+ @param db: A dblink instance
+ @type db: vartree.dblink
+ """
+ self.getcontents = db.getcontents
+
+ if "case-insensitive-fs" in db.settings.features:
+ self.unmap_key = self._unmap_key_case_insensitive
+ self.contains = self._contains_case_insensitive
+ self.keys = self._keys_case_insensitive
+
+ self._contents_insensitive = None
+ self._reverse_key_map = None
+
+ def clear_cache(self):
+ """
+ Clear all cached contents data.
+ """
+ self._contents_insensitive = None
+ self._reverse_key_map = None
+
+ def keys(self):
+ """
+ Iterate over all contents keys, which are transformed to
+ lowercase when appropriate, for use in case-insensitive
+ comparisons.
+ @rtype: iterator
+ @return: An iterator over all the contents keys
+ """
+ return iter(self.getcontents())
+
+ def contains(self, key):
+ """
+ Check if the given key is contained in the contents, using
+ case-insensitive comparison when appropriate.
+ @param key: A filesystem path (including ROOT and EPREFIX)
+ @type key: str
+ @rtype: bool
+ @return: True if the given key is contained in the contents,
+ False otherwise
+ """
+ return key in self.getcontents()
+
+ def unmap_key(self, key):
+ """
+ Map a key (from the keys method) back to its case-preserved
+ form.
+ @param key: A filesystem path (including ROOT and EPREFIX)
+ @type key: str
+ @rtype: str
+ @return: The case-preserved form of key
+ """
+ return key
+
+ def _case_insensitive_init(self):
+ """
+ Initialize data structures for case-insensitive support.
+ """
+ self._contents_insensitive = dict(
+ (k.lower(), v) for k, v in self.getcontents().items())
+ self._reverse_key_map = dict(
+ (k.lower(), k) for k in self.getcontents())
+
+ def _keys_case_insensitive(self):
+ if self._contents_insensitive is None:
+ self._case_insensitive_init()
+ return iter(self._contents_insensitive)
+
+ _keys_case_insensitive.__doc__ = keys.__doc__
+
+ def _contains_case_insensitive(self, key):
+ if self._contents_insensitive is None:
+ self._case_insensitive_init()
+ return key.lower() in self._contents_insensitive
+
+ _contains_case_insensitive.__doc__ = contains.__doc__
+
+ def _unmap_key_case_insensitive(self, key):
+ if self._reverse_key_map is None:
+ self._case_insensitive_init()
+ return self._reverse_key_map[key]
+
+ _unmap_key_case_insensitive.__doc__ = unmap_key.__doc__
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
index 8b06f4c..81059b1 100644
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@ -69,6 +69,7 @@ from _emerge.EbuildPhase import EbuildPhase
from _emerge.emergelog import emergelog
from _emerge.MiscFunctionsProcess import MiscFunctionsProcess
from _emerge.SpawnProcess import SpawnProcess
+from ._ContentsCaseSensitivityManager import ContentsCaseSensitivityManager
import errno
import fnmatch
@@ -1525,6 +1526,7 @@ class dblink(object):
# When necessary, this attribute is modified for
# compliance with RESTRICT=preserve-libs.
self._preserve_libs = "preserve-libs" in mysettings.features
+ self._contents = ContentsCaseSensitivityManager(self)
def __hash__(self):
return hash(self._hash_key)
@@ -1612,6 +1614,7 @@ class dblink(object):
self.contentscache = None
self._contents_inodes = None
self._contents_basenames = None
+ self._contents.clear_cache()
def getcontents(self):
"""
--
2.0.4
next prev parent reply other threads:[~2014-11-17 20:29 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-13 1:22 [gentoo-portage-dev] [PATCH] FEATURES=case-insensitive-fs for bug #524236 Zac Medico
2014-11-13 10:29 ` Alexander Berntsen
2014-11-13 17:58 ` Zac Medico
2014-11-16 10:41 ` [gentoo-portage-dev] [PATCH 1/2] dblink: case insensitive support " Zac Medico
2014-11-16 10:41 ` [gentoo-portage-dev] [PATCH 2/2] FEATURES=case-insensitive-fs " Zac Medico
2014-11-16 18:11 ` [gentoo-portage-dev] [PATCH 1/2] dblink: case insensitive support " Brian Dolbec
2014-11-17 1:29 ` [gentoo-portage-dev] [PATCH v2 " Zac Medico
2014-11-17 1:29 ` [gentoo-portage-dev] [PATCH v2 2/2] FEATURES=case-insensitive-fs " Zac Medico
2014-11-17 4:58 ` [gentoo-portage-dev] [PATCH v2 1/2] dblink: case insensitive support " Brian Dolbec
2014-11-17 20:29 ` Zac Medico [this message]
2014-11-17 20:29 ` [gentoo-portage-dev] [PATCH v3 2/2] FEATURES=case-insensitive-fs " Zac Medico
2014-11-17 22:09 ` [gentoo-portage-dev] [PATCH v3 1/2] dblink: case insensitive support " Brian Dolbec
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1416256178-18009-1-git-send-email-zmedico@gentoo.org \
--to=zmedico@gentoo.org \
--cc=gentoo-portage-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox