Exemplo n.º 1
0
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), )
Exemplo n.º 2
0
 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)
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
 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)
Exemplo n.º 5
0
 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)
Exemplo n.º 6
0
 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],
         )
Exemplo n.º 7
0
 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)
Exemplo n.º 8
0
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'))
Exemplo n.º 9
0
 def pkg_relation_str(self):
     return PkgRelation.str(self.relations)
Exemplo n.º 10
0
 def __str__(self):
     return "Unsatisfied APT conflicts: %s" % PkgRelation.str(
         self.relations)
Exemplo n.º 11
0
 def __repr__(self):
     return "%s.from_str(%r)" % (
         type(self).__name__,
         PkgRelation.str(self.relations),
     )
Exemplo n.º 12
0
 def __str__(self):
     return "Unsatisfied APT dependencies: %s" % PkgRelation.str(
         self.relations)