merge: refactor code to advise fsmonitor in separate function
merge.update() is quite hard to understand, found this an easy win.
The end goal is to have better organized merge and mergestate handling and then
fix some related bugs.
Differential Revision: https://phab.mercurial-scm.org/D8740
--- a/mercurial/merge.py Thu Jul 09 18:43:38 2020 +0530
+++ b/mercurial/merge.py Thu Jul 09 19:02:10 2020 +0530
@@ -1477,6 +1477,49 @@
return updateresult(updated, merged, removed, unresolved), getfiledata
+def _advertisefsmonitor(repo, num_gets, p1node):
+ # Advertise fsmonitor when its presence could be useful.
+ #
+ # We only advertise when performing an update from an empty working
+ # directory. This typically only occurs during initial clone.
+ #
+ # We give users a mechanism to disable the warning in case it is
+ # annoying.
+ #
+ # We only allow on Linux and MacOS because that's where fsmonitor is
+ # considered stable.
+ fsmonitorwarning = repo.ui.configbool(b'fsmonitor', b'warn_when_unused')
+ fsmonitorthreshold = repo.ui.configint(
+ b'fsmonitor', b'warn_update_file_count'
+ )
+ try:
+ # avoid cycle: extensions -> cmdutil -> merge
+ from . import extensions
+
+ extensions.find(b'fsmonitor')
+ fsmonitorenabled = repo.ui.config(b'fsmonitor', b'mode') != b'off'
+ # We intentionally don't look at whether fsmonitor has disabled
+ # itself because a) fsmonitor may have already printed a warning
+ # b) we only care about the config state here.
+ except KeyError:
+ fsmonitorenabled = False
+
+ if (
+ fsmonitorwarning
+ and not fsmonitorenabled
+ and p1node == nullid
+ and num_gets >= fsmonitorthreshold
+ and pycompat.sysplatform.startswith((b'linux', b'darwin'))
+ ):
+ repo.ui.warn(
+ _(
+ b'(warning: large working directory being used without '
+ b'fsmonitor enabled; enable fsmonitor to improve performance; '
+ b'see "hg help -e fsmonitor")\n'
+ )
+ )
+
+
UPDATECHECK_ABORT = b'abort' # handled at higher layers
UPDATECHECK_NONE = b'none'
UPDATECHECK_LINEAR = b'linear'
@@ -1815,46 +1858,9 @@
# note that we're in the middle of an update
repo.vfs.write(b'updatestate', p2.hex())
- # Advertise fsmonitor when its presence could be useful.
- #
- # We only advertise when performing an update from an empty working
- # directory. This typically only occurs during initial clone.
- #
- # We give users a mechanism to disable the warning in case it is
- # annoying.
- #
- # We only allow on Linux and MacOS because that's where fsmonitor is
- # considered stable.
- fsmonitorwarning = repo.ui.configbool(b'fsmonitor', b'warn_when_unused')
- fsmonitorthreshold = repo.ui.configint(
- b'fsmonitor', b'warn_update_file_count'
+ _advertisefsmonitor(
+ repo, len(actions[mergestatemod.ACTION_GET]), p1.node()
)
- try:
- # avoid cycle: extensions -> cmdutil -> merge
- from . import extensions
-
- extensions.find(b'fsmonitor')
- fsmonitorenabled = repo.ui.config(b'fsmonitor', b'mode') != b'off'
- # We intentionally don't look at whether fsmonitor has disabled
- # itself because a) fsmonitor may have already printed a warning
- # b) we only care about the config state here.
- except KeyError:
- fsmonitorenabled = False
-
- if (
- fsmonitorwarning
- and not fsmonitorenabled
- and p1.node() == nullid
- and len(actions[mergestatemod.ACTION_GET]) >= fsmonitorthreshold
- and pycompat.sysplatform.startswith((b'linux', b'darwin'))
- ):
- repo.ui.warn(
- _(
- b'(warning: large working directory being used without '
- b'fsmonitor enabled; enable fsmonitor to improve performance; '
- b'see "hg help -e fsmonitor")\n'
- )
- )
wantfiledata = updatedirstate and not branchmerge
stats, getfiledata = applyupdates(