lib/oe/package_manager.py: OpkgPM/DpkgPM fixes

This commit:
 * adds missing mark_packages() function for OpkgPM. This is needed to
 * manually change the packages installation status in the status file;
 * fix OpkgPM remove_packaging_data() issue;
 * fix OpkgPM handle_bad_recommendations() issue;
 * improve OpkgPM/DpkgPM mark_packages() regex pattern;
 * fix DpkgPM list_installed() problem;
 * fix DpkgPM _create_configs() problem: status file should not be
   truncated if it already exists/

(From OE-Core rev: d50a40100763dcbfabec2c147fdfcb46aa909329)

Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Laurentiu Palcu 2014-01-30 21:40:24 +02:00 committed by Richard Purdie
parent b76f240df0
commit 365b77909d
1 changed files with 42 additions and 12 deletions

View File

@ -807,6 +807,34 @@ class OpkgPM(PackageManager):
self._create_config()
"""
This function will change a package's status in /var/lib/opkg/status file.
If 'packages' is None then the new_status will be applied to all
packages
"""
def mark_packages(self, status_tag, packages=None):
status_file = os.path.join(self.opkg_dir, "status")
with open(status_file, "r") as sf:
with open(status_file + ".tmp", "w+") as tmp_sf:
if packages is None:
tmp_sf.write(re.sub(r"Package: (.*?)\n((?:[^\n]+\n)*?)Status: (.*)(?:unpacked|installed)",
r"Package: \1\n\2Status: \3%s" % status_tag,
sf.read()))
else:
if type(packages).__name__ != "list":
raise TypeError("'packages' should be a list object")
status = sf.read()
for pkg in packages:
status = re.sub(r"Package: %s\n((?:[^\n]+\n)*?)Status: (.*)(?:unpacked|installed)" % pkg,
r"Package: %s\n\1Status: \2%s" % (pkg, status_tag),
status)
tmp_sf.write(status)
os.rename(status_file + ".tmp", status_file)
def _create_config(self):
with open(self.config_file, "w+") as config_file:
priority = 1
@ -922,7 +950,7 @@ class OpkgPM(PackageManager):
open(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN"), "w").close()
def remove_packaging_data(self):
bb.utils.remove(self.opkg_dir)
bb.utils.remove(self.opkg_dir, True)
# create the directory back, it's needed by PM lock
bb.utils.mkdirhier(self.opkg_dir)
@ -968,17 +996,17 @@ class OpkgPM(PackageManager):
status_file = os.path.join(self.opkg_dir, "status")
cmd = [self.opkg_cmd, self.opkg_args, "info"]
cmd = "%s %s info " % (self.opkg_cmd, self.opkg_args)
with open(status_file, "w+") as status:
for pkg in bad_recommendations.split():
pkg_info = cmd + [pkg]
pkg_info = cmd + pkg
try:
output = subprocess.check_output(pkg_info).strip()
output = subprocess.check_output(pkg_info.split()).strip()
except subprocess.CalledProcessError as e:
bb.fatal("Cannot get package info. Command %s "
"returned %d" % (' '.join(pkg_info), e.returncode))
"returned %d" % (pkg_info, e.returncode))
if output == "":
bb.note("Requested ignored recommendation $i is "
@ -1021,8 +1049,8 @@ class DpkgPM(PackageManager):
with open(status_file, "r") as sf:
with open(status_file + ".tmp", "w+") as tmp_sf:
if packages is None:
tmp_sf.write(re.sub(r"Package: (.*)\nStatus: (.*)(unpacked|installed)",
r"Package: \1\nStatus: \2%s" % status_tag,
tmp_sf.write(re.sub(r"Package: (.*?)\n((?:[^\n]+\n)*?)Status: (.*)(?:unpacked|installed)",
r"Package: \1\n\2Status: \3%s" % status_tag,
sf.read()))
else:
if type(packages).__name__ != "list":
@ -1030,8 +1058,8 @@ class DpkgPM(PackageManager):
status = sf.read()
for pkg in packages:
status = re.sub(r"Package: %s\nStatus: (.*)(unpacked|installed)" % pkg,
r"Package: %s\nStatus: \1%s" % (pkg, status_tag),
status = re.sub(r"Package: %s\n((?:[^\n]+\n)*?)Status: (.*)(?:unpacked|installed)" % pkg,
r"Package: %s\n\1Status: \2%s" % (pkg, status_tag),
status)
tmp_sf.write(status)
@ -1244,8 +1272,10 @@ class DpkgPM(PackageManager):
bb.utils.mkdirhier(os.path.join(target_dpkg_dir, "updates"))
open(os.path.join(target_dpkg_dir, "status"), "w+").close()
open(os.path.join(target_dpkg_dir, "available"), "w+").close()
if not os.path.exists(os.path.join(target_dpkg_dir, "status")):
open(os.path.join(target_dpkg_dir, "status"), "w+").close()
if not os.path.exists(os.path.join(target_dpkg_dir, "available")):
open(os.path.join(target_dpkg_dir, "available"), "w+").close()
def remove_packaging_data(self):
bb.utils.remove(os.path.join(self.target_rootfs,
@ -1275,7 +1305,7 @@ class DpkgPM(PackageManager):
elif format == "ver":
cmd.append("-f=${Package} ${PackageArch} ${Version}\n")
else:
cmd.append("-f=${Package}")
cmd.append("-f=${Package}\n")
try:
output = subprocess.check_output(cmd).strip()