fix: do not update repo if no changes
All checks were successful
Format and Lint / format-check (push) Successful in 2m57s
Format and Lint / test (push) Successful in 1m21s

This commit is contained in:
Максим Слипенко 2025-01-02 12:52:17 +03:00
parent c05a4c320b
commit 37007956ab
5 changed files with 216 additions and 104 deletions

View file

@ -2,5 +2,5 @@
<rect width="1100" height="20" fill="#555"/>
<rect x="60" width="50" height="20" fill="#4c1"/>
<text x="5" y="14" fill="#fff" font-family="Verdana" font-size="11">coverage</text>
<text x="70" y="14" fill="#fff" font-family="Verdana" font-size="11">57.4%</text>
<text x="70" y="14" fill="#fff" font-family="Verdana" font-size="11">58.5%</text>
</svg>

Before

Width:  |  Height:  |  Size: 341 B

After

Width:  |  Height:  |  Size: 341 B

View file

@ -121,7 +121,7 @@ func (app *App) Run() {
},
)
err := app.repo.ForceUpdate()
err := app.repo.Update(false)
if err != nil {
panic(err)
}

View file

@ -7,7 +7,7 @@ import (
)
type RepoService interface {
ForceUpdate() error
Update(bool) error
}
type Service struct {
@ -37,11 +37,11 @@ func (s *Service) SetupCronJobs() {
gocron.CronJob("0 4 * * *", false),
gocron.NewTask(func() {
log.Info(
"[cron] force update is started",
"[cron] update is started",
)
err := s.repoService.ForceUpdate()
err := s.repoService.Update(false)
if err != nil {
log.Error("[cron] force update error", map[string]interface{}{
log.Error("[cron] update error", map[string]interface{}{
"err": err,
})
}

View file

@ -48,7 +48,31 @@ func (s *Service) oldRepoPathPrefix() string {
)
}
func (s *Service) ForceUpdate() error {
func (s *Service) prepareForUpdate() error {
err := os.MkdirAll(s.futureRepoPathPrefix(), os.ModePerm)
if err != nil {
return err
}
err = os.MkdirAll(s.oldRepoPathPrefix(), os.ModePerm)
if err != nil {
return err
}
err = os.MkdirAll(s.currentRepoPathPrefix(), os.ModePerm)
if err != nil {
return err
}
return nil
}
func (s *Service) cleanUpAfterUpdate() {
os.RemoveAll(s.futureRepoPathPrefix())
os.RemoveAll(s.oldRepoPathPrefix())
}
func (s *Service) Update(force bool) error {
const REPO_NAME = "aides"
architectures := []string{
@ -63,22 +87,7 @@ func (s *Service) ForceUpdate() error {
log := logger.GetLogger()
log.Info("Start repo update")
err := os.MkdirAll(s.futureRepoPathPrefix(), os.ModePerm)
if err != nil {
return err
}
defer os.RemoveAll(s.futureRepoPathPrefix())
err = os.MkdirAll(s.oldRepoPathPrefix(), os.ModePerm)
if err != nil {
return err
}
defer os.RemoveAll(s.oldRepoPathPrefix())
err = os.MkdirAll(s.currentRepoPathPrefix(), os.ModePerm)
if err != nil {
return err
}
preparedForUpdate := false
for _, r := range repos {
var tasks []models.Task
@ -86,9 +95,39 @@ func (s *Service) ForceUpdate() error {
Name: r,
}
s.db.
if err := s.db.
Where(&altRepo).
First(&altRepo)
First(&altRepo).Error; err != nil {
return err
}
var exists bool
if err := s.db.
Model(&models.GitRepoAltRepoTask{}).
Select("1").
Where("alt_repo_id = ?", altRepo.ID).
Where("last_task_id != current_task_id").
Limit(1).
Scan(&exists).Error; err != nil {
return err
}
if !force && !exists {
log.Info(
"No updates found for ALTRepo, skipping.",
map[string]interface{}{
"repo": altRepo.Name,
})
continue
}
if !preparedForUpdate {
if err := s.prepareForUpdate(); err != nil {
return err
}
defer s.cleanUpAfterUpdate()
}
preparedForUpdate = true
s.db.
Model(&models.GitRepoAltRepoTask{}).

View file

@ -13,6 +13,8 @@ import (
)
func TestRepoService_ForceUpdate(t *testing.T) {
t.Run("Correct update (new)", func(t *testing.T) {
// PREPARE
db := prepareDb(t)
config := prepareConfig()
@ -81,8 +83,9 @@ func TestRepoService_ForceUpdate(t *testing.T) {
)
// EXECUTE
err = service.ForceUpdate()
err = service.Update(false)
// CHECK
assert.NoError(t, err)
// TODO: check db
repoBasePath := path.Join(config.GetUploadDir(), "repo", "Sisyphus")
@ -113,4 +116,74 @@ func TestRepoService_ForceUpdate(t *testing.T) {
linkDest, err := os.Readlink(rpmPath)
assert.NoError(t, err)
assert.Equal(t, path.Join("../../../../tasks/1", fileName), linkDest)
})
t.Run("Do not do anything if no updates", func(t *testing.T) {
// PREPARE
db := prepareDb(t)
config := prepareConfig()
os.MkdirAll(config.GetUploadDir(), os.ModePerm)
taskPath := path.Join(config.GetUploadDir(), "tasks/1")
os.MkdirAll(taskPath, os.ModePerm)
defer os.RemoveAll(config.GetUploadDir())
fileName := "example-foo-1.0.0-alt1.x86_64.rpm"
source, err := os.Open(path.Join("./test_rpms", fileName))
assert.NoError(t, err)
destination, err := os.Create(path.Join(taskPath, fileName))
assert.NoError(t, err)
defer destination.Close()
_, err = io.Copy(destination, source)
assert.NoError(t, err)
source.Close()
destination.Close()
gitRepo := &models.GitRepo{
Name: "example-foo",
}
altRepo := &models.ALTRepo{
Name: "Sisyphus",
}
task := &models.Task{
Status: models.StatusCompleted,
Files: []models.RPMFile{
{
Filename: "---",
Name: "example-foo",
Version: "0.9.9",
Release: "1",
Arch: "x86_64",
Epoch: 0,
},
},
}
db.Create(&models.GitRepoAltRepoTask{
Repo: gitRepo,
ALTRepo: altRepo,
CurrentTask: task,
LastTask: task,
})
service := reposervice.New(
db,
config,
)
// EXECUTE
err = service.Update(false)
// СHECK
assert.NoError(t, err)
repoBasePath := path.Join(config.GetUploadDir(), "repo", "Sisyphus")
_, err = os.Stat(repoBasePath)
assert.True(t, os.IsNotExist(err))
})
}