def test_build_depends_profiles(self): """Test that https://wiki.debian.org/BuildProfileSpec restrictions are parseable. """ self.addSource("precise", "main", "hello", "1.0-1", ["hello"], fields={"Build-Depends": "gettext <!stage1> <!cross>, " "base-files <stage1>, " "gettext (<< 0.7) | debhelper (>= 9)"}) self.addPackage("precise", "main", "i386", "hello", "1.0-1") self.addSource("precise", "main", "gettext", "0.8.1.1-5ubuntu3", ["gettext"]) self.addPackage("precise", "main", "i386", "gettext", "0.8.1.1-5ubuntu3") self.addSource("precise", "main", "base-files", "6.5ubuntu6", ["base-files"]) self.addPackage("precise", "main", "i386", "base-files", "6.5ubuntu6") self.addSource("precise", "main", "debhelper", "9.20120115ubuntu3", ["debhelper"]) self.addPackage("precise", "main", "i386", "debhelper", "9.20120115ubuntu3") branch = "collection.precise" self.addSeed(branch, "base") self.addSeedPackage(branch, "base", "hello") germinator = Germinator("i386") archive = TagFile( "precise", "main", "i386", "file://%s" % self.archive_dir) germinator.parse_archive(archive) structure = self.openSeedStructure(branch) germinator.plant_seeds(structure) germinator.grow(structure) self.assertEqual( set(["gettext", "debhelper"]), germinator.get_build_depends(structure, "base"))
def test_depends_multiarch(self): """Compare Depends behaviour against the multiarch specification. https://wiki.ubuntu.com/MultiarchSpec """ for ma, qual, allowed in ( (None, "", True), (None, ":any", False), (None, ":native", False), ("same", "", True), ("same", ":any", False), ("same", ":native", False), ("foreign", "", True), ("foreign", ":any", False), ("foreign", ":native", False), ("allowed", "", True), ("allowed", ":any", True), ("allowed", ":native", False), ): self.addSource("precise", "main", "hello", "1.0-1", ["hello"]) self.addPackage("precise", "main", "i386", "hello", "1.0-1", fields={"Depends": "gettext%s" % qual}) self.addSource("precise", "main", "gettext", "0.18.1.1-5ubuntu3", ["gettext"]) package_fields = {} if ma is not None: package_fields["Multi-Arch"] = ma self.addPackage("precise", "main", "i386", "gettext", "0.18.1.1-5ubuntu3", fields=package_fields) branch = "collection.precise" self.addSeed(branch, "base") self.addSeedPackage(branch, "base", "hello") germinator = Germinator("i386") archive = TagFile("precise", "main", "i386", "file://%s" % self.archive_dir) germinator.parse_archive(archive) structure = self.openSeedStructure(branch) germinator.plant_seeds(structure) germinator.grow(structure) expected = set() if allowed: expected.add("gettext") self.assertEqual( expected, germinator.get_depends(structure, "base"), "Depends: gettext%s on Multi-Arch: %s incorrectly %s" % (qual, ma if ma else "none", "disallowed" if allowed else "allowed")) shutil.rmtree(self.archive_dir) shutil.rmtree(self.seeds_dir)
def test_snap(self): branch = "collection.precise" self.addSeed(branch, "base") self.addSeedSnap(branch, "base", "hello") germinator = Germinator("i386") structure = self.openSeedStructure(branch) germinator.plant_seeds(structure) germinator.grow(structure) self.assertEqual(set(["hello"]), germinator.get_snaps(structure, "base"))
def set_seeds(self, options, seeds): self.seeds = seeds # Suppress most log information germinate_logging(logging.CRITICAL) logging.getLogger('germinate.archive').setLevel(logging.INFO) global MIRRORS, COMPONENTS print("Germinating") g = Germinator(options.arch) archive = germinate.archive.TagFile(options.dist, COMPONENTS, options.arch, MIRRORS, cleanup=True) g.parse_archive(archive) needed_seeds = [] build_tree = False try: structure = SeedStructure(options.release, options.seeds) for seedname in self.seeds: if seedname == ('%s+build-depends' % structure.supported): seedname = structure.supported build_tree = True needed_seeds.append(seedname) g.plant_seeds(structure, seeds=needed_seeds) except SeedError: sys.exit(1) g.grow(structure) for seedname in structure.names: for pkg in g.get_seed_entries(structure, seedname): self.package.setdefault(pkg, Package(pkg)) self.package[pkg].set_seed(seedname + ".seed") for pkg in g.get_seed_recommends_entries(structure, seedname): self.package.setdefault(pkg, Package(pkg)) self.package[pkg].set_seed(seedname + ".seed-recommends") for pkg in g.get_depends(structure, seedname): self.package.setdefault(pkg, Package(pkg)) self.package[pkg].set_seed(seedname + ".depends") if build_tree: build_depends = set(g.get_build_depends(structure, seedname)) for inner in structure.inner_seeds(structure.supported): build_depends -= set(g.get_seed_entries(structure, inner)) build_depends -= set( g.get_seed_recommends_entries(structure, inner)) build_depends -= g.get_depends(structure, inner) for pkg in build_depends: self.package.setdefault(pkg, Package(pkg)) self.package[pkg].set_seed(structure.supported + ".build-depends")
def test_snap_recommends(self): branch = "collection.precise" self.addSeed(branch, "base") self.addSeedSnap(branch, "base", "(hello)") with self.assertLogs("germinate", level=logging.WARNING) as logs: germinator = Germinator("i386") structure = self.openSeedStructure(branch) germinator.plant_seeds(structure) germinator.grow(structure) self.assertIn('ignoring hello', logs.output[0]) self.assertEqual(set([]), germinator.get_snaps(structure, "base"))
def set_seeds(self, options, seeds): self.seeds = seeds # Suppress most log information germinate_logging(logging.CRITICAL) logging.getLogger('germinate.archive').setLevel(logging.INFO) global MIRRORS, COMPONENTS print("Germinating") g = Germinator(options.arch) archive = germinate.archive.TagFile( options.dist, COMPONENTS, options.arch, MIRRORS, cleanup=True) g.parse_archive(archive) needed_seeds = [] build_tree = False try: structure = SeedStructure(options.release, options.seeds) for seedname in self.seeds: if seedname == ('%s+build-depends' % structure.supported): seedname = structure.supported build_tree = True needed_seeds.append(seedname) g.plant_seeds(structure, seeds=needed_seeds) except SeedError: sys.exit(1) g.grow(structure) for seedname in structure.names: for pkg in g.get_seed_entries(structure, seedname): self.package.setdefault(pkg, Package(pkg)) self.package[pkg].set_seed(seedname + ".seed") for pkg in g.get_seed_recommends_entries(structure, seedname): self.package.setdefault(pkg, Package(pkg)) self.package[pkg].set_seed(seedname + ".seed-recommends") for pkg in g.get_depends(structure, seedname): self.package.setdefault(pkg, Package(pkg)) self.package[pkg].set_seed(seedname + ".depends") if build_tree: build_depends = set(g.get_build_depends(structure, seedname)) for inner in structure.inner_seeds(structure.supported): build_depends -= set(g.get_seed_entries(structure, inner)) build_depends -= set(g.get_seed_recommends_entries( structure, inner)) build_depends -= g.get_depends(structure, inner) for pkg in build_depends: self.package.setdefault(pkg, Package(pkg)) self.package[pkg].set_seed(structure.supported + ".build-depends")
def test_build_depends_multiarch(self): """Compare Build-Depends behaviour against the multiarch specification. https://wiki.ubuntu.com/MultiarchCross#Build_Dependencies """ for ma, qual, allowed in ( (None, "", True), (None, ":any", False), (None, ":native", True), ("same", "", True), ("same", ":any", False), ("same", ":native", True), ("foreign", "", True), ("foreign", ":any", False), ("foreign", ":native", False), ("allowed", "", True), ("allowed", ":any", True), ("allowed", ":native", True), ): self.addSource("precise", "main", "hello", "1.0-1", ["hello"], fields={"Build-Depends": "gettext%s" % qual}) self.addPackage("precise", "main", "i386", "hello", "1.0-1") self.addSource("precise", "main", "gettext", "0.18.1.1-5ubuntu3", ["gettext"]) package_fields = {} if ma is not None: package_fields["Multi-Arch"] = ma self.addPackage("precise", "main", "i386", "gettext", "0.18.1.1-5ubuntu3", fields=package_fields) branch = "collection.precise" self.addSeed(branch, "base") self.addSeedPackage(branch, "base", "hello") germinator = Germinator("i386") archive = TagFile( "precise", "main", "i386", "file://%s" % self.archive_dir) germinator.parse_archive(archive) structure = self.openSeedStructure(branch) germinator.plant_seeds(structure) germinator.grow(structure) expected = set() if allowed: expected.add("gettext") self.assertEqual( expected, germinator.get_build_depends(structure, "base"), "Build-Depends: gettext%s on Multi-Arch: %s incorrectly %s" % ( qual, ma if ma else "none", "disallowed" if allowed else "allowed")) shutil.rmtree(self.archive_dir) shutil.rmtree(self.seeds_dir)
def test_snap(self): import logging from germinate.log import germinate_logging germinate_logging(logging.INFO) branch = "collection.precise" self.addSeed(branch, "base") self.addSeedSnap(branch, "base", "hello") germinator = Germinator("i386") structure = self.openSeedStructure(branch) germinator.plant_seeds(structure) germinator.grow(structure) self.assertEqual(set(["hello"]), germinator.get_snaps(structure, "base"))
def test_build_depends_profiles(self): """Test that https://wiki.debian.org/BuildProfileSpec restrictions are parseable. """ self.addSource("precise", "main", "hello", "1.0-1", ["hello"], fields={ "Build-Depends": "gettext <!stage1> <!cross>, " "base-files <stage1>, " "gettext (<< 0.7) | debhelper (>= 9)" }) self.addPackage("precise", "main", "i386", "hello", "1.0-1") self.addSource("precise", "main", "gettext", "0.8.1.1-5ubuntu3", ["gettext"]) self.addPackage("precise", "main", "i386", "gettext", "0.8.1.1-5ubuntu3") self.addSource("precise", "main", "base-files", "6.5ubuntu6", ["base-files"]) self.addPackage("precise", "main", "i386", "base-files", "6.5ubuntu6") self.addSource("precise", "main", "debhelper", "9.20120115ubuntu3", ["debhelper"]) self.addPackage("precise", "main", "i386", "debhelper", "9.20120115ubuntu3") branch = "collection.precise" self.addSeed(branch, "base") self.addSeedPackage(branch, "base", "hello") germinator = Germinator("i386") archive = TagFile("precise", "main", "i386", "file://%s" % self.archive_dir) germinator.parse_archive(archive) structure = self.openSeedStructure(branch) germinator.plant_seeds(structure) germinator.grow(structure) self.assertEqual(set(["gettext", "debhelper"]), germinator.get_build_depends(structure, "base"))
def test_versioned_provides(self): """Germinator.parse_archive resolves versioned provides.""" self.addSource("bionic", "main", "hello", "1.0-1", ["hello", "hello-dependency", "hello-bad"], fields={"Maintainer": "Test Person <*****@*****.**>"}) self.addPackage("bionic", "main", "i386", "hello", "1.0-1", fields={ "Maintainer": "Test Person <*****@*****.**>", "Depends": "hello-virtual (>= 2.0)", }) self.addPackage("bionic", "main", "i386", "hello-bad", "2.0-1", fields={ "Source": "hello (= 1.0-1)", "Provides": "hello-virtual (= 1.0)" }) self.addPackage("bionic", "main", "i386", "hello-dependency", "1.0-1", fields={ "Source": "hello", "Provides": "hello-virtual (= 2.0)" }) branch = "ubuntu.bionic" self.addSeed(branch, "supported") self.addSeedPackage(branch, "supported", "hello") germinator = Germinator("i386") archive = TagFile("bionic", "main", "i386", "file://%s" % self.archive_dir) germinator.parse_archive(archive) self.assertIn("hello", germinator._sources) self.assertIn("hello", germinator._packages) self.assertEqual("deb", germinator._packagetype["hello"]) self.assertIn("hello-dependency", germinator._packages) self.assertEqual("deb", germinator._packagetype["hello-dependency"]) self.assertIn("hello-bad", germinator._packages) self.assertEqual("deb", germinator._packagetype["hello-bad"]) self.assertEqual( {"hello-virtual": { "hello-bad": "1.0", "hello-dependency": "2.0" }}, germinator._provides) structure = self.openSeedStructure(branch) germinator.plant_seeds(structure) germinator.grow(structure) expected = set(["hello-dependency"]) self.assertEqual(expected, germinator.get_depends(structure, "supported"))
def main(argv): options = parse_options(argv) if options.verbose: germinate_logging(logging.DEBUG) else: germinate_logging(logging.INFO) g = Germinator(options.arch) archive = germinate.archive.TagFile( options.dist, options.components, options.arch, options.mirrors, source_mirrors=options.source_mirrors, installer_packages=options.installer, cleanup=options.cleanup) g.parse_archive(archive) if os.path.isfile("hints"): with open("hints") as hints: g.parse_hints(hints) try: structure = SeedStructure(options.release, options.seeds, options.bzr) for seed_package in options.seed_packages: parent, pkg = seed_package.split('/') structure.add(pkg, [" * " + pkg], parent) g.plant_seeds(structure) except SeedError: sys.exit(1) try: with Seed(options.seeds, options.release, "blacklist", options.bzr) as blacklist: g.parse_blacklist(structure, blacklist) except SeedError: pass g.grow(structure) g.add_extras(structure) if options.want_rdepends: g.reverse_depends(structure) for seedname in structure.names + ["extra"]: g.write_full_list(structure, seedname, seedname) g.write_seed_list(structure, seedname + ".seed", seedname) g.write_seed_recommends_list(structure, seedname + ".seed-recommends", seedname) g.write_depends_list(structure, seedname + ".depends", seedname) g.write_build_depends_list(structure, seedname + ".build-depends", seedname) if seedname != "extra" and seedname in structure: structure.write_seed_text(seedname + ".seedtext", seedname) g.write_sources_list(structure, seedname + ".sources", seedname) g.write_build_sources_list(structure, seedname + ".build-sources", seedname) g.write_all_list(structure, "all") g.write_all_source_list(structure, "all.sources") g.write_supported_list(structure, "%s+build-depends" % structure.supported) g.write_supported_source_list( structure, "%s+build-depends.sources" % structure.supported) g.write_all_extra_list(structure, "all+extra") g.write_all_extra_source_list(structure, "all+extra.sources") g.write_provides_list(structure, "provides") structure.write("structure") structure.write_dot("structure.dot") if os.path.exists("rdepends"): shutil.rmtree("rdepends") if options.want_rdepends: os.mkdir("rdepends") os.mkdir(os.path.join("rdepends", "ALL")) for pkg in g.get_all(structure): dirname = os.path.join("rdepends", g.get_source(pkg)) if not os.path.exists(dirname): os.mkdir(dirname) g.write_rdepend_list(structure, os.path.join(dirname, pkg), pkg) os.symlink(os.path.join("..", g.get_source(pkg), pkg), os.path.join("rdepends", "ALL", pkg)) g.write_blacklisted(structure, "blacklisted") return 0
def main(argv): options = parse_options(argv) if options.verbose: germinate_logging(logging.DEBUG) else: germinate_logging(logging.INFO) g = Germinator(options.arch) g._always_follow_build_depends = options.always_follow_build_depends archive = germinate.archive.TagFile(options.dist, options.components, options.arch, options.mirrors, source_mirrors=options.source_mirrors, installer_packages=options.installer, cleanup=options.cleanup) g.parse_archive(archive) if os.path.isfile("hints"): with open("hints") as hints: g.parse_hints(hints) try: structure = SeedStructure(options.release, options.seeds, options.vcs) for seed_package in options.seed_packages: parent, pkg = seed_package.split('/') structure.add(pkg, [" * " + pkg], parent) g.plant_seeds(structure) except SeedError: sys.exit(1) try: with Seed(options.seeds, options.release, "blacklist", options.vcs) as blacklist: g.parse_blacklist(structure, blacklist) except SeedError: pass g.grow(structure) g.add_extras(structure) if options.want_rdepends: g.reverse_depends(structure) for seedname in structure.names + ["extra"]: g.write_full_list(structure, seedname, seedname) g.write_seed_list(structure, seedname + ".seed", seedname) g.write_seed_recommends_list(structure, seedname + ".seed-recommends", seedname) g.write_depends_list(structure, seedname + ".depends", seedname) g.write_build_depends_list(structure, seedname + ".build-depends", seedname) g.write_snap_list(structure, seedname + ".snaps", seedname) if seedname != "extra" and seedname in structure: structure.write_seed_text(seedname + ".seedtext", seedname) g.write_sources_list(structure, seedname + ".sources", seedname) g.write_build_sources_list(structure, seedname + ".build-sources", seedname) g.write_all_list(structure, "all") g.write_all_source_list(structure, "all.sources") g.write_all_snap_list(structure, "all.snaps") g.write_supported_list(structure, "%s+build-depends" % structure.supported) g.write_supported_source_list( structure, "%s+build-depends.sources" % structure.supported) g.write_all_extra_list(structure, "all+extra") g.write_all_extra_source_list(structure, "all+extra.sources") g.write_provides_list(structure, "provides") structure.write("structure") structure.write_dot("structure.dot") if os.path.exists("rdepends"): shutil.rmtree("rdepends") if options.want_rdepends: os.mkdir("rdepends") os.mkdir(os.path.join("rdepends", "ALL")) for pkg in g.get_all(structure): dirname = os.path.join("rdepends", g.get_source(pkg)) if not os.path.exists(dirname): os.mkdir(dirname) g.write_rdepend_list(structure, os.path.join(dirname, pkg), pkg) os.symlink(os.path.join("..", g.get_source(pkg), pkg), os.path.join("rdepends", "ALL", pkg)) g.write_blacklisted(structure, "blacklisted") return 0