diff --git a/z/constants.go b/z/constants.go index ba12d63..102cb5a 100644 --- a/z/constants.go +++ b/z/constants.go @@ -5,3 +5,15 @@ const ( FlagDebug string = "debug" ) +const ( + TFAbsTwelveHour int = 0 + TFAbsTwentyfourHour int = 1 + TFRelHourMinute int = 2 + TFRelHourFraction int = 3 +) + +const ( + FinishWithMetadata int = 0 + FinishOnlyTime int = 1 +) + diff --git a/z/finishCmd.go b/z/finishCmd.go index df3ba6f..7041199 100644 --- a/z/finishCmd.go +++ b/z/finishCmd.go @@ -1,9 +1,6 @@ package z import ( - "os" - "fmt" - "time" "github.com/spf13/cobra" ) @@ -12,89 +9,7 @@ var finishCmd = &cobra.Command{ Short: "Finish currently running activity", Long: "Finishing tracking of currently running activity.", Run: func(cmd *cobra.Command, args []string) { - user := GetCurrentUser() - - runningEntryId, err := database.GetRunningEntryId(user) - if err != nil { - fmt.Printf("%s %+v\n", CharError, err) - os.Exit(1) - } - - if runningEntryId == "" { - fmt.Printf("%s not running\n", CharFinish) - os.Exit(1) - } - - runningEntry, err := database.GetEntry(user, runningEntryId) - if err != nil { - fmt.Printf("%s %+v\n", CharError, err) - os.Exit(1) - } - - tmpEntry, err := NewEntry(runningEntry.ID, begin, finish, project, task, user) - if err != nil { - fmt.Printf("%s %+v\n", CharError, err) - os.Exit(1) - } - - if begin != "" { - runningEntry.Begin = tmpEntry.Begin - } - - if finish != "" { - runningEntry.Finish = tmpEntry.Finish - } else { - runningEntry.Finish = time.Now() - runningEntry.secondsFinish() - } - - if project != "" { - runningEntry.Project = tmpEntry.Project - } - - if task != "" { - runningEntry.Task = tmpEntry.Task - } - - if notes != "" { - runningEntry.Notes = fmt.Sprintf("%s\n%s", runningEntry.Notes, notes) - } - - if runningEntry.Task != "" { - task, err := database.GetTask(user, runningEntry.Task) - if err != nil { - fmt.Printf("%s %+v\n", CharError, err) - os.Exit(1) - } - - if task.GitRepository != "" && task.GitRepository != "-" { - stdout, stderr, err := GetGitLog(task.GitRepository, runningEntry.Begin, runningEntry.Finish) - if err != nil { - fmt.Printf("%s %+v\n", CharError, err) - os.Exit(1) - } - - if stderr == "" { - runningEntry.Notes = fmt.Sprintf("%s\n%s", runningEntry.Notes, stdout) - } else { - fmt.Printf("%s notes were not imported: %+v\n", CharError, stderr) - } - } - } - - if runningEntry.IsFinishedAfterBegan() == false { - fmt.Printf("%s %+v\n", CharError, "beginning time of tracking cannot be after finish time") - os.Exit(1) - } - - _, err = database.FinishEntry(user, runningEntry) - if err != nil { - fmt.Printf("%s %+v\n", CharError, err) - os.Exit(1) - } - - fmt.Printf(runningEntry.GetOutputForFinish()) - return + finishTask(FinishWithMetadata) }, } diff --git a/z/helpers.go b/z/helpers.go index 23ac7da..a18d2fb 100644 --- a/z/helpers.go +++ b/z/helpers.go @@ -18,14 +18,6 @@ import ( "github.com/jinzhu/now" ) - -const ( - TFAbsTwelveHour int = 0 - TFAbsTwentyfourHour int = 1 - TFRelHourMinute int = 2 - TFRelHourFraction int = 3 -) - func TimeFormats() []string { return []string{ `^\d{1,2}:\d{1,2}(am|pm)$`, // Absolute twelve hour format diff --git a/z/task.go b/z/task.go index e242c4b..d2994fa 100644 --- a/z/task.go +++ b/z/task.go @@ -3,6 +3,9 @@ package z import ( "fmt" "os" + "time" + + "github.com/spf13/viper" ) type Task struct { @@ -77,4 +80,149 @@ func listProjectsAndTasks(entries []Entry) (map[string]map[string]bool, []string return projectsAndTasks, allTasks } +func trackTask() { + user := GetCurrentUser() + + runningEntryId, err := database.GetRunningEntryId(user) + if err != nil { + fmt.Printf("%s %+v\n", CharError, err) + os.Exit(1) + } + + if runningEntryId != "" { + fmt.Printf("%s a task is already running\n", CharTrack) + os.Exit(1) + } + + if project == "" && viper.GetString("project.default") != "" { + project = viper.GetString("project.default") + } + + if project == "" && viper.GetBool("project.mandatory") { + fmt.Println("project is mandatory but missing") + os.Exit(1) + } + + if task == "" && viper.GetBool("task.mandatory") { + fmt.Println("task is mandatory but missing") + os.Exit(1) + } + + newEntry, err := NewEntry("", begin, finish, project, task, user) + if err != nil { + fmt.Printf("%s %+v\n", CharError, err) + os.Exit(1) + } + + if notes != "" { + newEntry.Notes = notes + } + + isRunning := newEntry.Finish.IsZero() + + _, err = database.AddEntry(user, newEntry, isRunning) + if err != nil { + fmt.Printf("%s %+v\n", CharError, err) + os.Exit(1) + } + + fmt.Print(newEntry.GetOutputForTrack(isRunning, false)) +} + +func finishTask(mode int) { + + user := GetCurrentUser() + + runningEntryId, err := database.GetRunningEntryId(user) + if err != nil { + fmt.Printf("%s %+v\n", CharError, err) + os.Exit(1) + } + + if runningEntryId == "" { + fmt.Printf("%s not running\n", CharFinish) + os.Exit(1) + } + + runningEntry, err := database.GetEntry(user, runningEntryId) + if err != nil { + fmt.Printf("%s %+v\n", CharError, err) + os.Exit(1) + } + + tmpEntry, err := NewEntry(runningEntry.ID, begin, finish, project, task, user) + if err != nil { + fmt.Printf("%s %+v\n", CharError, err) + os.Exit(1) + } + + if begin != "" { + runningEntry.Begin = tmpEntry.Begin + } + + if finish != "" { + runningEntry.Finish = tmpEntry.Finish + } else { + runningEntry.Finish = time.Now() + } + + if mode == FinishWithMetadata { + finishTaskMetadata(user, &runningEntry, &tmpEntry) + } + + if !runningEntry.IsFinishedAfterBegan() { + fmt.Printf("%s %+v\n", CharError, "beginning time of tracking cannot be after finish time") + os.Exit(1) + } + + _, err = database.FinishEntry(user, runningEntry) + if err != nil { + fmt.Printf("%s %+v\n", CharError, err) + os.Exit(1) + } + + fmt.Print(runningEntry.GetOutputForFinish()) +} + +func finishTaskMetadata(user string, runningEntry *Entry, tmpEntry *Entry) { + + if project != "" { + runningEntry.Project = tmpEntry.Project + } + + if task != "" { + runningEntry.Task = tmpEntry.Task + } + + if notes != "" { + runningEntry.Notes = fmt.Sprintf("%s\n%s", runningEntry.Notes, notes) + } + + if runningEntry.Task != "" { + task, err := database.GetTask(user, runningEntry.Task) + if err != nil { + fmt.Printf("%s %+v\n", CharError, err) + os.Exit(1) + } + + taskGit(&task, runningEntry) + } + +} + +func taskGit(task *Task, runningEntry *Entry) { + if task.GitRepository != "" && task.GitRepository != "-" { + stdout, stderr, err := GetGitLog(task.GitRepository, runningEntry.Begin, runningEntry.Finish) + if err != nil { + fmt.Printf("%s %+v\n", CharError, err) + os.Exit(1) + } + + if stderr == "" { + runningEntry.Notes = fmt.Sprintf("%s\n%s", runningEntry.Notes, stdout) + } else { + fmt.Printf("%s notes were not imported: %+v\n", CharError, stderr) + } + } +}