From 54c5bd839a64ba5e581d4c9321be8e57a8108fae Mon Sep 17 00:00:00 2001 From: Dimitris Zlatanidis Date: Thu, 11 Jun 2015 06:36:46 +0300 Subject: [PATCH] Added check for deps before remove --- slpkg/pkg/manager.py | 111 +++++++++++++++++++++++++------------------ 1 file changed, 64 insertions(+), 47 deletions(-) diff --git a/slpkg/pkg/manager.py b/slpkg/pkg/manager.py index bbedcdcf..da8e18fb 100644 --- a/slpkg/pkg/manager.py +++ b/slpkg/pkg/manager.py @@ -36,17 +36,14 @@ from slpkg.binary.greps import fix_slackers_pkg class PackageManager(object): - """ - Package manager class for install, upgrade, - reinstall, remove, find and display packages. - """ + """Package manager class for install, upgrade, + reinstall, remove, find and display packages""" def __init__(self, binary): self.binary = binary self.meta = _meta_ def install(self, flag): - """ - Install Slackware binary packages + """Install Slackware binary packages """ for pkg in self.binary: try: @@ -57,8 +54,7 @@ class PackageManager(object): self._not_found("Can't install", self.binary, pkg) def upgrade(self, flag): - """ - Upgrade Slackware binary packages with new + """Upgrade Slackware binary packages with new """ for pkg in self.binary: try: @@ -76,11 +72,10 @@ class PackageManager(object): Msg().pkg_not_found(bol, pkg, message, eol) def remove(self, flag): - """ - Remove Slackware binary packages + """Remove Slackware binary packages """ self.flag = flag - dep_path = self.meta.log_path + "dep/" + self.dep_path = self.meta.log_path + "dep/" dependencies, rmv_list = [], [] removed = self._view_removed() if not removed: @@ -100,27 +95,27 @@ class PackageManager(object): print("") # new line at exit sys.exit(0) if remove_pkg in ["y", "Y"]: + self._check_if_used(self.binary, mas=True) for rmv in removed: # If package build and install with "slpkg -s sbo " # then look log file for dependencies in /var/log/slpkg/dep, # read and remove all else remove only the package. - if (os.path.isfile(dep_path + rmv) and + if (os.path.isfile(self.dep_path + rmv) and self.meta.del_deps in ["on", "ON"]): - dependencies = self._view_deps(dep_path, rmv) + dependencies = self._view_deps(self.dep_path, rmv) if self._rmv_deps_answer() in ["y", "Y"]: - rmv_list += (self._rmv_deps(dependencies, dep_path, - rmv)) + rmv_list += (self._rmv_deps(dependencies, + self.dep_path, rmv)) else: rmv_list += self._rmv_pkg(rmv) - os.remove(dep_path + rmv) + os.remove(self.dep_path + rmv) else: rmv_list += self._rmv_pkg(rmv) # Prints all removed packages self._reference_rmvs(rmv_list) def _rmv_deps_answer(self): - """ - Remove dependencies answer + """Remove dependencies answer """ if self.meta.remove_deps_answer == "y": remove_dep = self.meta.remove_deps_answer @@ -129,14 +124,14 @@ class PackageManager(object): remove_dep = raw_input( "\nRemove dependencies (maybe used by " "other packages) [Y/n]? ") + print("") except KeyboardInterrupt: print("") # new line at exit sys.exit(0) return remove_dep def _view_removed(self): - """ - View packages before removed + """View packages before removed """ removed = [] print("\nPackages with name matching [ {0}{1}{2} ]\n".format( @@ -154,8 +149,7 @@ class PackageManager(object): return removed def _view_deps(self, path, package): - """ - View dependencies for before remove + """View dependencies for before remove """ dependencies = Utils().read_file(path + package) print("") # new line at start @@ -169,24 +163,23 @@ class PackageManager(object): return dependencies def _rmv_deps(self, dependencies, path, package): - """ - Remove dependencies + """Remove dependencies """ removes = [] deps = dependencies.split() deps.append(package) - print("") + self._check_if_used(deps, mas=False) Msg().template(78) print("| Enter some packages splitting with comma ',' for be excluded\n" "| from the removal or hit Enter to continue:") Msg().template(78) try: - skip = raw_input("| > ").split(",") + self.skip = raw_input("| > ").split(",") except KeyboardInterrupt: print("") sys.exit(0) for dep in deps: - if (dep not in skip + if (dep not in self.skip and find_package(dep + self.meta.sp, self.meta.pkg_path)): try: subprocess.call("removepkg {0} {1}".format(self.flag, dep), @@ -199,8 +192,7 @@ class PackageManager(object): return removes def _rmv_pkg(self, package): - """ - Remove one signle package + """Remove one signle package """ if find_package(package + self.meta.sp, self.meta.pkg_path): try: @@ -211,9 +203,42 @@ class PackageManager(object): sys.exit(0) return package.split() + def _check_if_used(self, removes, mas): + """Check package if dependencies for another package + before removed""" + print("") + view = False + dict_pkg = {} + for pkg in find_package("", self.dep_path): + deps = Utils().read_file(self.dep_path + pkg) + for rmv in removes: + if rmv in deps: + view = True + dict_pkg[pkg] = rmv + else: + mas = False + if view: + Msg().template(78) + for key, value in dict_pkg.iteritems(): + print("| {0}{1}{2} is dependency of the package --> " + "{3}{4}{5}".format(self.meta.color["RED"], value, + self.meta.color["ENDC"], + self.meta.color["GREEN"], key, + self.meta.color["ENDC"])) + Msg().template(78) + if mas: + try: + print("") + if self.meta.default_answer and Msg().answer() in ["y", "Y"]: + pass + else: + sys.exit(0) + except KeyboardInterrupt: + print("") + sys.exit(0) + def _reference_rmvs(self, removes): - """ - Prints all removed packages + """Prints all removed packages """ Msg().template(78) print("| Total {0} packages removed".format(len(removes))) @@ -227,8 +252,7 @@ class PackageManager(object): print("") # new line at end def find(self): - """ - Find installed Slackware packages + """Find installed Slackware packages """ matching = size = 0 print("\nPackages with matching name [ {0}{1}{2} ]\n".format( @@ -264,8 +288,7 @@ class PackageManager(object): self.meta.color["ENDC"])) def display(self): - """ - Print the Slackware packages contents + """Print the Slackware packages contents """ for pkg in self.binary: find = find_package(pkg + self.meta.sp, self.meta.pkg_path) @@ -283,8 +306,7 @@ class PackageManager(object): Msg().pkg_not_found(bol, pkg, message, eol) def package_list(self, repo, INDEX, installed): - """ - List with the installed packages + """List with the installed packages """ tty_size = os.popen("stty size", "r").read().split() row = int(tty_size[0]) - 2 @@ -322,8 +344,7 @@ class PackageManager(object): sys.exit(0) def list_greps(self, repo, packages): - """ - Grep packages + """Grep packages """ pkg_list, pkg_size = [], [] for line in packages.splitlines(): @@ -339,8 +360,7 @@ class PackageManager(object): return pkg_list, pkg_size def list_lib(self, repo): - """ - Return package lists + """Return package lists """ if repo == "sbo": if (os.path.isfile( @@ -356,16 +376,14 @@ class PackageManager(object): return packages def _slackr_repo(self, repo, pkg): - """ - Fix slackers packages + """Fix slackers packages """ if repo == "slackr": return fix_slackers_pkg(pkg) return pkg def list_color_tag(self, pkg): - """ - Tag with color installed packages + """Tag with color installed packages """ find = pkg + self.meta.sp if pkg.endswith(".txz") or pkg.endswith(".tgz"): @@ -376,8 +394,7 @@ class PackageManager(object): return pkg def list_of_installed(self, pkg): - """ - Return installed packages + """Return installed packages """ find = pkg + self.meta.sp if pkg.endswith(".txz") or pkg.endswith(".tgz"):