This commit is contained in:
2026-03-26 12:48:47 +00:00
commit 2d4cff717b
21 changed files with 1835 additions and 0 deletions

94
cmd/update.go Normal file
View File

@@ -0,0 +1,94 @@
package cmd
import (
"axolotl/db"
"axolotl/models"
"axolotl/output"
"fmt"
"os"
"github.com/spf13/cobra"
)
var updateTitle, updateContent, updateStatus, updatePrio, updateDue string
var updateClearDue bool
var updateAddTags, updateRemoveTags, updateAddRels, updateRemoveRels []string
var updateCmd = &cobra.Command{
Use: "update <id>",
Short: "Update a node",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
d, err := db.GetDB()
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
id := args[0]
addRels := make(map[models.RelType][]string)
removeRels := make(map[models.RelType][]string)
for _, r := range updateAddRels {
relType, target, err := db.ParseRelFlag(r)
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
addRels[relType] = append(addRels[relType], target)
}
for _, r := range updateRemoveRels {
relType, target, err := db.ParseRelFlag(r)
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
removeRels[relType] = append(removeRels[relType], target)
}
if updateStatus == "done" {
ok, blockers, err := d.CanClose(id)
if err != nil {
fmt.Fprintln(os.Stderr, "failed to check blockers:", err)
return
}
if !ok {
fmt.Fprintf(os.Stderr, "cannot close: blocked by %v\n", blockers)
return
}
}
err = d.UpdateNode(id, db.UpdateParams{
Title: updateTitle,
Content: updateContent,
DueDate: updateDue,
ClearDue: updateClearDue,
Status: updateStatus,
Priority: updatePrio,
AddTags: updateAddTags,
RemoveTags: updateRemoveTags,
AddRels: addRels,
RemoveRels: removeRels,
})
if err != nil {
fmt.Fprintln(os.Stderr, "failed to update:", err)
return
}
n, err := d.NodeByID(id)
if err != nil {
fmt.Fprintln(os.Stderr, "failed to fetch node:", err)
return
}
output.PrintNode(cmd.OutOrStdout(), n, jsonFlag)
},
}
func init() {
rootCmd.AddCommand(updateCmd)
updateCmd.Flags().StringVar(&updateTitle, "title", "", "new title")
updateCmd.Flags().StringVar(&updateContent, "content", "", "new content")
updateCmd.Flags().StringVar(&updateStatus, "status", "", "status (open, done)")
updateCmd.Flags().StringVar(&updatePrio, "prio", "", "priority (high, medium, low)")
updateCmd.Flags().StringVar(&updateDue, "due", "", "due date")
updateCmd.Flags().BoolVar(&updateClearDue, "clear-due", false, "clear due date")
updateCmd.Flags().StringArrayVar(&updateAddTags, "tag", nil, "add tags (repeatable)")
updateCmd.Flags().StringArrayVar(&updateRemoveTags, "tag-remove", nil, "remove tags (repeatable)")
updateCmd.Flags().StringArrayVar(&updateAddRels, "rel", nil, "add relations (type:id, repeatable)")
updateCmd.Flags().StringArrayVar(&updateRemoveRels, "rel-remove", nil, "remove relations (type:id, repeatable)")
}