--- a/mercurial/merge.py Fri Jan 01 12:21:11 2016 +0900
+++ b/mercurial/merge.py Sat Jan 02 01:49:18 2016 +0100
@@ -404,7 +404,7 @@
def _checkunknownfile(repo, wctx, mctx, f, f2=None):
if f2 is None:
f2 = f
- return (os.path.isfile(repo.wjoin(f))
+ return (repo.wvfs.isfileorlink(f)
and repo.wvfs.audit.check(f)
and repo.dirstate.normalize(f) not in repo.dirstate
and mctx[f2].cmp(wctx[f]))
--- a/mercurial/scmutil.py Fri Jan 01 12:21:11 2016 +0900
+++ b/mercurial/scmutil.py Sat Jan 02 01:49:18 2016 +0100
@@ -312,6 +312,17 @@
def islink(self, path=None):
return os.path.islink(self.join(path))
+ def isfileorlink(self, path=None):
+ '''return whether path is a regular file or a symlink
+
+ Unlike isfile, this doesn't follow symlinks.'''
+ try:
+ st = self.lstat(path)
+ except OSError:
+ return False
+ mode = st.st_mode
+ return stat.S_ISREG(mode) or stat.S_ISLNK(mode)
+
def reljoin(self, *paths):
"""join various elements of a path together (as os.path.join would do)
--- a/tests/test-merge1.t Fri Jan 01 12:21:11 2016 +0900
+++ b/tests/test-merge1.t Sat Jan 02 01:49:18 2016 +0100
@@ -102,6 +102,28 @@
b: untracked file differs
abort: untracked files in working directory differ from files in requested revision
[255]
+
+#if symlink
+symlinks to directories should be treated as regular files (issue5027)
+ $ rm b
+ $ ln -s 'This is file b2' b
+ $ hg merge 1
+ b: untracked file differs
+ abort: untracked files in working directory differ from files in requested revision
+ [255]
+symlinks shouldn't be followed
+ $ rm b
+ $ echo This is file b1 > .hg/b
+ $ ln -s .hg/b b
+ $ hg merge 1
+ b: untracked file differs
+ abort: untracked files in working directory differ from files in requested revision
+ [255]
+
+ $ rm b
+ $ echo This is file b2 > b
+#endif
+
merge of b expected
$ hg merge -f 1
merging b