diff --git a/main.go b/main.go index 83e8f2b..825da4b 100644 --- a/main.go +++ b/main.go @@ -153,7 +153,8 @@ func main() { offline.ClipClearArgument() case "sync": cli.SshypSync() // TODO Remove after native sync is implemented - case "init": // TODO offline.Init(), exit after run + case "init": + cli.TempInitCli() case "tweak": // TODO offline.Tweak(), exit after run case "add": cli.HelpAdd() diff --git a/src/cli/entryList.go b/src/cli/entryList.go index 14ee68a..20e9431 100644 --- a/src/cli/entryList.go +++ b/src/cli/entryList.go @@ -88,16 +88,12 @@ func EntryListGen() { // check for errors encountered while walking directory if err != nil { - // create EntryRoot if the error is the result of it not existing on the system if os.IsNotExist(err) { - _ = os.Mkdir(offline.EntryRoot, 0700) - dirList = append(dirList, "") + fmt.Println(offline.AnsiError + "The entry directory does not exist - run \"mutn init\" to create it" + offline.AnsiReset) } else { // otherwise, print the source of the error fmt.Println(offline.AnsiError + "An unexpected error occurred while generating the entry list: " + err.Error() + offline.AnsiReset) } - // quit walking EntryRoot and return nil to allow the program to continue - return nil } // trim root path from each path before storing diff --git a/src/cli/init.go b/src/cli/init.go new file mode 100644 index 0000000..93fa6c2 --- /dev/null +++ b/src/cli/init.go @@ -0,0 +1,20 @@ +package cli + +import ( + "github.com/rwinkhart/MUTN/src/offline" + "os" + "os/exec" +) + +func TempInitCli() { + // gpgID + cmd := exec.Command("gpg", "-k") + cmd.Stdout = os.Stdout + cmd.Run() + gpgID := input("GPG key ID:") + + // textEditor + textEditor := input("Text editor (leave blank for $EDITOR, falls back to \"vi\"):") + + offline.TempInit(map[string]string{"textEditor": textEditor, "gpgID": gpgID}) +} diff --git a/src/offline/2globalsUNIX.go b/src/offline/2globalsUNIX.go index a2728ef..513f6d8 100644 --- a/src/offline/2globalsUNIX.go +++ b/src/offline/2globalsUNIX.go @@ -4,7 +4,8 @@ package offline // EntryRoot path to libmutton entry directory var EntryRoot = home + "/.local/share/libmutton" -var ConfigPath = home + "/.config/libmutton/libmutton.ini" +var ConfigDir = home + "/.config/libmutton" +var ConfigPath = ConfigDir + "/libmutton.ini" // PathSeparator defines the character used to separate directories in a path (platform-specific) const PathSeparator = "/" diff --git a/src/offline/2globalsWIN.go b/src/offline/2globalsWIN.go index dfd2460..8e15007 100644 --- a/src/offline/2globalsWIN.go +++ b/src/offline/2globalsWIN.go @@ -4,7 +4,8 @@ package offline // EntryRoot path to libmutton entry directory var EntryRoot = home + "\\AppData\\Local\\libmutton\\entries" -var ConfigPath = home + "\\AppData\\Local\\libmutton\\libmutton.ini" +var ConfigDir = home + "\\AppData\\Local\\libmutton" +var ConfigPath = ConfigDir + "\\libmutton.ini" // PathSeparator defines the character used to separate directories in a path (platform-specific) const PathSeparator = "\\" diff --git a/src/offline/init.go b/src/offline/init.go new file mode 100644 index 0000000..0d500ee --- /dev/null +++ b/src/offline/init.go @@ -0,0 +1,39 @@ +package offline + +import ( + "fmt" + "os" +) + +func TempInit(configFileMap map[string]string) { + // create EntryRoot and ConfigDir + dirInit() + + // remove existing config file + err := os.Remove(ConfigPath) + if err != nil { + // ignore error if file does not exist + if !os.IsNotExist(err) { + fmt.Println(AnsiError + "Failed to remove existing libmutton.ini:" + err.Error() + AnsiReset) + } + } + + // ensure textEditor is set + if configFileMap["textEditor"] == "" { + textEditor := os.Getenv("EDITOR") + if textEditor == "" { + textEditor = fallbackEditor + } + configFileMap["textEditor"] = textEditor + } + + // create and write config file + configFile, _ := os.OpenFile(ConfigPath, os.O_CREATE|os.O_WRONLY, 0600) + defer configFile.Close() + configFile.WriteString("[LIBMUTTON]\n") + for key, value := range configFileMap { + configFile.WriteString(key + " = " + value + "\n") + } + + os.Exit(0) +} diff --git a/src/offline/initUNIX.go b/src/offline/initUNIX.go new file mode 100644 index 0000000..32ea062 --- /dev/null +++ b/src/offline/initUNIX.go @@ -0,0 +1,26 @@ +//go:build !windows + +package offline + +import ( + "fmt" + "os" +) + +const fallbackEditor = "vi" // vi is pre-installed on most UNIX systems + +func dirInit() { + // create EntryRoot + err := os.MkdirAll(EntryRoot, 0700) + if err != nil { + fmt.Println(AnsiError + "Failed to create \"" + EntryRoot + "\":" + err.Error() + AnsiReset) + os.Exit(1) + } + + // create config directory + err = os.MkdirAll(ConfigDir, 0700) + if err != nil { + fmt.Println(AnsiError + "Failed to create \"" + ConfigDir + "\":" + err.Error() + AnsiReset) + os.Exit(1) + } +} diff --git a/src/offline/initWIN.go b/src/offline/initWIN.go new file mode 100644 index 0000000..809e60d --- /dev/null +++ b/src/offline/initWIN.go @@ -0,0 +1,19 @@ +//go:build windows + +package offline + +import ( + "fmt" + "os" +) + +const fallbackEditor = "nvim" // since there is no pre-installed CLI editor on Windows, default to the most popular one + +func dirInit() { + // create EntryRoot (includes config directory on Windows) + err := os.MkdirAll(EntryRoot, 0700) + if err != nil { + fmt.Println(AnsiError + "Failed to create \"" + EntryRoot + "\":" + err.Error() + AnsiReset) + os.Exit(1) + } +}