You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

admin.go 3.8KB

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