--- a/.hgsigs Sun Mar 04 15:29:41 2018 -0500
+++ b/.hgsigs Sat May 05 18:06:45 2018 -0700
@@ -160,3 +160,7 @@
d334afc585e29577f271c5eda03378736a16ca6b 0 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
--- a/.hgtags Sun Mar 04 15:29:41 2018 -0500
+++ b/.hgtags Sat May 05 18:06:45 2018 -0700
@@ -173,3 +173,7 @@
d334afc585e29577f271c5eda03378736a16ca6b 4.5
369aadf7a3264b03c8b09efce715bc41e6ab4a9b 4.5.1
8bba684efde7f45add05f737952093bb2aa07155 4.5.2
+7de7bd407251af2bc98e5b809c8598ee95830daf 4.5.3
+ed5448edcbfa747b9154099e18630e49024fd47b 4.6rc0
+1ec874717d8a93b19e0d50628443e0ee5efab3a9 4.6rc1
+6614cac550aea66d19c601e45efd1b7bd08d7c40 4.6
--- a/contrib/phabricator.py Sun Mar 04 15:29:41 2018 -0500
+++ b/contrib/phabricator.py Sat May 05 18:06:45 2018 -0700
@@ -68,6 +68,7 @@
)
from mercurial.utils import (
procutil,
+ stringutil,
)
cmdtable = {}
@@ -328,6 +329,19 @@
}
callconduit(ctx.repo(), 'differential.setdiffproperty', params)
+ params = {
+ 'diff_id': diff[r'id'],
+ 'name': 'local:commits',
+ 'data': json.dumps({
+ ctx.hex(): {
+ 'author': stringutil.person(ctx.user()),
+ 'authorEmail': stringutil.email(ctx.user()),
+ 'time': ctx.date()[0],
+ },
+ }),
+ }
+ callconduit(ctx.repo(), 'differential.setdiffproperty', params)
+
def createdifferentialrevision(ctx, revid=None, parentrevid=None, oldnode=None,
olddiff=None, actions=None):
"""create or update a Differential Revision
--- a/hgext/infinitepush/__init__.py Sun Mar 04 15:29:41 2018 -0500
+++ b/hgext/infinitepush/__init__.py Sat May 05 18:06:45 2018 -0700
@@ -1067,7 +1067,7 @@
bookmarknode = nodesctx[-1].hex() if nodesctx else None
key = None
if newheadscount:
- with open(bundlefile, 'r') as f:
+ with open(bundlefile, 'rb') as f:
bundledata = f.read()
with logservicecall(log, 'bundlestore',
bundlesize=len(bundledata)):
--- a/hgext/infinitepush/fileindexapi.py Sun Mar 04 15:29:41 2018 -0500
+++ b/hgext/infinitepush/fileindexapi.py Sat May 05 18:06:45 2018 -0700
@@ -15,6 +15,8 @@
import os
+from mercurial import util
+
from mercurial.utils import stringutil
from . import indexapi
@@ -82,6 +84,7 @@
for dirpath, _, books in self._repo.vfs.walk(self._bookmarkmap):
for book in books:
bookmark = os.path.join(dirpath, book)[prefixlen:]
+ bookmark = util.pconvert(bookmark)
if not matcher(bookmark):
continue
yield bookmark, self._read(os.path.join(dirpath, book))
--- a/hgext/infinitepush/store.py Sun Mar 04 15:29:41 2018 -0500
+++ b/hgext/infinitepush/store.py Sat May 05 18:06:45 2018 -0700
@@ -79,19 +79,18 @@
if not os.path.exists(dirpath):
os.makedirs(dirpath)
- with open(self._filepath(filename), 'w') as f:
+ with open(self._filepath(filename), 'wb') as f:
f.write(data)
return filename
def read(self, key):
try:
- f = open(self._filepath(key), 'r')
+ with open(self._filepath(key), 'rb') as f:
+ return f.read()
except IOError:
return None
- return f.read()
-
class externalbundlestore(abstractbundlestore):
def __init__(self, put_binary, put_args, get_binary, get_args):
"""
--- a/hgext/notify.py Sun Mar 04 15:29:41 2018 -0500
+++ b/hgext/notify.py Sat May 05 18:06:45 2018 -0700
@@ -455,7 +455,7 @@
changegroup. else send one email per changeset.'''
n = notifier(ui, repo, hooktype)
- ctx = repo[node]
+ ctx = repo.unfiltered()[node]
if not n.subs:
ui.debug('notify: no subscribers to repository %s\n' % n.root)
@@ -469,8 +469,7 @@
count = 0
author = ''
if hooktype == 'changegroup' or hooktype == 'outgoing':
- start, end = ctx.rev(), len(repo)
- for rev in xrange(start, end):
+ for rev in repo.changelog.revs(start=ctx.rev()):
if n.node(repo[rev]):
count += 1
if not author:
@@ -482,7 +481,7 @@
ui.pushbuffer()
if count:
n.diff(ctx, repo['tip'])
- else:
+ elif ctx.rev() in repo:
if not n.node(ctx):
ui.popbuffer()
ui.note(_('notify: suppressing notification for merge %d:%s\n') %
--- a/hgext/remotenames.py Sun Mar 04 15:29:41 2018 -0500
+++ b/hgext/remotenames.py Sat May 05 18:06:45 2018 -0700
@@ -6,7 +6,7 @@
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
-""" showing remotebookmarks and remotebranches in UI
+""" showing remotebookmarks and remotebranches in UI (EXPERIMENTAL)
By default both remotebookmarks and remotebranches are turned on. Config knob to
control the individually are as follows.
--- a/mercurial/cmdutil.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/cmdutil.py Sat May 05 18:06:45 2018 -0700
@@ -1537,7 +1537,7 @@
# --exact with --no-commit is still useful in that it does merge
# and branch bits
ui.warn(_("warning: can't check exact import with --no-commit\n"))
- elif opts.get('exact') and hex(n) != nodeid:
+ elif opts.get('exact') and (not n or hex(n) != nodeid):
raise error.Abort(_('patch is damaged or loses information'))
msg = _('applied to working directory')
if n:
--- a/mercurial/color.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/color.py Sat May 05 18:06:45 2018 -0700
@@ -90,16 +90,16 @@
'branches.inactive': 'none',
'diff.changed': 'white',
'diff.deleted': 'red',
- 'diff.deleted.changed': 'red',
- 'diff.deleted.unchanged': 'red dim',
+ 'diff.deleted.changed': 'red bold underline',
+ 'diff.deleted.unchanged': 'red',
'diff.diffline': 'bold',
'diff.extended': 'cyan bold',
'diff.file_a': 'red bold',
'diff.file_b': 'green bold',
'diff.hunk': 'magenta',
'diff.inserted': 'green',
- 'diff.inserted.changed': 'green',
- 'diff.inserted.unchanged': 'green dim',
+ 'diff.inserted.changed': 'green bold underline',
+ 'diff.inserted.unchanged': 'green',
'diff.tab': '',
'diff.trailingwhitespace': 'bold red_background',
'changeset.public': '',
--- a/mercurial/context.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/context.py Sat May 05 18:06:45 2018 -0700
@@ -497,8 +497,10 @@
changeid = hex(changeid)
except TypeError:
pass
- except (error.FilteredIndexError, error.FilteredLookupError,
- error.FilteredRepoLookupError):
+ except (error.FilteredIndexError, error.FilteredLookupError):
+ raise error.FilteredRepoLookupError(_("filtered revision '%s'")
+ % changeid)
+ except error.FilteredRepoLookupError:
raise
except IndexError:
pass
--- a/mercurial/debugcommands.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/debugcommands.py Sat May 05 18:06:45 2018 -0700
@@ -462,6 +462,8 @@
def _debugdisplaystyle(ui):
ui.write(_('available style:\n'))
+ if not ui._styles:
+ return
width = max(len(s) for s in ui._styles)
for label, effects in sorted(ui._styles.items()):
ui.write('%s' % label, label=label)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/diffhelper.py Sat May 05 18:06:45 2018 -0700
@@ -0,0 +1,77 @@
+# diffhelper.py - helper routines for patch
+#
+# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from __future__ import absolute_import
+
+from .i18n import _
+
+from . import (
+ error,
+)
+
+def addlines(fp, hunk, lena, lenb, a, b):
+ """Read lines from fp into the hunk
+
+ The hunk is parsed into two arrays, a and b. a gets the old state of
+ the text, b gets the new state. The control char from the hunk is saved
+ when inserting into a, but not b (for performance while deleting files.)
+ """
+ while True:
+ todoa = lena - len(a)
+ todob = lenb - len(b)
+ num = max(todoa, todob)
+ if num == 0:
+ break
+ for i in xrange(num):
+ s = fp.readline()
+ if not s:
+ raise error.ParseError(_('incomplete hunk'))
+ if s == "\\ No newline at end of file\n":
+ fixnewline(hunk, a, b)
+ continue
+ if s == '\n' or s == '\r\n':
+ # Some patches may be missing the control char
+ # on empty lines. Supply a leading space.
+ s = ' ' + s
+ hunk.append(s)
+ if s.startswith('+'):
+ b.append(s[1:])
+ elif s.startswith('-'):
+ a.append(s)
+ else:
+ b.append(s[1:])
+ a.append(s)
+
+def fixnewline(hunk, a, b):
+ """Fix up the last lines of a and b when the patch has no newline at EOF"""
+ l = hunk[-1]
+ # tolerate CRLF in last line
+ if l.endswith('\r\n'):
+ hline = l[:-2]
+ else:
+ hline = l[:-1]
+
+ if hline.startswith((' ', '+')):
+ b[-1] = hline[1:]
+ if hline.startswith((' ', '-')):
+ a[-1] = hline
+ hunk[-1] = hline
+
+def testhunk(a, b, bstart):
+ """Compare the lines in a with the lines in b
+
+ a is assumed to have a control char at the start of each line, this char
+ is ignored in the compare.
+ """
+ alen = len(a)
+ blen = len(b)
+ if alen > blen - bstart or bstart < 0:
+ return False
+ for i in xrange(alen):
+ if a[i][1:] != b[i + bstart]:
+ return False
+ return True
--- a/mercurial/diffhelpers.py Sun Mar 04 15:29:41 2018 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-# diffhelpers.py - helper routines for patch
-#
-# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
-#
-# This software may be used and distributed according to the terms of the
-# GNU General Public License version 2 or any later version.
-
-from __future__ import absolute_import
-
-from .i18n import _
-
-from . import (
- error,
-)
-
-def addlines(fp, hunk, lena, lenb, a, b):
- """Read lines from fp into the hunk
-
- The hunk is parsed into two arrays, a and b. a gets the old state of
- the text, b gets the new state. The control char from the hunk is saved
- when inserting into a, but not b (for performance while deleting files.)
- """
- while True:
- todoa = lena - len(a)
- todob = lenb - len(b)
- num = max(todoa, todob)
- if num == 0:
- break
- for i in xrange(num):
- s = fp.readline()
- if not s:
- raise error.ParseError(_('incomplete hunk'))
- if s == "\\ No newline at end of file\n":
- fixnewline(hunk, a, b)
- continue
- if s == '\n' or s == '\r\n':
- # Some patches may be missing the control char
- # on empty lines. Supply a leading space.
- s = ' ' + s
- hunk.append(s)
- if s.startswith('+'):
- b.append(s[1:])
- elif s.startswith('-'):
- a.append(s)
- else:
- b.append(s[1:])
- a.append(s)
-
-def fixnewline(hunk, a, b):
- """Fix up the last lines of a and b when the patch has no newline at EOF"""
- l = hunk[-1]
- # tolerate CRLF in last line
- if l.endswith('\r\n'):
- hline = l[:-2]
- else:
- hline = l[:-1]
-
- if hline.startswith((' ', '+')):
- b[-1] = hline[1:]
- if hline.startswith((' ', '-')):
- a[-1] = hline
- hunk[-1] = hline
-
-def testhunk(a, b, bstart):
- """Compare the lines in a with the lines in b
-
- a is assumed to have a control char at the start of each line, this char
- is ignored in the compare.
- """
- alen = len(a)
- blen = len(b)
- if alen > blen - bstart:
- return False
- for i in xrange(alen):
- if a[i][1:] != b[i + bstart]:
- return False
- return True
--- a/mercurial/filelog.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/filelog.py Sat May 05 18:06:45 2018 -0700
@@ -7,16 +7,16 @@
from __future__ import absolute_import
-from .thirdparty.zope import (
- interface as zi,
-)
from . import (
error,
repository,
revlog,
)
+from .utils import (
+ interfaceutil,
+)
-@zi.implementer(repository.ifilestorage)
+@interfaceutil.implementer(repository.ifilestorage)
class filelog(object):
def __init__(self, opener, path):
self._revlog = revlog.revlog(opener,
@@ -135,7 +135,9 @@
return False
t = self.revision(node)
m = revlog.parsemeta(t)[0]
- if m and "copy" in m:
+ # copy and copyrev occur in pairs. In rare cases due to bugs,
+ # one can occur without the other.
+ if m and "copy" in m and "copyrev" in m:
return (m["copy"], revlog.bin(m["copyrev"]))
return False
--- a/mercurial/help/internals/bundle2.txt Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/help/internals/bundle2.txt Sat May 05 18:06:45 2018 -0700
@@ -61,7 +61,7 @@
The following stream level parameters are defined:
-compression
+Compression
Compression format of payload data. ``GZ`` denotes zlib. ``BZ``
denotes bzip2. ``ZS`` denotes zstandard.
--- a/mercurial/hgweb/hgweb_mod.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/hgweb/hgweb_mod.py Sat May 05 18:06:45 2018 -0700
@@ -399,6 +399,12 @@
tag = 'W/"%d"' % self.mtime
if req.headers.get('If-None-Match') == tag:
res.status = '304 Not Modified'
+ # Content-Type may be defined globally. It isn't valid on a
+ # 304, so discard it.
+ try:
+ del res.headers[b'Content-Type']
+ except KeyError:
+ pass
# Response body not allowed on 304.
res.setbodybytes('')
return res.sendresponse()
--- a/mercurial/hgweb/hgwebdir_mod.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/hgweb/hgwebdir_mod.py Sat May 05 18:06:45 2018 -0700
@@ -428,7 +428,10 @@
uenv.iteritems()}
req = requestmod.parserequestfromenv(
uenv, reponame=virtualrepo,
- altbaseurl=self.ui.config('web', 'baseurl'))
+ altbaseurl=self.ui.config('web', 'baseurl'),
+ # Reuse wrapped body file object otherwise state
+ # tracking can get confused.
+ bodyfh=req.bodyfh)
try:
# ensure caller gets private copy of ui
repo = hg.repository(self.ui.copy(), real)
--- a/mercurial/hgweb/request.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/hgweb/request.py Sat May 05 18:06:45 2018 -0700
@@ -124,7 +124,7 @@
# WSGI environment dict, unmodified.
rawenv = attr.ib()
-def parserequestfromenv(env, reponame=None, altbaseurl=None):
+def parserequestfromenv(env, reponame=None, altbaseurl=None, bodyfh=None):
"""Parse URL components from environment variables.
WSGI defines request attributes via environment variables. This function
@@ -144,6 +144,9 @@
if the request were to ``http://myserver:9000/prefix/rev/@``. In other
words, ``wsgi.url_scheme``, ``SERVER_NAME``, ``SERVER_PORT``, and
``SCRIPT_NAME`` are all effectively replaced by components from this URL.
+
+ ``bodyfh`` can be used to specify a file object to read the request body
+ from. If not defined, ``wsgi.input`` from the environment dict is used.
"""
# PEP 3333 defines the WSGI spec and is a useful reference for this code.
@@ -307,9 +310,11 @@
if 'CONTENT_TYPE' in env and 'HTTP_CONTENT_TYPE' not in env:
headers['Content-Type'] = env['CONTENT_TYPE']
- bodyfh = env['wsgi.input']
- if 'Content-Length' in headers:
- bodyfh = util.cappedreader(bodyfh, int(headers['Content-Length']))
+ if bodyfh is None:
+ bodyfh = env['wsgi.input']
+ if 'Content-Length' in headers:
+ bodyfh = util.cappedreader(bodyfh,
+ int(headers['Content-Length'] or '0'))
return parsedrequest(method=env['REQUEST_METHOD'],
url=fullurl, baseurl=baseurl,
@@ -468,6 +473,7 @@
if k.lower() not in ('date', 'etag', 'expires',
'cache-control',
'content-location',
+ 'content-security-policy',
'vary')}
if badheaders:
raise error.ProgrammingError(
--- a/mercurial/hgweb/server.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/hgweb/server.py Sat May 05 18:06:45 2018 -0700
@@ -122,6 +122,14 @@
self.sent_headers = False
path, query = _splitURI(self.path)
+ # Ensure the slicing of path below is valid
+ if (path != self.server.prefix
+ and not path.startswith(self.server.prefix + b'/')):
+ self._start_response(common.statusmessage(404), [])
+ self._write("Not Found")
+ self._done()
+ return
+
env = {}
env[r'GATEWAY_INTERFACE'] = r'CGI/1.1'
env[r'REQUEST_METHOD'] = self.command
--- a/mercurial/httppeer.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/httppeer.py Sat May 05 18:06:45 2018 -0700
@@ -20,9 +20,6 @@
from .thirdparty import (
cbor,
)
-from .thirdparty.zope import (
- interface as zi,
-)
from . import (
bundle2,
error,
@@ -38,6 +35,9 @@
wireprotov2peer,
wireprotov2server,
)
+from .utils import (
+ interfaceutil,
+)
httplib = util.httplib
urlerr = util.urlerr
@@ -328,13 +328,24 @@
return res
+class RedirectedRepoError(error.RepoError):
+ def __init__(self, msg, respurl):
+ super(RedirectedRepoError, self).__init__(msg)
+ self.respurl = respurl
+
def parsev1commandresponse(ui, baseurl, requrl, qs, resp, compressible,
allowcbor=False):
# record the url we got redirected to
+ redirected = False
respurl = pycompat.bytesurl(resp.geturl())
if respurl.endswith(qs):
respurl = respurl[:-len(qs)]
+ qsdropped = False
+ else:
+ qsdropped = True
+
if baseurl.rstrip('/') != respurl.rstrip('/'):
+ redirected = True
if not ui.quiet:
ui.warn(_('real URL is %s\n') % respurl)
@@ -351,10 +362,16 @@
# application/hg-changegroup. We don't support such old servers.
if not proto.startswith('application/mercurial-'):
ui.debug("requested URL: '%s'\n" % util.hidepassword(requrl))
- raise error.RepoError(
- _("'%s' does not appear to be an hg repository:\n"
- "---%%<--- (%s)\n%s\n---%%<---\n")
- % (safeurl, proto or 'no content-type', resp.read(1024)))
+ msg = _("'%s' does not appear to be an hg repository:\n"
+ "---%%<--- (%s)\n%s\n---%%<---\n") % (
+ safeurl, proto or 'no content-type', resp.read(1024))
+
+ # Some servers may strip the query string from the redirect. We
+ # raise a special error type so callers can react to this specially.
+ if redirected and qsdropped:
+ raise RedirectedRepoError(msg, respurl)
+ else:
+ raise error.RepoError(msg)
try:
subtype = proto.split('-', 1)[1]
@@ -434,8 +451,6 @@
# End of ipeercommands interface.
- # look up capabilities only when needed
-
def _callstream(self, cmd, _compressible=False, **args):
args = pycompat.byteskwargs(args)
@@ -582,7 +597,7 @@
# will resolve to Future.result.
return self.result(timeout)
-@zi.implementer(repository.ipeercommandexecutor)
+@interfaceutil.implementer(repository.ipeercommandexecutor)
class httpv2executor(object):
def __init__(self, ui, opener, requestbuilder, apiurl, descriptor):
self._ui = ui
@@ -731,8 +746,9 @@
pass
# TODO implement interface for version 2 peers
-@zi.implementer(repository.ipeerconnection, repository.ipeercapabilities,
- repository.ipeerrequests)
+@interfaceutil.implementer(repository.ipeerconnection,
+ repository.ipeercapabilities,
+ repository.ipeerrequests)
class httpv2peer(object):
def __init__(self, ui, repourl, apipath, opener, requestbuilder,
apidescriptor):
@@ -852,12 +868,32 @@
req, requrl, qs = makev1commandrequest(ui, requestbuilder, caps,
capable, url, 'capabilities',
args)
-
resp = sendrequest(ui, opener, req)
- respurl, ct, resp = parsev1commandresponse(ui, url, requrl, qs, resp,
- compressible=False,
- allowcbor=advertisev2)
+ # The server may redirect us to the repo root, stripping the
+ # ?cmd=capabilities query string from the URL. The server would likely
+ # return HTML in this case and ``parsev1commandresponse()`` would raise.
+ # We catch this special case and re-issue the capabilities request against
+ # the new URL.
+ #
+ # We should ideally not do this, as a redirect that drops the query
+ # string from the URL is arguably a server bug. (Garbage in, garbage out).
+ # However, Mercurial clients for several years appeared to handle this
+ # issue without behavior degradation. And according to issue 5860, it may
+ # be a longstanding bug in some server implementations. So we allow a
+ # redirect that drops the query string to "just work."
+ try:
+ respurl, ct, resp = parsev1commandresponse(ui, url, requrl, qs, resp,
+ compressible=False,
+ allowcbor=advertisev2)
+ except RedirectedRepoError as e:
+ req, requrl, qs = makev1commandrequest(ui, requestbuilder, caps,
+ capable, e.respurl,
+ 'capabilities', args)
+ resp = sendrequest(ui, opener, req)
+ respurl, ct, resp = parsev1commandresponse(ui, url, requrl, qs, resp,
+ compressible=False,
+ allowcbor=advertisev2)
try:
rawdata = resp.read()
--- a/mercurial/localrepo.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/localrepo.py Sat May 05 18:06:45 2018 -0700
@@ -21,9 +21,6 @@
nullid,
short,
)
-from .thirdparty.zope import (
- interface as zi,
-)
from . import (
bookmarks,
branchmap,
@@ -68,6 +65,7 @@
vfs as vfsmod,
)
from .utils import (
+ interfaceutil,
procutil,
stringutil,
)
@@ -153,7 +151,7 @@
'unbundle'}
legacycaps = moderncaps.union({'changegroupsubset'})
-@zi.implementer(repository.ipeercommandexecutor)
+@interfaceutil.implementer(repository.ipeercommandexecutor)
class localcommandexecutor(object):
def __init__(self, peer):
self._peer = peer
@@ -196,7 +194,7 @@
def close(self):
self._closed = True
-@zi.implementer(repository.ipeercommands)
+@interfaceutil.implementer(repository.ipeercommands)
class localpeer(repository.peer):
'''peer for a local repo; reflects only the most recent API'''
@@ -324,7 +322,7 @@
# End of peer interface.
-@zi.implementer(repository.ipeerlegacycommands)
+@interfaceutil.implementer(repository.ipeerlegacycommands)
class locallegacypeer(localpeer):
'''peer extension which implements legacy methods too; used for tests with
restricted capabilities'''
@@ -365,7 +363,7 @@
# set to reflect that the extension knows how to handle that requirements.
featuresetupfuncs = set()
-@zi.implementer(repository.completelocalrepository)
+@interfaceutil.implementer(repository.completelocalrepository)
class localrepository(object):
# obsolete experimental requirements:
@@ -850,8 +848,7 @@
try:
self[changeid]
return True
- except (error.RepoLookupError, error.FilteredIndexError,
- error.FilteredLookupError):
+ except error.RepoLookupError:
return False
def __nonzero__(self):
--- a/mercurial/patch.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/patch.py Sat May 05 18:06:45 2018 -0700
@@ -28,7 +28,7 @@
)
from . import (
copies,
- diffhelpers,
+ diffhelper,
encoding,
error,
mail,
@@ -800,7 +800,7 @@
# if there's skew we want to emit the "(offset %d lines)" even
# when the hunk cleanly applies at start + skew, so skip the
# fast case code
- if self.skew == 0 and diffhelpers.testhunk(old, self.lines, oldstart):
+ if self.skew == 0 and diffhelper.testhunk(old, self.lines, oldstart):
if self.remove:
self.backend.unlink(self.fname)
else:
@@ -827,7 +827,7 @@
cand = [oldstart]
for l in cand:
- if not old or diffhelpers.testhunk(old, self.lines, l):
+ if not old or diffhelper.testhunk(old, self.lines, l):
self.lines[l : l + len(old)] = new
self.offset += len(new) - len(old)
self.skew = l - orig_start
@@ -1259,8 +1259,8 @@
self.starta = int(self.starta)
self.startb = int(self.startb)
try:
- diffhelpers.addlines(lr, self.hunk, self.lena, self.lenb,
- self.a, self.b)
+ diffhelper.addlines(lr, self.hunk, self.lena, self.lenb,
+ self.a, self.b)
except error.ParseError as e:
raise PatchError(_("bad hunk #%d: %s") % (self.number, e))
# if we hit eof before finishing out the hunk, the last line will
@@ -1379,7 +1379,7 @@
def _fixnewline(self, lr):
l = lr.readline()
if l.startswith('\ '):
- diffhelpers.fixnewline(self.hunk, self.a, self.b)
+ diffhelper.fixnewline(self.hunk, self.a, self.b)
else:
lr.push(l)
--- a/mercurial/repository.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/repository.py Sat May 05 18:06:45 2018 -0700
@@ -8,14 +8,14 @@
from __future__ import absolute_import
from .i18n import _
-from .thirdparty.zope import (
- interface as zi,
-)
from . import (
error,
)
+from .utils import (
+ interfaceutil,
+)
-class ipeerconnection(zi.Interface):
+class ipeerconnection(interfaceutil.Interface):
"""Represents a "connection" to a repository.
This is the base interface for representing a connection to a repository.
@@ -24,7 +24,7 @@
This is not a complete interface definition and should not be used
outside of this module.
"""
- ui = zi.Attribute("""ui.ui instance""")
+ ui = interfaceutil.Attribute("""ui.ui instance""")
def url():
"""Returns a URL string representing this peer.
@@ -61,7 +61,7 @@
associated with the peer should be cleaned up.
"""
-class ipeercapabilities(zi.Interface):
+class ipeercapabilities(interfaceutil.Interface):
"""Peer sub-interface related to capabilities."""
def capable(name):
@@ -81,7 +81,7 @@
Raises a ``CapabilityError`` if the capability isn't present.
"""
-class ipeercommands(zi.Interface):
+class ipeercommands(interfaceutil.Interface):
"""Client-side interface for communicating over the wire protocol.
This interface is used as a gateway to the Mercurial wire protocol.
@@ -170,7 +170,7 @@
Returns the integer number of heads added to the peer.
"""
-class ipeerlegacycommands(zi.Interface):
+class ipeerlegacycommands(interfaceutil.Interface):
"""Interface for implementing support for legacy wire protocol commands.
Wire protocol commands transition to legacy status when they are no longer
@@ -202,7 +202,7 @@
def changegroupsubset(bases, heads, source):
pass
-class ipeercommandexecutor(zi.Interface):
+class ipeercommandexecutor(interfaceutil.Interface):
"""Represents a mechanism to execute remote commands.
This is the primary interface for requesting that wire protocol commands
@@ -259,7 +259,7 @@
This method may call ``sendcommands()`` if there are buffered commands.
"""
-class ipeerrequests(zi.Interface):
+class ipeerrequests(interfaceutil.Interface):
"""Interface for executing commands on a peer."""
def commandexecutor():
@@ -290,7 +290,7 @@
All peer instances must conform to this interface.
"""
-@zi.implementer(ipeerbase)
+@interfaceutil.implementer(ipeerbase)
class peer(object):
"""Base class for peer repositories."""
@@ -314,7 +314,7 @@
_('cannot %s; remote repository does not support the %r '
'capability') % (purpose, name))
-class ifilerevisionssequence(zi.Interface):
+class ifilerevisionssequence(interfaceutil.Interface):
"""Contains index data for all revisions of a file.
Types implementing this behave like lists of tuples. The index
@@ -365,7 +365,7 @@
def insert(self, i, entry):
"""Add an item to the index at specific revision."""
-class ifileindex(zi.Interface):
+class ifileindex(interfaceutil.Interface):
"""Storage interface for index data of a single file.
File storage data is divided into index metadata and data storage.
@@ -377,7 +377,7 @@
* DAG data (storing and querying the relationship between nodes).
* Metadata to facilitate storage.
"""
- index = zi.Attribute(
+ index = interfaceutil.Attribute(
"""An ``ifilerevisionssequence`` instance.""")
def __len__():
@@ -470,7 +470,7 @@
def candelta(baserev, rev):
""""Whether a delta can be generated between two revisions."""
-class ifiledata(zi.Interface):
+class ifiledata(interfaceutil.Interface):
"""Storage interface for data storage of a specific file.
This complements ``ifileindex`` and provides an interface for accessing
@@ -536,7 +536,7 @@
revision data.
"""
-class ifilemutation(zi.Interface):
+class ifilemutation(interfaceutil.Interface):
"""Storage interface for mutation events of a tracked file."""
def add(filedata, meta, transaction, linkrev, p1, p2):
@@ -608,13 +608,13 @@
class ifilestorage(ifileindex, ifiledata, ifilemutation):
"""Complete storage interface for a single tracked file."""
- version = zi.Attribute(
+ version = interfaceutil.Attribute(
"""Version number of storage.
TODO this feels revlog centric and could likely be removed.
""")
- storedeltachains = zi.Attribute(
+ storedeltachains = interfaceutil.Attribute(
"""Whether the store stores deltas.
TODO deltachains are revlog centric. This can probably removed
@@ -622,7 +622,7 @@
data.
""")
- _generaldelta = zi.Attribute(
+ _generaldelta = interfaceutil.Attribute(
"""Whether deltas can be against any parent revision.
TODO this is used by changegroup code and it could probably be
@@ -642,59 +642,59 @@
TODO this is used by verify and it should not be part of the interface.
"""
-class completelocalrepository(zi.Interface):
+class completelocalrepository(interfaceutil.Interface):
"""Monolithic interface for local repositories.
This currently captures the reality of things - not how things should be.
"""
- supportedformats = zi.Attribute(
+ supportedformats = interfaceutil.Attribute(
"""Set of requirements that apply to stream clone.
This is actually a class attribute and is shared among all instances.
""")
- openerreqs = zi.Attribute(
+ openerreqs = interfaceutil.Attribute(
"""Set of requirements that are passed to the opener.
This is actually a class attribute and is shared among all instances.
""")
- supported = zi.Attribute(
+ supported = interfaceutil.Attribute(
"""Set of requirements that this repo is capable of opening.""")
- requirements = zi.Attribute(
+ requirements = interfaceutil.Attribute(
"""Set of requirements this repo uses.""")
- filtername = zi.Attribute(
+ filtername = interfaceutil.Attribute(
"""Name of the repoview that is active on this repo.""")
- wvfs = zi.Attribute(
+ wvfs = interfaceutil.Attribute(
"""VFS used to access the working directory.""")
- vfs = zi.Attribute(
+ vfs = interfaceutil.Attribute(
"""VFS rooted at the .hg directory.
Used to access repository data not in the store.
""")
- svfs = zi.Attribute(
+ svfs = interfaceutil.Attribute(
"""VFS rooted at the store.
Used to access repository data in the store. Typically .hg/store.
But can point elsewhere if the store is shared.
""")
- root = zi.Attribute(
+ root = interfaceutil.Attribute(
"""Path to the root of the working directory.""")
- path = zi.Attribute(
+ path = interfaceutil.Attribute(
"""Path to the .hg directory.""")
- origroot = zi.Attribute(
+ origroot = interfaceutil.Attribute(
"""The filesystem path that was used to construct the repo.""")
- auditor = zi.Attribute(
+ auditor = interfaceutil.Attribute(
"""A pathauditor for the working directory.
This checks if a path refers to a nested repository.
@@ -702,40 +702,40 @@
Operates on the filesystem.
""")
- nofsauditor = zi.Attribute(
+ nofsauditor = interfaceutil.Attribute(
"""A pathauditor for the working directory.
This is like ``auditor`` except it doesn't do filesystem checks.
""")
- baseui = zi.Attribute(
+ baseui = interfaceutil.Attribute(
"""Original ui instance passed into constructor.""")
- ui = zi.Attribute(
+ ui = interfaceutil.Attribute(
"""Main ui instance for this instance.""")
- sharedpath = zi.Attribute(
+ sharedpath = interfaceutil.Attribute(
"""Path to the .hg directory of the repo this repo was shared from.""")
- store = zi.Attribute(
+ store = interfaceutil.Attribute(
"""A store instance.""")
- spath = zi.Attribute(
+ spath = interfaceutil.Attribute(
"""Path to the store.""")
- sjoin = zi.Attribute(
+ sjoin = interfaceutil.Attribute(
"""Alias to self.store.join.""")
- cachevfs = zi.Attribute(
+ cachevfs = interfaceutil.Attribute(
"""A VFS used to access the cache directory.
Typically .hg/cache.
""")
- filteredrevcache = zi.Attribute(
+ filteredrevcache = interfaceutil.Attribute(
"""Holds sets of revisions to be filtered.""")
- names = zi.Attribute(
+ names = interfaceutil.Attribute(
"""A ``namespaces`` instance.""")
def close():
@@ -750,19 +750,19 @@
def filtered(name, visibilityexceptions=None):
"""Obtain a named view of this repository."""
- obsstore = zi.Attribute(
+ obsstore = interfaceutil.Attribute(
"""A store of obsolescence data.""")
- changelog = zi.Attribute(
+ changelog = interfaceutil.Attribute(
"""A handle on the changelog revlog.""")
- manifestlog = zi.Attribute(
+ manifestlog = interfaceutil.Attribute(
"""A handle on the root manifest revlog.""")
- dirstate = zi.Attribute(
+ dirstate = interfaceutil.Attribute(
"""Working directory state.""")
- narrowpats = zi.Attribute(
+ narrowpats = interfaceutil.Attribute(
"""Matcher patterns for this repository's narrowspec.""")
def narrowmatch():
@@ -978,7 +978,7 @@
def checkpush(pushop):
pass
- prepushoutgoinghooks = zi.Attribute(
+ prepushoutgoinghooks = interfaceutil.Attribute(
"""util.hooks instance.""")
def pushkey(namespace, key, old, new):
--- a/mercurial/revlog.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/revlog.py Sat May 05 18:06:45 2018 -0700
@@ -1466,7 +1466,7 @@
if id in self._pcache:
return self._pcache[id]
- if len(id) < 40:
+ if len(id) <= 40:
try:
# hex(node)[:...]
l = len(id) // 2 # grab an even number of digits
--- a/mercurial/sshpeer.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/sshpeer.py Sat May 05 18:06:45 2018 -0700
@@ -261,11 +261,9 @@
handshake.insert(0, 'upgrade %s %s\n' % (token, upgradecaps))
if requestlog:
- ui.debug('devel-peer-request: hello\n')
+ ui.debug('devel-peer-request: hello+between\n')
+ ui.debug('devel-peer-request: pairs: %d bytes\n' % len(pairsarg))
ui.debug('sending hello command\n')
- if requestlog:
- ui.debug('devel-peer-request: between\n')
- ui.debug('devel-peer-request: pairs: %d bytes\n' % len(pairsarg))
ui.debug('sending between command\n')
stdin.write(''.join(handshake))
--- a/mercurial/templates/paper/changeset.tmpl Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/templates/paper/changeset.tmpl Sat May 05 18:06:45 2018 -0700
@@ -73,9 +73,9 @@
<th class="diffstat">diffstat</th>
<td class="diffstat">
{diffsummary}
- <a id="diffstatexpand" href="javascript:toggleDiffstat()">[<tt>+</tt>]</a>
+ <a id="diffstatexpand" class="diffstattoggle" href="#">[<tt>+</tt>]</a>
<div id="diffstatdetails" style="display:none;">
- <a href="javascript:toggleDiffstat()">[<tt>-</tt>]</a>
+ <a class="diffstattoggle" href="#">[<tt>-</tt>]</a>
<table class="diffstat-table stripes2">{diffstat}</table>
</div>
</td>
@@ -83,7 +83,7 @@
</table>
<div class="overflow">
-<div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+<div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
<div class="sourcefirst"> line diff</div>
<div class="stripes2 diffblocks">
{diff}
--- a/mercurial/templates/paper/filediff.tmpl Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/templates/paper/filediff.tmpl Sat May 05 18:06:45 2018 -0700
@@ -65,7 +65,7 @@
</table>
<div class="overflow">
-<div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+<div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
<div class="sourcefirst"> line diff</div>
<div class="stripes2 diffblocks">
{diff}
--- a/mercurial/templates/paper/filerevision.tmpl Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/templates/paper/filerevision.tmpl Sat May 05 18:06:45 2018 -0700
@@ -65,7 +65,7 @@
</table>
<div class="overflow">
-<div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+<div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
<div class="sourcefirst"> line source</div>
<pre class="sourcelines stripes4 wrap bottomline"
data-logurl="{url|urlescape}log/{symrev}/{file|urlescape}"
--- a/mercurial/templates/static/mercurial.js Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/templates/static/mercurial.js Sat May 05 18:06:45 2018 -0700
@@ -328,14 +328,15 @@
}
}
-function toggleDiffstat() {
+function toggleDiffstat(event) {
var curdetails = document.getElementById('diffstatdetails').style.display;
var curexpand = curdetails === 'none' ? 'inline' : 'none';
document.getElementById('diffstatdetails').style.display = curexpand;
document.getElementById('diffstatexpand').style.display = curdetails;
+ event.preventDefault();
}
-function toggleLinewrap() {
+function toggleLinewrap(event) {
function getLinewrap() {
var nodes = document.getElementsByClassName('sourcelines');
// if there are no such nodes, error is thrown here
@@ -360,6 +361,7 @@
}
setLinewrap(!getLinewrap());
+ event.preventDefault();
}
function format(str, replacements) {
@@ -551,6 +553,28 @@
form.style.display = 'block';
}
+function addDiffStatToggle() {
+ var els = document.getElementsByClassName("diffstattoggle");
+
+ for (var i = 0; i < els.length; i++) {
+ els[i].addEventListener("click", toggleDiffstat, false);
+ }
+}
+
+function addLineWrapToggle() {
+ var els = document.getElementsByClassName("linewraptoggle");
+
+ for (var i = 0; i < els.length; i++) {
+ var nodes = els[i].getElementsByClassName("linewraplink");
+
+ for (var j = 0; j < nodes.length; j++) {
+ nodes[j].addEventListener("click", toggleLinewrap, false);
+ }
+ }
+}
+
document.addEventListener('DOMContentLoaded', function() {
process_dates();
+ addDiffStatToggle();
+ addLineWrapToggle();
}, false);
--- a/mercurial/util.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/util.py Sat May 05 18:06:45 2018 -0700
@@ -1037,14 +1037,27 @@
(3, 9, None)
>>> versiontuple(v, 4)
(3, 9, None, 'rc+2-02a8fea4289b')
+
+ >>> versiontuple(b'4.6rc0')
+ (4, 6, None, 'rc0')
+ >>> versiontuple(b'4.6rc0+12-425d55e54f98')
+ (4, 6, None, 'rc0+12-425d55e54f98')
+ >>> versiontuple(b'.1.2.3')
+ (None, None, None, '.1.2.3')
+ >>> versiontuple(b'12.34..5')
+ (12, 34, None, '..5')
+ >>> versiontuple(b'1.2.3.4.5.6')
+ (1, 2, 3, '.4.5.6')
"""
if not v:
v = version()
- parts = remod.split('[\+-]', v, 1)
- if len(parts) == 1:
- vparts, extra = parts[0], None
+ m = remod.match(br'(\d+(?:\.\d+){,2})[\+-]?(.*)', v)
+ if not m:
+ vparts, extra = '', v
+ elif m.group(2):
+ vparts, extra = m.groups()
else:
- vparts, extra = parts
+ vparts, extra = m.group(1), None
vints = []
for i in vparts.split('.'):
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/utils/interfaceutil.py Sat May 05 18:06:45 2018 -0700
@@ -0,0 +1,40 @@
+# interfaceutil.py - Utilities for declaring interfaces.
+#
+# Copyright 2018 Gregory Szorc <gregory.szorc@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+# zope.interface imposes a run-time cost due to module import overhead and
+# bookkeeping for declaring interfaces. So, we use stubs for various
+# zope.interface primitives unless instructed otherwise.
+
+from __future__ import absolute_import
+
+from .. import (
+ encoding,
+)
+
+if encoding.environ.get('HGREALINTERFACES'):
+ from ..thirdparty.zope import (
+ interface as zi,
+ )
+
+ Attribute = zi.Attribute
+ Interface = zi.Interface
+ implementer = zi.implementer
+else:
+ class Attribute(object):
+ def __init__(self, __name__, __doc__=''):
+ pass
+
+ class Interface(object):
+ def __init__(self, name, bases=(), attrs=None, __doc__=None,
+ __module__=None):
+ pass
+
+ def implementer(*ifaces):
+ def wrapper(cls):
+ return cls
+
+ return wrapper
--- a/mercurial/wireprotoserver.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/wireprotoserver.py Sat May 05 18:06:45 2018 -0700
@@ -15,9 +15,6 @@
from .thirdparty import (
cbor,
)
-from .thirdparty.zope import (
- interface as zi,
-)
from . import (
encoding,
error,
@@ -29,6 +26,7 @@
wireprotov2server,
)
from .utils import (
+ interfaceutil,
procutil,
)
@@ -62,7 +60,7 @@
return ''.join(chunks)
-@zi.implementer(wireprototypes.baseprotocolhandler)
+@interfaceutil.implementer(wireprototypes.baseprotocolhandler)
class httpv1protocolhandler(object):
def __init__(self, req, ui, checkperm):
self._req = req
@@ -489,7 +487,7 @@
fout.write(b'\n')
fout.flush()
-@zi.implementer(wireprototypes.baseprotocolhandler)
+@interfaceutil.implementer(wireprototypes.baseprotocolhandler)
class sshv1protocolhandler(object):
"""Handler for requests services via version 1 of SSH protocol."""
def __init__(self, ui, fin, fout):
--- a/mercurial/wireprototypes.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/wireprototypes.py Sat May 05 18:06:45 2018 -0700
@@ -9,14 +9,14 @@
bin,
hex,
)
-from .thirdparty.zope import (
- interface as zi,
-)
from .i18n import _
from . import (
error,
util,
)
+from .utils import (
+ interfaceutil,
+)
# Names of the SSH protocol implementations.
SSHV1 = 'ssh-v1'
@@ -179,7 +179,7 @@
'stream': 'boolean',
}
-class baseprotocolhandler(zi.Interface):
+class baseprotocolhandler(interfaceutil.Interface):
"""Abstract base class for wire protocol handlers.
A wire protocol handler serves as an interface between protocol command
@@ -188,7 +188,7 @@
the request, handle response types, etc.
"""
- name = zi.Attribute(
+ name = interfaceutil.Attribute(
"""The name of the protocol implementation.
Used for uniquely identifying the transport type.
--- a/mercurial/wireprotov1peer.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/wireprotov1peer.py Sat May 05 18:06:45 2018 -0700
@@ -15,9 +15,6 @@
from .node import (
bin,
)
-from .thirdparty.zope import (
- interface as zi,
-)
from . import (
bundle2,
changegroup as changegroupmod,
@@ -29,6 +26,9 @@
util,
wireprototypes,
)
+from .utils import (
+ interfaceutil,
+)
urlreq = util.urlreq
@@ -110,7 +110,7 @@
# on that.
return self.result(timeout)
-@zi.implementer(repository.ipeercommandexecutor)
+@interfaceutil.implementer(repository.ipeercommandexecutor)
class peerexecutor(object):
def __init__(self, peer):
self._peer = peer
@@ -308,7 +308,8 @@
else:
f.set_result(result)
-@zi.implementer(repository.ipeercommands, repository.ipeerlegacycommands)
+@interfaceutil.implementer(repository.ipeercommands,
+ repository.ipeerlegacycommands)
class wirepeer(repository.peer):
"""Client-side interface for communicating with a peer repository.
--- a/mercurial/wireprotov2server.py Sun Mar 04 15:29:41 2018 -0500
+++ b/mercurial/wireprotov2server.py Sat May 05 18:06:45 2018 -0700
@@ -12,9 +12,6 @@
from .thirdparty import (
cbor,
)
-from .thirdparty.zope import (
- interface as zi,
-)
from . import (
encoding,
error,
@@ -24,6 +21,9 @@
wireprotoframing,
wireprototypes,
)
+from .utils import (
+ interfaceutil,
+)
FRAMINGTYPE = b'application/mercurial-exp-framing-0005'
@@ -340,7 +340,7 @@
return func(repo, proto, **args)
-@zi.implementer(wireprototypes.baseprotocolhandler)
+@interfaceutil.implementer(wireprototypes.baseprotocolhandler)
class httpv2protocolhandler(object):
def __init__(self, req, ui, args=None):
self._req = req
--- a/tests/test-check-code.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-check-code.t Sat May 05 18:06:45 2018 -0700
@@ -51,3 +51,15 @@
hgeditor
hgweb.cgi
setup.py
+
+Prevent adding modules which could be shadowed by ancient .so/.dylib.
+
+ $ testrepohg files \
+ > mercurial/base85.py \
+ > mercurial/bdiff.py \
+ > mercurial/diffhelpers.py \
+ > mercurial/mpatch.py \
+ > mercurial/osutil.py \
+ > mercurial/parsers.py \
+ > mercurial/zstd.py
+ [1]
--- a/tests/test-check-commit.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-check-commit.t Sat May 05 18:06:45 2018 -0700
@@ -8,16 +8,20 @@
$ cd $TESTDIR/..
+ $ REVSET='not public() and ::. and not desc("# no-check-commit")'
+
$ mkdir "$TESTTMP/p"
- $ testrepohg export --git -o "$TESTTMP/p/%n-%h" \
- > -r 'not public() and ::. and not desc("# no-check-commit")'
- $ for f in `ls "$TESTTMP/p"`; do
- > contrib/check-commit < "$TESTTMP/p/$f" > "$TESTTMP/check-commit.out"
- > if [ $? -ne 0 ]; then
- > node="${f##*-}"
- > echo "Revision $node does not comply with rules"
- > echo '------------------------------------------------------'
- > cat ${TESTTMP}/check-commit.out
- > echo
- > fi
- > done
+ $ REVS=`testrepohg log -r "$REVSET" -T.`
+ $ if [ -n "$REVS" ] ; then
+ > testrepohg export --git -o "$TESTTMP/p/%n-%h" -r "$REVSET"
+ > for f in `ls "$TESTTMP/p"`; do
+ > contrib/check-commit < "$TESTTMP/p/$f" > "$TESTTMP/check-commit.out"
+ > if [ $? -ne 0 ]; then
+ > node="${f##*-}"
+ > echo "Revision $node does not comply with rules"
+ > echo '------------------------------------------------------'
+ > cat ${TESTTMP}/check-commit.out
+ > echo
+ > fi
+ > done
+ > fi
--- a/tests/test-check-interfaces.py Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-check-interfaces.py Sat May 05 18:06:45 2018 -0700
@@ -2,7 +2,17 @@
from __future__ import absolute_import, print_function
+from mercurial import encoding
+encoding.environ[b'HGREALINTERFACES'] = b'1'
+
import os
+import subprocess
+import sys
+
+# Only run if tests are run in a repo
+if subprocess.call(['python', '%s/hghave' % os.environ['TESTDIR'],
+ 'test-repo']):
+ sys.exit(80)
from mercurial.thirdparty.zope import (
interface as zi,
--- a/tests/test-check-module-imports.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-check-module-imports.t Sat May 05 18:06:45 2018 -0700
@@ -27,6 +27,7 @@
> -X i18n/posplit \
> -X mercurial/thirdparty \
> -X tests/hypothesishelpers.py \
+ > -X tests/test-check-interfaces.py \
> -X tests/test-commit-interactive.t \
> -X tests/test-contrib-check-code.t \
> -X tests/test-demandimport.py \
--- a/tests/test-debugcommands.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-debugcommands.t Sat May 05 18:06:45 2018 -0700
@@ -333,6 +333,19 @@
.hg/cache/rbc-names-v1
.hg/cache/branch2-served
+Test debugcolor
+
+#if no-windows
+ $ hg debugcolor --style --color always | egrep 'mode|style|log\.'
+ color mode: ansi
+ available style:
+ \x1b[0;33mlog.changeset\x1b[0m: \x1b[0;33myellow\x1b[0m (esc)
+#endif
+
+ $ hg debugcolor --style --color never
+ color mode: None
+ available style:
+
$ cd ..
Test internal debugstacktrace command
@@ -411,10 +424,9 @@
$ hg --config ui.ssh="\"$PYTHON\" \"$TESTDIR/dummyssh\"" --debug debugpeer ssh://user@dummy/debugrevlog
running "*" "*/tests/dummyssh" 'user@dummy' 'hg -R debugrevlog serve --stdio' (glob) (no-windows !)
running "*" "*\tests/dummyssh" "user@dummy" "hg -R debugrevlog serve --stdio" (glob) (windows !)
- devel-peer-request: hello
+ devel-peer-request: hello+between
+ devel-peer-request: pairs: 81 bytes
sending hello command
- devel-peer-request: between
- devel-peer-request: pairs: 81 bytes
sending between command
remote: 413
remote: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
--- a/tests/test-fix.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-fix.t Sat May 05 18:06:45 2018 -0700
@@ -493,11 +493,12 @@
$ printf "NO FIX NEEDED\n" > foo.whole
$ hg add
adding foo.whole
- $ cp foo.whole foo.whole.orig
+ $ cp -p foo.whole foo.whole.orig
+ $ cp -p foo.whole.orig foo.whole
$ sleep 2 # mtime has a resolution of one or two seconds.
$ hg fix --working-dir
- $ f foo.whole --newer foo.whole.orig
- foo.whole: older than foo.whole.orig
+ $ f foo.whole.orig --newer foo.whole
+ foo.whole.orig: newer than foo.whole
$ cd ..
@@ -514,8 +515,11 @@
$ printf "hello\n" > hello.txt
$ hg add
adding hello.txt
- $ hg --config "fix.fail:command=printf 'HELLO\n' ; \
- > printf '{rootpath}: some\nerror' >&2" \
+ $ cat >> $TESTTMP/cmd.sh <<'EOF'
+ > printf 'HELLO\n'
+ > printf "$@: some\nerror" >&2
+ > EOF
+ $ hg --config "fix.fail:command=sh $TESTTMP/cmd.sh {rootpath}" \
> --config "fix.fail:fileset=hello.txt" \
> fix --working-dir
[wdir] fail: hello.txt: some
--- a/tests/test-help.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-help.t Sat May 05 18:06:45 2018 -0700
@@ -278,7 +278,6 @@
purge command to delete untracked files from the working
directory
relink recreates hardlinks between repository clones
- remotenames showing remotebookmarks and remotebranches in UI
schemes extend schemes with shortcuts to repository swarms
share share a common history between several working directories
shelve save and restore changes to the working directory
--- a/tests/test-hgweb-commands.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-hgweb-commands.t Sat May 05 18:06:45 2018 -0700
@@ -916,9 +916,9 @@
<td class="diffstat">
2 files changed, 2 insertions(+), 0 deletions(-)
- <a id="diffstatexpand" href="javascript:toggleDiffstat()">[<tt>+</tt>]</a>
+ <a id="diffstatexpand" class="diffstattoggle" href="#">[<tt>+</tt>]</a>
<div id="diffstatdetails" style="display:none;">
- <a href="javascript:toggleDiffstat()">[<tt>-</tt>]</a>
+ <a class="diffstattoggle" href="#">[<tt>-</tt>]</a>
<table class="diffstat-table stripes2"> <tr>
<td class="diffstat-file"><a href="#l1.1">da/foo</a></td>
<td class="diffstat-total" align="right">1</td>
@@ -942,7 +942,7 @@
</table>
<div class="overflow">
- <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+ <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
<div class="sourcefirst"> line diff</div>
<div class="stripes2 diffblocks">
<div class="bottomline inc-lineno"><pre class="sourcelines wrap">
@@ -1342,7 +1342,7 @@
</table>
<div class="overflow">
- <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+ <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
<div class="sourcefirst"> line source</div>
<pre class="sourcelines stripes4 wrap bottomline"
data-logurl="/log/1/foo"
@@ -1476,7 +1476,7 @@
</table>
<div class="overflow">
- <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+ <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
<div class="sourcefirst"> line source</div>
<pre class="sourcelines stripes4 wrap bottomline"
data-logurl="/log/2/foo"
--- a/tests/test-hgweb-csp.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-hgweb-csp.t Sat May 05 18:06:45 2018 -0700
@@ -54,6 +54,12 @@
200 Script output follows
content-security-policy: script-src https://example.com/ 'unsafe-inline'
+ $ get-with-headers.py --twice --headeronly localhost:$HGPORT repo1/static/style.css content-security-policy
+ 200 Script output follows
+ content-security-policy: script-src https://example.com/ 'unsafe-inline'
+ 304 Not Modified
+ content-security-policy: script-src https://example.com/ 'unsafe-inline'
+
repo page should send CSP by default, include etag w/o nonce
$ get-with-headers.py --headeronly localhost:$HGPORT repo1 content-security-policy etag
--- a/tests/test-hgweb-diffs.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-hgweb-diffs.t Sat May 05 18:06:45 2018 -0700
@@ -122,9 +122,9 @@
<td class="diffstat">
2 files changed, 2 insertions(+), 0 deletions(-)
- <a id="diffstatexpand" href="javascript:toggleDiffstat()">[<tt>+</tt>]</a>
+ <a id="diffstatexpand" class="diffstattoggle" href="#">[<tt>+</tt>]</a>
<div id="diffstatdetails" style="display:none;">
- <a href="javascript:toggleDiffstat()">[<tt>-</tt>]</a>
+ <a class="diffstattoggle" href="#">[<tt>-</tt>]</a>
<table class="diffstat-table stripes2"> <tr>
<td class="diffstat-file"><a href="#l1.1">a</a></td>
<td class="diffstat-total" align="right">1</td>
@@ -148,7 +148,7 @@
</table>
<div class="overflow">
- <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+ <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
<div class="sourcefirst"> line diff</div>
<div class="stripes2 diffblocks">
<div class="bottomline inc-lineno"><pre class="sourcelines wrap">
@@ -289,7 +289,7 @@
</table>
<div class="overflow">
- <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+ <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
<div class="sourcefirst"> line diff</div>
<div class="stripes2 diffblocks">
<div class="bottomline inc-lineno"><pre class="sourcelines wrap">
@@ -419,9 +419,9 @@
<td class="diffstat">
2 files changed, 2 insertions(+), 0 deletions(-)
- <a id="diffstatexpand" href="javascript:toggleDiffstat()">[<tt>+</tt>]</a>
+ <a id="diffstatexpand" class="diffstattoggle" href="#">[<tt>+</tt>]</a>
<div id="diffstatdetails" style="display:none;">
- <a href="javascript:toggleDiffstat()">[<tt>-</tt>]</a>
+ <a class="diffstattoggle" href="#">[<tt>-</tt>]</a>
<table class="diffstat-table stripes2"> <tr>
<td class="diffstat-file"><a href="#l1.1">a</a></td>
<td class="diffstat-total" align="right">1</td>
@@ -445,7 +445,7 @@
</table>
<div class="overflow">
- <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+ <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
<div class="sourcefirst"> line diff</div>
<div class="stripes2 diffblocks">
<div class="bottomline inc-lineno"><pre class="sourcelines wrap">
@@ -590,7 +590,7 @@
</table>
<div class="overflow">
- <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+ <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
<div class="sourcefirst"> line diff</div>
<div class="stripes2 diffblocks">
<div class="bottomline inc-lineno"><pre class="sourcelines wrap">
--- a/tests/test-hgweb-removed.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-hgweb-removed.t Sat May 05 18:06:45 2018 -0700
@@ -103,9 +103,9 @@
<td class="diffstat">
1 files changed, 0 insertions(+), 1 deletions(-)
- <a id="diffstatexpand" href="javascript:toggleDiffstat()">[<tt>+</tt>]</a>
+ <a id="diffstatexpand" class="diffstattoggle" href="#">[<tt>+</tt>]</a>
<div id="diffstatdetails" style="display:none;">
- <a href="javascript:toggleDiffstat()">[<tt>-</tt>]</a>
+ <a class="diffstattoggle" href="#">[<tt>-</tt>]</a>
<table class="diffstat-table stripes2"> <tr>
<td class="diffstat-file"><a href="#l1.1">a</a></td>
<td class="diffstat-total" align="right">1</td>
@@ -121,7 +121,7 @@
</table>
<div class="overflow">
- <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+ <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
<div class="sourcefirst"> line diff</div>
<div class="stripes2 diffblocks">
<div class="bottomline inc-lineno"><pre class="sourcelines wrap">
@@ -225,7 +225,7 @@
</table>
<div class="overflow">
- <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+ <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
<div class="sourcefirst"> line diff</div>
<div class="stripes2 diffblocks">
<div class="bottomline inc-lineno"><pre class="sourcelines wrap">
--- a/tests/test-hgweb.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-hgweb.t Sat May 05 18:06:45 2018 -0700
@@ -875,4 +875,23 @@
Internal Server Error (no-eol)
$ killdaemons.py
+
+HTTP 304 works with hgwebdir (issue5844)
+
+ $ cat > hgweb.conf << EOF
+ > [paths]
+ > /repo = $TESTTMP/test
+ > EOF
+
+ $ hg serve --web-conf hgweb.conf -p $HGPORT -d --pid-file hg.pid -E error.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+ $ get-with-headers.py --twice --headeronly localhost:$HGPORT 'repo/static/style.css' - date etag server
+ 200 Script output follows
+ content-length: 2677
+ content-type: text/css
+ 304 Not Modified
+
+ $ killdaemons.py
+
$ cd ..
--- a/tests/test-highlight.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-highlight.t Sat May 05 18:06:45 2018 -0700
@@ -146,7 +146,7 @@
</table>
<div class="overflow">
- <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+ <div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="#">on</a></div>
<div class="sourcefirst"> line source</div>
<pre class="sourcelines stripes4 wrap bottomline"
data-logurl="/log/tip/primes.py"
--- a/tests/test-http-protocol.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-http-protocol.t Sat May 05 18:06:45 2018 -0700
@@ -257,7 +257,7 @@
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: application/mercurial-0.1\r\n
- s> Content-Length: 458\r\n
+ s> Content-Length: *\r\n (glob)
s> \r\n
s> batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
sending heads command
@@ -281,7 +281,7 @@
$ killdaemons.py
$ enablehttpv2 empty
- $ hg -R empty serve -p $HGPORT -d --pid-file hg.pid
+ $ hg --config server.compressionengines=zlib -R empty serve -p $HGPORT -d --pid-file hg.pid
$ cat hg.pid > $DAEMON_PIDS
Client with HTTPv2 enabled automatically upgrades if the server supports it
@@ -305,7 +305,7 @@
s> Content-Type: application/mercurial-cbor\r\n
s> Content-Length: *\r\n (glob)
s> \r\n
- s> \xa3Dapis\xa1Pexp-http-v2-0001\xa4Hcommands\xa7Eheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyCnewCnewColdColdInamespaceBnsKpermissions\x81DpushHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullKcompression\x82\xa1DnameDzstd\xa1DnameDzlibNrawrepoformats\x82LgeneraldeltaHrevlogv1Qframingmediatypes\x81X&application/mercurial-exp-framing-0005GapibaseDapi/Nv1capabilitiesY\x01\xcabatch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
+ s> \xa3Dapis\xa1Pexp-http-v2-0001\xa4Hcommands\xa7Eheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyCnewCnewColdColdInamespaceBnsKpermissions\x81DpushHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullKcompression\x81\xa1DnameDzlibNrawrepoformats\x82LgeneraldeltaHrevlogv1Qframingmediatypes\x81X&application/mercurial-exp-framing-0005GapibaseDapi/Nv1capabilitiesY\x01\xc5batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
sending heads command
s> POST /api/exp-http-v2-0001/ro/heads HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
@@ -333,3 +333,394 @@
response: [b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00']
$ killdaemons.py
+
+HTTP client follows HTTP redirect on handshake to new repo
+
+ $ cd $TESTTMP
+
+ $ hg init redirector
+ $ hg init redirected
+ $ cd redirected
+ $ touch foo
+ $ hg -q commit -A -m initial
+ $ cd ..
+
+ $ cat > paths.conf << EOF
+ > [paths]
+ > / = $TESTTMP/*
+ > EOF
+
+ $ cat > redirectext.py << EOF
+ > from mercurial import extensions, wireprotoserver
+ > def wrappedcallhttp(orig, repo, req, res, proto, cmd):
+ > path = req.advertisedurl[len(req.advertisedbaseurl):]
+ > if not path.startswith(b'/redirector'):
+ > return orig(repo, req, res, proto, cmd)
+ > relpath = path[len(b'/redirector'):]
+ > res.status = b'301 Redirect'
+ > newurl = b'%s/redirected%s' % (req.baseurl, relpath)
+ > if not repo.ui.configbool('testing', 'redirectqs', True) and b'?' in newurl:
+ > newurl = newurl[0:newurl.index(b'?')]
+ > res.headers[b'Location'] = newurl
+ > res.headers[b'Content-Type'] = b'text/plain'
+ > res.setbodybytes(b'redirected')
+ > return True
+ >
+ > extensions.wrapfunction(wireprotoserver, '_callhttp', wrappedcallhttp)
+ > EOF
+
+ $ hg --config extensions.redirect=$TESTTMP/redirectext.py \
+ > --config server.compressionengines=zlib \
+ > serve --web-conf paths.conf --pid-file hg.pid -p $HGPORT -d
+ $ cat hg.pid > $DAEMON_PIDS
+
+Verify our HTTP 301 is served properly
+
+ $ hg --verbose debugwireproto --peer raw http://$LOCALIP:$HGPORT << EOF
+ > httprequest GET /redirector?cmd=capabilities
+ > user-agent: test
+ > EOF
+ using raw connection to peer
+ s> GET /redirector?cmd=capabilities HTTP/1.1\r\n
+ s> Accept-Encoding: identity\r\n
+ s> user-agent: test\r\n
+ s> host: $LOCALIP:$HGPORT\r\n (glob)
+ s> \r\n
+ s> makefile('rb', None)
+ s> HTTP/1.1 301 Redirect\r\n
+ s> Server: testing stub value\r\n
+ s> Date: $HTTP_DATE$\r\n
+ s> Location: http://$LOCALIP:$HGPORT/redirected?cmd=capabilities\r\n (glob)
+ s> Content-Type: text/plain\r\n
+ s> Content-Length: 10\r\n
+ s> \r\n
+ s> redirected
+ s> GET /redirected?cmd=capabilities HTTP/1.1\r\n
+ s> Accept-Encoding: identity\r\n
+ s> user-agent: test\r\n
+ s> host: $LOCALIP:$HGPORT\r\n (glob)
+ s> \r\n
+ s> makefile('rb', None)
+ s> HTTP/1.1 200 Script output follows\r\n
+ s> Server: testing stub value\r\n
+ s> Date: $HTTP_DATE$\r\n
+ s> Content-Type: application/mercurial-0.1\r\n
+ s> Content-Length: 453\r\n
+ s> \r\n
+ s> batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
+
+Test with the HTTP peer
+
+ $ hg --verbose debugwireproto http://$LOCALIP:$HGPORT/redirector << EOF
+ > command heads
+ > EOF
+ s> GET /redirector?cmd=capabilities HTTP/1.1\r\n
+ s> Accept-Encoding: identity\r\n
+ s> accept: application/mercurial-0.1\r\n
+ s> host: $LOCALIP:$HGPORT\r\n (glob)
+ s> user-agent: Mercurial debugwireproto\r\n
+ s> \r\n
+ s> makefile('rb', None)
+ s> HTTP/1.1 301 Redirect\r\n
+ s> Server: testing stub value\r\n
+ s> Date: $HTTP_DATE$\r\n
+ s> Location: http://$LOCALIP:$HGPORT/redirected?cmd=capabilities\r\n (glob)
+ s> Content-Type: text/plain\r\n
+ s> Content-Length: 10\r\n
+ s> \r\n
+ s> redirected
+ s> GET /redirected?cmd=capabilities HTTP/1.1\r\n
+ s> Accept-Encoding: identity\r\n
+ s> accept: application/mercurial-0.1\r\n
+ s> host: $LOCALIP:$HGPORT\r\n (glob)
+ s> user-agent: Mercurial debugwireproto\r\n
+ s> \r\n
+ s> makefile('rb', None)
+ s> HTTP/1.1 200 Script output follows\r\n
+ s> Server: testing stub value\r\n
+ s> Date: $HTTP_DATE$\r\n
+ s> Content-Type: application/mercurial-0.1\r\n
+ s> Content-Length: 453\r\n
+ s> \r\n
+ real URL is http://$LOCALIP:$HGPORT/redirected (glob)
+ s> batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
+ sending heads command
+ s> GET /redirected?cmd=heads HTTP/1.1\r\n
+ s> Accept-Encoding: identity\r\n
+ s> vary: X-HgProto-1\r\n
+ s> x-hgproto-1: 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull\r\n
+ s> accept: application/mercurial-0.1\r\n
+ s> host: $LOCALIP:$HGPORT\r\n (glob)
+ s> user-agent: Mercurial debugwireproto\r\n
+ s> \r\n
+ s> makefile('rb', None)
+ s> HTTP/1.1 200 Script output follows\r\n
+ s> Server: testing stub value\r\n
+ s> Date: $HTTP_DATE$\r\n
+ s> Content-Type: application/mercurial-0.1\r\n
+ s> Content-Length: 41\r\n
+ s> \r\n
+ s> 96ee1d7354c4ad7372047672c36a1f561e3a6a4c\n
+ response: [b'\x96\xee\x1dsT\xc4\xadsr\x04vr\xc3j\x1fV\x1e:jL']
+
+ $ killdaemons.py
+
+Now test a variation where we strip the query string from the redirect URL.
+(SCM Manager apparently did this and clients would recover from it)
+
+ $ hg --config extensions.redirect=$TESTTMP/redirectext.py \
+ > --config server.compressionengines=zlib \
+ > --config testing.redirectqs=false \
+ > serve --web-conf paths.conf --pid-file hg.pid -p $HGPORT -d
+ $ cat hg.pid > $DAEMON_PIDS
+
+ $ hg --verbose debugwireproto --peer raw http://$LOCALIP:$HGPORT << EOF
+ > httprequest GET /redirector?cmd=capabilities
+ > user-agent: test
+ > EOF
+ using raw connection to peer
+ s> GET /redirector?cmd=capabilities HTTP/1.1\r\n
+ s> Accept-Encoding: identity\r\n
+ s> user-agent: test\r\n
+ s> host: $LOCALIP:$HGPORT\r\n (glob)
+ s> \r\n
+ s> makefile('rb', None)
+ s> HTTP/1.1 301 Redirect\r\n
+ s> Server: testing stub value\r\n
+ s> Date: $HTTP_DATE$\r\n
+ s> Location: http://$LOCALIP:$HGPORT/redirected\r\n (glob)
+ s> Content-Type: text/plain\r\n
+ s> Content-Length: 10\r\n
+ s> \r\n
+ s> redirected
+ s> GET /redirected HTTP/1.1\r\n
+ s> Accept-Encoding: identity\r\n
+ s> user-agent: test\r\n
+ s> host: $LOCALIP:$HGPORT\r\n (glob)
+ s> \r\n
+ s> makefile('rb', None)
+ s> HTTP/1.1 200 Script output follows\r\n
+ s> Server: testing stub value\r\n
+ s> Date: $HTTP_DATE$\r\n
+ s> ETag: W/"*"\r\n (glob)
+ s> Content-Type: text/html; charset=ascii\r\n
+ s> Transfer-Encoding: chunked\r\n
+ s> \r\n
+ s> 414\r\n
+ s> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n
+ s> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">\n
+ s> <head>\n
+ s> <link rel="icon" href="/redirected/static/hgicon.png" type="image/png" />\n
+ s> <meta name="robots" content="index, nofollow" />\n
+ s> <link rel="stylesheet" href="/redirected/static/style-paper.css" type="text/css" />\n
+ s> <script type="text/javascript" src="/redirected/static/mercurial.js"></script>\n
+ s> \n
+ s> <title>redirected: log</title>\n
+ s> <link rel="alternate" type="application/atom+xml"\n
+ s> href="/redirected/atom-log" title="Atom feed for redirected" />\n
+ s> <link rel="alternate" type="application/rss+xml"\n
+ s> href="/redirected/rss-log" title="RSS feed for redirected" />\n
+ s> </head>\n
+ s> <body>\n
+ s> \n
+ s> <div class="container">\n
+ s> <div class="menu">\n
+ s> <div class="logo">\n
+ s> <a href="https://mercurial-scm.org/">\n
+ s> <img src="/redirected/static/hglogo.png" alt="mercurial" /></a>\n
+ s> </div>\n
+ s> <ul>\n
+ s> <li class="active">log</li>\n
+ s> <li><a href="/redirected/graph/tip">graph</a></li>\n
+ s> <li><a href="/redirected/tags">tags</a></li>\n
+ s> <li><a href="
+ s> \r\n
+ s> 810\r\n
+ s> /redirected/bookmarks">bookmarks</a></li>\n
+ s> <li><a href="/redirected/branches">branches</a></li>\n
+ s> </ul>\n
+ s> <ul>\n
+ s> <li><a href="/redirected/rev/tip">changeset</a></li>\n
+ s> <li><a href="/redirected/file/tip">browse</a></li>\n
+ s> </ul>\n
+ s> <ul>\n
+ s> \n
+ s> </ul>\n
+ s> <ul>\n
+ s> <li><a href="/redirected/help">help</a></li>\n
+ s> </ul>\n
+ s> <div class="atom-logo">\n
+ s> <a href="/redirected/atom-log" title="subscribe to atom feed">\n
+ s> <img class="atom-logo" src="/redirected/static/feed-icon-14x14.png" alt="atom feed" />\n
+ s> </a>\n
+ s> </div>\n
+ s> </div>\n
+ s> \n
+ s> <div class="main">\n
+ s> <h2 class="breadcrumb"><a href="/">Mercurial</a> > <a href="/redirected">redirected</a> </h2>\n
+ s> <h3>log</h3>\n
+ s> \n
+ s> \n
+ s> <form class="search" action="/redirected/log">\n
+ s> \n
+ s> <p><input name="rev" id="search1" type="text" size="30" value="" /></p>\n
+ s> <div id="hint">Find changesets by keywords (author, files, the commit message), revision\n
+ s> number or hash, or <a href="/redirected/help/revsets">revset expression</a>.</div>\n
+ s> </form>\n
+ s> \n
+ s> <div class="navigate">\n
+ s> <a href="/redirected/shortlog/tip?revcount=30">less</a>\n
+ s> <a href="/redirected/shortlog/tip?revcount=120">more</a>\n
+ s> | rev 0: <a href="/redirected/shortlog/96ee1d7354c4">(0)</a> <a href="/redirected/shortlog/tip">tip</a> \n
+ s> </div>\n
+ s> \n
+ s> <table class="bigtable">\n
+ s> <thead>\n
+ s> <tr>\n
+ s> <th class="age">age</th>\n
+ s> <th class="author">author</th>\n
+ s> <th class="description">description</th>\n
+ s> </tr>\n
+ s> </thead>\n
+ s> <tbody class="stripes2">\n
+ s> <tr>\n
+ s> <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>\n
+ s> <td class="author">test</td>\n
+ s> <td class="description">\n
+ s> <a href="/redirected/rev/96ee1d7354c4">initial</a>\n
+ s> <span class="phase">draft</span> <span class="branchhead">default</span> <span class="tag">tip</span> \n
+ s> </td>\n
+ s> </tr>\n
+ s> \n
+ s> </tbody>\n
+ s> </table>\n
+ s> \n
+ s> <div class="navigate">\n
+ s> <a href="/redirected/shortlog/tip?revcount=30">less</a>\n
+ s> <a href="/redirected/shortlog/tip?revcount=120">more</a>\n
+ s> | rev 0: <a href="/redirected/shortlog/96ee1d7354c4">(0)</a> <a href="/redirected/shortlog/tip">tip</a> \n
+ s> </div>\n
+ s> \n
+ s> <script type="text/javascript">\n
+ s> ajaxScrollInit(\n
+ s> \'/redirected/shortlog/%next%\',\n
+ s> \'\', <!-- NEXTHASH\n
+ s> function (htmlText) {
+ s> \r\n
+ s> 14a\r\n
+ s> \n
+ s> var m = htmlText.match(/\'(\\w+)\', <!-- NEXTHASH/);\n
+ s> return m ? m[1] : null;\n
+ s> },\n
+ s> \'.bigtable > tbody\',\n
+ s> \'<tr class="%class%">\\\n
+ s> <td colspan="3" style="text-align: center;">%text%</td>\\\n
+ s> </tr>\'\n
+ s> );\n
+ s> </script>\n
+ s> \n
+ s> </div>\n
+ s> </div>\n
+ s> \n
+ s> \n
+ s> \n
+ s> </body>\n
+ s> </html>\n
+ s> \n
+ s> \r\n
+ s> 0\r\n
+ s> \r\n
+
+ $ hg --verbose debugwireproto http://$LOCALIP:$HGPORT/redirector << EOF
+ > command heads
+ > EOF
+ s> GET /redirector?cmd=capabilities HTTP/1.1\r\n
+ s> Accept-Encoding: identity\r\n
+ s> accept: application/mercurial-0.1\r\n
+ s> host: $LOCALIP:$HGPORT\r\n (glob)
+ s> user-agent: Mercurial debugwireproto\r\n
+ s> \r\n
+ s> makefile('rb', None)
+ s> HTTP/1.1 301 Redirect\r\n
+ s> Server: testing stub value\r\n
+ s> Date: $HTTP_DATE$\r\n
+ s> Location: http://$LOCALIP:$HGPORT/redirected\r\n (glob)
+ s> Content-Type: text/plain\r\n
+ s> Content-Length: 10\r\n
+ s> \r\n
+ s> redirected
+ s> GET /redirected HTTP/1.1\r\n
+ s> Accept-Encoding: identity\r\n
+ s> accept: application/mercurial-0.1\r\n
+ s> host: $LOCALIP:$HGPORT\r\n (glob)
+ s> user-agent: Mercurial debugwireproto\r\n
+ s> \r\n
+ s> makefile('rb', None)
+ s> HTTP/1.1 200 Script output follows\r\n
+ s> Server: testing stub value\r\n
+ s> Date: $HTTP_DATE$\r\n
+ s> ETag: W/"*"\r\n (glob)
+ s> Content-Type: text/html; charset=ascii\r\n
+ s> Transfer-Encoding: chunked\r\n
+ s> \r\n
+ real URL is http://$LOCALIP:$HGPORT/redirected (glob)
+ s> 414\r\n
+ s> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n
+ s> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">\n
+ s> <head>\n
+ s> <link rel="icon" href="/redirected/static/hgicon.png" type="image/png" />\n
+ s> <meta name="robots" content="index, nofollow" />\n
+ s> <link rel="stylesheet" href="/redirected/static/style-paper.css" type="text/css" />\n
+ s> <script type="text/javascript" src="/redirected/static/mercurial.js"></script>\n
+ s> \n
+ s> <title>redirected: log</title>\n
+ s> <link rel="alternate" type="application/atom+xml"\n
+ s> href="/redirected/atom-log" title="Atom feed for redirected" />\n
+ s> <link rel="alternate" type="application/rss+xml"\n
+ s> href="/redirected/rss-log" title="RSS feed for redirected" />\n
+ s> </head>\n
+ s> <body>\n
+ s> \n
+ s> <div class="container">\n
+ s> <div class="menu">\n
+ s> <div class="logo">\n
+ s> <a href="https://mercurial-scm.org/">\n
+ s> <img src="/redirected/static/hglogo.png" alt="mercurial" /></a>\n
+ s> </div>\n
+ s> <ul>\n
+ s> <li class="active">log</li>\n
+ s> <li><a href="/redirected/graph/tip">graph</a></li>\n
+ s> <li><a href="/redirected/tags">tags</a
+ s> GET /redirected?cmd=capabilities HTTP/1.1\r\n
+ s> Accept-Encoding: identity\r\n
+ s> accept: application/mercurial-0.1\r\n
+ s> host: $LOCALIP:$HGPORT\r\n (glob)
+ s> user-agent: Mercurial debugwireproto\r\n
+ s> \r\n
+ s> makefile('rb', None)
+ s> HTTP/1.1 200 Script output follows\r\n
+ s> Server: testing stub value\r\n
+ s> Date: $HTTP_DATE$\r\n
+ s> Content-Type: application/mercurial-0.1\r\n
+ s> Content-Length: 453\r\n
+ s> \r\n
+ real URL is http://$LOCALIP:$HGPORT/redirected (glob)
+ s> batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
+ sending heads command
+ s> GET /redirected?cmd=heads HTTP/1.1\r\n
+ s> Accept-Encoding: identity\r\n
+ s> vary: X-HgProto-1\r\n
+ s> x-hgproto-1: 0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull\r\n
+ s> accept: application/mercurial-0.1\r\n
+ s> host: $LOCALIP:$HGPORT\r\n (glob)
+ s> user-agent: Mercurial debugwireproto\r\n
+ s> \r\n
+ s> makefile('rb', None)
+ s> HTTP/1.1 200 Script output follows\r\n
+ s> Server: testing stub value\r\n
+ s> Date: $HTTP_DATE$\r\n
+ s> Content-Type: application/mercurial-0.1\r\n
+ s> Content-Length: 41\r\n
+ s> \r\n
+ s> 96ee1d7354c4ad7372047672c36a1f561e3a6a4c\n
+ response: [b'\x96\xee\x1dsT\xc4\xadsr\x04vr\xc3j\x1fV\x1e:jL']
--- a/tests/test-import.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-import.t Sat May 05 18:06:45 2018 -0700
@@ -734,6 +734,42 @@
$ hg revert -a
reverting a
+Test --exact failure
+
+ $ sed 's/^# Parent .*/# Parent '"`hg log -r. -T '{node}'`"'/' \
+ > < fuzzy-tip.patch > fuzzy-reparent.patch
+ $ hg import --config patch.fuzz=0 --exact fuzzy-reparent.patch
+ applying fuzzy-reparent.patch
+ patching file a
+ Hunk #1 FAILED at 0
+ 1 out of 1 hunks FAILED -- saving rejects to file a.rej
+ abort: patch failed to apply
+ [255]
+ $ hg up -qC
+ $ hg import --config patch.fuzz=2 --exact fuzzy-reparent.patch
+ applying fuzzy-reparent.patch
+ patching file a
+ Hunk #1 succeeded at 2 with fuzz 1 (offset 0 lines).
+ transaction abort!
+ rollback completed
+ abort: patch is damaged or loses information
+ [255]
+ $ hg up -qC
+
+ $ grep '^#' fuzzy-tip.patch > empty.patch
+ $ cat <<'EOF' >> empty.patch
+ > change
+ >
+ > diff -r bb90ef1daa38 -r 0e9b883378d4 a
+ > --- a/a Thu Jan 01 00:00:00 1970 +0000
+ > --- b/a Thu Jan 01 00:00:00 1970 +0000
+ > EOF
+ $ hg import --exact empty.patch
+ applying empty.patch
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ abort: patch is damaged or loses information
+ [255]
+ $ hg up -qC
import with --no-commit should have written .hg/last-message.txt
--- a/tests/test-infinitepush-bundlestore.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-infinitepush-bundlestore.t Sat May 05 18:06:45 2018 -0700
@@ -281,7 +281,7 @@
$ echo 1 > amend
$ hg add amend
$ hg ci --amend -m 'scratch amended commit'
- saved backup bundle to $TESTTMP/client/.hg/strip-backup/6c10d49fe927-c99ffec5-amend.hg (glob)
+ saved backup bundle to $TESTTMP/client/.hg/strip-backup/6c10d49fe927-c99ffec5-amend.hg
$ hg log -G -T '{desc} {phase} {bookmarks}'
@ scratch amended commit draft scratch/mybranch
|
--- a/tests/test-push-http.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-push-http.t Sat May 05 18:06:45 2018 -0700
@@ -380,3 +380,47 @@
#endif
$ cd ..
+
+Pushing via hgwebdir works
+
+ $ hg init hgwebdir
+ $ cd hgwebdir
+ $ echo 0 > a
+ $ hg -q commit -A -m initial
+ $ cd ..
+
+ $ cat > web.conf << EOF
+ > [paths]
+ > / = *
+ > [web]
+ > push_ssl = false
+ > allow_push = *
+ > EOF
+
+ $ hg serve --web-conf web.conf -p $HGPORT -d --pid-file hg.pid
+ $ cat hg.pid >> $DAEMON_PIDS
+
+ $ hg clone http://localhost:$HGPORT/hgwebdir hgwebdir-local
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ new changesets 98a3f8f02ba7
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd hgwebdir-local
+ $ echo commit > a
+ $ hg commit -m 'local commit'
+
+ $ hg push
+ pushing to http://localhost:$HGPORT/hgwebdir
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+
+ $ killdaemons.py
+
+ $ cd ..
--- a/tests/test-serve.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-serve.t Sat May 05 18:06:45 2018 -0700
@@ -78,4 +78,24 @@
listening at http://localhost/foo/ (bound to *$LOCALIP*:HGPORT1) (glob) (?)
% errors
+ $ $PYTHON $RUNTESTDIR/killdaemons.py $DAEMON_PIDS
+
+With out of bounds accesses
+
+ $ rm access.log
+ $ hg serve -a localhost -p $HGPORT -d --prefix some/dir \
+ > --pid-file=hg.pid -E errors.log
+ $ cat hg.pid >> "$DAEMON_PIDS"
+
+ $ hg id http://localhost:$HGPORT/some/dir7
+ abort: HTTP Error 404: Not Found
+ [255]
+ $ hg id http://localhost:$HGPORT/some
+ abort: HTTP Error 404: Not Found
+ [255]
+
+ $ cat access.log errors.log
+ $LOCALIP - - [$LOGDATE$] "GET /some/dir7?cmd=capabilities HTTP/1.1" 404 - (glob)
+ $LOCALIP - - [$LOGDATE$] "GET /some?cmd=capabilities HTTP/1.1" 404 - (glob)
+
$ cd ..
--- a/tests/test-ssh-proto.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-ssh-proto.t Sat May 05 18:06:45 2018 -0700
@@ -58,10 +58,9 @@
$ hg --debug debugpeer ssh://user@dummy/server
running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !)
running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !)
- devel-peer-request: hello
+ devel-peer-request: hello+between
+ devel-peer-request: pairs: 81 bytes
sending hello command
- devel-peer-request: between
- devel-peer-request: pairs: 81 bytes
sending between command
remote: 413
remote: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
@@ -170,10 +169,9 @@
$ SSHSERVERMODE=banner hg --debug debugpeer ssh://user@dummy/server
running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !)
running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !)
- devel-peer-request: hello
+ devel-peer-request: hello+between
+ devel-peer-request: pairs: 81 bytes
sending hello command
- devel-peer-request: between
- devel-peer-request: pairs: 81 bytes
sending between command
remote: banner: line 0
remote: banner: line 1
@@ -262,10 +260,9 @@
$ SSHSERVERMODE=no-hello hg --debug debugpeer ssh://user@dummy/server
running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !)
running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !)
- devel-peer-request: hello
+ devel-peer-request: hello+between
+ devel-peer-request: pairs: 81 bytes
sending hello command
- devel-peer-request: between
- devel-peer-request: pairs: 81 bytes
sending between command
remote: 0
remote: 1
@@ -310,10 +307,9 @@
running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !)
running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !)
sending no-args command
- devel-peer-request: hello
+ devel-peer-request: hello+between
+ devel-peer-request: pairs: 81 bytes
sending hello command
- devel-peer-request: between
- devel-peer-request: pairs: 81 bytes
sending between command
remote: 0
remote: 413
@@ -383,10 +379,9 @@
sending unknown1 command
sending unknown2 command
sending unknown3 command
- devel-peer-request: hello
+ devel-peer-request: hello+between
+ devel-peer-request: pairs: 81 bytes
sending hello command
- devel-peer-request: between
- devel-peer-request: pairs: 81 bytes
sending between command
remote: 0
remote: 0
@@ -958,10 +953,9 @@
running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !)
running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !)
sending upgrade request: * proto=exp-ssh-v2-0001 (glob)
- devel-peer-request: hello
+ devel-peer-request: hello+between
+ devel-peer-request: pairs: 81 bytes
sending hello command
- devel-peer-request: between
- devel-peer-request: pairs: 81 bytes
sending between command
remote: 0
remote: 413
@@ -1017,10 +1011,9 @@
running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !)
running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !)
sending upgrade request: * proto=exp-ssh-v2-0001 (glob)
- devel-peer-request: hello
+ devel-peer-request: hello+between
+ devel-peer-request: pairs: 81 bytes
sending hello command
- devel-peer-request: between
- devel-peer-request: pairs: 81 bytes
sending between command
protocol upgraded to exp-ssh-v2-0001
remote: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
@@ -1037,10 +1030,9 @@
running * "*/tests/dummyssh" 'user@dummy' 'hg -R server serve --stdio' (glob) (no-windows !)
running * "*\tests/dummyssh" "user@dummy" "hg -R server serve --stdio" (glob) (windows !)
sending upgrade request: * proto=exp-ssh-v2-0001 (glob)
- devel-peer-request: hello
+ devel-peer-request: hello+between
+ devel-peer-request: pairs: 81 bytes
sending hello command
- devel-peer-request: between
- devel-peer-request: pairs: 81 bytes
sending between command
protocol upgraded to exp-ssh-v2-0001
remote: capabilities: batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset getbundle known lookup protocaps pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
--- a/tests/test-ssh.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-ssh.t Sat May 05 18:06:45 2018 -0700
@@ -490,10 +490,9 @@
pulling from ssh://user@dummy/remote
running .* ".*/dummyssh" ['"]user@dummy['"] ('|")hg -R remote serve --stdio('|") (re)
sending upgrade request: * proto=exp-ssh-v2-0001 (glob) (sshv2 !)
- devel-peer-request: hello
+ devel-peer-request: hello+between
+ devel-peer-request: pairs: 81 bytes
sending hello command
- devel-peer-request: between
- devel-peer-request: pairs: 81 bytes
sending between command
remote: 413 (sshv1 !)
protocol upgraded to exp-ssh-v2-0001 (sshv2 !)
--- a/tests/test-treediscovery.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-treediscovery.t Sat May 05 18:06:45 2018 -0700
@@ -568,7 +568,6 @@
"GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
"GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
"GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
- "GET /?cmd=branchmap HTTP/1.1" 200 - x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
"GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=bookmarks x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
"POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+1827a5bb63e602382eb89dd58f2ac9f3b007ad91* (glob)
"GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases x-hgproto-1:0.1 0.2 comp=$USUAL_COMPRESSIONS$ partial-pull
--- a/tests/test-wireproto-command-capabilities.t Sun Mar 04 15:29:41 2018 -0500
+++ b/tests/test-wireproto-command-capabilities.t Sat May 05 18:06:45 2018 -0700
@@ -1,6 +1,15 @@
$ . $TESTDIR/wireprotohelpers.sh
$ hg init server
+
+zstd isn't present in plain builds. Make tests easier by removing
+zstd from the equation.
+
+ $ cat >> server/.hg/hgrc << EOF
+ > [server]
+ > compressionengines = zlib
+ > EOF
+
$ hg -R server serve -p $HGPORT -d --pid-file hg.pid -E error.log
$ cat hg.pid > $DAEMON_PIDS
@@ -21,7 +30,7 @@
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: application/mercurial-0.1\r\n
- s> Content-Length: 458\r\n
+ s> Content-Length: *\r\n (glob)
s> \r\n
s> batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
@@ -46,7 +55,7 @@
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: application/mercurial-0.1\r\n
- s> Content-Length: 458\r\n
+ s> Content-Length: *\r\n (glob)
s> \r\n
s> batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
@@ -82,7 +91,7 @@
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: application/mercurial-0.1\r\n
- s> Content-Length: 458\r\n
+ s> Content-Length: *\r\n (glob)
s> \r\n
s> batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
@@ -107,7 +116,7 @@
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: application/mercurial-0.1\r\n
- s> Content-Length: 458\r\n
+ s> Content-Length: *\r\n (glob)
s> \r\n
s> batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
@@ -132,9 +141,9 @@
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: application/mercurial-cbor\r\n
- s> Content-Length: 496\r\n
+ s> Content-Length: *\r\n (glob)
s> \r\n
- s> \xa3Dapis\xa0GapibaseDapi/Nv1capabilitiesY\x01\xcabatch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
+ s> \xa3Dapis\xa0GapibaseDapi/Nv1capabilitiesY\x01\xc5batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
cbor> {b'apibase': b'api/', b'apis': {}, b'v1capabilities': b'batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash'}
Restart server to enable HTTPv2
@@ -165,9 +174,9 @@
s> Server: testing stub value\r\n
s> Date: $HTTP_DATE$\r\n
s> Content-Type: application/mercurial-cbor\r\n
- s> Content-Length: 496\r\n
+ s> Content-Length: *\r\n (glob)
s> \r\n
- s> \xa3Dapis\xa0GapibaseDapi/Nv1capabilitiesY\x01\xcabatch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
+ s> \xa3Dapis\xa0GapibaseDapi/Nv1capabilitiesY\x01\xc5batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
cbor> {b'apibase': b'api/', b'apis': {}, b'v1capabilities': b'batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash'}
Request for HTTPv2 service returns information about it
@@ -193,8 +202,8 @@
s> Content-Type: application/mercurial-cbor\r\n
s> Content-Length: *\r\n (glob)
s> \r\n
- s> \xa3Dapis\xa1Pexp-http-v2-0001\xa4Hcommands\xa7Eheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyCnewCnewColdColdInamespaceBnsKpermissions\x81DpushHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullKcompression\x82\xa1DnameDzstd\xa1DnameDzlibNrawrepoformats\x82LgeneraldeltaHrevlogv1Qframingmediatypes\x81X&application/mercurial-exp-framing-0005GapibaseDapi/Nv1capabilitiesY\x01\xcabatch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
- cbor> {b'apibase': b'api/', b'apis': {b'exp-http-v2-0001': {b'commands': {b'branchmap': {b'args': {}, b'permissions': [b'pull']}, b'capabilities': {b'args': {}, b'permissions': [b'pull']}, b'heads': {b'args': {b'publiconly': False}, b'permissions': [b'pull']}, b'known': {b'args': {b'nodes': [b'deadbeef']}, b'permissions': [b'pull']}, b'listkeys': {b'args': {b'namespace': b'ns'}, b'permissions': [b'pull']}, b'lookup': {b'args': {b'key': b'foo'}, b'permissions': [b'pull']}, b'pushkey': {b'args': {b'key': b'key', b'namespace': b'ns', b'new': b'new', b'old': b'old'}, b'permissions': [b'push']}}, b'compression': [{b'name': b'zstd'}, {b'name': b'zlib'}], b'framingmediatypes': [b'application/mercurial-exp-framing-0005'], b'rawrepoformats': [b'generaldelta', b'revlogv1']}}, b'v1capabilities': b'batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash'}
+ s> \xa3Dapis\xa1Pexp-http-v2-0001\xa4Hcommands\xa7Eheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyCnewCnewColdColdInamespaceBnsKpermissions\x81DpushHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullKcompression\x81\xa1DnameDzlibNrawrepoformats\x82LgeneraldeltaHrevlogv1Qframingmediatypes\x81X&application/mercurial-exp-framing-0005GapibaseDapi/Nv1capabilitiesY\x01\xc5batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
+ cbor> {b'apibase': b'api/', b'apis': {b'exp-http-v2-0001': {b'commands': {b'branchmap': {b'args': {}, b'permissions': [b'pull']}, b'capabilities': {b'args': {}, b'permissions': [b'pull']}, b'heads': {b'args': {b'publiconly': False}, b'permissions': [b'pull']}, b'known': {b'args': {b'nodes': [b'deadbeef']}, b'permissions': [b'pull']}, b'listkeys': {b'args': {b'namespace': b'ns'}, b'permissions': [b'pull']}, b'lookup': {b'args': {b'key': b'foo'}, b'permissions': [b'pull']}, b'pushkey': {b'args': {b'key': b'key', b'namespace': b'ns', b'new': b'new', b'old': b'old'}, b'permissions': [b'push']}}, b'compression': [{b'name': b'zlib'}], b'framingmediatypes': [b'application/mercurial-exp-framing-0005'], b'rawrepoformats': [b'generaldelta', b'revlogv1']}}, b'v1capabilities': b'batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash'}
capabilities command returns expected info
@@ -218,7 +227,7 @@
s> Content-Type: application/mercurial-cbor\r\n
s> Content-Length: *\r\n (glob)
s> \r\n
- s> \xa3Dapis\xa1Pexp-http-v2-0001\xa4Hcommands\xa7Eheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyCnewCnewColdColdInamespaceBnsKpermissions\x81DpushHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullKcompression\x82\xa1DnameDzstd\xa1DnameDzlibNrawrepoformats\x82LgeneraldeltaHrevlogv1Qframingmediatypes\x81X&application/mercurial-exp-framing-0005GapibaseDapi/Nv1capabilitiesY\x01\xcabatch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
+ s> \xa3Dapis\xa1Pexp-http-v2-0001\xa4Hcommands\xa7Eheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyCnewCnewColdColdInamespaceBnsKpermissions\x81DpushHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullKcompression\x81\xa1DnameDzlibNrawrepoformats\x82LgeneraldeltaHrevlogv1Qframingmediatypes\x81X&application/mercurial-exp-framing-0005GapibaseDapi/Nv1capabilitiesY\x01\xc5batch branchmap $USUAL_BUNDLE2_CAPS_SERVER$ changegroupsubset compression=$BUNDLE2_COMPRESSIONS$ getbundle httpheader=1024 httpmediatype=0.1rx,0.1tx,0.2tx known lookup pushkey streamreqs=generaldelta,revlogv1 unbundle=HG10GZ,HG10BZ,HG10UN unbundlehash
sending capabilities command
s> POST /api/exp-http-v2-0001/ro/capabilities HTTP/1.1\r\n
s> Accept-Encoding: identity\r\n
@@ -236,13 +245,13 @@
s> Content-Type: application/mercurial-exp-framing-0005\r\n
s> Transfer-Encoding: chunked\r\n
s> \r\n
- s> 1e2\r\n
- s> \xda\x01\x00\x01\x00\x02\x012
- s> \xa1FstatusBok\xa4Hcommands\xa7Eheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyCnewCnewColdColdInamespaceBnsKpermissions\x81DpushHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullKcompression\x82\xa1DnameDzstd\xa1DnameDzlibNrawrepoformats\x82LgeneraldeltaHrevlogv1Qframingmediatypes\x81X&application/mercurial-exp-framing-0005
+ s> 1d7\r\n
+ s> \xcf\x01\x00\x01\x00\x02\x012
+ s> \xa1FstatusBok\xa4Hcommands\xa7Eheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyCnewCnewColdColdInamespaceBnsKpermissions\x81DpushHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullIbranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullKcompression\x81\xa1DnameDzlibNrawrepoformats\x82LgeneraldeltaHrevlogv1Qframingmediatypes\x81X&application/mercurial-exp-framing-0005
s> \r\n
- received frame(size=474; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=eos)
+ received frame(size=463; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=eos)
s> 0\r\n
s> \r\n
- response: [{b'status': b'ok'}, {b'commands': {b'branchmap': {b'args': {}, b'permissions': [b'pull']}, b'capabilities': {b'args': {}, b'permissions': [b'pull']}, b'heads': {b'args': {b'publiconly': False}, b'permissions': [b'pull']}, b'known': {b'args': {b'nodes': [b'deadbeef']}, b'permissions': [b'pull']}, b'listkeys': {b'args': {b'namespace': b'ns'}, b'permissions': [b'pull']}, b'lookup': {b'args': {b'key': b'foo'}, b'permissions': [b'pull']}, b'pushkey': {b'args': {b'key': b'key', b'namespace': b'ns', b'new': b'new', b'old': b'old'}, b'permissions': [b'push']}}, b'compression': [{b'name': b'zstd'}, {b'name': b'zlib'}], b'framingmediatypes': [b'application/mercurial-exp-framing-0005'], b'rawrepoformats': [b'generaldelta', b'revlogv1']}]
+ response: [{b'status': b'ok'}, {b'commands': {b'branchmap': {b'args': {}, b'permissions': [b'pull']}, b'capabilities': {b'args': {}, b'permissions': [b'pull']}, b'heads': {b'args': {b'publiconly': False}, b'permissions': [b'pull']}, b'known': {b'args': {b'nodes': [b'deadbeef']}, b'permissions': [b'pull']}, b'listkeys': {b'args': {b'namespace': b'ns'}, b'permissions': [b'pull']}, b'lookup': {b'args': {b'key': b'foo'}, b'permissions': [b'pull']}, b'pushkey': {b'args': {b'key': b'key', b'namespace': b'ns', b'new': b'new', b'old': b'old'}, b'permissions': [b'push']}}, b'compression': [{b'name': b'zlib'}], b'framingmediatypes': [b'application/mercurial-exp-framing-0005'], b'rawrepoformats': [b'generaldelta', b'revlogv1']}]
$ cat error.log