Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

admin.go 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // Copyright 2016 The Gogs Authors. All rights reserved.
  2. // Copyright 2016 The Gitea Authors. All rights reserved.
  3. // SPDX-License-Identifier: MIT
  4. package cmd
  5. import (
  6. "context"
  7. "fmt"
  8. "code.gitea.io/gitea/models/db"
  9. repo_model "code.gitea.io/gitea/models/repo"
  10. "code.gitea.io/gitea/modules/git"
  11. "code.gitea.io/gitea/modules/gitrepo"
  12. "code.gitea.io/gitea/modules/log"
  13. repo_module "code.gitea.io/gitea/modules/repository"
  14. "github.com/urfave/cli/v2"
  15. )
  16. var (
  17. // CmdAdmin represents the available admin sub-command.
  18. CmdAdmin = &cli.Command{
  19. Name: "admin",
  20. Usage: "Perform common administrative operations",
  21. Subcommands: []*cli.Command{
  22. subcmdUser,
  23. subcmdRepoSyncReleases,
  24. subcmdRegenerate,
  25. subcmdAuth,
  26. subcmdSendMail,
  27. },
  28. }
  29. subcmdRepoSyncReleases = &cli.Command{
  30. Name: "repo-sync-releases",
  31. Usage: "Synchronize repository releases with tags",
  32. Action: runRepoSyncReleases,
  33. }
  34. subcmdRegenerate = &cli.Command{
  35. Name: "regenerate",
  36. Usage: "Regenerate specific files",
  37. Subcommands: []*cli.Command{
  38. microcmdRegenHooks,
  39. microcmdRegenKeys,
  40. },
  41. }
  42. subcmdAuth = &cli.Command{
  43. Name: "auth",
  44. Usage: "Modify external auth providers",
  45. Subcommands: []*cli.Command{
  46. microcmdAuthAddOauth,
  47. microcmdAuthUpdateOauth,
  48. microcmdAuthAddLdapBindDn,
  49. microcmdAuthUpdateLdapBindDn,
  50. microcmdAuthAddLdapSimpleAuth,
  51. microcmdAuthUpdateLdapSimpleAuth,
  52. microcmdAuthAddSMTP,
  53. microcmdAuthUpdateSMTP,
  54. microcmdAuthList,
  55. microcmdAuthDelete,
  56. },
  57. }
  58. subcmdSendMail = &cli.Command{
  59. Name: "sendmail",
  60. Usage: "Send a message to all users",
  61. Action: runSendMail,
  62. Flags: []cli.Flag{
  63. &cli.StringFlag{
  64. Name: "title",
  65. Usage: `a title of a message`,
  66. Value: "",
  67. },
  68. &cli.StringFlag{
  69. Name: "content",
  70. Usage: "a content of a message",
  71. Value: "",
  72. },
  73. &cli.BoolFlag{
  74. Name: "force",
  75. Aliases: []string{"f"},
  76. Usage: "A flag to bypass a confirmation step",
  77. },
  78. },
  79. }
  80. idFlag = &cli.Int64Flag{
  81. Name: "id",
  82. Usage: "ID of authentication source",
  83. }
  84. )
  85. func runRepoSyncReleases(_ *cli.Context) error {
  86. ctx, cancel := installSignals()
  87. defer cancel()
  88. if err := initDB(ctx); err != nil {
  89. return err
  90. }
  91. if err := git.InitSimple(ctx); err != nil {
  92. return err
  93. }
  94. log.Trace("Synchronizing repository releases (this may take a while)")
  95. for page := 1; ; page++ {
  96. repos, count, err := repo_model.SearchRepositoryByName(ctx, &repo_model.SearchRepoOptions{
  97. ListOptions: db.ListOptions{
  98. PageSize: repo_model.RepositoryListDefaultPageSize,
  99. Page: page,
  100. },
  101. Private: true,
  102. })
  103. if err != nil {
  104. return fmt.Errorf("SearchRepositoryByName: %w", err)
  105. }
  106. if len(repos) == 0 {
  107. break
  108. }
  109. log.Trace("Processing next %d repos of %d", len(repos), count)
  110. for _, repo := range repos {
  111. log.Trace("Synchronizing repo %s with path %s", repo.FullName(), repo.RepoPath())
  112. gitRepo, err := gitrepo.OpenRepository(ctx, repo)
  113. if err != nil {
  114. log.Warn("OpenRepository: %v", err)
  115. continue
  116. }
  117. oldnum, err := getReleaseCount(ctx, repo.ID)
  118. if err != nil {
  119. log.Warn(" GetReleaseCountByRepoID: %v", err)
  120. }
  121. log.Trace(" currentNumReleases is %d, running SyncReleasesWithTags", oldnum)
  122. if err = repo_module.SyncReleasesWithTags(ctx, repo, gitRepo); err != nil {
  123. log.Warn(" SyncReleasesWithTags: %v", err)
  124. gitRepo.Close()
  125. continue
  126. }
  127. count, err = getReleaseCount(ctx, repo.ID)
  128. if err != nil {
  129. log.Warn(" GetReleaseCountByRepoID: %v", err)
  130. gitRepo.Close()
  131. continue
  132. }
  133. log.Trace(" repo %s releases synchronized to tags: from %d to %d",
  134. repo.FullName(), oldnum, count)
  135. gitRepo.Close()
  136. }
  137. }
  138. return nil
  139. }
  140. func getReleaseCount(ctx context.Context, id int64) (int64, error) {
  141. return db.Count[repo_model.Release](
  142. ctx,
  143. repo_model.FindReleasesOptions{
  144. RepoID: id,
  145. IncludeTags: true,
  146. },
  147. )
  148. }