def add_test_dependency(context, testname, requirement): if not isinstance(requirement, AptRequirement): raise TypeError(requirement) tests_control_path = context.abspath("debian/tests/control") # TODO(jelmer): If requirement is for one of our binary packages # but "@" is already present then don't do anything. try: with Deb822Editor(path=tests_control_path) as updater: command_counter = 1 for control in updater.paragraphs: try: name = control["Tests"] except KeyError: name = "command%d" % command_counter command_counter += 1 if name != testname: continue for rel in requirement.relations: control["Depends"] = ensure_relation( control.get("Depends", ""), PkgRelation.str([rel])) except FormattingUnpreservable as e: logging.info("Unable to edit %s in a way that preserves formatting.", e.path) return False if not updater.changed: return False desc = requirement.pkg_relation_str() logging.info("Adding dependency to test %s: %s", testname, desc) return context.commit( "Add missing dependency for test %s on %s." % (testname, desc), )
def install(self, requirements): missing = [] for req in requirements: try: if not req.met(self.apt.session): missing.append(req) except NotImplementedError: missing.append(req) if not missing: return still_missing = [] apt_requirements = [] for m in missing: apt_req = self.resolve(m) if apt_req is None: still_missing.append(m) else: apt_requirements.append(apt_req) if apt_requirements: self.apt.satisfy([ PkgRelation.str(chain(*[r.relations for r in apt_requirements])) ]) if still_missing: raise UnsatisfiedRequirements(still_missing)
def add_build_dependency(context, requirement: AptRequirement): if not isinstance(requirement, AptRequirement): raise TypeError(requirement) control_path = context.abspath("debian/control") try: with ControlEditor(path=control_path) as updater: for binary in updater.binaries: if requirement.touches_package(binary["Package"]): raise CircularDependency(binary["Package"]) for rel in requirement.relations: updater.source["Build-Depends"] = ensure_relation( updater.source.get("Build-Depends", ""), PkgRelation.str([rel])) except FormattingUnpreservable as e: logging.info("Unable to edit %s in a way that preserves formatting.", e.path) return False desc = requirement.pkg_relation_str() if not updater.changed: logging.info("Giving up; dependency %s was already present.", desc) return False logging.info("Adding build dependency: %s", desc) return context.commit("Add missing build dependency on %s." % desc)
def update_deps(control, field, package, min_version, epoch=None): bdi = PkgRelation.parse_relations(control[field]) if epoch is not None: epoch = "%d:" % epoch else: epoch = "" update_relation(bdi, package, ">=", epoch + "%d.%d.%d~" % min_version) control[field] = PkgRelation.str(bdi)
def explain(self, requirements): apt_requirements = [] for r in requirements: apt_req = self.resolve(r) if apt_req is not None: apt_requirements.append((r, apt_req)) if apt_requirements: yield ( self.apt.satisfy_command([ PkgRelation.str( chain(*[r.relations for o, r in apt_requirements])) ]), [o for o, r in apt_requirements], )
def update_deps(control, field, package, min_version): bdi = PkgRelation.parse_relations(control[field]) update_relation(bdi, package, ">=", "%d.%d.%d~" % min_version) control[field] = PkgRelation.str(bdi)
def generate_debian_package(args, config): debfile = Deb822( open("debian/control"), fields=["Build-Depends", "Build-Depends-Indep"]) rel_str = debfile.get("Build-Depends") if debfile.has_key("Build-Depends-Indep"): rel_str = rel_str + "," + debfile.get("Build-Depends-Indep") relations = PkgRelation.parse_relations(rel_str) cache = Cache() # Check if all required packages are installed for dep in relations: if not check_deb_dependency_installed(cache, dep): # Install not found dependencies print("Dependency not matched: " + str(dep)) if not install_dependency(cache, dep): print("Dependency cannot be installed: " + PkgRelation.str([dep ])) exit(1) changelog = Changelog(open("debian/changelog")) old_changelog = Changelog(open("debian/changelog")) dist = os.popen("lsb_release -c").read() dist = dist[dist.rfind(":") + 1::].replace("\n", "").replace( "\t", "").replace(" ", "") new_version = get_debian_version(args, dist) changelog.new_block(version=new_version, package=changelog.package, distributions="testing", changes=["\n Generating new package version\n"], author=changelog.author, date=strftime("%a, %d %b %Y %H:%M:%S %z"), urgency=changelog.urgency) changelog.write_to_open_file(open("debian/changelog", 'w')) # Execute commands defined in config: if config.has_key("prebuild-command"): print("Executing prebuild-command: " + str(config["prebuild-command"])) if os.system(config["prebuild-command"]) != 0: print("Failed to execute prebuild command") exit(1) if os.system("dpkg-buildpackage -uc -us") != 0: print("Error generating package") exit(1) if os.system("sudo dpkg -i ../*" + new_version + "_*.deb") != 0: print("Packages are not installable") exit(1) files = glob.glob("../*" + new_version + "_*.deb") if args.command == "upload": for f in files: if f is files[-1]: is_last = True else: is_last = False if new_version.find("~") == -1: upload_package(args, config, dist, f) upload_package(args, config, dist + "-dev", f, publish=is_last) if args.clean: files = glob.glob("../*" + new_version + "*") for f in files: os.remove(f) # Write old changelog to let everything as it was old_changelog.write_to_open_file(open("debian/changelog", 'w'))
def pkg_relation_str(self): return PkgRelation.str(self.relations)
def __str__(self): return "Unsatisfied APT conflicts: %s" % PkgRelation.str( self.relations)
def __repr__(self): return "%s.from_str(%r)" % ( type(self).__name__, PkgRelation.str(self.relations), )
def __str__(self): return "Unsatisfied APT dependencies: %s" % PkgRelation.str( self.relations)