mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Add repo-sync-releases admin command (#3254)
* Add repo-sync-releases admin command Will help recovering corrupted database, see #3247 * Load repos in chunks of 10, exit with error if unable to get a list, scan private repos, fix typo * Fix debug output about num releases * Introduce RepositoryListDefaultPageSize constant, set to 64 Use it from the new admin command * Use RepositoryListDefaultPageSize in more places * Document RepositoryListDefaultPageSize
This commit is contained in:
		
				
					committed by
					
						
						Lauris BH
					
				
			
			
				
	
			
			
			
						parent
						
							ae9cc8f972
						
					
				
				
					commit
					8cd987af0c
				
			
							
								
								
									
										75
									
								
								cmd/admin.go
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								cmd/admin.go
									
									
									
									
									
								
							@@ -8,7 +8,9 @@ package cmd
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/git"
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
 | 
			
		||||
	"github.com/urfave/cli"
 | 
			
		||||
@@ -24,6 +26,7 @@ to make automatic initialization process more smoothly`,
 | 
			
		||||
		Subcommands: []cli.Command{
 | 
			
		||||
			subcmdCreateUser,
 | 
			
		||||
			subcmdChangePassword,
 | 
			
		||||
			subcmdRepoSyncReleases,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -76,6 +79,12 @@ to make automatic initialization process more smoothly`,
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	subcmdRepoSyncReleases = cli.Command{
 | 
			
		||||
		Name:   "repo-sync-releases",
 | 
			
		||||
		Usage:  "Synchronize repository releases with tags",
 | 
			
		||||
		Action: runRepoSyncReleases,
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func runChangePassword(c *cli.Context) error {
 | 
			
		||||
@@ -145,3 +154,69 @@ func runCreateUser(c *cli.Context) error {
 | 
			
		||||
	fmt.Printf("New user '%s' has been successfully created!\n", c.String("name"))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func runRepoSyncReleases(c *cli.Context) error {
 | 
			
		||||
 | 
			
		||||
	setting.NewContext()
 | 
			
		||||
	models.LoadConfigs()
 | 
			
		||||
 | 
			
		||||
	setting.NewXORMLogService(false)
 | 
			
		||||
	if err := models.SetEngine(); err != nil {
 | 
			
		||||
		return fmt.Errorf("models.SetEngine: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Trace("Synchronizing repository releases (this may take a while)")
 | 
			
		||||
	for page := 1; ; page++ {
 | 
			
		||||
		repos, count, err := models.SearchRepositoryByName(&models.SearchRepoOptions{
 | 
			
		||||
			Page:     page,
 | 
			
		||||
			PageSize: models.RepositoryListDefaultPageSize,
 | 
			
		||||
			Private:  true,
 | 
			
		||||
		})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Fatal(4, "SearchRepositoryByName: %v", err)
 | 
			
		||||
			return 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 := git.OpenRepository(repo.RepoPath())
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.Warn("OpenRepository: %v", err)
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			oldnum, err := models.GetReleaseCountByRepoID(repo.ID,
 | 
			
		||||
				models.FindReleasesOptions{
 | 
			
		||||
					IncludeDrafts: false,
 | 
			
		||||
					IncludeTags:   true,
 | 
			
		||||
				})
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.Warn(" GetReleaseCountByRepoID: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
			log.Trace(" currentNumReleases is %d, running SyncReleasesWithTags", oldnum)
 | 
			
		||||
 | 
			
		||||
			if err = models.SyncReleasesWithTags(repo, gitRepo); err != nil {
 | 
			
		||||
				log.Warn(" SyncReleasesWithTags: %v", err)
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			count, err = models.GetReleaseCountByRepoID(repo.ID,
 | 
			
		||||
				models.FindReleasesOptions{
 | 
			
		||||
					IncludeDrafts: false,
 | 
			
		||||
					IncludeTags:   true,
 | 
			
		||||
				})
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				log.Warn(" GetReleaseCountByRepoID: %v", err)
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			log.Trace(" repo %s releases synchronized to tags: from %d to %d",
 | 
			
		||||
				repo.FullName(), oldnum, count)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user