fix: do not update repo if no changes
This commit is contained in:
parent
c05a4c320b
commit
37007956ab
5 changed files with 216 additions and 104 deletions
|
@ -2,5 +2,5 @@
|
||||||
<rect width="1100" height="20" fill="#555"/>
|
<rect width="1100" height="20" fill="#555"/>
|
||||||
<rect x="60" width="50" height="20" fill="#4c1"/>
|
<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="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>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 341 B After Width: | Height: | Size: 341 B |
|
@ -121,7 +121,7 @@ func (app *App) Run() {
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
err := app.repo.ForceUpdate()
|
err := app.repo.Update(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type RepoService interface {
|
type RepoService interface {
|
||||||
ForceUpdate() error
|
Update(bool) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type Service struct {
|
type Service struct {
|
||||||
|
@ -37,11 +37,11 @@ func (s *Service) SetupCronJobs() {
|
||||||
gocron.CronJob("0 4 * * *", false),
|
gocron.CronJob("0 4 * * *", false),
|
||||||
gocron.NewTask(func() {
|
gocron.NewTask(func() {
|
||||||
log.Info(
|
log.Info(
|
||||||
"[cron] force update is started",
|
"[cron] update is started",
|
||||||
)
|
)
|
||||||
err := s.repoService.ForceUpdate()
|
err := s.repoService.Update(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("[cron] force update error", map[string]interface{}{
|
log.Error("[cron] update error", map[string]interface{}{
|
||||||
"err": err,
|
"err": err,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
const REPO_NAME = "aides"
|
||||||
|
|
||||||
architectures := []string{
|
architectures := []string{
|
||||||
|
@ -63,22 +87,7 @@ func (s *Service) ForceUpdate() error {
|
||||||
log := logger.GetLogger()
|
log := logger.GetLogger()
|
||||||
log.Info("Start repo update")
|
log.Info("Start repo update")
|
||||||
|
|
||||||
err := os.MkdirAll(s.futureRepoPathPrefix(), os.ModePerm)
|
preparedForUpdate := false
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, r := range repos {
|
for _, r := range repos {
|
||||||
var tasks []models.Task
|
var tasks []models.Task
|
||||||
|
@ -86,9 +95,39 @@ func (s *Service) ForceUpdate() error {
|
||||||
Name: r,
|
Name: r,
|
||||||
}
|
}
|
||||||
|
|
||||||
s.db.
|
if err := s.db.
|
||||||
Where(&altRepo).
|
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.
|
s.db.
|
||||||
Model(&models.GitRepoAltRepoTask{}).
|
Model(&models.GitRepoAltRepoTask{}).
|
||||||
|
|
|
@ -13,6 +13,8 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestRepoService_ForceUpdate(t *testing.T) {
|
func TestRepoService_ForceUpdate(t *testing.T) {
|
||||||
|
t.Run("Correct update (new)", func(t *testing.T) {
|
||||||
|
// PREPARE
|
||||||
db := prepareDb(t)
|
db := prepareDb(t)
|
||||||
config := prepareConfig()
|
config := prepareConfig()
|
||||||
|
|
||||||
|
@ -81,8 +83,9 @@ func TestRepoService_ForceUpdate(t *testing.T) {
|
||||||
)
|
)
|
||||||
|
|
||||||
// EXECUTE
|
// EXECUTE
|
||||||
err = service.ForceUpdate()
|
err = service.Update(false)
|
||||||
|
|
||||||
|
// CHECK
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
// TODO: check db
|
// TODO: check db
|
||||||
repoBasePath := path.Join(config.GetUploadDir(), "repo", "Sisyphus")
|
repoBasePath := path.Join(config.GetUploadDir(), "repo", "Sisyphus")
|
||||||
|
@ -113,4 +116,74 @@ func TestRepoService_ForceUpdate(t *testing.T) {
|
||||||
linkDest, err := os.Readlink(rpmPath)
|
linkDest, err := os.Readlink(rpmPath)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, path.Join("../../../../tasks/1", fileName), linkDest)
|
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))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue