Skip to content

Commit f76646e

Browse files
committed
Built without installing with -B
1 parent 4897950 commit f76646e

File tree

8 files changed

+275
-28
lines changed

8 files changed

+275
-28
lines changed

.devcontainer/Dockerfile

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,18 @@ FROM docker.io/jguer/yay-builder
44
# Install extra packages (pacman-contrib and fish)
55
RUN sudo pacman -Syu --noconfirm pacman-contrib fish git-delta openssh bat go github-cli
66

7-
# Set passwordless sudo for the docker user
8-
RUN echo "docker ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/docker
9-
10-
# Create a non-root user and switch to it
11-
USER docker
12-
13-
# Install xgotext
14-
RUN go install github.com/leonelquinteros/gotext/cli/xgotext@latest
15-
16-
# Add /app/bin to the PATH
17-
ENV PATH="/app/bin:/home/docker/go/bin:PATH"
7+
# Add paths to system PATH
8+
ENV PATH="/app/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
189

1910
# Set the working directory
2011
WORKDIR /workspace
2112

13+
# Create a non-root user for development
14+
RUN useradd -m -s /bin/bash devuser && \
15+
echo "devuser ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/devuser
16+
17+
USER devuser
18+
RUN go install github.com/leonelquinteros/gotext/cli/xgotext@latest
19+
2220
# Command to run when starting the container
2321
CMD ["bash"]

.devcontainer/devcontainer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@
1010
"golang.go"
1111
]
1212
}
13-
}
13+
},
14+
"remoteUser": "devuser"
1415
}

