mirror of
https://github.com/alibaba/open-code-review.git
synced 2026-07-09 17:28:58 +00:00
fix(tool): resolve file_read paths against git top-level in monorepos (#309)
Some checks are pending
CI / test (push) Waiting to run
Some checks are pending
CI / test (push) Waiting to run
* fix(tool): resolve file_read paths against git top-level in monorepos ocr review from a monorepo subdirectory failed with "file not found" (#287): git reports diff and `git show HEAD:<path>` paths relative to the repo root, but RepoDir was scoped to the invocation subdirectory, producing a double prefix. resolveWorkingDir now anchors RepoDir at `git rev-parse --show-toplevel` on the review path (requireGit=true); scan keeps the CWD so its `git ls-files` walk stays scoped. The top-level lookup uses a stdout-only git helper so stderr notices can't pollute the path, and fails loudly if --show-toplevel errors or is empty (e.g. a bare repo) instead of silently reusing the subdirectory. Adds regression tests for the subdir hoist, the scan-path scoping, git-show resolution of root-relative paths, and the bare-repo failure. * docs(rules): document repo-root rule.json resolution in monorepos Since #287 anchored RepoDir at the git top-level, ocr review from a monorepo subdirectory loads the repo-root .opencodereview/rule.json rather than a subdir-local one. Call out this user-visible behavior at loadProjectRule so the scope change isn't a surprise (review feedback).
This commit is contained in:
parent
a2e08b77a1
commit
c973e581ec
6 changed files with 180 additions and 16 deletions
|
|
@ -5,6 +5,7 @@ import (
|
|||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/open-code-review/open-code-review/internal/agent"
|
||||
|
|
@ -100,6 +101,25 @@ func resolveWorkingDir(input string, requireGit bool) (string, bool, error) {
|
|||
if !isGit && requireGit {
|
||||
return "", false, fmt.Errorf("%s is not a git repository", absPath)
|
||||
}
|
||||
// #287: git reports diff and `git show HEAD:<path>` paths relative to the
|
||||
// repository root, not the current directory. When `ocr review` runs from a
|
||||
// subdirectory of a monorepo, anchor RepoDir at the git top-level so those
|
||||
// root-relative paths resolve for both disk reads and git-show reads.
|
||||
// requireGit is true only for the review path; scan (requireGit=false) keeps
|
||||
// the CWD so its `git ls-files` walk stays scoped to the subdirectory.
|
||||
if isGit && requireGit {
|
||||
// runGitCmdStdout captures stdout only so git stderr notices can't
|
||||
// pollute the resolved path. --show-toplevel fails (or is empty) when
|
||||
// there is no work tree — e.g. a bare repo, where --git-dir succeeds so
|
||||
// isGit is true. Fail loudly there instead of silently reusing the
|
||||
// subdir, which would reproduce the #287 root-relative-path bug.
|
||||
top, topErr := runGitCmdStdout(absPath, "rev-parse", "--show-toplevel")
|
||||
t := strings.TrimSpace(string(top))
|
||||
if topErr != nil || t == "" {
|
||||
return "", false, fmt.Errorf("%s is a git repository without a work tree (bare repo?); cannot resolve its top level for review", absPath)
|
||||
}
|
||||
absPath = t
|
||||
}
|
||||
return absPath, isGit, nil
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue