# HG changeset patch # User Boris Feld # Date 2018-12-21 16:10:07 # Node ID 5125f0a9728b2b67ea7815baf3179e0b7da38fd7 # Parent 18adb747a33219717851d5f1887002d42f9a71b8 watchman: detect nested mercurial repositories and abort Disable fsmonitor on nested mercurial repositories. Only depth one repositories are detected at the moment. Differential Revision: https://phab.mercurial-scm.org/D5587 diff --git a/hgext/fsmonitor/__init__.py b/hgext/fsmonitor/__init__.py --- a/hgext/fsmonitor/__init__.py +++ b/hgext/fsmonitor/__init__.py @@ -367,6 +367,9 @@ def overridewalk(orig, self, match, subr fexists = entry['exists'] kind = getkind(fmode) + if '/.hg/' in fname or fname.endswith('/.hg'): + return bail('nested-repo-detected') + if not fexists: # if marked as deleted and we don't already have a change # record, mark it as deleted. If we already have an entry @@ -740,6 +743,14 @@ def wrapupdate(orig, repo, node, branchm repo, node, branchmerge, force, ancestor, mergeancestor, labels, matcher, **kwargs) +def repo_has_depth_one_nested_repo(repo): + for f in repo.wvfs.listdir(): + if os.path.isdir(os.path.join(repo.root, f, '.hg')): + msg = 'fsmonitor: sub-repository %r detected, fsmonitor disabled\n' + repo.ui.debug(msg % f) + return True + return False + def reposetup(ui, repo): # We don't work with largefiles or inotify exts = extensions.enabled() @@ -757,6 +768,9 @@ def reposetup(ui, repo): if repo.wvfs.exists('.hgsubstate') or repo.wvfs.exists('.hgsub'): return + if repo_has_depth_one_nested_repo(repo): + return + fsmonitorstate = state.state(repo) if fsmonitorstate.mode == 'off': return