/engine/vcs/bitbucketserver/client_commit.go

https://github.com/ovh/cds · Go · 188 lines · 163 code · 23 blank · 2 comment · 56 complexity · dee7c156da85a29bd57427b763958eab MD5 · raw file

  1. package bitbucketserver
  2. import (
  3. "context"
  4. "fmt"
  5. "net/url"
  6. "github.com/ovh/cds/engine/cache"
  7. "github.com/ovh/cds/sdk"
  8. "github.com/ovh/cds/sdk/log"
  9. )
  10. func (b *bitbucketClient) Commits(ctx context.Context, repo, branch, since, until string) ([]sdk.VCSCommit, error) {
  11. commits := []sdk.VCSCommit{}
  12. project, slug, err := getRepo(repo)
  13. if err != nil {
  14. return nil, sdk.WithStack(err)
  15. }
  16. stashCommits := []Commit{}
  17. var stashCommitsKey = cache.Key("vcs", "bitbucket", b.consumer.URL, repo, "commits", "since@"+since, "until@"+until)
  18. find, err := b.consumer.cache.Get(stashCommitsKey, &stashCommits)
  19. if err != nil {
  20. log.Error(ctx, "cannot get from cache %s: %v", stashCommitsKey, err)
  21. }
  22. if !find {
  23. response := CommitsResponse{}
  24. path := fmt.Sprintf("/projects/%s/repos/%s/commits", project, slug)
  25. params := url.Values{}
  26. if since != "" {
  27. params.Add("since", since)
  28. }
  29. if until != "" {
  30. params.Add("until", until)
  31. }
  32. for {
  33. if ctx.Err() != nil {
  34. break
  35. }
  36. if response.NextPageStart != 0 {
  37. params.Set("start", fmt.Sprintf("%d", response.NextPageStart))
  38. }
  39. if err := b.do(ctx, "GET", "core", path, params, nil, &response, nil); err != nil {
  40. if sdk.ErrorIs(err, sdk.ErrNotFound) {
  41. return nil, nil
  42. }
  43. return nil, sdk.WrapError(err, "Unable to get commits %s", path)
  44. }
  45. stashCommits = append(stashCommits, response.Values...)
  46. if response.IsLastPage {
  47. break
  48. }
  49. }
  50. //3 hours
  51. if err := b.consumer.cache.SetWithTTL(stashCommitsKey, stashCommits, 3*60*60); err != nil {
  52. log.Error(ctx, "cannot SetWithTTL: %s: %v", stashCommitsKey, err)
  53. }
  54. }
  55. urlCommit := b.consumer.URL + "/projects/" + project + "/repos/" + slug + "/commits/"
  56. for _, sc := range stashCommits {
  57. c := sdk.VCSCommit{
  58. Hash: sc.Hash,
  59. Timestamp: sc.Timestamp,
  60. Message: sc.Message,
  61. Author: sdk.VCSAuthor{
  62. Name: sc.Author.Name,
  63. Email: sc.Author.Email,
  64. DisplayName: sc.Author.DisplayName,
  65. },
  66. URL: urlCommit + sc.Hash,
  67. }
  68. if sc.Author.Slug != "" && sc.Author.Slug != "unknownSlug" {
  69. c.Author.Avatar = fmt.Sprintf("%s/users/%s/avatar.png", b.consumer.URL, sc.Author.Slug)
  70. }
  71. commits = append(commits, c)
  72. }
  73. return commits, nil
  74. }
  75. func (b *bitbucketClient) Commit(ctx context.Context, repo, hash string) (sdk.VCSCommit, error) {
  76. commit := sdk.VCSCommit{}
  77. project, slug, err := getRepo(repo)
  78. if err != nil {
  79. return commit, sdk.WithStack(err)
  80. }
  81. var stashURL, _ = url.Parse(b.consumer.URL)
  82. sc := Commit{}
  83. path := fmt.Sprintf("/projects/%s/repos/%s/commits/%s", project, slug, hash)
  84. if err := b.do(ctx, "GET", "core", path, nil, nil, &sc, nil); err != nil {
  85. return commit, sdk.WrapError(err, "Unable to get commit %s", path)
  86. }
  87. urlCommit := stashURL.String() + "/projects/" + project + "/repos/" + slug + "/commits/" + sc.Hash
  88. commit = sdk.VCSCommit{
  89. Hash: sc.Hash,
  90. Timestamp: sc.Timestamp,
  91. Message: sc.Message,
  92. Author: sdk.VCSAuthor{
  93. Name: sc.Author.Name,
  94. Email: sc.Author.Email,
  95. DisplayName: sc.Author.DisplayName,
  96. },
  97. URL: urlCommit,
  98. }
  99. if sc.Author.Slug != "" && sc.Author.Slug != "unknownSlug" {
  100. commit.Author.Avatar = fmt.Sprintf("%s/users/%s/avatar.png", b.consumer.URL, sc.Author.Slug)
  101. }
  102. return commit, nil
  103. }
  104. func (b *bitbucketClient) CommitsBetweenRefs(ctx context.Context, repo, base, head string) ([]sdk.VCSCommit, error) {
  105. var commits []sdk.VCSCommit
  106. project, slug, err := getRepo(repo)
  107. if err != nil {
  108. return nil, sdk.WithStack(err)
  109. }
  110. var stashCommits []Commit
  111. var stashCommitsKey = cache.Key("vcs", "bitbucket", b.consumer.URL, repo, "compare/commits", "from@"+base, "to@"+head)
  112. find, err := b.consumer.cache.Get(stashCommitsKey, &stashCommits)
  113. if err != nil {
  114. log.Error(ctx, "cannot get from cache %s: %v", stashCommitsKey, err)
  115. }
  116. if !find {
  117. response := CommitsResponse{}
  118. path := fmt.Sprintf("/projects/%s/repos/%s/compare/commits", project, slug)
  119. params := url.Values{}
  120. if base != "" {
  121. params.Add("from", base)
  122. }
  123. if head != "" {
  124. params.Add("to", head)
  125. }
  126. for {
  127. if response.NextPageStart != 0 {
  128. params.Set("start", fmt.Sprintf("%d", response.NextPageStart))
  129. }
  130. if err := b.do(ctx, "GET", "core", path, params, nil, &response, nil); err != nil {
  131. if sdk.ErrorIs(err, sdk.ErrNotFound) {
  132. return nil, nil
  133. }
  134. return nil, sdk.WrapError(err, "Unable to get commits %s", path)
  135. }
  136. stashCommits = append(stashCommits, response.Values...)
  137. if response.IsLastPage {
  138. break
  139. }
  140. }
  141. //3 hours
  142. if err := b.consumer.cache.SetWithTTL(stashCommitsKey, stashCommits, 3*60*60); err != nil {
  143. log.Error(ctx, "cannot SetWithTTL: %s: %v", stashCommitsKey, err)
  144. }
  145. }
  146. urlCommit := b.consumer.URL + "/projects/" + project + "/repos/" + slug + "/compare/commits"
  147. for _, sc := range stashCommits {
  148. c := sdk.VCSCommit{
  149. Hash: sc.Hash,
  150. Timestamp: sc.Timestamp,
  151. Message: sc.Message,
  152. Author: sdk.VCSAuthor{
  153. Name: sc.Author.Name,
  154. Email: sc.Author.Email,
  155. DisplayName: sc.Author.DisplayName,
  156. },
  157. URL: urlCommit + sc.Hash,
  158. }
  159. if sc.Author.Slug != "" && sc.Author.Slug != "unknownSlug" {
  160. c.Author.Avatar = fmt.Sprintf("%s/users/%s/avatar.png", b.consumer.URL, sc.Author.Slug)
  161. }
  162. commits = append(commits, c)
  163. }
  164. return commits, nil
  165. }