diff --git a/installsystems/database.py b/installsystems/database.py index 597f4248eb2a99638497241d6ba278d43469b65f..e5adffbffa769d3a342484b5772b83302dedfaa1 100644 --- a/installsystems/database.py +++ b/installsystems/database.py @@ -128,35 +128,3 @@ class Database(object): os.rename(newdb_path, self.path) except Exception as e: raise Exception("Removing metadata fail: %s" % e) - - def databalls(self, name, version): - '''List data tarballs filenames''' - try: - self.file.seek(0) - db = Tarball.open(fileobj=self.file, mode='r:gz') - jdesc = json.loads(db.get_str("%s-%s.json" % (name, version))) - db.close() - return jdesc["data"] - except Exception as e: - raise Exception("List data tarballs fail: %s" % e) - - def find(self, name, version=None): - '''Find last version of an image''' - try: - self.file.seek(0) - tarb = Tarball.open(fileobj=self.file, mode='r:gz') - candidates = [ int((os.path.splitext(tpname)[0]).rsplit("-", 1)[1]) - for tpname in tarb.getnames("%s-\d+" % name) ] - tarb.close() - except Exception as e: - raise Exception("Find in db %s fail: %s" % (self.path, e)) - # no candidates => go west - if len(candidates) == 0: - return None - # get last version - if version is None: - version = max(candidates) - # check if version exists - if int(version) not in candidates: - return None - return self.get(name, version) diff --git a/installsystems/image.py b/installsystems/image.py index 5115b6c8b6233903ef3f2d653c572eb0b8762e7d..48c24998c7b665d7c0a027a5627a23f24e4f7433 100644 --- a/installsystems/image.py +++ b/installsystems/image.py @@ -293,6 +293,12 @@ class PackageImage(Image): # FIXME: we should check valid information here return desc + def data_path(self, name): + '''Return a data filename from its internal name''' + if self.md5name: + return os.path.join(self.base_path, self._metadata["data"][name]["md5"]) + return os.path.join(self.base_path, "%s-%s%s" % (self.id, name, self.extension_data)) + @property def tarballs(self): '''List path of all related tarballs''' @@ -300,15 +306,10 @@ class PackageImage(Image): name = os.path.join(self.base_path, self.md5) if self.md5name else self.path d_d[name] = {"md5": self.md5, "size": self.size} for key, value in self._metadata["data"].items(): - if self.md5name: - name = os.path.join(self.base_path, value["md5"]) - else: - name = os.path.join(self.base_path, - "%s-%s%s" % (self.id, key, self.extension_data)) - d_d[name] = {"md5": value["md5"], "size": value["size"]} + d_d[self.data_path(key)] = {"md5": value["md5"], "size": value["size"]} return d_d - def tarcheck(self, message="Check MD5"): + def check(self, message="Check MD5"): '''Check md5 and size of tarballs are correct''' arrow(message, 1, self.verbose) # open /dev/null @@ -368,33 +369,18 @@ class PackageImage(Image): # tarball info tinfo = self._metadata["data"][dataname] # build data tar paths - paths = [ os.path.join(self.base_path, tinfo["md5"]), - os.path.join(self.base_path, "%s-%s%s" % (self.id, - dataname, - self.extension_data)) ] - # try to open path - fo = None - for path in paths: - try: - fo = istools.uopen(path) - break - except Exception: - pass - # error if no file is openned - if fo is None: - raise Exception("Unable to open data tarball") + path = self.data_path(dataname) + try: + fo = istools.uopen(path) + except Exception as e: + raise Exception("Unable to open data tarball %s" % path) try: # create tar object t = Tarball.open(fileobj=fo, mode="r|gz") except Exception as e: raise Exception("Invalid data tarball: %s" % e) # filter on file to extact - if filelist is not None: - members = [] - for fi in filelist: - members += t.gettarinfo(name) - else: - members = None + members = None if filelist is None else [ t.gettarinfo(name) for name in filelist ] try: t.extractall(target, members) except Exception as e: diff --git a/installsystems/repository.py b/installsystems/repository.py index 8f9d41953268cc7823b2743f76ea5c9ecc8ff881..b22fb419d956cdef3055054742837c3eb6df8d31 100644 --- a/installsystems/repository.py +++ b/installsystems/repository.py @@ -83,7 +83,7 @@ class Repository(object): if istools.pathtype(self.config.path) != "file": raise NotImplementedError("Repository addition must be local") # checking data tarballs md5 before copy - package.tarcheck("Check tarballs before copy") + package.check("Check tarballs before copy") # adding file to repository arrow("Copying files", 1, self.verbose) for src,value in package.tarballs.items(): @@ -98,7 +98,7 @@ class Repository(object): r_package = PackageImage(os.path.join(self.config.path, package.md5), md5name=True, verbose=self.verbose) # checking data tarballs md5 after copy - r_package.tarcheck("Check tarballs after copy") + r_package.check("Check tarballs after copy") # add description to db self.db.add(r_package) # update last file @@ -138,15 +138,14 @@ class Repository(object): def get(self, name, version): '''return a package from a name and version of pakage''' - debug("Getting %s v%s" % (name, version)) # get file md5 from db r = self.db.ask("select md5 from image where name = ? and version = ? limit 1", (name,version)).fetchone() if r is None: raise Exception("No such image %s version %s" % name, version) - return PackageImage(os.path.join(self.config.path, r[0]), - md5name=True, - verbose=self.verbose) + path = os.path.join(self.config.path, r[0]) + debug("Getting %s v%s from %s" % (name, version, path)) + return PackageImage(path, md5name=True, verbose=self.verbose) def last(self, name): '''Return last version of name in repo or -1 if not found'''