models_gin.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package db
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/http"
  6. "os"
  7. "path/filepath"
  8. "strings"
  9. "github.com/G-Node/git-module"
  10. "github.com/G-Node/gogs/internal/setting"
  11. "github.com/G-Node/libgin/libgin"
  12. "github.com/G-Node/libgin/libgin/annex"
  13. log "gopkg.in/clog.v1"
  14. )
  15. // StartIndexing sends an indexing request to the configured indexing service
  16. // for a repository.
  17. func StartIndexing(repo Repository) {
  18. go func() {
  19. if setting.Search.IndexURL == "" {
  20. log.Trace("Indexing not enabled")
  21. return
  22. }
  23. log.Trace("Indexing repository %d", repo.ID)
  24. ireq := libgin.IndexRequest{
  25. RepoID: repo.ID,
  26. RepoPath: repo.FullName(),
  27. }
  28. data, err := json.Marshal(ireq)
  29. if err != nil {
  30. log.Error(2, "Could not marshal index request: %v", err)
  31. return
  32. }
  33. key := []byte(setting.Search.Key)
  34. encdata, err := libgin.EncryptString(key, string(data))
  35. if err != nil {
  36. log.Error(2, "Could not encrypt index request: %v", err)
  37. }
  38. req, err := http.NewRequest(http.MethodPost, setting.Search.IndexURL, strings.NewReader(encdata))
  39. if err != nil {
  40. log.Error(2, "Error creating index request")
  41. }
  42. client := http.Client{}
  43. resp, err := client.Do(req)
  44. if err != nil || resp.StatusCode != http.StatusOK {
  45. log.Error(2, "Error submitting index request for [%d: %s]: %v", repo.ID, repo.FullName(), err)
  46. return
  47. }
  48. }()
  49. }
  50. // RebuildIndex sends all repositories to the indexing service to be indexed.
  51. func RebuildIndex() error {
  52. indexurl := setting.Search.IndexURL
  53. if indexurl == "" {
  54. return fmt.Errorf("Indexing service not configured")
  55. }
  56. // collect all repo ID -> Path mappings directly from the DB
  57. repos := make(RepositoryList, 0, 100)
  58. if err := x.Find(&repos); err != nil {
  59. return fmt.Errorf("get all repos: %v", err)
  60. }
  61. log.Trace("Found %d repositories to index", len(repos))
  62. for _, repo := range repos {
  63. StartIndexing(*repo)
  64. }
  65. log.Trace("Rebuilding search index")
  66. return nil
  67. }
  68. func annexUninit(path string) {
  69. // walker sets the permission for any file found to 0660, to allow deletion
  70. var mode os.FileMode
  71. walker := func(path string, info os.FileInfo, err error) error {
  72. if info == nil {
  73. return nil
  74. }
  75. mode = 0660
  76. if info.IsDir() {
  77. mode = 0770
  78. }
  79. if err := os.Chmod(path, mode); err != nil {
  80. log.Error(3, "failed to change permissions on '%s': %v", path, err)
  81. }
  82. return nil
  83. }
  84. log.Trace("Uninit annex at '%s'", path)
  85. if msg, err := annex.Uninit(path); err != nil {
  86. log.Error(3, "uninit failed: %v (%s)", err, msg)
  87. if werr := filepath.Walk(path, walker); werr != nil {
  88. log.Error(3, "file permission change failed: %v", werr)
  89. }
  90. }
  91. }
  92. func annexSetup(path string) {
  93. log.Trace("Running annex add (with filesize filter) in '%s'", path)
  94. // Initialise annex in case it's a new repository
  95. if msg, err := annex.Init(path); err != nil {
  96. log.Error(2, "Annex init failed: %v (%s)", err, msg)
  97. return
  98. }
  99. // Upgrade to v8 in case the directory was here before and wasn't cleaned up properly
  100. if msg, err := annex.Upgrade(path); err != nil {
  101. log.Error(2, "Annex upgrade failed: %v (%s)", err, msg)
  102. return
  103. }
  104. // Enable addunlocked for annex v8
  105. if msg, err := annex.SetAddUnlocked(path); err != nil {
  106. log.Error(2, "Failed to set 'addunlocked' annex option: %v (%s)", err, msg)
  107. }
  108. // Set MD5 as default backend
  109. if msg, err := annex.MD5(path); err != nil {
  110. log.Error(2, "Failed to set default backend to 'MD5': %v (%s)", err, msg)
  111. }
  112. // Set size filter in config
  113. if msg, err := annex.SetAnnexSizeFilter(path, setting.Repository.Upload.AnnexFileMinSize*annex.MEGABYTE); err != nil {
  114. log.Error(2, "Failed to set size filter for annex: %v (%s)", err, msg)
  115. }
  116. }
  117. func annexSync(path string) error {
  118. log.Trace("Synchronising annexed data")
  119. if msg, err := annex.ASync(path, "--content"); err != nil {
  120. // TODO: This will also DOWNLOAD content, which is unnecessary for a simple upload
  121. // TODO: Use gin-cli upload function instead
  122. log.Error(2, "Annex sync failed: %v (%s)", err, msg)
  123. return fmt.Errorf("git annex sync --content [%s]", path)
  124. }
  125. // run twice; required if remote annex is not initialised
  126. if msg, err := annex.ASync(path, "--content"); err != nil {
  127. log.Error(2, "Annex sync failed: %v (%s)", err, msg)
  128. return fmt.Errorf("git annex sync --content [%s]", path)
  129. }
  130. return nil
  131. }
  132. func annexAdd(repoPath string, all bool, files ...string) error {
  133. cmd := git.NewCommand("annex", "add")
  134. if all {
  135. cmd.AddArguments(".")
  136. }
  137. _, err := cmd.AddArguments(files...).RunInDir(repoPath)
  138. return err
  139. }
  140. func annexUpload(repoPath, remote string) error {
  141. log.Trace("Synchronising annex info")
  142. if msg, err := git.NewCommand("annex", "sync").RunInDir(repoPath); err != nil {
  143. log.Error(2, "git-annex sync failed: %v (%s)", err, msg)
  144. }
  145. log.Trace("Uploading annexed data")
  146. cmd := git.NewCommand("annex", "copy", fmt.Sprintf("--to=%s", remote), "--all")
  147. if msg, err := cmd.RunInDir(repoPath); err != nil {
  148. log.Error(2, "git-annex copy failed: %v (%s)", err, msg)
  149. return fmt.Errorf("git annex copy [%s]", repoPath)
  150. }
  151. return nil
  152. }