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

release.go 4.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. // Copyright 2016 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 repo
  5. import (
  6. "strings"
  7. api "code.gitea.io/sdk/gitea"
  8. "code.gitea.io/gitea/models"
  9. "code.gitea.io/gitea/modules/context"
  10. )
  11. // GetRelease get a single release of a repository
  12. func GetRelease(ctx *context.APIContext) {
  13. id := ctx.ParamsInt64(":id")
  14. release, err := models.GetReleaseByID(id)
  15. if err != nil {
  16. ctx.Error(500, "GetReleaseByID", err)
  17. return
  18. }
  19. if release.RepoID != ctx.Repo.Repository.ID {
  20. ctx.Status(404)
  21. return
  22. }
  23. if err := release.LoadAttributes(); err != nil {
  24. ctx.Error(500, "LoadAttributes", err)
  25. return
  26. }
  27. ctx.JSON(200, release.APIFormat())
  28. }
  29. // ListReleases list a repository's releases
  30. func ListReleases(ctx *context.APIContext) {
  31. releases, err := models.GetReleasesByRepoID(ctx.Repo.Repository.ID, models.FindReleasesOptions{
  32. IncludeDrafts: ctx.Repo.AccessMode >= models.AccessModeWrite,
  33. }, 1, 2147483647)
  34. if err != nil {
  35. ctx.Error(500, "GetReleasesByRepoID", err)
  36. return
  37. }
  38. rels := make([]*api.Release, len(releases))
  39. for i, release := range releases {
  40. if err := release.LoadAttributes(); err != nil {
  41. ctx.Error(500, "LoadAttributes", err)
  42. return
  43. }
  44. rels[i] = release.APIFormat()
  45. }
  46. ctx.JSON(200, rels)
  47. }
  48. // CreateRelease create a release
  49. func CreateRelease(ctx *context.APIContext, form api.CreateReleaseOption) {
  50. if ctx.Repo.AccessMode < models.AccessModeWrite {
  51. ctx.Status(403)
  52. return
  53. }
  54. if !ctx.Repo.GitRepo.IsTagExist(form.TagName) {
  55. ctx.Status(404)
  56. return
  57. }
  58. tag, err := ctx.Repo.GitRepo.GetTag(form.TagName)
  59. if err != nil {
  60. ctx.Error(500, "GetTag", err)
  61. return
  62. }
  63. commit, err := tag.Commit()
  64. if err != nil {
  65. ctx.Error(500, "Commit", err)
  66. return
  67. }
  68. commitsCount, err := commit.CommitsCount()
  69. if err != nil {
  70. ctx.Error(500, "CommitsCount", err)
  71. return
  72. }
  73. rel := &models.Release{
  74. RepoID: ctx.Repo.Repository.ID,
  75. PublisherID: ctx.User.ID,
  76. Publisher: ctx.User,
  77. TagName: form.TagName,
  78. LowerTagName: strings.ToLower(form.TagName),
  79. Target: form.Target,
  80. Title: form.Title,
  81. Sha1: commit.ID.String(),
  82. NumCommits: commitsCount,
  83. Note: form.Note,
  84. IsDraft: form.IsDraft,
  85. IsPrerelease: form.IsPrerelease,
  86. CreatedUnix: commit.Author.When.Unix(),
  87. }
  88. if err := models.CreateRelease(ctx.Repo.GitRepo, rel, nil); err != nil {
  89. if models.IsErrReleaseAlreadyExist(err) {
  90. ctx.Status(409)
  91. } else {
  92. ctx.Error(500, "CreateRelease", err)
  93. }
  94. return
  95. }
  96. ctx.JSON(201, rel.APIFormat())
  97. }
  98. // EditRelease edit a release
  99. func EditRelease(ctx *context.APIContext, form api.EditReleaseOption) {
  100. if ctx.Repo.AccessMode < models.AccessModeWrite {
  101. ctx.Status(403)
  102. return
  103. }
  104. id := ctx.ParamsInt64(":id")
  105. rel, err := models.GetReleaseByID(id)
  106. if err != nil {
  107. ctx.Error(500, "GetReleaseByID", err)
  108. return
  109. }
  110. if rel.RepoID != ctx.Repo.Repository.ID {
  111. ctx.Status(404)
  112. return
  113. }
  114. if len(form.TagName) > 0 {
  115. rel.TagName = form.TagName
  116. }
  117. if len(form.Target) > 0 {
  118. rel.Target = form.Target
  119. }
  120. if len(form.Title) > 0 {
  121. rel.Title = form.Title
  122. }
  123. if len(form.Note) > 0 {
  124. rel.Note = form.Note
  125. }
  126. if form.IsDraft != nil {
  127. rel.IsDraft = *form.IsDraft
  128. }
  129. if form.IsPrerelease != nil {
  130. rel.IsPrerelease = *form.IsPrerelease
  131. }
  132. if err := models.UpdateRelease(ctx.Repo.GitRepo, rel, nil); err != nil {
  133. ctx.Error(500, "UpdateRelease", err)
  134. return
  135. }
  136. rel, err = models.GetReleaseByID(id)
  137. if err != nil {
  138. ctx.Error(500, "GetReleaseByID", err)
  139. return
  140. }
  141. if err := rel.LoadAttributes(); err != nil {
  142. ctx.Error(500, "LoadAttributes", err)
  143. return
  144. }
  145. ctx.JSON(200, rel.APIFormat())
  146. }
  147. // DeleteRelease delete a release from a repository
  148. func DeleteRelease(ctx *context.APIContext) {
  149. if ctx.Repo.AccessMode < models.AccessModeWrite {
  150. ctx.Status(403)
  151. return
  152. }
  153. id := ctx.ParamsInt64(":id")
  154. release, err := models.GetReleaseByID(id)
  155. if err != nil {
  156. ctx.Error(500, "GetReleaseByID", err)
  157. return
  158. }
  159. if release.RepoID != ctx.Repo.Repository.ID {
  160. ctx.Status(404)
  161. return
  162. }
  163. if err := models.DeleteReleaseByID(id, ctx.User, false); err != nil {
  164. ctx.Error(500, "DeleteReleaseByID", err)
  165. return
  166. }
  167. ctx.Status(204)
  168. }