Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bindbapi: Update state for package remove in aux_update #1214

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
61 changes: 52 additions & 9 deletions lib/portage/dbapi/bintree.py
Original file line number Diff line number Diff line change
Expand Up @@ -302,15 +302,7 @@ def aux_update(self, cpv, values):
"the file will be removed.",
)
)
try:
os.remove(binpkg_path)
except OSError as err:
writemsg(
colorize(
"WARN",
f"Failed to remove moved signed package: {binpkg_path} {str(err)}",
)
)
self.bintree.remove(cpv)
return
encoding_key = False
else:
Expand Down Expand Up @@ -1789,6 +1781,57 @@ def inject(self, cpv, current_pkg_path=None, allocated_pkg_path=None):

return cpv

def remove(self, cpv: portage.versions._pkg_str) -> None:
"""
Remove a package instance and update internal state including
the package index. This will raise a KeyError if cpv is not
found in the internal state. It will display a warning message
if the package file was not found on disk, since it could have
been removed by another process before this method could
acquire a lock.

@param cpv: The cpv of the existing package to remove
@type cpv: portage.versions._pkg_str
@rtype: None
@return: None
@raise KeyError: If cpv does not exist in the internal state
"""
if not self.populated:
self.populate()
os.makedirs(self.pkgdir, exist_ok=True)
pkgindex_lock = lockfile(self._pkgindex_file, wantnewlockfile=1)
try:
# Will raise KeyError if the package is not found.
instance_key = self.dbapi._instance_key(cpv)
pkg_path = self.getname(cpv)
self.dbapi.cpv_remove(cpv)
self._pkg_paths.pop(instance_key, None)
if self._remotepkgs is not None:
self._remotepkgs.pop(instance_key, None)
pkgindex = self._load_pkgindex()
if not self._pkgindex_version_supported(pkgindex):
pkgindex = self._new_pkgindex()

path = pkg_path[len(self.pkgdir) + 1 :]
for i in range(len(pkgindex.packages) - 1, -1, -1):
d = pkgindex.packages[i]
if cpv == d.get("CPV"):
if path == d.get("PATH", ""):
del pkgindex.packages[i]

self._pkgindex_write(pkgindex)
try:
os.remove(pkg_path)
except OSError as err:
writemsg(
colorize(
"WARN",
f"Failed to remove package: {binpkg_path} {str(err)}",
)
)
finally:
unlockfile(pkgindex_lock)

def _read_metadata(self, filename, st, keys=None, binpkg_format=None):
"""
Read metadata from a binary package. The returned metadata
Expand Down
19 changes: 13 additions & 6 deletions lib/portage/tests/update/test_move_slot_ent.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright 2012-2019 Gentoo Authors
# Copyright 2012-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

import sys
Expand Down Expand Up @@ -277,17 +277,24 @@ def testMoveSlotEntWithSignature(self):
self.assertEqual(
"2/2.30", vardb.aux_get("dev-libs/A-1", ["SLOT"])[0]
)
self.assertEqual(
"0/2.30", bindb.aux_get("dev-libs/A-1", ["SLOT"])[0]
)

# Stale signed packages removed since a7bbb4fc4d38.
self.assertRaises(KeyError, bindb.aux_get, "dev-libs/A-1", ["SLOT"])
# self.assertEqual(
# "0/2.30", bindb.aux_get("dev-libs/A-1", ["SLOT"])[0]
# )

# 0 -> 1
self.assertEqual("1", vardb.aux_get("dev-libs/B-1", ["SLOT"])[0])
self.assertEqual("0", bindb.aux_get("dev-libs/B-1", ["SLOT"])[0])
# Stale signed packages removed since a7bbb4fc4d38.
self.assertRaises(KeyError, bindb.aux_get, "dev-libs/B-1", ["SLOT"])
# self.assertEqual("0", bindb.aux_get("dev-libs/B-1", ["SLOT"])[0])

# 0/1 -> 1 (equivalent to 1/1)
self.assertEqual("1", vardb.aux_get("dev-libs/C-1", ["SLOT"])[0])
self.assertEqual("0/1", bindb.aux_get("dev-libs/C-1", ["SLOT"])[0])
# Stale signed packages removed since a7bbb4fc4d38.
self.assertRaises(KeyError, bindb.aux_get, "dev-libs/C-1", ["SLOT"])
# self.assertEqual("0/1", bindb.aux_get("dev-libs/C-1", ["SLOT"])[0])

# dont_apply_updates
self.assertEqual(
Expand Down
13 changes: 8 additions & 5 deletions lib/portage/tests/update/test_update_dbentry.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright 2012-2013 Gentoo Foundation
# Copyright 2012-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

import sys
Expand Down Expand Up @@ -432,10 +432,13 @@ def testUpdateDbentryDbapiTestCaseWithSignature(self):
rdepend = vardb.aux_get("dev-libs/A-1", ["RDEPEND"])[0]
self.assertTrue(old_pattern.search(rdepend) is None)
self.assertTrue("dev-libs/M-moved" in rdepend)
rdepend = bindb.aux_get("dev-libs/A-1", ["RDEPEND"])[0]
print(old_pattern.search(rdepend) is None)
self.assertFalse(old_pattern.search(rdepend) is None)
self.assertFalse("dev-libs/M-moved" in rdepend)
# Stale signed packages removed since a7bbb4fc4d38.
self.assertRaises(
KeyError, bindb.aux_get, "dev-libs/A-1", ["RDEPEND"]
)
# rdepend = bindb.aux_get("dev-libs/A-1", ["RDEPEND"])[0]
# self.assertFalse(old_pattern.search(rdepend) is None)
# self.assertFalse("dev-libs/M-moved" in rdepend)
rdepend = vardb.aux_get("dev-libs/B-1", ["RDEPEND"])[0]
self.assertTrue(old_pattern.search(rdepend) is None)
self.assertTrue("dev-libs/M-moved" in rdepend)
Expand Down