fix(dep): fall back to pkgbase fields when building packages from .SRCINFO (#2958)

This commit is contained in:
Jo authored and GitHub committed 2026-08-07 16:04:28 +09:00
1 parent 2d52ad4784
commit 514b1df0c2
2 files changed
+72 -9

No files matched your search

+19 -6
View File
@@ -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{},
})
}
+53 -3
View File
@@ -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)
}