diff --git a/cmd/gitw/main.go b/cmd/gitw/main.go index 6a1629c..3e5ac69 100644 --- a/cmd/gitw/main.go +++ b/cmd/gitw/main.go @@ -6,6 +6,7 @@ import ( "gitea.yves-biener.de/yves-biener/gitwarrior/internal/gitea" "gitea.yves-biener.de/yves-biener/gitwarrior/internal/gitw" + "gitea.yves-biener.de/yves-biener/gitwarrior/internal/taskwarrior" ) func main() { @@ -54,6 +55,30 @@ func main() { } } + var filter taskwarrior.Filter + filter.IncludeProjects("notes") + tasks, err := taskwarrior.GetTasks(filter) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(-1) + } + for _, task := range tasks { + fmt.Printf("%#v\n", task) + } + fmt.Println("---") + + filter.Reset() + filter.IncludeIds(1, 2, 3) + tasks, err = taskwarrior.GetTasks(filter) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(-1) + } + for _, task := range tasks { + fmt.Printf("%#v\n", task) + } + fmt.Println("---") + // necessary configurations (see config file gitw.json) // - access code for gitea // - configuration for taskwarrior settings? diff --git a/internal/taskwarrior/filter.go b/internal/taskwarrior/filter.go new file mode 100644 index 0000000..abb7e5a --- /dev/null +++ b/internal/taskwarrior/filter.go @@ -0,0 +1,35 @@ +package taskwarrior + +import "fmt" + +type Filter struct { + filter []string +} + +func (f *Filter) Reset() { + f.filter = nil +} + +func (f *Filter) IncludeProjects(projects ...string) { + for _, project := range projects { + f.filter = append(f.filter, fmt.Sprintf("project:%s", project)) + } +} + +func (f *Filter) IncludeTags(tags ...string) { + for _, tag := range tags { + f.filter = append(f.filter, fmt.Sprintf("+%s", tag)) + } +} + +func (f *Filter) ExcludeTags(tags ...string) { + for _, tag := range tags { + f.filter = append(f.filter, fmt.Sprintf("-%s", tag)) + } +} + +func (f *Filter) IncludeIds(ids ...uint) { + for _, id := range ids { + f.filter = append(f.filter, fmt.Sprintf("%d", id)) + } +} diff --git a/internal/taskwarrior/filter_test.go b/internal/taskwarrior/filter_test.go new file mode 100644 index 0000000..e5968e7 --- /dev/null +++ b/internal/taskwarrior/filter_test.go @@ -0,0 +1 @@ +package taskwarrior diff --git a/internal/taskwarrior/task.go b/internal/taskwarrior/task.go index e5968e7..3325d4e 100644 --- a/internal/taskwarrior/task.go +++ b/internal/taskwarrior/task.go @@ -1 +1,46 @@ package taskwarrior + +import ( + "bytes" + "encoding/json" + "os/exec" +) + +/// A task with an Id of 0 is either `completed` or `deleted` which is also +/// mentioned in the Status field + +type Task struct { + Id uint + Project string + Tags []string + Description string + Annotations []Annotation + Status string + Due string + Entry string + Modified string + End string + Uuid string + Urgency float32 +} + +type Annotation struct { + Description string + Entry string +} + +func GetTasks(filter Filter) ([]Task, error) { + filter.filter = append(filter.filter, "export") + cmd := exec.Command("task", filter.filter...) + out, err := cmd.Output() + if err != nil { + return nil, err + } + var tasks []Task + decoder := json.NewDecoder(bytes.NewBuffer(out)) + decoder.DisallowUnknownFields() + if err = decoder.Decode(&tasks); err != nil { + return nil, err + } + return tasks, nil +}