From b6d92688105637e811b1b65f8283e4a595fcce95 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Tue, 4 Feb 2020 16:41:50 +0100 Subject: [PATCH] dnf-json: support excluding packages In our base distro definitions we exclude packages in addition to including them. Extend dnf-json to support this, so we can depsolve the base package set as well as the packages added in blueprints. Signed-off-by: Tom Gundersen --- cmd/osbuild-pipeline/main.go | 6 +++--- dnf-json | 2 +- internal/mocks/rpmmd/rpmmd_mock.go | 10 +++++----- internal/rpmmd/repository.go | 9 +++++---- internal/weldr/api.go | 4 ++-- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/cmd/osbuild-pipeline/main.go b/cmd/osbuild-pipeline/main.go index ce894ebb7..cf291696b 100644 --- a/cmd/osbuild-pipeline/main.go +++ b/cmd/osbuild-pipeline/main.go @@ -29,7 +29,7 @@ func main() { flag.Usage() return } - + // Validate architecture if !common.ArchitectureExists(archArg) { _, _ = fmt.Fprintf(os.Stderr, "The provided architecture (%s) is not supported. Use one of these:\n", archArg) @@ -47,7 +47,7 @@ func main() { } return } - + // Validate image type blueprint := &blueprint.Blueprint{} @@ -81,7 +81,7 @@ func main() { } rpmmd := rpmmd.NewRPMMD() - _, checksums, err := rpmmd.Depsolve(packages, d.Repositories(archArg), true) + _, checksums, err := rpmmd.Depsolve(packages, nil, d.Repositories(archArg), true) if err != nil { panic(err.Error()) } diff --git a/dnf-json b/dnf-json index e0921ec44..db123502f 100644 --- a/dnf-json +++ b/dnf-json @@ -109,7 +109,7 @@ elif command == "depsolve": errors = [] try: - base.install_specs(arguments["package-specs"]) + base.install_specs(arguments["package-specs"], exclude=arguments.get("exclude-specs", [])) except dnf.exceptions.MarkingErrors as e: exit_with_dnf_error("MarkingErrors", f"Error occurred when marking packages for installation: {e}") diff --git a/internal/mocks/rpmmd/rpmmd_mock.go b/internal/mocks/rpmmd/rpmmd_mock.go index d5d3162fb..d958a95da 100644 --- a/internal/mocks/rpmmd/rpmmd_mock.go +++ b/internal/mocks/rpmmd/rpmmd_mock.go @@ -6,14 +6,14 @@ import ( ) type fetchPackageList struct { - ret rpmmd.PackageList + ret rpmmd.PackageList checksums map[string]string - err error + err error } type depsolve struct { - ret []rpmmd.PackageSpec + ret []rpmmd.PackageSpec checksums map[string]string - err error + err error } type Fixture struct { @@ -34,6 +34,6 @@ func (r *rpmmdMock) FetchPackageList(repos []rpmmd.RepoConfig) (rpmmd.PackageLis return r.Fixture.fetchPackageList.ret, r.Fixture.fetchPackageList.checksums, r.Fixture.fetchPackageList.err } -func (r *rpmmdMock) Depsolve(specs []string, repos []rpmmd.RepoConfig, clean bool) ([]rpmmd.PackageSpec, map[string]string, error) { +func (r *rpmmdMock) Depsolve(specs, excludeSpecs []string, repos []rpmmd.RepoConfig, clean bool) ([]rpmmd.PackageSpec, map[string]string, error) { return r.Fixture.depsolve.ret, r.Fixture.fetchPackageList.checksums, r.Fixture.depsolve.err } diff --git a/internal/rpmmd/repository.go b/internal/rpmmd/repository.go index 1ee291c0c..0f3506dc5 100644 --- a/internal/rpmmd/repository.go +++ b/internal/rpmmd/repository.go @@ -96,7 +96,7 @@ type PackageInfo struct { type RPMMD interface { FetchPackageList(repos []RepoConfig) (PackageList, map[string]string, error) - Depsolve(specs []string, repos []RepoConfig, clean bool) ([]PackageSpec, map[string]string, error) + Depsolve(specs, excludeSpecs []string, repos []RepoConfig, clean bool) ([]PackageSpec, map[string]string, error) } type DNFError struct { @@ -214,12 +214,13 @@ func (*rpmmdImpl) FetchPackageList(repos []RepoConfig) (PackageList, map[string] return reply.Packages, reply.Checksums, err } -func (*rpmmdImpl) Depsolve(specs []string, repos []RepoConfig, clean bool) ([]PackageSpec, map[string]string, error) { +func (*rpmmdImpl) Depsolve(specs, excludeSpecs []string, repos []RepoConfig, clean bool) ([]PackageSpec, map[string]string, error) { var arguments = struct { PackageSpecs []string `json:"package-specs"` + ExcludSpecs []string `json:"exclude-specs"` Repos []RepoConfig `json:"repos"` Clean bool `json:"clean,omitempty"` - }{specs, repos, clean} + }{specs, excludeSpecs, repos, clean} var reply struct { Checksums map[string]string `json:"checksums"` Dependencies []PackageSpec `json:"dependencies"` @@ -281,6 +282,6 @@ func (packages PackageList) ToPackageInfos() []PackageInfo { } func (pkg *PackageInfo) FillDependencies(rpmmd RPMMD, repos []RepoConfig) (err error) { - pkg.Dependencies, _, err = rpmmd.Depsolve([]string{pkg.Name}, repos, false) + pkg.Dependencies, _, err = rpmmd.Depsolve([]string{pkg.Name}, nil, repos, false) return } diff --git a/internal/weldr/api.go b/internal/weldr/api.go index 80287a9f5..31ec1518f 100644 --- a/internal/weldr/api.go +++ b/internal/weldr/api.go @@ -645,7 +645,7 @@ func (api *API) projectsDepsolveHandler(writer http.ResponseWriter, request *htt names := strings.Split(params.ByName("projects"), ",") - packages, _, err := api.rpmmd.Depsolve(names, api.distro.Repositories(api.arch), false) + packages, _, err := api.rpmmd.Depsolve(names, nil, api.distro.Repositories(api.arch), false) if err != nil { errors := responseError{ @@ -1817,7 +1817,7 @@ func (api *API) depsolveBlueprint(bp *blueprint.Blueprint, clean bool) ([]rpmmd. repos = append(repos, source.RepoConfig()) } - return api.rpmmd.Depsolve(specs, repos, clean) + return api.rpmmd.Depsolve(specs, nil, repos, clean) } func (api *API) uploadsScheduleHandler(writer http.ResponseWriter, request *http.Request, params httprouter.Params) {