diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-02-17 19:00:43 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-02-17 19:00:43 +0900 |
| commit | 90cb01b2748550228d0bc179691a19ebb996fc36 (patch) | |
| tree | 06a2e17b578312c3f0734bf4c476e3c2eb5f6908 /system/mkdir.go | |
| parent | b1e1d5627e6532ec719c761846d7f38fe93fcadd (diff) | |
system: move out of internal
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'system/mkdir.go')
| -rw-r--r-- | system/mkdir.go | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/system/mkdir.go b/system/mkdir.go new file mode 100644 index 00000000..524289e5 --- /dev/null +++ b/system/mkdir.go @@ -0,0 +1,86 @@ +package system + +import ( + "errors" + "fmt" + "os" +) + +// Ensure the existence and mode of a directory. +func (sys *I) Ensure(name string, perm os.FileMode) *I { + sys.lock.Lock() + defer sys.lock.Unlock() + + sys.ops = append(sys.ops, &Mkdir{User, name, perm, false}) + + return sys +} + +// Ephemeral ensures the temporary existence and mode of a directory through the life of et. +func (sys *I) Ephemeral(et Enablement, name string, perm os.FileMode) *I { + sys.lock.Lock() + defer sys.lock.Unlock() + + sys.ops = append(sys.ops, &Mkdir{et, name, perm, true}) + + return sys +} + +type Mkdir struct { + et Enablement + path string + perm os.FileMode + ephemeral bool +} + +func (m *Mkdir) Type() Enablement { + return m.et +} + +func (m *Mkdir) apply(sys *I) error { + sys.println("ensuring directory", m) + + // create directory + err := os.Mkdir(m.path, m.perm) + if !errors.Is(err, os.ErrExist) { + return sys.wrapErrSuffix(err, + fmt.Sprintf("cannot create directory %q:", m.path)) + } + + // directory exists, ensure mode + return sys.wrapErrSuffix(os.Chmod(m.path, m.perm), + fmt.Sprintf("cannot change mode of %q to %s:", m.path, m.perm)) +} + +func (m *Mkdir) revert(sys *I, ec *Criteria) error { + if !m.ephemeral { + // skip non-ephemeral dir and do not log anything + return nil + } + + if ec.hasType(m) { + sys.println("destroying ephemeral directory", m) + return sys.wrapErrSuffix(os.Remove(m.path), + fmt.Sprintf("cannot remove ephemeral directory %q:", m.path)) + } else { + sys.println("skipping ephemeral directory", m) + return nil + } +} + +func (m *Mkdir) Is(o Op) bool { + m0, ok := o.(*Mkdir) + return ok && m0 != nil && *m == *m0 +} + +func (m *Mkdir) Path() string { + return m.path +} + +func (m *Mkdir) String() string { + t := "Ensure" + if m.ephemeral { + t = TypeString(m.Type()) + } + return fmt.Sprintf("mode: %s type: %s path: %q", m.perm.String(), t, m.path) +} |
