annotate hgext/fsmonitor/__init__.py @ 43397:09ab61c0ab4b stable

fsmonitor: normalize clock value to bytes We normalize the value returned by watchman because we perform a number of compares with this value in code. So the easiest path forward is to normalize to bytes so we don't have to update many call sites. With this commit, the fsmonitor extension appears to be working with Python 3! Although there are still some failures in edge cases... Differential Revision: https://phab.mercurial-scm.org/D7213
author Gregory Szorc <gregory.szorc@gmail.com>
date Sat, 02 Nov 2019 14:55:45 -0700
parents 2b5aab5e9e36
children 90fba2248693
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
1 # __init__.py - fsmonitor initialization and overrides
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
2 #
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
3 # Copyright 2013-2016 Facebook, Inc.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
4 #
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
5 # This software may be used and distributed according to the terms of the
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
6 # GNU General Public License version 2 or any later version.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
7
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
8 '''Faster status operations with the Watchman file monitor (EXPERIMENTAL)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
9
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
10 Integrates the file-watching program Watchman with Mercurial to produce faster
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
11 status results.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
12
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
13 On a particular Linux system, for a real-world repository with over 400,000
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
14 files hosted on ext4, vanilla `hg status` takes 1.3 seconds. On the same
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
15 system, with fsmonitor it takes about 0.3 seconds.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
16
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
17 fsmonitor requires no configuration -- it will tell Watchman about your
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
18 repository as necessary. You'll need to install Watchman from
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
19 https://facebook.github.io/watchman/ and make sure it is in your PATH.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
20
34885
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
21 fsmonitor is incompatible with the largefiles and eol extensions, and
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
22 will disable itself if any of those are active.
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
23
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
24 The following configuration options exist:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
25
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
26 ::
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
27
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
28 [fsmonitor]
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
29 mode = {off, on, paranoid}
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
30
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
31 When `mode = off`, fsmonitor will disable itself (similar to not loading the
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
32 extension at all). When `mode = on`, fsmonitor will be enabled (the default).
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
33 When `mode = paranoid`, fsmonitor will query both Watchman and the filesystem,
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
34 and ensure that the results are consistent.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
35
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
36 ::
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
37
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
38 [fsmonitor]
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
39 timeout = (float)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
40
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
41 A value, in seconds, that determines how long fsmonitor will wait for Watchman
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
42 to return results. Defaults to `2.0`.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
43
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
44 ::
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
45
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
46 [fsmonitor]
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
47 blacklistusers = (list of userids)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
48
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
49 A list of usernames for which fsmonitor will disable itself altogether.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
50
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
51 ::
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
52
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
53 [fsmonitor]
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
54 walk_on_invalidate = (boolean)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
55
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
56 Whether or not to walk the whole repo ourselves when our cached state has been
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
57 invalidated, for example when Watchman has been restarted or .hgignore rules
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
58 have been changed. Walking the repo in that case can result in competing for
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
59 I/O with Watchman. For large repos it is recommended to set this value to
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
60 false. You may wish to set this to true if you have a very fast filesystem
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
61 that can outpace the IPC overhead of getting the result data for the full repo
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
62 from Watchman. Defaults to false.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
63
34885
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
64 ::
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
65
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
66 [fsmonitor]
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
67 warn_when_unused = (boolean)
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
68
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
69 Whether to print a warning during certain operations when fsmonitor would be
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
70 beneficial to performance but isn't enabled.
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
71
34885
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
72 ::
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
73
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
74 [fsmonitor]
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
75 warn_update_file_count = (integer)
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
76
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
77 If ``warn_when_unused`` is set and fsmonitor isn't enabled, a warning will
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
78 be printed during working directory updates if this many files will be
df2ff314e36f fsmonitor: warn when fsmonitor could be used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34647
diff changeset
79 created.
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
80 '''
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
81
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
82 # Platforms Supported
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
83 # ===================
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
84 #
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
85 # **Linux:** *Stable*. Watchman and fsmonitor are both known to work reliably,
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
86 # even under severe loads.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
87 #
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
88 # **Mac OS X:** *Stable*. The Mercurial test suite passes with fsmonitor
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
89 # turned on, on case-insensitive HFS+. There has been a reasonable amount of
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
90 # user testing under normal loads.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
91 #
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
92 # **Solaris, BSD:** *Alpha*. watchman and fsmonitor are believed to work, but
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
93 # very little testing has been done.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
94 #
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
95 # **Windows:** *Alpha*. Not in a release version of watchman or fsmonitor yet.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
96 #
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
97 # Known Issues
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
98 # ============
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
99 #
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
100 # * fsmonitor will disable itself if any of the following extensions are
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
101 # enabled: largefiles, inotify, eol; or if the repository has subrepos.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
102 # * fsmonitor will produce incorrect results if nested repos that are not
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
103 # subrepos exist. *Workaround*: add nested repo paths to your `.hgignore`.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
104 #
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
105 # The issues related to nested repos and subrepos are probably not fundamental
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
106 # ones. Patches to fix them are welcome.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
107
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
108 from __future__ import absolute_import
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
109
31846
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
110 import codecs
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29205
diff changeset
111 import hashlib
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
112 import os
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
113 import stat
31846
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
114 import sys
42652
684b56ade431 fsmonitor: add support for extra `hg debuginstall` data
Augie Fackler <augie@google.com>
parents: 42650
diff changeset
115 import tempfile
34565
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
116 import weakref
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
117
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28443
diff changeset
118 from mercurial.i18n import _
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
119 from mercurial.node import hex
43085
eef9a2d67051 py3: manually import pycompat.open into files that need it
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
120 from mercurial.pycompat import open
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
121 from mercurial import (
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
122 context,
30666
6ada1658fc6b py3: use python 3 compatible variables in hgext/fsmontor/__init__.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30332
diff changeset
123 encoding,
31846
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
124 error,
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
125 extensions,
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
126 localrepo,
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
127 merge,
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
128 pathutil,
30666
6ada1658fc6b py3: use python 3 compatible variables in hgext/fsmontor/__init__.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30332
diff changeset
129 pycompat,
34463
718f7acd6d5e fsmonitor: use configitem
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34462
diff changeset
130 registrar,
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
131 scmutil,
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
132 util,
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
133 )
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
134 from mercurial import match as matchmod
43362
ddfd0f3956f4 py3: fix fsmonitor's _handleunavailable exception message encoding
Emmanuel Leblond <emmanuel.leblond@gmail.com>
parents: 43105
diff changeset
135 from mercurial.utils import stringutil
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
136
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
137 from . import (
31846
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
138 pywatchman,
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
139 state,
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
140 watchmanclient,
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
141 )
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
142
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29341
diff changeset
143 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
144 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
145 # be specifying the version(s) of Mercurial they are tested with, or
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
146 # leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
147 testedwith = b'ships-with-hg-core'
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
148
34463
718f7acd6d5e fsmonitor: use configitem
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34462
diff changeset
149 configtable = {}
718f7acd6d5e fsmonitor: use configitem
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34462
diff changeset
150 configitem = registrar.configitem(configtable)
718f7acd6d5e fsmonitor: use configitem
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34462
diff changeset
151
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
152 configitem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
153 b'fsmonitor', b'mode', default=b'on',
34463
718f7acd6d5e fsmonitor: use configitem
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34462
diff changeset
154 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
155 configitem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
156 b'fsmonitor', b'walk_on_invalidate', default=False,
34463
718f7acd6d5e fsmonitor: use configitem
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34462
diff changeset
157 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
158 configitem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
159 b'fsmonitor', b'timeout', default=b'2',
34463
718f7acd6d5e fsmonitor: use configitem
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34462
diff changeset
160 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
161 configitem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
162 b'fsmonitor', b'blacklistusers', default=list,
34463
718f7acd6d5e fsmonitor: use configitem
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34462
diff changeset
163 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
164 configitem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
165 b'fsmonitor', b'watchman_exe', default=b'watchman',
41968
57264906a996 watchman: add the possibility to set the exact watchman binary location
Boris Feld <boris.feld@octobus.net>
parents: 41676
diff changeset
166 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
167 configitem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
168 b'fsmonitor', b'verbose', default=True, experimental=True,
41488
18adb747a332 watchman: add verbose config knob
Boris Feld <boris.feld@octobus.net>
parents: 41365
diff changeset
169 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
170 configitem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
171 b'experimental', b'fsmonitor.transaction_notify', default=False,
35313
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
172 )
34463
718f7acd6d5e fsmonitor: use configitem
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34462
diff changeset
173
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
174 # This extension is incompatible with the following blacklisted extensions
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
175 # and will disable itself when encountering one of these:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
176 _blacklist = [b'largefiles', b'eol']
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
177
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
178
42652
684b56ade431 fsmonitor: add support for extra `hg debuginstall` data
Augie Fackler <augie@google.com>
parents: 42650
diff changeset
179 def debuginstall(ui, fm):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
180 fm.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
181 b"fsmonitor-watchman",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
182 _(b"fsmonitor checking for watchman binary... (%s)\n"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
183 ui.configpath(b"fsmonitor", b"watchman_exe"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
184 )
42652
684b56ade431 fsmonitor: add support for extra `hg debuginstall` data
Augie Fackler <augie@google.com>
parents: 42650
diff changeset
185 root = tempfile.mkdtemp()
684b56ade431 fsmonitor: add support for extra `hg debuginstall` data
Augie Fackler <augie@google.com>
parents: 42650
diff changeset
186 c = watchmanclient.client(ui, root)
684b56ade431 fsmonitor: add support for extra `hg debuginstall` data
Augie Fackler <augie@google.com>
parents: 42650
diff changeset
187 err = None
684b56ade431 fsmonitor: add support for extra `hg debuginstall` data
Augie Fackler <augie@google.com>
parents: 42650
diff changeset
188 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
189 v = c.command(b"version")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
190 fm.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
191 b"fsmonitor-watchman-version",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
192 _(b" watchman binary version %s\n"),
43389
e6ce1599af74 fsmonitor: fix str/bytes mismatch when accessing watchman version
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43374
diff changeset
193 pycompat.bytestr(v["version"]),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
194 )
42652
684b56ade431 fsmonitor: add support for extra `hg debuginstall` data
Augie Fackler <augie@google.com>
parents: 42650
diff changeset
195 except watchmanclient.Unavailable as e:
684b56ade431 fsmonitor: add support for extra `hg debuginstall` data
Augie Fackler <augie@google.com>
parents: 42650
diff changeset
196 err = str(e)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
197 fm.condwrite(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
198 err,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
199 b"fsmonitor-watchman-error",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
200 _(b" watchman binary missing or broken: %s\n"),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
201 err,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
202 )
42652
684b56ade431 fsmonitor: add support for extra `hg debuginstall` data
Augie Fackler <augie@google.com>
parents: 42650
diff changeset
203 return 1 if err else 0
684b56ade431 fsmonitor: add support for extra `hg debuginstall` data
Augie Fackler <augie@google.com>
parents: 42650
diff changeset
204
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
205
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
206 def _handleunavailable(ui, state, ex):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
207 """Exception handler for Watchman interaction exceptions"""
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
208 if isinstance(ex, watchmanclient.Unavailable):
41609
286eeed14893 fsmonitor: rename new verbose config knob
Boris Feld <boris.feld@octobus.net>
parents: 41489
diff changeset
209 # experimental config: fsmonitor.verbose
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
210 if ex.warn and ui.configbool(b'fsmonitor', b'verbose'):
43362
ddfd0f3956f4 py3: fix fsmonitor's _handleunavailable exception message encoding
Emmanuel Leblond <emmanuel.leblond@gmail.com>
parents: 43105
diff changeset
211 if b'illegal_fstypes' not in stringutil.forcebytestr(ex):
ddfd0f3956f4 py3: fix fsmonitor's _handleunavailable exception message encoding
Emmanuel Leblond <emmanuel.leblond@gmail.com>
parents: 43105
diff changeset
212 ui.warn(stringutil.forcebytestr(ex) + b'\n')
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
213 if ex.invalidate:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
214 state.invalidate()
41609
286eeed14893 fsmonitor: rename new verbose config knob
Boris Feld <boris.feld@octobus.net>
parents: 41489
diff changeset
215 # experimental config: fsmonitor.verbose
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
216 if ui.configbool(b'fsmonitor', b'verbose'):
43390
5fa8ac91190e fsmonitor: coerce watchman exception to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43389
diff changeset
217 ui.log(
5fa8ac91190e fsmonitor: coerce watchman exception to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43389
diff changeset
218 b'fsmonitor',
5fa8ac91190e fsmonitor: coerce watchman exception to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43389
diff changeset
219 b'Watchman unavailable: %s\n',
5fa8ac91190e fsmonitor: coerce watchman exception to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43389
diff changeset
220 stringutil.forcebytestr(ex.msg),
5fa8ac91190e fsmonitor: coerce watchman exception to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43389
diff changeset
221 )
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
222 else:
43390
5fa8ac91190e fsmonitor: coerce watchman exception to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43389
diff changeset
223 ui.log(
5fa8ac91190e fsmonitor: coerce watchman exception to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43389
diff changeset
224 b'fsmonitor',
5fa8ac91190e fsmonitor: coerce watchman exception to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43389
diff changeset
225 b'Watchman exception: %s\n',
5fa8ac91190e fsmonitor: coerce watchman exception to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43389
diff changeset
226 stringutil.forcebytestr(ex),
5fa8ac91190e fsmonitor: coerce watchman exception to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43389
diff changeset
227 )
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
228
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
229
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
230 def _hashignore(ignore):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
231 """Calculate hash for ignore patterns and filenames
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
232
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
233 If this information changes between Mercurial invocations, we can't
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
234 rely on Watchman information anymore and have to re-scan the working
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
235 copy.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
236
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
237 """
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29205
diff changeset
238 sha1 = hashlib.sha1()
43393
bdebc7b54dca fsmonitor: make _hashignore compatible with Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43391
diff changeset
239 sha1.update(pycompat.byterepr(ignore))
bdebc7b54dca fsmonitor: make _hashignore compatible with Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43391
diff changeset
240 return pycompat.sysbytes(sha1.hexdigest())
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
241
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
242
31846
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
243 _watchmanencoding = pywatchman.encoding.get_local_encoding()
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
244 _fsencoding = sys.getfilesystemencoding() or sys.getdefaultencoding()
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
245 _fixencoding = codecs.lookup(_watchmanencoding) != codecs.lookup(_fsencoding)
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
246
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
247
31846
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
248 def _watchmantofsencoding(path):
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
249 """Fix path to match watchman and local filesystem encoding
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
250
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
251 watchman's paths encoding can differ from filesystem encoding. For example,
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
252 on Windows, it's always utf-8.
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
253 """
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
254 try:
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
255 decoded = path.decode(_watchmanencoding)
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
256 except UnicodeDecodeError as e:
43374
65c37b431e76 py3: fix fsmonitor's _watchmantofsencoding exception message encoding
Emmanuel Leblond <emmanuel.leblond@gmail.com>
parents: 43362
diff changeset
257 raise error.Abort(
65c37b431e76 py3: fix fsmonitor's _watchmantofsencoding exception message encoding
Emmanuel Leblond <emmanuel.leblond@gmail.com>
parents: 43362
diff changeset
258 stringutil.forcebytestr(e), hint=b'watchman encoding error'
65c37b431e76 py3: fix fsmonitor's _watchmantofsencoding exception message encoding
Emmanuel Leblond <emmanuel.leblond@gmail.com>
parents: 43362
diff changeset
259 )
31846
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
260
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
261 try:
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
262 encoded = decoded.encode(_fsencoding, 'strict')
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
263 except UnicodeEncodeError as e:
43374
65c37b431e76 py3: fix fsmonitor's _watchmantofsencoding exception message encoding
Emmanuel Leblond <emmanuel.leblond@gmail.com>
parents: 43362
diff changeset
264 raise error.Abort(stringutil.forcebytestr(e))
31846
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
265
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
266 return encoded
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
267
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
268
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
269 def overridewalk(orig, self, match, subrepos, unknown, ignored, full=True):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
270 '''Replacement for dirstate.walk, hooking into Watchman.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
271
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
272 Whenever full is False, ignored is False, and the Watchman client is
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
273 available, use Watchman combined with saved state to possibly return only a
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
274 subset of files.'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
275
35146
0b5716ec8500 fsmonitor: issue debug messages when we fall back to core status
Boris Feld <boris.feld@octobus.net>
parents: 35085
diff changeset
276 def bail(reason):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
277 self._ui.debug(b'fsmonitor: fallback to core status, %s\n' % reason)
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
278 return orig(match, subrepos, unknown, ignored, full=True)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
279
35146
0b5716ec8500 fsmonitor: issue debug messages when we fall back to core status
Boris Feld <boris.feld@octobus.net>
parents: 35085
diff changeset
280 if full:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
281 return bail(b'full rewalk requested')
35146
0b5716ec8500 fsmonitor: issue debug messages when we fall back to core status
Boris Feld <boris.feld@octobus.net>
parents: 35085
diff changeset
282 if ignored:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
283 return bail(b'listing ignored files')
35146
0b5716ec8500 fsmonitor: issue debug messages when we fall back to core status
Boris Feld <boris.feld@octobus.net>
parents: 35085
diff changeset
284 if not self._watchmanclient.available():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
285 return bail(b'client unavailable')
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
286 state = self._fsmonitorstate
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
287 clock, ignorehash, notefiles = state.get()
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
288 if not clock:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
289 if state.walk_on_invalidate:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
290 return bail(b'no clock')
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
291 # Initial NULL clock value, see
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
292 # https://facebook.github.io/watchman/docs/clockspec.html
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
293 clock = b'c:0:0'
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
294 notefiles = []
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
295
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
296 ignore = self._ignore
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
297 dirignore = self._dirignore
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
298 if unknown:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
299 if _hashignore(ignore) != ignorehash and clock != b'c:0:0':
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
300 # ignore list changed -- can't rely on Watchman state any more
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
301 if state.walk_on_invalidate:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
302 return bail(b'ignore rules changed')
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
303 notefiles = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
304 clock = b'c:0:0'
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
305 else:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
306 # always ignore
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
307 ignore = util.always
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
308 dirignore = util.always
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
309
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
310 matchfn = match.matchfn
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
311 matchalways = match.always()
35085
ae7ad53d3c8d fsmonitor: only access inner dirstate map if it is available
Mark Thomas <mbthomas@fb.com>
parents: 34897
diff changeset
312 dmap = self._map
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
313 if util.safehasattr(dmap, b'_map'):
35085
ae7ad53d3c8d fsmonitor: only access inner dirstate map if it is available
Mark Thomas <mbthomas@fb.com>
parents: 34897
diff changeset
314 # for better performance, directly access the inner dirstate map if the
ae7ad53d3c8d fsmonitor: only access inner dirstate map if it is available
Mark Thomas <mbthomas@fb.com>
parents: 34897
diff changeset
315 # standard dirstate implementation is in use.
ae7ad53d3c8d fsmonitor: only access inner dirstate map if it is available
Mark Thomas <mbthomas@fb.com>
parents: 34897
diff changeset
316 dmap = dmap._map
34897
2e350d2a0eca fsmonitor: use nonnormalset from dirstatemap
Jun Wu <quark@fb.com>
parents: 34886
diff changeset
317 nonnormalset = self._map.nonnormalset
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
318
34462
8337f7772aa2 fsmonitor: access copymap in new location
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33649
diff changeset
319 copymap = self._map.copymap
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
320 getkind = stat.S_IFMT
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
321 dirkind = stat.S_IFDIR
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
322 regkind = stat.S_IFREG
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
323 lnkkind = stat.S_IFLNK
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
324 join = self._join
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
325 normcase = util.normcase
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
326 fresh_instance = False
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
327
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
328 exact = skipstep3 = False
32321
7df259077d4b fsmonitor: use modern match API
Martin von Zweigbergk <martinvonz@google.com>
parents: 32226
diff changeset
329 if match.isexact(): # match.exact
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
330 exact = True
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
331 dirignore = util.always # skip step 2
32321
7df259077d4b fsmonitor: use modern match API
Martin von Zweigbergk <martinvonz@google.com>
parents: 32226
diff changeset
332 elif match.prefix(): # match.match, no patterns
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
333 skipstep3 = True
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
334
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
335 if not exact and self._checkcase:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
336 # note that even though we could receive directory entries, we're only
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
337 # interested in checking if a file with the same name exists. So only
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
338 # normalize files if possible.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
339 normalize = self._normalizefile
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
340 skipstep3 = False
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
341 else:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
342 normalize = None
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
343
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
344 # step 1: find all explicit files
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
345 results, work, dirsnotfound = self._walkexplicit(match, subrepos)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
346
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
347 skipstep3 = skipstep3 and not (work or dirsnotfound)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
348 work = [d for d in work if not dirignore(d[0])]
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
349
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
350 if not work and (exact or skipstep3):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
351 for s in subrepos:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
352 del results[s]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
353 del results[b'.hg']
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
354 return results
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
355
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
356 # step 2: query Watchman
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
357 try:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
358 # Use the user-configured timeout for the query.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
359 # Add a little slack over the top of the user query to allow for
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
360 # overheads while transferring the data
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
361 self._watchmanclient.settimeout(state.timeout + 0.1)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
362 result = self._watchmanclient.command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
363 b'query',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
364 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
365 b'fields': [b'mode', b'mtime', b'size', b'exists', b'name'],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
366 b'since': clock,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
367 b'expression': [
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
368 b'not',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
369 [
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
370 b'anyof',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
371 [b'dirname', b'.hg'],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
372 [b'name', b'.hg', b'wholename'],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
373 ],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
374 ],
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
375 b'sync_timeout': int(state.timeout * 1000),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
376 b'empty_on_fresh_instance': state.walk_on_invalidate,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
377 },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
378 )
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
379 except Exception as ex:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
380 _handleunavailable(self._ui, state, ex)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
381 self._watchmanclient.clearconnection()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
382 return bail(b'exception during run')
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
383 else:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
384 # We need to propagate the last observed clock up so that we
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
385 # can use it for our next query
43397
09ab61c0ab4b fsmonitor: normalize clock value to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43396
diff changeset
386 state.setlastclock(pycompat.sysbytes(result[b'clock']))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
387 if result[b'is_fresh_instance']:
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
388 if state.walk_on_invalidate:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
389 state.invalidate()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
390 return bail(b'fresh instance')
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
391 fresh_instance = True
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
392 # Ignore any prior noteable files from the state info
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
393 notefiles = []
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
394
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
395 # for file paths which require normalization and we encounter a case
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
396 # collision, we store our own foldmap
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
397 if normalize:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
398 foldmap = dict((normcase(k), k) for k in results)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
399
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
400 switch_slashes = pycompat.ossep == b'\\'
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
401 # The order of the results is, strictly speaking, undefined.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
402 # For case changes on a case insensitive filesystem we may receive
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
403 # two entries, one with exists=True and another with exists=False.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
404 # The exists=True entries in the same response should be interpreted
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
405 # as being happens-after the exists=False entries due to the way that
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
406 # Watchman tracks files. We use this property to reconcile deletes
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
407 # for name case changes.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
408 for entry in result[b'files']:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
409 fname = entry[b'name']
43395
2b8be670dcb6 fsmonitor: normalize Watchman paths to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43393
diff changeset
410
2b8be670dcb6 fsmonitor: normalize Watchman paths to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43393
diff changeset
411 # Watchman always give us a str. Normalize to bytes on Python 3
2b8be670dcb6 fsmonitor: normalize Watchman paths to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43393
diff changeset
412 # using Watchman's encoding, if needed.
2b8be670dcb6 fsmonitor: normalize Watchman paths to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43393
diff changeset
413 if not isinstance(fname, bytes):
2b8be670dcb6 fsmonitor: normalize Watchman paths to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43393
diff changeset
414 fname = fname.encode(_watchmanencoding)
2b8be670dcb6 fsmonitor: normalize Watchman paths to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43393
diff changeset
415
31846
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
416 if _fixencoding:
1064a296a2a7 fsmonitor: match watchman and filesystem encoding
Olivier Trempe <oliviertrempe@gmail.com>
parents: 30666
diff changeset
417 fname = _watchmantofsencoding(fname)
43395
2b8be670dcb6 fsmonitor: normalize Watchman paths to bytes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43393
diff changeset
418
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
419 if switch_slashes:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
420 fname = fname.replace(b'\\', b'/')
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
421 if normalize:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
422 normed = normcase(fname)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
423 fname = normalize(fname, True, True)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
424 foldmap[normed] = fname
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
425 fmode = entry[b'mode']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
426 fexists = entry[b'exists']
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
427 kind = getkind(fmode)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
428
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
429 if b'/.hg/' in fname or fname.endswith(b'/.hg'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
430 return bail(b'nested-repo-detected')
41489
5125f0a9728b watchman: detect nested mercurial repositories and abort
Boris Feld <boris.feld@octobus.net>
parents: 41488
diff changeset
431
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
432 if not fexists:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
433 # if marked as deleted and we don't already have a change
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
434 # record, mark it as deleted. If we already have an entry
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
435 # for fname then it was either part of walkexplicit or was
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
436 # an earlier result that was a case change
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
437 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
438 fname not in results
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
439 and fname in dmap
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
440 and (matchalways or matchfn(fname))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
441 ):
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
442 results[fname] = None
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
443 elif kind == dirkind:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
444 if fname in dmap and (matchalways or matchfn(fname)):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
445 results[fname] = None
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
446 elif kind == regkind or kind == lnkkind:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
447 if fname in dmap:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
448 if matchalways or matchfn(fname):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
449 results[fname] = entry
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
450 elif (matchalways or matchfn(fname)) and not ignore(fname):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
451 results[fname] = entry
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
452 elif fname in dmap and (matchalways or matchfn(fname)):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
453 results[fname] = None
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
454
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
455 # step 3: query notable files we don't already know about
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
456 # XXX try not to iterate over the entire dmap
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
457 if normalize:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
458 # any notable files that have changed case will already be handled
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
459 # above, so just check membership in the foldmap
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
460 notefiles = set(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
461 (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
462 normalize(f, True, True)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
463 for f in notefiles
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
464 if normcase(f) not in foldmap
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
465 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
466 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
467 visit = set(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
468 (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
469 f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
470 for f in notefiles
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
471 if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
472 f not in results and matchfn(f) and (f in dmap or not ignore(f))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
473 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
474 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
475 )
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
476
34897
2e350d2a0eca fsmonitor: use nonnormalset from dirstatemap
Jun Wu <quark@fb.com>
parents: 34886
diff changeset
477 if not fresh_instance:
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
478 if matchalways:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
479 visit.update(f for f in nonnormalset if f not in results)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
480 visit.update(f for f in copymap if f not in results)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
481 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
482 visit.update(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
483 f for f in nonnormalset if f not in results and matchfn(f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
484 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
485 visit.update(f for f in copymap if f not in results and matchfn(f))
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
486 else:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
487 if matchalways:
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
488 visit.update(
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
489 f for f, st in pycompat.iteritems(dmap) if f not in results
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
490 )
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
491 visit.update(f for f in copymap if f not in results)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
492 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
493 visit.update(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
494 f
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
495 for f, st in pycompat.iteritems(dmap)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
496 if f not in results and matchfn(f)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
497 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
498 visit.update(f for f in copymap if f not in results and matchfn(f))
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
499
33649
377e8ddaebef pathauditor: disable cache of audited paths by default (issue5628)
Yuya Nishihara <yuya@tcha.org>
parents: 33387
diff changeset
500 audit = pathutil.pathauditor(self._root, cached=True).check
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
501 auditpass = [f for f in visit if audit(f)]
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
502 auditpass.sort()
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
503 auditfail = visit.difference(auditpass)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
504 for f in auditfail:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
505 results[f] = None
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
506
43396
2b5aab5e9e36 fsmonitor: use next() instead of .next()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43395
diff changeset
507 nf = iter(auditpass)
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
508 for st in util.statfiles([join(f) for f in auditpass]):
43396
2b5aab5e9e36 fsmonitor: use next() instead of .next()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43395
diff changeset
509 f = next(nf)
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
510 if st or f in dmap:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
511 results[f] = st
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
512
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
513 for s in subrepos:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
514 del results[s]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
515 del results[b'.hg']
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
516 return results
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
517
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
518
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
519 def overridestatus(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
520 orig,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
521 self,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
522 node1=b'.',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
523 node2=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
524 match=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
525 ignored=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
526 clean=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
527 unknown=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
528 listsubrepos=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
529 ):
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
530 listignored = ignored
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
531 listclean = clean
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
532 listunknown = unknown
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
533
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
534 def _cmpsets(l1, l2):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
535 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
536 if b'FSMONITOR_LOG_FILE' in encoding.environ:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
537 fn = encoding.environ[b'FSMONITOR_LOG_FILE']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
538 f = open(fn, b'wb')
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
539 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
540 fn = b'fsmonitorfail.log'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
541 f = self.vfs.open(fn, b'wb')
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
542 except (IOError, OSError):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
543 self.ui.warn(_(b'warning: unable to write to %s\n') % fn)
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
544 return
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
545
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
546 try:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
547 for i, (s1, s2) in enumerate(zip(l1, l2)):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
548 if set(s1) != set(s2):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
549 f.write(b'sets at position %d are unequal\n' % i)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
550 f.write(b'watchman returned: %s\n' % s1)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
551 f.write(b'stat returned: %s\n' % s2)
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
552 finally:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
553 f.close()
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
554
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
555 if isinstance(node1, context.changectx):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
556 ctx1 = node1
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
557 else:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
558 ctx1 = self[node1]
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
559 if isinstance(node2, context.changectx):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
560 ctx2 = node2
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
561 else:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
562 ctx2 = self[node2]
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
563
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
564 working = ctx2.rev() is None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
565 parentworking = working and ctx1 == self[b'.']
41676
0531dff73d0b match: delete unused root and cwd arguments from {always,never,exact}() (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41609
diff changeset
566 match = match or matchmod.always()
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
567
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
568 # Maybe we can use this opportunity to update Watchman's state.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
569 # Mercurial uses workingcommitctx and/or memctx to represent the part of
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
570 # the workingctx that is to be committed. So don't update the state in
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
571 # that case.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
572 # HG_PENDING is set in the environment when the dirstate is being updated
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
573 # in the middle of a transaction; we must not update our state in that
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
574 # case, or we risk forgetting about changes in the working copy.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
575 updatestate = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
576 parentworking
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
577 and match.always()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
578 and not isinstance(ctx2, (context.workingcommitctx, context.memctx))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
579 and b'HG_PENDING' not in encoding.environ
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
580 )
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
581
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
582 try:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
583 if self._fsmonitorstate.walk_on_invalidate:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
584 # Use a short timeout to query the current clock. If that
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
585 # takes too long then we assume that the service will be slow
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
586 # to answer our query.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
587 # walk_on_invalidate indicates that we prefer to walk the
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
588 # tree ourselves because we can ignore portions that Watchman
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
589 # cannot and we tend to be faster in the warmer buffer cache
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
590 # cases.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
591 self._watchmanclient.settimeout(0.1)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
592 else:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
593 # Give Watchman more time to potentially complete its walk
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
594 # and return the initial clock. In this mode we assume that
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
595 # the filesystem will be slower than parsing a potentially
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
596 # very large Watchman result set.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
597 self._watchmanclient.settimeout(self._fsmonitorstate.timeout + 0.1)
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
598 startclock = self._watchmanclient.getcurrentclock()
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
599 except Exception as ex:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
600 self._watchmanclient.clearconnection()
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
601 _handleunavailable(self.ui, self._fsmonitorstate, ex)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
602 # boo, Watchman failed. bail
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
603 return orig(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
604 node1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
605 node2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
606 match,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
607 listignored,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
608 listclean,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
609 listunknown,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
610 listsubrepos,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
611 )
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
612
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
613 if updatestate:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
614 # We need info about unknown files. This may make things slower the
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
615 # first time, but whatever.
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
616 stateunknown = True
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
617 else:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
618 stateunknown = listunknown
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
619
32815
15e85dded933 fsmonitor: write state with wlock held and dirstate unchanged (issue5581)
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
620 if updatestate:
15e85dded933 fsmonitor: write state with wlock held and dirstate unchanged (issue5581)
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
621 ps = poststatus(startclock)
15e85dded933 fsmonitor: write state with wlock held and dirstate unchanged (issue5581)
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
622 self.addpostdsstatus(ps)
15e85dded933 fsmonitor: write state with wlock held and dirstate unchanged (issue5581)
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
623
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
624 r = orig(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
625 node1, node2, match, listignored, listclean, stateunknown, listsubrepos
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
626 )
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
627 modified, added, removed, deleted, unknown, ignored, clean = r
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
628
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
629 if not listunknown:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
630 unknown = []
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
631
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
632 # don't do paranoid checks if we're not going to query Watchman anyway
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
633 full = listclean or match.traversedir is not None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
634 if self._fsmonitorstate.mode == b'paranoid' and not full:
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
635 # run status again and fall back to the old walk this time
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
636 self.dirstate._fsmonitordisable = True
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
637
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
638 # shut the UI up
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
639 quiet = self.ui.quiet
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
640 self.ui.quiet = True
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
641 fout, ferr = self.ui.fout, self.ui.ferr
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
642 self.ui.fout = self.ui.ferr = open(os.devnull, b'wb')
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
643
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
644 try:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
645 rv2 = orig(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
646 node1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
647 node2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
648 match,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
649 listignored,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
650 listclean,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
651 listunknown,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
652 listsubrepos,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
653 )
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
654 finally:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
655 self.dirstate._fsmonitordisable = False
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
656 self.ui.quiet = quiet
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
657 self.ui.fout, self.ui.ferr = fout, ferr
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
658
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
659 # clean isn't tested since it's set to True above
40209
6b1a8c396b05 fsmonitor: use vfs instead of opener (issue5938)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 35313
diff changeset
660 with self.wlock():
6b1a8c396b05 fsmonitor: use vfs instead of opener (issue5938)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 35313
diff changeset
661 _cmpsets(
6b1a8c396b05 fsmonitor: use vfs instead of opener (issue5938)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 35313
diff changeset
662 [modified, added, removed, deleted, unknown, ignored, clean],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
663 rv2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
664 )
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
665 modified, added, removed, deleted, unknown, ignored, clean = rv2
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
666
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
667 return scmutil.status(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
668 modified, added, removed, deleted, unknown, ignored, clean
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
669 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
670
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
671
32815
15e85dded933 fsmonitor: write state with wlock held and dirstate unchanged (issue5581)
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
672 class poststatus(object):
15e85dded933 fsmonitor: write state with wlock held and dirstate unchanged (issue5581)
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
673 def __init__(self, startclock):
15e85dded933 fsmonitor: write state with wlock held and dirstate unchanged (issue5581)
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
674 self._startclock = startclock
15e85dded933 fsmonitor: write state with wlock held and dirstate unchanged (issue5581)
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
675
15e85dded933 fsmonitor: write state with wlock held and dirstate unchanged (issue5581)
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
676 def __call__(self, wctx, status):
15e85dded933 fsmonitor: write state with wlock held and dirstate unchanged (issue5581)
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
677 clock = wctx.repo()._fsmonitorstate.getlastclock() or self._startclock
15e85dded933 fsmonitor: write state with wlock held and dirstate unchanged (issue5581)
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
678 hashignore = _hashignore(wctx.repo().dirstate._ignore)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
679 notefiles = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
680 status.modified
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
681 + status.added
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
682 + status.removed
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
683 + status.deleted
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
684 + status.unknown
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
685 )
32815
15e85dded933 fsmonitor: write state with wlock held and dirstate unchanged (issue5581)
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
686 wctx.repo()._fsmonitorstate.set(clock, hashignore, notefiles)
15e85dded933 fsmonitor: write state with wlock held and dirstate unchanged (issue5581)
Siddharth Agarwal <sid0@fb.com>
parents: 32722
diff changeset
687
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
688
33386
5a9b4370bb3b fsmonitor: centralize setup procedures for dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33385
diff changeset
689 def makedirstate(repo, dirstate):
5a9b4370bb3b fsmonitor: centralize setup procedures for dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33385
diff changeset
690 class fsmonitordirstate(dirstate.__class__):
34565
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
691 def _fsmonitorinit(self, repo):
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
692 # _fsmonitordisable is used in paranoid mode
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
693 self._fsmonitordisable = False
34565
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
694 self._fsmonitorstate = repo._fsmonitorstate
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
695 self._watchmanclient = repo._watchmanclient
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
696 self._repo = weakref.proxy(repo)
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
697
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
698 def walk(self, *args, **kwargs):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
699 orig = super(fsmonitordirstate, self).walk
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
700 if self._fsmonitordisable:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
701 return orig(*args, **kwargs)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
702 return overridewalk(orig, self, *args, **kwargs)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
703
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
704 def rebuild(self, *args, **kwargs):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
705 self._fsmonitorstate.invalidate()
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
706 return super(fsmonitordirstate, self).rebuild(*args, **kwargs)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
707
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
708 def invalidate(self, *args, **kwargs):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
709 self._fsmonitorstate.invalidate()
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
710 return super(fsmonitordirstate, self).invalidate(*args, **kwargs)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
711
33386
5a9b4370bb3b fsmonitor: centralize setup procedures for dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33385
diff changeset
712 dirstate.__class__ = fsmonitordirstate
34565
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
713 dirstate._fsmonitorinit(repo)
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
714
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
715
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
716 def wrapdirstate(orig, self):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
717 ds = orig(self)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
718 # only override the dirstate when Watchman is available for the repo
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
719 if util.safehasattr(self, b'_fsmonitorstate'):
33386
5a9b4370bb3b fsmonitor: centralize setup procedures for dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33385
diff changeset
720 makedirstate(self, ds)
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
721 return ds
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
722
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
723
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
724 def extsetup(ui):
32722
de09138bf0f5 extensions: move wrapfilecache function from fsmonitor
Augie Fackler <augie@google.com>
parents: 32406
diff changeset
725 extensions.wrapfilecache(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
726 localrepo.localrepository, b'dirstate', wrapdirstate
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
727 )
34647
dacfcdd8b94e codemod: use pycompat.isdarwin
Jun Wu <quark@fb.com>
parents: 34580
diff changeset
728 if pycompat.isdarwin:
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
729 # An assist for avoiding the dangling-symlink fsevents bug
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
730 extensions.wrapfunction(os, b'symlink', wrapsymlink)
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
731
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
732 extensions.wrapfunction(merge, b'update', wrapupdate)
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
733
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
734
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
735 def wrapsymlink(orig, source, link_name):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
736 ''' if we create a dangling symlink, also touch the parent dir
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
737 to encourage fsevents notifications to work more correctly '''
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
738 try:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
739 return orig(source, link_name)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
740 finally:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
741 try:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
742 os.utime(os.path.dirname(link_name), None)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
743 except OSError:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
744 pass
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
745
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
746
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
747 class state_update(object):
30332
318a24b52eeb spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents: 29841
diff changeset
748 ''' This context manager is responsible for dispatching the state-enter
34565
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
749 and state-leave signals to the watchman service. The enter and leave
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
750 methods can be invoked manually (for scenarios where context manager
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
751 semantics are not possible). If parameters oldnode and newnode are None,
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
752 they will be populated based on current working copy in enter and
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
753 leave, respectively. Similarly, if the distance is none, it will be
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
754 calculated based on the oldnode and newnode in the leave method.'''
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
755
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
756 def __init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
757 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
758 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
759 name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
760 oldnode=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
761 newnode=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
762 distance=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
763 partial=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
764 ):
34565
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
765 self.repo = repo.unfiltered()
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
766 self.name = name
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
767 self.oldnode = oldnode
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
768 self.newnode = newnode
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
769 self.distance = distance
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
770 self.partial = partial
32334
6e0d1043e8fc fsmonitor: acquire localrepo.wlock prior to emitting hg.update state
Wez Furlong <wez@fb.com>
parents: 32321
diff changeset
771 self._lock = None
32335
354329178dee fsmonitor: don't attempt state-leave if we didn't state-enter
Wez Furlong <wez@fb.com>
parents: 32334
diff changeset
772 self.need_leave = False
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
773
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
774 def __enter__(self):
34565
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
775 self.enter()
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
776
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
777 def enter(self):
35313
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
778 # Make sure we have a wlock prior to sending notifications to watchman.
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
779 # We don't want to race with other actors. In the update case,
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
780 # merge.update is going to take the wlock almost immediately. We are
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
781 # effectively extending the lock around several short sanity checks.
34565
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
782 if self.oldnode is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
783 self.oldnode = self.repo[b'.'].node()
35313
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
784
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
785 if self.repo.currentwlock() is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
786 if util.safehasattr(self.repo, b'wlocknostateupdate'):
35313
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
787 self._lock = self.repo.wlocknostateupdate()
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
788 else:
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
789 self._lock = self.repo.wlock()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
790 self.need_leave = self._state(b'state-enter', hex(self.oldnode))
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
791 return self
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
792
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
793 def __exit__(self, type_, value, tb):
34565
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
794 abort = True if type_ else False
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
795 self.exit(abort=abort)
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
796
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
797 def exit(self, abort=False):
32334
6e0d1043e8fc fsmonitor: acquire localrepo.wlock prior to emitting hg.update state
Wez Furlong <wez@fb.com>
parents: 32321
diff changeset
798 try:
32335
354329178dee fsmonitor: don't attempt state-leave if we didn't state-enter
Wez Furlong <wez@fb.com>
parents: 32334
diff changeset
799 if self.need_leave:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
800 status = b'failed' if abort else b'ok'
34565
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
801 if self.newnode is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
802 self.newnode = self.repo[b'.'].node()
34565
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
803 if self.distance is None:
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
804 self.distance = calcdistance(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
805 self.repo, self.oldnode, self.newnode
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
806 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
807 self._state(b'state-leave', hex(self.newnode), status=status)
32334
6e0d1043e8fc fsmonitor: acquire localrepo.wlock prior to emitting hg.update state
Wez Furlong <wez@fb.com>
parents: 32321
diff changeset
808 finally:
34565
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
809 self.need_leave = False
32334
6e0d1043e8fc fsmonitor: acquire localrepo.wlock prior to emitting hg.update state
Wez Furlong <wez@fb.com>
parents: 32321
diff changeset
810 if self._lock:
6e0d1043e8fc fsmonitor: acquire localrepo.wlock prior to emitting hg.update state
Wez Furlong <wez@fb.com>
parents: 32321
diff changeset
811 self._lock.release()
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
812
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
813 def _state(self, cmd, commithash, status=b'ok'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
814 if not util.safehasattr(self.repo, b'_watchmanclient'):
32335
354329178dee fsmonitor: don't attempt state-leave if we didn't state-enter
Wez Furlong <wez@fb.com>
parents: 32334
diff changeset
815 return False
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
816 try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
817 self.repo._watchmanclient.command(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
818 cmd,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
819 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
820 b'name': self.name,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
821 b'metadata': {
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
822 # the target revision
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
823 b'rev': commithash,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
824 # approximate number of commits between current and target
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
825 b'distance': self.distance if self.distance else 0,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
826 # success/failure (only really meaningful for state-leave)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
827 b'status': status,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
828 # whether the working copy parent is changing
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
829 b'partial': self.partial,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
830 },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
831 },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
832 )
32335
354329178dee fsmonitor: don't attempt state-leave if we didn't state-enter
Wez Furlong <wez@fb.com>
parents: 32334
diff changeset
833 return True
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
834 except Exception as e:
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
835 # Swallow any errors; fire and forget
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
836 self.repo.ui.log(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
837 b'watchman', b'Exception %s while running %s\n', e, cmd
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
838 )
32335
354329178dee fsmonitor: don't attempt state-leave if we didn't state-enter
Wez Furlong <wez@fb.com>
parents: 32334
diff changeset
839 return False
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
840
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
841
34564
b79f59425964 fsmonitor: change the distance calculation
Eamonn Kent <ekent@fb.com>
parents: 34463
diff changeset
842 # Estimate the distance between two nodes
b79f59425964 fsmonitor: change the distance calculation
Eamonn Kent <ekent@fb.com>
parents: 34463
diff changeset
843 def calcdistance(repo, oldnode, newnode):
b79f59425964 fsmonitor: change the distance calculation
Eamonn Kent <ekent@fb.com>
parents: 34463
diff changeset
844 anc = repo.changelog.ancestor(oldnode, newnode)
b79f59425964 fsmonitor: change the distance calculation
Eamonn Kent <ekent@fb.com>
parents: 34463
diff changeset
845 ancrev = repo[anc].rev()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
846 distance = abs(repo[oldnode].rev() - ancrev) + abs(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
847 repo[newnode].rev() - ancrev
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
848 )
34564
b79f59425964 fsmonitor: change the distance calculation
Eamonn Kent <ekent@fb.com>
parents: 34463
diff changeset
849 return distance
b79f59425964 fsmonitor: change the distance calculation
Eamonn Kent <ekent@fb.com>
parents: 34463
diff changeset
850
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
851
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
852 # Bracket working copy updates with calls to the watchman state-enter
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
853 # and state-leave commands. This allows clients to perform more intelligent
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
854 # settling during bulk file change scenarios
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
855 # https://facebook.github.io/watchman/docs/cmd/subscribe.html#advanced-settling
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
856 def wrapupdate(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
857 orig,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
858 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
859 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
860 branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
861 force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
862 ancestor=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
863 mergeancestor=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
864 labels=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
865 matcher=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
866 **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
867 ):
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
868
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
869 distance = 0
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
870 partial = True
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
871 oldnode = repo[b'.'].node()
34565
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
872 newnode = repo[node].node()
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
873 if matcher is None or matcher.always():
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
874 partial = False
34565
4aa57627692a fsmonitor: add new watchman notifications to fsmonitor extension
Eamonn Kent <ekent@fb.com>
parents: 34564
diff changeset
875 distance = calcdistance(repo.unfiltered(), oldnode, newnode)
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
876
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
877 with state_update(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
878 repo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
879 name=b"hg.update",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
880 oldnode=oldnode,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
881 newnode=newnode,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
882 distance=distance,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
883 partial=partial,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
884 ):
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
885 return orig(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
886 repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
887 node,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
888 branchmerge,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
889 force,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
890 ancestor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
891 mergeancestor,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
892 labels,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
893 matcher,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
894 **kwargs
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
895 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
896
28443
49d65663d7e4 fsmonitor: hook up state-enter, state-leave signals
Martijn Pieters <mjpieters@fb.com>
parents: 28433
diff changeset
897
41489
5125f0a9728b watchman: detect nested mercurial repositories and abort
Boris Feld <boris.feld@octobus.net>
parents: 41488
diff changeset
898 def repo_has_depth_one_nested_repo(repo):
5125f0a9728b watchman: detect nested mercurial repositories and abort
Boris Feld <boris.feld@octobus.net>
parents: 41488
diff changeset
899 for f in repo.wvfs.listdir():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
900 if os.path.isdir(os.path.join(repo.root, f, b'.hg')):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
901 msg = b'fsmonitor: sub-repository %r detected, fsmonitor disabled\n'
41489
5125f0a9728b watchman: detect nested mercurial repositories and abort
Boris Feld <boris.feld@octobus.net>
parents: 41488
diff changeset
902 repo.ui.debug(msg % f)
5125f0a9728b watchman: detect nested mercurial repositories and abort
Boris Feld <boris.feld@octobus.net>
parents: 41488
diff changeset
903 return True
5125f0a9728b watchman: detect nested mercurial repositories and abort
Boris Feld <boris.feld@octobus.net>
parents: 41488
diff changeset
904 return False
5125f0a9728b watchman: detect nested mercurial repositories and abort
Boris Feld <boris.feld@octobus.net>
parents: 41488
diff changeset
905
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
906
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
907 def reposetup(ui, repo):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
908 # We don't work with largefiles or inotify
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
909 exts = extensions.enabled()
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
910 for ext in _blacklist:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
911 if ext in exts:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
912 ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
913 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
914 b'The fsmonitor extension is incompatible with the %s '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
915 b'extension and has been disabled.\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
916 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
917 % ext
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
918 )
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
919 return
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
920
33385
8bb4c69c4000 fsmonitor: avoid needless instantiation of dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32815
diff changeset
921 if repo.local():
8bb4c69c4000 fsmonitor: avoid needless instantiation of dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32815
diff changeset
922 # We don't work with subrepos either.
8bb4c69c4000 fsmonitor: avoid needless instantiation of dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32815
diff changeset
923 #
8bb4c69c4000 fsmonitor: avoid needless instantiation of dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32815
diff changeset
924 # if repo[None].substate can cause a dirstate parse, which is too
8bb4c69c4000 fsmonitor: avoid needless instantiation of dirstate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32815
diff changeset
925 # slow. Instead, look for a file called hgsubstate,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
926 if repo.wvfs.exists(b'.hgsubstate') or repo.wvfs.exists(b'.hgsub'):
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
927 return
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
928
41489
5125f0a9728b watchman: detect nested mercurial repositories and abort
Boris Feld <boris.feld@octobus.net>
parents: 41488
diff changeset
929 if repo_has_depth_one_nested_repo(repo):
5125f0a9728b watchman: detect nested mercurial repositories and abort
Boris Feld <boris.feld@octobus.net>
parents: 41488
diff changeset
930 return
5125f0a9728b watchman: detect nested mercurial repositories and abort
Boris Feld <boris.feld@octobus.net>
parents: 41488
diff changeset
931
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
932 fsmonitorstate = state.state(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
933 if fsmonitorstate.mode == b'off':
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
934 return
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
935
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
936 try:
43391
ffdf0bf28212 fsmonitor: access repo.root
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43390
diff changeset
937 client = watchmanclient.client(repo.ui, repo.root)
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
938 except Exception as ex:
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
939 _handleunavailable(ui, fsmonitorstate, ex)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
940 return
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
941
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
942 repo._fsmonitorstate = fsmonitorstate
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
943 repo._watchmanclient = client
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
944
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
945 dirstate, cached = localrepo.isfilecached(repo, b'dirstate')
33387
68e9762a357b fsmonitor: execute setup procedures only if dirstate is already instantiated
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33386
diff changeset
946 if cached:
68e9762a357b fsmonitor: execute setup procedures only if dirstate is already instantiated
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33386
diff changeset
947 # at this point since fsmonitorstate wasn't present,
68e9762a357b fsmonitor: execute setup procedures only if dirstate is already instantiated
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33386
diff changeset
948 # repo.dirstate is not a fsmonitordirstate
68e9762a357b fsmonitor: execute setup procedures only if dirstate is already instantiated
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33386
diff changeset
949 makedirstate(repo, dirstate)
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
950
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
951 class fsmonitorrepo(repo.__class__):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
952 def status(self, *args, **kwargs):
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
953 orig = super(fsmonitorrepo, self).status
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
954 return overridestatus(orig, self, *args, **kwargs)
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
955
35313
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
956 def wlocknostateupdate(self, *args, **kwargs):
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
957 return super(fsmonitorrepo, self).wlock(*args, **kwargs)
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
958
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
959 def wlock(self, *args, **kwargs):
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
960 l = super(fsmonitorrepo, self).wlock(*args, **kwargs)
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
961 if not ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
962 b"experimental", b"fsmonitor.transaction_notify"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42760
diff changeset
963 ):
35313
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
964 return l
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
965 if l.held != 1:
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
966 return l
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
967 origrelease = l.releasefn
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
968
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
969 def staterelease():
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
970 if origrelease:
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
971 origrelease()
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
972 if l.stateupdate:
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
973 l.stateupdate.exit()
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
974 l.stateupdate = None
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
975
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
976 try:
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
977 l.stateupdate = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
978 l.stateupdate = state_update(self, name=b"hg.transaction")
35313
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
979 l.stateupdate.enter()
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
980 l.releasefn = staterelease
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
981 except Exception as e:
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
982 # Swallow any errors; fire and forget
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
983 self.ui.log(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
984 b'watchman', b'Exception in state update %s\n', e
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
985 )
35313
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
986 return l
c67fb3bfe3a1 fsmonitor: fsmonitor should send wlock notifications to watchman
Eamonn Kent <ekent@fb.com>
parents: 35312
diff changeset
987
28433
3b67f27bb908 fsmonitor: new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff changeset
988 repo.__class__ = fsmonitorrepo