From d6941958aca6d7e03ecdb7def7424a784e21a2fc Mon Sep 17 00:00:00 2001 From: Marcusk19 Date: Wed, 27 Mar 2024 22:28:11 -0400 Subject: [PATCH] renaming to dotctl --- .gitignore | 1 + Makefile | 2 +- README.md | 13 +++++----- assets/bender.png | Bin 24634 -> 0 bytes cmd/add.go | 6 ++--- cmd/backup.go | 59 -------------------------------------------- cmd/init.go | 8 +++--- cmd/link.go | 4 ++- cmd/root.go | 10 ++++---- cmd/sync.go | 6 ++--- go.mod | 2 +- main.go | 2 +- test/copy_test.go | 2 +- test/init_test.go | 16 ++++++------ test/link_test.go | 18 +++++++------- test/pretty_test.go | 12 ++++----- 16 files changed, 52 insertions(+), 109 deletions(-) delete mode 100644 assets/bender.png delete mode 100644 cmd/backup.go diff --git a/.gitignore b/.gitignore index c35431b..40e5c84 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ # # Binaries for programs and plugins bender +dotctl *.exe *.exe~ *.dll diff --git a/Makefile b/Makefile index c03d245..432aa2d 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ clean: - rm -rf test/bender_test 2> /dev/null + rm -rf test/dotctl_test 2> /dev/null rm -rf tmp 2> /dev/null sandbox: diff --git a/README.md b/README.md index 61abe57..f00e424 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ -# Bender -![](assets/bender.png) +# Dotctl A cli tool to manage your dotfiles ## About -Bender is a tool to help you easily manage your dotfiles and sync them across separate machines using +Dotctl is a tool to help you easily manage your dotfiles and sync them across separate machines using git. It aims to abstract away the manual effort of symlinking your dotfiles to config directories and updating them with git. @@ -14,11 +13,11 @@ updating them with git. ```bash # init sets up the config file and directory to hold all dotfiles -bender init --dotfile-path=/path/to/dotfile/repo -# add a config directory for bender to track -bender add /.config/nvim +dotctl init --dotfile-path=/path/to/dotfile/repo +# add a config directory for dotctl to track +dotctl add /.config/nvim # create symlinks -bender link +dotctl link ``` ## Development diff --git a/assets/bender.png b/assets/bender.png deleted file mode 100644 index bfec5952577e3f13da0a05844866a655623bdf03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24634 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 diff --git a/cmd/add.go b/cmd/add.go index 7646376..cf2866b 100644 --- a/cmd/add.go +++ b/cmd/add.go @@ -6,7 +6,7 @@ import ( "path/filepath" "strings" - "github.com/Marcusk19/bender/tools" + "github.com/Marcusk19/dotctl/tools" "github.com/spf13/cobra" "github.com/spf13/viper" ) @@ -17,7 +17,7 @@ func init() { var addCommand = &cobra.Command { Use: "add", - Short: "Adds config to be tracked by bender", + Short: "Adds config to be tracked by dotctl", Long: "TODO: add longer description", // TODO add more description Run: runAddCommand, } @@ -36,7 +36,7 @@ func runAddCommand(cmd *cobra.Command, args []string) { viper.Set(name, configSrc) err := viper.WriteConfig() if err != nil { - fmt.Printf("Problem updating bender config %s", err) + fmt.Printf("Problem updating dotctl config %s", err) } dotfilePath := viper.Get("dotfile-path").(string) diff --git a/cmd/backup.go b/cmd/backup.go deleted file mode 100644 index ccd5607..0000000 --- a/cmd/backup.go +++ /dev/null @@ -1,59 +0,0 @@ -package cmd - -import ( - "fmt" - "log" - "time" - - "github.com/Marcusk19/bender/tools" - "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing/object" - "github.com/spf13/cobra" -) - -func init() { - RootCmd.AddCommand(backupCommand) -} - -var backupCommand = &cobra.Command { - Use: "backup", - Short: "Add and commit files in dotfiles directory", - Run: runBackup, -} - - -func runBackup(cmd *cobra.Command, args []string) { - fmt.Fprintf(cmd.OutOrStdout(), "Backing up %s...\n", DotfilePath) - r, err := git.PlainOpen(DotfilePath) - if err != nil { - log.Fatal(err) - } - - worktree, err := r.Worktree() - if err != nil { - log.Fatal(err) - } - gitAddFiles(worktree, tools.AppFs) - - commitMessage := "backup " + time.Now().String() - - commit, err := worktree.Commit(commitMessage, &git.CommitOptions{ - Author: &object.Signature{ - Name: "bender CLI", - Email: "example@example.com", - When: time.Now(), - }, - }) - - if err != nil { - log.Fatal(err.Error()) - } - - obj, err := r.CommitObject(commit) - - if err != nil { - log.Fatal(err) - } - - fmt.Println(obj) -} diff --git a/cmd/init.go b/cmd/init.go index 025c12d..f90195f 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -7,7 +7,7 @@ import ( "path" "path/filepath" - "github.com/Marcusk19/bender/tools" + "github.com/Marcusk19/dotctl/tools" "github.com/go-git/go-git/v5" "github.com/spf13/afero" "github.com/spf13/cobra" @@ -55,18 +55,18 @@ func runInitCommand(cmd *cobra.Command, args []string) { fs := FileSystem // if user has passed a dotfile path flag need to add it to // viper's search path for a config file - viper.AddConfigPath(filepath.Join(DotfilePath, "bender")) + viper.AddConfigPath(filepath.Join(DotfilePath, "dotctl")) if(viper.Get("testing") == true && fs.Name() != "MemMapFS") { log.Fatalf("wrong filesystem, got %s", fs.Name()) } - err := fs.MkdirAll(path.Join(DotfilePath, "bender"), 0755) + err := fs.MkdirAll(path.Join(DotfilePath, "dotctl"), 0755) if err != nil { log.Fatalf("Unable to create dotfile structure: %s", error.Error(err)) } - _, err = fs.Create(path.Join(DotfilePath, "bender/config")) + _, err = fs.Create(path.Join(DotfilePath, "dotctl/config")) if err != nil { panic(fmt.Errorf("Unable to create config file %w", err)) } diff --git a/cmd/link.go b/cmd/link.go index b233d78..3ac3a6b 100644 --- a/cmd/link.go +++ b/cmd/link.go @@ -13,6 +13,8 @@ import ( var linkCommand = &cobra.Command { Use: "link", Run: runLinkCommand, + Short: "generate symlinks according to config", + Long: "add longer description", // TODO add longer description here } func init() { @@ -29,7 +31,7 @@ func runLinkCommand(cmd *cobra.Command, args []string) { } for _, entry := range(entries) { configName := entry.Name() - if configName == ".git" || configName == "bender" { + if configName == ".git" || configName == "dotctl" { continue } dotPath := filepath.Join(dotfileRoot, entry.Name()) diff --git a/cmd/root.go b/cmd/root.go index 71dd675..98ae152 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -15,9 +15,9 @@ import ( var RootCmd = &cobra.Command{ - Use: "bender", + Use: "dotctl", Short: "dotfile management", - Long: `Bender is a CLI tool for syncing your + Long: `Dotctl is a CLI tool for syncing your dotfiles. It provides an opiniated way to symlink a dotfile directory to various config directories.`, } @@ -66,13 +66,13 @@ func init() { viper.SetConfigName("config") viper.SetConfigType("yaml") - viper.AddConfigPath("./tmp/dotfiles/bender") - viper.AddConfigPath(filepath.Join(DotfilePath, "bender")) + viper.AddConfigPath("./tmp/dotfiles/dotctl") + viper.AddConfigPath(filepath.Join(DotfilePath, "dotctl")) err := viper.ReadInConfig() if err != nil { - fmt.Println("No config detected. You can generate one by using 'bender init'") + fmt.Println("No config detected. You can generate one by using 'dotctl init'") } FileSystem = UseFilesystem() diff --git a/cmd/sync.go b/cmd/sync.go index 86e4e49..148f5df 100644 --- a/cmd/sync.go +++ b/cmd/sync.go @@ -28,7 +28,7 @@ func init() { "URL of remote repository", ) - viper.BindPFlag("bender-origin", syncCommand.Flags().Lookup("remote")) + viper.BindPFlag("dotctl-origin", syncCommand.Flags().Lookup("remote")) } var syncCommand = &cobra.Command{ @@ -62,7 +62,7 @@ func gitAddFiles(worktree *git.Worktree, fs afero.Fs) error { } func runSyncCommand(cmd *cobra.Command, args []string) { - origin := viper.GetString("bender-origin") + origin := viper.GetString("dotctl-origin") if origin == "" { fmt.Fprintln(cmd.OutOrStdout(), "No remote repository found") return @@ -126,7 +126,7 @@ func runSyncCommand(cmd *cobra.Command, args []string) { commit, err := w.Commit(commitMessage, &git.CommitOptions{ Author: &object.Signature{ - Name: "bender CLI", + Name: "dotctl CLI", Email: "example@example.com", When: time.Now(), }, diff --git a/go.mod b/go.mod index dfbc84f..960d32a 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/Marcusk19/bender +module github.com/Marcusk19/dotctl go 1.21.0 diff --git a/main.go b/main.go index 8848a15..aa36dcd 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,7 @@ Copyright © 2024 NAME HERE */ package main -import "github.com/Marcusk19/bender/cmd" +import "github.com/Marcusk19/dotctl/cmd" func main() { cmd.Execute() diff --git a/test/copy_test.go b/test/copy_test.go index 083b1a6..4ae4f95 100644 --- a/test/copy_test.go +++ b/test/copy_test.go @@ -4,7 +4,7 @@ import ( "os" "testing" - "github.com/Marcusk19/bender/tools" + "github.com/Marcusk19/dotctl/tools" "github.com/spf13/afero" ) diff --git a/test/init_test.go b/test/init_test.go index 736fe07..96f7fce 100644 --- a/test/init_test.go +++ b/test/init_test.go @@ -5,7 +5,7 @@ import ( "path/filepath" "testing" - "github.com/Marcusk19/bender/cmd" + "github.com/Marcusk19/dotctl/cmd" "github.com/spf13/afero" "github.com/spf13/viper" ) @@ -15,18 +15,18 @@ func TestInitCommand(t *testing.T) { fs := cmd.FileSystem - bender := cmd.RootCmd + dotctl := cmd.RootCmd actual := new(bytes.Buffer) - bender.SetOut(actual) - bender.SetErr(actual) - bender.SetArgs([]string{"init", "--dotfile-path=bender_test/dotfiles"}) + dotctl.SetOut(actual) + dotctl.SetErr(actual) + dotctl.SetArgs([]string{"init", "--dotfile-path=dotctl_test/dotfiles"}) - bender.Execute() + dotctl.Execute() - homedir := "bender_test/" + homedir := "dotctl_test/" - _, err := afero.ReadFile(fs, filepath.Join(homedir, "dotfiles/bender/config")) + _, err := afero.ReadFile(fs, filepath.Join(homedir, "dotfiles/dotctl/config")) if err != nil { t.Error(err.Error()) } diff --git a/test/link_test.go b/test/link_test.go index d04a5c9..0fea3ac 100644 --- a/test/link_test.go +++ b/test/link_test.go @@ -7,7 +7,7 @@ import ( "path/filepath" "testing" - "github.com/Marcusk19/bender/cmd" + "github.com/Marcusk19/dotctl/cmd" "github.com/spf13/viper" "github.com/stretchr/testify/assert" ) @@ -15,14 +15,14 @@ import ( func TestLinkCommand(t *testing.T) { setUpTesting() - bender := cmd.RootCmd + dotctl := cmd.RootCmd actual := new(bytes.Buffer) - bender.SetOut(actual) - bender.SetErr(actual) - bender.SetArgs([]string{"link"}) + dotctl.SetOut(actual) + dotctl.SetErr(actual) + dotctl.SetArgs([]string{"link"}) - bender.Execute() + dotctl.Execute() homedir := os.Getenv("HOME") someconfig := filepath.Join(homedir, ".config/someconfig/") @@ -38,8 +38,8 @@ func TestLinkCommand(t *testing.T) { func setUpTesting() { fs := cmd.FileSystem homedir := os.Getenv("HOME") - fs.MkdirAll(filepath.Join(homedir, ".dotfiles/bender"), 0755) - fs.Create(filepath.Join(homedir, ".dotfiles/bender/config")) + fs.MkdirAll(filepath.Join(homedir, ".dotfiles/dotctl"), 0755) + fs.Create(filepath.Join(homedir, ".dotfiles/dotctl/config")) fs.MkdirAll(filepath.Join(homedir, ".dotfiles/someconfig/"), 0755) viper.Set("dotfile-path", filepath.Join(homedir, ".dotfiles")) @@ -50,5 +50,5 @@ func setUpTesting() { func tearDownTesting() { fs := cmd.FileSystem - fs.RemoveAll("bender_test/") + fs.RemoveAll("dotctl_test/") } diff --git a/test/pretty_test.go b/test/pretty_test.go index 99604e2..e89c7bf 100644 --- a/test/pretty_test.go +++ b/test/pretty_test.go @@ -4,17 +4,17 @@ import ( "bytes" "testing" - "github.com/Marcusk19/bender/cmd" + "github.com/Marcusk19/dotctl/cmd" "github.com/stretchr/testify/assert" ) func TestPrettyCommand(t *testing.T) { - bender := cmd.RootCmd + dotctl := cmd.RootCmd actual := new(bytes.Buffer) - bender.SetOut(actual) - bender.SetErr(actual) - bender.SetArgs([]string{"pretty", "fixtures/test_pretty.txt"}) - bender.Execute() + dotctl.SetOut(actual) + dotctl.SetErr(actual) + dotctl.SetArgs([]string{"pretty", "fixtures/test_pretty.txt"}) + dotctl.Execute() expected := "The end of this sentence should start a newline. \nThe next sentence should be indented below this one.\n\tHello this is the end of the text" assert.Equal(t, expected, actual.String(), "actual value differs from expected")