fix(git): use jj as diff source in jujutsu repos
In a colocated jj repo, jj does not maintain git's index for git's own consumption. git can therefore report an unmodified tracked file as a whole-file add: for tests/integration/test_texttoentities_endpoint.py in the IO repo, `git ls-tree HEAD` and `git ls-files -s` both showed the same blob, yet `git status` reported `AM` and `git diff --cached --unified=0` emitted a single `@@ -0,0 +1,330 @@` hunk. shush treats every line in that hunk as agent-changed, so `--changes-only` stripped all six comments from a file the agent had never touched (`jj diff` confirmed 0 insertions). Diffing against HEAD instead of the index does not help: it is poisoned the same way. jj is authoritative when present, so DetectRepo now prefers `jj root` and the three change queries route to `jj diff --git --context=0`. jj has no staging area, so --staged, --unstaged and --changes-only all resolve to the working-copy change; GetChangesOnly short-circuits so files are not duplicated across the staged and unstaged passes. Empty line ranges are overloaded to mean "process the whole file" (untracked semantics). A deletion-only change parses to zero ranges, which would have made shush strip an entire file whose only edit removed lines, so such files are now skipped. New files still get correct full-file ranges from jj's `@@ -0,0 +1,N @@` hunk, so they do not need the fallback. Pagers are disabled explicitly on every git and jj invocation so output stays machine-parseable regardless of the user's config.
This commit is contained in:
@@ -31,7 +31,11 @@ func (p *Processor) processGitChanges() error {
|
||||
}
|
||||
|
||||
if p.cli.Verbose {
|
||||
fmt.Printf("Git repository detected: %s\n", gitStatus.RootDir)
|
||||
vcs := "Git"
|
||||
if gitStatus.IsJJ {
|
||||
vcs = "Jujutsu"
|
||||
}
|
||||
fmt.Printf("%s repository detected: %s\n", vcs, gitStatus.RootDir)
|
||||
}
|
||||
|
||||
var changes []git.FileChange
|
||||
|
||||
Reference in New Issue
Block a user