2016-08-14 02:11:52 +03:00
// Copyright 2016 The Gogs Authors. All rights reserved.
2016-12-21 15:13:17 +03:00
// Copyright 2016 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2016-08-14 02:11:52 +03:00
package cmd
import (
2023-07-24 06:47:27 +03:00
"context"
2016-08-14 02:11:52 +03:00
"fmt"
2021-09-24 14:32:56 +03:00
"code.gitea.io/gitea/models/db"
2022-06-06 11:01:49 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2019-03-27 12:33:00 +03:00
"code.gitea.io/gitea/modules/git"
2017-12-31 17:45:46 +03:00
"code.gitea.io/gitea/modules/log"
2020-01-20 23:01:19 +03:00
repo_module "code.gitea.io/gitea/modules/repository"
2017-04-12 10:44:54 +03:00
2023-07-21 12:28:19 +03:00
"github.com/urfave/cli/v2"
2016-08-14 02:11:52 +03:00
)
var (
2016-11-04 14:42:18 +03:00
// CmdAdmin represents the available admin sub-command.
2023-07-21 12:28:19 +03:00
CmdAdmin = & cli . Command {
2016-08-14 02:11:52 +03:00
Name : "admin" ,
2023-12-15 18:49:01 +03:00
Usage : "Perform common administrative operations" ,
2023-07-21 12:28:19 +03:00
Subcommands : [ ] * cli . Command {
2020-10-16 05:48:38 +03:00
subcmdUser ,
2017-12-31 17:45:46 +03:00
subcmdRepoSyncReleases ,
2018-05-17 04:35:07 +03:00
subcmdRegenerate ,
2018-09-12 17:46:02 +03:00
subcmdAuth ,
2020-10-24 23:38:14 +03:00
subcmdSendMail ,
2016-08-14 02:11:52 +03:00
} ,
}
2023-07-21 12:28:19 +03:00
subcmdRepoSyncReleases = & cli . Command {
2017-12-31 17:45:46 +03:00
Name : "repo-sync-releases" ,
Usage : "Synchronize repository releases with tags" ,
Action : runRepoSyncReleases ,
}
2018-05-17 04:35:07 +03:00
2023-07-21 12:28:19 +03:00
subcmdRegenerate = & cli . Command {
2018-05-17 04:35:07 +03:00
Name : "regenerate" ,
Usage : "Regenerate specific files" ,
2023-07-21 12:28:19 +03:00
Subcommands : [ ] * cli . Command {
2018-05-17 04:35:07 +03:00
microcmdRegenHooks ,
microcmdRegenKeys ,
} ,
}
2023-07-21 12:28:19 +03:00
subcmdAuth = & cli . Command {
2018-09-12 17:46:02 +03:00
Name : "auth" ,
Usage : "Modify external auth providers" ,
2023-07-21 12:28:19 +03:00
Subcommands : [ ] * cli . Command {
2018-09-12 17:46:02 +03:00
microcmdAuthAddOauth ,
microcmdAuthUpdateOauth ,
2023-09-27 15:25:38 +03:00
microcmdAuthAddLdapBindDn ,
microcmdAuthUpdateLdapBindDn ,
microcmdAuthAddLdapSimpleAuth ,
microcmdAuthUpdateLdapSimpleAuth ,
2022-01-13 01:54:53 +03:00
microcmdAuthAddSMTP ,
microcmdAuthUpdateSMTP ,
2018-09-12 17:46:02 +03:00
microcmdAuthList ,
microcmdAuthDelete ,
} ,
}
2023-07-21 12:28:19 +03:00
subcmdSendMail = & cli . Command {
2020-10-24 23:38:14 +03:00
Name : "sendmail" ,
Usage : "Send a message to all users" ,
Action : runSendMail ,
Flags : [ ] cli . Flag {
2023-07-21 12:28:19 +03:00
& cli . StringFlag {
2020-10-24 23:38:14 +03:00
Name : "title" ,
Usage : ` a title of a message ` ,
Value : "" ,
} ,
2023-07-21 12:28:19 +03:00
& cli . StringFlag {
2020-10-24 23:38:14 +03:00
Name : "content" ,
Usage : "a content of a message" ,
Value : "" ,
} ,
2023-07-21 12:28:19 +03:00
& cli . BoolFlag {
Name : "force" ,
Aliases : [ ] string { "f" } ,
Usage : "A flag to bypass a confirmation step" ,
2020-10-24 23:38:14 +03:00
} ,
} ,
}
2022-01-13 01:54:53 +03:00
2023-09-27 15:25:38 +03:00
idFlag = & cli . Int64Flag {
Name : "id" ,
Usage : "ID of authentication source" ,
2022-01-13 01:54:53 +03:00
}
2016-08-14 02:11:52 +03:00
)
2021-04-09 10:40:34 +03:00
func runRepoSyncReleases ( _ * cli . Context ) error {
2021-11-07 06:11:27 +03:00
ctx , cancel := installSignals ( )
defer cancel ( )
if err := initDB ( ctx ) ; err != nil {
2018-01-13 01:16:49 +03:00
return err
2017-12-31 17:45:46 +03:00
}
2023-08-11 01:42:48 +03:00
if err := git . InitSimple ( ctx ) ; err != nil {
return err
}
2017-12-31 17:45:46 +03:00
log . Trace ( "Synchronizing repository releases (this may take a while)" )
for page := 1 ; ; page ++ {
2022-11-19 11:12:33 +03:00
repos , count , err := repo_model . SearchRepositoryByName ( ctx , & repo_model . SearchRepoOptions {
2021-09-24 14:32:56 +03:00
ListOptions : db . ListOptions {
2022-06-06 11:01:49 +03:00
PageSize : repo_model . RepositoryListDefaultPageSize ,
2020-01-24 22:00:29 +03:00
Page : page ,
} ,
Private : true ,
2017-12-31 17:45:46 +03:00
} )
if err != nil {
2022-10-24 22:29:17 +03:00
return fmt . Errorf ( "SearchRepositoryByName: %w" , err )
2017-12-31 17:45:46 +03:00
}
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 ( ) )
2022-03-29 22:13:41 +03:00
gitRepo , err := git . OpenRepository ( ctx , repo . RepoPath ( ) )
2017-12-31 17:45:46 +03:00
if err != nil {
log . Warn ( "OpenRepository: %v" , err )
continue
}
2023-07-24 06:47:27 +03:00
oldnum , err := getReleaseCount ( ctx , repo . ID )
2017-12-31 17:45:46 +03:00
if err != nil {
log . Warn ( " GetReleaseCountByRepoID: %v" , err )
}
log . Trace ( " currentNumReleases is %d, running SyncReleasesWithTags" , oldnum )
2023-09-25 16:17:37 +03:00
if err = repo_module . SyncReleasesWithTags ( ctx , repo , gitRepo ) ; err != nil {
2017-12-31 17:45:46 +03:00
log . Warn ( " SyncReleasesWithTags: %v" , err )
2019-11-13 10:01:19 +03:00
gitRepo . Close ( )
2017-12-31 17:45:46 +03:00
continue
}
2023-07-24 06:47:27 +03:00
count , err = getReleaseCount ( ctx , repo . ID )
2017-12-31 17:45:46 +03:00
if err != nil {
log . Warn ( " GetReleaseCountByRepoID: %v" , err )
2019-11-13 10:01:19 +03:00
gitRepo . Close ( )
2017-12-31 17:45:46 +03:00
continue
}
log . Trace ( " repo %s releases synchronized to tags: from %d to %d" ,
repo . FullName ( ) , oldnum , count )
2019-11-13 10:01:19 +03:00
gitRepo . Close ( )
2017-12-31 17:45:46 +03:00
}
}
return nil
}
2018-01-13 01:16:49 +03:00
2023-07-24 06:47:27 +03:00
func getReleaseCount ( ctx context . Context , id int64 ) ( int64 , error ) {
2024-01-15 05:19:25 +03:00
return db . Count [ repo_model . Release ] (
2023-07-24 06:47:27 +03:00
ctx ,
2022-08-25 05:31:57 +03:00
repo_model . FindReleasesOptions {
2024-01-15 05:19:25 +03:00
RepoID : id ,
2018-01-13 01:16:49 +03:00
IncludeTags : true ,
} ,
)
}