Show More
@@ -35,6 +35,7 b' from . import (' | |||||
35 | error, |
|
35 | error, | |
36 | exchange, |
|
36 | exchange, | |
37 | extensions, |
|
37 | extensions, | |
|
38 | filemerge, | |||
38 | formatter, |
|
39 | formatter, | |
39 | graphmod, |
|
40 | graphmod, | |
40 | hbisect, |
|
41 | hbisect, | |
@@ -4594,6 +4595,9 b' def resolve(ui, repo, *pats, **opts):' | |||||
4594 | runconclude = False |
|
4595 | runconclude = False | |
4595 |
|
4596 | |||
4596 | tocomplete = [] |
|
4597 | tocomplete = [] | |
|
4598 | hasconflictmarkers = [] | |||
|
4599 | if mark: | |||
|
4600 | markcheck = ui.config('experimental', 'resolve.mark-check') | |||
4597 | for f in ms: |
|
4601 | for f in ms: | |
4598 | if not m(f): |
|
4602 | if not m(f): | |
4599 | continue |
|
4603 | continue | |
@@ -4629,6 +4633,12 b' def resolve(ui, repo, *pats, **opts):' | |||||
4629 | continue |
|
4633 | continue | |
4630 |
|
4634 | |||
4631 | if mark: |
|
4635 | if mark: | |
|
4636 | if markcheck: | |||
|
4637 | with repo.wvfs(f) as fobj: | |||
|
4638 | fdata = fobj.read() | |||
|
4639 | if filemerge.hasconflictmarkers(fdata) and \ | |||
|
4640 | ms[f] != mergemod.MERGE_RECORD_RESOLVED: | |||
|
4641 | hasconflictmarkers.append(f) | |||
4632 | ms.mark(f, mergemod.MERGE_RECORD_RESOLVED) |
|
4642 | ms.mark(f, mergemod.MERGE_RECORD_RESOLVED) | |
4633 | elif unmark: |
|
4643 | elif unmark: | |
4634 | ms.mark(f, mergemod.MERGE_RECORD_UNRESOLVED) |
|
4644 | ms.mark(f, mergemod.MERGE_RECORD_UNRESOLVED) | |
@@ -4663,6 +4673,13 b' def resolve(ui, repo, *pats, **opts):' | |||||
4663 | if inst.errno != errno.ENOENT: |
|
4673 | if inst.errno != errno.ENOENT: | |
4664 | raise |
|
4674 | raise | |
4665 |
|
4675 | |||
|
4676 | if hasconflictmarkers: | |||
|
4677 | ui.warn(_('warning: the following files still have conflict ' | |||
|
4678 | 'markers:\n ') + '\n '.join(hasconflictmarkers) + '\n') | |||
|
4679 | if markcheck == 'abort' and not all: | |||
|
4680 | raise error.Abort(_('conflict markers detected'), | |||
|
4681 | hint=_('use --all to mark anyway')) | |||
|
4682 | ||||
4666 | for f in tocomplete: |
|
4683 | for f in tocomplete: | |
4667 | try: |
|
4684 | try: | |
4668 | # resolve file |
|
4685 | # resolve file |
@@ -931,6 +931,9 b" coreconfigitem('storage', 'revlog.optimi" | |||||
931 | default=True, |
|
931 | default=True, | |
932 | alias=[('format', 'aggressivemergedeltas')], |
|
932 | alias=[('format', 'aggressivemergedeltas')], | |
933 | ) |
|
933 | ) | |
|
934 | coreconfigitem('experimental', 'resolve.mark-check', | |||
|
935 | default=None, | |||
|
936 | ) | |||
934 | coreconfigitem('server', 'bookmarks-pushkey-compat', |
|
937 | coreconfigitem('server', 'bookmarks-pushkey-compat', | |
935 | default=True, |
|
938 | default=True, | |
936 | ) |
|
939 | ) |
@@ -916,14 +916,17 b' def _onfilemergefailure(ui):' | |||||
916 | _haltmerge() |
|
916 | _haltmerge() | |
917 | # default action is 'continue', in which case we neither prompt nor halt |
|
917 | # default action is 'continue', in which case we neither prompt nor halt | |
918 |
|
918 | |||
|
919 | def hasconflictmarkers(data): | |||
|
920 | return bool(re.search("^(<<<<<<< .*|=======|>>>>>>> .*)$", data, | |||
|
921 | re.MULTILINE)) | |||
|
922 | ||||
919 | def _check(repo, r, ui, tool, fcd, files): |
|
923 | def _check(repo, r, ui, tool, fcd, files): | |
920 | fd = fcd.path() |
|
924 | fd = fcd.path() | |
921 | unused, unused, unused, back = files |
|
925 | unused, unused, unused, back = files | |
922 |
|
926 | |||
923 | if not r and (_toolbool(ui, tool, "checkconflicts") or |
|
927 | if not r and (_toolbool(ui, tool, "checkconflicts") or | |
924 | 'conflicts' in _toollist(ui, tool, "check")): |
|
928 | 'conflicts' in _toollist(ui, tool, "check")): | |
925 | if re.search("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcd.data(), |
|
929 | if hasconflictmarkers(fcd.data()): | |
926 | re.MULTILINE): |
|
|||
927 | r = 1 |
|
930 | r = 1 | |
928 |
|
931 | |||
929 | checked = False |
|
932 | checked = False |
@@ -373,4 +373,53 b' resolve -l should be empty' | |||||
373 |
|
373 | |||
374 | $ hg resolve -l |
|
374 | $ hg resolve -l | |
375 |
|
375 | |||
|
376 | resolve -m can be configured to look for remaining conflict markers | |||
|
377 | $ hg up -qC 2 | |||
|
378 | $ hg merge -q --tool=internal:merge 1 | |||
|
379 | warning: conflicts while merging file1! (edit, then use 'hg resolve --mark') | |||
|
380 | warning: conflicts while merging file2! (edit, then use 'hg resolve --mark') | |||
|
381 | [1] | |||
|
382 | $ hg resolve -l | |||
|
383 | U file1 | |||
|
384 | U file2 | |||
|
385 | $ echo 'remove markers' > file1 | |||
|
386 | $ hg --config experimental.resolve.mark-check=abort resolve -m | |||
|
387 | warning: the following files still have conflict markers: | |||
|
388 | file2 | |||
|
389 | abort: conflict markers detected | |||
|
390 | (use --all to mark anyway) | |||
|
391 | [255] | |||
|
392 | $ hg resolve -l | |||
|
393 | U file1 | |||
|
394 | U file2 | |||
|
395 | Try with --all from the hint | |||
|
396 | $ hg --config experimental.resolve.mark-check=abort resolve -m --all | |||
|
397 | warning: the following files still have conflict markers: | |||
|
398 | file2 | |||
|
399 | (no more unresolved files) | |||
|
400 | $ hg resolve -l | |||
|
401 | R file1 | |||
|
402 | R file2 | |||
|
403 | $ hg resolve --unmark | |||
|
404 | $ hg resolve -l | |||
|
405 | U file1 | |||
|
406 | U file2 | |||
|
407 | $ hg --config experimental.resolve.mark-check=warn resolve -m | |||
|
408 | warning: the following files still have conflict markers: | |||
|
409 | file2 | |||
|
410 | (no more unresolved files) | |||
|
411 | $ hg resolve -l | |||
|
412 | R file1 | |||
|
413 | R file2 | |||
|
414 | If the file is already marked as resolved, we don't warn about it | |||
|
415 | $ hg resolve --unmark file1 | |||
|
416 | $ hg resolve -l | |||
|
417 | U file1 | |||
|
418 | R file2 | |||
|
419 | $ hg --config experimental.resolve.mark-check=warn resolve -m | |||
|
420 | (no more unresolved files) | |||
|
421 | $ hg resolve -l | |||
|
422 | R file1 | |||
|
423 | R file2 | |||
|
424 | ||||
376 | $ cd .. |
|
425 | $ cd .. |
General Comments 0
You need to be logged in to leave comments.
Login now