285 |
285 |
286 for f, entry in self._state.items(): |
286 for f, entry in self._state.items(): |
287 if entry[0] == 'u': |
287 if entry[0] == 'u': |
288 yield f |
288 yield f |
289 |
289 |
290 def _resolve(self, dfile, wctx, labels=None): |
290 def _resolve(self, preresolve, dfile, wctx, labels=None): |
291 """rerun merge process for file path `dfile`""" |
291 """rerun merge process for file path `dfile`""" |
292 if self[dfile] == 'r': |
292 if self[dfile] == 'r': |
293 return True, 0 |
293 return True, 0 |
294 stateentry = self._state[dfile] |
294 stateentry = self._state[dfile] |
295 state, hash, lfile, afile, anode, ofile, onode, flags = stateentry |
295 state, hash, lfile, afile, anode, ofile, onode, flags = stateentry |
300 # "premerge" x flags |
300 # "premerge" x flags |
301 flo = fco.flags() |
301 flo = fco.flags() |
302 fla = fca.flags() |
302 fla = fca.flags() |
303 if 'x' in flags + flo + fla and 'l' not in flags + flo + fla: |
303 if 'x' in flags + flo + fla and 'l' not in flags + flo + fla: |
304 if fca.node() == nullid: |
304 if fca.node() == nullid: |
305 self._repo.ui.warn(_('warning: cannot merge flags for %s\n') % |
305 if preresolve: |
306 afile) |
306 self._repo.ui.warn( |
|
307 _('warning: cannot merge flags for %s\n') % afile) |
307 elif flags == fla: |
308 elif flags == fla: |
308 flags = flo |
309 flags = flo |
309 # restore local |
310 if preresolve: |
310 f = self._repo.vfs('merge/' + hash) |
311 # restore local |
311 self._repo.wwrite(dfile, f.read(), flags) |
312 f = self._repo.vfs('merge/' + hash) |
312 f.close() |
313 self._repo.wwrite(dfile, f.read(), flags) |
313 complete, r = filemerge.premerge(self._repo, self._local, lfile, fcd, |
314 f.close() |
314 fco, fca, labels=labels) |
315 complete, r = filemerge.premerge(self._repo, self._local, lfile, |
315 if not complete: |
316 fcd, fco, fca, labels=labels) |
|
317 else: |
316 complete, r = filemerge.filemerge(self._repo, self._local, lfile, |
318 complete, r = filemerge.filemerge(self._repo, self._local, lfile, |
317 fcd, fco, fca, labels=labels) |
319 fcd, fco, fca, labels=labels) |
318 if r is None: |
320 if r is None: |
319 # no real conflict |
321 # no real conflict |
320 del self._state[dfile] |
322 del self._state[dfile] |
321 self._dirty = True |
323 self._dirty = True |
322 elif not r: |
324 elif not r: |
323 self.mark(dfile, 'r') |
325 self.mark(dfile, 'r') |
324 return complete, r |
326 return complete, r |
325 |
327 |
|
328 def preresolve(self, dfile, wctx, labels=None): |
|
329 return self._resolve(True, dfile, wctx, labels=labels) |
|
330 |
326 def resolve(self, dfile, wctx, labels=None): |
331 def resolve(self, dfile, wctx, labels=None): |
327 """rerun merge process for file path `dfile`""" |
332 """rerun merge process for file path `dfile`""" |
328 return self._resolve(dfile, wctx, labels=labels)[1] |
333 return self._resolve(False, dfile, wctx, labels=labels)[1] |
329 |
334 |
330 def _checkunknownfile(repo, wctx, mctx, f, f2=None): |
335 def _checkunknownfile(repo, wctx, mctx, f, f2=None): |
331 if f2 is None: |
336 if f2 is None: |
332 f2 = f |
337 f2 = f |
333 return (os.path.isfile(repo.wjoin(f)) |
338 return (os.path.isfile(repo.wjoin(f)) |
853 if f == '.hgsubstate': # subrepo states need updating |
858 if f == '.hgsubstate': # subrepo states need updating |
854 subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx), |
859 subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx), |
855 overwrite) |
860 overwrite) |
856 continue |
861 continue |
857 audit(f) |
862 audit(f) |
858 r = ms.resolve(f, wctx, labels=labels) |
863 complete, r = ms.preresolve(f, wctx, labels=labels) |
|
864 if not complete: |
|
865 r = ms.resolve(f, wctx, labels=labels) |
859 if r is not None and r > 0: |
866 if r is not None and r > 0: |
860 unresolved += 1 |
867 unresolved += 1 |
861 else: |
868 else: |
862 if r is None: |
869 if r is None: |
863 updated += 1 |
870 updated += 1 |