Skip to content

Commit a3826a2

Browse files
committed
Continue GCing other repos on error in one repo (go-gitea#22422)
Backport go-gitea#22422 The current code propagates all errors up to the iteration step meaning that a single malformed repo will prevent GC of other repos. This PR simply stops that propagation. Fix go-gitea#21605 Signed-off-by: Andrew Thornton <[email protected]>
1 parent 426c0ad commit a3826a2

File tree

1 file changed

+34
-27
lines changed

1 file changed

+34
-27
lines changed

services/repository/check.go

+34-27
Original file line numberDiff line numberDiff line change
@@ -73,32 +73,8 @@ func GitGcRepos(ctx context.Context, timeout time.Duration, args ...git.CmdArg)
7373
return db.ErrCancelledf("before GC of %s", repo.FullName())
7474
default:
7575
}
76-
log.Trace("Running git gc on %v", repo)
77-
command := git.NewCommand(ctx, args...).
78-
SetDescription(fmt.Sprintf("Repository Garbage Collection: %s", repo.FullName()))
79-
var stdout string
80-
var err error
81-
stdout, _, err = command.RunStdString(&git.RunOpts{Timeout: timeout, Dir: repo.RepoPath()})
82-
83-
if err != nil {
84-
log.Error("Repository garbage collection failed for %v. Stdout: %s\nError: %v", repo, stdout, err)
85-
desc := fmt.Sprintf("Repository garbage collection failed for %s. Stdout: %s\nError: %v", repo.RepoPath(), stdout, err)
86-
if err = system_model.CreateRepositoryNotice(desc); err != nil {
87-
log.Error("CreateRepositoryNotice: %v", err)
88-
}
89-
return fmt.Errorf("Repository garbage collection failed in repo: %s: Error: %w", repo.FullName(), err)
90-
}
91-
92-
// Now update the size of the repository
93-
if err := repo_module.UpdateRepoSize(ctx, repo); err != nil {
94-
log.Error("Updating size as part of garbage collection failed for %v. Stdout: %s\nError: %v", repo, stdout, err)
95-
desc := fmt.Sprintf("Updating size as part of garbage collection failed for %s. Stdout: %s\nError: %v", repo.RepoPath(), stdout, err)
96-
if err = system_model.CreateRepositoryNotice(desc); err != nil {
97-
log.Error("CreateRepositoryNotice: %v", err)
98-
}
99-
return fmt.Errorf("Updating size as part of garbage collection failed in repo: %s: Error: %w", repo.FullName(), err)
100-
}
101-
76+
// we can ignore the error here because it will be logged in GitGCRepo
77+
_ = GitGcRepo(ctx, repo, timeout, args)
10278
return nil
10379
},
10480
); err != nil {
@@ -109,6 +85,37 @@ func GitGcRepos(ctx context.Context, timeout time.Duration, args ...git.CmdArg)
10985
return nil
11086
}
11187

88+
// GitGcRepo calls 'git gc' to remove unnecessary files and optimize the local repository
89+
func GitGcRepo(ctx context.Context, repo *repo_model.Repository, timeout time.Duration, args []git.CmdArg) error {
90+
log.Trace("Running git gc on %-v", repo)
91+
command := git.NewCommand(ctx, args...).
92+
SetDescription(fmt.Sprintf("Repository Garbage Collection: %s", repo.FullName()))
93+
var stdout string
94+
var err error
95+
stdout, _, err = command.RunStdString(&git.RunOpts{Timeout: timeout, Dir: repo.RepoPath()})
96+
97+
if err != nil {
98+
log.Error("Repository garbage collection failed for %-v. Stdout: %s\nError: %v", repo, stdout, err)
99+
desc := fmt.Sprintf("Repository garbage collection failed for %s. Stdout: %s\nError: %v", repo.RepoPath(), stdout, err)
100+
if err := system_model.CreateRepositoryNotice(desc); err != nil {
101+
log.Error("CreateRepositoryNotice: %v", err)
102+
}
103+
return fmt.Errorf("Repository garbage collection failed in repo: %s: Error: %w", repo.FullName(), err)
104+
}
105+
106+
// Now update the size of the repository
107+
if err := repo_module.UpdateRepoSize(ctx, repo); err != nil {
108+
log.Error("Updating size as part of garbage collection failed for %-v. Stdout: %s\nError: %v", repo, stdout, err)
109+
desc := fmt.Sprintf("Updating size as part of garbage collection failed for %s. Stdout: %s\nError: %v", repo.RepoPath(), stdout, err)
110+
if err := system_model.CreateRepositoryNotice(desc); err != nil {
111+
log.Error("CreateRepositoryNotice: %v", err)
112+
}
113+
return fmt.Errorf("Updating size as part of garbage collection failed in repo: %s: Error: %w", repo.FullName(), err)
114+
}
115+
116+
return nil
117+
}
118+
112119
func gatherMissingRepoRecords(ctx context.Context) ([]*repo_model.Repository, error) {
113120
repos := make([]*repo_model.Repository, 0, 10)
114121
if err := db.Iterate(
@@ -162,7 +169,7 @@ func DeleteMissingRepositories(ctx context.Context, doer *user_model.User) error
162169
}
163170
log.Trace("Deleting %d/%d...", repo.OwnerID, repo.ID)
164171
if err := models.DeleteRepository(doer, repo.OwnerID, repo.ID); err != nil {
165-
log.Error("Failed to DeleteRepository %s [%d]: Error: %v", repo.FullName(), repo.ID, err)
172+
log.Error("Failed to DeleteRepository %-v: Error: %v", repo, err)
166173
if err2 := system_model.CreateRepositoryNotice("Failed to DeleteRepository %s [%d]: Error: %v", repo.FullName(), repo.ID, err); err2 != nil {
167174
log.Error("CreateRepositoryNotice: %v", err)
168175
}

0 commit comments

Comments
 (0)