From 514b1df0c27e76d04e83c45b0c4ddca4a8634ff9 Mon Sep 17 00:00:00 2001 From: Jo Date: Fri, 7 Aug 2026 16:04:28 +0900 Subject: [PATCH] fix(dep): fall back to pkgbase fields when building packages from .SRCINFO (#2958) --- pkg/dep/dep_graph.go | 25 +++++++++++++----- pkg/dep/dep_unit_test.go | 56 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 72 insertions(+), 9 deletions(-) diff --git a/pkg/dep/dep_graph.go b/pkg/dep/dep_graph.go index b46731fa..06b91046 100644 --- a/pkg/dep/dep_graph.go +++ b/pkg/dep/dep_graph.go @@ -248,7 +248,7 @@ func (g *Grapher) GraphFromSrcInfos(ctx context.Context, graph *topo.Graph[strin aurPkgsAdded := []*aurc.Pkg{} for pkgBuildDir, pkgbuild := range srcInfos { - aurPkgs, err := makeAURPKGFromSrcinfo(g.dbExecutor, pkgbuild) + aurPkgs, err := PackagesFromSrcinfo(g.dbExecutor, pkgbuild) if err != nil { return nil, err } @@ -836,18 +836,31 @@ func (g *Grapher) provideMenu(dep string, options []aur.Pkg) *aur.Pkg { } } -func makeAURPKGFromSrcinfo(dbExecutor db.Executor, srcInfo *gosrc.Srcinfo) ([]*aur.Pkg, error) { +// PackagesFromSrcinfo converts repository metadata into package metadata used +// by dependency resolution and local package information displays. +func PackagesFromSrcinfo(dbExecutor db.Executor, srcInfo *gosrc.Srcinfo) ([]*aur.Pkg, error) { pkgs := make([]*aur.Pkg, 0, 1) alpmArch, err := dbExecutor.AlpmArchitectures() if err != nil { - return nil, err + return nil, fmt.Errorf("reading architectures for .SRCINFO: %w", err) } alpmArch = append(alpmArch, "") // srcinfo assumes no value as "" getDesc := func(pkg *gosrc.Package) string { return cmp.Or(pkg.Pkgdesc, srcInfo.Pkgdesc) } + // srcInfo.Packages holds only the per-package overrides; anything declared + // once at the pkgbase level lives on srcInfo itself. Fall back to it so a + // plain (non-split) PKGBUILD does not report these as empty. + fallback := func(pkg, base []string) []string { + if len(pkg) > 0 { + return pkg + } + + return base + } + for i := range srcInfo.Packages { pkg := &srcInfo.Packages[i] @@ -858,7 +871,7 @@ func makeAURPKGFromSrcinfo(dbExecutor db.Executor, srcInfo *gosrc.Srcinfo) ([]*a PackageBase: srcInfo.Pkgbase, Version: srcInfo.Version(), Description: getDesc(pkg), - URL: pkg.URL, + URL: cmp.Or(pkg.URL, srcInfo.URL), Depends: slices.Concat(archStringToString(alpmArch, pkg.Depends), archStringToString(alpmArch, srcInfo.Depends)), MakeDepends: archStringToString(alpmArch, srcInfo.MakeDepends), CheckDepends: archStringToString(alpmArch, srcInfo.CheckDepends), @@ -866,8 +879,8 @@ func makeAURPKGFromSrcinfo(dbExecutor db.Executor, srcInfo *gosrc.Srcinfo) ([]*a Provides: slices.Concat(archStringToString(alpmArch, pkg.Provides), archStringToString(alpmArch, srcInfo.Provides)), Replaces: slices.Concat(archStringToString(alpmArch, pkg.Replaces), archStringToString(alpmArch, srcInfo.Replaces)), OptDepends: slices.Concat(archStringToString(alpmArch, pkg.OptDepends), archStringToString(alpmArch, srcInfo.OptDepends)), - Groups: pkg.Groups, - License: pkg.License, + Groups: fallback(pkg.Groups, srcInfo.Groups), + License: fallback(pkg.License, srcInfo.License), Keywords: []string{}, }) } diff --git a/pkg/dep/dep_unit_test.go b/pkg/dep/dep_unit_test.go index b45cacdc..17c08001 100644 --- a/pkg/dep/dep_unit_test.go +++ b/pkg/dep/dep_unit_test.go @@ -157,7 +157,7 @@ func TestProvideMenuAndMakeAURPKGFromSrcinfo(t *testing.T) { require.Equal(t, "aur-pkg-two", grapherNoConfirm.provideMenu("dep", opts).Name) } -func TestMakeAURPKGFromSrcinfo(t *testing.T) { +func TestPackagesFromSrcinfo(t *testing.T) { t.Parallel() assertErr := errors.New("arch error") @@ -188,7 +188,7 @@ func TestMakeAURPKGFromSrcinfo(t *testing.T) { }, } - pkgs, err := makeAURPKGFromSrcinfo(dbExecutor, srcinfo) + pkgs, err := PackagesFromSrcinfo(dbExecutor, srcinfo) require.NoError(t, err) require.Len(t, pkgs, 1) require.Equal(t, []string{"pkgdep", "xdep"}, pkgs[0].Depends) @@ -199,6 +199,56 @@ func TestMakeAURPKGFromSrcinfo(t *testing.T) { }, } - _, err = makeAURPKGFromSrcinfo(dbFail, srcinfo) + _, err = PackagesFromSrcinfo(dbFail, srcinfo) require.Error(t, err) } + +func TestPackagesFromSrcinfoPkgbaseFallback(t *testing.T) { + t.Parallel() + + dbExecutor := &mock.DBExecutor{ + AlpmArchitecturesFn: func() ([]string, error) { + return []string{"x86_64"}, nil + }, + } + + srcinfo := &gosrc.Srcinfo{ + PackageBase: gosrc.PackageBase{ + Pkgbase: "yay", + }, + Package: gosrc.Package{ + URL: "https://example.com/yay", + Groups: []string{"base-group"}, + License: []string{"MIT"}, + }, + Packages: []gosrc.Package{ + { + Pkgname: "yay", + }, + }, + } + + pkgs, err := PackagesFromSrcinfo(dbExecutor, srcinfo) + require.NoError(t, err) + require.Len(t, pkgs, 1) + require.Equal(t, "https://example.com/yay", pkgs[0].URL) + require.Equal(t, []string{"base-group"}, pkgs[0].Groups) + require.Equal(t, []string{"MIT"}, pkgs[0].License) + + // A per-package override must still win over the pkgbase value. + srcinfo.Packages = []gosrc.Package{ + { + Pkgname: "yay", + URL: "https://example.com/yay-override", + Groups: []string{"override-group"}, + License: []string{"GPL"}, + }, + } + + pkgs, err = PackagesFromSrcinfo(dbExecutor, srcinfo) + require.NoError(t, err) + require.Len(t, pkgs, 1) + require.Equal(t, "https://example.com/yay-override", pkgs[0].URL) + require.Equal(t, []string{"override-group"}, pkgs[0].Groups) + require.Equal(t, []string{"GPL"}, pkgs[0].License) +}