diff options
| author | Paul Buetow <paul@buetow.org> | 2026-07-04 23:00:04 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-07-04 23:00:04 +0300 |
| commit | 6a2796f31444b21488ab9d383292841613a1d9c7 (patch) | |
| tree | 54005b0e379d2d5b16012cec3563eccd321c9968 /internal | |
| parent | 2c4c430e6f95f9c2569a610fb7b0e8f0b6e71f28 (diff) | |
minor refactor
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/file/file.go | 41 | ||||
| -rw-r--r-- | internal/file/file_test.go | 54 |
2 files changed, 41 insertions, 54 deletions
diff --git a/internal/file/file.go b/internal/file/file.go index e6547c3..7f86d41 100644 --- a/internal/file/file.go +++ b/internal/file/file.go @@ -91,7 +91,7 @@ func IsSymlink(target string) Option { } } -func Hardlink(target string) Option { +func IsHardlink(target string) Option { return func(f *File) { f.hardlink = true f.hardlinkTarget = target @@ -104,10 +104,19 @@ func PruneDirectory() Option { } } -func Have(path string, opts ...Option) error { +func Have(path string, opts ...Option) resource.Resource { + res, err := have(path, opts...) + if err != nil { + log.Fatalf("failed to apply file resource %s: %v", path, err) + } + + return res +} + +func have(path string, opts ...Option) (resource.Resource, error) { curr, err := user.Current() if err != nil { - log.Fatalf("failed to get current user for default: %v", err) + return resource.Resource{}, fmt.Errorf("failed to get current user for default: %w", err) } f := &File{ @@ -127,34 +136,36 @@ func Have(path string, opts ...Option) error { // Apply dispatches to the concrete resource implementation based on the // options that were set. Each kind lives in its own file: // regular_file.go, directory.go and symlink.go. -func (f *File) Apply() error { +func (f *File) Apply() (resource.Resource, error) { + var res resource.Resource + switch { case f.absent: - _ = resource.Register(f.resourceType(), f.path) - return f.haveAbsent() + res = resource.Register(f.resourceType(), f.path) + return res, f.haveAbsent() case f.symlink: - _ = resource.Register("Symlink", f.path) - return f.haveSymlink() + res = resource.Register("Symlink", f.path) + return res, f.haveSymlink() case f.hardlink: - _ = resource.Register("Hardlink", f.path) - return f.haveHardlink() + res = resource.Register("Hardlink", f.path) + return res, f.haveHardlink() case f.directory: if !f.modeSet { f.mode = 0o750 } - _ = resource.Register("Directory", f.path) - return f.haveDirectory() + res = resource.Register("Directory", f.path) + return res, f.haveDirectory() default: - _ = resource.Register("File", f.path) + res = resource.Register("File", f.path) content, err := f.resolveContent() if err != nil { - return fmt.Errorf("failed to resolve content for %s: %w", f.path, err) + return res, fmt.Errorf("failed to resolve content for %s: %w", f.path, err) } - return f.haveRegularFile(content) + return res, f.haveRegularFile(content) } } diff --git a/internal/file/file_test.go b/internal/file/file_test.go index d9e09ac..a6488ce 100644 --- a/internal/file/file_test.go +++ b/internal/file/file_test.go @@ -101,9 +101,7 @@ func TestHaveStringCreateNewFile(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "new.txt") - if err := Have(path, WithContent("hello world")); err != nil { - t.Fatalf("unexpected error: %v", err) - } + Have(path, WithContent("hello world")) got, err := os.ReadFile(path) if err != nil { @@ -119,9 +117,7 @@ func TestHaveMode(t *testing.T) { path := filepath.Join(dir, "mode.txt") mode := os.FileMode(0o600) - if err := Have(path, WithContent("mode test"), WithMode(mode)); err != nil { - t.Fatalf("unexpected error: %v", err) - } + Have(path, WithContent("mode test"), WithMode(mode)) info, err := os.Stat(path) if err != nil { @@ -138,9 +134,7 @@ func TestHaveSourceFile(t *testing.T) { sourcePath := filepath.Join("..", "..", "assets", "testfiles", "test.txt") targetPath := filepath.Join(dir, "target.txt") - if err := Have(targetPath, WithSource(sourcePath)); err != nil { - t.Fatalf("unexpected error: %v", err) - } + Have(targetPath, WithSource(sourcePath)) got, err := os.ReadFile(targetPath) if err != nil { @@ -157,9 +151,7 @@ func TestHaveTemplateFile(t *testing.T) { sourcePath := filepath.Join("..", "..", "assets", "testfiles", "test.tmpl") targetPath := filepath.Join(dir, "target.conf") - if err := Have(targetPath, WithSource(sourcePath)); err != nil { - t.Fatalf("unexpected error: %v", err) - } + Have(targetPath, WithSource(sourcePath)) got, err := os.ReadFile(targetPath) if err != nil { @@ -176,9 +168,7 @@ func TestHaveDirectoryCreate(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "sub", "nested") - if err := Have(path, IsDirectory()); err != nil { - t.Fatalf("unexpected error: %v", err) - } + Have(path, IsDirectory()) info, err := os.Stat(path) if err != nil { @@ -223,7 +213,7 @@ func TestHaveDirectoryFailsWhenFileExists(t *testing.T) { t.Fatal(err) } - if err := Have(path, IsDirectory()); err == nil { + if _, err := have(path, IsDirectory()); err == nil { t.Error("expected error when a regular file is in the way of a directory") } } @@ -236,9 +226,7 @@ func TestHaveSymlinkCreateAndIdempotent(t *testing.T) { t.Fatal(err) } - if err := Have(link, IsSymlink(target)); err != nil { - t.Fatalf("create: %v", err) - } + Have(link, IsSymlink(target)) got, err := os.Readlink(link) if err != nil { t.Fatalf("readlink: %v", err) @@ -269,9 +257,7 @@ func TestHaveSymlinkRepoints(t *testing.T) { t.Fatal(err) } - if err := Have(link, IsSymlink(newT)); err != nil { - t.Fatalf("repoint: %v", err) - } + Have(link, IsSymlink(newT)) got, err := os.Readlink(link) if err != nil { t.Fatal(err) @@ -292,9 +278,7 @@ func TestHaveSymlinkMovesRealFileAside(t *testing.T) { t.Fatal(err) } - if err := Have(link, IsSymlink(target)); err != nil { - t.Fatalf("symlink over real file: %v", err) - } + Have(link, IsSymlink(target)) got, err := os.Readlink(link) if err != nil { @@ -315,9 +299,7 @@ func TestHaveAbsent(t *testing.T) { t.Fatal(err) } - if err := Have(path, IsAbsent()); err != nil { - t.Fatalf("absent: %v", err) - } + Have(path, IsAbsent()) if _, err := os.Stat(path); !os.IsNotExist(err) { t.Errorf("expected %s to be removed", path) } @@ -338,9 +320,7 @@ func TestHaveHardlinkCreateAndIdempotent(t *testing.T) { t.Fatal(err) } - if err := Have(link, Hardlink(target)); err != nil { - t.Fatalf("create: %v", err) - } + Have(link, IsHardlink(target)) ti, err := os.Stat(target) if err != nil { @@ -373,9 +353,7 @@ func TestHaveHardlinkMovesRealFileAside(t *testing.T) { t.Fatal(err) } - if err := Have(link, Hardlink(target)); err != nil { - t.Fatalf("hardlink over real file: %v", err) - } + Have(link, IsHardlink(target)) ti, err := os.Stat(target) if err != nil { @@ -396,7 +374,7 @@ func TestHaveHardlinkMovesRealFileAside(t *testing.T) { func TestHaveHardlinkMissingTarget(t *testing.T) { dir := t.TempDir() link := filepath.Join(dir, "link") - if err := Have(link, Hardlink(filepath.Join(dir, "nope"))); err == nil { + if _, err := have(link, IsHardlink(filepath.Join(dir, "nope"))); err == nil { t.Error("expected error when hardlink target does not exist") } } @@ -408,7 +386,7 @@ func TestHaveAbsentNonEmptyDirWithoutPruneFails(t *testing.T) { t.Fatal(err) } - if err := Have(target, IsAbsent()); err == nil { + if _, err := have(target, IsAbsent()); err == nil { t.Error("expected error removing a non-empty directory without PruneDirectory()") } if _, err := os.Stat(target); err != nil { @@ -426,9 +404,7 @@ func TestHaveAbsentPruneDirectoryRecursive(t *testing.T) { t.Fatal(err) } - if err := Have(target, IsAbsent(), PruneDirectory()); err != nil { - t.Fatalf("prune remove: %v", err) - } + Have(target, IsAbsent(), PruneDirectory()) if _, err := os.Stat(target); !os.IsNotExist(err) { t.Errorf("expected %s to be removed recursively", target) } |
