summaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
Diffstat (limited to 'models')
-rw-r--r--models/repo.go61
1 files changed, 58 insertions, 3 deletions
diff --git a/models/repo.go b/models/repo.go
index 9b1b868778..a7a36cc7d0 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -1837,6 +1837,60 @@ func DeleteRepositoryArchives() error {
})
}
+// DeleteOldRepositoryArchives deletes old repository archives.
+func DeleteOldRepositoryArchives() {
+ if taskStatusTable.IsRunning(archiveCleanup) {
+ return
+ }
+ taskStatusTable.Start(archiveCleanup)
+ defer taskStatusTable.Stop(archiveCleanup)
+
+ log.Trace("Doing: ArchiveCleanup")
+
+ if err := x.Where("id > 0").Iterate(new(Repository), deleteOldRepositoryArchives); err != nil {
+ log.Error(4, "ArchiveClean: %v", err)
+ }
+}
+
+func deleteOldRepositoryArchives(idx int, bean interface{}) error {
+ repo := bean.(*Repository)
+ basePath := filepath.Join(repo.RepoPath(), "archives")
+
+ for _, ty := range []string{"zip", "targz"} {
+ path := filepath.Join(basePath, ty)
+ file, err := os.Open(path)
+ if err != nil {
+ if !os.IsNotExist(err) {
+ log.Warn("Unable to open directory %s: %v", path, err)
+ return err
+ }
+
+ // If the directory doesn't exist, that's okay.
+ continue
+ }
+
+ files, err := file.Readdir(0)
+ file.Close()
+ if err != nil {
+ log.Warn("Unable to read directory %s: %v", path, err)
+ return err
+ }
+
+ minimumOldestTime := time.Now().Add(-setting.Cron.ArchiveCleanup.OlderThan)
+ for _, info := range files {
+ if info.ModTime().Before(minimumOldestTime) && !info.IsDir() {
+ toDelete := filepath.Join(path, info.Name())
+ // This is a best-effort purge, so we do not check error codes to confirm removal.
+ if err = os.Remove(toDelete); err != nil {
+ log.Trace("Unable to delete %s, but proceeding: %v", toDelete, err)
+ }
+ }
+ }
+ }
+
+ return nil
+}
+
func gatherMissingRepoRecords() ([]*Repository, error) {
repos := make([]*Repository, 0, 10)
if err := x.
@@ -1915,9 +1969,10 @@ func RewriteRepositoryUpdateHook() error {
var taskStatusTable = sync.NewStatusTable()
const (
- mirrorUpdate = "mirror_update"
- gitFsck = "git_fsck"
- checkRepos = "check_repos"
+ mirrorUpdate = "mirror_update"
+ gitFsck = "git_fsck"
+ checkRepos = "check_repos"
+ archiveCleanup = "archive_cleanup"
)
// GitFsck calls 'git fsck' to check repository health.