Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

repository.go 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. api "code.gitea.io/gitea/modules/structs"
  8. )
  9. // ToRepo converts a Repository to api.Repository
  10. func ToRepo(repo *models.Repository, mode models.AccessMode) *api.Repository {
  11. return innerToRepo(repo, mode, false)
  12. }
  13. func innerToRepo(repo *models.Repository, mode models.AccessMode, isParent bool) *api.Repository {
  14. var parent *api.Repository
  15. cloneLink := repo.CloneLink()
  16. permission := &api.Permission{
  17. Admin: mode >= models.AccessModeAdmin,
  18. Push: mode >= models.AccessModeWrite,
  19. Pull: mode >= models.AccessModeRead,
  20. }
  21. if !isParent {
  22. err := repo.GetBaseRepo()
  23. if err != nil {
  24. return nil
  25. }
  26. if repo.BaseRepo != nil {
  27. parent = innerToRepo(repo.BaseRepo, mode, true)
  28. }
  29. }
  30. //check enabled/disabled units
  31. hasIssues := false
  32. var externalTracker *api.ExternalTracker
  33. var internalTracker *api.InternalTracker
  34. if unit, err := repo.GetUnit(models.UnitTypeIssues); err == nil {
  35. config := unit.IssuesConfig()
  36. hasIssues = true
  37. internalTracker = &api.InternalTracker{
  38. EnableTimeTracker: config.EnableTimetracker,
  39. AllowOnlyContributorsToTrackTime: config.AllowOnlyContributorsToTrackTime,
  40. EnableIssueDependencies: config.EnableDependencies,
  41. }
  42. } else if unit, err := repo.GetUnit(models.UnitTypeExternalTracker); err == nil {
  43. config := unit.ExternalTrackerConfig()
  44. hasIssues = true
  45. externalTracker = &api.ExternalTracker{
  46. ExternalTrackerURL: config.ExternalTrackerURL,
  47. ExternalTrackerFormat: config.ExternalTrackerFormat,
  48. ExternalTrackerStyle: config.ExternalTrackerStyle,
  49. }
  50. }
  51. hasWiki := false
  52. var externalWiki *api.ExternalWiki
  53. if _, err := repo.GetUnit(models.UnitTypeWiki); err == nil {
  54. hasWiki = true
  55. } else if unit, err := repo.GetUnit(models.UnitTypeExternalWiki); err == nil {
  56. hasWiki = true
  57. config := unit.ExternalWikiConfig()
  58. externalWiki = &api.ExternalWiki{
  59. ExternalWikiURL: config.ExternalWikiURL,
  60. }
  61. }
  62. hasPullRequests := false
  63. ignoreWhitespaceConflicts := false
  64. allowMerge := false
  65. allowRebase := false
  66. allowRebaseMerge := false
  67. allowSquash := false
  68. if unit, err := repo.GetUnit(models.UnitTypePullRequests); err == nil {
  69. config := unit.PullRequestsConfig()
  70. hasPullRequests = true
  71. ignoreWhitespaceConflicts = config.IgnoreWhitespaceConflicts
  72. allowMerge = config.AllowMerge
  73. allowRebase = config.AllowRebase
  74. allowRebaseMerge = config.AllowRebaseMerge
  75. allowSquash = config.AllowSquash
  76. }
  77. hasProjects := false
  78. if _, err := repo.GetUnit(models.UnitTypeProjects); err == nil {
  79. hasProjects = true
  80. }
  81. if err := repo.GetOwner(); err != nil {
  82. return nil
  83. }
  84. numReleases, _ := models.GetReleaseCountByRepoID(repo.ID, models.FindReleasesOptions{IncludeDrafts: false, IncludeTags: false})
  85. mirrorInterval := ""
  86. if repo.IsMirror {
  87. if err := repo.GetMirror(); err == nil {
  88. mirrorInterval = repo.Mirror.Interval.String()
  89. }
  90. }
  91. return &api.Repository{
  92. ID: repo.ID,
  93. Owner: ToUser(repo.Owner, mode != models.AccessModeNone, mode >= models.AccessModeAdmin),
  94. Name: repo.Name,
  95. FullName: repo.FullName(),
  96. Description: repo.Description,
  97. Private: repo.IsPrivate,
  98. Template: repo.IsTemplate,
  99. Empty: repo.IsEmpty,
  100. Archived: repo.IsArchived,
  101. Size: int(repo.Size / 1024),
  102. Fork: repo.IsFork,
  103. Parent: parent,
  104. Mirror: repo.IsMirror,
  105. HTMLURL: repo.HTMLURL(),
  106. SSHURL: cloneLink.SSH,
  107. CloneURL: cloneLink.HTTPS,
  108. OriginalURL: repo.SanitizedOriginalURL(),
  109. Website: repo.Website,
  110. Stars: repo.NumStars,
  111. Forks: repo.NumForks,
  112. Watchers: repo.NumWatches,
  113. OpenIssues: repo.NumOpenIssues,
  114. OpenPulls: repo.NumOpenPulls,
  115. Releases: int(numReleases),
  116. DefaultBranch: repo.DefaultBranch,
  117. Created: repo.CreatedUnix.AsTime(),
  118. Updated: repo.UpdatedUnix.AsTime(),
  119. Permissions: permission,
  120. HasIssues: hasIssues,
  121. ExternalTracker: externalTracker,
  122. InternalTracker: internalTracker,
  123. HasWiki: hasWiki,
  124. HasProjects: hasProjects,
  125. ExternalWiki: externalWiki,
  126. HasPullRequests: hasPullRequests,
  127. IgnoreWhitespaceConflicts: ignoreWhitespaceConflicts,
  128. AllowMerge: allowMerge,
  129. AllowRebase: allowRebase,
  130. AllowRebaseMerge: allowRebaseMerge,
  131. AllowSquash: allowSquash,
  132. AvatarURL: repo.AvatarLink(),
  133. Internal: !repo.IsPrivate && repo.Owner.Visibility == api.VisibleTypePrivate,
  134. MirrorInterval: mirrorInterval,
  135. }
  136. }