Skip to content

Commit e32a189

Browse files
committed
feat: merge fix for search match on sequencial finds
Signed-off-by: Andre Nogueira <aanogueira@protonmail.com>
1 parent 293b9db commit e32a189

3 files changed

Lines changed: 48 additions & 22 deletions

File tree

internal/files/service.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,15 @@ func (s *Service) resolveRef(repo *git.Repository, ref string) (*object.Commit,
114114
}
115115
}
116116

117-
// Try as remote branch (origin/main)
118-
if strings.Contains(ref, "/") {
119-
remoteRef, err := repo.Reference(
120-
plumbing.NewRemoteReferenceName("origin", strings.TrimPrefix(ref, "origin/")),
121-
true,
122-
)
123-
if err == nil {
124-
return repo.CommitObject(remoteRef.Hash())
125-
}
117+
// Try as remote branch (origin/main, origin/feature/foo)
118+
remoteName := strings.TrimPrefix(ref, "origin/")
119+
120+
remoteRef, err := repo.Reference(
121+
plumbing.NewRemoteReferenceName("origin", remoteName),
122+
true,
123+
)
124+
if err == nil {
125+
return repo.CommitObject(remoteRef.Hash())
126126
}
127127

128128
return nil, fmt.Errorf("could not resolve ref %q", ref)

internal/scip/indexer.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,9 +498,30 @@ func (i *Indexer) indexGoProject(ctx context.Context, projectDir string) ([]byte
498498
)
499499
defer os.Remove(outputFile)
500500

501+
// Use a temporary GOMODCACHE to avoid bloating the global module cache
502+
tmpModCache, err := os.MkdirTemp(i.config.WorkDir, "gomodcache-*")
503+
if err != nil {
504+
return nil, "", fmt.Errorf("failed to create temp module cache: %w", err)
505+
}
506+
defer os.RemoveAll(tmpModCache)
507+
508+
goModCacheEnv := append(os.Environ(), "GOMODCACHE="+tmpModCache)
509+
501510
ctx, cancel := context.WithTimeout(ctx, i.config.Timeout)
502511
defer cancel()
503512

513+
// Download module dependencies first so scip-go can resolve all packages
514+
dlCmd := exec.CommandContext(ctx, "go", "mod", "download")
515+
dlCmd.Dir = projectDir
516+
517+
dlCmd.Env = goModCacheEnv
518+
if dlOut, err := dlCmd.CombinedOutput(); err != nil {
519+
i.logger.Warn("go mod download failed (continuing anyway)",
520+
zap.Error(err),
521+
zap.String("output", string(dlOut)),
522+
)
523+
}
524+
504525
// Use explicit paths to avoid "project root is outside the repository" error
505526
cmd := exec.CommandContext(ctx, scipGo,
506527
"--output", outputFile,
@@ -509,6 +530,7 @@ func (i *Indexer) indexGoProject(ctx context.Context, projectDir string) ([]byte
509530
"--repository-root", projectDir,
510531
)
511532
cmd.Dir = projectDir
533+
cmd.Env = goModCacheEnv
512534

513535
var stdout, stderr bytes.Buffer
514536

web/components/Search.tsx

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1376,25 +1376,29 @@ function FileResultCard({ group, hideFileNavigator }: { group: FileGroup; hideFi
13761376
const beforeStartLine = matchLine - beforeLines.length;
13771377
const afterStartLine = matchLine + 1;
13781378

1379+
// Check next group to cap after-context before the next match line
1380+
const nextGroup = groupIndex < lineGroups.length - 1 ? lineGroups[groupIndex + 1] : null;
1381+
const afterLinesToShow = nextGroup
1382+
? Math.min(afterLines.length, Math.max(0, nextGroup.line - matchLine - 1))
1383+
: afterLines.length;
1384+
const filteredAfterLines = afterLines.slice(0, afterLinesToShow);
1385+
13791386
// Check previous group to avoid duplicating context lines
13801387
const prevGroup = groupIndex > 0 ? lineGroups[groupIndex - 1] : null;
13811388
const prevResult = prevGroup ? prevGroup.matches[0] : null;
1382-
const prevMatchEndLine = prevResult ? prevResult.line + (prevResult.context?.after?.length || 0) : 0;
1383-
1384-
// Calculate how many before lines to skip
1385-
const beforeLinesToSkip = prevResult ? Math.max(0, prevMatchEndLine - beforeStartLine + 1) : 0;
1389+
// Calculate how many after-context lines the previous group actually displayed
1390+
const prevAfterLength = prevResult?.context?.after?.length || 0;
1391+
const prevAfterShown = prevGroup
1392+
? Math.min(prevAfterLength, Math.max(0, matchLine - prevGroup.line - 1))
1393+
: 0;
1394+
const prevDisplayedEndLine = prevGroup ? prevGroup.line + prevAfterShown : 0;
1395+
1396+
// Calculate how many before lines to skip (already shown by previous group)
1397+
const beforeLinesToSkip = prevGroup ? Math.max(0, prevDisplayedEndLine - beforeStartLine + 1) : 0;
13861398
const filteredBeforeLines = beforeLines.slice(beforeLinesToSkip);
13871399
const filteredBeforeStartLine = beforeStartLine + beforeLinesToSkip;
13881400

1389-
// Check next group for after-context overlap
1390-
const nextGroup = groupIndex < lineGroups.length - 1 ? lineGroups[groupIndex + 1] : null;
1391-
const nextResult = nextGroup ? nextGroup.matches[0] : null;
1392-
const nextMatchBeforeStartLine = nextResult ? nextResult.line - (nextResult.context?.before?.length || 0) : Infinity;
1393-
1394-
const afterLinesToShow = nextResult ? Math.max(0, nextMatchBeforeStartLine - afterStartLine) : afterLines.length;
1395-
const filteredAfterLines = afterLines.slice(0, afterLinesToShow);
1396-
1397-
const needsSeparator = prevResult && filteredBeforeStartLine > prevMatchEndLine + 1;
1401+
const needsSeparator = prevResult && filteredBeforeStartLine > prevDisplayedEndLine + 1;
13981402

13991403
const getLineLink = (line: number) => {
14001404
if (repoId && !hideFileNavigator) {

0 commit comments

Comments
 (0)