[PATCH] hgweb: make refresh interval configurable
Gregory Szorc
gregory.szorc at gmail.com
Sat Aug 22 19:06:23 UTC 2015
# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1440270190 25200
# Sat Aug 22 12:03:10 2015 -0700
# Node ID 9b6d9cb5630fe4dcc5b2c32222ef0fd467976900
# Parent d9d3d49c4cf77049d12920980e91bf8e4a4ecda2
hgweb: make refresh interval configurable
hgwebdir refreshes the set of known repositories periodically. This
is necessary because refreshing on every request could add significant
request latency.
More than once I've found myself wanting to tweak this interval at
Mozilla. I've also wanted the ability to always refresh (often when
writing tests for our replication setup).
This patch makes the refresh interval configurable. Negative values
indicate to always refresh. The default is left unchanged.
diff --git a/mercurial/help/config.txt b/mercurial/help/config.txt
--- a/mercurial/help/config.txt
+++ b/mercurial/help/config.txt
@@ -1751,8 +1751,16 @@ The full set of options is:
``push_ssl``
Whether to require that inbound pushes be transported over SSL to
prevent password sniffing. Default is True.
+``refreshinterval``
+ How frequently directory listings re-scan the filesystem for new
+ repositories, in seconds. This is relevant when wildcards are used
+ to define paths. Depending on how much filesystem traversal is
+ required, refreshing may negatively impact performance.
+
+ Default is 30. Negative values mean to always refresh.
+
``staticurl``
Base URL to use for static files. If unset, static files (e.g. the
hgicon.png favicon) will be served by the CGI script itself. Use
this setting to serve them directly with the HTTP server.
diff --git a/mercurial/hgweb/hgwebdir_mod.py b/mercurial/hgweb/hgwebdir_mod.py
--- a/mercurial/hgweb/hgwebdir_mod.py
+++ b/mercurial/hgweb/hgwebdir_mod.py
@@ -78,19 +78,25 @@ def geturlcgivars(baseurl, port):
return name, str(port), path
class hgwebdir(object):
- refreshinterval = 20
-
def __init__(self, conf, baseui=None):
self.conf = conf
self.baseui = baseui
+ self.ui = None
self.lastrefresh = 0
self.motd = None
self.refresh()
def refresh(self):
- if self.lastrefresh + self.refreshinterval > time.time():
+ refreshinterval = 30
+ if self.ui:
+ refreshinterval = self.ui.configint('web', 'refreshinterval',
+ refreshinterval)
+
+ # refreshinterval < 0 means to always refresh.
+ if (refreshinterval >= 0 and
+ self.lastrefresh + refreshinterval > time.time()):
return
if self.baseui:
u = self.baseui.copy()
diff --git a/tests/test-hgwebdir.t b/tests/test-hgwebdir.t
--- a/tests/test-hgwebdir.t
+++ b/tests/test-hgwebdir.t
@@ -1244,8 +1244,69 @@ rss-log with basedir /foo/
$ get-with-headers.py localhost:$HGPORT2 'a/rss-log' | grep '<guid'
<guid isPermaLink="true">http://hg.example.com:8080/foo/a/rev/8580ff50825a</guid>
+Path refreshing works as expected
+
+ $ killdaemons.py
+ $ mkdir $root/refreshtest
+ $ hg init $root/refreshtest/a
+ $ cat > paths.conf << EOF
+ > [paths]
+ > / = $root/refreshtest/*
+ > EOF
+ $ hg serve -p $HGPORT1 -d --pid-file hg.pid --webdir-conf paths.conf
+ $ cat hg.pid >> $DAEMON_PIDS
+
+ $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
+ 200 Script output follows
+
+
+ /a/
+
+
+By default refreshing occurs every 30s and a new repo won't be listed
+immediately.
+
+ $ hg init $root/refreshtest/b
+ $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
+ 200 Script output follows
+
+
+ /a/
+
+
+Restart the server with no refresh interval. New repo should appear
+immediately.
+
+ $ killdaemons.py
+ $ cat > paths.conf << EOF
+ > [web]
+ > refreshinterval = -1
+ > [paths]
+ > / = $root/refreshtest/*
+ > EOF
+ $ hg serve -p $HGPORT1 -d --pid-file hg.pid --webdir-conf paths.conf
+ $ cat hg.pid >> $DAEMON_PIDS
+
+ $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
+ 200 Script output follows
+
+
+ /a/
+ /b/
+
+
+ $ hg init $root/refreshtest/c
+ $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
+ 200 Script output follows
+
+
+ /a/
+ /b/
+ /c/
+
+
paths errors 1
$ cat error-paths-1.log
More information about the Mercurial-devel
mailing list