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 ", 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)") }