##// END OF EJS Templates
inotify: expose the same dirstate.status() interface as dirstate....
Greg Ward -
r10605:3077ee5c default
parent child Browse files
Show More
@@ -1,86 +1,86 b''
1 # __init__.py - inotify-based status acceleration for Linux
1 # __init__.py - inotify-based status acceleration for Linux
2 #
2 #
3 # Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com>
3 # Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com>
4 # Copyright 2007, 2008 Brendan Cully <brendan@kublai.com>
4 # Copyright 2007, 2008 Brendan Cully <brendan@kublai.com>
5 #
5 #
6 # This software may be used and distributed according to the terms of the
6 # This software may be used and distributed according to the terms of the
7 # GNU General Public License version 2 or any later version.
7 # GNU General Public License version 2 or any later version.
8
8
9 '''accelerate status report using Linux's inotify service'''
9 '''accelerate status report using Linux's inotify service'''
10
10
11 # todo: socket permissions
11 # todo: socket permissions
12
12
13 from mercurial.i18n import _
13 from mercurial.i18n import _
14 import server
14 import server
15 from client import client, QueryFailed
15 from client import client, QueryFailed
16
16
17 def serve(ui, repo, **opts):
17 def serve(ui, repo, **opts):
18 '''start an inotify server for this repository'''
18 '''start an inotify server for this repository'''
19 server.start(ui, repo.dirstate, repo.root, opts)
19 server.start(ui, repo.dirstate, repo.root, opts)
20
20
21 def debuginotify(ui, repo, **opts):
21 def debuginotify(ui, repo, **opts):
22 '''debugging information for inotify extension
22 '''debugging information for inotify extension
23
23
24 Prints the list of directories being watched by the inotify server.
24 Prints the list of directories being watched by the inotify server.
25 '''
25 '''
26 cli = client(ui, repo)
26 cli = client(ui, repo)
27 response = cli.debugquery()
27 response = cli.debugquery()
28
28
29 ui.write(_('directories being watched:\n'))
29 ui.write(_('directories being watched:\n'))
30 for path in response:
30 for path in response:
31 ui.write((' %s/\n') % path)
31 ui.write((' %s/\n') % path)
32
32
33 def reposetup(ui, repo):
33 def reposetup(ui, repo):
34 if not hasattr(repo, 'dirstate'):
34 if not hasattr(repo, 'dirstate'):
35 return
35 return
36
36
37 class inotifydirstate(repo.dirstate.__class__):
37 class inotifydirstate(repo.dirstate.__class__):
38
38
39 # We'll set this to false after an unsuccessful attempt so that
39 # We'll set this to false after an unsuccessful attempt so that
40 # next calls of status() within the same instance don't try again
40 # next calls of status() within the same instance don't try again
41 # to start an inotify server if it won't start.
41 # to start an inotify server if it won't start.
42 _inotifyon = True
42 _inotifyon = True
43
43
44 def status(self, match, subrepos, ignored, clean, unknown=True):
44 def status(self, match, subrepos, ignored, clean, unknown):
45 files = match.files()
45 files = match.files()
46 if '.' in files:
46 if '.' in files:
47 files = []
47 files = []
48 if self._inotifyon and not ignored and not subrepos and not self._dirty:
48 if self._inotifyon and not ignored and not subrepos and not self._dirty:
49 cli = client(ui, repo)
49 cli = client(ui, repo)
50 try:
50 try:
51 result = cli.statusquery(files, match, False,
51 result = cli.statusquery(files, match, False,
52 clean, unknown)
52 clean, unknown)
53 except QueryFailed, instr:
53 except QueryFailed, instr:
54 ui.debug(str(instr))
54 ui.debug(str(instr))
55 # don't retry within the same hg instance
55 # don't retry within the same hg instance
56 inotifydirstate._inotifyon = False
56 inotifydirstate._inotifyon = False
57 pass
57 pass
58 else:
58 else:
59 if ui.config('inotify', 'debug'):
59 if ui.config('inotify', 'debug'):
60 r2 = super(inotifydirstate, self).status(
60 r2 = super(inotifydirstate, self).status(
61 match, [], False, clean, unknown)
61 match, [], False, clean, unknown)
62 for c, a, b in zip('LMARDUIC', result, r2):
62 for c, a, b in zip('LMARDUIC', result, r2):
63 for f in a:
63 for f in a:
64 if f not in b:
64 if f not in b:
65 ui.warn('*** inotify: %s +%s\n' % (c, f))
65 ui.warn('*** inotify: %s +%s\n' % (c, f))
66 for f in b:
66 for f in b:
67 if f not in a:
67 if f not in a:
68 ui.warn('*** inotify: %s -%s\n' % (c, f))
68 ui.warn('*** inotify: %s -%s\n' % (c, f))
69 result = r2
69 result = r2
70 return result
70 return result
71 return super(inotifydirstate, self).status(
71 return super(inotifydirstate, self).status(
72 match, subrepos, ignored, clean, unknown)
72 match, subrepos, ignored, clean, unknown)
73
73
74 repo.dirstate.__class__ = inotifydirstate
74 repo.dirstate.__class__ = inotifydirstate
75
75
76 cmdtable = {
76 cmdtable = {
77 'debuginotify':
77 'debuginotify':
78 (debuginotify, [], ('hg debuginotify')),
78 (debuginotify, [], ('hg debuginotify')),
79 '^inserve':
79 '^inserve':
80 (serve,
80 (serve,
81 [('d', 'daemon', None, _('run server in background')),
81 [('d', 'daemon', None, _('run server in background')),
82 ('', 'daemon-pipefds', '', _('used internally by daemon mode')),
82 ('', 'daemon-pipefds', '', _('used internally by daemon mode')),
83 ('t', 'idle-timeout', '', _('minutes to sit idle before exiting')),
83 ('t', 'idle-timeout', '', _('minutes to sit idle before exiting')),
84 ('', 'pid-file', '', _('name of file to write process ID to'))],
84 ('', 'pid-file', '', _('name of file to write process ID to'))],
85 _('hg inserve [OPTION]...')),
85 _('hg inserve [OPTION]...')),
86 }
86 }
General Comments 0
You need to be logged in to leave comments. Login now