@@ -116,18 +116,71 @@ func TestBuildFileCandidates(t *testing.T) {
116116 t .Fatalf ("write unresolved: %v" , err )
117117 }
118118
119- candidates , err := buildFileCandidates (tmpDir , []string {"resolved.txt" , "unresolved.txt" })
119+ candidates , err := buildFileCandidates (context . Background (), tmpDir , []string {"resolved.txt" , "unresolved.txt" })
120120 if err != nil {
121121 t .Fatalf ("buildFileCandidates error: %v" , err )
122122 }
123123 if len (candidates ) != 2 {
124124 t .Fatalf ("candidates len = %d, want 2" , len (candidates ))
125125 }
126- if ! candidates [0 ].Resolved {
127- t .Fatalf ("resolved file marked unresolved " )
126+ if ! candidates [0 ].Resolved || ! candidates [ 1 ]. Resolved {
127+ t .Fatalf ("expected non-repo candidates to default to resolved status " )
128128 }
129- if candidates [1 ].Resolved {
130- t .Fatalf ("unresolved file marked resolved" )
129+ }
130+
131+ func TestBuildFileCandidatesDoesNotFailOnMalformedMergedFile (t * testing.T ) {
132+ if testing .Short () {
133+ t .Skip ("skipping git integration test in short mode" )
134+ }
135+ if _ , err := exec .LookPath ("git" ); err != nil {
136+ t .Skip ("git not found in PATH" )
137+ }
138+
139+ repoDir := t .TempDir ()
140+ runGit (t , repoDir , "init" )
141+ runGit (t , repoDir , "config" , "user.email" , "test@example.com" )
142+ runGit (t , repoDir , "config" , "user.name" , "Test User" )
143+
144+ conflictPath := filepath .Join (repoDir , "conflict.txt" )
145+ if err := os .WriteFile (conflictPath , []byte ("base\n " ), 0o644 ); err != nil {
146+ t .Fatalf ("write base: %v" , err )
147+ }
148+ runGit (t , repoDir , "add" , "conflict.txt" )
149+ runGit (t , repoDir , "commit" , "-m" , "base" )
150+
151+ runGit (t , repoDir , "checkout" , "-b" , "feature" )
152+ if err := os .WriteFile (conflictPath , []byte ("theirs\n " ), 0o644 ); err != nil {
153+ t .Fatalf ("write theirs: %v" , err )
154+ }
155+ runGit (t , repoDir , "add" , "conflict.txt" )
156+ runGit (t , repoDir , "commit" , "-m" , "theirs" )
157+
158+ runGit (t , repoDir , "checkout" , "-" )
159+ if err := os .WriteFile (conflictPath , []byte ("ours\n " ), 0o644 ); err != nil {
160+ t .Fatalf ("write ours: %v" , err )
161+ }
162+ runGit (t , repoDir , "add" , "conflict.txt" )
163+ runGit (t , repoDir , "commit" , "-m" , "ours" )
164+
165+ mergeCmd := exec .Command ("git" , "merge" , "feature" )
166+ mergeCmd .Dir = repoDir
167+ if output , err := mergeCmd .CombinedOutput (); err == nil {
168+ t .Fatalf ("expected merge conflict, got success: %s" , string (output ))
169+ }
170+
171+ if err := os .WriteFile (conflictPath , []byte ("<<<<<<< HEAD\n ours\n =======\n theirs\n >>>>\n " ), 0o644 ); err != nil {
172+ t .Fatalf ("write malformed conflict file: %v" , err )
173+ }
174+
175+ candidates , err := buildFileCandidates (context .Background (), repoDir , []string {"conflict.txt" })
176+ if err != nil {
177+ t .Fatalf ("buildFileCandidates error: %v" , err )
178+ }
179+ if len (candidates ) != 1 {
180+ t .Fatalf ("candidates len = %d, want 1" , len (candidates ))
181+ }
182+ if candidates [0 ].Resolved {
183+ t .Fatalf ("expected malformed merged conflict to remain unresolved based on index stages" )
131184 }
132185}
133186
0 commit comments