mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 07:17:55 +03:00
inotify: introduce debuginotify, which lists which paths are under watch
This commit is contained in:
parent
ce74f8cde3
commit
21b374a449
@ -39,6 +39,18 @@ def serve(ui, repo, **opts):
|
||||
service = service()
|
||||
cmdutil.service(opts, initfn=service.init, runfn=service.run)
|
||||
|
||||
def debuginotify(ui, repo, **opts):
|
||||
'''debugging information for inotify extension
|
||||
|
||||
Prints the list of directories being watched by the inotify server.
|
||||
'''
|
||||
cli = client(ui, repo)
|
||||
response = cli.debugquery()
|
||||
|
||||
ui.write(_('directories being watched:\n'))
|
||||
for path in response:
|
||||
ui.write((' %s/\n') % path)
|
||||
|
||||
def reposetup(ui, repo):
|
||||
if not hasattr(repo, 'dirstate'):
|
||||
return
|
||||
@ -82,11 +94,13 @@ def reposetup(ui, repo):
|
||||
repo.dirstate.__class__ = inotifydirstate
|
||||
|
||||
cmdtable = {
|
||||
'debuginotify':
|
||||
(debuginotify, [], ('hg debuginotify')),
|
||||
'^inserve':
|
||||
(serve,
|
||||
[('d', 'daemon', None, _('run server in background')),
|
||||
('', 'daemon-pipefds', '', _('used internally by daemon mode')),
|
||||
('t', 'idle-timeout', '', _('minutes to sit idle before exiting')),
|
||||
('', 'pid-file', '', _('name of file to write process ID to'))],
|
||||
_('hg inserve [OPT]...')),
|
||||
(serve,
|
||||
[('d', 'daemon', None, _('run server in background')),
|
||||
('', 'daemon-pipefds', '', _('used internally by daemon mode')),
|
||||
('t', 'idle-timeout', '', _('minutes to sit idle before exiting')),
|
||||
('', 'pid-file', '', _('name of file to write process ID to'))],
|
||||
_('hg inserve [OPT]...')),
|
||||
}
|
||||
|
@ -142,5 +142,12 @@ class client(object):
|
||||
if names:
|
||||
return filter(match, names.split('\0'))
|
||||
return []
|
||||
|
||||
return map(readnames, resphdr)
|
||||
|
||||
@start_server
|
||||
def debugquery(self):
|
||||
cs, resphdr = self.query('DBUG', '')
|
||||
|
||||
nbytes = resphdr[0]
|
||||
names = cs.read(nbytes)
|
||||
return names.split('\0')
|
||||
|
@ -18,6 +18,7 @@ import cStringIO, socket, struct
|
||||
- For STAT, N+1 \0-separated strings:
|
||||
1) N different names that need checking
|
||||
2) 1 string containing all the status types to match
|
||||
- No parameter needed for DBUG
|
||||
|
||||
Server sending query answer:
|
||||
1) send protocol version number
|
||||
@ -31,7 +32,8 @@ import cStringIO, socket, struct
|
||||
version = 2
|
||||
|
||||
resphdrfmts = {
|
||||
'STAT': '>llllllll' # status requests
|
||||
'STAT': '>llllllll', # status requests
|
||||
'DBUG': '>l' # debugging queries
|
||||
}
|
||||
resphdrsizes = dict((k, struct.calcsize(v))
|
||||
for k, v in resphdrfmts.iteritems())
|
||||
|
@ -542,6 +542,13 @@ class repowatcher(object):
|
||||
def shutdown(self):
|
||||
self.watcher.close()
|
||||
|
||||
def debug(self):
|
||||
"""
|
||||
Returns a sorted list of relatives paths currently watched,
|
||||
for debugging purposes.
|
||||
"""
|
||||
return sorted(tuple[0][len(self.wprefix):] for tuple in self.watcher)
|
||||
|
||||
class server(object):
|
||||
poll_events = select.POLLIN
|
||||
|
||||
@ -624,6 +631,9 @@ class server(object):
|
||||
'c' in states and genresult('n', self.repowatcher.tree) or [],
|
||||
]]
|
||||
|
||||
def answer_dbug_query(self):
|
||||
return ['\0'.join(self.repowatcher.debug())]
|
||||
|
||||
def handle_event(self, fd, event):
|
||||
sock, addr = self.sock.accept()
|
||||
|
||||
@ -639,6 +649,8 @@ class server(object):
|
||||
|
||||
if type == 'STAT':
|
||||
results = self.answer_stat_query(cs)
|
||||
elif type == 'DBUG':
|
||||
results = self.answer_dbug_query()
|
||||
else:
|
||||
self.ui.warn(_('unrecognized query type: %s\n') % type)
|
||||
return
|
||||
|
32
tests/test-inotify-debuginotify
Executable file
32
tests/test-inotify-debuginotify
Executable file
@ -0,0 +1,32 @@
|
||||
#!/bin/sh
|
||||
|
||||
"$TESTDIR/hghave" inotify || exit 80
|
||||
|
||||
hg init
|
||||
|
||||
echo "[extensions]" >> $HGRCPATH
|
||||
echo "inotify=" >> $HGRCPATH
|
||||
|
||||
echo % inserve
|
||||
hg inserve -d --pid-file=hg.pid
|
||||
cat hg.pid >> "$DAEMON_PIDS"
|
||||
|
||||
# let the daemon finish its stuff
|
||||
sleep 1
|
||||
|
||||
echo % empty
|
||||
hg debuginotify
|
||||
|
||||
mkdir a
|
||||
sleep 1
|
||||
|
||||
echo % only 'a'
|
||||
hg debuginotify
|
||||
|
||||
rmdir a
|
||||
sleep 1
|
||||
|
||||
echo % empty again
|
||||
hg debuginotify
|
||||
|
||||
kill `cat hg.pid`
|
14
tests/test-inotify-debuginotify.out
Normal file
14
tests/test-inotify-debuginotify.out
Normal file
@ -0,0 +1,14 @@
|
||||
% inserve
|
||||
% empty
|
||||
directories being watched:
|
||||
/
|
||||
.hg/
|
||||
% only a
|
||||
directories being watched:
|
||||
/
|
||||
.hg/
|
||||
a/
|
||||
% empty again
|
||||
directories being watched:
|
||||
/
|
||||
.hg/
|
Loading…
Reference in New Issue
Block a user