hakurei/hst/fslink.go
Ophestra 26cafe3e80
All checks were successful
Test / Create distribution (push) Successful in 34s
Test / Sandbox (push) Successful in 2m16s
Test / Hpkg (push) Successful in 4m8s
Test / Sandbox (race detector) (push) Successful in 4m24s
Test / Hakurei (race detector) (push) Successful in 5m9s
Test / Hakurei (push) Successful in 2m31s
Test / Flake checks (push) Successful in 1m40s
hst/fs: implement link fstype
Symlinks do not require special treatment, and doing this allows placing links in order.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-08-25 21:57:38 +09:00

59 lines
1.2 KiB
Go

package hst
import (
"encoding/gob"
"path"
"hakurei.app/container"
)
func init() { gob.Register(new(FSLink)) }
// FilesystemLink is the type string of a symbolic link.
const FilesystemLink = "link"
// FSLink represents a symlink in the container filesystem.
type FSLink struct {
// link path in container
Target *container.Absolute `json:"dst"`
// linkname the symlink points to
Linkname string `json:"linkname"`
// whether to dereference linkname before creating the link
Dereference bool `json:"dereference,omitempty"`
}
func (l *FSLink) Valid() bool {
if l == nil || l.Target == nil || l.Linkname == "" {
return false
}
return !l.Dereference || path.IsAbs(l.Linkname)
}
func (l *FSLink) Path() *container.Absolute {
if !l.Valid() {
return nil
}
return l.Target
}
func (l *FSLink) Host() []*container.Absolute { return nil }
func (l *FSLink) Apply(z *ApplyState) {
if !l.Valid() {
return
}
z.Link(l.Target, l.Linkname, l.Dereference)
}
func (l *FSLink) String() string {
if !l.Valid() {
return "<invalid>"
}
dereference := ""
if l.Dereference {
dereference = "*"
}
return "&" + l.Target.String() + ":" + dereference + l.Linkname
}