fix: skip primary in uninstall

This commit is contained in:
relikd
2025-09-03 00:03:33 +02:00
parent 4264e657e5
commit 0cc654e265

14
brew.py
View File

@@ -1922,6 +1922,12 @@ class UninstallQueue:
skipped = depTree.reverse.filterDifference(secondary, hidden) skipped = depTree.reverse.filterDifference(secondary, hidden)
removed = rawUninstall.difference(skipped) removed = rawUninstall.difference(skipped)
# skip dependencies which were installed by user on request
primary = set(x for x in removed if LocalPackage(x).primary)
primary = primary.difference(deletePkgs)
removed -= primary
skipped |= primary
# recursively ignore dependencies that rely on already ignored # recursively ignore dependencies that rely on already ignored
while deps := depTree.reverse.filterIntersection(removed, skipped): while deps := depTree.reverse.filterIntersection(removed, skipped):
skipped.update(deps) skipped.update(deps)
@@ -1933,8 +1939,7 @@ class UninstallQueue:
setWarnings(hidden) setWarnings(hidden)
setUninstallQueue(sorted(removed)) setUninstallQueue(sorted(removed))
irrelevant = removed.union(hiddenPkgs) irrelevant = removed.union(hiddenPkgs)
self.skips = {pkg: deps for pkg in skipped self.skips = {pkg: getDeps(pkg) - irrelevant for pkg in skipped}
if (deps := getDeps(pkg) - irrelevant)}
def validateQueue(self) -> None: def validateQueue(self) -> None:
''' Check for direct dependencies. If found, fail with exit code 1 ''' ''' Check for direct dependencies. If found, fail with exit code 1 '''
@@ -1951,7 +1956,10 @@ class UninstallQueue:
def printSkipped(self) -> None: def printSkipped(self) -> None:
''' Print list of `skip X. used by: {deps}` ''' ''' Print list of `skip X. used by: {deps}` '''
for pkg, deps in sorted(self.skips.items()): for pkg, deps in sorted(self.skips.items()):
Log.warn(f'skip {pkg}. used by:', ', '.join(sorted(deps))) if LocalPackage(pkg).primary:
Log.warn(f'skip {pkg}. (primary install)')
else:
Log.warn(f'skip {pkg}. used by:', ', '.join(sorted(deps)))
def uninstall(self, *, dryRun: bool) -> None: def uninstall(self, *, dryRun: bool) -> None:
''' Remove symlinks and package directories (or pretend to do) ''' ''' Remove symlinks and package directories (or pretend to do) '''