123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- // Copyright 2016 The Gogs Authors. All rights reserved.
- // Copyright 2016 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package cmd
-
- import (
- "context"
- "fmt"
-
- "code.gitea.io/gitea/models/db"
- repo_model "code.gitea.io/gitea/models/repo"
- "code.gitea.io/gitea/modules/git"
- "code.gitea.io/gitea/modules/gitrepo"
- "code.gitea.io/gitea/modules/log"
- repo_module "code.gitea.io/gitea/modules/repository"
-
- "github.com/urfave/cli/v2"
- )
-
- var (
- // CmdAdmin represents the available admin sub-command.
- CmdAdmin = &cli.Command{
- Name: "admin",
- Usage: "Perform common administrative operations",
- Subcommands: []*cli.Command{
- subcmdUser,
- subcmdRepoSyncReleases,
- subcmdRegenerate,
- subcmdAuth,
- subcmdSendMail,
- },
- }
-
- subcmdRepoSyncReleases = &cli.Command{
- Name: "repo-sync-releases",
- Usage: "Synchronize repository releases with tags",
- Action: runRepoSyncReleases,
- }
-
- subcmdRegenerate = &cli.Command{
- Name: "regenerate",
- Usage: "Regenerate specific files",
- Subcommands: []*cli.Command{
- microcmdRegenHooks,
- microcmdRegenKeys,
- },
- }
-
- subcmdAuth = &cli.Command{
- Name: "auth",
- Usage: "Modify external auth providers",
- Subcommands: []*cli.Command{
- microcmdAuthAddOauth,
- microcmdAuthUpdateOauth,
- microcmdAuthAddLdapBindDn,
- microcmdAuthUpdateLdapBindDn,
- microcmdAuthAddLdapSimpleAuth,
- microcmdAuthUpdateLdapSimpleAuth,
- microcmdAuthAddSMTP,
- microcmdAuthUpdateSMTP,
- microcmdAuthList,
- microcmdAuthDelete,
- },
- }
-
- subcmdSendMail = &cli.Command{
- Name: "sendmail",
- Usage: "Send a message to all users",
- Action: runSendMail,
- Flags: []cli.Flag{
- &cli.StringFlag{
- Name: "title",
- Usage: `a title of a message`,
- Value: "",
- },
- &cli.StringFlag{
- Name: "content",
- Usage: "a content of a message",
- Value: "",
- },
- &cli.BoolFlag{
- Name: "force",
- Aliases: []string{"f"},
- Usage: "A flag to bypass a confirmation step",
- },
- },
- }
-
- idFlag = &cli.Int64Flag{
- Name: "id",
- Usage: "ID of authentication source",
- }
- )
-
- func runRepoSyncReleases(_ *cli.Context) error {
- ctx, cancel := installSignals()
- defer cancel()
-
- if err := initDB(ctx); err != nil {
- return err
- }
-
- if err := git.InitSimple(ctx); err != nil {
- return err
- }
-
- log.Trace("Synchronizing repository releases (this may take a while)")
- for page := 1; ; page++ {
- repos, count, err := repo_model.SearchRepositoryByName(ctx, &repo_model.SearchRepoOptions{
- ListOptions: db.ListOptions{
- PageSize: repo_model.RepositoryListDefaultPageSize,
- Page: page,
- },
- Private: true,
- })
- if err != nil {
- return fmt.Errorf("SearchRepositoryByName: %w", err)
- }
- if len(repos) == 0 {
- break
- }
- log.Trace("Processing next %d repos of %d", len(repos), count)
- for _, repo := range repos {
- log.Trace("Synchronizing repo %s with path %s", repo.FullName(), repo.RepoPath())
- gitRepo, err := gitrepo.OpenRepository(ctx, repo)
- if err != nil {
- log.Warn("OpenRepository: %v", err)
- continue
- }
-
- oldnum, err := getReleaseCount(ctx, repo.ID)
- if err != nil {
- log.Warn(" GetReleaseCountByRepoID: %v", err)
- }
- log.Trace(" currentNumReleases is %d, running SyncReleasesWithTags", oldnum)
-
- if err = repo_module.SyncReleasesWithTags(ctx, repo, gitRepo); err != nil {
- log.Warn(" SyncReleasesWithTags: %v", err)
- gitRepo.Close()
- continue
- }
-
- count, err = getReleaseCount(ctx, repo.ID)
- if err != nil {
- log.Warn(" GetReleaseCountByRepoID: %v", err)
- gitRepo.Close()
- continue
- }
-
- log.Trace(" repo %s releases synchronized to tags: from %d to %d",
- repo.FullName(), oldnum, count)
- gitRepo.Close()
- }
- }
-
- return nil
- }
-
- func getReleaseCount(ctx context.Context, id int64) (int64, error) {
- return db.Count[repo_model.Release](
- ctx,
- repo_model.FindReleasesOptions{
- RepoID: id,
- IncludeTags: true,
- },
- )
- }
|