forgejo/services/convert/issue_comment.go
Yaroslav Halchenko 2b2fd2728c Add codespell support and fix a good number of typos with its help (#3270)
More about codespell: https://github.com/codespell-project/codespell .

I personally introduced it to dozens if not hundreds of projects already and so far only positive feedback.

```
❯ grep lint-spell Makefile
	@echo " - lint-spell                       lint spelling"
	@echo " - lint-spell-fix                   lint spelling and fix issues"
lint: lint-frontend lint-backend lint-spell
lint-fix: lint-frontend-fix lint-backend-fix lint-spell-fix
.PHONY: lint-spell
lint-spell: lint-codespell
.PHONY: lint-spell-fix
lint-spell-fix: lint-codespell-fix
❯ git grep lint- -- .forgejo/
.forgejo/workflows/testing.yml:      - run: make --always-make -j$(nproc) lint-backend checks-backend # ensure the "go-licenses" make target runs
.forgejo/workflows/testing.yml:      - run: make lint-frontend
```
so how would you like me to invoke `lint-codespell` on CI? (without that would be IMHO very suboptimal and let typos sneak in)

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3270
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>
Co-authored-by: Yaroslav Halchenko <debian@onerussian.com>
Co-committed-by: Yaroslav Halchenko <debian@onerussian.com>
2024-05-09 13:49:37 +00:00

188 lines
4.6 KiB
Go

// Copyright 2020 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package convert
import (
"context"
issues_model "code.gitea.io/gitea/models/issues"
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/log"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/util"
)
// ToAPIComment converts a issues_model.Comment to the api.Comment format for API usage
func ToAPIComment(ctx context.Context, repo *repo_model.Repository, c *issues_model.Comment) *api.Comment {
return &api.Comment{
ID: c.ID,
Poster: ToUser(ctx, c.Poster, nil),
HTMLURL: c.HTMLURL(ctx),
IssueURL: c.IssueURL(ctx),
PRURL: c.PRURL(ctx),
Body: c.Content,
Attachments: ToAPIAttachments(repo, c.Attachments),
Created: c.CreatedUnix.AsTime(),
Updated: c.UpdatedUnix.AsTime(),
}
}
// ToTimelineComment converts a issues_model.Comment to the api.TimelineComment format
func ToTimelineComment(ctx context.Context, repo *repo_model.Repository, c *issues_model.Comment, doer *user_model.User) *api.TimelineComment {
err := c.LoadMilestone(ctx)
if err != nil {
log.Error("LoadMilestone: %v", err)
return nil
}
err = c.LoadAssigneeUserAndTeam(ctx)
if err != nil {
log.Error("LoadAssigneeUserAndTeam: %v", err)
return nil
}
err = c.LoadResolveDoer(ctx)
if err != nil {
log.Error("LoadResolveDoer: %v", err)
return nil
}
err = c.LoadDepIssueDetails(ctx)
if err != nil {
log.Error("LoadDepIssueDetails: %v", err)
return nil
}
err = c.LoadTime(ctx)
if err != nil {
log.Error("LoadTime: %v", err)
return nil
}
err = c.LoadLabel(ctx)
if err != nil {
log.Error("LoadLabel: %v", err)
return nil
}
if c.Content != "" {
if (c.Type == issues_model.CommentTypeAddTimeManual ||
c.Type == issues_model.CommentTypeStopTracking ||
c.Type == issues_model.CommentTypeDeleteTimeManual) &&
c.Content[0] == '|' {
// TimeTracking Comments from v1.21 on store the seconds instead of an formatted string
// so we check for the "|" delimiter and convert new to legacy format on demand
c.Content = util.SecToTime(c.Content[1:])
}
}
comment := &api.TimelineComment{
ID: c.ID,
Type: c.Type.String(),
Poster: ToUser(ctx, c.Poster, nil),
HTMLURL: c.HTMLURL(ctx),
IssueURL: c.IssueURL(ctx),
PRURL: c.PRURL(ctx),
Body: c.Content,
Created: c.CreatedUnix.AsTime(),
Updated: c.UpdatedUnix.AsTime(),
OldProjectID: c.OldProjectID,
ProjectID: c.ProjectID,
OldTitle: c.OldTitle,
NewTitle: c.NewTitle,
OldRef: c.OldRef,
NewRef: c.NewRef,
RefAction: c.RefAction.String(),
RefCommitSHA: c.CommitSHA,
ReviewID: c.ReviewID,
RemovedAssignee: c.RemovedAssignee,
}
if c.OldMilestone != nil {
comment.OldMilestone = ToAPIMilestone(c.OldMilestone)
}
if c.Milestone != nil {
comment.Milestone = ToAPIMilestone(c.Milestone)
}
if c.Time != nil {
err = c.Time.LoadAttributes(ctx)
if err != nil {
log.Error("Time.LoadAttributes: %v", err)
return nil
}
comment.TrackedTime = ToTrackedTime(ctx, doer, c.Time)
}
if c.RefIssueID != 0 {
issue, err := issues_model.GetIssueByID(ctx, c.RefIssueID)
if err != nil {
log.Error("GetIssueByID(%d): %v", c.RefIssueID, err)
return nil
}
comment.RefIssue = ToAPIIssue(ctx, doer, issue)
}
if c.RefCommentID != 0 {
com, err := issues_model.GetCommentByID(ctx, c.RefCommentID)
if err != nil {
log.Error("GetCommentByID(%d): %v", c.RefCommentID, err)
return nil
}
err = com.LoadPoster(ctx)
if err != nil {
log.Error("LoadPoster: %v", err)
return nil
}
comment.RefComment = ToAPIComment(ctx, repo, com)
}
if c.Label != nil {
var org *user_model.User
var repo *repo_model.Repository
if c.Label.BelongsToOrg() {
var err error
org, err = user_model.GetUserByID(ctx, c.Label.OrgID)
if err != nil {
log.Error("GetUserByID(%d): %v", c.Label.OrgID, err)
return nil
}
}
if c.Label.BelongsToRepo() {
var err error
repo, err = repo_model.GetRepositoryByID(ctx, c.Label.RepoID)
if err != nil {
log.Error("GetRepositoryByID(%d): %v", c.Label.RepoID, err)
return nil
}
}
comment.Label = ToLabel(c.Label, repo, org)
}
if c.Assignee != nil {
comment.Assignee = ToUser(ctx, c.Assignee, nil)
}
if c.AssigneeTeam != nil {
comment.AssigneeTeam, _ = ToTeam(ctx, c.AssigneeTeam)
}
if c.ResolveDoer != nil {
comment.ResolveDoer = ToUser(ctx, c.ResolveDoer, nil)
}
if c.DependentIssue != nil {
comment.DependentIssue = ToAPIIssue(ctx, doer, c.DependentIssue)
}
return comment
}