def _recursive_update(self, dependencies): packages_list = set() for candidate in self.packages: packages_list.add(candidate.name) for dependency in dependencies: # If not present, download and recurse if dependency[0][0] not in packages_list: filename = self._download_single_deb(dependency[0][0]) if filename: version = re.findall('.*_(.*)_', filename)[0] debfile = apt.debfile.DebPackage(self.deb_dir + filename, self.cache) self.packages.add(Package(debfile.pkgname, version, self.deb_dir + filename, dependencies=debfile.depends)) self._recursive_update(debfile.depends) # If present, update and recurse # Beware of multiple versions else: working_set = set() latest = None for package in self.packages: if package.name == dependency[0][0]: if self.cache.has_key(package.name): working_set.add(package) else: print("Package '" + package.name + "' not found in cache.") if len(working_set) > 0: for package in working_set: if latest is None: latest = package else: if apt_pkg.version_compare(package.version, latest.version) > 0: latest = package debfile = apt.debfile.DebPackage(latest.filename, self.cache) status = debfile.compare_to_version_in_cache(use_installed=False) if status == 1: uri = self.cache[latest.name].candidate.uri print("Updating '" + latest.name + "' from " + latest.version + " to " + self.cache[latest.name].candidate.version + " :") subprocess.call(["curl", "-O", "-#", uri]) filename = uri.split("/")[-1] updated_debfile = apt.debfile.DebPackage(self.deb_dir + filename, self.cache) self.packages.add(Package(updated_debfile.pkgname, self.cache[latest.name].candidate.version, self.deb_dir + filename, dependencies=updated_debfile.depends)) self._recursive_update(updated_debfile.depends)
def update_dependencies(self, filename=None): # TODO : feed the update with a file containing packages, and only # download top level packages if filename: with open(filename, 'r') as f: packages_list = f.read().split("\n") packages_list.pop() self._get_missing_packages(packages_list) self.build_package_list() packages_to_update = self.top_level_packages for deb_filename in packages_to_update: debfile = apt.debfile.DebPackage(deb_filename, self.cache) # TODO : Change this (dirty) if self.cache.has_key(debfile.pkgname): status = debfile.compare_to_version_in_cache(use_installed=False) if status == 1: uri = self.cache[debfile.pkgname].candidate.uri print("Updating '" + debfile.pkgname + "' to " + self.cache[debfile.pkgname].candidate.version + " :") subprocess.call(["curl", "-O", "-#", uri]) filename = uri.split("/")[-1] updated_debfile = apt.debfile.DebPackage(self.deb_dir + filename, self.cache) self.packages.add(Package(updated_debfile.pkgname, self.cache[debfile.pkgname].candidate.version, self.deb_dir + filename, dependencies=updated_debfile.depends)) else: print("Package '" + debfile.pkgname + "' not found in cache.") self._recursive_update(debfile.depends) self._refresh_parents()