gitea源码

v276.go 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package v1_21
  4. import (
  5. "context"
  6. "fmt"
  7. "path/filepath"
  8. "strings"
  9. "code.gitea.io/gitea/modules/git"
  10. giturl "code.gitea.io/gitea/modules/git/url"
  11. "code.gitea.io/gitea/modules/setting"
  12. "code.gitea.io/gitea/modules/util"
  13. "xorm.io/xorm"
  14. )
  15. func AddRemoteAddressToMirrors(x *xorm.Engine) error {
  16. type Mirror struct {
  17. RemoteAddress string `xorm:"VARCHAR(2048)"`
  18. }
  19. type PushMirror struct {
  20. RemoteAddress string `xorm:"VARCHAR(2048)"`
  21. }
  22. if err := x.Sync(new(Mirror), new(PushMirror)); err != nil {
  23. return err
  24. }
  25. if err := migratePullMirrors(x); err != nil {
  26. return err
  27. }
  28. return migratePushMirrors(x)
  29. }
  30. func migratePullMirrors(x *xorm.Engine) error {
  31. type Mirror struct {
  32. ID int64 `xorm:"pk autoincr"`
  33. RepoID int64 `xorm:"INDEX"`
  34. RemoteAddress string `xorm:"VARCHAR(2048)"`
  35. RepoOwner string
  36. RepoName string
  37. }
  38. sess := x.NewSession()
  39. defer sess.Close()
  40. if err := sess.Begin(); err != nil {
  41. return err
  42. }
  43. limit := setting.Database.IterateBufferSize
  44. if limit <= 0 {
  45. limit = 50
  46. }
  47. start := 0
  48. for {
  49. var mirrors []Mirror
  50. if err := sess.Select("mirror.id, mirror.repo_id, mirror.remote_address, repository.owner_name as repo_owner, repository.name as repo_name").
  51. Join("INNER", "repository", "repository.id = mirror.repo_id").
  52. Limit(limit, start).Find(&mirrors); err != nil {
  53. return err
  54. }
  55. if len(mirrors) == 0 {
  56. break
  57. }
  58. start += len(mirrors)
  59. for _, m := range mirrors {
  60. remoteAddress, err := getRemoteAddress(m.RepoOwner, m.RepoName, "origin")
  61. if err != nil {
  62. return err
  63. }
  64. m.RemoteAddress = remoteAddress
  65. if _, err = sess.ID(m.ID).Cols("remote_address").Update(m); err != nil {
  66. return err
  67. }
  68. }
  69. if start%1000 == 0 { // avoid a too big transaction
  70. if err := sess.Commit(); err != nil {
  71. return err
  72. }
  73. if err := sess.Begin(); err != nil {
  74. return err
  75. }
  76. }
  77. }
  78. return sess.Commit()
  79. }
  80. func migratePushMirrors(x *xorm.Engine) error {
  81. type PushMirror struct {
  82. ID int64 `xorm:"pk autoincr"`
  83. RepoID int64 `xorm:"INDEX"`
  84. RemoteName string
  85. RemoteAddress string `xorm:"VARCHAR(2048)"`
  86. RepoOwner string
  87. RepoName string
  88. }
  89. sess := x.NewSession()
  90. defer sess.Close()
  91. if err := sess.Begin(); err != nil {
  92. return err
  93. }
  94. limit := setting.Database.IterateBufferSize
  95. if limit <= 0 {
  96. limit = 50
  97. }
  98. start := 0
  99. for {
  100. var mirrors []PushMirror
  101. if err := sess.Select("push_mirror.id, push_mirror.repo_id, push_mirror.remote_name, push_mirror.remote_address, repository.owner_name as repo_owner, repository.name as repo_name").
  102. Join("INNER", "repository", "repository.id = push_mirror.repo_id").
  103. Limit(limit, start).Find(&mirrors); err != nil {
  104. return err
  105. }
  106. if len(mirrors) == 0 {
  107. break
  108. }
  109. start += len(mirrors)
  110. for _, m := range mirrors {
  111. remoteAddress, err := getRemoteAddress(m.RepoOwner, m.RepoName, m.RemoteName)
  112. if err != nil {
  113. return err
  114. }
  115. m.RemoteAddress = remoteAddress
  116. if _, err = sess.ID(m.ID).Cols("remote_address").Update(m); err != nil {
  117. return err
  118. }
  119. }
  120. if start%1000 == 0 { // avoid a too big transaction
  121. if err := sess.Commit(); err != nil {
  122. return err
  123. }
  124. if err := sess.Begin(); err != nil {
  125. return err
  126. }
  127. }
  128. }
  129. return sess.Commit()
  130. }
  131. func getRemoteAddress(ownerName, repoName, remoteName string) (string, error) {
  132. repoPath := filepath.Join(setting.RepoRootPath, strings.ToLower(ownerName), strings.ToLower(repoName)+".git")
  133. if exist, _ := util.IsExist(repoPath); !exist {
  134. return "", nil
  135. }
  136. remoteURL, err := git.GetRemoteAddress(context.Background(), repoPath, remoteName)
  137. if err != nil {
  138. return "", fmt.Errorf("get remote %s's address of %s/%s failed: %v", remoteName, ownerName, repoName, err)
  139. }
  140. u, err := giturl.ParseGitURL(remoteURL)
  141. if err != nil {
  142. return "", err
  143. }
  144. u.User = nil
  145. return u.String(), nil
  146. }