// Copyright 2026 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package comments import ( stdctx "context" "errors" "fmt" "strings" gitea "gitea.dev/sdk" "gitea.dev/tea/cmd/flags" "gitea.dev/tea/modules/config" "gitea.dev/tea/modules/context" "gitea.dev/tea/modules/interact" "gitea.dev/tea/modules/print" "gitea.dev/tea/modules/theme" "gitea.dev/tea/modules/utils" "charm.land/huh/v2" "github.com/urfave/cli/v3" ) // CmdCommentsEdit edits an existing comment. var CmdCommentsEdit = cli.Command{ Name: "edit", Aliases: []string{"e"}, Usage: "Edit the body of an existing comment", Description: `Edit the body of an existing comment by its comment ID. Use 'tea comments list ' to find IDs. The new body can be supplied as a positional argument, via -d/--description, piped on stdin, or (if none is given and stdin is a terminal) entered in your $EDITOR.`, ArgsUsage: " []", Action: RunCommentsEdit, Flags: append([]cli.Flag{ &cli.StringFlag{ Name: "description", Aliases: []string{"d"}, Usage: "new comment body (alternative to the positional argument)", }, }, flags.AllDefaultFlags...), } // RunCommentsEdit updates the body of an existing comment. func RunCommentsEdit(requestCtx stdctx.Context, cmd *cli.Command) error { ctx, err := context.InitCommand(cmd) if err != nil { return err } if err := ctx.Ensure(context.CtxRequirement{RemoteRepo: true}); err != nil { return err } if ctx.Args().Len() == 0 { return fmt.Errorf("please specify comment id") } id, err := utils.ArgToIndex(ctx.Args().First()) if err != nil { return fmt.Errorf("invalid comment id %q: %s", ctx.Args().First(), err) } stdinPiped := interact.IsStdinPiped() body, err := resolveBody(strings.Join(ctx.Args().Tail(), " "), ctx.String("description"), stdinPiped, ctx.Reader) if err != nil { return err } if len(body) == 0 && !stdinPiped { // Fetch current body to pre-populate the editor. client := ctx.Login.Client() current, _, fetchErr := client.Issues.GetIssueComment(requestCtx, ctx.Owner, ctx.Repo, id) if fetchErr != nil { return fmt.Errorf("could not fetch comment %d: %s", id, fetchErr) } body = current.Body if err := huh.NewForm( huh.NewGroup( huh.NewText(). Title("Comment(markdown):"). ExternalEditor(config.GetPreferences().Editor). EditorExtension("md"). Value(&body), ), ).WithTheme(theme.GetTheme()). Run(); err != nil { return err } } if len(body) == 0 { return errors.New("no comment content provided") } client := ctx.Login.Client() comment, _, err := client.Issues.EditIssueComment(requestCtx, ctx.Owner, ctx.Repo, id, gitea.EditIssueCommentOption{ Body: body, }) if err != nil { return err } print.Comment(comment) return nil }