tme

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

commit 636629f1c160c3819ce8aafc7015407b8446e208
parent bbff3407dd17b80df84dd11241058b48e1efb716
Author: Tomas Nemec <owl@gtms.dev>
Date:   Fri, 14 Apr 2023 06:10:35 +0200

feat(move)

Diffstat:
Mcommand.go | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
Mrepository.go | 29+++++++++++++++++++++++++++++
2 files changed, 99 insertions(+), 30 deletions(-)

diff --git a/command.go b/command.go @@ -310,44 +310,31 @@ func (c Command) Status() { } } -func (c Command) Remove() { - if len(c.args) != 1 { - fmt.Fprintln(os.Stderr, "rm <group>") - os.Exit(1) - } - - 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) +func (c Command) selectEntry(groupPath string) (Group, Entry, error) { + groups, err := c.repository.ListGroups(groupPath) if err != nil { - fmt.Println(err) - os.Exit(1) + return Group{}, Entry{}, err } type groupEntry struct { - group *Group - entry *Entry + group Group + entry Entry } gEntries := make(map[int]groupEntry) + // TODO: most fresh entry be 1 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) + return Group{}, Entry{}, err } for _, entry := range entries { gEntries[counter] = groupEntry{ - &group, - &entry, + group, + entry, } fmt.Printf("%d. %s\n", counter, sFormatEntry(group, entry)) counter = counter + 1 @@ -358,12 +345,32 @@ func (c Command) Remove() { var number int _, err = fmt.Scanln(&number) if err != nil { - fmt.Println(err) - os.Exit(1) + return Group{}, Entry{}, err } ge := gEntries[number] - fmt.Printf("\n%s\n\nConfirm removal (y/n):", sFormatEntry(*ge.group, *ge.entry)) + return ge.group, ge.entry, nil +} + +func (c Command) Remove() { + if len(c.args) != 1 { + fmt.Fprintln(os.Stderr, "rm <group>") + os.Exit(1) + } + + groupArg, _ := c.nextArg() + if group := NewGroup(groupArg); !c.repository.Exists(group) { + fmt.Fprintln(os.Stderr, "group does not exists") + os.Exit(1) + } + + group, entry, err := c.selectEntry(groupArg) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + + fmt.Printf("\n%s\n\nConfirm removal (y/n):", sFormatEntry(group, entry)) var answer string _, err = fmt.Scanln(&answer) @@ -373,7 +380,7 @@ func (c Command) Remove() { } if strings.ToLower(answer) == "y" { - err = c.repository.Remove(*ge.group, *ge.entry) + err = c.repository.Remove(group, entry) if err != nil { fmt.Print(err) os.Exit(1) @@ -388,8 +395,41 @@ func (c Command) Move() { os.Exit(1) } - // TODO(tms) 12.04.23: - // - list (recursively?) numbered entries from <group-from> - // - ... _selection same as for removal_ ... - // - move + groupFromArg, _ := c.nextArg() + groupFrom := NewGroup(groupFromArg) + if !c.repository.Exists(groupFrom) { + fmt.Fprintf(os.Stderr, "group-from %q does not exists\n", groupFrom.Name) + os.Exit(1) + } + + groupToArg, _ := c.nextArg() + groupTo := NewGroup(groupToArg) + if !c.repository.Exists(groupTo) { + fmt.Fprintf(os.Stderr, "group-to %q does not exists\n", groupTo.Name) + os.Exit(1) + } + + group, entry, err := c.selectEntry(groupFromArg) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + + // TODO(tms) 14.04.23: format: <from> -> <to> [overwrite] + fmt.Printf("\n%s\n\nConfirm move (y/n):", sFormatEntry(group, entry)) + + var answer string + _, err = fmt.Scanln(&answer) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + + if strings.ToLower(answer) == "y" { + _, err = c.repository.Move(groupFrom, []Entry{entry}, groupTo) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + } } diff --git a/repository.go b/repository.go @@ -202,3 +202,32 @@ func (repo FSRepository) find(entryPath string, timeContext *TimeContext) (Entry return Entry{Completed: true, TimeRange: timeRange}, err } } + +func (repo FSRepository) Move(from Group, entries []Entry, to Group) (int, error) { + if !repo.Exists(from) { + return -1, errors.New("Group '" + from.Name + "' does not exist") + } + + if !repo.Exists(to) { + return -1, errors.New("Group '" + from.Name + "' does not exist") + } + + counter := 0 + for _, entry := range entries { + entryPath := path.Join(repo.rootPath, from.Name, repo.EntryName(entry)) + if !repo.ExistsEntry(from, entry) { + return counter, errors.New("Entry '" + entryPath + "' does not exist") + } + + newEntryPath := path.Join(repo.rootPath, to.Name, repo.EntryName(entry)) + + err := os.Rename(entryPath, newEntryPath) + if err != nil { + return counter, err + } + + counter = counter + 1 + } + + return counter, nil +}