Skip to content

Commit dcdb487

Browse files
authored
Move repo archiver to models/repo (#17913)
* Move repo archiver to models/repo * Move archiver service into services/repository/ * Fix imports * Fix test * Fix test
1 parent f49d160 commit dcdb487

File tree

11 files changed

+204
-171
lines changed

11 files changed

+204
-171
lines changed

models/repo.go

+2-49
Original file line numberDiff line numberDiff line change
@@ -1605,19 +1605,18 @@ func DeleteRepository(doer *user_model.User, uid, repoID int64) error {
16051605
}
16061606

16071607
// Remove archives
1608-
var archives []*RepoArchiver
1608+
var archives []*repo_model.RepoArchiver
16091609
if err = sess.Where("repo_id=?", repoID).Find(&archives); err != nil {
16101610
return err
16111611
}
16121612

16131613
var archivePaths = make([]string, 0, len(archives))
16141614
for _, v := range archives {
1615-
v.Repo = repo
16161615
p, _ := v.RelativePath()
16171616
archivePaths = append(archivePaths, p)
16181617
}
16191618

1620-
if _, err := sess.Delete(&RepoArchiver{RepoID: repoID}); err != nil {
1619+
if _, err := sess.Delete(&repo_model.RepoArchiver{RepoID: repoID}); err != nil {
16211620
return err
16221621
}
16231622

@@ -1824,52 +1823,6 @@ func GetPrivateRepositoryCount(u *user_model.User) (int64, error) {
18241823
return getPrivateRepositoryCount(db.GetEngine(db.DefaultContext), u)
18251824
}
18261825

1827-
// DeleteOldRepositoryArchives deletes old repository archives.
1828-
func DeleteOldRepositoryArchives(ctx context.Context, olderThan time.Duration) error {
1829-
log.Trace("Doing: ArchiveCleanup")
1830-
1831-
for {
1832-
var archivers []RepoArchiver
1833-
err := db.GetEngine(db.DefaultContext).Where("created_unix < ?", time.Now().Add(-olderThan).Unix()).
1834-
Asc("created_unix").
1835-
Limit(100).
1836-
Find(&archivers)
1837-
if err != nil {
1838-
log.Trace("Error: ArchiveClean: %v", err)
1839-
return err
1840-
}
1841-
1842-
for _, archiver := range archivers {
1843-
if err := deleteOldRepoArchiver(ctx, &archiver); err != nil {
1844-
return err
1845-
}
1846-
}
1847-
if len(archivers) < 100 {
1848-
break
1849-
}
1850-
}
1851-
1852-
log.Trace("Finished: ArchiveCleanup")
1853-
return nil
1854-
}
1855-
1856-
var delRepoArchiver = new(RepoArchiver)
1857-
1858-
func deleteOldRepoArchiver(ctx context.Context, archiver *RepoArchiver) error {
1859-
p, err := archiver.RelativePath()
1860-
if err != nil {
1861-
return err
1862-
}
1863-
_, err = db.GetEngine(db.DefaultContext).ID(archiver.ID).Delete(delRepoArchiver)
1864-
if err != nil {
1865-
return err
1866-
}
1867-
if err := storage.RepoArchives.Delete(p); err != nil {
1868-
log.Error("delete repo archive file failed: %v", err)
1869-
}
1870-
return nil
1871-
}
1872-
18731826
type repoChecker struct {
18741827
querySQL, correctSQL string
18751828
desc string

models/repo/archiver.go

+109
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
// Copyright 2021 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package repo
6+
7+
import (
8+
"context"
9+
"fmt"
10+
"time"
11+
12+
"code.gitea.io/gitea/models/db"
13+
"code.gitea.io/gitea/modules/git"
14+
"code.gitea.io/gitea/modules/timeutil"
15+
16+
"xorm.io/builder"
17+
)
18+
19+
// ArchiverStatus represents repo archive status
20+
type ArchiverStatus int
21+
22+
// enumerate all repo archive statuses
23+
const (
24+
ArchiverGenerating = iota // the archiver is generating
25+
ArchiverReady // it's ready
26+
)
27+
28+
// RepoArchiver represents all archivers
29+
type RepoArchiver struct { //revive:disable-line:exported
30+
ID int64 `xorm:"pk autoincr"`
31+
RepoID int64 `xorm:"index unique(s)"`
32+
Type git.ArchiveType `xorm:"unique(s)"`
33+
Status ArchiverStatus
34+
CommitID string `xorm:"VARCHAR(40) unique(s)"`
35+
CreatedUnix timeutil.TimeStamp `xorm:"INDEX NOT NULL created"`
36+
}
37+
38+
func init() {
39+
db.RegisterModel(new(RepoArchiver))
40+
}
41+
42+
// RelativePath returns relative path
43+
func (archiver *RepoArchiver) RelativePath() (string, error) {
44+
return fmt.Sprintf("%d/%s/%s.%s", archiver.RepoID, archiver.CommitID[:2], archiver.CommitID, archiver.Type.String()), nil
45+
}
46+
47+
var delRepoArchiver = new(RepoArchiver)
48+
49+
// DeleteRepoArchiver delete archiver
50+
func DeleteRepoArchiver(ctx context.Context, archiver *RepoArchiver) error {
51+
_, err := db.GetEngine(db.DefaultContext).ID(archiver.ID).Delete(delRepoArchiver)
52+
return err
53+
}
54+
55+
// GetRepoArchiver get an archiver
56+
func GetRepoArchiver(ctx context.Context, repoID int64, tp git.ArchiveType, commitID string) (*RepoArchiver, error) {
57+
var archiver RepoArchiver
58+
has, err := db.GetEngine(ctx).Where("repo_id=?", repoID).And("`type`=?", tp).And("commit_id=?", commitID).Get(&archiver)
59+
if err != nil {
60+
return nil, err
61+
}
62+
if has {
63+
return &archiver, nil
64+
}
65+
return nil, nil
66+
}
67+
68+
// AddRepoArchiver adds an archiver
69+
func AddRepoArchiver(ctx context.Context, archiver *RepoArchiver) error {
70+
_, err := db.GetEngine(ctx).Insert(archiver)
71+
return err
72+
}
73+
74+
// UpdateRepoArchiverStatus updates archiver's status
75+
func UpdateRepoArchiverStatus(ctx context.Context, archiver *RepoArchiver) error {
76+
_, err := db.GetEngine(ctx).ID(archiver.ID).Cols("status").Update(archiver)
77+
return err
78+
}
79+
80+
// DeleteAllRepoArchives deletes all repo archives records
81+
func DeleteAllRepoArchives() error {
82+
_, err := db.GetEngine(db.DefaultContext).Where("1=1").Delete(new(RepoArchiver))
83+
return err
84+
}
85+
86+
// FindRepoArchiversOption represents an archiver options
87+
type FindRepoArchiversOption struct {
88+
db.ListOptions
89+
OlderThan time.Duration
90+
}
91+
92+
func (opts FindRepoArchiversOption) toConds() builder.Cond {
93+
var cond = builder.NewCond()
94+
if opts.OlderThan > 0 {
95+
cond = cond.And(builder.Lt{"created_unix": time.Now().Add(-opts.OlderThan).Unix()})
96+
}
97+
return cond
98+
}
99+
100+
// FindRepoArchives find repo archivers
101+
func FindRepoArchives(opts FindRepoArchiversOption) ([]*RepoArchiver, error) {
102+
var archivers = make([]*RepoArchiver, 0, opts.PageSize)
103+
start, limit := opts.GetSkipTake()
104+
err := db.GetEngine(db.DefaultContext).Where(opts.toConds()).
105+
Asc("created_unix").
106+
Limit(limit, start).
107+
Find(&archivers)
108+
return archivers, err
109+
}

models/repo/main_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@ import (
1414
func TestMain(m *testing.M) {
1515
unittest.MainTest(m, filepath.Join("..", ".."),
1616
"attachment.yml",
17+
"repo_archiver.yml",
1718
)
1819
}

models/repo_archiver.go

+3-70
Original file line numberDiff line numberDiff line change
@@ -5,44 +5,13 @@
55
package models
66

77
import (
8-
"context"
9-
"fmt"
10-
118
"code.gitea.io/gitea/models/db"
12-
"code.gitea.io/gitea/modules/git"
13-
"code.gitea.io/gitea/modules/timeutil"
14-
)
15-
16-
// RepoArchiverStatus represents repo archive status
17-
type RepoArchiverStatus int
189

19-
// enumerate all repo archive statuses
20-
const (
21-
RepoArchiverGenerating = iota // the archiver is generating
22-
RepoArchiverReady // it's ready
10+
repo_model "code.gitea.io/gitea/models/repo"
2311
)
2412

25-
// RepoArchiver represents all archivers
26-
type RepoArchiver struct {
27-
ID int64 `xorm:"pk autoincr"`
28-
RepoID int64 `xorm:"index unique(s)"`
29-
Repo *Repository `xorm:"-"`
30-
Type git.ArchiveType `xorm:"unique(s)"`
31-
Status RepoArchiverStatus
32-
CommitID string `xorm:"VARCHAR(40) unique(s)"`
33-
CreatedUnix timeutil.TimeStamp `xorm:"INDEX NOT NULL created"`
34-
}
35-
36-
func init() {
37-
db.RegisterModel(new(RepoArchiver))
38-
}
39-
40-
// LoadRepo loads repository
41-
func (archiver *RepoArchiver) LoadRepo() (*Repository, error) {
42-
if archiver.Repo != nil {
43-
return archiver.Repo, nil
44-
}
45-
13+
// LoadArchiverRepo loads repository
14+
func LoadArchiverRepo(archiver *repo_model.RepoArchiver) (*Repository, error) {
4615
var repo Repository
4716
has, err := db.GetEngine(db.DefaultContext).ID(archiver.RepoID).Get(&repo)
4817
if err != nil {
@@ -55,39 +24,3 @@ func (archiver *RepoArchiver) LoadRepo() (*Repository, error) {
5524
}
5625
return &repo, nil
5726
}
58-
59-
// RelativePath returns relative path
60-
func (archiver *RepoArchiver) RelativePath() (string, error) {
61-
return fmt.Sprintf("%d/%s/%s.%s", archiver.RepoID, archiver.CommitID[:2], archiver.CommitID, archiver.Type.String()), nil
62-
}
63-
64-
// GetRepoArchiver get an archiver
65-
func GetRepoArchiver(ctx context.Context, repoID int64, tp git.ArchiveType, commitID string) (*RepoArchiver, error) {
66-
var archiver RepoArchiver
67-
has, err := db.GetEngine(ctx).Where("repo_id=?", repoID).And("`type`=?", tp).And("commit_id=?", commitID).Get(&archiver)
68-
if err != nil {
69-
return nil, err
70-
}
71-
if has {
72-
return &archiver, nil
73-
}
74-
return nil, nil
75-
}
76-
77-
// AddRepoArchiver adds an archiver
78-
func AddRepoArchiver(ctx context.Context, archiver *RepoArchiver) error {
79-
_, err := db.GetEngine(ctx).Insert(archiver)
80-
return err
81-
}
82-
83-
// UpdateRepoArchiverStatus updates archiver's status
84-
func UpdateRepoArchiverStatus(ctx context.Context, archiver *RepoArchiver) error {
85-
_, err := db.GetEngine(ctx).ID(archiver.ID).Cols("status").Update(archiver)
86-
return err
87-
}
88-
89-
// DeleteAllRepoArchives deletes all repo archives records
90-
func DeleteAllRepoArchives() error {
91-
_, err := db.GetEngine(db.DefaultContext).Where("1=1").Delete(new(RepoArchiver))
92-
return err
93-
}

routers/init.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import (
3535
"code.gitea.io/gitea/routers/common"
3636
"code.gitea.io/gitea/routers/private"
3737
web_routers "code.gitea.io/gitea/routers/web"
38-
"code.gitea.io/gitea/services/archiver"
3938
"code.gitea.io/gitea/services/auth"
4039
"code.gitea.io/gitea/services/auth/source/oauth2"
4140
"code.gitea.io/gitea/services/cron"
@@ -44,6 +43,7 @@ import (
4443
mirror_service "code.gitea.io/gitea/services/mirror"
4544
pull_service "code.gitea.io/gitea/services/pull"
4645
repo_service "code.gitea.io/gitea/services/repository"
46+
"code.gitea.io/gitea/services/repository/archiver"
4747
"code.gitea.io/gitea/services/task"
4848
"code.gitea.io/gitea/services/webhook"
4949

routers/web/repo/repo.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ import (
2424
"code.gitea.io/gitea/modules/setting"
2525
"code.gitea.io/gitea/modules/storage"
2626
"code.gitea.io/gitea/modules/web"
27-
archiver_service "code.gitea.io/gitea/services/archiver"
2827
"code.gitea.io/gitea/services/forms"
2928
repo_service "code.gitea.io/gitea/services/repository"
29+
archiver_service "code.gitea.io/gitea/services/repository/archiver"
3030
)
3131

3232
const (
@@ -387,12 +387,12 @@ func Download(ctx *context.Context) {
387387
return
388388
}
389389

390-
archiver, err := models.GetRepoArchiver(db.DefaultContext, aReq.RepoID, aReq.Type, aReq.CommitID)
390+
archiver, err := repo_model.GetRepoArchiver(db.DefaultContext, aReq.RepoID, aReq.Type, aReq.CommitID)
391391
if err != nil {
392392
ctx.ServerError("models.GetRepoArchiver", err)
393393
return
394394
}
395-
if archiver != nil && archiver.Status == models.RepoArchiverReady {
395+
if archiver != nil && archiver.Status == repo_model.ArchiverReady {
396396
download(ctx, aReq.GetArchiveName(), archiver)
397397
return
398398
}
@@ -417,20 +417,20 @@ func Download(ctx *context.Context) {
417417
return
418418
}
419419
times++
420-
archiver, err = models.GetRepoArchiver(db.DefaultContext, aReq.RepoID, aReq.Type, aReq.CommitID)
420+
archiver, err = repo_model.GetRepoArchiver(db.DefaultContext, aReq.RepoID, aReq.Type, aReq.CommitID)
421421
if err != nil {
422422
ctx.ServerError("archiver_service.StartArchive", err)
423423
return
424424
}
425-
if archiver != nil && archiver.Status == models.RepoArchiverReady {
425+
if archiver != nil && archiver.Status == repo_model.ArchiverReady {
426426
download(ctx, aReq.GetArchiveName(), archiver)
427427
return
428428
}
429429
}
430430
}
431431
}
432432

433-
func download(ctx *context.Context, archiveName string, archiver *models.RepoArchiver) {
433+
func download(ctx *context.Context, archiveName string, archiver *repo_model.RepoArchiver) {
434434
downloadName := ctx.Repo.Repository.Name + "-" + archiveName
435435

436436
rPath, err := archiver.RelativePath()
@@ -473,20 +473,20 @@ func InitiateDownload(ctx *context.Context) {
473473
return
474474
}
475475

476-
archiver, err := models.GetRepoArchiver(db.DefaultContext, aReq.RepoID, aReq.Type, aReq.CommitID)
476+
archiver, err := repo_model.GetRepoArchiver(db.DefaultContext, aReq.RepoID, aReq.Type, aReq.CommitID)
477477
if err != nil {
478478
ctx.ServerError("archiver_service.StartArchive", err)
479479
return
480480
}
481-
if archiver == nil || archiver.Status != models.RepoArchiverReady {
481+
if archiver == nil || archiver.Status != repo_model.ArchiverReady {
482482
if err := archiver_service.StartArchive(aReq); err != nil {
483483
ctx.ServerError("archiver_service.StartArchive", err)
484484
return
485485
}
486486
}
487487

488488
var completed bool
489-
if archiver != nil && archiver.Status == models.RepoArchiverReady {
489+
if archiver != nil && archiver.Status == repo_model.ArchiverReady {
490490
completed = true
491491
}
492492

services/cron/tasks_basic.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import (
1515
"code.gitea.io/gitea/services/auth"
1616
"code.gitea.io/gitea/services/migrations"
1717
mirror_service "code.gitea.io/gitea/services/mirror"
18-
repository_service "code.gitea.io/gitea/services/repository"
18+
repo_service "code.gitea.io/gitea/services/repository"
19+
archiver_service "code.gitea.io/gitea/services/repository/archiver"
1920
)
2021

2122
func registerUpdateMirrorTask() {
@@ -56,7 +57,7 @@ func registerRepoHealthCheck() {
5657
Args: []string{},
5758
}, func(ctx context.Context, _ *user_model.User, config Config) error {
5859
rhcConfig := config.(*RepoHealthCheckConfig)
59-
return repository_service.GitFsck(ctx, rhcConfig.Timeout, rhcConfig.Args)
60+
return repo_service.GitFsck(ctx, rhcConfig.Timeout, rhcConfig.Args)
6061
})
6162
}
6263

@@ -80,7 +81,7 @@ func registerArchiveCleanup() {
8081
OlderThan: 24 * time.Hour,
8182
}, func(ctx context.Context, _ *user_model.User, config Config) error {
8283
acConfig := config.(*OlderThanConfig)
83-
return models.DeleteOldRepositoryArchives(ctx, acConfig.OlderThan)
84+
return archiver_service.DeleteOldRepositoryArchives(ctx, acConfig.OlderThan)
8485
})
8586
}
8687

0 commit comments

Comments
 (0)