diff --git a/data/data.json b/data/data.json index b333175..e668bef 100644 --- a/data/data.json +++ b/data/data.json @@ -3,7 +3,7 @@ "nvim": { "paths": [ { - "internal": "config/nvim/init.vim", + "internal": "data/nvim/init.vim", "external": "~/.config/nvim/init.vim" } ] diff --git a/go.mod b/go.mod index 70be108..0413cff 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.16 require ( github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect github.com/haunt98/color v0.1.0 - github.com/haunt98/copy-go v0.5.0 + github.com/haunt98/copy-go v0.7.0 github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/urfave/cli/v2 v2.3.0 golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 // indirect diff --git a/go.sum b/go.sum index 2795f68..e46a45e 100644 --- a/go.sum +++ b/go.sum @@ -6,12 +6,14 @@ github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/haunt98/color v0.1.0 h1:qfP5oNI3aoUC8T+bH/JNVAg79ljyhTGpgfqSKWhkiQQ= github.com/haunt98/color v0.1.0/go.mod h1:V4BPVUSuiOItuVZHRHUTkpxO7OYQiP0DSgIWMpC/2qs= -github.com/haunt98/copy-go v0.5.0 h1:8yy7Dx47BBtlHIFIXxcCIECZRoQB/JSgLN9yunqtLAQ= -github.com/haunt98/copy-go v0.5.0/go.mod h1:cK1mRlW7QXPHhe5YI1VtL/U4OjUbRLAtZnO/oucrwRI= +github.com/haunt98/copy-go v0.7.0 h1:rmEGI3KEmtjPPDd97bPW3IsAXMfLXQoetk8I83Rf37U= +github.com/haunt98/copy-go v0.7.0/go.mod h1:6t+cjKYf8mjMrEV+iHhNlLrqRWbiDehm4jsRBeqg+3A= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= diff --git a/pkg/cli/action.go b/pkg/cli/action.go index cc58926..08417ec 100644 --- a/pkg/cli/action.go +++ b/pkg/cli/action.go @@ -68,6 +68,22 @@ func (a *action) RunClean(c *cli.Context) error { return nil } +func (a *action) RunCompare(c *cli.Context) error { + a.getFlags(c) + a.log("start %s\n", compareCommand) + + cfg, err := a.loadConfig() + if err != nil { + return err + } + + if err := cfg.Compare(); err != nil { + return fmt.Errorf("failed to compare config: %w", err) + } + + return nil +} + func (a *action) loadConfig() (config.Config, error) { cfgReal, cfgDemo, err := config.LoadConfig(currentDir) if err != nil { diff --git a/pkg/cli/app.go b/pkg/cli/app.go index 0fe5c1b..55201c8 100644 --- a/pkg/cli/app.go +++ b/pkg/cli/app.go @@ -21,22 +21,27 @@ const ( installCommand = "install" updateCommand = "update" cleanCommand = "clean" + compareCommand = "compare" - // usages + // flag usages verboseUsage = "show what is going on" dryRunUsage = "demo mode without actually changing anything" + + // command usages installUsage = "install user configs from dotfiles" updateUsage = "update dotfiles from user configs" cleanUsage = "clean unused dotfiles" + compareUsage = "compare dotfiles with user configs" currentDir = "." ) var ( - // aliases + // command aliases installAliases = []string{"i"} updateAliases = []string{"u"} cleanAliases = []string{"c"} + compareAliases = []string{"cmp"} ) // denyOSes contains OS which is not supported @@ -104,6 +109,18 @@ func NewApp() *App { }, Action: a.RunClean, }, + { + Name: compareCommand, + Aliases: compareAliases, + Usage: compareUsage, + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: verboseFlag, + Usage: verboseUsage, + }, + }, + Action: a.RunCompare, + }, }, Action: a.RunHelp, } diff --git a/pkg/config/config.go b/pkg/config/config.go index 4412123..0088ec5 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -4,4 +4,5 @@ type Config interface { Install() error Update() error Clean() error + Compare() error } diff --git a/pkg/config/config_demo.go b/pkg/config/config_demo.go index 74d11bd..30c1989 100644 --- a/pkg/config/config_demo.go +++ b/pkg/config/config_demo.go @@ -40,3 +40,7 @@ func (cd *configDemo) Clean() error { return nil } + +func (cd *configDemo) Compare() error { + return nil +} diff --git a/pkg/config/config_real.go b/pkg/config/config_real.go index 80af36e..6fc9c2a 100644 --- a/pkg/config/config_real.go +++ b/pkg/config/config_real.go @@ -107,6 +107,18 @@ func (c *config) Clean() error { return nil } +func (c *config) Compare() error { + for _, app := range c.Apps { + for _, p := range app.Paths { + if err := copy.Compare(p.Internal, p.External); err != nil { + return fmt.Errorf("failed to compare %s with %s: %w", p.Internal, p.External, err) + } + } + } + + return nil +} + func getConfigPath(path string) string { return filepath.Join(path, configDirPath, configFile) }