mirror of
https://gitea.com/gitea/tea.git
synced 2026-10-26 19:11:25 +01:00
tea issue comment 12 --body "LGTM" failed with "unknown flag: --body"; the comment had to be created with issue comment create. issue comment and pr comment now take the issue or pull request and -b/-F/-e directly, plus --edit-last and --delete-last for your last comment. The subcommands stay, create is also add, and a misspelled subcommand suggests the right one. Comments are written in the configured editor or a multi-line "Comment (markdown):" field, which edits start from the current text, without a confirmation afterwards. The new comment's URL goes to stdout with a ✓ line; deletes ask "Delete comment 81 on alice/x#1?". comment list shows each comment under a "#79 alice • about 2 hours ago" heading on a terminal and as key/value blocks when piped, and comment JSON gains issue_number. Signed-off-by: bircni <bircni@icloud.com>
99 lines
3.6 KiB
Go
99 lines
3.6 KiB
Go
// Copyright 2026 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package services
|
|
|
|
import (
|
|
"context"
|
|
"path"
|
|
"strconv"
|
|
|
|
gitea "gitea.dev/sdk"
|
|
"gitea.dev/tea/internal/transport"
|
|
)
|
|
|
|
// Comment is the public representation shared by issue and pull request comments.
|
|
type Comment struct {
|
|
ID int64 `json:"id"`
|
|
Body string `json:"body"`
|
|
URL string `json:"url"`
|
|
Author string `json:"author"`
|
|
CreatedAt string `json:"created_at"`
|
|
UpdatedAt string `json:"updated_at"`
|
|
// IssueNumber is the issue or pull request the comment is on.
|
|
IssueNumber int64 `json:"issue_number"`
|
|
// Pull reports a comment on a pull request rather than an issue.
|
|
Pull bool `json:"-"`
|
|
}
|
|
|
|
func commentFrom(comment *gitea.Comment) Comment {
|
|
return Comment{
|
|
ID: comment.ID, Body: comment.Body, URL: comment.HTMLURL, Author: login(comment.Poster),
|
|
CreatedAt: timestamp(comment.Created), UpdatedAt: timestamp(comment.Updated), Pull: comment.PRURL != "",
|
|
IssueNumber: discussionNumber(comment.IssueURL + comment.PRURL),
|
|
}
|
|
}
|
|
|
|
// discussionNumber reads the number from the web URL of an issue or pull request, or returns 0.
|
|
func discussionNumber(url string) int64 {
|
|
n, err := strconv.ParseInt(path.Base(url), 10, 64)
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
return n
|
|
}
|
|
|
|
// Comments implements discussion comments under their owning repository resource.
|
|
type Comments struct {
|
|
Client *transport.Client
|
|
Repository string
|
|
}
|
|
|
|
// List returns every discussion comment; the API does not paginate this collection.
|
|
func (s Comments) List(ctx context.Context, n int64) ([]Comment, error) {
|
|
comments, err := repoCall(ctx, s.Client, s.Repository, func(ctx context.Context, c *gitea.Client, owner, repo string) ([]*gitea.Comment, *gitea.Response, error) {
|
|
return c.Issues.ListIssueComments(ctx, owner, repo, n, gitea.ListIssueCommentOptions{Page: -1})
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return convertAll(comments, commentFrom), nil
|
|
}
|
|
|
|
// Page applies CLI pagination to the unpaginated comment collection.
|
|
func (s Comments) Page(ctx context.Context, n int64, limit, page int) ([]Comment, error) {
|
|
items, err := s.List(ctx, n)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return pageOf(items, limit, page)
|
|
}
|
|
|
|
// View retrieves a comment by its repository-scoped ID.
|
|
func (s Comments) View(ctx context.Context, id int64) (Comment, error) {
|
|
return repoConvert(ctx, s.Client, s.Repository, commentFrom, func(ctx context.Context, c *gitea.Client, owner, repo string) (*gitea.Comment, *gitea.Response, error) {
|
|
return c.Issues.GetIssueComment(ctx, owner, repo, id)
|
|
})
|
|
}
|
|
|
|
// Create adds a comment to an issue or pull request.
|
|
func (s Comments) Create(ctx context.Context, n int64, body string) (Comment, error) {
|
|
return repoConvert(ctx, s.Client, s.Repository, commentFrom, func(ctx context.Context, c *gitea.Client, owner, repo string) (*gitea.Comment, *gitea.Response, error) {
|
|
return c.Issues.CreateIssueComment(ctx, owner, repo, n, gitea.CreateIssueCommentOption{Body: body})
|
|
})
|
|
}
|
|
|
|
// Edit replaces the body of a repository comment.
|
|
func (s Comments) Edit(ctx context.Context, id int64, body string) (Comment, error) {
|
|
return repoConvert(ctx, s.Client, s.Repository, commentFrom, func(ctx context.Context, c *gitea.Client, owner, repo string) (*gitea.Comment, *gitea.Response, error) {
|
|
return c.Issues.EditIssueComment(ctx, owner, repo, id, gitea.EditIssueCommentOption{Body: body})
|
|
})
|
|
}
|
|
|
|
// Delete removes a repository comment.
|
|
func (s Comments) Delete(ctx context.Context, id int64) error {
|
|
return repoDo(ctx, s.Client, s.Repository, func(ctx context.Context, c *gitea.Client, owner, repo string) (*gitea.Response, error) {
|
|
return c.Issues.DeleteIssueComment(ctx, owner, repo, id)
|
|
})
|
|
}
|