Skip to content

Commit

Permalink
Rewrite ExpandPath to utilise builtin os.UserHomeDir()
Browse files Browse the repository at this point in the history
validate string, raise err and other minor typos
  • Loading branch information
csessh committed Oct 24, 2024
1 parent 8c6671d commit e87166e
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 31 deletions.
2 changes: 1 addition & 1 deletion cmd/edit.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func edit(cmd *cobra.Command, args []string) (err error) {
}

if snippetFile == "" {
return errors.New("No sippet file seleted")
return errors.New("No snippet file seleted")
}

// file content before editing
Expand Down
9 changes: 5 additions & 4 deletions cmd/new.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,12 +166,12 @@ func createAndEditSnippet(newSnippet snippet.SnippetInfo, snippets snippet.Snipp
}

func countSnippetLines() int {
// Count lines in snippet file
if config.Conf.General.SnippetFile == "" {
filepath, err := config.ExpandPath(config.Conf.General.SnippetFile)
if err != nil {
return 0
}

f, err := os.Open(config.ExpandPath(config.Conf.General.SnippetFile))
f, err := os.Open(filepath)
if err != nil {
panic("Error reading snippet file")
}
Expand Down Expand Up @@ -223,10 +223,10 @@ func _new(in io.ReadCloser, out io.Writer, args []string) (err error) {
}

return createAndEditSnippet(newSnippet, snippets, lineCount+3)

} else {
command, err = scan(color.HiYellowString("Command> "), out, in, false)
}

if err != nil {
return err
}
Expand Down Expand Up @@ -263,6 +263,7 @@ func _new(in io.ReadCloser, out io.Writer, args []string) (err error) {
Command: command,
Tag: tags,
}

snippets.Snippets = append(snippets.Snippets, newSnippet)
if err = snippets.Save(); err != nil {
return err
Expand Down
37 changes: 29 additions & 8 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"os/exec"
"path/filepath"
"runtime"
"strings"

"github.com/pelletier/go-toml"
"github.com/pkg/errors"
Expand Down Expand Up @@ -99,6 +100,10 @@ func (cfg *Config) Load(file string) error {
}
var snippetdirs []string
for _, dir := range cfg.General.SnippetDirs {
if !strings.HasSuffix(dir, "/") {
dir = dir + "/"
}

snippetdirs = append(snippetdirs, dir) // note the = instead of :=
}
cfg.General.SnippetDirs = snippetdirs
Expand All @@ -118,9 +123,14 @@ func (cfg *Config) Load(file string) error {
if err != nil {
return errors.Wrap(err, "Failed to get the default config directory")
}

cfg.General.SnippetFile = filepath.Join(dir, "snippet.toml")
file_path, err := ExpandPath(cfg.General.SnippetFile)
if err != nil {
return errors.Wrap(err, "SnippetFile path is invalid: %v")
}

_, err = os.Create(ExpandPath(cfg.General.SnippetFile))
_, err = os.Create(file_path)
if err != nil {
return errors.Wrap(err, "Failed to create a snippet file")
}
Expand All @@ -133,6 +143,7 @@ func (cfg *Config) Load(file string) error {
cfg.General.Editor = "vim"
}
}

cfg.General.Column = 40
cfg.General.SelectCmd = "fzf --ansi --layout=reverse --border --height=90% --pointer=* --cycle --prompt=Snippets:"
cfg.General.Backend = "gist"
Expand Down Expand Up @@ -166,15 +177,25 @@ func GetDefaultConfigDir() (dir string, err error) {
return dir, nil
}

func ExpandPath(s string) string {
if len(s) >= 2 && s[0] == '~' && os.IsPathSeparator(s[1]) {
if runtime.GOOS == "windows" {
s = filepath.Join(os.Getenv("USERPROFILE"), s[2:])
} else {
s = filepath.Join(os.Getenv("HOME"), s[2:])
// Given a path to either a file or directory, returns its absolute path format.
// ExpandPath resolves "~/" prefix in a given system path.
// Raise error if path is an empty string as it
func ExpandPath(path string) (string, error) {
if path == "" {
error := errors.New("path to file/directory is not set.")
return path, error
}

if strings.HasPrefix(path, "~/") {
homedir, err := os.UserHomeDir()
if err != nil {
return path, err
}

return filepath.Join(homedir, path[2:]), nil
}
return os.Expand(s, os.Getenv)

return path, nil
}

func isCommandAvailable(name string) bool {
Expand Down
41 changes: 26 additions & 15 deletions snippet/snippet.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,8 @@ func (snippets *Snippets) Load(includeDirs bool) error {
// Create a list of snippet files to load snippets from
var snippetFiles []string

if config.Conf.General.SnippetFile != "" {
snippetFile := config.ExpandPath(config.Conf.General.SnippetFile)

snippetFile, err := config.ExpandPath(config.Conf.General.SnippetFile)
if err == nil {
if _, err := os.Stat(snippetFile); err == nil {
snippetFiles = append(snippetFiles, config.Conf.General.SnippetFile)
} else if !os.IsNotExist(err) {
Expand All @@ -47,28 +46,35 @@ if you only want to provide snippetdirs instead`,
}
}

// Optionally load snippets from snippet directories
if includeDirs {
for _, dir := range config.Conf.General.SnippetDirs {
if _, err := os.Stat(dir); err != nil {
if os.IsNotExist(err) {
return fmt.Errorf("snippet directory not found. %s", dir)
}
return fmt.Errorf("failed to load snippet directory. %v", err)
for _, snippetDir := range config.Conf.General.SnippetDirs {
dir, err := config.ExpandPath(snippetDir)
if err != nil {
return fmt.Errorf("snippet directory not found. %s", snippetDir)
}

if _, err := os.Stat(dir); err != nil {
if os.IsNotExist(err) {
return fmt.Errorf("snippet directory not found. %s", snippetDir)
}
snippetFiles = append(snippetFiles, getFiles(dir)...)
}
snippetFiles = append(snippetFiles, getFiles(config.ExpandPath(dir))...)

snippetFiles = append(snippetFiles, getFiles(dir)...)
}

// Read files and load snippets
for _, file := range snippetFiles {
tmp := Snippets{}
f, err := os.ReadFile(config.ExpandPath(file))
file_path, err := config.ExpandPath(file)
if err != nil {
return fmt.Errorf("failed to load snippet file. %v", err)
}

f, err := os.ReadFile(file_path)
if err != nil {
return fmt.Errorf("failed to load snippet file. %v", err)
}

tmp := Snippets{}
err = toml.Unmarshal(f, &tmp)
if err != nil {
return fmt.Errorf("failed to parse snippet file. %v", err)
Expand Down Expand Up @@ -99,7 +105,12 @@ func (snippets *Snippets) Save() error {
}
}

f, err := os.Create(config.ExpandPath(snippetFile))
file_path, err := config.ExpandPath(snippetFile)
if err != nil {
return fmt.Errorf("failed to save snippet file. err: %s", err)
}

f, err := os.Create(file_path)
if err != nil {
return fmt.Errorf("failed to save snippet file. err: %s", err)
}
Expand Down
12 changes: 9 additions & 3 deletions sync/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,22 +100,28 @@ func upload(client Client) (err error) {
// download downloads snippets from the remote repository
// and saves them to the main snippet file - directories ignored
func download(content string) error {
snippetFile := config.ExpandPath(config.Conf.General.SnippetFile)

var snippets snippet.Snippets
if err := snippets.Load(false); err != nil {
return err
}

body, err := snippets.ToString()
if err != nil {
return err
}

if content == body {
// no need to download
fmt.Println("Already up-to-date")
return nil
}

fmt.Println("Download success")
return os.WriteFile(snippetFile, []byte(content), os.ModePerm)

file_path, err := config.ExpandPath(config.Conf.General.SnippetFile)
if err != nil {
return err
}

return os.WriteFile(file_path, []byte(content), os.ModePerm)
}

0 comments on commit e87166e

Please sign in to comment.