models_gin.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package models
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "os"
  8. "path/filepath"
  9. gannex "github.com/G-Node/go-annex"
  10. "github.com/G-Node/gogs/pkg/setting"
  11. log "gopkg.in/clog.v1"
  12. )
  13. // StartIndexing sends an indexing request to the configured indexing service
  14. // for a repository.
  15. func StartIndexing(user, owner *User, repo *Repository) {
  16. if setting.Search.IndexURL == "" {
  17. log.Trace("Indexing not enabled")
  18. return
  19. }
  20. var ireq struct{ RepoID, RepoPath string }
  21. ireq.RepoID = fmt.Sprintf("%d", repo.ID)
  22. ireq.RepoPath = repo.FullName()
  23. data, err := json.Marshal(ireq)
  24. if err != nil {
  25. log.Trace("could not marshal index request :%+v", err)
  26. return
  27. }
  28. req, _ := http.NewRequest(http.MethodPost, setting.Search.IndexURL, bytes.NewReader(data))
  29. client := http.Client{}
  30. resp, err := client.Do(req)
  31. if err != nil || resp.StatusCode != http.StatusOK {
  32. log.Trace("Error doing index request: %+v", err)
  33. return
  34. }
  35. }
  36. func annexUninit(path string) {
  37. // walker sets the permission for any file found to 0600, to allow deletion
  38. var mode os.FileMode
  39. walker := func(path string, info os.FileInfo, err error) error {
  40. if info == nil {
  41. return nil
  42. }
  43. mode = 0660
  44. if info.IsDir() {
  45. mode = 0770
  46. }
  47. if err := os.Chmod(path, mode); err != nil {
  48. log.Error(3, "failed to change permissions on '%s': %v", path, err)
  49. }
  50. return nil
  51. }
  52. log.Trace("Uninit annex at '%s'", path)
  53. if msg, err := gannex.Uninit(path); err != nil {
  54. log.Error(3, "uninit failed: %v (%s)", err, msg)
  55. if werr := filepath.Walk(path, walker); werr != nil {
  56. log.Error(3, "file permission change failed: %v", werr)
  57. }
  58. }
  59. }
  60. func annexAdd(path string) {
  61. log.Trace("Running annex add (with filesize filter) in '%s'", path)
  62. // Initialise annex in case it's a new repository
  63. if msg, err := gannex.Init(path, "--version=7"); err != nil {
  64. log.Error(1, "Annex init failed: %v (%s)", err, msg)
  65. return
  66. }
  67. // Enable addunlocked for annex v7
  68. if msg, err := gannex.SetAddUnlocked(path); err != nil {
  69. log.Error(1, "Failed to set 'addunlocked' annex option: %v (%s)", err, msg)
  70. }
  71. // Set MD5 as default backend
  72. if msg, err := gannex.MD5(path); err != nil {
  73. log.Error(1, "Failed to set default backend to 'MD5': %v (%s)", err, msg)
  74. }
  75. sizefilterflag := fmt.Sprintf("--largerthan=%d", setting.Repository.Upload.AnnexFileMinSize*gannex.MEGABYTE)
  76. if msg, err := gannex.Add(path, sizefilterflag); err != nil {
  77. log.Error(1, "Annex add failed with error: %v (%s)", err, msg)
  78. }
  79. }
  80. func annexSync(path string) error {
  81. log.Trace("Synchronising annexed data")
  82. if msg, err := gannex.ASync(path, "--content"); err != nil {
  83. // TODO: This will also DOWNLOAD content, which is unnecessary for a simple upload
  84. // TODO: Use gin-cli upload function instead
  85. log.Error(1, "Annex sync failed: %v (%s)", err, msg)
  86. return fmt.Errorf("git annex sync --content [%s]", path)
  87. }
  88. return nil
  89. }