...

Source file src/edge-infra.dev/pkg/tools/dlog/cmd/edit.go

Documentation: edge-infra.dev/pkg/tools/dlog/cmd

     1  package cmd
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"path/filepath"
     7  	"slices"
     8  	"time"
     9  
    10  	"edge-infra.dev/pkg/lib/cli/rags"
    11  	"edge-infra.dev/pkg/lib/cli/sink"
    12  	"edge-infra.dev/pkg/tools/dlog"
    13  )
    14  
    15  func newEditCmd() *sink.Command {
    16  	var (
    17  		dir, template, status string
    18  		addTags, removeTags   []string
    19  	)
    20  
    21  	cmd := &sink.Command{
    22  		Use:   "edit [flags] <file>",
    23  		Short: "Edit decision logs.",
    24  		Flags: []*rags.Rag{
    25  			dirFlag(&dir),
    26  			templateFlag(&template),
    27  			{
    28  				Name:  "add-tags",
    29  				Value: &rags.StringSet{Var: &addTags},
    30  				Usage: "Comma separated list of tags to apply to dlog. Can be provided multiple times.",
    31  			},
    32  			{
    33  				Name:  "remove-tags",
    34  				Value: &rags.StringSet{Var: &removeTags},
    35  				Usage: "Comma separated list of tags to remove from dlog. Can be provided multiple times.",
    36  			},
    37  			{
    38  				Name:  "status",
    39  				Value: &rags.String{Var: &status},
    40  				Usage: "New dlog status",
    41  			},
    42  		},
    43  		Exec: func(_ context.Context, r sink.Run) error {
    44  			if len(r.Args()) != 1 {
    45  				return fmt.Errorf("a name for the decision log file is required")
    46  			}
    47  
    48  			if len(addTags) == 0 && status == "" && len(removeTags) == 0 {
    49  				return fmt.Errorf("at least one edit is required")
    50  			}
    51  
    52  			p := filepath.Join(dir, r.Args()[0])
    53  			d, err := dlog.FromMarkdown(p)
    54  			if err != nil {
    55  				return err
    56  			}
    57  
    58  			if len(removeTags) > 0 {
    59  				n := 0
    60  				for _, t := range d.Tags {
    61  					if !slices.Contains(removeTags, t) {
    62  						d.Tags[n] = t
    63  						n++
    64  					}
    65  				}
    66  				d.Tags = d.Tags[:n]
    67  			}
    68  
    69  			if len(addTags) > 0 {
    70  				d.Tags = append(d.Tags, addTags...)
    71  				slices.Sort(d.Tags)
    72  				d.Tags = slices.Compact(d.Tags)
    73  			}
    74  
    75  			if status != "" {
    76  				d.Status = status
    77  			}
    78  
    79  			// Always update date since we modified the log.
    80  			d.Date.Time = time.Now()
    81  
    82  			return dlog.ToMarkdown(d, dir)
    83  		},
    84  	}
    85  
    86  	return cmd
    87  }
    88  

View as plain text