tme

Toggl like Time Manager
git clone git://gtms.dev:tme
Log | Files | Refs

commit bbff3407dd17b80df84dd11241058b48e1efb716
parent 5b3cb421842fa249ad054032c37339ebbeaa20e5
Author: Tomas Nemec <owl@gtms.dev>
Date:   Thu, 13 Apr 2023 23:10:26 +0200

feat(remove)

Diffstat:
Mcommand.go | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
Mrepository.go | 31++++++++++++++++++++++++++++++-
2 files changed, 94 insertions(+), 9 deletions(-)

diff --git a/command.go b/command.go @@ -316,14 +316,70 @@ func (c Command) Remove() { os.Exit(1) } - // TODO(tms) 12.04.23: - // - list recursively *numbered* entried from group - // - most fresh entry be 1 - // - ask user to enter numbers - // - 1,2,3 ; 1-3 ; 1,3,5-10 ; 1: (1 to end) ; :10 (start to ten) ; - // - print entries to remove - // - wait for user to confirm y/n - // - remove + groupArg, _ := c.nextArg() + if group := NewGroup(groupArg); !c.repository.Exists(group) { + fmt.Fprintln(os.Stderr, "group does not exists") + os.Exit(1) + } + + // TODO: most fresh entry be 1 + groups, err := c.repository.ListGroups(groupArg) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + type groupEntry struct { + group *Group + entry *Entry + } + + gEntries := make(map[int]groupEntry) + + counter := 1 + for _, group := range groups { + entries, err := c.repository.ListEntries(group, c.timeContext) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + + for _, entry := range entries { + gEntries[counter] = groupEntry{ + &group, + &entry, + } + fmt.Printf("%d. %s\n", counter, sFormatEntry(group, entry)) + counter = counter + 1 + } + } + + // TODO: format be 1,2,3 ; 1-3 ; 1,3,5-10 ; 1: (1 to end) ; :10 (start to ten) ; + var number int + _, err = fmt.Scanln(&number) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + ge := gEntries[number] + fmt.Printf("\n%s\n\nConfirm removal (y/n):", sFormatEntry(*ge.group, *ge.entry)) + + var answer string + _, err = fmt.Scanln(&answer) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + if strings.ToLower(answer) == "y" { + err = c.repository.Remove(*ge.group, *ge.entry) + if err != nil { + fmt.Print(err) + os.Exit(1) + } + } + } func (c Command) Move() { diff --git a/repository.go b/repository.go @@ -3,6 +3,7 @@ package main import ( "errors" "fmt" + "io" "io/fs" "os" "path" @@ -77,7 +78,35 @@ func (r FSRepository) EntryName(entry Entry) string { func (repo FSRepository) Remove(group Group, entry Entry) error { entryPath := path.Join(repo.rootPath, group.Name, repo.EntryName(entry)) - return os.Remove(entryPath) + err := os.Remove(entryPath) + if err != nil { + return err + } + + groupPath := path.Join(repo.rootPath, group.Name) + if empty, _ := repo.IsEmpty(groupPath); empty { + err = os.Remove(groupPath) + if err != nil { + return err + } + } + + return nil +} + +func (repo FSRepository) IsEmpty(groupPath string) (bool, error) { + f, err := os.Open(groupPath) + if err != nil { + return false, err + } + defer f.Close() + + _, err = f.Readdirnames(1) // Or f.Readdir(1) + if err == io.EOF { + return true, nil + } + + return false, err // Either not empty or error, suits both cases } func (repo FSRepository) ExistsEntry(group Group, entry Entry) bool {