You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

repository.go 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package convert
  5. import (
  6. "code.gitea.io/gitea/models"
  7. "code.gitea.io/gitea/models/db"
  8. "code.gitea.io/gitea/models/perm"
  9. repo_model "code.gitea.io/gitea/models/repo"
  10. unit_model "code.gitea.io/gitea/models/unit"
  11. "code.gitea.io/gitea/modules/log"
  12. api "code.gitea.io/gitea/modules/structs"
  13. )
  14. // ToRepo converts a Repository to api.Repository
  15. func ToRepo(repo *repo_model.Repository, mode perm.AccessMode) *api.Repository {
  16. return innerToRepo(repo, mode, false)
  17. }
  18. func innerToRepo(repo *repo_model.Repository, mode perm.AccessMode, isParent bool) *api.Repository {
  19. var parent *api.Repository
  20. cloneLink := repo.CloneLink()
  21. permission := &api.Permission{
  22. Admin: mode >= perm.AccessModeAdmin,
  23. Push: mode >= perm.AccessModeWrite,
  24. Pull: mode >= perm.AccessModeRead,
  25. }
  26. if !isParent {
  27. err := repo.GetBaseRepo()
  28. if err != nil {
  29. return nil
  30. }
  31. if repo.BaseRepo != nil {
  32. parent = innerToRepo(repo.BaseRepo, mode, true)
  33. }
  34. }
  35. //check enabled/disabled units
  36. hasIssues := false
  37. var externalTracker *api.ExternalTracker
  38. var internalTracker *api.InternalTracker
  39. if unit, err := repo.GetUnit(unit_model.TypeIssues); err == nil {
  40. config := unit.IssuesConfig()
  41. hasIssues = true
  42. internalTracker = &api.InternalTracker{
  43. EnableTimeTracker: config.EnableTimetracker,
  44. AllowOnlyContributorsToTrackTime: config.AllowOnlyContributorsToTrackTime,
  45. EnableIssueDependencies: config.EnableDependencies,
  46. }
  47. } else if unit, err := repo.GetUnit(unit_model.TypeExternalTracker); err == nil {
  48. config := unit.ExternalTrackerConfig()
  49. hasIssues = true
  50. externalTracker = &api.ExternalTracker{
  51. ExternalTrackerURL: config.ExternalTrackerURL,
  52. ExternalTrackerFormat: config.ExternalTrackerFormat,
  53. ExternalTrackerStyle: config.ExternalTrackerStyle,
  54. }
  55. }
  56. hasWiki := false
  57. var externalWiki *api.ExternalWiki
  58. if _, err := repo.GetUnit(unit_model.TypeWiki); err == nil {
  59. hasWiki = true
  60. } else if unit, err := repo.GetUnit(unit_model.TypeExternalWiki); err == nil {
  61. hasWiki = true
  62. config := unit.ExternalWikiConfig()
  63. externalWiki = &api.ExternalWiki{
  64. ExternalWikiURL: config.ExternalWikiURL,
  65. }
  66. }
  67. hasPullRequests := false
  68. ignoreWhitespaceConflicts := false
  69. allowMerge := false
  70. allowRebase := false
  71. allowRebaseMerge := false
  72. allowSquash := false
  73. defaultMergeStyle := repo_model.MergeStyleMerge
  74. if unit, err := repo.GetUnit(unit_model.TypePullRequests); err == nil {
  75. config := unit.PullRequestsConfig()
  76. hasPullRequests = true
  77. ignoreWhitespaceConflicts = config.IgnoreWhitespaceConflicts
  78. allowMerge = config.AllowMerge
  79. allowRebase = config.AllowRebase
  80. allowRebaseMerge = config.AllowRebaseMerge
  81. allowSquash = config.AllowSquash
  82. defaultMergeStyle = config.GetDefaultMergeStyle()
  83. }
  84. hasProjects := false
  85. if _, err := repo.GetUnit(unit_model.TypeProjects); err == nil {
  86. hasProjects = true
  87. }
  88. if err := repo.GetOwner(db.DefaultContext); err != nil {
  89. return nil
  90. }
  91. numReleases, _ := models.GetReleaseCountByRepoID(repo.ID, models.FindReleasesOptions{IncludeDrafts: false, IncludeTags: false})
  92. mirrorInterval := ""
  93. if repo.IsMirror {
  94. var err error
  95. repo.Mirror, err = repo_model.GetMirrorByRepoID(repo.ID)
  96. if err == nil {
  97. mirrorInterval = repo.Mirror.Interval.String()
  98. }
  99. }
  100. var transfer *api.RepoTransfer
  101. if repo.Status == repo_model.RepositoryPendingTransfer {
  102. t, err := models.GetPendingRepositoryTransfer(repo)
  103. if err != nil && !models.IsErrNoPendingTransfer(err) {
  104. log.Warn("GetPendingRepositoryTransfer: %v", err)
  105. } else {
  106. if err := t.LoadAttributes(); err != nil {
  107. log.Warn("LoadAttributes of RepoTransfer: %v", err)
  108. } else {
  109. transfer = ToRepoTransfer(t)
  110. }
  111. }
  112. }
  113. return &api.Repository{
  114. ID: repo.ID,
  115. Owner: ToUserWithAccessMode(repo.Owner, mode),
  116. Name: repo.Name,
  117. FullName: repo.FullName(),
  118. Description: repo.Description,
  119. Private: repo.IsPrivate,
  120. Template: repo.IsTemplate,
  121. Empty: repo.IsEmpty,
  122. Archived: repo.IsArchived,
  123. Size: int(repo.Size / 1024),
  124. Fork: repo.IsFork,
  125. Parent: parent,
  126. Mirror: repo.IsMirror,
  127. HTMLURL: repo.HTMLURL(),
  128. SSHURL: cloneLink.SSH,
  129. CloneURL: cloneLink.HTTPS,
  130. OriginalURL: repo.SanitizedOriginalURL(),
  131. Website: repo.Website,
  132. Stars: repo.NumStars,
  133. Forks: repo.NumForks,
  134. Watchers: repo.NumWatches,
  135. OpenIssues: repo.NumOpenIssues,
  136. OpenPulls: repo.NumOpenPulls,
  137. Releases: int(numReleases),
  138. DefaultBranch: repo.DefaultBranch,
  139. Created: repo.CreatedUnix.AsTime(),
  140. Updated: repo.UpdatedUnix.AsTime(),
  141. Permissions: permission,
  142. HasIssues: hasIssues,
  143. ExternalTracker: externalTracker,
  144. InternalTracker: internalTracker,
  145. HasWiki: hasWiki,
  146. HasProjects: hasProjects,
  147. ExternalWiki: externalWiki,
  148. HasPullRequests: hasPullRequests,
  149. IgnoreWhitespaceConflicts: ignoreWhitespaceConflicts,
  150. AllowMerge: allowMerge,
  151. AllowRebase: allowRebase,
  152. AllowRebaseMerge: allowRebaseMerge,
  153. AllowSquash: allowSquash,
  154. DefaultMergeStyle: string(defaultMergeStyle),
  155. AvatarURL: repo.AvatarLink(),
  156. Internal: !repo.IsPrivate && repo.Owner.Visibility == api.VisibleTypePrivate,
  157. MirrorInterval: mirrorInterval,
  158. RepoTransfer: transfer,
  159. }
  160. }
  161. // ToRepoTransfer convert a models.RepoTransfer to a structs.RepeTransfer
  162. func ToRepoTransfer(t *models.RepoTransfer) *api.RepoTransfer {
  163. var teams []*api.Team
  164. for _, v := range t.Teams {
  165. teams = append(teams, ToTeam(v))
  166. }
  167. return &api.RepoTransfer{
  168. Doer: ToUser(t.Doer, nil),
  169. Recipient: ToUser(t.Recipient, nil),
  170. Teams: teams,
  171. }
  172. }