diff --git a/bpkg_manager/subproc.py b/bpkg_manager/subproc.py index 3eae60e..f0112ba 100644 --- a/bpkg_manager/subproc.py +++ b/bpkg_manager/subproc.py @@ -137,6 +137,9 @@ def _install(pipe_to_blender, pkgpath: pathlib.Path, dest: pathlib.Path): """Extracts/moves package at `pkgpath` to `dest`""" import zipfile + log = logging.getLogger('%s.install' % __name__) + + log.debug("Starting installation") pipe_to_blender.send(Progress(0.0)) if not pkgpath.is_file(): @@ -155,13 +158,27 @@ def _install(pipe_to_blender, pkgpath: pathlib.Path, dest: pathlib.Path): # check to see if the file is in compressed format (.zip) if zipfile.is_zipfile(pkgpath): + log.debug("Package is zipfile") try: file_to_extract = zipfile.ZipFile(str(pkgpath), 'r') except Exception as err: + # TODO HACK: see if it makes sense to make a single InstallError class which inherits from both Exception and SubprocError + # It sounds weird, but it could avoid the need for duplication here; create a new InstallError with the right message, + # then send it to blender and also raise it. pipe_to_blender.send(InstallError("Failed to read zip file: %s" % err)) raise InstallException from err - conflicts = [f for f in file_to_extract.namelist() if (dest / f).exists()] + def root_files(filelist: list) -> list: + """Some string parsing to get a list of the root contents of a zip from its namelist""" + rootlist = [] + for f in filelist: + # Get all names which have no path separators (root level files) + # or have a single path separator at the end (root level directories). + if len(f.rstrip('/').split('/')) == 1: + rootlist.append(f) + return rootlist + + conflicts = [f for f in root_files(file_to_extract.namelist()) if (dest / f).exists()] if len(conflicts) > 0: # TODO: handle this better than just dumping a list of all files pipe_to_blender.send(FileConflictError("Installation would overwrite: %s" % conflicts, conflicts)) @@ -174,6 +191,7 @@ def _install(pipe_to_blender, pkgpath: pathlib.Path, dest: pathlib.Path): raise InstallException from err else: + log.debug("Package is pyfile") dest_file = (dest / pkgpath.name) if dest_file.exists(): @@ -190,6 +208,7 @@ def _install(pipe_to_blender, pkgpath: pathlib.Path, dest: pathlib.Path): try: pkgpath.unlink() + log.debug("Removed cached package: %s", pkgpath) except Exception as err: pipe_to_blender.send(SubprocWarning("Failed to remove package from cache: %s" % err)) raise InstallException from err