<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>