cmd.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -329,11 +329,7 @@ func handleUpgrade(ctx context.Context,
329329
func handleBuild(ctx context.Context,
330330
run *runtime.Runtime, dbExecutor db.Executor, cmdArgs *parser.Arguments,
331331
) error {
332-
if cmdArgs.ExistsArg("i", "install") {
333-
return installLocalPKGBUILD(ctx, run, cmdArgs, dbExecutor)
334-
}
335-
336-
return nil
332+
return installLocalPKGBUILD(ctx, run, cmdArgs, dbExecutor)
337333
}
338334

339335
func handleSync(ctx context.Context, run *runtime.Runtime, cmdArgs *parser.Arguments, dbExecutor db.Executor) error {

local_install_test.go

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,146 @@ func TestIntegrationLocalInstall(t *testing.T) {
179179
}
180180
}
181181

182+
func TestIntegrationLocalBuildOnly(t *testing.T) {
183+
makepkgBin := t.TempDir() + "/makepkg"
184+
pacmanBin := t.TempDir() + "/pacman"
185+
gitBin := t.TempDir() + "/git"
186+
tmpDir := t.TempDir()
187+
f, err := os.OpenFile(makepkgBin, os.O_RDONLY|os.O_CREATE, 0o755)
188+
require.NoError(t, err)
189+
require.NoError(t, f.Close())
190+
191+
f, err = os.OpenFile(pacmanBin, os.O_RDONLY|os.O_CREATE, 0o755)
192+
require.NoError(t, err)
193+
require.NoError(t, f.Close())
194+
195+
f, err = os.OpenFile(gitBin, os.O_RDONLY|os.O_CREATE, 0o755)
196+
require.NoError(t, err)
197+
require.NoError(t, f.Close())
198+
199+
tars := []string{
200+
tmpDir + "/jellyfin-10.8.4-1-x86_64.pkg.tar.zst",
201+
tmpDir + "/jellyfin-web-10.8.4-1-x86_64.pkg.tar.zst",
202+
tmpDir + "/jellyfin-server-10.8.4-1-x86_64.pkg.tar.zst",
203+
}
204+
205+
wantShow := []string{
206+
"makepkg --verifysource --skippgpcheck -f -Cc",
207+
"pacman -S --config /etc/pacman.conf -- community/dotnet-sdk-6.0 community/dotnet-runtime-6.0",
208+
"pacman -D -q --asdeps --config /etc/pacman.conf -- dotnet-runtime-6.0 dotnet-sdk-6.0",
209+
"makepkg --nobuild -f -C --ignorearch",
210+
"makepkg -c --nobuild --noextract --ignorearch",
211+
"makepkg --nobuild -f -C --ignorearch",
212+
"makepkg -c --nobuild --noextract --ignorearch",
213+
}
214+
215+
wantCapture := []string{
216+
"makepkg --packagelist",
217+
"git -C testdata/jfin git reset --hard HEAD",
218+
"git -C testdata/jfin git merge --no-edit --ff",
219+
"makepkg --packagelist",
220+
}
221+
222+
captureOverride := func(cmd *exec.Cmd) (stdout string, stderr string, err error) {
223+
return strings.Join(tars, "\n"), "", nil
224+
}
225+
226+
once := sync.Once{}
227+
228+
showOverride := func(cmd *exec.Cmd) error {
229+
once.Do(func() {
230+
for _, tar := range tars {
231+
f, err := os.OpenFile(tar, os.O_RDONLY|os.O_CREATE, 0o666)
232+
require.NoError(t, err)
233+
require.NoError(t, f.Close())
234+
}
235+
})
236+
return nil
237+
}
238+
239+
mockRunner := &exe.MockRunner{CaptureFn: captureOverride, ShowFn: showOverride}
240+
cmdBuilder := &exe.CmdBuilder{
241+
MakepkgBin: makepkgBin,
242+
SudoBin: "su",
243+
PacmanBin: pacmanBin,
244+
PacmanConfigPath: "/etc/pacman.conf",
245+
GitBin: "git",
246+
Runner: mockRunner,
247+
SudoLoopEnabled: false,
248+
}
249+
250+
cmdArgs := parser.MakeArguments()
251+
cmdArgs.AddArg("B")
252+
cmdArgs.AddTarget("testdata/jfin")
253+
settings.NoConfirm = true
254+
defer func() { settings.NoConfirm = false }()
255+
db := &mock.DBExecutor{
256+
AlpmArchitecturesFn: func() ([]string, error) {
257+
return []string{"x86_64"}, nil
258+
},
259+
LocalSatisfierExistsFn: func(s string) bool {
260+
switch s {
261+
case "dotnet-sdk>=6", "dotnet-sdk<7", "dotnet-runtime>=6", "dotnet-runtime<7", "jellyfin-server=10.8.4", "jellyfin-web=10.8.4":
262+
return false
263+
}
264+
265+
return true
266+
},
267+
SyncSatisfierFn: func(s string) mock.IPackage {
268+
switch s {
269+
case "dotnet-runtime>=6", "dotnet-runtime<7":
270+
return &mock.Package{
271+
PName: "dotnet-runtime-6.0",
272+
PBase: "dotnet-runtime-6.0",
273+
PVersion: "6.0.100-1",
274+
PDB: mock.NewDB("community"),
275+
}
276+
case "dotnet-sdk>=6", "dotnet-sdk<7":
277+
return &mock.Package{
278+
PName: "dotnet-sdk-6.0",
279+
PBase: "dotnet-sdk-6.0",
280+
PVersion: "6.0.100-1",
281+
PDB: mock.NewDB("community"),
282+
}
283+
}
284+
285+
return nil
286+
},
287+
LocalPackageFn: func(s string) mock.IPackage { return nil },
288+
InstalledRemotePackageNamesFn: func() []string { return []string{} },
289+
}
290+
291+
run := &runtime.Runtime{
292+
Cfg: &settings.Configuration{
293+
RemoveMake: "no",
294+
},
295+
Logger: newTestLogger(),
296+
CmdBuilder: cmdBuilder,
297+
VCSStore: &vcs.Mock{},
298+
AURClient: &mockaur.MockAUR{
299+
GetFn: func(ctx context.Context, query *aur.Query) ([]aur.Pkg, error) {
300+
return []aur.Pkg{}, nil
301+
},
302+
},
303+
}
304+
305+
err = handleCmd(context.Background(), run, cmdArgs, db)
306+
require.NoError(t, err)
307+
308+
require.Len(t, mockRunner.ShowCalls, len(wantShow))
309+
require.Len(t, mockRunner.CaptureCalls, len(wantCapture))
310+
311+
for i, call := range mockRunner.ShowCalls {
312+
show := call.Args[0].(*exec.Cmd).String()
313+
show = strings.ReplaceAll(show, tmpDir, "/testdir")
314+
show = strings.ReplaceAll(show, makepkgBin, "makepkg")
315+
show = strings.ReplaceAll(show, pacmanBin, "pacman")
316+
show = strings.ReplaceAll(show, gitBin, "pacman")
317+
318+
assert.Subset(t, strings.Split(show, " "), strings.Split(wantShow[i], " "), fmt.Sprintf("%d - %s", i, show))
319+
}
320+
}
321+
182322
func TestIntegrationLocalInstallMissingDep(t *testing.T) {
183323
wantErr := ErrPackagesNotFound
184324
makepkgBin := t.TempDir() + "/makepkg"

main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import (
1818
)
1919

2020
var (
21-
yayVersion = "12.0.4" // To be set by compiler.
21+
yayVersion = "12.5.3" // To be set by compiler.
2222
localePath = "/usr/share/locale" // To be set by compiler.
2323
)
2424

pkg/sync/build/installer.go

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,17 @@ import (
2222
type (
2323
PostInstallHookFunc func(ctx context.Context) error
2424
Installer struct {
25-
dbExecutor db.Executor
26-
postInstallHooks []PostInstallHookFunc
27-
failedAndIgnored map[string]error
28-
exeCmd exe.ICmdBuilder
29-
vcsStore vcs.Store
30-
targetMode parser.TargetMode
31-
rebuildMode parser.RebuildMode
32-
origTargets mapset.Set[string]
33-
downloadOnly bool
34-
log *text.Logger
25+
dbExecutor db.Executor
26+
postInstallHooks []PostInstallHookFunc
27+
failedAndIgnored map[string]error
28+
exeCmd exe.ICmdBuilder
29+
vcsStore vcs.Store
30+
targetMode parser.TargetMode
31+
rebuildMode parser.RebuildMode
32+
origTargets mapset.Set[string]
33+
downloadOnly bool
34+
installBuiltPackages bool
35+
log *text.Logger
3536

3637
manualConfirmRequired bool
3738
}
@@ -50,11 +51,16 @@ func NewInstaller(dbExecutor db.Executor,
5051
targetMode: targetMode,
5152
rebuildMode: rebuildMode,
5253
downloadOnly: downloadOnly,
54+
installBuiltPackages: true,
5355
log: logger,
5456
manualConfirmRequired: true,
5557
}
5658
}
5759

60+
func (installer *Installer) SetInstallBuiltPackages(install bool) {
61+
installer.installBuiltPackages = install
62+
}
63+
5864
func (installer *Installer) CompileFailedAndIgnored() (map[string]error, error) {
5965
if len(installer.failedAndIgnored) == 0 {
6066
return installer.failedAndIgnored, nil
@@ -275,6 +281,10 @@ func (installer *Installer) installAURPackages(ctx context.Context,
275281
}
276282
}
277283

284+
if len(pkgArchives) == 0 || !installer.installBuiltPackages {
285+
return nil
286+
}
287+
278288
if err := installPkgArchive(ctx, installer.exeCmd, installer.targetMode,
279289
installer.vcsStore, cmdArgs, pkgArchives, noConfirm); err != nil {
280290
return fmt.Errorf("%s - %w", fmt.Sprintf(gotext.Get("error installing:")+" %v", pkgArchives), err)

pkg/sync/build/installer_test.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,102 @@ func TestInstaller_InstallNeeded(t *testing.T) {
182182
}
183183
}
184184

185+
func TestInstaller_BuildOnlySkipsInstall(t *testing.T) {
186+
t.Parallel()
187+
188+
makepkgBin := t.TempDir() + "/makepkg"
189+
pacmanBin := t.TempDir() + "/pacman"
190+
f, err := os.OpenFile(makepkgBin, os.O_RDONLY|os.O_CREATE, 0o755)
191+
require.NoError(t, err)
192+
require.NoError(t, f.Close())
193+
194+
f, err = os.OpenFile(pacmanBin, os.O_RDONLY|os.O_CREATE, 0o755)
195+
require.NoError(t, err)
196+
require.NoError(t, f.Close())
197+
198+
tmpDir := t.TempDir()
199+
pkgTar := tmpDir + "/yay-91.0.0-1-x86_64.pkg.tar.zst"
200+
201+
captureOverride := func(cmd *exec.Cmd) (stdout string, stderr string, err error) {
202+
return pkgTar, "", nil
203+
}
204+
205+
i := 0
206+
showOverride := func(cmd *exec.Cmd) error {
207+
i++
208+
if i == 2 {
209+
f, err := os.OpenFile(pkgTar, os.O_RDONLY|os.O_CREATE, 0o666)
210+
require.NoError(t, err)
211+
require.NoError(t, f.Close())
212+
}
213+
return nil
214+
}
215+
216+
mockDB := &mock.DBExecutor{}
217+
mockRunner := &exe.MockRunner{CaptureFn: captureOverride, ShowFn: showOverride}
218+
cmdBuilder := &exe.CmdBuilder{
219+
MakepkgBin: makepkgBin,
220+
SudoBin: "su",
221+
PacmanBin: pacmanBin,
222+
Runner: mockRunner,
223+
SudoLoopEnabled: false,
224+
}
225+
226+
cmdBuilder.Runner = mockRunner
227+
228+
installer := NewInstaller(mockDB, cmdBuilder, &vcs.Mock{}, parser.ModeAny,
229+
parser.RebuildModeNo, false, newTestLogger())
230+
installer.SetInstallBuiltPackages(false)
231+
232+
cmdArgs := parser.MakeArguments()
233+
cmdArgs.AddTarget("yay")
234+
235+
pkgBuildDirs := map[string]string{
236+
"yay": tmpDir,
237+
}
238+
239+
targets := []map[string]*dep.InstallInfo{
240+
{
241+
"yay": {
242+
Source: dep.AUR,
243+
Reason: dep.Explicit,
244+
Version: "91.0.0-1",
245+
SrcinfoPath: ptrString(tmpDir + "/.SRCINFO"),
246+
AURBase: ptrString("yay"),
247+
},
248+
},
249+
}
250+
251+
err = installer.Install(context.Background(), cmdArgs, targets, pkgBuildDirs, []string{}, false)
252+
require.NoError(t, err)
253+
254+
wantShow := []string{
255+
"makepkg --nobuild -f -C --ignorearch",
256+
"makepkg -f -c --noconfirm --noextract --noprepare --holdver --ignorearch",
257+
}
258+
259+
require.Len(t, mockRunner.ShowCalls, len(wantShow))
260+
require.Len(t, mockRunner.CaptureCalls, 1)
261+
262+
for i, call := range mockRunner.ShowCalls {
263+
show := call.Args[0].(*exec.Cmd).String()
264+
show = strings.ReplaceAll(show, tmpDir, "/testdir")
265+
show = strings.ReplaceAll(show, makepkgBin, "makepkg")
266+
show = strings.ReplaceAll(show, pacmanBin, "pacman")
267+
268+
assert.Subset(t, strings.Split(show, " "), strings.Split(wantShow[i], " "), show)
269+
assert.NotContains(t, show, "pacman -U")
270+
}
271+
272+
for _, call := range mockRunner.CaptureCalls {
273+
capture := call.Args[0].(*exec.Cmd).String()
274+
capture = strings.ReplaceAll(capture, tmpDir, "/testdir")
275+
capture = strings.ReplaceAll(capture, makepkgBin, "makepkg")
276+
capture = strings.ReplaceAll(capture, pacmanBin, "pacman")
277+
assert.Subset(t, strings.Split(capture, " "), strings.Split("makepkg --packagelist", " "), capture)
278+
}
279+
}
280+
185281
func TestInstaller_InstallMixedSourcesAndLayers(t *testing.T) {
186282
t.Parallel()
187283

pkg/sync/sync.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ func (o *OperationService) Run(ctx context.Context, run *runtime.Runtime,
5050
run.VCSStore, o.cfg.Mode, o.cfg.ReBuild,
5151
cmdArgs.ExistsArg("w", "downloadonly"), run.Logger.Child("installer"))
5252

53+
shouldInstall := !cmdArgs.ExistsArg("w", "downloadonly")
54+
if cmdArgs.Op == "B" && !cmdArgs.ExistsArg("i", "install") {
55+
shouldInstall = false
56+
}
57+
installer.SetInstallBuiltPackages(shouldInstall)
58+
5359
pkgBuildDirs, errInstall := preparer.Run(ctx, run, targets)
5460
if errInstall != nil {
5561
return errInstall

0 commit comments

Comments
 (0)