container/check: return error backed by string type
All checks were successful
Test / Create distribution (push) Successful in 47s
Test / Sandbox (push) Successful in 2m48s
Test / ShareFS (push) Successful in 4m51s
Test / Sandbox (race detector) (push) Successful in 5m11s
Test / Hpkg (push) Successful in 5m24s
Test / Hakurei (push) Successful in 5m43s
Test / Hakurei (race detector) (push) Successful in 7m36s
Test / Flake checks (push) Successful in 1m57s
All checks were successful
Test / Create distribution (push) Successful in 47s
Test / Sandbox (push) Successful in 2m48s
Test / ShareFS (push) Successful in 4m51s
Test / Sandbox (race detector) (push) Successful in 5m11s
Test / Hpkg (push) Successful in 5m24s
Test / Hakurei (push) Successful in 5m43s
Test / Hakurei (race detector) (push) Successful in 7m36s
Test / Flake checks (push) Successful in 1m57s
The struct turned out not necessary during initial implementation but was not unwrapped into its single string field. This change replaces it with the underlying string and removes the indirection. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
@@ -13,15 +13,18 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// AbsoluteError is returned by [NewAbs] and holds the invalid pathname.
|
// AbsoluteError is returned by [NewAbs] and holds the invalid pathname.
|
||||||
type AbsoluteError struct{ Pathname string }
|
type AbsoluteError string
|
||||||
|
|
||||||
func (e *AbsoluteError) Error() string { return fmt.Sprintf("path %q is not absolute", e.Pathname) }
|
func (e AbsoluteError) Error() string {
|
||||||
func (e *AbsoluteError) Is(target error) bool {
|
return fmt.Sprintf("path %q is not absolute", string(e))
|
||||||
var ce *AbsoluteError
|
}
|
||||||
|
|
||||||
|
func (e AbsoluteError) Is(target error) bool {
|
||||||
|
var ce AbsoluteError
|
||||||
if !errors.As(target, &ce) {
|
if !errors.As(target, &ce) {
|
||||||
return errors.Is(target, syscall.EINVAL)
|
return errors.Is(target, syscall.EINVAL)
|
||||||
}
|
}
|
||||||
return *e == *ce
|
return e == ce
|
||||||
}
|
}
|
||||||
|
|
||||||
// Absolute holds a pathname checked to be absolute.
|
// Absolute holds a pathname checked to be absolute.
|
||||||
@@ -59,7 +62,7 @@ func (a *Absolute) Is(v *Absolute) bool {
|
|||||||
// NewAbs checks pathname and returns a new [Absolute] if pathname is absolute.
|
// NewAbs checks pathname and returns a new [Absolute] if pathname is absolute.
|
||||||
func NewAbs(pathname string) (*Absolute, error) {
|
func NewAbs(pathname string) (*Absolute, error) {
|
||||||
if !path.IsAbs(pathname) {
|
if !path.IsAbs(pathname) {
|
||||||
return nil, &AbsoluteError{pathname}
|
return nil, AbsoluteError(pathname)
|
||||||
}
|
}
|
||||||
return unsafeAbs(pathname), nil
|
return unsafeAbs(pathname), nil
|
||||||
}
|
}
|
||||||
@@ -90,7 +93,7 @@ func (a *Absolute) GobEncode() ([]byte, error) {
|
|||||||
func (a *Absolute) GobDecode(data []byte) error {
|
func (a *Absolute) GobDecode(data []byte) error {
|
||||||
pathname := string(data)
|
pathname := string(data)
|
||||||
if !path.IsAbs(pathname) {
|
if !path.IsAbs(pathname) {
|
||||||
return &AbsoluteError{pathname}
|
return AbsoluteError(pathname)
|
||||||
}
|
}
|
||||||
a.pathname = unique.Make(pathname)
|
a.pathname = unique.Make(pathname)
|
||||||
return nil
|
return nil
|
||||||
@@ -108,7 +111,7 @@ func (a *Absolute) UnmarshalJSON(data []byte) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if !path.IsAbs(pathname) {
|
if !path.IsAbs(pathname) {
|
||||||
return &AbsoluteError{pathname}
|
return AbsoluteError(pathname)
|
||||||
}
|
}
|
||||||
a.pathname = unique.Make(pathname)
|
a.pathname = unique.Make(pathname)
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ func TestAbsoluteError(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{"EINVAL", new(AbsoluteError), syscall.EINVAL, true},
|
{"EINVAL", new(AbsoluteError), syscall.EINVAL, true},
|
||||||
{"not EINVAL", new(AbsoluteError), syscall.EBADE, false},
|
{"not EINVAL", new(AbsoluteError), syscall.EBADE, false},
|
||||||
{"ne val", new(AbsoluteError), &AbsoluteError{Pathname: "etc"}, false},
|
{"ne val", new(AbsoluteError), AbsoluteError("etc"), false},
|
||||||
{"equals", &AbsoluteError{Pathname: "etc"}, &AbsoluteError{Pathname: "etc"}, true},
|
{"equals", AbsoluteError("etc"), AbsoluteError("etc"), true},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
@@ -45,7 +45,7 @@ func TestAbsoluteError(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
want := `path "etc" is not absolute`
|
want := `path "etc" is not absolute`
|
||||||
if got := (&AbsoluteError{Pathname: "etc"}).Error(); got != want {
|
if got := (AbsoluteError("etc")).Error(); got != want {
|
||||||
t.Errorf("Error: %q, want %q", got, want)
|
t.Errorf("Error: %q, want %q", got, want)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -62,8 +62,8 @@ func TestNewAbs(t *testing.T) {
|
|||||||
wantErr error
|
wantErr error
|
||||||
}{
|
}{
|
||||||
{"good", "/etc", MustAbs("/etc"), nil},
|
{"good", "/etc", MustAbs("/etc"), nil},
|
||||||
{"not absolute", "etc", nil, &AbsoluteError{Pathname: "etc"}},
|
{"not absolute", "etc", nil, AbsoluteError("etc")},
|
||||||
{"zero", "", nil, &AbsoluteError{Pathname: ""}},
|
{"zero", "", nil, AbsoluteError("")},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
@@ -84,7 +84,7 @@ func TestNewAbs(t *testing.T) {
|
|||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
wantPanic := &AbsoluteError{Pathname: "etc"}
|
wantPanic := AbsoluteError("etc")
|
||||||
|
|
||||||
if r := recover(); !reflect.DeepEqual(r, wantPanic) {
|
if r := recover(); !reflect.DeepEqual(r, wantPanic) {
|
||||||
t.Errorf("MustAbs: panic = %v; want %v", r, wantPanic)
|
t.Errorf("MustAbs: panic = %v; want %v", r, wantPanic)
|
||||||
@@ -175,7 +175,7 @@ func TestCodecAbsolute(t *testing.T) {
|
|||||||
|
|
||||||
`"/etc"`, `{"val":"/etc","magic":3236757504}`},
|
`"/etc"`, `{"val":"/etc","magic":3236757504}`},
|
||||||
{"not absolute", nil,
|
{"not absolute", nil,
|
||||||
&AbsoluteError{Pathname: "etc"},
|
AbsoluteError("etc"),
|
||||||
"\t\x7f\x05\x01\x02\xff\x82\x00\x00\x00\a\xff\x80\x00\x03etc",
|
"\t\x7f\x05\x01\x02\xff\x82\x00\x00\x00\a\xff\x80\x00\x03etc",
|
||||||
",\xff\x83\x03\x01\x01\x06sCheck\x01\xff\x84\x00\x01\x02\x01\bPathname\x01\xff\x80\x00\x01\x05Magic\x01\x06\x00\x00\x00\t\x7f\x05\x01\x02\xff\x82\x00\x00\x00\x0f\xff\x84\x01\x03etc\x01\xfb\x01\x81\xda\x00\x00\x00",
|
",\xff\x83\x03\x01\x01\x06sCheck\x01\xff\x84\x00\x01\x02\x01\bPathname\x01\xff\x80\x00\x01\x05Magic\x01\x06\x00\x00\x00\t\x7f\x05\x01\x02\xff\x82\x00\x00\x00\x0f\xff\x84\x01\x03etc\x01\xfb\x01\x81\xda\x00\x00\x00",
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ func messageFromError(err error) (m string, ok bool) {
|
|||||||
if m, ok = messagePrefixP[os.PathError]("cannot ", err); ok {
|
if m, ok = messagePrefixP[os.PathError]("cannot ", err); ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if m, ok = messagePrefixP[check.AbsoluteError](zeroString, err); ok {
|
if m, ok = messagePrefix[check.AbsoluteError](zeroString, err); ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if m, ok = messagePrefix[OpRepeatError](zeroString, err); ok {
|
if m, ok = messagePrefix[OpRepeatError](zeroString, err); ok {
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ func TestMessageFromError(t *testing.T) {
|
|||||||
Err: stub.UniqueError(0xdeadbeef),
|
Err: stub.UniqueError(0xdeadbeef),
|
||||||
}, "cannot mount /sysroot: unique error 3735928559 injected by the test suite", true},
|
}, "cannot mount /sysroot: unique error 3735928559 injected by the test suite", true},
|
||||||
|
|
||||||
{"absolute", &check.AbsoluteError{Pathname: "etc/mtab"},
|
{"absolute", check.AbsoluteError("etc/mtab"),
|
||||||
`path "etc/mtab" is not absolute`, true},
|
`path "etc/mtab" is not absolute`, true},
|
||||||
|
|
||||||
{"repeat", OpRepeatError("autoetc"),
|
{"repeat", OpRepeatError("autoetc"),
|
||||||
|
|||||||
@@ -312,7 +312,10 @@ func TestMountOverlayOp(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}},
|
}},
|
||||||
|
|
||||||
{"ephemeral", new(Ops).OverlayEphemeral(check.MustAbs("/nix/store"), check.MustAbs("/mnt-root/nix/.ro-store")), Ops{
|
{"ephemeral", new(Ops).OverlayEphemeral(
|
||||||
|
check.MustAbs("/nix/store"),
|
||||||
|
check.MustAbs("/mnt-root/nix/.ro-store"),
|
||||||
|
), Ops{
|
||||||
&MountOverlayOp{
|
&MountOverlayOp{
|
||||||
Target: check.MustAbs("/nix/store"),
|
Target: check.MustAbs("/nix/store"),
|
||||||
Lower: []*check.Absolute{check.MustAbs("/mnt-root/nix/.ro-store")},
|
Lower: []*check.Absolute{check.MustAbs("/mnt-root/nix/.ro-store")},
|
||||||
@@ -320,7 +323,10 @@ func TestMountOverlayOp(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}},
|
}},
|
||||||
|
|
||||||
{"readonly", new(Ops).OverlayReadonly(check.MustAbs("/nix/store"), check.MustAbs("/mnt-root/nix/.ro-store")), Ops{
|
{"readonly", new(Ops).OverlayReadonly(
|
||||||
|
check.MustAbs("/nix/store"),
|
||||||
|
check.MustAbs("/mnt-root/nix/.ro-store"),
|
||||||
|
), Ops{
|
||||||
&MountOverlayOp{
|
&MountOverlayOp{
|
||||||
Target: check.MustAbs("/nix/store"),
|
Target: check.MustAbs("/nix/store"),
|
||||||
Lower: []*check.Absolute{check.MustAbs("/mnt-root/nix/.ro-store")},
|
Lower: []*check.Absolute{check.MustAbs("/mnt-root/nix/.ro-store")},
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ func (l *SymlinkOp) Valid() bool { return l != nil && l.Target != nil && l.LinkN
|
|||||||
func (l *SymlinkOp) early(_ *setupState, k syscallDispatcher) error {
|
func (l *SymlinkOp) early(_ *setupState, k syscallDispatcher) error {
|
||||||
if l.Dereference {
|
if l.Dereference {
|
||||||
if !path.IsAbs(l.LinkName) {
|
if !path.IsAbs(l.LinkName) {
|
||||||
return &check.AbsoluteError{Pathname: l.LinkName}
|
return check.AbsoluteError(l.LinkName)
|
||||||
}
|
}
|
||||||
if name, err := k.readlink(l.LinkName); err != nil {
|
if name, err := k.readlink(l.LinkName); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ func TestSymlinkOp(t *testing.T) {
|
|||||||
Target: check.MustAbs("/etc/mtab"),
|
Target: check.MustAbs("/etc/mtab"),
|
||||||
LinkName: "etc/mtab",
|
LinkName: "etc/mtab",
|
||||||
Dereference: true,
|
Dereference: true,
|
||||||
}, nil, &check.AbsoluteError{Pathname: "etc/mtab"}, nil, nil},
|
}, nil, check.AbsoluteError("etc/mtab"), nil, nil},
|
||||||
|
|
||||||
{"readlink", &Params{ParentPerm: 0755}, &SymlinkOp{
|
{"readlink", &Params{ParentPerm: 0755}, &SymlinkOp{
|
||||||
Target: check.MustAbs("/etc/mtab"),
|
Target: check.MustAbs("/etc/mtab"),
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ func TestSpPulseOp(t *testing.T) {
|
|||||||
call("lookupEnv", stub.ExpectArgs{"PULSE_COOKIE"}, "proc/nonexistent/cookie", nil),
|
call("lookupEnv", stub.ExpectArgs{"PULSE_COOKIE"}, "proc/nonexistent/cookie", nil),
|
||||||
}, nil, nil, &hst.AppError{
|
}, nil, nil, &hst.AppError{
|
||||||
Step: "locate PulseAudio cookie",
|
Step: "locate PulseAudio cookie",
|
||||||
Err: &check.AbsoluteError{Pathname: "proc/nonexistent/cookie"},
|
Err: check.AbsoluteError("proc/nonexistent/cookie"),
|
||||||
}, nil, nil, nil, nil, nil},
|
}, nil, nil, nil, nil, nil},
|
||||||
|
|
||||||
{"cookie loadFile", func(bool, bool) outcomeOp {
|
{"cookie loadFile", func(bool, bool) outcomeOp {
|
||||||
@@ -272,7 +272,7 @@ func TestDiscoverPulseCookie(t *testing.T) {
|
|||||||
call("verbose", stub.ExpectArgs{[]any{(*check.Absolute)(nil)}}, nil, nil),
|
call("verbose", stub.ExpectArgs{[]any{(*check.Absolute)(nil)}}, nil, nil),
|
||||||
}}, &hst.AppError{
|
}}, &hst.AppError{
|
||||||
Step: "locate PulseAudio cookie",
|
Step: "locate PulseAudio cookie",
|
||||||
Err: &check.AbsoluteError{Pathname: "proc/nonexistent/pulse-cookie"},
|
Err: check.AbsoluteError("proc/nonexistent/pulse-cookie"),
|
||||||
}},
|
}},
|
||||||
|
|
||||||
{"success override", fCheckPathname, stub.Expect{Calls: []stub.Call{
|
{"success override", fCheckPathname, stub.Expect{Calls: []stub.Call{
|
||||||
@@ -286,7 +286,7 @@ func TestDiscoverPulseCookie(t *testing.T) {
|
|||||||
call("verbose", stub.ExpectArgs{[]any{(*check.Absolute)(nil)}}, nil, nil),
|
call("verbose", stub.ExpectArgs{[]any{(*check.Absolute)(nil)}}, nil, nil),
|
||||||
}}, &hst.AppError{
|
}}, &hst.AppError{
|
||||||
Step: "locate PulseAudio cookie",
|
Step: "locate PulseAudio cookie",
|
||||||
Err: &check.AbsoluteError{Pathname: "proc/nonexistent/home"},
|
Err: check.AbsoluteError("proc/nonexistent/home"),
|
||||||
}},
|
}},
|
||||||
|
|
||||||
{"home stat", fCheckPathname, stub.Expect{Calls: []stub.Call{
|
{"home stat", fCheckPathname, stub.Expect{Calls: []stub.Call{
|
||||||
@@ -321,7 +321,7 @@ func TestDiscoverPulseCookie(t *testing.T) {
|
|||||||
call("verbose", stub.ExpectArgs{[]any{(*check.Absolute)(nil)}}, nil, nil),
|
call("verbose", stub.ExpectArgs{[]any{(*check.Absolute)(nil)}}, nil, nil),
|
||||||
}}, &hst.AppError{
|
}}, &hst.AppError{
|
||||||
Step: "locate PulseAudio cookie",
|
Step: "locate PulseAudio cookie",
|
||||||
Err: &check.AbsoluteError{Pathname: "proc/nonexistent/xdg"},
|
Err: check.AbsoluteError("proc/nonexistent/xdg"),
|
||||||
}},
|
}},
|
||||||
|
|
||||||
{"xdg stat", fCheckPathname, stub.Expect{Calls: []stub.Call{
|
{"xdg stat", fCheckPathname, stub.Expect{Calls: []stub.Call{
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ libzstd.so.1 = /usr/lib/libzstd.so.1 (0x7ff71bfd2000)
|
|||||||
|
|
||||||
{"path not absolute", `
|
{"path not absolute", `
|
||||||
libzstd.so.1 => usr/lib/libzstd.so.1 (0x7ff71bfd2000)
|
libzstd.so.1 => usr/lib/libzstd.so.1 (0x7ff71bfd2000)
|
||||||
`, &check.AbsoluteError{Pathname: "usr/lib/libzstd.so.1"}},
|
`, check.AbsoluteError("usr/lib/libzstd.so.1")},
|
||||||
|
|
||||||
{"unexpected segments", `
|
{"unexpected segments", `
|
||||||
meow libzstd.so.1 => /usr/lib/libzstd.so.1 (0x7ff71bfd2000)
|
meow libzstd.so.1 => /usr/lib/libzstd.so.1 (0x7ff71bfd2000)
|
||||||
|
|||||||
Reference in New Issue
Block a user