diff --git a/local_install.go b/local_install.go index 55715e64..54b94c0b 100644 --- a/local_install.go +++ b/local_install.go @@ -68,10 +68,7 @@ func installLocalPKGBUILD( return errors.New(gotext.Get("no target directories specified")) } - grapher := dep.NewGrapher(dbExecutor, aurCache, false, settings.NoConfirm, - cmdArgs.ExistsDouble("d", "nodeps"), noCheck, cmdArgs.ExistsArg("needed"), - config.Runtime.Logger.Child("grapher")) - graph := topo.New[string, *dep.InstallInfo]() + srcInfos := map[string]*gosrc.Srcinfo{} for _, targetDir := range cmdArgs.Targets { if err := srcinfoExists(ctx, config.Runtime.CmdBuilder, targetDir); err != nil { return err @@ -82,11 +79,16 @@ func installLocalPKGBUILD( return errors.Wrap(err, gotext.Get("failed to parse .SRCINFO")) } - var errG error - graph, errG = grapher.GraphFromSrcInfo(ctx, graph, targetDir, pkgbuild) - if errG != nil { - return errG - } + srcInfos[targetDir] = pkgbuild + } + + grapher := dep.NewGrapher(dbExecutor, aurCache, false, settings.NoConfirm, + cmdArgs.ExistsDouble("d", "nodeps"), noCheck, cmdArgs.ExistsArg("needed"), + config.Runtime.Logger.Child("grapher")) + graph := topo.New[string, *dep.InstallInfo]() + graph, err := grapher.GraphFromSrcInfos(ctx, graph, srcInfos) + if err != nil { + return err } opService := NewOperationService(ctx, config, dbExecutor) diff --git a/local_install_test.go b/local_install_test.go index 8528418d..cdf483cd 100644 --- a/local_install_test.go +++ b/local_install_test.go @@ -56,10 +56,12 @@ func TestIntegrationLocalInstall(t *testing.T) { "makepkg -c --nobuild --noextract --ignorearch", "makepkg --nobuild -fC --ignorearch", "makepkg -c --nobuild --noextract --ignorearch", + "pacman -U --config /etc/pacman.conf -- /testdir/jellyfin-server-10.8.4-1-x86_64.pkg.tar.zst /testdir/jellyfin-web-10.8.4-1-x86_64.pkg.tar.zst", + "pacman -D -q --asexplicit --config /etc/pacman.conf -- jellyfin-server jellyfin-web", "makepkg --nobuild -fC --ignorearch", "makepkg -c --nobuild --noextract --ignorearch", - "pacman -U --config /etc/pacman.conf -- /testdir/jellyfin-server-10.8.4-1-x86_64.pkg.tar.zst /testdir/jellyfin-10.8.4-1-x86_64.pkg.tar.zst /testdir/jellyfin-web-10.8.4-1-x86_64.pkg.tar.zst", - "pacman -D -q --asexplicit --config /etc/pacman.conf -- jellyfin-server jellyfin jellyfin-web", + "pacman -U --config /etc/pacman.conf -- /testdir/jellyfin-10.8.4-1-x86_64.pkg.tar.zst", + "pacman -D -q --asexplicit --config /etc/pacman.conf -- jellyfin", } wantCapture := []string{ @@ -487,10 +489,12 @@ func TestIntegrationLocalInstallGenerateSRCINFO(t *testing.T) { "makepkg -c --nobuild --noextract --ignorearch", "makepkg --nobuild -fC --ignorearch", "makepkg -c --nobuild --noextract --ignorearch", + "pacman -U --config /etc/pacman.conf -- /testdir/jellyfin-server-10.8.4-1-x86_64.pkg.tar.zst /testdir/jellyfin-web-10.8.4-1-x86_64.pkg.tar.zst", + "pacman -D -q --asexplicit --config /etc/pacman.conf -- jellyfin-server jellyfin-web", "makepkg --nobuild -fC --ignorearch", "makepkg -c --nobuild --noextract --ignorearch", - "pacman -U --config /etc/pacman.conf -- /testdir/jellyfin-server-10.8.4-1-x86_64.pkg.tar.zst /testdir/jellyfin-10.8.4-1-x86_64.pkg.tar.zst /testdir/jellyfin-web-10.8.4-1-x86_64.pkg.tar.zst", - "pacman -D -q --asexplicit --config /etc/pacman.conf -- jellyfin-server jellyfin jellyfin-web", + "pacman -U --config /etc/pacman.conf -- /testdir/jellyfin-10.8.4-1-x86_64.pkg.tar.zst", + "pacman -D -q --asexplicit --config /etc/pacman.conf -- jellyfin", } wantCapture := []string{ @@ -743,3 +747,266 @@ func TestIntegrationLocalInstallMissingFiles(t *testing.T) { assert.Subset(t, strings.Split(show, " "), strings.Split(wantShow[i], " "), fmt.Sprintf("%d - %s", i, show)) } } + +func TestIntegrationLocalInstallWithDepsProvides(t *testing.T) { + makepkgBin := t.TempDir() + "/makepkg" + pacmanBin := t.TempDir() + "/pacman" + gitBin := t.TempDir() + "/git" + tmpDir := t.TempDir() + f, err := os.OpenFile(makepkgBin, os.O_RDONLY|os.O_CREATE, 0o755) + require.NoError(t, err) + require.NoError(t, f.Close()) + + f, err = os.OpenFile(pacmanBin, os.O_RDONLY|os.O_CREATE, 0o755) + require.NoError(t, err) + require.NoError(t, f.Close()) + + f, err = os.OpenFile(gitBin, os.O_RDONLY|os.O_CREATE, 0o755) + require.NoError(t, err) + require.NoError(t, f.Close()) + + tars := []string{ + tmpDir + "/ceph-bin-17.2.6-2-x86_64.pkg.tar.zst", + tmpDir + "/ceph-libs-bin-17.2.6-2-x86_64.pkg.tar.zst", + } + + wantShow := []string{ + "makepkg --verifysource -Ccf", + "makepkg --nobuild -fC --ignorearch", + "makepkg -c --nobuild --noextract --ignorearch", + "pacman -U --config /etc/pacman.conf -- /testdir/ceph-libs-bin-17.2.6-2-x86_64.pkg.tar.zst", + "pacman -D -q --asexplicit --config /etc/pacman.conf -- ceph-libs-bin", + "makepkg --nobuild -fC --ignorearch", + "makepkg -c --nobuild --noextract --ignorearch", + "pacman -U --config /etc/pacman.conf -- /testdir/ceph-bin-17.2.6-2-x86_64.pkg.tar.zst", + "pacman -D -q --asexplicit --config /etc/pacman.conf -- ceph-bin", + } + + wantCapture := []string{ + "git -C testdata/cephbin git reset --hard HEAD", + "git -C testdata/cephbin git merge --no-edit --ff", + "makepkg --packagelist", + "makepkg --packagelist", + } + + captureOverride := func(cmd *exec.Cmd) (stdout string, stderr string, err error) { + return strings.Join(tars, "\n"), "", nil + } + + once := sync.Once{} + + showOverride := func(cmd *exec.Cmd) error { + once.Do(func() { + for _, tar := range tars { + f, err := os.OpenFile(tar, os.O_RDONLY|os.O_CREATE, 0o666) + require.NoError(t, err) + require.NoError(t, f.Close()) + } + }) + return nil + } + + mockRunner := &exe.MockRunner{CaptureFn: captureOverride, ShowFn: showOverride} + cmdBuilder := &exe.CmdBuilder{ + MakepkgBin: makepkgBin, + SudoBin: "su", + PacmanBin: pacmanBin, + PacmanConfigPath: "/etc/pacman.conf", + GitBin: "git", + Runner: mockRunner, + SudoLoopEnabled: false, + } + + cmdArgs := parser.MakeArguments() + cmdArgs.AddArg("B") + cmdArgs.AddArg("i") + cmdArgs.AddTarget("testdata/cephbin") + settings.NoConfirm = true + defer func() { settings.NoConfirm = false }() + db := &mock.DBExecutor{ + AlpmArchitecturesFn: func() ([]string, error) { + return []string{"x86_64"}, nil + }, + LocalSatisfierExistsFn: func(s string) bool { + switch s { + case "ceph=17.2.6-2", "ceph-libs=17.2.6-2": + return false + } + + return true + }, + SyncSatisfierFn: func(s string) mock.IPackage { + return nil + }, + } + + config := &settings.Configuration{ + RemoveMake: "no", + Runtime: &settings.Runtime{ + Logger: NewTestLogger(), + CmdBuilder: cmdBuilder, + VCSStore: &vcs.Mock{}, + AURClient: &mockaur.MockAUR{ + GetFn: func(ctx context.Context, query *aur.Query) ([]aur.Pkg, error) { + return []aur.Pkg{}, nil + }, + }, + }, + } + + err = handleCmd(context.Background(), config, cmdArgs, db) + require.NoError(t, err) + + require.Len(t, mockRunner.ShowCalls, len(wantShow)) + require.Len(t, mockRunner.CaptureCalls, len(wantCapture)) + + for i, call := range mockRunner.ShowCalls { + show := call.Args[0].(*exec.Cmd).String() + show = strings.ReplaceAll(show, tmpDir, "/testdir") // replace the temp dir with a static path + show = strings.ReplaceAll(show, makepkgBin, "makepkg") + show = strings.ReplaceAll(show, pacmanBin, "pacman") + show = strings.ReplaceAll(show, gitBin, "pacman") + + // options are in a different order on different systems and on CI root user is used + assert.Subset(t, strings.Split(show, " "), strings.Split(wantShow[i], " "), fmt.Sprintf("%d - %s", i, show)) + } +} + +func TestIntegrationLocalInstallTwoSrcInfosWithDeps(t *testing.T) { + makepkgBin := t.TempDir() + "/makepkg" + pacmanBin := t.TempDir() + "/pacman" + gitBin := t.TempDir() + "/git" + tmpDir1 := t.TempDir() + tmpDir2 := t.TempDir() + f, err := os.OpenFile(makepkgBin, os.O_RDONLY|os.O_CREATE, 0o755) + require.NoError(t, err) + require.NoError(t, f.Close()) + + f, err = os.OpenFile(pacmanBin, os.O_RDONLY|os.O_CREATE, 0o755) + require.NoError(t, err) + require.NoError(t, f.Close()) + + f, err = os.OpenFile(gitBin, os.O_RDONLY|os.O_CREATE, 0o755) + require.NoError(t, err) + require.NoError(t, f.Close()) + + pkgsTars := []string{ + tmpDir1 + "/libzip-git-1.9.2.r166.gd2c47d0f-1-x86_64.pkg.tar.zst", + tmpDir2 + "/gourou-0.8.1-4-x86_64.pkg.tar.zst", + } + + wantShow := []string{ + "makepkg --verifysource -Ccf", + "makepkg --verifysource -Ccf", + "makepkg --nobuild -fC --ignorearch", + "makepkg -c --nobuild --noextract --ignorearch", + "pacman -U --config /etc/pacman.conf -- /testdir1/libzip-git-1.9.2.r166.gd2c47d0f-1-x86_64.pkg.tar.zst", + "pacman -D -q --asexplicit --config /etc/pacman.conf -- libzip-git", + "makepkg --nobuild -fC --ignorearch", + "makepkg -c --nobuild --noextract --ignorearch", + "pacman -U --config /etc/pacman.conf -- /testdir2/gourou-0.8.1-4-x86_64.pkg.tar.zst", + "pacman -D -q --asexplicit --config /etc/pacman.conf -- gourou", + } + + wantCapture := []string{ + "git -C testdata/gourou git reset --hard HEAD", + "git -C testdata/gourou git merge --no-edit --ff", + "git -C testdata/libzip-git git reset --hard HEAD", + "git -C testdata/libzip-git git merge --no-edit --ff", + "makepkg --packagelist", + "makepkg --packagelist", + } + + captureCounter := 0 + captureOverride := func(cmd *exec.Cmd) (stdout string, stderr string, err error) { + captureCounter++ + switch captureCounter { + case 5: + return pkgsTars[0] + "\n", "", nil + case 6: + return pkgsTars[1] + "\n", "", nil + default: + return "", "", nil + } + } + + once := sync.Once{} + + showOverride := func(cmd *exec.Cmd) error { + once.Do(func() { + for _, tar := range pkgsTars { + f, err := os.OpenFile(tar, os.O_RDONLY|os.O_CREATE, 0o666) + require.NoError(t, err) + require.NoError(t, f.Close()) + } + }) + return nil + } + + mockRunner := &exe.MockRunner{CaptureFn: captureOverride, ShowFn: showOverride} + cmdBuilder := &exe.CmdBuilder{ + MakepkgBin: makepkgBin, + SudoBin: "su", + PacmanBin: pacmanBin, + PacmanConfigPath: "/etc/pacman.conf", + GitBin: "git", + Runner: mockRunner, + SudoLoopEnabled: false, + } + + cmdArgs := parser.MakeArguments() + cmdArgs.AddArg("B") + cmdArgs.AddArg("i") + cmdArgs.AddTarget("testdata/gourou") + cmdArgs.AddTarget("testdata/libzip-git") + settings.NoConfirm = true + defer func() { settings.NoConfirm = false }() + db := &mock.DBExecutor{ + AlpmArchitecturesFn: func() ([]string, error) { + return []string{"x86_64"}, nil + }, + LocalSatisfierExistsFn: func(s string) bool { + switch s { + case "gourou", "libzip", "libzip-git": + return false + } + + return true + }, + SyncSatisfierFn: func(s string) mock.IPackage { + return nil + }, + } + + config := &settings.Configuration{ + RemoveMake: "no", + Runtime: &settings.Runtime{ + Logger: NewTestLogger(), + CmdBuilder: cmdBuilder, + VCSStore: &vcs.Mock{}, + AURClient: &mockaur.MockAUR{ + GetFn: func(ctx context.Context, query *aur.Query) ([]aur.Pkg, error) { + return []aur.Pkg{}, nil + }, + }, + }, + } + + err = handleCmd(context.Background(), config, cmdArgs, db) + require.NoError(t, err) + + require.Len(t, mockRunner.ShowCalls, len(wantShow)) + require.Len(t, mockRunner.CaptureCalls, len(wantCapture)) + + for i, call := range mockRunner.ShowCalls { + show := call.Args[0].(*exec.Cmd).String() + show = strings.ReplaceAll(show, tmpDir1, "/testdir1") // replace the temp dir with a static path + show = strings.ReplaceAll(show, tmpDir2, "/testdir2") // replace the temp dir with a static path + show = strings.ReplaceAll(show, makepkgBin, "makepkg") + show = strings.ReplaceAll(show, pacmanBin, "pacman") + show = strings.ReplaceAll(show, gitBin, "pacman") + + // options are in a different order on different systems and on CI root user is used + assert.Subset(t, strings.Split(show, " "), strings.Split(wantShow[i], " "), fmt.Sprintf("%d - %s", i, show)) + } +} diff --git a/pkg/dep/dep_graph.go b/pkg/dep/dep_graph.go index a0163878..54279814 100644 --- a/pkg/dep/dep_graph.go +++ b/pkg/dep/dep_graph.go @@ -196,8 +196,8 @@ func (g *Grapher) GraphFromTargets(ctx context.Context, return graph, nil } -func (g *Grapher) pickSrcInfoPkgs(pkgs []aurc.Pkg) ([]aurc.Pkg, error) { - final := make([]aurc.Pkg, 0, len(pkgs)) +func (g *Grapher) pickSrcInfoPkgs(pkgs []*aurc.Pkg) ([]*aurc.Pkg, error) { + final := make([]*aurc.Pkg, 0, len(pkgs)) for i := range pkgs { g.logger.Println(text.Magenta(strconv.Itoa(i+1)+" ") + text.Bold(pkgs[i].Name) + " " + text.Cyan(pkgs[i].Version)) @@ -228,44 +228,66 @@ func (g *Grapher) pickSrcInfoPkgs(pkgs []aurc.Pkg) ([]aurc.Pkg, error) { return final, nil } -func (g *Grapher) GraphFromSrcInfo(ctx context.Context, graph *topo.Graph[string, *InstallInfo], pkgBuildDir string, - pkgbuild *gosrc.Srcinfo, +func (g *Grapher) addAurPkgProvides(pkg *aurc.Pkg, graph *topo.Graph[string, *InstallInfo]) { + for i := range pkg.Provides { + depName, mod, version := splitDep(pkg.Provides[i]) + g.logger.Debugln(pkg.String() + " provides: " + depName) + graph.Provides(depName, &alpm.Depend{ + Name: depName, + Version: version, + Mod: aurDepModToAlpmDep(mod), + }, pkg.Name) + } +} + +func (g *Grapher) GraphFromSrcInfos(ctx context.Context, graph *topo.Graph[string, *InstallInfo], + srcInfos map[string]*gosrc.Srcinfo, ) (*topo.Graph[string, *InstallInfo], error) { if graph == nil { graph = topo.New[string, *InstallInfo]() } - aurPkgs, err := makeAURPKGFromSrcinfo(g.dbExecutor, pkgbuild) - if err != nil { - return nil, err - } + aurPkgsAdded := []*aurc.Pkg{} + for pkgBuildDir, pkgbuild := range srcInfos { + pkgBuildDir := pkgBuildDir - if len(aurPkgs) > 1 { - var errPick error - aurPkgs, errPick = g.pickSrcInfoPkgs(aurPkgs) - if errPick != nil { - return nil, errPick + aurPkgs, err := makeAURPKGFromSrcinfo(g.dbExecutor, pkgbuild) + if err != nil { + return nil, err } + + if len(aurPkgs) > 1 { + var errPick error + aurPkgs, errPick = g.pickSrcInfoPkgs(aurPkgs) + if errPick != nil { + return nil, errPick + } + } + + for _, pkg := range aurPkgs { + pkg := pkg + + graph.AddNode(pkg.Name) + + g.addAurPkgProvides(pkg, graph) + + g.ValidateAndSetNodeInfo(graph, pkg.Name, &topo.NodeInfo[*InstallInfo]{ + Color: colorMap[Explicit], + Background: bgColorMap[AUR], + Value: &InstallInfo{ + Source: SrcInfo, + Reason: Explicit, + SrcinfoPath: &pkgBuildDir, + AURBase: &pkg.PackageBase, + Version: pkg.Version, + }, + }) + } + + aurPkgsAdded = append(aurPkgsAdded, aurPkgs...) } - for i := range aurPkgs { - pkg := &aurPkgs[i] - - graph.AddNode(pkg.Name) - g.ValidateAndSetNodeInfo(graph, pkg.Name, &topo.NodeInfo[*InstallInfo]{ - Color: colorMap[Explicit], - Background: bgColorMap[AUR], - Value: &InstallInfo{ - Source: SrcInfo, - Reason: Explicit, - SrcinfoPath: &pkgBuildDir, - AURBase: &pkg.PackageBase, - Version: pkg.Version, - }, - }) - - g.addDepNodes(ctx, pkg, graph) - } + g.AddDepsForPkgs(ctx, aurPkgsAdded, graph) return graph, nil } @@ -324,14 +346,7 @@ func (g *Grapher) GraphAURTarget(ctx context.Context, graph.AddNode(pkg.Name) - for i := range pkg.Provides { - depName, mod, version := splitDep(pkg.Provides[i]) - graph.Provides(depName, &alpm.Depend{ - Name: depName, - Version: version, - Mod: aurDepModToAlpmDep(mod), - }, pkg.Name) - } + g.addAurPkgProvides(pkg, graph) g.ValidateAndSetNodeInfo(graph, pkg.Name, &topo.NodeInfo[*InstallInfo]{ Color: colorMap[instalInfo.Reason], @@ -709,8 +724,8 @@ func (g *Grapher) provideMenu(dep string, options []aur.Pkg) *aur.Pkg { return nil } -func makeAURPKGFromSrcinfo(dbExecutor db.Executor, srcInfo *gosrc.Srcinfo) ([]aur.Pkg, error) { - pkgs := make([]aur.Pkg, 0, 1) +func makeAURPKGFromSrcinfo(dbExecutor db.Executor, srcInfo *gosrc.Srcinfo) ([]*aur.Pkg, error) { + pkgs := make([]*aur.Pkg, 0, 1) alpmArch, err := dbExecutor.AlpmArchitectures() if err != nil { @@ -730,7 +745,7 @@ func makeAURPKGFromSrcinfo(dbExecutor db.Executor, srcInfo *gosrc.Srcinfo) ([]au for i := range srcInfo.Packages { pkg := &srcInfo.Packages[i] - pkgs = append(pkgs, aur.Pkg{ + pkgs = append(pkgs, &aur.Pkg{ ID: 0, Name: pkg.Pkgname, PackageBaseID: 0, diff --git a/pkg/settings/exe/mock.go b/pkg/settings/exe/mock.go index 8255eb94..47c93cb5 100644 --- a/pkg/settings/exe/mock.go +++ b/pkg/settings/exe/mock.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "os/exec" + "sync" "github.com/Jguer/yay/v12/pkg/settings/parser" ) @@ -19,17 +20,20 @@ func (c *Call) String() string { } type MockBuilder struct { - Runner Runner - BuildMakepkgCmdCalls []Call - BuildMakepkgCmdFn func(ctx context.Context, dir string, extraArgs ...string) *exec.Cmd - BuildPacmanCmdFn func(ctx context.Context, args *parser.Arguments, mode parser.TargetMode, noConfirm bool) *exec.Cmd + Runner Runner + BuildMakepkgCmdCallsMu sync.Mutex + BuildMakepkgCmdCalls []Call + BuildMakepkgCmdFn func(ctx context.Context, dir string, extraArgs ...string) *exec.Cmd + BuildPacmanCmdFn func(ctx context.Context, args *parser.Arguments, mode parser.TargetMode, noConfirm bool) *exec.Cmd } type MockRunner struct { - ShowCalls []Call - CaptureCalls []Call - ShowFn func(cmd *exec.Cmd) error - CaptureFn func(cmd *exec.Cmd) (stdout string, stderr string, err error) + ShowCallsMu sync.Mutex + ShowCalls []Call + CaptureCallsMu sync.Mutex + CaptureCalls []Call + ShowFn func(cmd *exec.Cmd) error + CaptureFn func(cmd *exec.Cmd) (stdout string, stderr string, err error) } func (m *MockBuilder) BuildMakepkgCmd(ctx context.Context, dir string, extraArgs ...string) *exec.Cmd { @@ -40,6 +44,7 @@ func (m *MockBuilder) BuildMakepkgCmd(ctx context.Context, dir string, extraArgs res = exec.CommandContext(ctx, "makepkg", extraArgs...) } + m.BuildMakepkgCmdCallsMu.Lock() m.BuildMakepkgCmdCalls = append(m.BuildMakepkgCmdCalls, Call{ Res: []interface{}{res}, Args: []interface{}{ @@ -48,6 +53,7 @@ func (m *MockBuilder) BuildMakepkgCmd(ctx context.Context, dir string, extraArgs extraArgs, }, }) + m.BuildMakepkgCmdCallsMu.Unlock() return res } @@ -86,12 +92,14 @@ func (m *MockBuilder) Show(cmd *exec.Cmd) error { } func (m *MockRunner) Capture(cmd *exec.Cmd) (stdout, stderr string, err error) { + m.CaptureCallsMu.Lock() m.CaptureCalls = append(m.CaptureCalls, Call{ Args: []interface{}{ cmd, }, Dir: cmd.Dir, }) + m.CaptureCallsMu.Unlock() if m.CaptureFn != nil { return m.CaptureFn(cmd) @@ -106,12 +114,14 @@ func (m *MockRunner) Show(cmd *exec.Cmd) error { err = m.ShowFn(cmd) } + m.ShowCallsMu.Lock() m.ShowCalls = append(m.ShowCalls, Call{ Args: []interface{}{ cmd, }, Dir: cmd.Dir, }) + m.ShowCallsMu.Unlock() return err } diff --git a/testdata/cephbin/.SRCINFO b/testdata/cephbin/.SRCINFO new file mode 100644 index 00000000..e56a8516 --- /dev/null +++ b/testdata/cephbin/.SRCINFO @@ -0,0 +1,29 @@ +pkgbase = ceph-bin + pkgdesc = Distributed, fault-tolerant storage platform delivering object, block, and file system + pkgver = 17.2.6 + pkgrel = 2 + url = https://ceph.com/ + arch = x86_64 + license = GPL + noextract = ceph-17.2.6-2.tar.zst + noextract = ceph-libs-17.2.6-2.tar.zst + options = emptydirs + source = ceph-17.2.6-2.tar.zst::https://github.com/bazaah/aur-ceph/releases/download/v17.2.6-2/ceph_linux_x86_64.tar.zstd + source = ceph-libs-17.2.6-2.tar.zst::https://github.com/bazaah/aur-ceph/releases/download/v17.2.6-2/ceph_libs_linux_x86_64.tar.zstd + sha512sums = db38d454ef9fda99fbe9a0954ccb4a8a7b66537f5cb1998dd552161049a6750a82a218d6e95f2bbc2a501637bf13f2f2d0fd6a12b367733cd294364722ba236c + sha512sums = 2218b8d81ce8b94daa63ebd7674bd6d8e3da047ad46bbde1e1666eaa10d429a329ad1e6fa43d9f9d07ba5ce06b57dcc442ca3269eb482bffbb1c25d247d2ba1b + sha512sums = 029f5fd11f30800a78fdc1e4c6541c413be498b284271ef93886268fd47002f6505df698c64a8118f1c2dcef22081c4fcc79e6047db7202d66f2e3e132830742 + +pkgname = ceph-bin + depends = ceph-libs=17.2.6-2 + depends = dep1 + depends = dep2 + provides = ceph=17.2.6-2 + conflicts = ceph + +pkgname = ceph-libs-bin + depends = dep1 + depends = curl + provides = ceph-libs=17.2.6-2 + conflicts = ceph-libs + diff --git a/testdata/cephbin/PKGBUILD b/testdata/cephbin/PKGBUILD new file mode 100644 index 00000000..e69de29b diff --git a/testdata/gourou/.SRCINFO b/testdata/gourou/.SRCINFO new file mode 100644 index 00000000..8634cd10 --- /dev/null +++ b/testdata/gourou/.SRCINFO @@ -0,0 +1,27 @@ +pkgbase = gourou + pkgdesc = Download and decrypt adobe encrypted (acsm) pdf and epub files + pkgver = 0.8.1 + pkgrel = 4 + url = https://indefero.soutade.fr/p/libgourou + arch = x86_64 + license = LGPL3 + depends = glibc + depends = gcc-libs + depends = zlib + depends = libzip + depends = openssl + depends = pugixml + depends = curl + provides = gourou=0.8.1 + provides = libgourou=0.8.1 + conflicts = gourou-git + conflicts = gourou-bin + options = strip + source = git://soutade.fr/libgourou.git#tag=v0.8.1 + source = git://soutade.fr/updfparser.git#commit=a421098092ba600fb1686a7df8fc58cd67429f59 + source = build.patch + sha512sums = SKIP + sha512sums = SKIP + sha512sums = 768e49fddcabe8b4c6f771ebbddf2618ab59e7b1a399d99aa9a9881f932e092210878ef576144593684b4c3a763218c5b546dbe19fdbadeff13995245bffda19 + +pkgname = gourou diff --git a/testdata/gourou/PKGBUILD b/testdata/gourou/PKGBUILD new file mode 100644 index 00000000..e69de29b diff --git a/testdata/libzip-git/.SRCINFO b/testdata/libzip-git/.SRCINFO new file mode 100644 index 00000000..3ffa6651 --- /dev/null +++ b/testdata/libzip-git/.SRCINFO @@ -0,0 +1,23 @@ +pkgbase = libzip-git + pkgdesc = C library for reading, creating, and modifying zip archives + pkgver = 1.9.2.r144.gdadb14d5 + pkgrel = 1 + url = https://libzip.org/ + arch = i686 + arch = x86_64 + license = BSD + makedepends = git + makedepends = cmake + depends = glibc + depends = bzip2 + depends = gnutls + depends = openssl + depends = xz + depends = zlib + depends = zstd + provides = libzip=1.9.2.r144.gdadb14d5 + conflicts = libzip + source = git+https://github.com/nih-at/libzip.git + sha256sums = SKIP + +pkgname = libzip-git diff --git a/testdata/libzip-git/PKGBUILD b/testdata/libzip-git/PKGBUILD new file mode 100644 index 00000000..e69de29b