mirror of
https://github.com/go-gitea/gitea.git
synced 2025-06-21 14:10:30 +02:00
Similar to #34544, this PR changes the `opts` argument in `SearchRepositoryByName()` to be passed by value instead of by pointer, as its mutations do not escape the function scope and are not used elsewhere. This simplifies reasoning about the function and avoids unnecessary pointer usage. This insight emerged during an initial attempt to refactor `RenderUserSearch()`, which currently intermixes multiple concerns. --------- Co-authored-by: Philip Peterson <philip-peterson@users.noreply.github.com>
169 lines
3.8 KiB
Go
169 lines
3.8 KiB
Go
// 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,
|
|
},
|
|
)
|
|
}
|