fix(dep): fall back to pkgbase fields when building packages from .SRCINFO (#2958)
This commit is contained in:
2 files changed
+72
-9
No files matched your search
+19
-6
@@ -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{},
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
Reference in new issue
Block a user