mirror of
https://github.com/alibaba/open-code-review.git
synced 2026-07-09 17:28:58 +00:00
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).
30 lines
935 B
Go
30 lines
935 B
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
func runGitCmd(repoDir string, args ...string) ([]byte, error) {
|
|
fullArgs := append([]string{"-C", repoDir}, args...)
|
|
cmd := exec.Command("git", fullArgs...)
|
|
return cmd.CombinedOutput()
|
|
}
|
|
|
|
// runGitCmdStdout is like runGitCmd but returns stdout only. Use it when the
|
|
// output is consumed as data (e.g. a resolved path) so git's stderr warnings
|
|
// (permissions, deprecations, config notices) can't pollute the result.
|
|
func runGitCmdStdout(repoDir string, args ...string) ([]byte, error) {
|
|
fullArgs := append([]string{"-C", repoDir}, args...)
|
|
cmd := exec.Command("git", fullArgs...)
|
|
return cmd.Output()
|
|
}
|
|
|
|
func getCommitMessage(repoDir, commit string) (string, error) {
|
|
out, err := runGitCmd(repoDir, "log", "-1", "--format=%B", "--end-of-options", commit)
|
|
if err != nil {
|
|
return "", fmt.Errorf("git log failed: %w", err)
|
|
}
|
|
return strings.TrimSpace(string(out)), nil
|
|
}
|