Skip to content

Commit 514b1df

Browse files
authored
fix(dep): fall back to pkgbase fields when building packages from .SRCINFO (#2958)
1 parent 2d52ad4 commit 514b1df

2 files changed

Lines changed: 72 additions & 9 deletions

File tree

pkg/dep/dep_graph.go

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ func (g *Grapher) GraphFromSrcInfos(ctx context.Context, graph *topo.Graph[strin
248248

249249
aurPkgsAdded := []*aurc.Pkg{}
250250
for pkgBuildDir, pkgbuild := range srcInfos {
251-
aurPkgs, err := makeAURPKGFromSrcinfo(g.dbExecutor, pkgbuild)
251+
aurPkgs, err := PackagesFromSrcinfo(g.dbExecutor, pkgbuild)
252252
if err != nil {
253253
return nil, err
254254
}
@@ -836,18 +836,31 @@ func (g *Grapher) provideMenu(dep string, options []aur.Pkg) *aur.Pkg {
836836
}
837837
}
838838

839-
func makeAURPKGFromSrcinfo(dbExecutor db.Executor, srcInfo *gosrc.Srcinfo) ([]*aur.Pkg, error) {
839+
// PackagesFromSrcinfo converts repository metadata into package metadata used
840+
// by dependency resolution and local package information displays.
841+
func PackagesFromSrcinfo(dbExecutor db.Executor, srcInfo *gosrc.Srcinfo) ([]*aur.Pkg, error) {
840842
pkgs := make([]*aur.Pkg, 0, 1)
841843

842844
alpmArch, err := dbExecutor.AlpmArchitectures()
843845
if err != nil {
844-
return nil, err
846+
return nil, fmt.Errorf("reading architectures for .SRCINFO: %w", err)
845847
}
846848

847849
alpmArch = append(alpmArch, "") // srcinfo assumes no value as ""
848850

849851
getDesc := func(pkg *gosrc.Package) string { return cmp.Or(pkg.Pkgdesc, srcInfo.Pkgdesc) }
850852

853+
// srcInfo.Packages holds only the per-package overrides; anything declared
854+
// once at the pkgbase level lives on srcInfo itself. Fall back to it so a
855+
// plain (non-split) PKGBUILD does not report these as empty.
856+
fallback := func(pkg, base []string) []string {
857+
if len(pkg) > 0 {
858+
return pkg
859+
}
860+
861+
return base
862+
}
863+
851864
for i := range srcInfo.Packages {
852865
pkg := &srcInfo.Packages[i]
853866

@@ -858,16 +871,16 @@ func makeAURPKGFromSrcinfo(dbExecutor db.Executor, srcInfo *gosrc.Srcinfo) ([]*a
858871
PackageBase: srcInfo.Pkgbase,
859872
Version: srcInfo.Version(),
860873
Description: getDesc(pkg),
861-
URL: pkg.URL,
874+
URL: cmp.Or(pkg.URL, srcInfo.URL),
862875
Depends: slices.Concat(archStringToString(alpmArch, pkg.Depends), archStringToString(alpmArch, srcInfo.Depends)),
863876
MakeDepends: archStringToString(alpmArch, srcInfo.MakeDepends),
864877
CheckDepends: archStringToString(alpmArch, srcInfo.CheckDepends),
865878
Conflicts: slices.Concat(archStringToString(alpmArch, pkg.Conflicts), archStringToString(alpmArch, srcInfo.Conflicts)),
866879
Provides: slices.Concat(archStringToString(alpmArch, pkg.Provides), archStringToString(alpmArch, srcInfo.Provides)),
867880
Replaces: slices.Concat(archStringToString(alpmArch, pkg.Replaces), archStringToString(alpmArch, srcInfo.Replaces)),
868881
OptDepends: slices.Concat(archStringToString(alpmArch, pkg.OptDepends), archStringToString(alpmArch, srcInfo.OptDepends)),
869-
Groups: pkg.Groups,
870-
License: pkg.License,
882+
Groups: fallback(pkg.Groups, srcInfo.Groups),
883+
License: fallback(pkg.License, srcInfo.License),
871884
Keywords: []string{},
872885
})
873886
}

pkg/dep/dep_unit_test.go

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ func TestProvideMenuAndMakeAURPKGFromSrcinfo(t *testing.T) {
157157
require.Equal(t, "aur-pkg-two", grapherNoConfirm.provideMenu("dep", opts).Name)
158158
}
159159

160-
func TestMakeAURPKGFromSrcinfo(t *testing.T) {
160+
func TestPackagesFromSrcinfo(t *testing.T) {
161161
t.Parallel()
162162

163163
assertErr := errors.New("arch error")
@@ -188,7 +188,7 @@ func TestMakeAURPKGFromSrcinfo(t *testing.T) {
188188
},
189189
}
190190

191-
pkgs, err := makeAURPKGFromSrcinfo(dbExecutor, srcinfo)
191+
pkgs, err := PackagesFromSrcinfo(dbExecutor, srcinfo)
192192
require.NoError(t, err)
193193
require.Len(t, pkgs, 1)
194194
require.Equal(t, []string{"pkgdep", "xdep"}, pkgs[0].Depends)
@@ -199,6 +199,56 @@ func TestMakeAURPKGFromSrcinfo(t *testing.T) {
199199
},
200200
}
201201

202-
_, err = makeAURPKGFromSrcinfo(dbFail, srcinfo)
202+
_, err = PackagesFromSrcinfo(dbFail, srcinfo)
203203
require.Error(t, err)
204204
}
205+
206+
func TestPackagesFromSrcinfoPkgbaseFallback(t *testing.T) {
207+
t.Parallel()
208+
209+
dbExecutor := &mock.DBExecutor{
210+
AlpmArchitecturesFn: func() ([]string, error) {
211+
return []string{"x86_64"}, nil
212+
},
213+
}
214+
215+
srcinfo := &gosrc.Srcinfo{
216+
PackageBase: gosrc.PackageBase{
217+
Pkgbase: "yay",
218+
},
219+
Package: gosrc.Package{
220+
URL: "https://example.com/yay",
221+
Groups: []string{"base-group"},
222+
License: []string{"MIT"},
223+
},
224+
Packages: []gosrc.Package{
225+
{
226+
Pkgname: "yay",
227+
},
228+
},
229+
}
230+
231+
pkgs, err := PackagesFromSrcinfo(dbExecutor, srcinfo)
232+
require.NoError(t, err)
233+
require.Len(t, pkgs, 1)
234+
require.Equal(t, "https://example.com/yay", pkgs[0].URL)
235+
require.Equal(t, []string{"base-group"}, pkgs[0].Groups)
236+
require.Equal(t, []string{"MIT"}, pkgs[0].License)
237+
238+
// A per-package override must still win over the pkgbase value.
239+
srcinfo.Packages = []gosrc.Package{
240+
{
241+
Pkgname: "yay",
242+
URL: "https://example.com/yay-override",
243+
Groups: []string{"override-group"},
244+
License: []string{"GPL"},
245+
},
246+
}
247+
248+
pkgs, err = PackagesFromSrcinfo(dbExecutor, srcinfo)
249+
require.NoError(t, err)
250+
require.Len(t, pkgs, 1)
251+
require.Equal(t, "https://example.com/yay-override", pkgs[0].URL)
252+
require.Equal(t, []string{"override-group"}, pkgs[0].Groups)
253+
require.Equal(t, []string{"GPL"}, pkgs[0].License)
254+
}

0 commit comments

Comments
 (0)