##// END OF EJS Templates
hgweb: descend empty directories in web view...
hgweb: descend empty directories in web view When a manifest has a series of directories with nothing in them but a single directory, displaying the entire chain of empty directories allows for navigation down to the first non-empty directory with a single click. Because Java links package hierarchy to directory hierarchy, and because Java conventions include at least three empty directories at the top of this hierarchy, descending down empty directories is very common in Java web tools.

File last commit:

r7304:68374f1c default
r7305:c21d236c default
Show More
__init__.py
122 lines | 4.7 KiB | text/x-python | PythonLexer
Bryan O'Sullivan
Add inotify extension
r6239 # __init__.py - inotify-based status acceleration for Linux
#
# Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com>
# Copyright 2007, 2008 Brendan Cully <brendan@kublai.com>
#
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
'''inotify-based status acceleration for Linux systems
'''
# todo: socket permissions
Martin Geisler
i18n: import _ instead of gettext
r7225 from mercurial.i18n import _
Bryan O'Sullivan
Add inotify extension
r6239 from mercurial import cmdutil, util
import client, errno, os, server, socket
from weakref import proxy
def serve(ui, repo, **opts):
'''start an inotify server for this repository'''
timeout = opts.get('timeout')
if timeout:
timeout = float(timeout) * 1e3
class service:
def init(self):
Benoit Boissinot
inotify: fix traceback when the server has been already started
r6995 try:
self.master = server.Master(ui, repo, timeout)
except server.AlreadyStartedException, inst:
raise util.Abort(str(inst))
Bryan O'Sullivan
Add inotify extension
r6239
def run(self):
try:
self.master.run()
finally:
self.master.shutdown()
service = service()
cmdutil.service(opts, initfn=service.init, runfn=service.run)
def reposetup(ui, repo):
if not repo.local():
return
# XXX: weakref until hg stops relying on __del__
repo = proxy(repo)
class inotifydirstate(repo.dirstate.__class__):
# Set to True if we're the inotify server, so we don't attempt
# to recurse.
inotifyserver = False
Matt Mackall
repo.status: eliminate list_
r6753 def status(self, match, ignored, clean, unknown=True):
Matt Mackall
match: remove files arg from repo.status and friends
r6603 files = match.files()
Bryan O'Sullivan
Add inotify extension
r6239 try:
Matt Mackall
repo.status: eliminate list_
r6753 if not ignored and not self.inotifyserver:
Bryan O'Sullivan
Add inotify extension
r6239 result = client.query(ui, repo, files, match, False,
Matt Mackall
repo.status: eliminate list_
r6753 clean, unknown)
Matt Mackall
inotify: add debugging mode to inotify...
r7219 if ui.config('inotify', 'debug'):
r2 = super(inotifydirstate, self).status(
match, False, clean, unknown)
for c,a,b in zip('LMARDUIC', result, r2):
for f in a:
if f not in b:
ui.warn('*** inotify: %s +%s\n' % (c, f))
for f in b:
if f not in a:
Benoit Boissinot
inotify: fix bug in formatting
r7304 ui.warn('*** inotify: %s -%s\n' % (c, f))
Matt Mackall
inotify: add debugging mode to inotify...
r7219 result = r2
Bryan O'Sullivan
Add inotify extension
r6239 if result is not None:
return result
Benoit Boissinot
inotify: workaround ENAMETOOLONG by using symlinks...
r6997 except (OSError, socket.error), err:
Bryan O'Sullivan
Add inotify extension
r6239 if err[0] == errno.ECONNREFUSED:
ui.warn(_('(found dead inotify server socket; '
'removing it)\n'))
os.unlink(repo.join('inotify.sock'))
Benoit Boissinot
inotify: deactivate inotify status on failure...
r6996 if err[0] in (errno.ECONNREFUSED, errno.ENOENT) and \
Matt Mackall
inotify: auto-start by default when enabled
r7218 ui.configbool('inotify', 'autostart', True):
Bryan O'Sullivan
Add inotify extension
r6239 query = None
ui.debug(_('(starting inotify server)\n'))
try:
server.start(ui, repo)
query = client.query
except server.AlreadyStartedException, inst:
# another process may have started its own
# inotify server while this one was starting.
ui.debug(str(inst))
query = client.query
except Exception, inst:
ui.warn(_('could not start inotify server: '
'%s\n') % inst)
if query:
try:
return query(ui, repo, files or [], match,
Matt Mackall
repo.status: eliminate list_
r6753 ignored, clean, unknown)
Bryan O'Sullivan
Add inotify extension
r6239 except socket.error, err:
ui.warn(_('could not talk to new inotify '
Benoit Boissinot
inotify: deactivate inotify status on failure...
r6996 'server: %s\n') % err[-1])
Matt Mackall
inotify: friendlier message when daemon not running
r7217 elif err[0] == errno.ENOENT:
ui.warn(_('(inotify server not running)\n'))
Benoit Boissinot
inotify: deactivate inotify status on failure...
r6996 else:
ui.warn(_('failed to contact inotify server: %s\n')
% err[-1])
ui.print_exc()
# replace by old status function
self.status = super(inotifydirstate, self).status
Bryan O'Sullivan
Add inotify extension
r6239
return super(inotifydirstate, self).status(
Matt Mackall
repo.status: eliminate list_
r6753 match, ignored, clean, unknown)
Bryan O'Sullivan
Add inotify extension
r6239
repo.dirstate.__class__ = inotifydirstate
cmdtable = {
'^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]...')),
}