diff --git a/README.md b/README.md index f6de3b1..172577f 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ go install # installs to $GOPATH/bin ``` 2. As a binary release -TBD +see: https://github.com/dbalan/pipet/releases ## Configuration @@ -28,6 +28,9 @@ document_dir: "" # default is ~/snippets ``` ## Usage + +[![asciicast](https://asciinema.org/a/W6tv7bN9z76EAlZJZDS025JwU.png)](https://asciinema.org/a/W6tv7bN9z76EAlZJZDS025JwU) + - pipet new : create a new snippets - pipet search : search through current snippets (only titles and tags for now) - pipet edit id : edit a snippet by id @@ -37,10 +40,10 @@ document_dir: "" # default is ~/snippets - pipet configure: TBD ## TODO - - [ ] finish configure command + - [x] finish configure command - [x] hacking docs - [x] circleci build - - [ ] binary downloads + - [x] binary downloads - [x] make public - [ ] Search full text, with a flag to search command - [ ] Try to abstract snippet id from operations. diff --git a/cmd/init.go b/cmd/init.go new file mode 100644 index 0000000..8feac78 --- /dev/null +++ b/cmd/init.go @@ -0,0 +1,93 @@ +// Copyright © 2018 Dhananjay Balan +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +package cmd + +import ( + "fmt" + + "bufio" + "github.com/fatih/color" + "github.com/spf13/cobra" + "gopkg.in/yaml.v2" + "io/ioutil" + "os" + "strings" +) + +// initCmd represents the init command +var initCmd = &cobra.Command{ + Use: "init", + Short: "Configure pipet", + Long: `Creates the config files for pipet if not present, usually you only need at the first use`, + Run: func(cmd *cobra.Command, args []string) { + green := color.New(color.FgGreen).SprintFunc() + + configFile := expandHome("~/.pipet.yaml") + _, err := os.Stat(configFile) + if err == nil { + errorGuard(fmt.Errorf("e"), "files exists: delete ~/.pipet.yaml if you want to reconfig") + } + + reader := bufio.NewReader(os.Stdin) + fmt.Printf("Where do you want to store snippets? (directory): ") + text, err := reader.ReadString('\n') + errorGuard(err, "reading failed") + + text = strings.TrimSuffix(text, "\n") + if !isValidDirectory(text) { + errorGuard(fmt.Errorf("invalid path"), "error") + } + + buf, err := yaml.Marshal(&struct { + DocDir string `yaml:"document_dir"` + }{text}) + + errorGuard(err, "failed marshalling data") + errorGuard(ioutil.WriteFile(configFile, buf, 0755), "writing file failed") + fmt.Printf(`pipet is now ready to use + snippets are stored in: %s + config is stored in %s +`, green(text), green(configFile)) + }, +} + +func init() { + rootCmd.AddCommand(initCmd) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // initCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // initCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +} diff --git a/cmd/utils.go b/cmd/utils.go index 897a412..869a0c0 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -42,11 +42,13 @@ import ( "github.com/spf13/viper" "github.com/dbalan/pipet/pipetdata" + "github.com/fatih/color" ) func errorGuard(err error, msg string) { + red := color.New(color.FgRed).SprintFunc() if err != nil { - fmt.Fprintf(os.Stderr, "%s: %v\n", msg, err) + fmt.Fprintf(os.Stderr, "%s: %v\n", red(msg), err) os.Exit(-1) } } @@ -64,6 +66,20 @@ func expandHome(p string) string { return filepath.Join(h, p[2:]) } +func isValidDirectory(p string) bool { + if strings.Contains(p, " ") { + return false + } + + fullPath := expandHome(p) + fi, err := os.Stat(fullPath) + if err == nil && !fi.IsDir() { + return false // present and is a file + } + + return true +} + func getDataStore() *pipetdata.DataStore { diskPath := viper.Get("document_dir").(string) dataStore, err := pipetdata.NewDataStore(expandHome(diskPath))