commit bbff3407dd17b80df84dd11241058b48e1efb716
parent 5b3cb421842fa249ad054032c37339ebbeaa20e5
Author: Tomas Nemec <owl@gtms.dev>
Date: Thu, 13 Apr 2023 23:10:26 +0200
feat(remove)
Diffstat:
M | command.go | | | 72 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- |
M | repository.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 {