diff --git a/.github/workflows/action.yml b/.github/workflows/action.yml index d74bf69c..e36727e7 100644 --- a/.github/workflows/action.yml +++ b/.github/workflows/action.yml @@ -169,15 +169,5 @@ jobs: import %workspace%/../../.github/workflows/ci.bazelrc - id: prepare run: | - cd e2e/bzlmod-toolchain-circular-dependencies - bazelisk run @bazeldnf_rpms//:fetch-repo - bazelisk run @bazeldnf_rpms//:update-lock-file - - id: test - run: | - cd e2e/bzlmod-toolchain-circular-dependencies - bazelisk build //... || status=$? - if [ ${status} -ne 0 ]; then - echo "::warning::Optional job failed." - echo "optional_fail=true" >> "${GITHUB_OUTPUT}" - echo "optional_fail_status=${status}" >> "${GITHUB_OUTPUT}" - fi + (cd e2e/bzlmod-toolchain-circular-dependencies && make test) + (cd e2e/bzlmod-toolchain-circular-dependencies-fake && make test) diff --git a/.github/workflows/allowed-to-fail.yml b/.github/workflows/allowed-to-fail.yml deleted file mode 100644 index 7b69d91f..00000000 --- a/.github/workflows/allowed-to-fail.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: "build and test - allowed to fail" - -on: - pull_request_target: - branches: [ main ] - -concurrency: - # Cancel previous actions from the same PR or branch except 'main' branch. - # See https://docs.github.com/en/actions/using-jobs/using-concurrency and https://docs.github.com/en/actions/learn-github-actions/contexts for more info. - group: concurrency-group::${{ github.workflow }}::${{ github.event.pull_request.number > 0 && format('pr-{0}', github.event.pull_request.number) || github.ref_name }}${{ github.ref_name == 'main' && format('::{0}', github.run_id) || ''}} - cancel-in-progress: ${{ github.ref_name != 'main' }} - -jobs: - - e2e-bzlmod-toolchain-circular-dependencies: - runs-on: ubuntu-latest - permissions: - pull-requests: write - steps: - - uses: actions/checkout@v4 - - uses: bazel-contrib/setup-bazel@0.8.5 - with: - # Avoid downloading Bazel every time. - bazelisk-cache: true - # Keep a disk-cache - disk-cache: true - # Share repository cache between workflows. - repository-cache: true - # enable some flags for CI - bazelrc: | - import %workspace%/../../.aspect/bazelrc/ci.bazelrc - import %workspace%/../../.github/workflows/ci.bazelrc - - id: prepare - run: | - cd e2e/bzlmod-toolchain-circular-dependencies - bazelisk run @bazeldnf_rpms//:fetch-repo - bazelisk run @bazeldnf_rpms//:update-lock-file - - id: test - run: | - cd e2e/bzlmod-toolchain-circular-dependencies - bazelisk build //... || status=$? - if [ ${status} -ne 0 ]; then - echo "::warning::Optional job failed." - echo "optional_fail=true" >> "${GITHUB_OUTPUT}" - echo "optional_fail_status=${status}" >> "${GITHUB_OUTPUT}" - fi; - - name: Add comment if optional job failed; delete otherwise - uses: thollander/actions-comment-pull-request@v3 - with: - comment-tag: "circular-dependencies-optional-notice" - message: | - ### ⚠️ Optional job e2e-bzlmod-toolchain-circular-dependencies failed ⚠️ - - exit status: ${{ steps.test.outputs.optional_fail_status }} - mode: ${{ steps.test.outputs.optional_fail == 'true' && 'upsert' || 'delete' }} diff --git a/Makefile b/Makefile index 5904670d..41fc937c 100644 --- a/Makefile +++ b/Makefile @@ -69,13 +69,23 @@ e2e-bzlmod-toolchain-circular-dependencies: ) \ done +e2e-bzlmod-toolchain-circular-dependencies-fake: + @for version in 7.x 8.x; do \ + ( \ + cd e2e/bzlmod-toolchain-circular-dependencies-fake && \ + echo "Testing $$version bzlmod lock file from args" > /dev/stderr && \ + USE_BAZEL_VERSION=$$version bazelisk --batch build //... \ + ) \ + done + e2e: e2e-workspace \ e2e-bzlmod \ e2e-bzlmod-build-toolchain \ e2e-bazel-bzlmod-lock-file \ e2e-bazel-bzlmod-lock-file-from-args \ - e2e-bzlmod-toolchain-circular-dependencies + e2e-bzlmod-toolchain-circular-dependencies \ + e2e-bzlmod-toolchain-circular-dependencies-fake fmt: gofmt buildifier diff --git a/bazeldnf/extensions.bzl b/bazeldnf/extensions.bzl index 4789f70d..bf53a372 100644 --- a/bazeldnf/extensions.bzl +++ b/bazeldnf/extensions.bzl @@ -6,6 +6,7 @@ based on: https://github.com/bazel-contrib/rules-template/blob/0dadcb716f06f6728 """ load("@bazel_features//:features.bzl", "bazel_features") +load("@bazel_skylib//lib:versions.bzl", "versions") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar") load("//internal:rpm.bzl", null_rpm_repository = "null_rpm", rpm_repository = "rpm") load(":repositories.bzl", "bazeldnf_register_toolchains") @@ -68,7 +69,7 @@ _ALIAS_TEMPLATE = """\ alias( name = "{name}", actual = "@{actual_name}//rpm", - visibility = ["//visibility:public"], + visibility = ["{visibility}"], ) """ @@ -120,6 +121,9 @@ def _alias_repository_impl(repository_ctx): architecture = repository_ctx.attr.architecture, ), ) + + requested = dict([[x, 1] for x in repository_ctx.attr.requested]) + for rpm in repository_ctx.attr.rpms: actual_name = rpm.repo_name name = rpm.repo_name @@ -127,11 +131,17 @@ def _alias_repository_impl(repository_ctx): if repository_ctx.attr.repository_prefix: name = actual_name.split(repository_ctx.attr.repository_prefix, 1)[-1] + visibility = "//visibility:public" + + if repository_ctx.attr.requested and name not in requested: + visibility = "//:__subpackages__" + repository_ctx.file( "%s/BUILD.bazel" % name, _ALIAS_TEMPLATE.format( name = name, actual_name = actual_name, + visibility = visibility, ), ) @@ -147,15 +157,16 @@ def _alias_repository_impl(repository_ctx): _alias_repository = repository_rule( implementation = _alias_repository_impl, attrs = { - "rpms": attr.label_list(default = []), - "lock_file": attr.label(), - "rpms_to_install": attr.string_list(), + "architecture": attr.string(values = ["i686", "x86_64", "aarch64", ""]), + "cache_dir": attr.string(), "excludes": attr.string_list(), + "lock_file": attr.label(), + "nobest": attr.bool(default = False), + "requested": attr.string_list(), "repofile": attr.label(), "repository_prefix": attr.string(), - "nobest": attr.bool(default = False), - "cache_dir": attr.string(), - "architecture": attr.string(values = ["i686", "x86_64", "aarch64", ""]), + "rpms_to_install": attr.string_list(), + "rpms": attr.label_list(default = []), }, ) @@ -192,13 +203,19 @@ def _handle_lock_file(config, module_ctx, registered_rpms = {}): content = module_ctx.read(config.lock_file) lock_file_json = json.decode(content) + if not config.ignore_deps: + if versions.is_at_least("7", versions.get()) and not versions.is_at_least("7.4.0", versions.get()): + fail("ignore_deps requires Bazel 7.4+ for Bazel 7") + if versions.is_at_least("8", versions.get()) and not versions.is_at_least("8.1.0", versions.get()): + fail("ignore_deps requires Bazel 8.1+ for Bazel 8") + for rpm in lock_file_json.get("rpms", []): dependencies = rpm.pop("dependencies", []) if config.ignore_deps: dependencies = [] else: dependencies = [x.replace("+", "plus") for x in dependencies] - dependencies = ["@{}{}//rpm".format(config.rpm_repository_prefix, x) for x in dependencies] + dependencies = ["@{}{}//rpm:rpm-file".format(config.rpm_repository_prefix, x) for x in dependencies] rpm_name = rpm.pop("name", None) if not rpm_name: @@ -235,6 +252,7 @@ def _handle_lock_file(config, module_ctx, registered_rpms = {}): registered_rpms[name] = 1 repository_args["rpms"] = ["@@%s//rpm" % x for x in registered_rpms.keys()] + repository_args["requested"] = [x.replace("+", "plus") for x in lock_file_json.get("targets", [])] _alias_repository( **repository_args @@ -278,6 +296,7 @@ def _bazeldnf_extension(module_ctx): _alias_repository( name = name, rpms = ["@@%s//rpm" % x for x in rpms], + requested = rpms, ) repos.append(name) diff --git a/cmd/config_helper.go b/cmd/config_helper.go index 12f6ce78..cd6fca4f 100644 --- a/cmd/config_helper.go +++ b/cmd/config_helper.go @@ -50,11 +50,21 @@ func toConfig(install, forceIgnored []*api.Package, targets []string, cmdline [] } providers := collectProviders(forceIgnored, install) - packageNames := sortedKeys(allPackages) - sortedPackages := make([]*bazeldnf.RPM, 0, len(packageNames)) - for _, name := range packageNames { + slices.Sort(targets) + sortedPackages := make([]*bazeldnf.RPM, 0, len(allPackages)) + + requested := make(map[string]bool) + for _, pkg := range targets { + requested[pkg] = true + } + + // make sure all requested packages have their full dependency tree set + for _, name := range sortedKeys(allPackages) { pkg := allPackages[name] - deps, err := collectDependencies(name, pkg.Dependencies, providers, ignored) + if _, requested := requested[name]; !requested { + continue + } + deps, err := collectDependencies(name, pkg.Dependencies, providers, ignored, allPackages) if err != nil { return nil, err } @@ -64,6 +74,22 @@ func toConfig(install, forceIgnored []*api.Package, targets []string, cmdline [] sortedPackages = append(sortedPackages, pkg) } + // now for non requested packages make sure we don't get cycles + for _, name := range sortedKeys(allPackages) { + pkg := allPackages[name] + if _, requested := requested[name]; requested { + continue + } + + pkg.SetDependencies(nil) + + sortedPackages = append(sortedPackages, pkg) + } + + slices.SortFunc(sortedPackages, func(a, b *bazeldnf.RPM) int { + return cmp.Compare(a.Name, b.Name) + }) + lockFile := bazeldnf.Config{ CommandLineArguments: cmdline, ForceIgnored: sortedKeys(ignored), @@ -92,9 +118,19 @@ func collectProviders(pkgSets ...[]*api.Package) map[string]string { return providers } -func collectDependencies(pkg string, requires []string, providers map[string]string, ignored map[string]bool) ([]string, error) { +func collectDependencies(pkg string, requires []string, providers map[string]string, ignored map[string]bool, allPackages map[string]*bazeldnf.RPM) ([]string, error) { + logrus.Debugf("Collecting dependencies for %s", pkg) depSet := make(map[string]bool) - for _, req := range requires { + explored := make(map[string]bool) + for len(requires) > 0 { + req := requires[0] + requires = requires[1:] + logrus.Debugf("Processing dependency %s, pending %d", req, len(requires)) + if explored[req] { + logrus.Debugf("Ignoring already explored %s", req) + continue + } + explored[req] = true if ignored[req] { logrus.Debugf("Ignoring dependency %s", req) continue @@ -104,28 +140,71 @@ func collectDependencies(pkg string, requires []string, providers map[string]str if !ok { return nil, fmt.Errorf("could not find provider for %s", req) } - logrus.Debugf("Found provider %s for %s", provider, req) if ignored[provider] { - logrus.Debugf("Ignoring provider %s for %s", provider, req) + logrus.Debugf("Ignoring provider %s", provider) continue } depSet[provider] = true + requires = append(requires, allPackages[provider].Dependencies...) } + return sortedKeys(depSet), nil +} - deps := sortedKeys(depSet) +func removeCyclicDependencies(targets []string, allPackages []*bazeldnf.RPM) []*bazeldnf.RPM { + allPackagesMap := make(map[string]*bazeldnf.RPM) - found := map[string]bool{pkg: true} + for _, installPackage := range allPackages { + allPackagesMap[installPackage.Name] = installPackage + } + + for _, target := range targets { + visitedMap := make(map[string]bool) + recursionStack := make(map[string]bool) + + removeCyclicDependenciesHelper(allPackagesMap, target, visitedMap, recursionStack) + } + + return allPackages +} + +func removeCyclicDependenciesHelper(allPackages map[string]*bazeldnf.RPM, pkg string, visitedMap, recursionStack map[string]bool) bool { + /* + * This is a recursive function that removes cyclic dependencies from the + * dependency graph in the case cycles are found + */ + visitedMap[pkg] = true + recursionStack[pkg] = true + + if _, ok := allPackages[pkg]; !ok { + return false + } + + if allPackages[pkg].Dependencies == nil { + return false + } + + cleanDependencies := make([]string, 0, len(allPackages[pkg].Dependencies)) - // RPMs may have circular dependencies, even depend on themselves. - // we need to ignore such dependencies - nonCyclicDeps := make([]string, 0, len(deps)) - for _, dep := range deps { - if found[dep] { + for _, dep := range allPackages[pkg].Dependencies { + if _, visited := visitedMap[dep]; !visited { + if removeCyclicDependenciesHelper(allPackages, dep, visitedMap, recursionStack) { + // ignore cycle + logrus.Debugf("Ignoring cyclic dependency %s -> %s", pkg, dep) + continue + } + } else if _, recursed := recursionStack[dep]; recursed { + // ignore cycle + logrus.Debugf("Ignoring cyclic dependency in recursion stack %s -> %s", pkg, dep) continue } - - nonCyclicDeps = append(nonCyclicDeps, dep) + cleanDependencies = append(cleanDependencies, dep) } - return nonCyclicDeps, nil + recursionStack[pkg] = false + + newPkg := allPackages[pkg].Clone() + newPkg.SetDependencies(cleanDependencies) + allPackages[pkg] = newPkg + + return false } diff --git a/cmd/config_helper_test.go b/cmd/config_helper_test.go index e8bf7d69..905fe92c 100644 --- a/cmd/config_helper_test.go +++ b/cmd/config_helper_test.go @@ -59,7 +59,7 @@ func TestMissingProvider(t *testing.T) { newPackageWithDeps("parent", "somedep"), }, []*api.Package{}, - []string{}, + []string{"parent"}, []string{}, ) @@ -120,6 +120,73 @@ func newSimpleRPM(name string, deps ...string) *bazeldnf.RPM { } } +type testCaseConfiguration struct { + name string + installed, ignored []*api.Package + expectedRepositories map[string][]string + expectedRPMs []*bazeldnf.RPM + requested []string +} + +func testCase(config testCaseConfiguration, t *testing.T) { + t.Run(config.name, func(t *testing.T) { + g := NewGomegaWithT(t) + + forceIgnored := []string{} + for _, pkg := range config.ignored { + forceIgnored = append(forceIgnored, pkg.Name) + } + slices.Sort(forceIgnored) + + expected := &bazeldnf.Config{ + CommandLineArguments: []string{}, + Name: "", + Repositories: config.expectedRepositories, + RPMs: config.expectedRPMs, + Targets: config.requested, + ForceIgnored: forceIgnored, + } + + cfg, err := toConfig( + config.installed, + config.ignored, + config.requested, + []string{}, + ) + + g.Expect(err).Should(BeNil()) + g.Expect(cfg).Should(Equal(expected)) + }) +} + +func TestOneInstalled(t *testing.T) { + testCase(testCaseConfiguration{ + name: "one installed", + installed: []*api.Package{ + newPackage( + "package0", + "f87b49c517aac9eb4890a4b5005bcc4a586748f2760ea1106382f3897129a60e", + "urlforrpm", + "repository", + []string{"mirror0", "mirror1"}, + ), + }, + ignored: []*api.Package{}, + expectedRepositories: map[string][]string{ + "repository": []string{"mirror0", "mirror1"}, + }, + expectedRPMs: []*bazeldnf.RPM{ + &bazeldnf.RPM{ + Name: "package0", + Integrity: "sha256-+HtJxReqyetIkKS1AFvMSlhnSPJ2DqEQY4LziXEppg4=", + URLs: []string{"urlforrpm"}, + Repository: "repository", + Dependencies: []string{}, + }, + }, + }, t) +} + func TestConfigTransform(t *testing.T) { tests := []struct { name string @@ -127,6 +194,7 @@ func TestConfigTransform(t *testing.T) { expectedRepositories map[string][]string expectedRPMs []*bazeldnf.RPM + requested []string }{ { name: "one installed", @@ -261,6 +329,7 @@ func TestConfigTransform(t *testing.T) { newSimpleRPM("package1", "package2"), newSimpleRPM("package2"), }, + requested: []string{"package1"}, }, { name: "three installed dep from first", @@ -278,6 +347,7 @@ func TestConfigTransform(t *testing.T) { newSimpleRPM("package2"), newSimpleRPM("package3"), }, + requested: []string{"package1"}, }, { name: "three installed dep from first sort deps", @@ -295,6 +365,7 @@ func TestConfigTransform(t *testing.T) { newSimpleRPM("package2"), newSimpleRPM("package3"), }, + requested: []string{"package1"}, }, { name: "three installed dep transitive", @@ -308,10 +379,11 @@ func TestConfigTransform(t *testing.T) { "repository": []string{}, }, expectedRPMs: []*bazeldnf.RPM{ - newSimpleRPM("package1", "package2"), - newSimpleRPM("package2", "package3"), + newSimpleRPM("package1", "package2", "package3"), + newSimpleRPM("package2"), newSimpleRPM("package3"), }, + requested: []string{"package1"}, }, { name: "three installed dep overlap", @@ -329,6 +401,7 @@ func TestConfigTransform(t *testing.T) { newSimpleRPM("package2", "package3"), newSimpleRPM("package3"), }, + requested: []string{"package1", "package2"}, }, { name: "two installed require ignored", @@ -382,6 +455,7 @@ func TestConfigTransform(t *testing.T) { newSimpleRPM("package1", "package2"), newSimpleRPM("package2"), }, + requested: []string{"package1"}, }, { name: "file based deps ignored provider", @@ -398,6 +472,64 @@ func TestConfigTransform(t *testing.T) { newSimpleRPM("package1"), }, }, + { + name: "circular dependencies", + installed: []*api.Package{ + newPackageWithDeps("package1", "package2"), + newPackageWithDeps("package2", "package4"), + newPackageWithDeps("package3", "package2"), + newPackageWithDeps("package4"), + }, + ignored: []*api.Package{}, + expectedRepositories: map[string][]string{ + "repository": []string{}, + }, + expectedRPMs: []*bazeldnf.RPM{ + newSimpleRPM("package1", "package2", "package4"), + newSimpleRPM("package2", "package4"), + newSimpleRPM("package3", "package2", "package4"), + newSimpleRPM("package4"), + }, + requested: []string{"package1", "package2", "package3"}, + }, + { + name: "transitive circular dependencies", + installed: []*api.Package{ + newPackageWithDeps("package1", "package2"), + newPackageWithDeps("package2", "package4"), + newPackageWithDeps("package3", "package2"), + newPackageWithDeps("package4"), + }, + ignored: []*api.Package{}, + expectedRepositories: map[string][]string{ + "repository": []string{}, + }, + expectedRPMs: []*bazeldnf.RPM{ + newSimpleRPM("package1", "package2", "package4"), + newSimpleRPM("package2"), + newSimpleRPM("package3", "package2", "package4"), + newSimpleRPM("package4"), + }, + requested: []string{"package1", "package3"}, + }, + { + name: "transitive circular dependencies with more than one cycle", + installed: []*api.Package{ + newPackageWithDeps("package1", "package2"), + newPackageWithDeps("package2", "package3"), + newPackageWithDeps("package3", "package1"), + }, + ignored: []*api.Package{}, + expectedRepositories: map[string][]string{ + "repository": []string{}, + }, + expectedRPMs: []*bazeldnf.RPM{ + newSimpleRPM("package1", "package2", "package3"), + newSimpleRPM("package2", "package1", "package3"), + newSimpleRPM("package3", "package1", "package2"), + }, + requested: []string{"package1", "package2", "package3"}, + }, } for _, tt := range tests { @@ -415,14 +547,14 @@ func TestConfigTransform(t *testing.T) { Name: "", Repositories: tt.expectedRepositories, RPMs: tt.expectedRPMs, - Targets: []string{}, + Targets: tt.requested, ForceIgnored: forceIgnored, } cfg, err := toConfig( tt.installed, tt.ignored, - []string{}, + tt.requested, []string{}, ) diff --git a/e2e/bzlmod-toolchain-circular-dependencies-fake/BUILD b/e2e/bzlmod-toolchain-circular-dependencies-fake/BUILD new file mode 100644 index 00000000..88be6581 --- /dev/null +++ b/e2e/bzlmod-toolchain-circular-dependencies-fake/BUILD @@ -0,0 +1,22 @@ +load("@bazeldnf//bazeldnf:defs.bzl", "rpmtree") + +rpmtree( + name = "rpms-circular-triplet-package-1", + rpms = [ + "@rpms-circular-triplet//package1", + ], +) + +rpmtree( + name = "rpms-circular-triplet-package-2", + rpms = [ + "@rpms-circular-triplet//package2", + ], +) + +rpmtree( + name = "rpms-circular-triplet-package-3", + rpms = [ + "@rpms-circular-triplet//package3", + ], +) diff --git a/e2e/bzlmod-toolchain-circular-dependencies-fake/MODULE.bazel b/e2e/bzlmod-toolchain-circular-dependencies-fake/MODULE.bazel new file mode 100644 index 00000000..f54fd426 --- /dev/null +++ b/e2e/bzlmod-toolchain-circular-dependencies-fake/MODULE.bazel @@ -0,0 +1,65 @@ +"example MODULE.bazel to test bzlmod integration for bazeldnf without a prebuilt toolchain" + +bazel_dep(name = "bazeldnf", dev_dependency = True) +local_path_override( + module_name = "bazeldnf", + path = "../..", +) + +bazel_dep(name = "rules_pkg", version = "1.0.1") +bazel_dep(name = "rules_go", version = "0.53.0", repo_name = "rules_go") + +go_sdk = use_extension("@rules_go//go:extensions.bzl", "go_sdk") +go_sdk.download(version = "1.24.1") + +bazel_dep(name = "gazelle", version = "0.42.0") +bazel_dep(name = "toolchains_protoc", version = "0.3.7") + +protoc = use_extension("@toolchains_protoc//protoc:extensions.bzl", "protoc") +protoc.toolchain( + google_protobuf = "com_google_protobuf", + version = "v27.3", +) +use_repo(protoc, "com_google_protobuf", "toolchains_protoc_hub") + +register_toolchains( + "@toolchains_protoc_hub//:all", + dev_dependency = True, +) + +go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps") +go_deps.from_file(go_mod = "@bazeldnf//:go.mod") +use_repo( + go_deps, + "com_github_adrg_xdg", + "com_github_bazelbuild_buildtools", + "com_github_crillab_gophersat", + "com_github_jdx_go_netrc", + "com_github_klauspost_compress", + "com_github_onsi_gomega", + "com_github_sassoftware_go_rpmutils", + "com_github_sirupsen_logrus", + "com_github_spf13_cobra", + "io_k8s_sigs_yaml", + "org_golang_x_crypto", + "org_golang_x_exp", +) + +bazeldnf_toolchain = use_extension("@bazeldnf//bazeldnf:extensions.bzl", "bazeldnf_toolchain") +bazeldnf_toolchain.register(disable = True) + +bazeldnf = use_extension("@bazeldnf//bazeldnf:extensions.bzl", "bazeldnf") +bazeldnf.config( + name = "rpms-circular-triplet", + ignore_deps = False, + lock_file = "//:rpms-circular-triplet.json", + rpms = [ + "package1", + "package2", + "package3", + ], +) +use_repo( + bazeldnf, + "rpms-circular-triplet", +) diff --git a/e2e/bzlmod-toolchain-circular-dependencies-fake/Makefile b/e2e/bzlmod-toolchain-circular-dependencies-fake/Makefile new file mode 100644 index 00000000..78ef8428 --- /dev/null +++ b/e2e/bzlmod-toolchain-circular-dependencies-fake/Makefile @@ -0,0 +1,4 @@ +all: test + +test: + bazelisk query 'deps(@rpms-circular-triplet//...)' --output build diff --git a/e2e/bzlmod-toolchain-circular-dependencies-fake/rpms-circular-triplet.json b/e2e/bzlmod-toolchain-circular-dependencies-fake/rpms-circular-triplet.json new file mode 100644 index 00000000..8d4c66ab --- /dev/null +++ b/e2e/bzlmod-toolchain-circular-dependencies-fake/rpms-circular-triplet.json @@ -0,0 +1,44 @@ +{ + "cli-arguments": [], + "name": "", + "repositories": { + "fake-repository": [ + "https://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os" + ] + }, + "rpms": [ + { + "name": "package1", + "urls": [ + "Packages/audit-libs-3.1.5-4.el9.x86_64.rpm" + ], + "repository": "fake-repository", + "dependencies": [ + "package2", + "package3" + ] + }, + { + "name": "package2", + "urls": [ + "Packages/bash-5.1.8-9.el9.x86_64.rpm" + ], + "repository": "fake-repository", + "dependencies": [ + "package1", + "package3" + ] + }, + { + "name": "package3", + "urls": [ + "Packages/bzip2-libs-1.0.8-10.el9.x86_64.rpm" + ], + "repository": "fake-repository", + "dependencies": [ + "package1", + "package2" + ] + } + ] +} diff --git a/e2e/bzlmod-toolchain-circular-dependencies/.gitignore b/e2e/bzlmod-toolchain-circular-dependencies/.gitignore index 5d8f5448..6bb2a3b5 100644 --- a/e2e/bzlmod-toolchain-circular-dependencies/.gitignore +++ b/e2e/bzlmod-toolchain-circular-dependencies/.gitignore @@ -1 +1,2 @@ .bazeldnf-test-issues-with-ignore-flag +bazeldnf-lock.json diff --git a/e2e/bzlmod-toolchain-circular-dependencies/BUILD.bazel b/e2e/bzlmod-toolchain-circular-dependencies/BUILD.bazel index 173f53d4..ab8f1c61 100644 --- a/e2e/bzlmod-toolchain-circular-dependencies/BUILD.bazel +++ b/e2e/bzlmod-toolchain-circular-dependencies/BUILD.bazel @@ -8,7 +8,8 @@ bazeldnf( rpmtree( name = "something", rpms = [ - "@bazeldnf_rpms//bash", + "@bazeldnf_rpms//git", + "@bazeldnf_rpms//glibc", ], ) diff --git a/e2e/bzlmod-toolchain-circular-dependencies/MODULE.bazel b/e2e/bzlmod-toolchain-circular-dependencies/MODULE.bazel index 7fa0b0e1..e24807fd 100644 --- a/e2e/bzlmod-toolchain-circular-dependencies/MODULE.bazel +++ b/e2e/bzlmod-toolchain-circular-dependencies/MODULE.bazel @@ -57,6 +57,7 @@ bazeldnf.config( excludes = [ "alternatives", "basesystem", + "perl", ], ignore_deps = False, lock_file = "//:bazeldnf-lock.json", diff --git a/e2e/bzlmod-toolchain-circular-dependencies/Makefile b/e2e/bzlmod-toolchain-circular-dependencies/Makefile new file mode 100644 index 00000000..d727328a --- /dev/null +++ b/e2e/bzlmod-toolchain-circular-dependencies/Makefile @@ -0,0 +1,6 @@ +all: test + +test: + bazelisk run @bazeldnf_rpms//:fetch-repo + bazelisk run @bazeldnf_rpms//:update-lock-file + bazelisk build //... diff --git a/e2e/bzlmod-toolchain-circular-dependencies/bazeldnf-lock.json b/e2e/bzlmod-toolchain-circular-dependencies/bazeldnf-lock.json deleted file mode 100644 index f2136b41..00000000 --- a/e2e/bzlmod-toolchain-circular-dependencies/bazeldnf-lock.json +++ /dev/null @@ -1,2122 +0,0 @@ -{ - "cli-arguments": [ - "-r", - "repos.yaml", - "--lockfile", - "bazeldnf-lock.json", - "--force-ignore-with-dependencies", - "alternatives", - "--force-ignore-with-dependencies", - "basesystem", - "git", - "glibc", - "--cache-dir", - "./.bazeldnf-test-issues-with-ignore-flag", - "--ignore-missing" - ], - "name": "", - "repositories": { - "centos-stream-9-stable-appstream": [ - "https://mirror.stream.centos.org/9-stream/AppStream/x86_64/os" - ], - "centos-stream-9-stable-baseos": [ - "https://mirror.stream.centos.org/9-stream/BaseOS/x86_64/os" - ] - }, - "rpms": [ - { - "name": "audit-libs", - "integrity": "sha256-0UgvZehOdh8CguniwqcRHwY43IidbzTkzeFg5GWFXR4=", - "urls": [ - "Packages/audit-libs-3.1.5-4.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "libcap-ng" - ] - }, - { - "name": "bash", - "integrity": "sha256-gjhZqej62DAE+g2faY/yI/b304/Y52KVCdmLW6Z2TAM=", - "urls": [ - "Packages/bash-5.1.8-9.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "filesystem", - "glibc", - "ncurses-libs" - ] - }, - { - "name": "bzip2-libs", - "integrity": "sha256-hDkoFcwajwHGUe3Rf1cKpEnvbzl65I13PWVWBup7TJY=", - "urls": [ - "Packages/bzip2-libs-1.0.8-10.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "ca-certificates", - "integrity": "sha256-0Ywbl2PCLck9qAT5atPZKzFXGVye/26SPDPpAR3z4kY=", - "urls": [ - "Packages/ca-certificates-2024.2.69_v8.0.303-91.4.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "coreutils", - "grep", - "p11-kit-trust", - "sed" - ] - }, - { - "name": "centos-gpg-keys", - "integrity": "sha256-jWAdn5Y1aiAK1u2OXLSbusSqPEt2LRCiPhExHapXEco=", - "urls": [ - "Packages/centos-gpg-keys-9.0-26.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [] - }, - { - "name": "centos-stream-release", - "integrity": "sha256-PWDcjthnF/aDlPx0aLgCRVfEOsKtl7jkCRHQVs1tZNM=", - "urls": [ - "Packages/centos-stream-release-9.0-26.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "centos-stream-repos" - ] - }, - { - "name": "centos-stream-repos", - "integrity": "sha256-6ztVpc8OGpOpHNLTkDW9F1S0b2n/PQYrMzHnZbI0UDU=", - "urls": [ - "Packages/centos-stream-repos-9.0-26.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "centos-gpg-keys" - ] - }, - { - "name": "coreutils", - "integrity": "sha256-Kv4+jvK4LnWtWnNZlNOod72hOsDsfvkvDsUgW3RR6Vw=", - "urls": [ - "Packages/coreutils-8.32-39.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "coreutils-common", - "glibc", - "gmp", - "libacl", - "libattr", - "libcap", - "libselinux", - "openssl-libs" - ] - }, - { - "name": "coreutils-common", - "integrity": "sha256-fgoq4mAcv+iBHmw8K8EN4wOkE4pIsEB7wh+SmHa1T7I=", - "urls": [ - "Packages/coreutils-common-8.32-39.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [] - }, - { - "name": "cracklib", - "integrity": "sha256-vp3rLv0GtLLBwTCsrpTGhxYdBIMBGeZamJ2QS6n9GGQ=", - "urls": [ - "Packages/cracklib-2.9.6-27.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "glibc", - "gzip", - "zlib" - ] - }, - { - "name": "cracklib-dicts", - "integrity": "sha256-Ad8qcvzfmIEy6CdkzhoipalRP6JTtU4X0jBYvbU8LYU=", - "urls": [ - "Packages/cracklib-dicts-2.9.6-27.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "cracklib" - ] - }, - { - "name": "crypto-policies", - "integrity": "sha256-+BHSyEj2+ToYjy101MzRcuHciPp5GejiA88d89k1ceE=", - "urls": [ - "Packages/crypto-policies-20250128-1.git5269e22.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash" - ] - }, - { - "name": "emacs-filesystem", - "integrity": "sha256-jJsTruBTK9i8zl8o+4GH0IXA2qPTBm485ts5OpDimdk=", - "urls": [ - "Packages/emacs-filesystem-27.2-13.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-appstream", - "dependencies": [] - }, - { - "name": "expat", - "integrity": "sha256-Ng7ZlOoq9bOn83aU398iSdl+Xl7CSSySI6Kuxy/49IA=", - "urls": [ - "Packages/expat-2.5.0-4.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "filesystem", - "integrity": "sha256-2ndQ/DEkjsxgYBY5HD9XDhq+dCL4ErKaSdgwxxiE5tw=", - "urls": [ - "Packages/filesystem-3.16-5.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "setup" - ] - }, - { - "name": "gawk", - "integrity": "sha256-bm13t2seif5vASzcFhEb6jXrTO7axQQOXYG1oGZCmvg=", - "urls": [ - "Packages/gawk-5.1.0-6.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "filesystem", - "glibc", - "gmp", - "libsigsegv", - "mpfr", - "readline" - ] - }, - { - "name": "git", - "integrity": "sha256-lzvPC/R1aPCxhx+u0KxKFeqvnuNU2jWw3f6MwI9AAEw=", - "urls": [ - "Packages/git-2.47.1-1.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-appstream", - "dependencies": [ - "bash", - "emacs-filesystem", - "git-core", - "git-core-doc", - "perl-File-Basename", - "perl-File-Find", - "perl-Getopt-Long", - "perl-Git", - "perl-IPC-Open3", - "perl-PathTools", - "perl-TermReadKey", - "perl-interpreter", - "perl-lib", - "perl-libs" - ] - }, - { - "name": "git-core", - "integrity": "sha256-njnx3e9H2Ej5dZVwHQtGV/Pu+vpsrllT1QPRMso486E=", - "urls": [ - "Packages/git-core-2.47.1-1.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-appstream", - "dependencies": [ - "bash", - "expat", - "glibc", - "less", - "libcurl-minimal", - "openssh-clients", - "openssl-libs", - "pcre2", - "zlib" - ] - }, - { - "name": "git-core-doc", - "integrity": "sha256-q5Fm9z8QLO7zGH9SqpQN7uSd1osVQw2+SImw3e3yQx4=", - "urls": [ - "Packages/git-core-doc-2.47.1-1.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-appstream", - "dependencies": [ - "git-core" - ] - }, - { - "name": "glibc", - "integrity": "sha256-4GISscrB2f2YV6AN3v7+n7n0BhmcuE/dEVNYnBXhYok=", - "urls": [ - "Packages/glibc-2.34-168.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc-all-langpacks", - "glibc-common", - "libgcc" - ] - }, - { - "name": "glibc-all-langpacks", - "integrity": "sha256-oXFKt0wJcJSq2YCKSOIcV/OHb6PeXyR7EBl9fIot6Lg=", - "urls": [ - "Packages/glibc-all-langpacks-2.34-168.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "glibc-common" - ] - }, - { - "name": "glibc-common", - "integrity": "sha256-UxZQdEkJ79AoS/bBakXbr0VbIUwMrEGXz21D6MfYOvg=", - "urls": [ - "Packages/glibc-common-2.34-168.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "glibc", - "tzdata" - ] - }, - { - "name": "gmp", - "integrity": "sha256-ttWSiVzMD8rWEGzUGADNnWjlOExBjlOiw/8qyMixWjM=", - "urls": [ - "Packages/gmp-6.2.0-13.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "grep", - "integrity": "sha256-EKQbZrH71usFUXjiLDcZnltJtIUud8gG969yEQRKSlU=", - "urls": [ - "Packages/grep-3.6-5.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "glibc", - "libsigsegv", - "pcre" - ] - }, - { - "name": "groff-base", - "integrity": "sha256-+PAnJXZr7w/fPbEk14YoSOaSUYzgSRn7Glg/ATu7q/s=", - "urls": [ - "Packages/groff-base-1.22.4-10.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "glibc", - "libgcc", - "libstdc++" - ] - }, - { - "name": "gzip", - "integrity": "sha256-6Nd4PGZqWKuHAkawTrDqIpZRI/4oRpfSwOHm2/EOqGE=", - "urls": [ - "Packages/gzip-1.12-1.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "coreutils", - "glibc" - ] - }, - { - "name": "keyutils-libs", - "integrity": "sha256-rvmCUBaUSGonQRxoaYiG127HDFzRC/5hlQHn5MNvUKk=", - "urls": [ - "Packages/keyutils-libs-1.6.3-1.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "krb5-libs", - "integrity": "sha256-UO30CJ0EgASK66K/1za5Oqidwlc1zQLoC61X5WLh4AE=", - "urls": [ - "Packages/krb5-libs-1.21.1-6.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "coreutils", - "crypto-policies", - "gawk", - "glibc", - "grep", - "keyutils-libs", - "libcom_err", - "libselinux", - "libverto", - "openssl-libs", - "sed" - ] - }, - { - "name": "less", - "integrity": "sha256-RuEd+st1qNAwR9gvRK5GsR2V2jHg7Bs6jMN6EyscfK4=", - "urls": [ - "Packages/less-590-5.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "glibc", - "ncurses-libs" - ] - }, - { - "name": "libacl", - "integrity": "sha256-YKOv+qHDh/1vct1lqnrWGaGDCUeCOrtLKee5/LTJ0nw=", - "urls": [ - "Packages/libacl-2.3.1-4.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "libattr" - ] - }, - { - "name": "libattr", - "integrity": "sha256-1NsJWgFehAZfJ6ZC7ngpzRaQBBuoxRUB+QjMNHYMlAk=", - "urls": [ - "Packages/libattr-2.5.1-3.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libblkid", - "integrity": "sha256-JDP4gp+JTHxboGOes3oYqSYy1Pk4NVHJAUNLQ1P5b8Q=", - "urls": [ - "Packages/libblkid-2.37.4-21.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "coreutils", - "glibc", - "libuuid" - ] - }, - { - "name": "libcap", - "integrity": "sha256-fQfsimoJddhMZq3yHIhcQaVXHstjEFWVkmXGD9oxQRE=", - "urls": [ - "Packages/libcap-2.48-9.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "libgcc" - ] - }, - { - "name": "libcap-ng", - "integrity": "sha256-YkKbeIrPtA28namVFpDBHpB+Iwh5x5DROfc9DoXddvQ=", - "urls": [ - "Packages/libcap-ng-0.8.2-7.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libcbor", - "integrity": "sha256-7Lth35PmgWJ2cS0CowE8WRqLWKjvUOzpjYFFZFZZgKs=", - "urls": [ - "Packages/libcbor-0.7.0-5.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libcom_err", - "integrity": "sha256-0R4Y2/3dVlOMR2hR2YvZZ5XzQEXhTr57MoXyJcS0sYk=", - "urls": [ - "Packages/libcom_err-1.46.5-7.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libcurl-minimal", - "integrity": "sha256-ZDhIXjhGXulE4lq+3PShdhVk/lIC8FoCxx5MiAJVtTk=", - "urls": [ - "Packages/libcurl-minimal-7.76.1-31.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "krb5-libs", - "libcom_err", - "libnghttp2", - "openssl-libs", - "zlib" - ] - }, - { - "name": "libdb", - "integrity": "sha256-4oYI216qPuOOi8DWvhgxBI2h5jiSCm8WqAhOcuLr9sk=", - "urls": [ - "Packages/libdb-5.3.28-55.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libeconf", - "integrity": "sha256-7VGcwukDHivwMnWyjHzKZSCukW0Kftu8afMnwbcO1sw=", - "urls": [ - "Packages/libeconf-0.4.1-4.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libedit", - "integrity": "sha256-v6kf+W8xKyhKFqkbLqvNrp5Dwvm2mP7m7slAQOrvj34=", - "urls": [ - "Packages/libedit-3.1-38.20210216cvs.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "ncurses-libs" - ] - }, - { - "name": "libfdisk", - "integrity": "sha256-mllMUeO/CctQFkhe4vFD3m25YP8cfhNcAJf1n6UbLts=", - "urls": [ - "Packages/libfdisk-2.37.4-21.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "libblkid", - "libuuid" - ] - }, - { - "name": "libffi", - "integrity": "sha256-EQ1QCDZKZbOLgylJlwiG/cy5d2KwzbJXVxzAyEGC19A=", - "urls": [ - "Packages/libffi-3.4.2-8.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libfido2", - "integrity": "sha256-hcOoQzXYMwafV1izT0Y2MT/8DVyn9z0k4F/VZnNcXNY=", - "urls": [ - "Packages/libfido2-1.13.0-2.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "libcbor", - "openssl-libs", - "systemd-libs", - "zlib" - ] - }, - { - "name": "libgcc", - "integrity": "sha256-RCwGWoFSEqwhdg/58L2T6fXVlykl2emHpCHL9uu6QdI=", - "urls": [ - "Packages/libgcc-11.5.0-5.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [] - }, - { - "name": "libgcrypt", - "integrity": "sha256-AyOnSlrSe8PcSsTpVlgl833FiypIAK2/M/dn+nomfDU=", - "urls": [ - "Packages/libgcrypt-1.10.0-11.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "libgpg-error" - ] - }, - { - "name": "libgpg-error", - "integrity": "sha256-oYg4BMN29zcQn03/Bgd9GRK5AVCnMtEb57xbO2flEv4=", - "urls": [ - "Packages/libgpg-error-1.42-5.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libmount", - "integrity": "sha256-2L/HDRqaWUVpyMlb2mgoBKILtO5gLbPvp7bnbSiezGY=", - "urls": [ - "Packages/libmount-2.37.4-21.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "libblkid", - "libselinux", - "libuuid" - ] - }, - { - "name": "libnghttp2", - "integrity": "sha256-/BytvGzzfL6mARK3rm+S+r/Vp/dvpSa7Wh6oJ0ZFXsc=", - "urls": [ - "Packages/libnghttp2-1.43.0-6.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libpwquality", - "integrity": "sha256-k/AOXvrB4/HsvA1qTAaHcssSkSzSDJ6lhxbWwM0ASIY=", - "urls": [ - "Packages/libpwquality-1.4.4-8.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "cracklib", - "cracklib-dicts", - "glibc", - "pam" - ] - }, - { - "name": "libselinux", - "integrity": "sha256-eavnLqjcy0E0KG/RqueYJ/EL3gzBw1IkiG6TspPSgtE=", - "urls": [ - "Packages/libselinux-3.6-3.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "libsepol", - "pcre2" - ] - }, - { - "name": "libsemanage", - "integrity": "sha256-Pc9ufyd5Q02dx67wBlw6KXd5IXAmSmDUMk9mJbuc1po=", - "urls": [ - "Packages/libsemanage-3.6-5.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "audit-libs", - "bzip2-libs", - "glibc", - "libselinux", - "libsepol" - ] - }, - { - "name": "libsepol", - "integrity": "sha256-ehwQpFEmJN/Bt22kW3oNFfjs3d8gyXOLEMoS339IiuE=", - "urls": [ - "Packages/libsepol-3.6-2.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libsigsegv", - "integrity": "sha256-kxvQ7HBQ6MOzepv7SJ4wrzJIajx3ID8ekRPuzqo7Cjo=", - "urls": [ - "Packages/libsigsegv-2.13-4.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libsmartcols", - "integrity": "sha256-MOKgca1vGTnxT8icgn1hzLKKbL9uRD2znoAZoYx+GNQ=", - "urls": [ - "Packages/libsmartcols-2.37.4-21.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libstdc++", - "integrity": "sha256-ZiigAnoRPIaH0M1S7Vcl7myx7ioCiXNJKJ1oP8ZFMiM=", - "urls": [ - "Packages/libstdc++-11.5.0-5.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "libgcc" - ] - }, - { - "name": "libtasn1", - "integrity": "sha256-rd0VXUq8QVKdfoWI9ELlCofbOhMUvSFi+7SVDYmKLig=", - "urls": [ - "Packages/libtasn1-4.16.0-9.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libutempter", - "integrity": "sha256-+rNhqcugRJD9i1ZkBJmD0eV+v3wQgIBHJrpgBwhSQSU=", - "urls": [ - "Packages/libutempter-1.2.1-6.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "glibc", - "shadow-utils" - ] - }, - { - "name": "libuuid", - "integrity": "sha256-vkeTvlrxF3Igar4CN0bsQCGot7wST9x+fNuStXxG0SU=", - "urls": [ - "Packages/libuuid-2.37.4-21.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libverto", - "integrity": "sha256-xVV4uE8WnE7Xmy1Q6gP9GBcAfjUGLJ/npY5srQJfOyQ=", - "urls": [ - "Packages/libverto-0.3.2-3.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libxcrypt", - "integrity": "sha256-l+iGeLQg9hmkRgj/8wBiCGqh3Wkx7L1U8hu6AF/x3ho=", - "urls": [ - "Packages/libxcrypt-4.4.18-3.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "libzstd", - "integrity": "sha256-NDmnQ3pLR+9LbvvNjFhiGA+ygd2VbXCk/+N2T9jZl90=", - "urls": [ - "Packages/libzstd-1.5.5-1.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "lz4-libs", - "integrity": "sha256-y6amMFTQcJVqGC4zJp7iRbz76H4+YFwngWUZ23YqZq0=", - "urls": [ - "Packages/lz4-libs-1.9.3-5.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "mpfr", - "integrity": "sha256-F5dgEEqloxykY8WG0PIfOAuk0O7SEu7pG9HKUT5deo0=", - "urls": [ - "Packages/mpfr-4.1.0-7.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "gmp" - ] - }, - { - "name": "ncurses", - "integrity": "sha256-RddD3Npb4jC64S7z+IP3XocpWZPuSg8nfDH2kQIurDA=", - "urls": [ - "Packages/ncurses-6.2-10.20210508.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "ncurses-libs" - ] - }, - { - "name": "ncurses-base", - "integrity": "sha256-ALpWsoo6hcPAM4e7er7Kkll8il+sf1PUhBDKKiD9gGU=", - "urls": [ - "Packages/ncurses-base-6.2-10.20210508.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [] - }, - { - "name": "ncurses-libs", - "integrity": "sha256-9OrXClCAUe0zhJmzVgW1srW8zeGcnoP35LlI8XG1Qv8=", - "urls": [ - "Packages/ncurses-libs-6.2-10.20210508.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "ncurses-base" - ] - }, - { - "name": "openssh", - "integrity": "sha256-TywaYpCzwK0q/LR9RLHW4lI4EP0L+8S3VGgqJ9vytqM=", - "urls": [ - "Packages/openssh-8.7p1-45.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "audit-libs", - "bash", - "glibc", - "libselinux", - "libxcrypt", - "openssl-libs", - "util-linux", - "zlib" - ] - }, - { - "name": "openssh-clients", - "integrity": "sha256-TpPqQxM8nBC7zMyOVbTLqOSwCzx2WX1kw7HlS002U8o=", - "urls": [ - "Packages/openssh-clients-8.7p1-45.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "crypto-policies", - "glibc", - "krb5-libs", - "libedit", - "libfido2", - "libselinux", - "libxcrypt", - "openssh", - "openssl-libs", - "zlib" - ] - }, - { - "name": "openssl", - "integrity": "sha256-MBjF0pASE7a9vmIwHviUAI7FKxEi4nAZDqu2KtKCpGo=", - "urls": [ - "Packages/openssl-3.2.2-6.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "coreutils", - "glibc", - "openssl-libs" - ] - }, - { - "name": "openssl-libs", - "integrity": "sha256-Sgopown3K6ZaLQstS1FjclNSD2oKG9RkDwoJ99dVVzg=", - "urls": [ - "Packages/openssl-libs-3.2.2-6.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "ca-certificates", - "crypto-policies", - "glibc", - "zlib" - ] - }, - { - "name": "p11-kit", - "integrity": "sha256-LQLzLNti+sMlY8cPrUTHJS8Bc1UsyrxY0rUWEgfCkaM=", - "urls": [ - "Packages/p11-kit-0.25.3-3.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "libffi", - "libtasn1" - ] - }, - { - "name": "p11-kit-trust", - "integrity": "sha256-87GMxp15iZ4X18dRSk41C91hZqN+l5/uXc+9x5IaAvo=", - "urls": [ - "Packages/p11-kit-trust-0.25.3-3.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "glibc", - "libtasn1", - "p11-kit" - ] - }, - { - "name": "pam", - "integrity": "sha256-+6OSCWy/WSBFSbyiPUBgzfiqqpzjWt6BlMER9RkDPhA=", - "urls": [ - "Packages/pam-1.5.1-23.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "audit-libs", - "bash", - "glibc", - "libdb", - "libeconf", - "libpwquality", - "libselinux", - "libxcrypt", - "openssl", - "openssl-libs" - ] - }, - { - "name": "pcre", - "integrity": "sha256-fWvh1By00LFZp2S/x8jv7MA1MiS0blKGy76nCStwBpA=", - "urls": [ - "Packages/pcre-8.44-4.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "pcre2", - "integrity": "sha256-vBAS9UF6q4OTg214rIxUcrGi2Eovn6KwD/9fitOl7CY=", - "urls": [ - "Packages/pcre2-10.40-6.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "pcre2-syntax" - ] - }, - { - "name": "pcre2-syntax", - "integrity": "sha256-vjaoT24xGlkZBmTWGkZkcTkasB+3e9HSNI6adkFK3tQ=", - "urls": [ - "Packages/pcre2-syntax-10.40-6.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [] - }, - { - "name": "perl-AutoLoader", - "integrity": "sha256-8Lz0oEpisWPGyAAG1gQRfPWoJXVs457xvQgYroSKos8=", - "urls": [ - "Packages/perl-AutoLoader-5.74-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-libs" - ] - }, - { - "name": "perl-B", - "integrity": "sha256-33sMMEj/vgXQ/22vxF8K99oYlXkgTDvo0ocqBKZ5Tf8=", - "urls": [ - "Packages/perl-B-1.80-481.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "perl-Carp", - "perl-Data-Dumper", - "perl-Exporter", - "perl-libs", - "perl-overloading" - ] - }, - { - "name": "perl-Carp", - "integrity": "sha256-8cpqqkfvlta0fyDzot8s5TAih5DywDMOzlZ8x33dUGM=", - "urls": [ - "Packages/perl-Carp-1.50-460.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Exporter", - "perl-libs" - ] - }, - { - "name": "perl-Class-Struct", - "integrity": "sha256-dBGb2QRQP5xXy8LCVLFOCEBhFaBMElPiIHNyyrWb4e4=", - "urls": [ - "Packages/perl-Class-Struct-0.66-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Exporter", - "perl-libs" - ] - }, - { - "name": "perl-Data-Dumper", - "integrity": "sha256-+XnS7+0TYAH+DVRjK2JrU4QsKB+TVECOD3x1vPxAj2c=", - "urls": [ - "Packages/perl-Data-Dumper-2.174-462.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "perl-B", - "perl-Carp", - "perl-Exporter", - "perl-Scalar-List-Utils", - "perl-constant", - "perl-libs" - ] - }, - { - "name": "perl-Digest", - "integrity": "sha256-3ktxwc+BjUiUDKD2j108UgoyGv/p4zta/Xl2yBHx10E=", - "urls": [ - "Packages/perl-Digest-1.19-4.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Exporter", - "perl-MIME-Base64", - "perl-libs" - ] - }, - { - "name": "perl-Digest-MD5", - "integrity": "sha256-7H44wpEF4VAqE+jhP5vBsbwCohur8C6VppZrQKjYy6o=", - "urls": [ - "Packages/perl-Digest-MD5-2.58-4.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "perl-Digest", - "perl-Exporter", - "perl-libs" - ] - }, - { - "name": "perl-DynaLoader", - "integrity": "sha256-7XQjjJmo9p15nzHGC7T68H+mJQgNvHM1liEEq2MVmnk=", - "urls": [ - "Packages/perl-DynaLoader-1.47-481.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-appstream", - "dependencies": [ - "perl-Carp", - "perl-libs" - ] - }, - { - "name": "perl-Encode", - "integrity": "sha256-hdt4WXEbMPJoMFrQs82raMgHL99rpgclpJZX1q4AG+o=", - "urls": [ - "Packages/perl-Encode-3.08-462.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "perl-Carp", - "perl-Exporter", - "perl-File-Basename", - "perl-Getopt-Long", - "perl-Getopt-Std", - "perl-MIME-Base64", - "perl-Storable", - "perl-constant", - "perl-interpreter", - "perl-libs", - "perl-overload", - "perl-parent", - "perl-vars" - ] - }, - { - "name": "perl-Errno", - "integrity": "sha256-incNGcSFN2Bt2K5QzSTJpI8+vpmf+baqI/CGAgMcXuM=", - "urls": [ - "Packages/perl-Errno-1.30-481.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Exporter", - "perl-libs" - ] - }, - { - "name": "perl-Error", - "integrity": "sha256-SoFheuTjcY/tmvdnEdDUq0w86nxfELJrcE3SoV1sotU=", - "urls": [ - "Packages/perl-Error-0.17029-7.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-appstream", - "dependencies": [ - "perl-Carp", - "perl-Exporter", - "perl-Scalar-List-Utils", - "perl-libs", - "perl-overload", - "perl-vars" - ] - }, - { - "name": "perl-Exporter", - "integrity": "sha256-H+/Fp7yM0xqFPAkM2qB1g0TKzFZWFTLf7yCrcL0wvKs=", - "urls": [ - "Packages/perl-Exporter-5.74-461.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-libs" - ] - }, - { - "name": "perl-Fcntl", - "integrity": "sha256-0qhmfrQxnZxErKhJPI/IQUjustXiOqIilyEMHeH9eEY=", - "urls": [ - "Packages/perl-Fcntl-1.13-481.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "perl-Exporter", - "perl-libs" - ] - }, - { - "name": "perl-File-Basename", - "integrity": "sha256-x4rAbU9uuCUJHT49rkSKQpy0cRsd32x1/fAJRuwJ/X0=", - "urls": [ - "Packages/perl-File-Basename-2.85-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Exporter", - "perl-libs" - ] - }, - { - "name": "perl-File-Find", - "integrity": "sha256-fuTgxIF7glvhZeZjvAPxyO5F6HK4+2uJaDVbrhYi5h4=", - "urls": [ - "Packages/perl-File-Find-1.37-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-appstream", - "dependencies": [ - "perl-Exporter", - "perl-File-Basename", - "perl-PathTools", - "perl-libs" - ] - }, - { - "name": "perl-File-Path", - "integrity": "sha256-dLf3XPPIv3GRqObYhonXrKGx9g1WyJDq19VYpwSkpMw=", - "urls": [ - "Packages/perl-File-Path-2.18-4.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Exporter", - "perl-File-Basename", - "perl-PathTools", - "perl-libs", - "perl-vars" - ] - }, - { - "name": "perl-File-Temp", - "integrity": "sha256-oUFmcMBR/ffqXn/6wFnYjhexSmHPdalb5uPG0ucwEBs=", - "urls": [ - "Packages/perl-File-Temp-0.231.100-4.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Errno", - "perl-Exporter", - "perl-Fcntl", - "perl-File-Path", - "perl-IO", - "perl-POSIX", - "perl-PathTools", - "perl-Scalar-List-Utils", - "perl-constant", - "perl-libs", - "perl-overload", - "perl-parent" - ] - }, - { - "name": "perl-File-stat", - "integrity": "sha256-k+PgO9i9999AZX5ZHaqUZx/zV2zYiVTgVOR63CcDLI4=", - "urls": [ - "Packages/perl-File-stat-1.09-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Class-Struct", - "perl-Exporter", - "perl-Fcntl", - "perl-Symbol", - "perl-constant", - "perl-libs", - "perl-overload" - ] - }, - { - "name": "perl-FileHandle", - "integrity": "sha256-hCS3zsBkKM++iI2dmminUt/XhGbby06GEURp+wNFhNA=", - "urls": [ - "Packages/perl-FileHandle-2.03-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Exporter", - "perl-IO", - "perl-libs" - ] - }, - { - "name": "perl-Getopt-Long", - "integrity": "sha256-AFPWOl6wvDmeLlaiWZoaCdyiDFvKw29xOlb+xGq6w5E=", - "urls": [ - "Packages/perl-Getopt-Long-2.52-4.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Exporter", - "perl-Pod-Usage", - "perl-Text-ParseWords", - "perl-constant", - "perl-libs", - "perl-overload", - "perl-vars" - ] - }, - { - "name": "perl-Getopt-Std", - "integrity": "sha256-ZpQ5jDLeSm8nkEviXEt2U27Z8Ml4HJRq1IpB058GegU=", - "urls": [ - "Packages/perl-Getopt-Std-1.12-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Exporter", - "perl-libs" - ] - }, - { - "name": "perl-Git", - "integrity": "sha256-zBhd0Vpbd4fLGl+TRWs+vicfkob2Z1efM9dvE7wX+II=", - "urls": [ - "Packages/perl-Git-2.47.1-1.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-appstream", - "dependencies": [ - "git", - "perl-Error", - "perl-Exporter", - "perl-constant", - "perl-libs" - ] - }, - { - "name": "perl-HTTP-Tiny", - "integrity": "sha256-hXm81BErlzw70HLbgy4mxNBOuYSVKJLAHvcRmxjMv1A=", - "urls": [ - "Packages/perl-HTTP-Tiny-0.076-462.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Errno", - "perl-Fcntl", - "perl-IO", - "perl-IO-Socket-SSL", - "perl-MIME-Base64", - "perl-Mozilla-CA", - "perl-Net-SSLeay", - "perl-Socket", - "perl-Time-Local", - "perl-libs" - ] - }, - { - "name": "perl-IO", - "integrity": "sha256-EnxT+MAF7jCY5S4ZeuHH/7/Gw1Nz3n1DwcBCky8UjZs=", - "urls": [ - "Packages/perl-IO-1.43-481.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "perl-Carp", - "perl-Errno", - "perl-Exporter", - "perl-Fcntl", - "perl-File-stat", - "perl-PathTools", - "perl-SelectSaver", - "perl-Socket", - "perl-Symbol", - "perl-libs" - ] - }, - { - "name": "perl-IO-Socket-IP", - "integrity": "sha256-lbq+HZby39hfFh0/grs7pK1KJZHQ2QkZEy8TWDd/U78=", - "urls": [ - "Packages/perl-IO-Socket-IP-0.41-5.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Errno", - "perl-IO", - "perl-POSIX", - "perl-Socket", - "perl-base", - "perl-constant", - "perl-libs" - ] - }, - { - "name": "perl-IO-Socket-SSL", - "integrity": "sha256-5S3lOPExZGEi3MxJhbY9RI7xxkFUP6wt8GazF5jhYTE=", - "urls": [ - "Packages/perl-IO-Socket-SSL-2.073-2.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "openssl-libs", - "perl-Carp", - "perl-Errno", - "perl-Exporter", - "perl-HTTP-Tiny", - "perl-IO", - "perl-IO-Socket-IP", - "perl-Net-SSLeay", - "perl-Socket", - "perl-URI", - "perl-constant", - "perl-libs", - "perl-vars" - ] - }, - { - "name": "perl-IPC-Open3", - "integrity": "sha256-VvnMQ4lRFAoaomYlVsElnZorTYDY4R51YWXnLinWHLM=", - "urls": [ - "Packages/perl-IPC-Open3-1.21-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Exporter", - "perl-Fcntl", - "perl-IO", - "perl-POSIX", - "perl-Symbol", - "perl-constant", - "perl-libs" - ] - }, - { - "name": "perl-MIME-Base64", - "integrity": "sha256-zk1O645FJCEkN6yWTZ8La6VixwZKe/l2vsWDbofiDNI=", - "urls": [ - "Packages/perl-MIME-Base64-3.16-4.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "perl-Exporter", - "perl-libs" - ] - }, - { - "name": "perl-Mozilla-CA", - "integrity": "sha256-J9/HL2BFBmVMZx0WSFJmgJTaXoF+hLgZLyHilCmlmDg=", - "urls": [ - "Packages/perl-Mozilla-CA-20200520-6.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "ca-certificates", - "perl-PathTools", - "perl-libs" - ] - }, - { - "name": "perl-Net-SSLeay", - "integrity": "sha256-2Abd5ePntrPKzfgcE/WQxGaxrQA7GOYuHAy7/dJ3GY8=", - "urls": [ - "Packages/perl-Net-SSLeay-1.94-1.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "openssl-libs", - "perl-AutoLoader", - "perl-Carp", - "perl-Errno", - "perl-Exporter", - "perl-MIME-Base64", - "perl-Socket", - "perl-libs", - "perl-vars" - ] - }, - { - "name": "perl-POSIX", - "integrity": "sha256-0uaOgsNNQF+F5IYJ3wfGrnLMZd8YHis+C8gTn+MqLDA=", - "urls": [ - "Packages/perl-POSIX-1.94-481.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "perl-Carp", - "perl-Exporter", - "perl-Fcntl", - "perl-libs" - ] - }, - { - "name": "perl-PathTools", - "integrity": "sha256-DvYTqP49niNVp7Bj8c1dAZdyyDfiQ1ye/NfqklrScCQ=", - "urls": [ - "Packages/perl-PathTools-3.78-461.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "perl-Carp", - "perl-Errno", - "perl-Exporter", - "perl-Scalar-List-Utils", - "perl-constant", - "perl-libs" - ] - }, - { - "name": "perl-Pod-Escapes", - "integrity": "sha256-wyrU8C7K0mTSM3g3hIcGzETwUC852XimwFUWb8+M6Rc=", - "urls": [ - "Packages/perl-Pod-Escapes-1.07-460.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Exporter", - "perl-libs", - "perl-vars" - ] - }, - { - "name": "perl-Pod-Perldoc", - "integrity": "sha256-+zhYN4bB2FH+Fg3g5DauK7My9g4HKm5Y2wKyr/uaq2w=", - "urls": [ - "Packages/perl-Pod-Perldoc-3.28.01-461.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "groff-base", - "perl-Carp", - "perl-Encode", - "perl-Fcntl", - "perl-File-Basename", - "perl-File-Temp", - "perl-HTTP-Tiny", - "perl-IO", - "perl-IPC-Open3", - "perl-PathTools", - "perl-Pod-Simple", - "perl-Symbol", - "perl-Text-ParseWords", - "perl-interpreter", - "perl-libs", - "perl-parent", - "perl-podlators", - "perl-vars" - ] - }, - { - "name": "perl-Pod-Simple", - "integrity": "sha256-S3BXWp8OvA8AJmgRElMiQ7BpnKfcXcsWXO+FatwewNg=", - "urls": [ - "Packages/perl-Pod-Simple-3.42-4.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Encode", - "perl-File-Basename", - "perl-Getopt-Long", - "perl-PathTools", - "perl-Pod-Escapes", - "perl-Symbol", - "perl-Text-Tabs+Wrap", - "perl-if", - "perl-libs", - "perl-overload", - "perl-vars" - ] - }, - { - "name": "perl-Pod-Usage", - "integrity": "sha256-Ld7R76JUEYxkav/VlhUjeCXwDja4apapj9Wci2AVYSo=", - "urls": [ - "Packages/perl-Pod-Usage-2.01-4.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Exporter", - "perl-Getopt-Long", - "perl-PathTools", - "perl-Pod-Perldoc", - "perl-interpreter", - "perl-libs", - "perl-podlators" - ] - }, - { - "name": "perl-Scalar-List-Utils", - "integrity": "sha256-46VEZPGuuyWiqwRjB8PWoDK77WT0k+Ts5SHTgB0dtI4=", - "urls": [ - "Packages/perl-Scalar-List-Utils-1.56-462.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "perl-Carp", - "perl-Exporter", - "perl-libs" - ] - }, - { - "name": "perl-SelectSaver", - "integrity": "sha256-SYAta8ClBT8Db530tUPXPTGEhBMD14ZtgBh5YnqtMqQ=", - "urls": [ - "Packages/perl-SelectSaver-1.02-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Symbol", - "perl-libs" - ] - }, - { - "name": "perl-Socket", - "integrity": "sha256-NWzBYii5emSviyVIZhq2knezKjBmPaKXJ+5iolA8POw=", - "urls": [ - "Packages/perl-Socket-2.031-4.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "perl-Carp", - "perl-Exporter", - "perl-libs" - ] - }, - { - "name": "perl-Storable", - "integrity": "sha256-AnwEITes9m3tDeUoWWEL42NzzNVV3DCoZaMSZ8IsVXk=", - "urls": [ - "Packages/perl-Storable-3.21-460.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "perl-Carp", - "perl-Exporter", - "perl-Fcntl", - "perl-IO", - "perl-libs" - ] - }, - { - "name": "perl-Symbol", - "integrity": "sha256-rgm9etwtSQxtCd3C7MSgEuXnQPHXeFOQrx6BDMLQ5Bw=", - "urls": [ - "Packages/perl-Symbol-1.08-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Exporter", - "perl-libs" - ] - }, - { - "name": "perl-Term-ANSIColor", - "integrity": "sha256-1Oh8eVeA+hkLq6UpHDkOmvME5PE05KpPLQP8m5HKXWA=", - "urls": [ - "Packages/perl-Term-ANSIColor-5.01-461.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Exporter", - "perl-libs" - ] - }, - { - "name": "perl-Term-Cap", - "integrity": "sha256-XDjFPlYvJMvbOVsRNY76r2rugszThQVcX/zxhDWT2No=", - "urls": [ - "Packages/perl-Term-Cap-1.17-460.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "ncurses", - "perl-Carp", - "perl-libs", - "perl-vars" - ] - }, - { - "name": "perl-TermReadKey", - "integrity": "sha256-GH95ZysRaS9c0f3d0HcIhWRCgYrM+hIL7kC+PltrPP8=", - "urls": [ - "Packages/perl-TermReadKey-2.38-11.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-appstream", - "dependencies": [ - "glibc", - "perl-DynaLoader", - "perl-Exporter", - "perl-libs", - "perl-vars" - ] - }, - { - "name": "perl-Text-ParseWords", - "integrity": "sha256-EmTdNdXe2lG0QxlVsoOM0Y4AEtwn8ODLZQYTJCFv8iw=", - "urls": [ - "Packages/perl-Text-ParseWords-3.30-460.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Exporter", - "perl-libs" - ] - }, - { - "name": "perl-Text-Tabs+Wrap", - "integrity": "sha256-EZZiMdKDSyqcLAvyryMeElfOAw2hz+zdFtCKaiMiKyQ=", - "urls": [ - "Packages/perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Exporter", - "perl-libs", - "perl-vars" - ] - }, - { - "name": "perl-Time-Local", - "integrity": "sha256-U/lhb5xgyPt77+/4f1t2xh7nVoamwonzlMR5PTaS3js=", - "urls": [ - "Packages/perl-Time-Local-1.300-7.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Exporter", - "perl-constant", - "perl-libs", - "perl-parent" - ] - }, - { - "name": "perl-URI", - "integrity": "sha256-dF+E/HgchHY8rYABhBcR1hQusT9Q5V3pKNPQUaBDXvI=", - "urls": [ - "Packages/perl-URI-5.09-3.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Data-Dumper", - "perl-Encode", - "perl-Exporter", - "perl-MIME-Base64", - "perl-PathTools", - "perl-Scalar-List-Utils", - "perl-constant", - "perl-libnet", - "perl-libs", - "perl-overload", - "perl-parent" - ] - }, - { - "name": "perl-base", - "integrity": "sha256-fp32QcUCK4JH2F232t3EWBLRv3DbDHxdLojYPuL9Faw=", - "urls": [ - "Packages/perl-base-2.27-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-libs" - ] - }, - { - "name": "perl-constant", - "integrity": "sha256-aiXPudg8ab12e+DjDeJtvJ7OkCyehIllwzeO8UBc624=", - "urls": [ - "Packages/perl-constant-1.33-461.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-libs" - ] - }, - { - "name": "perl-if", - "integrity": "sha256-XdXELs1awn4qFlJZjLkVN4g1PPt1VB9YU4olkCae5/w=", - "urls": [ - "Packages/perl-if-0.60.800-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-libs" - ] - }, - { - "name": "perl-interpreter", - "integrity": "sha256-tAmZwcoatbX2Q3D6Y34R+xb4Eoqouic+T2GEfkuDsr0=", - "urls": [ - "Packages/perl-interpreter-5.32.1-481.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "perl-libs" - ] - }, - { - "name": "perl-lib", - "integrity": "sha256-Ua0KySESn/EJx+5Ha61sUv7bgybuO+eMPx26e18u1rs=", - "urls": [ - "Packages/perl-lib-0.65-481.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-appstream", - "dependencies": [ - "perl-Carp", - "perl-libs" - ] - }, - { - "name": "perl-libnet", - "integrity": "sha256-uILIdCQm0njTh0MqZSIL1j/9FnBzeupDCEmU0rY45dQ=", - "urls": [ - "Packages/perl-libnet-3.13-4.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Digest-MD5", - "perl-Errno", - "perl-Exporter", - "perl-Fcntl", - "perl-File-Basename", - "perl-FileHandle", - "perl-IO", - "perl-IO-Socket-IP", - "perl-POSIX", - "perl-Socket", - "perl-Symbol", - "perl-Time-Local", - "perl-constant", - "perl-libs" - ] - }, - { - "name": "perl-libs", - "integrity": "sha256-lNvlBIMnBI0nF+yiQOt0C46hky44Athlrh3OjEKXqTg=", - "urls": [ - "Packages/perl-libs-5.32.1-481.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "libxcrypt", - "perl-Carp", - "perl-Encode", - "perl-Exporter", - "perl-PathTools" - ] - }, - { - "name": "perl-mro", - "integrity": "sha256-Wm9HoG4XRi6JUO8Fi1cKy6Z589Kv2j8Io+g/yGuf9sY=", - "urls": [ - "Packages/perl-mro-1.23-481.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "perl-libs" - ] - }, - { - "name": "perl-overload", - "integrity": "sha256-mDFhHkwRf0quko7KR09nfzJTAOMt1PeT0hi7s2wPjcU=", - "urls": [ - "Packages/perl-overload-1.31-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Scalar-List-Utils", - "perl-libs", - "perl-mro", - "perl-overloading" - ] - }, - { - "name": "perl-overloading", - "integrity": "sha256-UKYnxXb/GbbdppLJK0IcrXqFFXzXHTk3UqzGI/f4lYA=", - "urls": [ - "Packages/perl-overloading-0.02-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-libs" - ] - }, - { - "name": "perl-parent", - "integrity": "sha256-NCp7hKRM1ZvqBF9nkwnvYUWiNYl97bipr9LQFbwX9yo=", - "urls": [ - "Packages/perl-parent-0.238-460.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-libs" - ] - }, - { - "name": "perl-podlators", - "integrity": "sha256-qsm0wczZQq+uwZKZiA64nhiJtFMefKt1HDvmpm+cX6Y=", - "urls": [ - "Packages/perl-podlators-4.14-460.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-Encode", - "perl-Exporter", - "perl-File-Basename", - "perl-Getopt-Long", - "perl-POSIX", - "perl-PathTools", - "perl-Pod-Simple", - "perl-Pod-Usage", - "perl-Term-ANSIColor", - "perl-Term-Cap", - "perl-interpreter", - "perl-libs", - "perl-subs", - "perl-vars" - ] - }, - { - "name": "perl-subs", - "integrity": "sha256-1/xb/SOXFEmesuSS7u4utj5hc4Ru/KOcL0L4XS8/ptc=", - "urls": [ - "Packages/perl-subs-1.03-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-libs" - ] - }, - { - "name": "perl-vars", - "integrity": "sha256-NuV3H7U0I+/dGHXwNKTX4IQ0pXgKt75F+24ykl5osa0=", - "urls": [ - "Packages/perl-vars-1.05-481.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "perl-Carp", - "perl-libs" - ] - }, - { - "name": "readline", - "integrity": "sha256-SZRUcpJShq2JsFdWV7Q/kiR3fja0QvDIjfZ/C2Hiau4=", - "urls": [ - "Packages/readline-8.1-4.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "ncurses-libs" - ] - }, - { - "name": "sed", - "integrity": "sha256-osXZp/Vpq7Wlkt8cOq/wRBv4J8nQ4t8KtCtsRD28R18=", - "urls": [ - "Packages/sed-4.8-9.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc", - "libacl", - "libselinux" - ] - }, - { - "name": "setup", - "integrity": "sha256-QqHFpBXETjtVVR9JWVwIfiulXw/Z7OgFa3kZg2AbdtI=", - "urls": [ - "Packages/setup-2.13.7-10.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "centos-stream-release" - ] - }, - { - "name": "shadow-utils", - "integrity": "sha256-I/FBQ6GIz5v4oDFfkw++6wrTTFg1cAelLREsX4tgKeA=", - "urls": [ - "Packages/shadow-utils-4.9-12.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "audit-libs", - "glibc", - "libacl", - "libattr", - "libselinux", - "libsemanage", - "libxcrypt", - "setup" - ] - }, - { - "name": "systemd-libs", - "integrity": "sha256-qdAqFrvHeK06K0a4dA+oId8GXNrNa6hXDDMB2srXnw8=", - "urls": [ - "Packages/systemd-libs-252-51.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "coreutils", - "glibc", - "glibc-common", - "grep", - "libcap", - "libgcc", - "libgcrypt", - "libselinux", - "libxcrypt", - "libzstd", - "lz4-libs", - "openssl-libs", - "p11-kit", - "sed", - "xz-libs" - ] - }, - { - "name": "tzdata", - "integrity": "sha256-ZVlF5qDpW5YKQigovByzusIjL+m3ZZDjWtAAaQl/CHo=", - "urls": [ - "Packages/tzdata-2025a-1.el9.noarch.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [] - }, - { - "name": "util-linux", - "integrity": "sha256-d/WqWchcEjG95/ZKfjSLt7RnWgTjheIZJ1q710gDcHU=", - "urls": [ - "Packages/util-linux-2.37.4-21.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "audit-libs", - "bash", - "coreutils", - "glibc", - "libblkid", - "libcap-ng", - "libfdisk", - "libmount", - "libselinux", - "libsmartcols", - "libutempter", - "libuuid", - "libxcrypt", - "ncurses-libs", - "pam", - "readline", - "systemd-libs", - "util-linux-core", - "zlib" - ] - }, - { - "name": "util-linux-core", - "integrity": "sha256-GFj76mV6ntzkFP2YuCYLN+9SF2nwaDD8zHgxCU7AQVQ=", - "urls": [ - "Packages/util-linux-core-2.37.4-21.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "bash", - "glibc", - "libblkid", - "libmount", - "libselinux", - "libsmartcols", - "libuuid", - "ncurses-libs", - "systemd-libs" - ] - }, - { - "name": "xz-libs", - "integrity": "sha256-/zyIKX11xRpfjp0tafitHq+DR+IJILQzWj4PxTJprSg=", - "urls": [ - "Packages/xz-libs-5.2.5-8.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - }, - { - "name": "zlib", - "integrity": "sha256-NwlR6mNbwWMT8hrCgj7IFRR+0RJLdIZaNMVOlOTblgI=", - "urls": [ - "Packages/zlib-1.2.11-41.el9.x86_64.rpm" - ], - "repository": "centos-stream-9-stable-baseos", - "dependencies": [ - "glibc" - ] - } - ], - "targets": [ - "git", - "glibc" - ], - "ignored": [ - "alternatives", - "basesystem" - ] -} \ No newline at end of file diff --git a/e2e/bzlmod-toolchain-circular-dependencies/test_suite.bzl b/e2e/bzlmod-toolchain-circular-dependencies/test_suite.bzl new file mode 100644 index 00000000..2a3eb9ec --- /dev/null +++ b/e2e/bzlmod-toolchain-circular-dependencies/test_suite.bzl @@ -0,0 +1,50 @@ +"A small test suite to test the bzlmod extension" + +load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts") + +def _rpms_listed_only_once_impl(ctx): + env = analysistest.begin(ctx) + + actions = analysistest.target_actions(env) + asserts.equals(env, 1, len(actions)) + inputs = actions[0].inputs.to_list() + all_rpms = dict() + + for f in inputs: + if not f.basename.endswith(".rpm"): + continue + asserts.equals(env, False, f.basename in all_rpms) + all_rpms[f.basename] = 1 + + return analysistest.end(env) + +rpms_listed_only_once_test = analysistest.make(_rpms_listed_only_once_impl) + +def _rpms_non_visibile_cant_be_consumed_impl(ctx): + env = analysistest.begin(ctx) + asserts.expect_failure(env, "Visibility error") + return analysistest.end(env) + +rpms_non_visibile_cant_be_consumed_test = analysistest.make( + _rpms_non_visibile_cant_be_consumed_impl, + expect_failure = True, +) + +def bazeldnf_test_suite(name): + rpms_listed_only_once_test( + name = "rpm_listed_only_once_test", + target_under_test = "//:something", + ) + + rpms_non_visibile_cant_be_consumed_test( + name = "rpm_non_visibile_cant_be_consumed_test", + target_under_test = "//:non-visibile-failure", + ) + + native.test_suite( + name = name, + tests = [ + ":rpm_listed_only_once_test", + ":rpm_non_visibile_cant_be_consumed_test", + ], + ) diff --git a/internal/rpm.bzl b/internal/rpm.bzl index 9b7cda7e..29281bf1 100644 --- a/internal/rpm.bzl +++ b/internal/rpm.bzl @@ -24,7 +24,7 @@ RpmInfo = provider( other rules like rpmtree """, fields = { - "deps": "depset of other dependencies", + "deps": "label of the RPM dependencies", "file": "label of the RPM file", }, ) @@ -34,22 +34,18 @@ def _rpm_rule_impl(ctx): Implementation for the rpm rule Allows to pass information about an RPM file to other rules - like rpmtree, keeping track of the dependency tree + like rpmtree, keeping track of target rpm plus it's entire + dependency list """ - deps_list = [] - - for dep in ctx.attr.deps: - deps_list.append(dep[RpmInfo].deps) - rpm_info = RpmInfo( file = ctx.file.file, - deps = depset(direct = [ctx.file.file], transitive = deps_list), + deps = ctx.files.deps, ) return [ rpm_info, DefaultInfo( - files = depset(direct = [ctx.file.file], transitive = deps_list), + files = depset(direct = [ctx.file.file] + ctx.files.deps), ), ] @@ -57,13 +53,19 @@ rpm_rule = rule( implementation = _rpm_rule_impl, attrs = { "file": attr.label(allow_single_file = True, mandatory = True), - "deps": attr.label_list(providers = [RpmInfo]), + "deps": attr.label_list(allow_files = True, mandatory = False), }, ) _HTTP_FILE_BUILD = """ load("@bazeldnf//internal:rpm.bzl", "rpm_rule") package(default_visibility = ["//visibility:public"]) + +filegroup( + name = "rpm-file", + srcs = ["{downloaded_file_path}"], +) + rpm_rule( name = "rpm", file = "{downloaded_file_path}", @@ -102,7 +104,6 @@ _rpm_attrs = { "integrity": attr.string(), "dependencies": attr.label_list( mandatory = False, - providers = [RpmInfo], ), } @@ -115,7 +116,7 @@ def _null_rpm_rule_impl(_): return [ RpmInfo( file = "", - deps = depset(), + deps = [], ), DefaultInfo(files = depset()), ] diff --git a/internal/rpmtree.bzl b/internal/rpmtree.bzl index 00700f5e..ae0f33ff 100644 --- a/internal/rpmtree.bzl +++ b/internal/rpmtree.bzl @@ -49,7 +49,10 @@ def _rpm2tar_impl(ctx): all_rpms = [] for target in ctx.attr.rpms: - for rpm in target[RpmInfo].deps.to_list(): + if target[RpmInfo].file not in all_rpms: + all_rpms.append(target[RpmInfo].file) + + for rpm in target[RpmInfo].deps: if rpm not in all_rpms: all_rpms.append(rpm) diff --git a/pkg/api/bazeldnf/config.go b/pkg/api/bazeldnf/config.go index ce5648f7..38f4d6ac 100644 --- a/pkg/api/bazeldnf/config.go +++ b/pkg/api/bazeldnf/config.go @@ -5,7 +5,20 @@ type RPM struct { Integrity string `json:"integrity"` URLs []string `json:"urls"` Repository string `json:"repository"` - Dependencies []string `json:"dependencies"` + Dependencies []string `json:"dependencies,omitempty"` +} + +func (i *RPM) Clone() *RPM { + out := RPM{ + Name: i.Name, + Integrity: i.Integrity, + Repository: i.Repository, + } + + out.SetURLs(i.URLs) + out.SetDependencies(i.Dependencies) + + return &out } func (i *RPM) SetDependencies(pkgs []string) { @@ -18,6 +31,13 @@ func (i *RPM) SetDependencies(pkgs []string) { } } +func (i *RPM) SetURLs(urls []string) { + i.URLs = make([]string, len(urls)) + for _, url := range urls { + i.URLs = append(i.URLs, url) + } +} + type Config struct { CommandLineArguments []string `json:"cli-arguments,omitempty"` Name string `json:"name"`