All checks were successful
Test / Create distribution (push) Successful in 35s
Test / Sandbox (push) Successful in 2m7s
Test / Hakurei (push) Successful in 3m14s
Test / Hpkg (push) Successful in 4m1s
Test / Sandbox (race detector) (push) Successful in 4m29s
Test / Hakurei (race detector) (push) Successful in 5m9s
Test / Flake checks (push) Successful in 1m25s
This shortens the representation of most common use cases and generally improves readability. Signed-off-by: Ophestra <cat@gensokyo.uk>
62 lines
1.2 KiB
Go
62 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>"
|
|
}
|
|
|
|
var dereference string
|
|
if l.Dereference {
|
|
if l.Target.String() == l.Linkname {
|
|
return l.Target.String() + "@"
|
|
}
|
|
dereference = "*"
|
|
}
|
|
return l.Target.String() + " -> " + dereference + l.Linkname
|
|
}
|