<div dir="ltr">Pushed to the clowncopter, thanks!</div><br><div class="gmail_quote"><div dir="ltr">On Sat, Jan 2, 2016 at 3:29 AM Siddharth Agarwal <<a href="mailto:sid0@fb.com">sid0@fb.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"># HG changeset patch<br>
# User Siddharth Agarwal <<a href="mailto:sid0@fb.com" target="_blank">sid0@fb.com</a>><br>
# Date 1451733112 28800<br>
# Sat Jan 02 03:11:52 2016 -0800<br>
# Node ID a14ba255c9bb6fd11e93ec3ecaaa88ff077d0284<br>
# Parent d2b847835e055f08e538ecf3ad336b7a1cb57e30<br>
# Available At <a href="http://42.netv6.net/sid0-wip/hg/" rel="noreferrer" target="_blank">http://42.netv6.net/sid0-wip/hg/</a><br>
# hg pull <a href="http://42.netv6.net/sid0-wip/hg/" rel="noreferrer" target="_blank">http://42.netv6.net/sid0-wip/hg/</a> -r a14ba255c9bb<br>
merge: add options to warn or ignore on colliding unknown files<br>
<br>
A 'colliding unknown file' is a file that meets all of the following<br>
conditions:<br>
<br>
- is untracked or ignored on disk<br>
- is present in the changeset being merged or updated to<br>
- has different contents<br>
<br>
Previously, we would always abort whenever we saw such files. With this config<br>
option we can choose to warn and back the unknown files up instead, or even<br>
forgo the warning entirely and silently back the unknown files up.<br>
<br>
Common use cases for this configuration include a large scale transition of<br>
formerly ignored unknown files to tracked files. In some cases the files can be<br>
given new names, but in other cases, external "convention over configuration"<br>
constraints have determined that the file must retain the same name as before.<br>
<br>
diff --git a/mercurial/help/config.txt b/mercurial/help/config.txt<br>
--- a/mercurial/help/config.txt<br>
+++ b/mercurial/help/config.txt<br>
@@ -987,6 +987,19 @@ proxy.<br>
Optional. Always use the proxy, even for localhost and any entries<br>
in ``<a href="http://http_proxy.no" rel="noreferrer" target="_blank">http_proxy.no</a>``. (default: False)<br>
<br>
+``merge``<br>
+---------<br>
+<br>
+This section specifies behavior during merges and updates.<br>
+<br>
+``checkunknown``<br>
+ Controls behavior when an unknown file on disk has the same name as a tracked<br>
+ file in the changeset being merged or updated to, and has different<br>
+ contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,<br>
+ abort on such files. With ``warn``, warn on such files and back them up as<br>
+ .orig. With ``ignore``, don't print a warning and back them up as<br>
+ .orig. (default: ``abort``)<br>
+<br>
``merge-patterns``<br>
------------------<br>
<br>
diff --git a/mercurial/merge.py b/mercurial/merge.py<br>
--- a/mercurial/merge.py<br>
+++ b/mercurial/merge.py<br>
@@ -26,6 +26,7 @@ from . import (<br>
error,<br>
filemerge,<br>
obsolete,<br>
+ scmutil,<br>
subrepo,<br>
util,<br>
worker,<br>
@@ -572,6 +573,14 @@ def _checkunknownfiles(repo, wctx, mctx,<br>
"""<br>
conflicts = set()<br>
if not force:<br>
+ config = repo.ui.config('merge', 'checkunknown', default='abort')<br>
+ valid = ['abort', 'ignore', 'warn']<br>
+ if config not in valid:<br>
+ validstr = ', '.join(["'" + v + "'" for v in valid])<br>
+ raise error.ConfigError(_("merge.checkunknown not valid "<br>
+ "('%s' is none of %s)")<br>
+ % (config, validstr))<br>
+<br>
for f, (m, args, msg) in actions.iteritems():<br>
if m in ('c', 'dc'):<br>
if _checkunknownfile(repo, wctx, mctx, f):<br>
@@ -580,16 +589,21 @@ def _checkunknownfiles(repo, wctx, mctx,<br>
if _checkunknownfile(repo, wctx, mctx, f, args[0]):<br>
conflicts.add(f)<br>
<br>
- for f in sorted(conflicts):<br>
- repo.ui.warn(_("%s: untracked file differs\n") % f)<br>
- if conflicts:<br>
- raise error.Abort(_("untracked files in working directory differ "<br>
- "from files in requested revision"))<br>
+ if config == 'abort':<br>
+ for f in sorted(conflicts):<br>
+ repo.ui.warn(_("%s: untracked file differs\n") % f)<br>
+ if conflicts:<br>
+ raise error.Abort(_("untracked files in working directory "<br>
+ "differ from files in requested revision"))<br>
+ elif config == 'warn':<br>
+ for f in sorted(conflicts):<br>
+ repo.ui.warn(_("%s: replacing untracked file\n") % f)<br>
<br>
for f, (m, args, msg) in actions.iteritems():<br>
+ backup = f in conflicts<br>
if m == 'c':<br>
flags, = args<br>
- actions[f] = ('g', (flags, False), msg)<br>
+ actions[f] = ('g', (flags, backup), msg)<br>
elif m == 'cm':<br>
fl2, anc = args<br>
different = _checkunknownfile(repo, wctx, mctx, f)<br>
@@ -597,7 +611,7 @@ def _checkunknownfiles(repo, wctx, mctx,<br>
actions[f] = ('m', (f, f, None, False, anc),<br>
"remote differs from untracked local")<br>
else:<br>
- actions[f] = ('g', (fl2, False), "remote created")<br>
+ actions[f] = ('g', (fl2, backup), "remote created")<br>
<br>
def _forgetremoved(wctx, mctx, branchmerge):<br>
"""<br>
diff --git a/tests/test-merge1.t b/tests/test-merge1.t<br>
--- a/tests/test-merge1.t<br>
+++ b/tests/test-merge1.t<br>
@@ -124,7 +124,43 @@ symlinks shouldn't be followed<br>
$ echo This is file b2 > b<br>
#endif<br>
<br>
-merge of b expected<br>
+bad config<br>
+ $ hg merge 1 --config merge.checkunknown=x<br>
+ abort: merge.checkunknown not valid ('x' is none of 'abort', 'ignore', 'warn')<br>
+ [255]<br>
+this merge should fail<br>
+ $ hg merge 1 --config merge.checkunknown=abort<br>
+ b: untracked file differs<br>
+ abort: untracked files in working directory differ from files in requested revision<br>
+ [255]<br>
+<br>
+this merge should warn<br>
+ $ hg merge 1 --config merge.checkunknown=warn<br>
+ b: replacing untracked file<br>
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved<br>
+ (branch merge, don't forget to commit)<br>
+ $ cat b.orig<br>
+ This is file b2<br>
+ $ hg up --clean 2<br>
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved<br>
+ $ mv b.orig b<br>
+<br>
+this merge should silently ignore<br>
+ $ cat b<br>
+ This is file b2<br>
+ $ hg merge 1 --config merge.checkunknown=ignore<br>
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved<br>
+ (branch merge, don't forget to commit)<br>
+<br>
+ $ cat b.orig<br>
+ This is file b2<br>
+ $ hg up --clean 2<br>
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved<br>
+ $ mv b.orig b<br>
+<br>
+this merge of b should work<br>
+ $ cat b<br>
+ This is file b2<br>
$ hg merge -f 1<br>
merging b<br>
merging for b<br>
_______________________________________________<br>
Mercurial-devel mailing list<br>
<a href="mailto:Mercurial-devel@selenic.com" target="_blank">Mercurial-devel@selenic.com</a><br>
<a href="https://selenic.com/mailman/listinfo/mercurial-devel" rel="noreferrer" target="_blank">https://selenic.com/mailman/listinfo/mercurial-devel</a><br>
</blockquote></div>