summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Bütow <1224732+snonux@users.noreply.github.com>2025-06-22 16:39:56 +0300
committerPaul Bütow <1224732+snonux@users.noreply.github.com>2025-06-22 16:39:56 +0300
commitdc1a6e83669dd22be4542833970d3251741ba1f3 (patch)
treee2585f906485e89f6d4417a5d1d3d04f9c442ce4
parente42bb79ed74cb975db0c4b8128b9014f0f6acf33 (diff)
Fix add task hotkey
-rw-r--r--go.mod1
-rw-r--r--go.sum2
-rw-r--r--internal/task/task.go23
-rw-r--r--internal/ui/table.go2
-rw-r--r--internal/ui/table_test.go4
5 files changed, 27 insertions, 5 deletions
diff --git a/go.mod b/go.mod
index 9086482..d05118a 100644
--- a/go.mod
+++ b/go.mod
@@ -16,6 +16,7 @@ require (
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
github.com/charmbracelet/x/term v0.2.1 // indirect
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
+ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-localereader v0.0.1 // indirect
diff --git a/go.sum b/go.sum
index c89ca1f..5375c80 100644
--- a/go.sum
+++ b/go.sum
@@ -22,6 +22,8 @@ github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQ
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
+github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
+github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
diff --git a/internal/task/task.go b/internal/task/task.go
index 603002d..b20eef0 100644
--- a/internal/task/task.go
+++ b/internal/task/task.go
@@ -12,6 +12,8 @@ import (
"strconv"
"strings"
"time"
+
+ "github.com/google/shlex"
)
// Task represents a taskwarrior task as returned by `task export`.
@@ -54,7 +56,7 @@ func SetDebugLog(path string) error {
// Add creates a new task with the given description and tags.
func Add(description string, tags []string) error {
- args := []string{"add"}
+ var args []string
for _, t := range tags {
if len(t) > 0 && t[0] != '+' {
t = "+" + t
@@ -62,11 +64,28 @@ func Add(description string, tags []string) error {
args = append(args, t)
}
args = append(args, description)
+ return AddArgs(args)
+}
- cmd := exec.Command("task", args...)
+// AddArgs runs "task add" with the provided arguments. Each element in args
+// is passed as a separate command-line argument, allowing the caller to
+// specify additional modifiers like due dates or tags.
+func AddArgs(args []string) error {
+ cmd := exec.Command("task", append([]string{"add"}, args...)...)
return cmd.Run()
}
+// AddLine splits the given line into shell words and runs "task add" with the
+// resulting arguments. This allows users to pass raw Taskwarrior parameters
+// such as "due:today" directly.
+func AddLine(line string) error {
+ fields, err := shlex.Split(line)
+ if err != nil {
+ return err
+ }
+ return AddArgs(fields)
+}
+
// Export retrieves all tasks using `task export rc.json.array=off` and parses
// the JSON output into a slice of Task structs.
// Export retrieves tasks using `task <filter> export rc.json.array=off` and parses
diff --git a/internal/ui/table.go b/internal/ui/table.go
index 482d89e..c3e1748 100644
--- a/internal/ui/table.go
+++ b/internal/ui/table.go
@@ -484,7 +484,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
for _, tsk := range m.tasks {
oldIDs[tsk.ID] = struct{}{}
}
- task.Add(m.addInput.Value(), nil)
+ task.AddLine(m.addInput.Value())
m.addingTask = false
m.addInput.Blur()
m.reload()
diff --git a/internal/ui/table_test.go b/internal/ui/table_test.go
index f378973..365180c 100644
--- a/internal/ui/table_test.go
+++ b/internal/ui/table_test.go
@@ -476,7 +476,7 @@ func TestAddHotkey(t *testing.T) {
mv, _ := m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{'+'}})
m = mv.(Model)
- for _, r := range "task" {
+ for _, r := range "foo due:today" {
mv, _ = m.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune{r}})
m = mv.(Model)
}
@@ -488,7 +488,7 @@ func TestAddHotkey(t *testing.T) {
t.Fatalf("read add: %v", err)
}
- if strings.TrimSpace(string(data)) != "add task" {
+ if strings.TrimSpace(string(data)) != "add foo due:today" {
t.Fatalf("add not called: %q", data)
}
}