Skip to content

Commit

Permalink
Merge pull request #96 from joshuaherrera/#95-check-empty-dir
Browse files Browse the repository at this point in the history
fixed issue with attempting to load data from an empty directory
  • Loading branch information
dominikbraun authored Jun 2, 2021
2 parents bf934a8 + d593076 commit 2f9b89c
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 3 deletions.
8 changes: 7 additions & 1 deletion core/record.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,13 @@ func (t *Timetrace) LoadLatestRecord() (*Record, error) {
return nil, nil
}

dir := latestDirs[len(latestDirs)-1]
dir, err := t.latestNonEmptyDir(latestDirs)
if err != nil {
if errors.Is(err, ErrAllDirectoriesEmpty) {
return nil, ErrTrackingNotStarted
}
return nil, err
}

latestRecords, err := t.fs.RecordFilepaths(dir, func(a, b string) bool {
timeA, _ := time.Parse(recordLayout, a)
Expand Down
39 changes: 37 additions & 2 deletions core/timetrace.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,17 @@ package core
import (
"errors"
"fmt"
"io"
"os"
"time"

"github.com/dominikbraun/timetrace/config"
)

var (
ErrNoEndTime = errors.New("no end time for last record")
ErrTrackingNotStarted = errors.New("start tracking first")
ErrNoEndTime = errors.New("no end time for last record")
ErrTrackingNotStarted = errors.New("start tracking first")
ErrAllDirectoriesEmpty = errors.New("all directories empty")
)

type Report struct {
Expand Down Expand Up @@ -205,3 +208,35 @@ func formatDuration(duration time.Duration) string {
}
return fmt.Sprintf("%dh %dmin", hours, minutes)
}

func (t *Timetrace) isDirEmpty(dir string) (bool, error) {
openedDir, err := os.Open(dir)
if err != nil {
return false, err
}
defer openedDir.Close()

// Attempt to read 1 file's name, if it fails with
// EOF, directory is empty
_, err = openedDir.Readdirnames(1)
if err == io.EOF {
return true, nil
}

return false, err
}

func (t *Timetrace) latestNonEmptyDir(dirs []string) (string, error) {
for i := len(dirs) - 1; i >= 0; i-- {
isEmpty, err := t.isDirEmpty(dirs[i])
if err != nil {
return "", err
}

if !isEmpty {
return dirs[i], nil
}
}

return "", ErrAllDirectoriesEmpty
}

0 comments on commit 2f9b89c

Please sign in to comment.