gitea源码

commit.go 3.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright 2025 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package git
  4. import (
  5. "context"
  6. asymkey_model "code.gitea.io/gitea/models/asymkey"
  7. "code.gitea.io/gitea/models/db"
  8. git_model "code.gitea.io/gitea/models/git"
  9. repo_model "code.gitea.io/gitea/models/repo"
  10. user_model "code.gitea.io/gitea/models/user"
  11. "code.gitea.io/gitea/modules/container"
  12. "code.gitea.io/gitea/modules/git"
  13. asymkey_service "code.gitea.io/gitea/services/asymkey"
  14. )
  15. // ParseCommitsWithSignature checks if signaute of commits are corresponding to users gpg keys.
  16. func ParseCommitsWithSignature(ctx context.Context, repo *repo_model.Repository, oldCommits []*user_model.UserCommit, repoTrustModel repo_model.TrustModelType) ([]*asymkey_model.SignCommit, error) {
  17. newCommits := make([]*asymkey_model.SignCommit, 0, len(oldCommits))
  18. keyMap := map[string]bool{}
  19. emails := make(container.Set[string])
  20. for _, c := range oldCommits {
  21. if c.Committer != nil {
  22. emails.Add(c.Committer.Email)
  23. }
  24. }
  25. emailUsers, err := user_model.GetUsersByEmails(ctx, emails.Values())
  26. if err != nil {
  27. return nil, err
  28. }
  29. for _, c := range oldCommits {
  30. committerUser := emailUsers.GetByEmail(c.Committer.Email) // FIXME: why ValidateCommitsWithEmails uses "Author", but ParseCommitsWithSignature uses "Committer"?
  31. signCommit := &asymkey_model.SignCommit{
  32. UserCommit: c,
  33. Verification: asymkey_service.ParseCommitWithSignatureCommitter(ctx, c.Commit, committerUser),
  34. }
  35. isOwnerMemberCollaborator := func(user *user_model.User) (bool, error) {
  36. return repo_model.IsOwnerMemberCollaborator(ctx, repo, user.ID)
  37. }
  38. _ = asymkey_model.CalculateTrustStatus(signCommit.Verification, repoTrustModel, isOwnerMemberCollaborator, &keyMap)
  39. newCommits = append(newCommits, signCommit)
  40. }
  41. return newCommits, nil
  42. }
  43. // ConvertFromGitCommit converts git commits into SignCommitWithStatuses
  44. func ConvertFromGitCommit(ctx context.Context, commits []*git.Commit, repo *repo_model.Repository) ([]*git_model.SignCommitWithStatuses, error) {
  45. validatedCommits, err := user_model.ValidateCommitsWithEmails(ctx, commits)
  46. if err != nil {
  47. return nil, err
  48. }
  49. signedCommits, err := ParseCommitsWithSignature(
  50. ctx,
  51. repo,
  52. validatedCommits,
  53. repo.GetTrustModel(),
  54. )
  55. if err != nil {
  56. return nil, err
  57. }
  58. return ParseCommitsWithStatus(ctx, signedCommits, repo)
  59. }
  60. // ParseCommitsWithStatus checks commits latest statuses and calculates its worst status state
  61. func ParseCommitsWithStatus(ctx context.Context, oldCommits []*asymkey_model.SignCommit, repo *repo_model.Repository) ([]*git_model.SignCommitWithStatuses, error) {
  62. newCommits := make([]*git_model.SignCommitWithStatuses, 0, len(oldCommits))
  63. for _, c := range oldCommits {
  64. commit := &git_model.SignCommitWithStatuses{
  65. SignCommit: c,
  66. }
  67. statuses, err := git_model.GetLatestCommitStatus(ctx, repo.ID, commit.ID.String(), db.ListOptionsAll)
  68. if err != nil {
  69. return nil, err
  70. }
  71. commit.Statuses = statuses
  72. commit.Status = git_model.CalcCommitStatus(statuses)
  73. newCommits = append(newCommits, commit)
  74. }
  75. return newCommits, nil
  76. }