mirror of
https://github.com/hanzoai/forge.git
synced 2026-10-30 15:00:39 +00:00
Source files keep their SPDX-License-Identifier and Hanzo copyright line; the Gitea, Gogs and LFS Test Server copyrights they used to repeat now live once in NOTICE, alongside LICENSE. The header lint accepts any copyright line above the SPDX line, so it no longer demands an upstream one. Co-authored-by: Hanzo Dev <[email protected]>
52 lines
1.7 KiB
Go
52 lines
1.7 KiB
Go
// Copyright 2026 Hanzo AI, Inc. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package doctor
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/hanzoai/git/modules/log"
|
|
"github.com/hanzoai/git/modules/setting"
|
|
"github.com/hanzoai/git/services/repository"
|
|
)
|
|
|
|
func init() {
|
|
Register(&Check{
|
|
Title: "Garbage collect LFS",
|
|
Name: "gc-lfs",
|
|
IsDefault: false,
|
|
Run: garbageCollectLFSCheck,
|
|
AbortIfFailed: false,
|
|
SkipDatabaseInitialization: false,
|
|
Priority: 1,
|
|
})
|
|
}
|
|
|
|
func garbageCollectLFSCheck(ctx context.Context, logger log.Logger, autofix bool) error {
|
|
if !setting.LFS.StartServer {
|
|
return errors.New("LFS support is disabled")
|
|
}
|
|
|
|
if err := repository.GarbageCollectLFSMetaObjects(ctx, repository.GarbageCollectLFSMetaObjectsOptions{
|
|
LogDetail: logger.Info,
|
|
AutoFix: autofix,
|
|
// Only attempt to garbage collect lfs meta objects older than a week as the order of git lfs upload
|
|
// and git object upload is not necessarily guaranteed. It's possible to imagine a situation whereby
|
|
// an LFS object is uploaded but the git branch is not uploaded immediately, or there are some rapid
|
|
// changes in new branches that might lead to lfs objects becoming temporarily unassociated with git
|
|
// objects.
|
|
//
|
|
// It is likely that a week is potentially excessive but it should definitely be enough that any
|
|
// unassociated LFS object is genuinely unassociated.
|
|
OlderThan: time.Now().Add(-24 * time.Hour * 7),
|
|
// We don't set the UpdatedLessRecentlyThan because we want to do a full GC
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
|
|
return checkStorage(&checkStorageOptions{LFS: true})(ctx, logger, autofix)
|
|
}
|