From 29951c51749f1c3f5ca96488bff6eee247c03dc7 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Mon, 12 Jan 2026 04:17:47 +0900 Subject: [PATCH] internal/pkg: caller-supplied reporting name for exec This does not have a reasonable way of inferring the underlying name. For zero value it falls back to base of executable pathname. Signed-off-by: Ophestra --- internal/pkg/exec.go | 21 +++++++++++++++++++-- internal/pkg/exec_test.go | 16 ++++++++-------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/internal/pkg/exec.go b/internal/pkg/exec.go index 2ded00e..8fd6898 100644 --- a/internal/pkg/exec.go +++ b/internal/pkg/exec.go @@ -4,7 +4,9 @@ import ( "bytes" "context" "errors" + "fmt" "os" + "path" "slices" "strconv" "syscall" @@ -55,6 +57,8 @@ const ( // Methods of execArtifact does not modify any struct field or underlying arrays // referred to by slices. type execArtifact struct { + // Caller-supplied user-facing reporting name. + name string // Caller-supplied inner mount points. paths []ExecPath @@ -73,6 +77,8 @@ type execArtifact struct { timeout time.Duration } +var _ fmt.Stringer = new(execArtifact) + // execNetArtifact is like execArtifact but implements [KnownChecksum] and has // its resulting container keep the host net namespace. type execNetArtifact struct { @@ -119,24 +125,32 @@ func (a *execNetArtifact) Cure(f *FContext) error { // process and all processes originating from it is terminated. A zero or // negative timeout value is equivalent tp [ExecTimeoutDefault], a timeout value // greater than [ExecTimeoutMax] is equivalent to [ExecTimeoutMax]. +// +// The user-facing name is not accessible from the container and does not +// affect curing outcome. Because of this, it is omitted from parameter data +// for computing identifier. func NewExec( + name string, checksum *Checksum, timeout time.Duration, dir *check.Absolute, env []string, - path *check.Absolute, + pathname *check.Absolute, args []string, paths ...ExecPath, ) Artifact { + if name == "" { + name = "exec-" + path.Base(pathname.String()) + } if timeout <= 0 { timeout = ExecTimeoutDefault } if timeout > ExecTimeoutMax { timeout = ExecTimeoutMax } - a := execArtifact{paths, dir, env, path, args, timeout} + a := execArtifact{name, paths, dir, env, pathname, args, timeout} if checksum == nil { return &a } @@ -192,6 +206,9 @@ func (a *execArtifact) Dependencies() []Artifact { return slices.Concat(artifacts...) } +// String returns the caller-supplied reporting name. +func (a *execArtifact) String() string { return a.name } + // Cure cures the [Artifact] in the container described by the caller. func (a *execArtifact) Cure(f *FContext) (err error) { return a.cure(f, false) diff --git a/internal/pkg/exec_test.go b/internal/pkg/exec_test.go index b422da3..97f72a3 100644 --- a/internal/pkg/exec_test.go +++ b/internal/pkg/exec_test.go @@ -38,7 +38,7 @@ func TestExec(t *testing.T) { cureMany(t, c, []cureStep{ {"container", pkg.NewExec( - nil, 0, + "", nil, 0, pkg.AbsWork, []string{"HAKUREI_TEST=1"}, check.MustAbs("/opt/bin/testtool"), @@ -61,7 +61,7 @@ func TestExec(t *testing.T) { ), ignorePathname, wantChecksumOffline, nil}, {"error passthrough", pkg.NewExec( - nil, 0, + "", nil, 0, pkg.AbsWork, []string{"HAKUREI_TEST=1"}, check.MustAbs("/opt/bin/testtool"), @@ -77,7 +77,7 @@ func TestExec(t *testing.T) { ), nil, pkg.Checksum{}, errors.Join(stub.UniqueError(0xcafe))}, {"invalid paths", pkg.NewExec( - nil, 0, + "", nil, 0, pkg.AbsWork, []string{"HAKUREI_TEST=1"}, check.MustAbs("/opt/bin/testtool"), @@ -90,7 +90,7 @@ func TestExec(t *testing.T) { // check init failure passthrough var exitError *exec.ExitError if _, _, err := c.Cure(pkg.NewExec( - nil, 0, + "", nil, 0, pkg.AbsWork, nil, check.MustAbs("/opt/bin/testtool"), @@ -112,7 +112,7 @@ func TestExec(t *testing.T) { ) cureMany(t, c, []cureStep{ {"container", pkg.NewExec( - &wantChecksum, 0, + "", &wantChecksum, 0, pkg.AbsWork, []string{"HAKUREI_TEST=1"}, check.MustAbs("/opt/bin/testtool"), @@ -144,7 +144,7 @@ func TestExec(t *testing.T) { cureMany(t, c, []cureStep{ {"container", pkg.NewExec( - nil, 0, + "", nil, 0, pkg.AbsWork, []string{"HAKUREI_TEST=1", "HAKUREI_ROOT=1"}, check.MustAbs("/opt/bin/testtool"), @@ -170,7 +170,7 @@ func TestExec(t *testing.T) { cureMany(t, c, []cureStep{ {"container", pkg.NewExec( - nil, 0, + "", nil, 0, pkg.AbsWork, []string{"HAKUREI_TEST=1", "HAKUREI_ROOT=1"}, check.MustAbs("/work/bin/testtool"), @@ -201,7 +201,7 @@ func TestExec(t *testing.T) { cureMany(t, c, []cureStep{ {"container", pkg.NewExec( - nil, 0, + "", nil, 0, pkg.AbsWork, []string{"HAKUREI_TEST=1", "HAKUREI_ROOT=1"}, check.MustAbs("/opt/bin/testtool"),