gitea源码

license.go 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package repo
  4. import (
  5. "context"
  6. "code.gitea.io/gitea/models/db"
  7. "code.gitea.io/gitea/modules/timeutil"
  8. )
  9. func init() {
  10. db.RegisterModel(new(RepoLicense))
  11. }
  12. type RepoLicense struct { //revive:disable-line:exported
  13. ID int64 `xorm:"pk autoincr"`
  14. RepoID int64 `xorm:"UNIQUE(s) NOT NULL"`
  15. CommitID string
  16. License string `xorm:"VARCHAR(255) UNIQUE(s) NOT NULL"`
  17. CreatedUnix timeutil.TimeStamp `xorm:"INDEX CREATED"`
  18. UpdatedUnix timeutil.TimeStamp `xorm:"INDEX UPDATED"`
  19. }
  20. // RepoLicenseList defines a list of repo licenses
  21. type RepoLicenseList []*RepoLicense //revive:disable-line:exported
  22. func (rll RepoLicenseList) StringList() []string {
  23. var licenses []string
  24. for _, rl := range rll {
  25. licenses = append(licenses, rl.License)
  26. }
  27. return licenses
  28. }
  29. // GetRepoLicenses returns the license statistics for a repository
  30. func GetRepoLicenses(ctx context.Context, repo *Repository) (RepoLicenseList, error) {
  31. licenses := make(RepoLicenseList, 0)
  32. if err := db.GetEngine(ctx).Where("`repo_id` = ?", repo.ID).Asc("`license`").Find(&licenses); err != nil {
  33. return nil, err
  34. }
  35. return licenses, nil
  36. }
  37. // UpdateRepoLicenses updates the license statistics for repository
  38. func UpdateRepoLicenses(ctx context.Context, repo *Repository, commitID string, licenses []string) error {
  39. oldLicenses, err := GetRepoLicenses(ctx, repo)
  40. if err != nil {
  41. return err
  42. }
  43. for _, license := range licenses {
  44. upd := false
  45. for _, o := range oldLicenses {
  46. // Update already existing license
  47. if o.License == license {
  48. o.CommitID = commitID
  49. if _, err := db.GetEngine(ctx).ID(o.ID).Cols("`commit_id`").Update(o); err != nil {
  50. return err
  51. }
  52. upd = true
  53. break
  54. }
  55. }
  56. // Insert new license
  57. if !upd {
  58. if err := db.Insert(ctx, &RepoLicense{
  59. RepoID: repo.ID,
  60. CommitID: commitID,
  61. License: license,
  62. }); err != nil {
  63. return err
  64. }
  65. }
  66. }
  67. // Delete old licenses
  68. licenseToDelete := make([]int64, 0, len(oldLicenses))
  69. for _, o := range oldLicenses {
  70. if o.CommitID != commitID {
  71. licenseToDelete = append(licenseToDelete, o.ID)
  72. }
  73. }
  74. if len(licenseToDelete) > 0 {
  75. if _, err := db.GetEngine(ctx).In("`id`", licenseToDelete).Delete(&RepoLicense{}); err != nil {
  76. return err
  77. }
  78. }
  79. return nil
  80. }
  81. // CopyLicense Copy originalRepo license information to destRepo (use for forked repo)
  82. func CopyLicense(ctx context.Context, originalRepo, destRepo *Repository) error {
  83. repoLicenses, err := GetRepoLicenses(ctx, originalRepo)
  84. if err != nil {
  85. return err
  86. }
  87. if len(repoLicenses) > 0 {
  88. newRepoLicenses := make(RepoLicenseList, 0, len(repoLicenses))
  89. for _, rl := range repoLicenses {
  90. newRepoLicense := &RepoLicense{
  91. RepoID: destRepo.ID,
  92. CommitID: rl.CommitID,
  93. License: rl.License,
  94. }
  95. newRepoLicenses = append(newRepoLicenses, newRepoLicense)
  96. }
  97. if err := db.Insert(ctx, &newRepoLicenses); err != nil {
  98. return err
  99. }
  100. }
  101. return nil
  102. }
  103. // CleanRepoLicenses will remove all license record of the repo
  104. func CleanRepoLicenses(ctx context.Context, repo *Repository) error {
  105. return db.DeleteBeans(ctx, &RepoLicense{
  106. RepoID: repo.ID,
  107. })
  108. }