Skip to content

Commit dd38977

Browse files
committed
Optimize fetch to use single git command for all refs
- Batch all refs into one git fetch command instead of separate commands per ref - Apply --force globally when any ref needs it or remote.Force is set - Reduces git subprocess calls from N to 1, improving performance - Maintains same functionality while eliminating inefficient loop
1 parent ee04150 commit dd38977

File tree

1 file changed

+27
-35
lines changed

1 file changed

+27
-35
lines changed

cmd/git-remote-gitopia/gitopia.go

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -149,45 +149,37 @@ func (h *GitopiaHandler) Fetch(remote *core.Remote, refsToFetch []core.RefToFetc
149149
remoteURL := fmt.Sprintf("%v/%v.git", config.GitServerHost, h.remoteRepository.Id)
150150
lfsURL := remoteURL // Use same URL for LFS
151151

152-
if !remote.Force {
153-
args := []string{
154-
"-c", fmt.Sprintf("lfs.url=%s", lfsURL),
155-
"fetch",
156-
"--no-write-fetch-head",
157-
remoteURL,
158-
}
159-
for _, ref := range refsToFetch {
160-
args = append(args, ref.Ref)
161-
}
162-
cmd := core.GitCommand("git", args...)
163-
if err := cmd.Run(); err != nil {
164-
return errors.Wrap(err, "error fetching from remote repository")
152+
// Check if any refs need force
153+
needsForce := false
154+
var processedRefs []string
155+
156+
for _, ref := range refsToFetch {
157+
refSpec := ref.Ref
158+
if strings.HasPrefix(refSpec, "+") {
159+
refSpec = strings.TrimPrefix(refSpec, "+")
160+
needsForce = true
165161
}
166-
167-
return nil
162+
processedRefs = append(processedRefs, refSpec)
168163
}
169164

170-
for _, ref := range refsToFetch {
171-
force := false
172-
if strings.HasPrefix(ref.Ref, "+") {
173-
ref.Ref = strings.TrimPrefix(ref.Ref, "+")
174-
force = true
175-
}
165+
// Build single git fetch command with all refs
166+
args := []string{
167+
"-c", fmt.Sprintf("lfs.url=%s", lfsURL),
168+
"fetch",
169+
"--no-write-fetch-head",
170+
}
171+
172+
// Add force flag if any ref needs it
173+
if needsForce || remote.Force {
174+
args = append(args, "--force")
175+
}
176+
177+
args = append(args, remoteURL)
178+
args = append(args, processedRefs...)
176179

177-
args := []string{
178-
"-c", fmt.Sprintf("lfs.url=%s", lfsURL),
179-
"fetch",
180-
"--no-write-fetch-head",
181-
remoteURL,
182-
ref.Ref,
183-
}
184-
if force {
185-
args = append(args, "--force")
186-
}
187-
cmd := core.GitCommand("git", args...)
188-
if err := cmd.Run(); err != nil {
189-
return errors.Wrap(err, "error fetching from remote repository")
190-
}
180+
cmd := core.GitCommand("git", args...)
181+
if err := cmd.Run(); err != nil {
182+
return errors.Wrap(err, "error fetching from remote repository")
191183
}
192184

193185
return nil

0 commit comments

Comments
 (0)