[entropy.client.package] rewrite config_protect+mask handling code

Improve code quality, remove several redundant parts, use set()
objects instead of list() for both protect and mask data.
Improve speed, save the world.
This commit is contained in:
Fabio Erculiani
2013-11-22 12:54:38 +01:00
parent 36b38487a4
commit d41aa402ba
+38 -51
View File
@@ -1895,16 +1895,18 @@ class Package:
return 0
def _setup_config_protect_and_mask(self, installed_package_id):
def _setup_config_protect_and_mask(self, installed_repository,
installed_package_id):
"""
Setup the config_protect+mask metadata object.
Make sure to call this before the package goes away from the
repository.
"""
protect = self.__get_installed_package_config_protect(
installed_package_id)
mask = self.__get_installed_package_config_protect(
installed_package_id, mask = True)
protect = self._get_config_protect(
installed_repository, installed_package_id)
mask = self._get_config_protect(
installed_repository, installed_package_id, mask = True)
self.pkgmeta['config_protect+mask'] = (protect, mask)
def __remove_package(self):
@@ -1930,7 +1932,8 @@ class Package:
self.pkgmeta['removepackage_id'], get_dict = True)
# setup config_protect and config_protect_mask metadata before it's
# too late.
self._setup_config_protect_and_mask(self.pkgmeta['removepackage_id'])
self._setup_config_protect_and_mask(
inst_repo, self.pkgmeta['removepackage_id'])
inst_repo.removePackage(self.pkgmeta['removepackage_id'])
@@ -2420,8 +2423,7 @@ class Package:
Copy package from repository to installed packages one.
"""
def _merge_removecontent(repo, _package_id):
inst_repo = self._entropy.installed_repository()
def _merge_removecontent(inst_repo, repo, _package_id):
# NOTE: this could be a source of memory consumption
# but generally, the difference between two contents
# is really small
@@ -2449,7 +2451,7 @@ class Package:
self.pkgmeta['removecontent_file'],
content_diff, _cmp_func)
# fetch info
inst_repo = self._entropy.installed_repository()
smart_pkg = self.pkgmeta['smartpackage']
dbconn = self._entropy.open_repository(self.pkgmeta['repository'])
splitdebug, splitdebug_dirs = self.pkgmeta['splitdebug'], \
@@ -2477,7 +2479,8 @@ class Package:
if self.pkgmeta['removepackage_id'] != -1 and \
self.pkgmeta['removecontent_file'] is not None:
_merge_removecontent(dbconn, self.pkgmeta['package_id'])
_merge_removecontent(
inst_repo, dbconn, self.pkgmeta['package_id'])
else:
@@ -2515,7 +2518,7 @@ class Package:
if self.pkgmeta['removepackage_id'] != -1 and \
self.pkgmeta['removecontent_file'] is not None:
_merge_removecontent(pkg_dbconn, pkg_package_id)
_merge_removecontent(inst_repo, pkg_dbconn, pkg_package_id)
pkg_dbconn.close()
@@ -2538,7 +2541,8 @@ class Package:
# too late.
installed_package_id = self.pkgmeta['removepackage_id']
if installed_package_id != -1:
self._setup_config_protect_and_mask(installed_package_id)
self._setup_config_protect_and_mask(
inst_repo, installed_package_id)
# filter out files not installed from content metadata
# these include splitdebug files, when splitdebug is
@@ -2579,8 +2583,6 @@ class Package:
# disable, we're not going to add those entries, for example)
data['extra_download'] = self.pkgmeta['extra_download']
inst_repo = self._entropy.installed_repository()
data['content'] = None
data['content_safety'] = None
try:
@@ -2685,42 +2687,26 @@ class Package:
del contents
def __get_package_match_config_protect(self, mask = False):
package_id, repoid = self._package_match
dbconn = self._entropy.open_repository(repoid)
def _get_config_protect(self, entropy_repository, package_id, mask = False):
"""
Return configuration protection (or mask) metadata for the given
package.
"""
cl_id = etpConst['system_settings_plugins_ids']['client_plugin']
misc_data = self._settings[cl_id]['misc']
if mask:
config_protect = set(dbconn.retrieveProtectMask(package_id).split())
config_protect |= set(misc_data['configprotectmask'])
paths = entropy_repository.retrieveProtectMask(package_id).split()
misc_key = "configprotectmask"
else:
config_protect = set(dbconn.retrieveProtect(package_id).split())
config_protect |= set(misc_data['configprotect'])
config_protect = [etpConst['systemroot']+x for x in config_protect]
paths = entropy_repository.retrieveProtect(package_id).split()
misc_key = "configprotect"
return sorted(config_protect)
root = etpConst['systemroot']
config = set(("%s%s" % (root, path) for path in paths))
config.update(misc_data[misc_key])
def __get_installed_package_config_protect(self, installed_package_id,
mask = False):
inst_repo = self._entropy.installed_repository()
if inst_repo is None:
return []
cl_id = etpConst['system_settings_plugins_ids']['client_plugin']
misc_data = self._settings[cl_id]['misc']
if mask:
_pmask = inst_repo.retrieveProtectMask(installed_package_id).split()
config_protect = set(_pmask)
config_protect |= set(misc_data['configprotectmask'])
else:
_protect = inst_repo.retrieveProtect(installed_package_id).split()
config_protect = set(_protect)
config_protect |= set(misc_data['configprotect'])
config_protect = [etpConst['systemroot']+x for x in config_protect]
return sorted(config_protect)
return config
def __get_sys_root(self):
return self.pkgmeta.get('unittest_root', '') + \
@@ -2729,8 +2715,10 @@ class Package:
def _move_image_to_system(self, items_installed, items_not_installed):
# load CONFIG_PROTECT and its mask
protect = self.__get_package_match_config_protect()
mask = self.__get_package_match_config_protect(mask = True)
repo = self._entropy.open_repository(self.pkgmeta['repository'])
protect = self._get_config_protect(repo, self.pkgmeta['package_id'])
mask = self._get_config_protect(repo, self.pkgmeta['package_id'],
mask = True)
# support for unit testing settings
sys_root = self.__get_sys_root()
@@ -3256,11 +3244,11 @@ class Package:
Handle configuration file protection. This method contains the logic
for determining if a file should be protected from overwrite.
"""
protected = False
do_continue = False
in_mask = False
encoded_protect = [const_convert_to_rawstring(x) for x in protect]
encoded_mask = [const_convert_to_rawstring(x) for x in mask]
if tofile in encoded_protect:
protected = True
@@ -3282,13 +3270,12 @@ class Package:
tofile_testdir = os.path.dirname(tofile_testdir)
if protected: # check if perhaps, file is masked, so unprotected
newmask = [const_convert_to_rawstring(x) for x in mask]
if tofile in newmask:
if tofile in encoded_mask:
protected = False
in_mask = False
elif os.path.dirname(tofile) in newmask:
elif os.path.dirname(tofile) in encoded_mask:
protected = False
in_mask = False
@@ -3296,7 +3283,7 @@ class Package:
tofile_testdir = os.path.dirname(tofile)
old_tofile_testdir = None
while tofile_testdir != old_tofile_testdir:
if tofile_testdir in newmask:
if tofile_testdir in encoded_mask:
protected = False
in_mask = False
break