Mercurial > hg-stable
changeset 34550:53e4bcab346b
merge: add _checkunknowndirs function for detecting path conflicts
Add a new function which, given a file name, finds the shortest path for which
there is a conflicting file or directory in the working directory.
Differential Revision: https://phab.mercurial-scm.org/D779
author | Mark Thomas <mbthomas@fb.com> |
---|---|
date | Mon, 02 Oct 2017 14:05:30 -0700 |
parents | a991e1d6bc82 |
children | 1609a5afc4f5 |
files | mercurial/merge.py |
diffstat | 1 files changed, 28 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/merge.py Mon Oct 02 14:05:30 2017 -0700 +++ b/mercurial/merge.py Mon Oct 02 14:05:30 2017 -0700 @@ -641,6 +641,34 @@ and repo.dirstate.normalize(f) not in repo.dirstate and mctx[f2].cmp(wctx[f])) +def _checkunknowndirs(repo, f): + """ + Look for any unknown files or directories that may have a path conflict + with a file. If any path prefix of the file exists as a file or link, + then it conflicts. If the file itself is a directory that contains any + file that is not tracked, then it conflicts. + + Returns the shortest path at which a conflict occurs, or None if there is + no conflict. + """ + + # Check for path prefixes that exist as unknown files. + for p in reversed(list(util.finddirs(f))): + if (repo.wvfs.audit.check(p) + and repo.wvfs.isfileorlink(p) + and repo.dirstate.normalize(p) not in repo.dirstate): + return p + + # Check if the file conflicts with a directory containing unknown files. + if repo.wvfs.audit.check(f) and repo.wvfs.isdir(f): + # Does the directory contain any files that are not in the dirstate? + for p, dirs, files in repo.wvfs.walk(f): + for fn in files: + relf = repo.dirstate.normalize(repo.wvfs.reljoin(p, fn)) + if relf not in repo.dirstate: + return f + return None + def _checkunknownfiles(repo, wctx, mctx, force, actions, mergeforce): """ Considers any actions that care about the presence of conflicting unknown