--- a/mercurial/hgweb/hgweb_mod.py Fri Feb 01 10:12:41 2013 -0600
+++ b/mercurial/hgweb/hgweb_mod.py Fri Feb 01 15:14:05 2013 -0600
@@ -7,7 +7,7 @@
# GNU General Public License version 2 or any later version.
import os
-from mercurial import ui, hg, hook, error, encoding, templater, util
+from mercurial import ui, hg, hook, error, encoding, templater, util, repoview
from common import get_stat, ErrorResponse, permhooks, caching
from common import HTTP_OK, HTTP_NOT_MODIFIED, HTTP_BAD_REQUEST
from common import HTTP_NOT_FOUND, HTTP_SERVER_ERROR
@@ -61,7 +61,7 @@
else:
self.repo = repo
- self.repo = self.repo.filtered('served')
+ self.repo = self._getview(self.repo)
self.repo.ui.setconfig('ui', 'report_untrusted', 'off')
self.repo.ui.setconfig('ui', 'nontty', 'true')
hook.redirect(True)
@@ -88,6 +88,15 @@
return self.repo.ui.configlist(section, name, default,
untrusted=untrusted)
+ def _getview(self, repo):
+ viewconfig = self.config('web', 'view', 'served')
+ if viewconfig == 'all':
+ return repo.unfiltered()
+ elif viewconfig in repoview.filtertable:
+ return repo.filtered(viewconfig)
+ else:
+ return repo.filtered('served')
+
def refresh(self, request=None):
if request:
self.repo.ui.environ = request.env
@@ -98,7 +107,7 @@
self.mtime = st.st_mtime
self.size = st.st_size
self.repo = hg.repository(self.repo.ui, self.repo.root)
- self.repo = self.repo.filtered('served')
+ self.repo = self._getview(self.repo)
self.maxchanges = int(self.config("web", "maxchanges", 10))
self.stripecount = int(self.config("web", "stripes", 1))
self.maxshortchanges = int(self.config("web", "maxshortchanges",
@@ -233,10 +242,10 @@
return content
- except error.LookupError, err:
+ except (error.LookupError, error.RepoLookupError), err:
req.respond(HTTP_NOT_FOUND, ctype)
msg = str(err)
- if 'manifest' not in msg:
+ if util.safehasattr(err, 'name') and 'manifest' not in msg:
msg = 'revision not found: %s' % err.name
return tmpl('error', error=msg)
except (error.RepoError, error.RevlogError), inst:
--- a/mercurial/localrepo.py Fri Feb 01 10:12:41 2013 -0600
+++ b/mercurial/localrepo.py Fri Feb 01 15:14:05 2013 -0600
@@ -1874,6 +1874,20 @@
cheads.extend(c.node() for c in revset)
# even when we don't push, exchanging phase data is useful
remotephases = remote.listkeys('phases')
+ if (self.ui.configbool('ui', '_usedassubrepo', False)
+ and remotephases # server supports phases
+ and ret is None # nothing was pushed
+ and remotephases.get('publishing', False)):
+ # When:
+ # - this is a subrepo push
+ # - and remote support phase
+ # - and no changeset was pushed
+ # - and remote is publishing
+ # We may be in issue 3871 case!
+ # We drop the possible phase synchronisation done by
+ # courtesy to publish changesets possibly locally draft
+ # on the remote.
+ remotephases = {'publishing': 'True'}
if not remotephases: # old server or public only repo
phases.advanceboundary(self, phases.public, cheads)
# don't push any phase data as there is nothing to push
--- a/mercurial/subrepo.py Fri Feb 01 10:12:41 2013 -0600
+++ b/mercurial/subrepo.py Fri Feb 01 15:14:05 2013 -0600
@@ -423,6 +423,7 @@
v = r.ui.config(s, k)
if v:
self._repo.ui.setconfig(s, k, v)
+ self._repo.ui.setconfig('ui', '_usedassubrepo', 'True')
self._initrepo(r, state[0], create)
@annotatesubrepoerror
--- a/tests/test-hgweb-commands.t Fri Feb 01 10:12:41 2013 -0600
+++ b/tests/test-hgweb-commands.t Fri Feb 01 15:14:05 2013 -0600
@@ -1392,4 +1392,33 @@
$ grep Status search
Status: 200 Script output follows\r (esc)
+proper status for filtered revision
+
+
+(missing rev)
+
+ $ PATH_INFO=/rev/5; export PATH_INFO
+ $ QUERY_STRING='style=raw'
+ $ python hgweb.cgi #> search
+ Status: 404 Not Found\r (esc)
+ ETag: *\r (glob) (esc)
+ Content-Type: text/plain; charset=ascii\r (esc)
+ \r (esc)
+
+ error: unknown revision '5'
+
+
+
+(filtered rev)
+
+ $ PATH_INFO=/rev/4; export PATH_INFO
+ $ QUERY_STRING='style=raw'
+ $ python hgweb.cgi #> search
+ Status: 404 Not Found\r (esc)
+ ETag: *\r (glob) (esc)
+ Content-Type: text/plain; charset=ascii\r (esc)
+ \r (esc)
+
+ error: unknown revision '4'
+
$ cd ..
--- a/tests/test-obsolete.t Fri Feb 01 10:12:41 2013 -0600
+++ b/tests/test-obsolete.t Fri Feb 01 15:14:05 2013 -0600
@@ -743,6 +743,24 @@
$ "$TESTDIR/get-with-headers.py" --headeronly localhost:$HGPORT 'log/'`hg id --debug --id`/'babar'
200 Script output follows
+
+ $ "$TESTDIR/get-with-headers.py" --headeronly localhost:$HGPORT 'rev/68'
+ 200 Script output follows
+ $ "$TESTDIR/get-with-headers.py" --headeronly localhost:$HGPORT 'rev/67'
+ 500 Internal Server Error
+ [1]
+
+check that web.view config option:
+
+ $ kill `cat hg.pid`
+ $ cat >> .hg/hgrc << EOF
+ > [web]
+ > view=all
+ > EOF
+ $ wait
+ $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+ $ "$TESTDIR/get-with-headers.py" --headeronly localhost:$HGPORT 'rev/67'
+ 200 Script output follows
$ kill `cat hg.pid`
Checking _enable=False warning if obsolete marker exists
--- a/tests/test-subrepo.t Fri Feb 01 10:12:41 2013 -0600
+++ b/tests/test-subrepo.t Fri Feb 01 15:14:05 2013 -0600
@@ -1062,3 +1062,27 @@
? s/f19
$ rm s/f19
$ cd ..
+
+Courtesy phases synchronisation to publishing server does not block the push
+(issue3781)
+
+ $ cp -r main issue3781
+ $ cp -r main issue3781-dest
+ $ cd issue3781-dest/s
+ $ hg phase tip # show we have draft changeset
+ 5: draft
+ $ chmod a-w .hg/store/phaseroots # prevent phase push
+ $ cd ../../issue3781
+ $ cat >> .hg/hgrc << EOF
+ > [paths]
+ > default=../issue3781-dest/
+ > EOF
+ $ hg push
+ pushing to $TESTTMP/issue3781-dest
+ pushing subrepo s to $TESTTMP/issue3781-dest/s
+ searching for changes
+ no changes found
+ searching for changes
+ no changes found
+ [1]
+
--- a/tests/tinyproxy.py Fri Feb 01 10:12:41 2013 -0600
+++ b/tests/tinyproxy.py Fri Feb 01 15:14:05 2013 -0600
@@ -107,7 +107,10 @@
out = self.connection
else:
out = soc
- data = i.recv(8192)
+ try:
+ data = i.recv(8192)
+ except socket.error:
+ break
if data:
out.send(data)
count = 0