# HG changeset patch # User Matt Mackall # Date 1359753245 21600 # Node ID 462579cbad459e47e5929eb463b419c1f0ea9223 # Parent 36549fa712da69eabe4b4abbbedeb4546dc7d904# Parent 66ae2ded096887109998a48a519637d02c6bfabd merge with crew diff -r 66ae2ded0968 -r 462579cbad45 mercurial/hgweb/hgweb_mod.py --- 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: diff -r 66ae2ded0968 -r 462579cbad45 mercurial/localrepo.py --- 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 diff -r 66ae2ded0968 -r 462579cbad45 mercurial/subrepo.py --- 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 diff -r 66ae2ded0968 -r 462579cbad45 tests/test-hgweb-commands.t --- 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 .. diff -r 66ae2ded0968 -r 462579cbad45 tests/test-obsolete.t --- 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 diff -r 66ae2ded0968 -r 462579cbad45 tests/test-subrepo.t --- 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] + diff -r 66ae2ded0968 -r 462579cbad45 tests/tinyproxy.py --- 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