mirror of https://github.com/Marcusk19/dotctl
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
2.6 KiB
Go
125 lines
2.6 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/Marcusk19/dotctl/tools"
|
|
"github.com/manifoldco/promptui"
|
|
"github.com/spf13/afero"
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
func init() {
|
|
addCommand.Flags().BoolVar(&absolutePath, "absolute", false, "absolute path of config")
|
|
RootCmd.AddCommand(addCommand)
|
|
}
|
|
|
|
var addCommand = &cobra.Command{
|
|
Use: "add",
|
|
Short: "Adds config to be tracked by dotctl",
|
|
Long: "will copy files passed as argument to the dotfiles directory and symlink them", // TODO add more description
|
|
Run: runAddCommand,
|
|
}
|
|
|
|
var absolutePath bool
|
|
|
|
func runAddCommand(cmd *cobra.Command, args []string) {
|
|
fs := FileSystem
|
|
|
|
testing := viper.GetBool("testing")
|
|
|
|
if len(args) <= 0 {
|
|
fmt.Println("ERROR: requires config path")
|
|
return
|
|
}
|
|
|
|
configSrc := args[0]
|
|
|
|
if !absolutePath {
|
|
cwd, _ := os.Getwd()
|
|
configSrc = cwd + "/" + configSrc
|
|
}
|
|
|
|
dirs := strings.Split(configSrc, "/")
|
|
name := dirs[len(dirs)-1] // take the last section of the path, this should be the name
|
|
if name[0] == '.' {
|
|
name = name[1:]
|
|
}
|
|
|
|
links := viper.GetStringMap("links")
|
|
links[name] = configSrc
|
|
viper.Set("links", links)
|
|
|
|
dotfilePath := viper.Get("dotfile-path").(string)
|
|
|
|
dotfileDest := filepath.Join(dotfilePath, name)
|
|
|
|
if DryRun {
|
|
fmt.Printf("Will copy %s -> %s \n", configSrc, dotfileDest)
|
|
return
|
|
}
|
|
|
|
_, err := fs.Stat(dotfileDest)
|
|
if err == nil {
|
|
fmt.Printf("Looks like %s exists in current dotfile directory\n", dotfileDest)
|
|
fmt.Printf("Do you want to overwrite it with what is in %s?\n", configSrc)
|
|
confirm := promptui.Prompt{
|
|
Label: "overwrite config",
|
|
IsConfirm: true,
|
|
}
|
|
overwrite, _ := confirm.Run()
|
|
if strings.ToUpper(overwrite) == "Y" {
|
|
addConfigToDir(fs, configSrc, dotfileDest)
|
|
}
|
|
} else {
|
|
addConfigToDir(fs, configSrc, dotfileDest)
|
|
}
|
|
|
|
if !DryRun {
|
|
// symlink the copied dotfile destination back to the config src
|
|
fs.RemoveAll(configSrc)
|
|
linkPaths(dotfileDest, configSrc)
|
|
} else {
|
|
fmt.Println("Files were not symlinked")
|
|
}
|
|
|
|
if !testing {
|
|
// write to the config to persist changes
|
|
err := viper.WriteConfig()
|
|
if err != nil {
|
|
fmt.Printf("Problem updating dotctl config %s", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func addConfigToDir(fs afero.Fs, configSrc, dotfileDest string) {
|
|
configFile, err := fs.Open(configSrc)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
defer configFile.Close()
|
|
|
|
fileInfo, err := configFile.Stat()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
if fileInfo.IsDir() {
|
|
err = tools.CopyDir(fs, configSrc, dotfileDest)
|
|
} else {
|
|
err = tools.CopyFile(fs, configSrc, dotfileDest)
|
|
}
|
|
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
fmt.Printf("Copied %s -> %s\n", configSrc, dotfileDest)
|
|
}
|