diff options
Diffstat (limited to 'hst/fsoverlay.go')
| -rw-r--r-- | hst/fsoverlay.go | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/hst/fsoverlay.go b/hst/fsoverlay.go index b06c1e7e..16a5e335 100644 --- a/hst/fsoverlay.go +++ b/hst/fsoverlay.go @@ -2,6 +2,7 @@ package hst import ( "encoding/gob" + "slices" "strings" "hakurei.app/check" @@ -40,7 +41,7 @@ func (o *FSOverlay) Valid() bool { } if o.Upper != nil { // rw - return o.Work != nil && len(o.Lower) > 0 + return o.Work != nil || len(o.Lower) > 0 } else { // ro return len(o.Lower) >= 2 } @@ -58,8 +59,11 @@ func (o *FSOverlay) Host() []*check.Absolute { return nil } p := make([]*check.Absolute, 0, 2+len(o.Lower)) - if o.Upper != nil && o.Work != nil { - p = append(p, o.Upper, o.Work) + if o.Upper != nil { + p = append(p, o.Upper) + if o.Work != nil { + p = append(p, o.Work) + } } p = append(p, o.Lower...) return p @@ -70,11 +74,18 @@ func (o *FSOverlay) Apply(z *ApplyState) { return } - if o.Upper != nil && o.Work != nil { - z.Overlay(o.Target, o.Upper, o.Work, o.Lower...) + if o.Upper != nil { if o.Target.Is(fhs.AbsRoot) { z.NoRemountRoot = true } + if o.Work != nil { + z.Overlay(o.Target, o.Upper, o.Work, o.Lower...) + } else { + z.OverlayEphemeral(o.Target, slices.Concat( + o.Lower, + []*check.Absolute{o.Upper})..., + ) + } } else { z.OverlayReadonly(o.Target, o.Lower...) } @@ -90,12 +101,19 @@ func (o *FSOverlay) String() string { lower[i] = check.EscapeOverlayDataSegment(a.String()) } - if o.Upper != nil && o.Work != nil { - return "w*" + strings.Join(append([]string{ + if o.Upper != nil { + if o.Work != nil { + return "w*" + strings.Join(append([]string{ + check.EscapeOverlayDataSegment(o.Target.String()), + check.EscapeOverlayDataSegment(o.Upper.String()), + check.EscapeOverlayDataSegment(o.Work.String())}, + lower...), check.SpecialOverlayPath) + } + return "e*" + strings.Join(append([]string{ check.EscapeOverlayDataSegment(o.Target.String()), - check.EscapeOverlayDataSegment(o.Upper.String()), - check.EscapeOverlayDataSegment(o.Work.String())}, + check.EscapeOverlayDataSegment(o.Upper.String())}, lower...), check.SpecialOverlayPath) + } else { return "*" + strings.Join(append([]string{ check.EscapeOverlayDataSegment(o.Target.String())}, |
