diff --git a/internal/cache/cache.go b/cache/cache.go similarity index 98% rename from internal/cache/cache.go rename to cache/cache.go index 2043619..eb56d15 100644 --- a/internal/cache/cache.go +++ b/cache/cache.go @@ -9,9 +9,9 @@ import ( "os" "time" - "git.numtide.com/numtide/treefmt/internal/walk" + "git.numtide.com/numtide/treefmt/format" + "git.numtide.com/numtide/treefmt/walk" - "git.numtide.com/numtide/treefmt/internal/format" "github.com/charmbracelet/log" "github.com/adrg/xdg" diff --git a/internal/cli/cli.go b/cli/cli.go similarity index 97% rename from internal/cli/cli.go rename to cli/cli.go index 4837bd5..ae7dbf2 100644 --- a/internal/cli/cli.go +++ b/cli/cli.go @@ -1,7 +1,7 @@ package cli import ( - "git.numtide.com/numtide/treefmt/internal/walk" + "git.numtide.com/numtide/treefmt/walk" "github.com/alecthomas/kong" "github.com/charmbracelet/log" ) diff --git a/internal/cli/format.go b/cli/format.go similarity index 91% rename from internal/cli/format.go rename to cli/format.go index 0fc4731..6c46096 100644 --- a/internal/cli/format.go +++ b/cli/format.go @@ -11,12 +11,10 @@ import ( "syscall" "time" - "git.numtide.com/numtide/treefmt/internal/walk" - - "git.numtide.com/numtide/treefmt/internal/config" - - "git.numtide.com/numtide/treefmt/internal/cache" - "git.numtide.com/numtide/treefmt/internal/format" + "git.numtide.com/numtide/treefmt/cache" + "git.numtide.com/numtide/treefmt/config" + format2 "git.numtide.com/numtide/treefmt/format" + "git.numtide.com/numtide/treefmt/walk" "github.com/charmbracelet/log" "golang.org/x/sync/errgroup" @@ -47,7 +45,7 @@ func (f *Format) Run() error { return fmt.Errorf("%w: failed to read config file", err) } - globalExcludes, err := format.CompileGlobs(cfg.Global.Excludes) + globalExcludes, err := format2.CompileGlobs(cfg.Global.Excludes) // create optional formatter filter set formatterSet := make(map[string]bool) @@ -68,7 +66,7 @@ func (f *Format) Run() error { } } - formatters := make(map[string]*format.Formatter) + formatters := make(map[string]*format2.Formatter) // detect broken dependencies for name, formatterCfg := range cfg.Formatters { @@ -115,8 +113,8 @@ func (f *Format) Run() error { continue } - formatter, err := format.NewFormatter(name, formatterCfg, globalExcludes) - if errors.Is(err, format.ErrCommandNotFound) && Cli.AllowMissingFormatter { + formatter, err := format2.NewFormatter(name, formatterCfg, globalExcludes) + if errors.Is(err, format2.ErrCommandNotFound) && Cli.AllowMissingFormatter { l.Debugf("formatter not found: %v", name) continue } else if err != nil { @@ -147,7 +145,7 @@ func (f *Format) Run() error { // completedCh := make(chan string, 1024) - ctx = format.SetCompletedChannel(ctx, completedCh) + ctx = format2.SetCompletedChannel(ctx, completedCh) // eg, ctx := errgroup.WithContext(ctx) diff --git a/internal/cli/format_test.go b/cli/format_test.go similarity index 84% rename from internal/cli/format_test.go rename to cli/format_test.go index 62ce5d2..4f03231 100644 --- a/internal/cli/format_test.go +++ b/cli/format_test.go @@ -8,15 +8,15 @@ import ( "path/filepath" "testing" - "git.numtide.com/numtide/treefmt/internal/config" + config2 "git.numtide.com/numtide/treefmt/config" + "git.numtide.com/numtide/treefmt/format" + "git.numtide.com/numtide/treefmt/test" - "git.numtide.com/numtide/treefmt/internal/test" "github.com/go-git/go-billy/v5/osfs" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing/cache" "github.com/go-git/go-git/v5/storage/filesystem" - "git.numtide.com/numtide/treefmt/internal/format" "github.com/stretchr/testify/require" ) @@ -26,8 +26,8 @@ func TestAllowMissingFormatter(t *testing.T) { tempDir := t.TempDir() configPath := tempDir + "/treefmt.toml" - test.WriteConfig(t, configPath, config.Config{ - Formatters: map[string]*config.Formatter{ + test.WriteConfig(t, configPath, config2.Config{ + Formatters: map[string]*config2.Formatter{ "foo-fmt": { Command: "foo-fmt", }, @@ -47,8 +47,8 @@ func TestDependencyCycle(t *testing.T) { tempDir := t.TempDir() configPath := tempDir + "/treefmt.toml" - test.WriteConfig(t, configPath, config.Config{ - Formatters: map[string]*config.Formatter{ + test.WriteConfig(t, configPath, config2.Config{ + Formatters: map[string]*config2.Formatter{ "a": {Command: "echo", Before: "b"}, "b": {Command: "echo", Before: "c"}, "c": {Command: "echo", Before: "a"}, @@ -68,8 +68,8 @@ func TestSpecifyingFormatters(t *testing.T) { tempDir := test.TempExamples(t) configPath := tempDir + "/treefmt.toml" - test.WriteConfig(t, configPath, config.Config{ - Formatters: map[string]*config.Formatter{ + test.WriteConfig(t, configPath, config2.Config{ + Formatters: map[string]*config2.Formatter{ "elm": { Command: "echo", Includes: []string{"*.elm"}, @@ -117,8 +117,8 @@ func TestIncludesAndExcludes(t *testing.T) { configPath := tempDir + "/echo.toml" // test without any excludes - cfg := config.Config{ - Formatters: map[string]*config.Formatter{ + cfg := config2.Config{ + Formatters: map[string]*config2.Formatter{ "echo": { Command: "echo", Includes: []string{"*"}, @@ -129,7 +129,7 @@ func TestIncludesAndExcludes(t *testing.T) { test.WriteConfig(t, configPath, cfg) out, err := cmd(t, "-c", "--config-file", configPath, "--tree-root", tempDir) as.NoError(err) - as.Contains(string(out), fmt.Sprintf("%d files changed", 29)) + as.Contains(string(out), fmt.Sprintf("%d files changed", 30)) // globally exclude nix files cfg.Global.Excludes = []string{"*.nix"} @@ -137,7 +137,7 @@ func TestIncludesAndExcludes(t *testing.T) { test.WriteConfig(t, configPath, cfg) out, err = cmd(t, "-c", "--config-file", configPath, "--tree-root", tempDir) as.NoError(err) - as.Contains(string(out), fmt.Sprintf("%d files changed", 28)) + as.Contains(string(out), fmt.Sprintf("%d files changed", 29)) // add haskell files to the global exclude cfg.Global.Excludes = []string{"*.nix", "*.hs"} @@ -145,7 +145,7 @@ func TestIncludesAndExcludes(t *testing.T) { test.WriteConfig(t, configPath, cfg) out, err = cmd(t, "-c", "--config-file", configPath, "--tree-root", tempDir) as.NoError(err) - as.Contains(string(out), fmt.Sprintf("%d files changed", 22)) + as.Contains(string(out), fmt.Sprintf("%d files changed", 23)) echo := cfg.Formatters["echo"] @@ -155,7 +155,7 @@ func TestIncludesAndExcludes(t *testing.T) { test.WriteConfig(t, configPath, cfg) out, err = cmd(t, "-c", "--config-file", configPath, "--tree-root", tempDir) as.NoError(err) - as.Contains(string(out), fmt.Sprintf("%d files changed", 20)) + as.Contains(string(out), fmt.Sprintf("%d files changed", 21)) // remove go files from the echo formatter echo.Excludes = []string{"*.py", "*.go"} @@ -163,7 +163,7 @@ func TestIncludesAndExcludes(t *testing.T) { test.WriteConfig(t, configPath, cfg) out, err = cmd(t, "-c", "--config-file", configPath, "--tree-root", tempDir) as.NoError(err) - as.Contains(string(out), fmt.Sprintf("%d files changed", 19)) + as.Contains(string(out), fmt.Sprintf("%d files changed", 20)) // adjust the includes for echo to only include elm files echo.Includes = []string{"*.elm"} @@ -189,8 +189,8 @@ func TestCache(t *testing.T) { configPath := tempDir + "/echo.toml" // test without any excludes - cfg := config.Config{ - Formatters: map[string]*config.Formatter{ + cfg := config2.Config{ + Formatters: map[string]*config2.Formatter{ "echo": { Command: "echo", Includes: []string{"*"}, @@ -201,11 +201,34 @@ func TestCache(t *testing.T) { test.WriteConfig(t, configPath, cfg) out, err := cmd(t, "--config-file", configPath, "--tree-root", tempDir) as.NoError(err) - as.Contains(string(out), fmt.Sprintf("%d files changed", 29)) + as.Contains(string(out), fmt.Sprintf("%d files changed", 30)) out, err = cmd(t, "--config-file", configPath, "--tree-root", tempDir) as.NoError(err) as.Contains(string(out), "0 files changed") + + // clear cache + out, err = cmd(t, "--config-file", configPath, "--tree-root", tempDir, "-c") + as.NoError(err) + as.Contains(string(out), fmt.Sprintf("%d files changed", 30)) + + out, err = cmd(t, "--config-file", configPath, "--tree-root", tempDir) + as.NoError(err) + as.Contains(string(out), "0 files changed") + + // clear cache + out, err = cmd(t, "--config-file", configPath, "--tree-root", tempDir, "-c") + as.NoError(err) + as.Contains(string(out), fmt.Sprintf("%d files changed", 30)) + + out, err = cmd(t, "--config-file", configPath, "--tree-root", tempDir) + as.NoError(err) + as.Contains(string(out), "0 files changed") + + // no cache + out, err = cmd(t, "--config-file", configPath, "--tree-root", tempDir, "--no-cache") + as.NoError(err) + as.Contains(string(out), fmt.Sprintf("%d files changed", 30)) } func TestChangeWorkingDirectory(t *testing.T) { @@ -224,8 +247,8 @@ func TestChangeWorkingDirectory(t *testing.T) { configPath := tempDir + "/treefmt.toml" // test without any excludes - cfg := config.Config{ - Formatters: map[string]*config.Formatter{ + cfg := config2.Config{ + Formatters: map[string]*config2.Formatter{ "echo": { Command: "echo", Includes: []string{"*"}, @@ -239,7 +262,7 @@ func TestChangeWorkingDirectory(t *testing.T) { // this should fail if the working directory hasn't been changed first out, err := cmd(t, "-C", tempDir) as.NoError(err) - as.Contains(string(out), fmt.Sprintf("%d files changed", 29)) + as.Contains(string(out), fmt.Sprintf("%d files changed", 30)) } func TestFailOnChange(t *testing.T) { @@ -249,8 +272,8 @@ func TestFailOnChange(t *testing.T) { configPath := tempDir + "/echo.toml" // test without any excludes - cfg := config.Config{ - Formatters: map[string]*config.Formatter{ + cfg := config2.Config{ + Formatters: map[string]*config2.Formatter{ "echo": { Command: "echo", Includes: []string{"*"}, @@ -285,8 +308,8 @@ func TestBustCacheOnFormatterChange(t *testing.T) { as.NoError(os.Setenv("PATH", binPath+":"+os.Getenv("PATH"))) // start with 2 formatters - cfg := config.Config{ - Formatters: map[string]*config.Formatter{ + cfg := config2.Config{ + Formatters: map[string]*config2.Formatter{ "python": { Command: "black", Includes: []string{"*.py"}, @@ -330,7 +353,7 @@ func TestBustCacheOnFormatterChange(t *testing.T) { as.Contains(string(out), "0 files changed") // add go formatter - cfg.Formatters["go"] = &config.Formatter{ + cfg.Formatters["go"] = &config2.Formatter{ Command: "gofmt", Options: []string{"-w"}, Includes: []string{"*.go"}, @@ -380,8 +403,8 @@ func TestGitWorktree(t *testing.T) { configPath := filepath.Join(tempDir, "/treefmt.toml") // basic config - cfg := config.Config{ - Formatters: map[string]*config.Formatter{ + cfg := config2.Config{ + Formatters: map[string]*config2.Formatter{ "echo": { Command: "echo", Includes: []string{"*"}, @@ -416,16 +439,16 @@ func TestGitWorktree(t *testing.T) { // add everything to the worktree as.NoError(wt.AddGlob(".")) as.NoError(err) - run(29) + run(30) // remove python directory as.NoError(wt.RemoveGlob("python/*")) - run(26) + run(27) // walk with filesystem instead of git out, err := cmd(t, "-c", "--config-file", configPath, "--tree-root", tempDir, "--walk", "filesystem") as.NoError(err) - as.Contains(string(out), fmt.Sprintf("%d files changed", 55)) + as.Contains(string(out), fmt.Sprintf("%d files changed", 57)) } func TestOrderingFormatters(t *testing.T) { @@ -435,8 +458,8 @@ func TestOrderingFormatters(t *testing.T) { configPath := path.Join(tempDir, "treefmt.toml") // missing child - test.WriteConfig(t, configPath, config.Config{ - Formatters: map[string]*config.Formatter{ + test.WriteConfig(t, configPath, config2.Config{ + Formatters: map[string]*config2.Formatter{ "hs-a": { Command: "echo", Includes: []string{"*.hs"}, @@ -449,8 +472,8 @@ func TestOrderingFormatters(t *testing.T) { as.ErrorContains(err, "formatter hs-a is before hs-b but config for hs-b was not found") // multiple roots - test.WriteConfig(t, configPath, config.Config{ - Formatters: map[string]*config.Formatter{ + test.WriteConfig(t, configPath, config2.Config{ + Formatters: map[string]*config2.Formatter{ "hs-a": { Command: "echo", Includes: []string{"*.hs"}, @@ -501,8 +524,8 @@ func TestPathsArg(t *testing.T) { as.NoError(os.Chdir(tempDir)) // basic config - cfg := config.Config{ - Formatters: map[string]*config.Formatter{ + cfg := config2.Config{ + Formatters: map[string]*config2.Formatter{ "echo": { Command: "echo", Includes: []string{"*"}, @@ -514,7 +537,7 @@ func TestPathsArg(t *testing.T) { // without any path args out, err := cmd(t, "-C", tempDir) as.NoError(err) - as.Contains(string(out), fmt.Sprintf("%d files changed", 29)) + as.Contains(string(out), fmt.Sprintf("%d files changed", 30)) // specify some explicit paths out, err = cmd(t, "-C", tempDir, "-c", "elm/elm.json", "haskell/Nested/Foo.hs") @@ -545,8 +568,8 @@ func TestStdIn(t *testing.T) { as.NoError(os.Chdir(tempDir)) // basic config - cfg := config.Config{ - Formatters: map[string]*config.Formatter{ + cfg := config2.Config{ + Formatters: map[string]*config2.Formatter{ "echo": { Command: "echo", Includes: []string{"*"}, diff --git a/internal/cli/helpers_test.go b/cli/helpers_test.go similarity index 96% rename from internal/cli/helpers_test.go rename to cli/helpers_test.go index 7268d23..920c757 100644 --- a/internal/cli/helpers_test.go +++ b/cli/helpers_test.go @@ -7,7 +7,8 @@ import ( "path/filepath" "testing" - "git.numtide.com/numtide/treefmt/internal/test" + "git.numtide.com/numtide/treefmt/test" + "github.com/alecthomas/kong" "github.com/stretchr/testify/require" ) diff --git a/internal/config/config.go b/config/config.go similarity index 100% rename from internal/config/config.go rename to config/config.go diff --git a/internal/config/config_test.go b/config/config_test.go similarity index 98% rename from internal/config/config_test.go rename to config/config_test.go index 611fc04..6ab6a08 100644 --- a/internal/config/config_test.go +++ b/config/config_test.go @@ -9,7 +9,7 @@ import ( func TestReadConfigFile(t *testing.T) { as := require.New(t) - cfg, err := ReadFile("../../test/treefmt.toml") + cfg, err := ReadFile("../test/examples/treefmt.toml") as.NoError(err, "failed to read config file") as.NotNil(cfg) diff --git a/internal/config/formatter.go b/config/formatter.go similarity index 100% rename from internal/config/formatter.go rename to config/formatter.go diff --git a/internal/format/context.go b/format/context.go similarity index 100% rename from internal/format/context.go rename to format/context.go diff --git a/internal/format/formatter.go b/format/formatter.go similarity index 99% rename from internal/format/formatter.go rename to format/formatter.go index a2654dd..434addf 100644 --- a/internal/format/formatter.go +++ b/format/formatter.go @@ -7,7 +7,7 @@ import ( "os/exec" "time" - "git.numtide.com/numtide/treefmt/internal/config" + "git.numtide.com/numtide/treefmt/config" "github.com/charmbracelet/log" "github.com/gobwas/glob" diff --git a/internal/format/glob.go b/format/glob.go similarity index 100% rename from internal/format/glob.go rename to format/glob.go diff --git a/main.go b/main.go index 72d162e..35a2685 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,7 @@ package main import ( - "git.numtide.com/numtide/treefmt/internal/cli" + "git.numtide.com/numtide/treefmt/cli" "github.com/alecthomas/kong" ) diff --git a/test/echo.toml b/test/examples/echo.toml similarity index 100% rename from test/echo.toml rename to test/examples/echo.toml diff --git a/test/treefmt.toml b/test/examples/treefmt.toml similarity index 100% rename from test/treefmt.toml rename to test/examples/treefmt.toml diff --git a/internal/test/temp.go b/test/temp.go similarity index 86% rename from internal/test/temp.go rename to test/temp.go index 2324d1c..dbe6f50 100644 --- a/internal/test/temp.go +++ b/test/temp.go @@ -4,7 +4,7 @@ import ( "os" "testing" - "git.numtide.com/numtide/treefmt/internal/config" + "git.numtide.com/numtide/treefmt/config" "github.com/BurntSushi/toml" cp "github.com/otiai10/copy" @@ -25,7 +25,7 @@ func WriteConfig(t *testing.T, path string, cfg config.Config) { func TempExamples(t *testing.T) string { tempDir := t.TempDir() - require.NoError(t, cp.Copy("../../test/examples", tempDir), "failed to copy test data to temp dir") + require.NoError(t, cp.Copy("../test/examples", tempDir), "failed to copy test data to temp dir") return tempDir } diff --git a/internal/walk/filesystem.go b/walk/filesystem.go similarity index 100% rename from internal/walk/filesystem.go rename to walk/filesystem.go diff --git a/internal/walk/git.go b/walk/git.go similarity index 100% rename from internal/walk/git.go rename to walk/git.go diff --git a/internal/walk/walker.go b/walk/walker.go similarity index 100% rename from internal/walk/walker.go rename to walk/walker.go