Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix archive error when rename repo or user #16399

Merged
merged 4 commits into from
Jul 13, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 0 additions & 16 deletions models/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -1764,22 +1764,6 @@ func GetPrivateRepositoryCount(u *User) (int64, error) {
return getPrivateRepositoryCount(x, u)
}

// DeleteRepositoryArchives deletes all repositories' archives.
func DeleteRepositoryArchives(ctx context.Context) error {
return x.
Where("id > 0").
Iterate(new(Repository),
func(idx int, bean interface{}) error {
repo := bean.(*Repository)
select {
case <-ctx.Done():
return ErrCancelledf("before deleting repository archives for %s", repo.FullName())
default:
}
return util.RemoveAll(filepath.Join(repo.RepoPath(), "archives"))
})
}

// DeleteOldRepositoryArchives deletes old repository archives.
func DeleteOldRepositoryArchives(ctx context.Context, olderThan time.Duration) error {
log.Trace("Doing: ArchiveCleanup")
Expand Down
13 changes: 7 additions & 6 deletions models/repo_archiver.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,7 @@ func (archiver *RepoArchiver) LoadRepo() (*Repository, error) {

// RelativePath returns relative path
func (archiver *RepoArchiver) RelativePath() (string, error) {
repo, err := archiver.LoadRepo()
if err != nil {
return "", err
}

return fmt.Sprintf("%s/%s/%s.%s", repo.FullName(), archiver.CommitID[:2], archiver.CommitID, archiver.Type.String()), nil
return fmt.Sprintf("%d/%s/%s.%s", archiver.RepoID, archiver.CommitID[:2], archiver.CommitID, archiver.Type.String()), nil
}

// GetRepoArchiver get an archiver
Expand All @@ -84,3 +79,9 @@ func UpdateRepoArchiverStatus(ctx DBContext, archiver *RepoArchiver) error {
_, err := ctx.e.ID(archiver.ID).Cols("status").Update(archiver)
return err
}

// DeleteAllRepoArchives deletes all repo archives records
func DeleteAllRepoArchives() error {
_, err := x.Where("1=1").Delete(new(RepoArchiver))
return err
}
2 changes: 1 addition & 1 deletion modules/cron/tasks_extended.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func registerDeleteRepositoryArchives() {
RunAtStart: false,
Schedule: "@annually",
}, func(ctx context.Context, _ *models.User, _ Config) error {
return models.DeleteRepositoryArchives(ctx)
return repo_module.DeleteRepositoryArchives(ctx)
})
}

Expand Down
20 changes: 20 additions & 0 deletions modules/repository/archive.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Copyright 2021 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package repository

import (
"context"

"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/storage"
)

// DeleteRepositoryArchives deletes all repositories' archives.
func DeleteRepositoryArchives(ctx context.Context) error {
if err := models.DeleteAllRepoArchives(); err != nil {
return err
}
return storage.Clean(storage.RepoArchives)
}
7 changes: 7 additions & 0 deletions modules/storage/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,13 @@ func Copy(dstStorage ObjectStorage, dstPath string, srcStorage ObjectStorage, sr
return dstStorage.Save(dstPath, f, size)
}

// Clean delete all the objects in this storage
func Clean(storage ObjectStorage) error {
return storage.IterateObjects(func(path string, obj Object) error {
return storage.Delete(path)
})
}

// SaveFrom saves data to the ObjectStorage with path p from the callback
func SaveFrom(objStorage ObjectStorage, p string, callback func(w io.Writer) error) error {
pr, pw := io.Pipe()
Expand Down