Compare commits
4 Commits
f230dae37b
...
c92a65f0b5
Author | SHA1 | Date | |
---|---|---|---|
c92a65f0b5 | |||
b54ce5fdd5 | |||
84629f7b94 | |||
aebbcfd4f1 |
@ -1,6 +1,7 @@
|
|||||||
package cli
|
package cli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/alecthomas/kong"
|
||||||
"github.com/charmbracelet/log"
|
"github.com/charmbracelet/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -8,8 +9,10 @@ var Cli = Options{}
|
|||||||
|
|
||||||
type Options struct {
|
type Options struct {
|
||||||
AllowMissingFormatter bool `default:"false" help:"Do not exit with error if a configured formatter is missing"`
|
AllowMissingFormatter bool `default:"false" help:"Do not exit with error if a configured formatter is missing"`
|
||||||
|
WorkingDirectory kong.ChangeDirFlag `default:"." short:"C" help:"Run as if treefmt was started in the specified working directory instead of the current working directory"`
|
||||||
ClearCache bool `short:"c" help:"Reset the evaluation cache. Use in case the cache is not precise enough"`
|
ClearCache bool `short:"c" help:"Reset the evaluation cache. Use in case the cache is not precise enough"`
|
||||||
ConfigFile string `type:"existingfile" default:"./treefmt.toml"`
|
ConfigFile string `type:"existingfile" default:"./treefmt.toml"`
|
||||||
|
FailOnChange bool `help:"Exit with error if any changes were made. Useful for CI"`
|
||||||
Formatters []string `help:"Specify formatters to apply. Defaults to all formatters"`
|
Formatters []string `help:"Specify formatters to apply. Defaults to all formatters"`
|
||||||
TreeRoot string `type:"existingdir" default:"."`
|
TreeRoot string `type:"existingdir" default:"."`
|
||||||
Verbosity int `name:"verbose" short:"v" type:"counter" default:"0" env:"LOG_LEVEL" help:"Set the verbosity of logs e.g. -vv"`
|
Verbosity int `name:"verbose" short:"v" type:"counter" default:"0" env:"LOG_LEVEL" help:"Set the verbosity of logs e.g. -vv"`
|
||||||
|
@ -18,6 +18,8 @@ import (
|
|||||||
|
|
||||||
type Format struct{}
|
type Format struct{}
|
||||||
|
|
||||||
|
var ErrFailOnChange = errors.New("unexpected changes detected, --fail-on-change is enabled")
|
||||||
|
|
||||||
func (f *Format) Run() error {
|
func (f *Format) Run() error {
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
|
|
||||||
@ -110,8 +112,7 @@ func (f *Format) Run() error {
|
|||||||
// update cache as paths are completed
|
// update cache as paths are completed
|
||||||
eg.Go(func() error {
|
eg.Go(func() error {
|
||||||
batchSize := 1024
|
batchSize := 1024
|
||||||
batch := make([]string, batchSize)
|
batch := make([]string, 0, batchSize)
|
||||||
batch = batch[:0]
|
|
||||||
|
|
||||||
var pending, completed, changes int
|
var pending, completed, changes int
|
||||||
|
|
||||||
@ -156,6 +157,10 @@ func (f *Format) Run() error {
|
|||||||
}
|
}
|
||||||
changes += count
|
changes += count
|
||||||
|
|
||||||
|
if Cli.FailOnChange && changes != 0 {
|
||||||
|
return ErrFailOnChange
|
||||||
|
}
|
||||||
|
|
||||||
fmt.Printf("%v files changed in %v", changes, time.Now().Sub(start))
|
fmt.Printf("%v files changed in %v", changes, time.Now().Sub(start))
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
@ -179,6 +179,61 @@ func TestCache(t *testing.T) {
|
|||||||
as.Contains(string(out), "0 files changed")
|
as.Contains(string(out), "0 files changed")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestChangeWorkingDirectory(t *testing.T) {
|
||||||
|
as := require.New(t)
|
||||||
|
|
||||||
|
// capture current cwd, so we can replace it after the test is finished
|
||||||
|
cwd, err := os.Getwd()
|
||||||
|
as.NoError(err)
|
||||||
|
|
||||||
|
t.Cleanup(func() {
|
||||||
|
// return to the previous working directory
|
||||||
|
as.NoError(os.Chdir(cwd))
|
||||||
|
})
|
||||||
|
|
||||||
|
tempDir := test.TempExamples(t)
|
||||||
|
configPath := tempDir + "/treefmt.toml"
|
||||||
|
|
||||||
|
// test without any excludes
|
||||||
|
config := format.Config{
|
||||||
|
Formatters: map[string]*format.Formatter{
|
||||||
|
"echo": {
|
||||||
|
Command: "echo",
|
||||||
|
Includes: []string{"*"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
test.WriteConfig(t, configPath, config)
|
||||||
|
|
||||||
|
// by default, we look for ./treefmt.toml and use the cwd for the tree root
|
||||||
|
// 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))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFailOnChange(t *testing.T) {
|
||||||
|
as := require.New(t)
|
||||||
|
|
||||||
|
tempDir := test.TempExamples(t)
|
||||||
|
configPath := tempDir + "/echo.toml"
|
||||||
|
|
||||||
|
// test without any excludes
|
||||||
|
config := format.Config{
|
||||||
|
Formatters: map[string]*format.Formatter{
|
||||||
|
"echo": {
|
||||||
|
Command: "echo",
|
||||||
|
Includes: []string{"*"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
test.WriteConfig(t, configPath, config)
|
||||||
|
_, err := cmd(t, "--fail-on-change", "--config-file", configPath, "--tree-root", tempDir)
|
||||||
|
as.ErrorIs(err, ErrFailOnChange)
|
||||||
|
}
|
||||||
|
|
||||||
func TestBustCacheOnFormatterChange(t *testing.T) {
|
func TestBustCacheOnFormatterChange(t *testing.T) {
|
||||||
as := require.New(t)
|
as := require.New(t)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user