mirror of
https://gitea.com/gitea/tea.git
synced 2026-10-26 11:01:25 +01:00
milestone view v2.0 failed with "invalid resource number" although its usage promised <id-or-name>, and issue create --milestone v1.0 failed with a strconv error. Every milestone argument (view, edit, delete, close, reopen, milestone issue add|remove|list) and issue create|edit -m/--milestone now accept a title or an ID: a number is an ID first, then a title; --by-name matches numeric titles only. --milestone-name stays as a hidden name of --milestone, and issue edit gains --remove-milestone (as does --milestone 0). Signed-off-by: bircni <bircni@icloud.com>
46 lines
1.7 KiB
Go
46 lines
1.7 KiB
Go
// Copyright 2026 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package app
|
|
|
|
import (
|
|
"errors"
|
|
"slices"
|
|
"strings"
|
|
|
|
"gitea.dev/tea/internal/clierr"
|
|
"gitea.dev/tea/internal/services"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func (a *application) milestoneStateCommand(verb string, service func(*cobra.Command) (services.Milestones, error)) *cobra.Command {
|
|
var byName bool
|
|
cmd := &cobra.Command{Use: verb + " <milestone>...", Short: titleCase(verb) + " one or more milestones", Args: usageArgs(cobra.MinimumNArgs(1)), RunE: func(cmd *cobra.Command, args []string) error {
|
|
if slices.ContainsFunc(args, func(arg string) bool { return strings.TrimSpace(arg) == "" }) {
|
|
return clierr.Wrap(clierr.Usage, errors.New("milestone title or ID cannot be empty"))
|
|
}
|
|
milestones, err := service(cmd)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
selected, err := milestones.Find(cmd.Context(), args, byName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for i, milestone := range selected {
|
|
if slices.ContainsFunc(selected[:i], func(other services.Milestone) bool { return other.ID == milestone.ID }) {
|
|
return clierr.Wrap(clierr.Usage, errors.New("milestone "+args[i]+" is selected more than once"))
|
|
}
|
|
}
|
|
state := "closed"
|
|
if verb == "reopen" {
|
|
state = "open"
|
|
}
|
|
return batch(a, cmd, selected, func(milestone services.Milestone) string { return "milestone " + milestone.Title }, func(milestone services.Milestone) (services.Milestone, error) {
|
|
return milestones.Edit(cmd.Context(), milestone.ID, services.MilestoneOptions{State: &state})
|
|
}, milestoneRow)
|
|
}}
|
|
cmd.Flags().BoolVar(&byName, "by-name", false, "Match numeric arguments as milestone titles rather than IDs")
|
|
return cmd
|
|
}
|