diff -Nru mercurial-4.3.1+207-xenial/contrib/builddeb mercurial-4.3.1/contrib/builddeb --- mercurial-4.3.1+207-xenial/contrib/builddeb 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/contrib/builddeb 2017-09-10 00:28:32.000000000 +0000 @@ -81,7 +81,7 @@ rm $changelog.tmp # remove the node from the version string - SRCFILE="mercurial_$(echo $debver | sed "s,-$node,,").orig.tar.gz" + SRCFILE="mercurial_$debver.orig.tar.gz" "$PWD/hg" archive $SRCFILE mv $SRCFILE .. debuild -us -uc -i -I $DEBFLAGS diff -Nru mercurial-4.3.1+207-xenial/contrib/buildrpm mercurial-4.3.1/contrib/buildrpm --- mercurial-4.3.1+207-xenial/contrib/buildrpm 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/contrib/buildrpm 2017-09-10 00:05:18.000000000 +0000 @@ -11,8 +11,6 @@ BUILD=1 RPMBUILDDIR="$PWD/rpmbuild" -export HGPLAIN= - while [ "$1" ]; do case "$1" in --prepare ) diff -Nru mercurial-4.3.1+207-xenial/contrib/mercurial.spec mercurial-4.3.1/contrib/mercurial.spec --- mercurial-4.3.1+207-xenial/contrib/mercurial.spec 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/contrib/mercurial.spec 2017-09-10 00:05:18.000000000 +0000 @@ -83,7 +83,6 @@ %endif make all -make -C contrib/chg %install rm -rf $RPM_BUILD_ROOT @@ -112,7 +111,6 @@ %endif -install -m 755 contrib/chg/chg $RPM_BUILD_ROOT%{_bindir}/ install -m 755 contrib/hgk $RPM_BUILD_ROOT%{_bindir}/ install -m 755 contrib/hg-ssh $RPM_BUILD_ROOT%{_bindir}/ @@ -145,7 +143,6 @@ %{_datadir}/emacs/site-lisp/mercurial.el %{_datadir}/emacs/site-lisp/mq.el %{_bindir}/hg -%{_bindir}/chg %{_bindir}/hgk %{_bindir}/hg-ssh %dir %{_sysconfdir}/bash_completion.d/ diff -Nru mercurial-4.3.1+207-xenial/contrib/packagelib.sh mercurial-4.3.1/contrib/packagelib.sh --- mercurial-4.3.1+207-xenial/contrib/packagelib.sh 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/contrib/packagelib.sh 2017-09-10 00:26:12.000000000 +0000 @@ -26,10 +26,10 @@ node='' fi if echo $hgversion | grep -- '-' > /dev/null 2>&1; then - version=`echo $hgversion | cut -d- -f1` + version=`echo $hgversion | cut -d- -f1`-1 type=`echo $hgversion | cut -d- -f2` else - version=$hgversion + version=$hgversion-1 type='' fi } diff -Nru mercurial-4.3.1+207-xenial/contrib/phabricator.py mercurial-4.3.1/contrib/phabricator.py --- mercurial-4.3.1+207-xenial/contrib/phabricator.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/contrib/phabricator.py 2017-09-10 00:05:18.000000000 +0000 @@ -9,7 +9,7 @@ This extension provides a ``phabsend`` command which sends a stack of changesets to Phabricator without amending commit messages, and a ``phabread`` command which prints a stack of revisions in a format suitable -for :hg:`import`, and a ``phabupdate`` command to update statuses in batch. +for :hg:`import`. By default, Phabricator requires ``Test Plan`` which might prevent some changeset from being sent. The requirement could be disabled by changing @@ -32,25 +32,19 @@ from __future__ import absolute_import -import itertools import json -import operator import re from mercurial.node import bin, nullid from mercurial.i18n import _ from mercurial import ( - cmdutil, - context, encoding, error, mdiff, - obsutil, - parser, + obsolete, patch, registrar, scmutil, - smartset, tags, url as urlmod, util, @@ -144,84 +138,70 @@ _differentialrevisiontagre = re.compile('\AD([1-9][0-9]*)\Z') _differentialrevisiondescre = re.compile( - '^Differential Revision:\s*(?:.*)D([1-9][0-9]*)$', re.M) + '^Differential Revision:\s*(.*)D([1-9][0-9]*)$', re.M) def getoldnodedrevmap(repo, nodelist): """find previous nodes that has been sent to Phabricator - return {node: (oldnode, Differential diff, Differential Revision ID)} + return {node: (oldnode or None, Differential Revision ID)} for node in nodelist with known previous sent versions, or associated - Differential Revision IDs. ``oldnode`` and ``Differential diff`` could - be ``None``. + Differential Revision IDs. - Examines commit messages like "Differential Revision:" to get the - association information. + Examines all precursors and their tags. Tags with format like "D1234" are + considered a match and the node with that tag, and the number after "D" + (ex. 1234) will be returned. - If such commit message line is not found, examines all precursors and their - tags. Tags with format like "D1234" are considered a match and the node - with that tag, and the number after "D" (ex. 1234) will be returned. - - The ``old node``, if not None, is guaranteed to be the last diff of - corresponding Differential Revision, and exist in the repo. + If tags are not found, examine commit message. The "Differential Revision:" + line could associate this changeset to a Differential Revision. """ url, token = readurltoken(repo) unfi = repo.unfiltered() nodemap = unfi.changelog.nodemap - result = {} # {node: (oldnode?, lastdiff?, drev)} - toconfirm = {} # {node: (force, {precnode}, drev)} + result = {} # {node: (oldnode or None, drev)} + toconfirm = {} # {node: (oldnode, {precnode}, drev)} for node in nodelist: ctx = unfi[node] # For tags like "D123", put them into "toconfirm" to verify later - precnodes = list(obsutil.allpredecessors(unfi.obsstore, [node])) + precnodes = list(obsolete.allprecursors(unfi.obsstore, [node])) for n in precnodes: if n in nodemap: for tag in unfi.nodetags(n): m = _differentialrevisiontagre.match(tag) if m: - toconfirm[node] = (0, set(precnodes), int(m.group(1))) + toconfirm[node] = (n, set(precnodes), int(m.group(1))) continue - # Check commit message + # Check commit message (make sure URL matches) m = _differentialrevisiondescre.search(ctx.description()) if m: - toconfirm[node] = (1, set(precnodes), int(m.group(1))) + if m.group(1).rstrip('/') == url.rstrip('/'): + result[node] = (None, int(m.group(2))) + else: + unfi.ui.warn(_('%s: Differential Revision URL ignored - host ' + 'does not match config\n') % ctx) # Double check if tags are genuine by collecting all old nodes from # Phabricator, and expect precursors overlap with it. if toconfirm: - drevs = [drev for force, precs, drev in toconfirm.values()] - alldiffs = callconduit(unfi, 'differential.querydiffs', - {'revisionIDs': drevs}) - getnode = lambda d: bin(encoding.unitolocal( - getdiffmeta(d).get(r'node', ''))) or None - for newnode, (force, precset, drev) in toconfirm.items(): - diffs = [d for d in alldiffs.values() - if int(d[r'revisionID']) == drev] - - # "precursors" as known by Phabricator - phprecset = set(getnode(d) for d in diffs) - - # Ignore if precursors (Phabricator and local repo) do not overlap, - # and force is not set (when commit message says nothing) - if not force and not bool(phprecset & precset): + confirmed = {} # {drev: {oldnode}} + drevs = [drev for n, precs, drev in toconfirm.values()] + diffs = callconduit(unfi, 'differential.querydiffs', + {'revisionIDs': drevs}) + for diff in diffs.values(): + drev = int(diff[r'revisionID']) + oldnode = bin(encoding.unitolocal(getdiffmeta(diff).get(r'node'))) + if node: + confirmed.setdefault(drev, set()).add(oldnode) + for newnode, (oldnode, precset, drev) in toconfirm.items(): + if bool(precset & confirmed.get(drev, set())): + result[newnode] = (oldnode, drev) + else: tagname = 'D%d' % drev tags.tag(repo, tagname, nullid, message=None, user=None, date=None, local=True) unfi.ui.warn(_('D%s: local tag removed - does not match ' 'Differential history\n') % drev) - continue - - # Find the last node using Phabricator metadata, and make sure it - # exists in the repo - oldnode = lastdiff = None - if diffs: - lastdiff = max(diffs, key=lambda d: int(d[r'id'])) - oldnode = getnode(lastdiff) - if oldnode and oldnode not in nodemap: - oldnode = None - - result[newnode] = (oldnode, lastdiff, drev) return result @@ -261,7 +241,7 @@ callconduit(ctx.repo(), 'differential.setdiffproperty', params) def createdifferentialrevision(ctx, revid=None, parentrevid=None, oldnode=None, - olddiff=None, actions=None): + actions=None): """create or update a Differential Revision If revid is None, create a new Differential Revision, otherwise update @@ -283,14 +263,8 @@ transactions = [] if neednewdiff: diff = creatediff(ctx) + writediffproperties(ctx, diff) transactions.append({'type': 'update', 'value': diff[r'phid']}) - else: - # Even if we don't need to upload a new diff because the patch content - # does not change. We might still need to update its metadata so - # pushers could know the correct node metadata. - assert olddiff - diff = olddiff - writediffproperties(ctx, diff) # Use a temporary summary to set dependency. There might be better ways but # I cannot find them for now. But do not do that if we are updating an @@ -321,7 +295,7 @@ if not revision: raise error.Abort(_('cannot create revision for %s') % ctx) - return revision, diff + return revision def userphids(repo, names): """convert user names to PHIDs""" @@ -339,9 +313,7 @@ @command('phabsend', [('r', 'rev', [], _('revisions to send'), _('REV')), - ('', 'amend', False, _('update commit messages')), - ('', 'reviewer', [], _('specify reviewers')), - ('', 'confirm', None, _('ask for confirmation before sending'))], + ('', 'reviewer', [], _('specify reviewers'))], _('REV [OPTIONS]')) def phabsend(ui, repo, *revs, **opts): """upload changesets to Phabricator @@ -354,36 +326,12 @@ maintain the association. After the first time, phabsend will check obsstore and tags information so it can figure out whether to update an existing Differential Revision, or create a new one. - - If --amend is set, update commit messages so they have the - ``Differential Revision`` URL, remove related tags. This is similar to what - arcanist will do, and is more desired in author-push workflows. Otherwise, - use local tags to record the ``Differential Revision`` association. - - The --confirm option lets you confirm changesets before sending them. You - can also add following to your configuration file to make it default - behaviour. - - [phabsend] - confirm = true - - phabsend will check obsstore and the above association to decide whether to - update an existing Differential Revision, or create a new one. """ revs = list(revs) + opts.get('rev', []) revs = scmutil.revrange(repo, revs) if not revs: raise error.Abort(_('phabsend requires at least one changeset')) - if opts.get('amend'): - cmdutil.checkunfinished(repo) - - confirm = ui.configbool('phabsend', 'confirm') - confirm |= bool(opts.get('confirm')) - if confirm: - confirmed = _confirmbeforesend(repo, revs) - if not confirmed: - raise error.Abort(_('phabsend cancelled')) actions = [] reviewers = opts.get('reviewer', []) @@ -391,11 +339,7 @@ phids = userphids(repo, reviewers) actions.append({'type': 'reviewers.add', 'value': phids}) - # {newnode: (oldnode, olddiff, olddrev} - oldmap = getoldnodedrevmap(repo, [repo[r].node() for r in revs]) - - drevids = [] # [int] - diffmap = {} # {newnode: diff} + oldnodedrev = getoldnodedrevmap(repo, [repo[r].node() for r in revs]) # Send patches one by one so we know their Differential Revision IDs and # can provide dependency relationship @@ -405,25 +349,21 @@ ctx = repo[rev] # Get Differential Revision ID - oldnode, olddiff, revid = oldmap.get(ctx.node(), (None, None, None)) - if oldnode != ctx.node() or opts.get('amend'): + oldnode, revid = oldnodedrev.get(ctx.node(), (None, None)) + if oldnode != ctx.node(): # Create or update Differential Revision - revision, diff = createdifferentialrevision( - ctx, revid, lastrevid, oldnode, olddiff, actions) - diffmap[ctx.node()] = diff + revision = createdifferentialrevision(ctx, revid, lastrevid, + oldnode, actions) newrevid = int(revision[r'object'][r'id']) if revid: action = _('updated') else: action = _('created') - # Create a local tag to note the association, if commit message - # does not have it already - m = _differentialrevisiondescre.search(ctx.description()) - if not m or int(m.group(1)) != newrevid: - tagname = 'D%d' % newrevid - tags.tag(repo, tagname, ctx.node(), message=None, user=None, - date=None, local=True) + # Create a local tag to note the association + tagname = 'D%d' % newrevid + tags.tag(repo, tagname, ctx.node(), message=None, user=None, + date=None, local=True) else: # Nothing changed. But still set "newrevid" so the next revision # could depend on this one. @@ -432,140 +372,18 @@ ui.write(_('D%s: %s - %s: %s\n') % (newrevid, action, ctx, ctx.description().split('\n')[0])) - drevids.append(newrevid) lastrevid = newrevid - # Update commit messages and remove tags - if opts.get('amend'): - unfi = repo.unfiltered() - drevs = callconduit(repo, 'differential.query', {'ids': drevids}) - with repo.wlock(), repo.lock(), repo.transaction('phabsend'): - wnode = unfi['.'].node() - mapping = {} # {oldnode: [newnode]} - for i, rev in enumerate(revs): - old = unfi[rev] - drevid = drevids[i] - drev = [d for d in drevs if int(d[r'id']) == drevid][0] - newdesc = getdescfromdrev(drev) - # Make sure commit message contain "Differential Revision" - if old.description() != newdesc: - parents = [ - mapping.get(old.p1().node(), (old.p1(),))[0], - mapping.get(old.p2().node(), (old.p2(),))[0], - ] - new = context.metadataonlyctx( - repo, old, parents=parents, text=newdesc, - user=old.user(), date=old.date(), extra=old.extra()) - newnode = new.commit() - mapping[old.node()] = [newnode] - # Update diff property - writediffproperties(unfi[newnode], diffmap[old.node()]) - # Remove local tags since it's no longer necessary - tagname = 'D%d' % drevid - if tagname in repo.tags(): - tags.tag(repo, tagname, nullid, message=None, user=None, - date=None, local=True) - scmutil.cleanupnodes(repo, mapping, 'phabsend') - if wnode in mapping: - unfi.setparents(mapping[wnode][0]) - # Map from "hg:meta" keys to header understood by "hg import". The order is # consistent with "hg export" output. _metanamemap = util.sortdict([(r'user', 'User'), (r'date', 'Date'), (r'node', 'Node ID'), (r'parent', 'Parent ')]) -def _confirmbeforesend(repo, revs): - ui = repo.ui - for rev in revs: - ctx = repo[rev] - desc = ctx.description().splitlines()[0] - ui.write(('%d: ' % rev), label='phabsend.revnumber') - ui.write(('%s\n' % desc), label='phabsend.desc') - - if ui.promptchoice(_('Phabsend the above changes (yn)?' - '$$ &Yes $$ &No')): - return False - - return True - -_knownstatusnames = {'accepted', 'needsreview', 'needsrevision', 'closed', - 'abandoned'} - -def _getstatusname(drev): - """get normalized status name from a Differential Revision""" - return drev[r'statusName'].replace(' ', '').lower() - -# Small language to specify differential revisions. Support symbols: (), :X, -# +, and -. - -_elements = { - # token-type: binding-strength, primary, prefix, infix, suffix - '(': (12, None, ('group', 1, ')'), None, None), - ':': (8, None, ('ancestors', 8), None, None), - '&': (5, None, None, ('and_', 5), None), - '+': (4, None, None, ('add', 4), None), - '-': (4, None, None, ('sub', 4), None), - ')': (0, None, None, None, None), - 'symbol': (0, 'symbol', None, None, None), - 'end': (0, None, None, None, None), -} - -def _tokenize(text): - view = memoryview(text) # zero-copy slice - special = '():+-& ' - pos = 0 - length = len(text) - while pos < length: - symbol = ''.join(itertools.takewhile(lambda ch: ch not in special, - view[pos:])) - if symbol: - yield ('symbol', symbol, pos) - pos += len(symbol) - else: # special char, ignore space - if text[pos] != ' ': - yield (text[pos], None, pos) - pos += 1 - yield ('end', None, pos) - -def _parse(text): - tree, pos = parser.parser(_elements).parse(_tokenize(text)) - if pos != len(text): - raise error.ParseError('invalid token', pos) - return tree - -def _parsedrev(symbol): - """str -> int or None, ex. 'D45' -> 45; '12' -> 12; 'x' -> None""" - if symbol.startswith('D') and symbol[1:].isdigit(): - return int(symbol[1:]) - if symbol.isdigit(): - return int(symbol) - -def _prefetchdrevs(tree): - """return ({single-drev-id}, {ancestor-drev-id}) to prefetch""" - drevs = set() - ancestordrevs = set() - op = tree[0] - if op == 'symbol': - r = _parsedrev(tree[1]) - if r: - drevs.add(r) - elif op == 'ancestors': - r, a = _prefetchdrevs(tree[1]) - drevs.update(r) - ancestordrevs.update(r) - ancestordrevs.update(a) - else: - for t in tree[1:]: - r, a = _prefetchdrevs(t) - drevs.update(r) - ancestordrevs.update(a) - return drevs, ancestordrevs - -def querydrev(repo, spec): +def querydrev(repo, params, stack=False): """return a list of "Differential Revision" dicts - spec is a string using a simple query language, see docstring in phabread - for details. + params is the input of "differential.query" API, and is expected to match + just a single Differential Revision. A "Differential Revision dict" looks like: @@ -602,13 +420,26 @@ "repositoryPHID": "PHID-REPO-hub2hx62ieuqeheznasv", "sourcePath": null } + + If stack is True, return a list of "Differential Revision dict"s in an + order that the latter ones depend on the former ones. Otherwise, return a + list of a unique "Differential Revision dict". """ + prefetched = {} # {id or phid: drev} def fetch(params): """params -> single drev or None""" key = (params.get(r'ids') or params.get(r'phids') or [None])[0] if key in prefetched: return prefetched[key] - drevs = callconduit(repo, 'differential.query', params) + # Otherwise, send the request. If we're fetching a stack, be smarter + # and fetch more ids in one batch, even if it could be unnecessary. + batchparams = params + if stack and len(params.get(r'ids', [])) == 1: + i = int(params[r'ids'][0]) + # developer config: phabricator.batchsize + batchsize = repo.ui.configint('phabricator', 'batchsize', 12) + batchparams = {'ids': range(max(1, i - batchsize), i + 1)} + drevs = callconduit(repo, 'differential.query', batchparams) # Fill prefetched with the result for drev in drevs: prefetched[drev[r'phid']] = drev @@ -617,66 +448,23 @@ raise error.Abort(_('cannot get Differential Revision %r') % params) return prefetched[key] - def getstack(topdrevids): - """given a top, get a stack from the bottom, [id] -> [id]""" - visited = set() - result = [] - queue = [{r'ids': [i]} for i in topdrevids] - while queue: - params = queue.pop() - drev = fetch(params) - if drev[r'id'] in visited: - continue - visited.add(drev[r'id']) - result.append(int(drev[r'id'])) + visited = set() + result = [] + queue = [params] + while queue: + params = queue.pop() + drev = fetch(params) + if drev[r'id'] in visited: + continue + visited.add(drev[r'id']) + result.append(drev) + if stack: auxiliary = drev.get(r'auxiliary', {}) depends = auxiliary.get(r'phabricator:depends-on', []) for phid in depends: queue.append({'phids': [phid]}) - result.reverse() - return smartset.baseset(result) - - # Initialize prefetch cache - prefetched = {} # {id or phid: drev} - - tree = _parse(spec) - drevs, ancestordrevs = _prefetchdrevs(tree) - - # developer config: phabricator.batchsize - batchsize = repo.ui.configint('phabricator', 'batchsize', 12) - - # Prefetch Differential Revisions in batch - tofetch = set(drevs) - for r in ancestordrevs: - tofetch.update(range(max(1, r - batchsize), r + 1)) - if drevs: - fetch({r'ids': list(tofetch)}) - validids = sorted(set(getstack(list(ancestordrevs))) | set(drevs)) - - # Walk through the tree, return smartsets - def walk(tree): - op = tree[0] - if op == 'symbol': - drev = _parsedrev(tree[1]) - if drev: - return smartset.baseset([drev]) - elif tree[1] in _knownstatusnames: - drevs = [r for r in validids - if _getstatusname(prefetched[r]) == tree[1]] - return smartset.baseset(drevs) - else: - raise error.Abort(_('unknown symbol: %s') % tree[1]) - elif op in {'and_', 'add', 'sub'}: - assert len(tree) == 3 - return getattr(operator, op)(walk(tree[1]), walk(tree[2])) - elif op == 'group': - return walk(tree[1]) - elif op == 'ancestors': - return getstack(walk(tree[1])) - else: - raise error.ProgrammingError('illegal tree: %r' % tree) - - return [prefetched[r] for r in walk(tree)] + result.reverse() + return result def getdescfromdrev(drev): """get description (commit message) from "Differential Revision" @@ -742,12 +530,15 @@ meta[r'parent'] = commit[r'parents'][0] return meta or {} -def readpatch(repo, drevs, write): +def readpatch(repo, params, write, stack=False): """generate plain-text patch readable by 'hg import' - write is usually ui.write. drevs is what "querydrev" returns, results of - "differential.query". + write is usually ui.write. params is passed to "differential.query". If + stack is True, also write dependent patches. """ + # Differential Revisions + drevs = querydrev(repo, params, stack) + # Prefetch hg:meta property for all diffs diffids = sorted(set(max(int(v) for v in drev[r'diffs']) for drev in drevs)) diffs = callconduit(repo, 'differential.querydiffs', {'ids': diffids}) @@ -774,56 +565,17 @@ @command('phabread', [('', 'stack', False, _('read dependencies'))], - _('DREVSPEC [OPTIONS]')) -def phabread(ui, repo, spec, **opts): + _('REVID [OPTIONS]')) +def phabread(ui, repo, revid, **opts): """print patches from Phabricator suitable for importing - DREVSPEC could be a Differential Revision identity, like ``D123``, or just - the number ``123``. It could also have common operators like ``+``, ``-``, - ``&``, ``(``, ``)`` for complex queries. Prefix ``:`` could be used to - select a stack. - - ``abandoned``, ``accepted``, ``closed``, ``needsreview``, ``needsrevision`` - could be used to filter patches by status. For performance reason, they - only represent a subset of non-status selections and cannot be used alone. - - For example, ``:D6+8-(2+D4)`` selects a stack up to D6, plus D8 and exclude - D2 and D4. ``:D9 & needsreview`` selects "Needs Review" revisions in a - stack up to D9. + REVID could be a Differential Revision identity, like ``D123``, or just the + number ``123``, or a full URL like ``https://phab.example.com/D123``. If --stack is given, follow dependencies information and read all patches. - It is equivalent to the ``:`` operator. """ - if opts.get('stack'): - spec = ':(%s)' % spec - drevs = querydrev(repo, spec) - readpatch(repo, drevs, ui.write) - -@command('phabupdate', - [('', 'accept', False, _('accept revisions')), - ('', 'reject', False, _('reject revisions')), - ('', 'abandon', False, _('abandon revisions')), - ('', 'reclaim', False, _('reclaim revisions')), - ('m', 'comment', '', _('comment on the last revision')), - ], _('DREVSPEC [OPTIONS]')) -def phabupdate(ui, repo, spec, **opts): - """update Differential Revision in batch - - DREVSPEC selects revisions. See :hg:`help phabread` for its usage. - """ - flags = [n for n in 'accept reject abandon reclaim'.split() if opts.get(n)] - if len(flags) > 1: - raise error.Abort(_('%s cannot be used together') % ', '.join(flags)) - - actions = [] - for f in flags: - actions.append({'type': f, 'value': 'true'}) - - drevs = querydrev(repo, spec) - for i, drev in enumerate(drevs): - if i + 1 == len(drevs) and opts.get('comment'): - actions.append({'type': 'comment', 'value': opts['comment']}) - if actions: - params = {'objectIdentifier': drev[r'phid'], - 'transactions': actions} - callconduit(repo, 'differential.revision.edit', params) + try: + revid = int(revid.split('/')[-1].replace('D', '')) + except ValueError: + raise error.Abort(_('invalid Revision ID: %s') % revid) + readpatch(repo, {'ids': [revid]}, ui.write, opts.get('stack')) diff -Nru mercurial-4.3.1+207-xenial/contrib/python3-whitelist mercurial-4.3.1/contrib/python3-whitelist --- mercurial-4.3.1+207-xenial/contrib/python3-whitelist 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/contrib/python3-whitelist 2017-09-10 00:05:18.000000000 +0000 @@ -15,36 +15,19 @@ test-diff-subdir.t test-dirstate-nonnormalset.t test-doctest.py -test-duplicateoptions.py test-empty-dir.t -test-empty.t test-excessive-merge.t -test-hghave.t test-issue1089.t test-issue1993.t test-issue842.t test-locate.t test-lrucachedict.py test-manifest.py -test-match.py test-merge-default.t test-merge2.t test-merge5.t -test-push-checkheads-pruned-B1.t -test-push-checkheads-pruned-B6.t -test-push-checkheads-pruned-B7.t -test-push-checkheads-superceed-A1.t -test-push-checkheads-superceed-A4.t -test-push-checkheads-superceed-A5.t -test-push-checkheads-superceed-A8.t -test-push-checkheads-unpushed-D1.t -test-push-checkheads-unpushed-D6.t -test-push-checkheads-unpushed-D7.t -test-rename.t test-revlog-packentry.t test-run-tests.py -test-terse-status.t test-unified-test.t -test-update-dest.t test-update-reverse.t test-xdg.t diff -Nru mercurial-4.3.1+207-xenial/debian/changelog mercurial-4.3.1/debian/changelog --- mercurial-4.3.1+207-xenial/debian/changelog 2017-09-10 00:45:16.000000000 +0000 +++ mercurial-4.3.1/debian/changelog 2017-09-10 00:42:54.000000000 +0000 @@ -1,5 +1,5 @@ -mercurial (4.3.1+207-xenial-af20468eb0a4) xenial; urgency=medium +mercurial (4.3.1-1~xenial1) xenial; urgency=medium * Automated build performed by upstream. - -- Mercurial Devel Tue, 22 Aug 2017 06:01:51 +0000 + -- Mercurial Devel Sun, 10 Sep 2017 00:42:54 +0000 diff -Nru mercurial-4.3.1+207-xenial/.hg_archival.txt mercurial-4.3.1/.hg_archival.txt --- mercurial-4.3.1+207-xenial/.hg_archival.txt 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/.hg_archival.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -repo: 9117c6561b0bd7792fa13b50d28239d51b78e51f -node: af20468eb0a499c094dbd6e27ffcacf54cf5a8e6 -branch: default -latesttag: 4.3.1 -latesttagdistance: 124 -changessincelatesttag: 207 diff -Nru mercurial-4.3.1+207-xenial/hgdemandimport/demandimportpy2.py mercurial-4.3.1/hgdemandimport/demandimportpy2.py --- mercurial-4.3.1+207-xenial/hgdemandimport/demandimportpy2.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/hgdemandimport/demandimportpy2.py 2017-09-10 00:05:18.000000000 +0000 @@ -28,6 +28,7 @@ import __builtin__ as builtins import contextlib +import os import sys contextmanager = contextlib.contextmanager @@ -284,7 +285,8 @@ def enable(): "enable global demand-loading of modules" - builtins.__import__ = _demandimport + if os.environ.get('HGDEMANDIMPORT') != 'disable': + builtins.__import__ = _demandimport def disable(): "disable global demand-loading of modules" diff -Nru mercurial-4.3.1+207-xenial/hgdemandimport/demandimportpy3.py mercurial-4.3.1/hgdemandimport/demandimportpy3.py --- mercurial-4.3.1+207-xenial/hgdemandimport/demandimportpy3.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/hgdemandimport/demandimportpy3.py 2017-09-10 00:05:18.000000000 +0000 @@ -27,6 +27,7 @@ from __future__ import absolute_import import contextlib +import os import sys import importlib.abc @@ -80,7 +81,8 @@ pass def enable(): - sys.path_hooks.insert(0, _makefinder) + if os.environ.get('HGDEMANDIMPORT') != 'disable': + sys.path_hooks.insert(0, _makefinder) @contextlib.contextmanager def deactivated(): diff -Nru mercurial-4.3.1+207-xenial/hgdemandimport/__init__.py mercurial-4.3.1/hgdemandimport/__init__.py --- mercurial-4.3.1+207-xenial/hgdemandimport/__init__.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/hgdemandimport/__init__.py 2017-09-10 00:05:18.000000000 +0000 @@ -13,7 +13,6 @@ from __future__ import absolute_import -import os import sys if sys.version_info[0] >= 3: @@ -69,11 +68,6 @@ # Re-export. isenabled = demandimport.isenabled +enable = demandimport.enable disable = demandimport.disable deactivated = demandimport.deactivated - -def enable(): - # chg pre-imports modules so do not enable demandimport for it - if ('CHGINTERNALMARK' not in os.environ - and os.environ.get('HGDEMANDIMPORT') != 'disable'): - demandimport.enable() diff -Nru mercurial-4.3.1+207-xenial/hgext/fsmonitor/pywatchman/__init__.py mercurial-4.3.1/hgext/fsmonitor/pywatchman/__init__.py --- mercurial-4.3.1+207-xenial/hgext/fsmonitor/pywatchman/__init__.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/hgext/fsmonitor/pywatchman/__init__.py 2017-09-10 00:05:18.000000000 +0000 @@ -825,7 +825,7 @@ p = subprocess.Popen(cmd, **args) except OSError as e: - raise WatchmanError('"watchman" executable not in PATH (%s)' % e) + raise WatchmanError('"watchman" executable not in PATH (%s)', e) stdout, stderr = p.communicate() exitcode = p.poll() diff -Nru mercurial-4.3.1+207-xenial/hgext/hgk.py mercurial-4.3.1/hgext/hgk.py --- mercurial-4.3.1+207-xenial/hgext/hgk.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/hgext/hgk.py 2017-09-10 00:05:18.000000000 +0000 @@ -50,7 +50,6 @@ patch, registrar, scmutil, - util, ) cmdtable = {} @@ -97,7 +96,7 @@ while True: if opts['stdin']: try: - line = util.bytesinput(ui.fin, ui.fout).split(' ') + line = raw_input().split(' ') node1 = line[0] if len(line) > 1: node2 = line[1] @@ -178,7 +177,7 @@ prefix = "" if opts['stdin']: try: - (type, r) = util.bytesinput(ui.fin, ui.fout).split(' ') + (type, r) = raw_input().split(' ') prefix = " " except EOFError: return @@ -196,7 +195,7 @@ catcommit(ui, repo, n, prefix) if opts['stdin']: try: - (type, r) = util.bytesinput(ui.fin, ui.fout).split(' ') + (type, r) = raw_input().split(' ') except EOFError: break else: diff -Nru mercurial-4.3.1+207-xenial/hgext/histedit.py mercurial-4.3.1/hgext/histedit.py --- mercurial-4.3.1+207-xenial/hgext/histedit.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/hgext/histedit.py 2017-09-10 00:05:18.000000000 +0000 @@ -1417,11 +1417,6 @@ expected = set(c.node() for c in ctxs) seen = set() prev = None - - if actions and actions[0].verb in ['roll', 'fold']: - raise error.ParseError(_('first changeset cannot use verb "%s"') % - actions[0].verb) - for action in actions: action.verify(prev, expected, seen) prev = action diff -Nru mercurial-4.3.1+207-xenial/hgext/largefiles/__init__.py mercurial-4.3.1/hgext/largefiles/__init__.py --- mercurial-4.3.1+207-xenial/hgext/largefiles/__init__.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/hgext/largefiles/__init__.py 2017-09-10 00:05:18.000000000 +0000 @@ -91,7 +91,7 @@ [largefiles] patterns = *.jpg - re:.*\\.(png|bmp)$ + re:.*\.(png|bmp)$ library.zip content/audio/* diff -Nru mercurial-4.3.1+207-xenial/hgext/largefiles/remotestore.py mercurial-4.3.1/hgext/largefiles/remotestore.py --- mercurial-4.3.1+207-xenial/hgext/largefiles/remotestore.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/hgext/largefiles/remotestore.py 2017-09-10 00:05:18.000000000 +0000 @@ -12,6 +12,7 @@ from mercurial import ( error, util, + wireproto, ) from . import ( @@ -108,6 +109,10 @@ 'from statlfile (%r)' % stat) return failed + def batch(self): + '''Support for remote batching.''' + return wireproto.remotebatch(self) + def _put(self, hash, fd): '''Put file with the given hash in the remote store.''' raise NotImplementedError('abstract method') diff -Nru mercurial-4.3.1+207-xenial/hgext/notify.py mercurial-4.3.1/hgext/notify.py --- mercurial-4.3.1+207-xenial/hgext/notify.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/hgext/notify.py 2017-09-10 00:05:18.000000000 +0000 @@ -145,7 +145,6 @@ error, mail, patch, - registrar, util, ) @@ -155,49 +154,6 @@ # leave the attribute unspecified. testedwith = 'ships-with-hg-core' -configtable = {} -configitem = registrar.configitem(configtable) - -configitem('notify', 'config', - default=None, -) -configitem('notify', 'diffstat', - default=True, -) -configitem('notify', 'domain', - default=None, -) -configitem('notify', 'fromauthor', - default=None, -) -configitem('notify', 'maxdiff', - default=300, -) -configitem('notify', 'maxsubject', - default=67, -) -configitem('notify', 'mbox', - default=None, -) -configitem('notify', 'merge', - default=True, -) -configitem('notify', 'sources', - default='serve', -) -configitem('notify', 'strip', - default=0, -) -configitem('notify', 'style', - default=None, -) -configitem('notify', 'template', - default=None, -) -configitem('notify', 'test', - default=True, -) - # template for single changeset can include email headers. single_template = ''' Subject: changeset in {webroot}: {desc|firstline|strip} @@ -231,14 +187,14 @@ if cfg: self.ui.readconfig(cfg, sections=['usersubs', 'reposubs']) self.repo = repo - self.stripcount = int(self.ui.config('notify', 'strip')) + self.stripcount = int(self.ui.config('notify', 'strip', 0)) self.root = self.strip(self.repo.root) self.domain = self.ui.config('notify', 'domain') self.mbox = self.ui.config('notify', 'mbox') - self.test = self.ui.configbool('notify', 'test') + self.test = self.ui.configbool('notify', 'test', True) self.charsets = mail._charsets(self.ui) self.subs = self.subscribers() - self.merge = self.ui.configbool('notify', 'merge') + self.merge = self.ui.configbool('notify', 'merge', True) mapfile = None template = (self.ui.config('notify', hooktype) or @@ -309,7 +265,7 @@ def skipsource(self, source): '''true if incoming changes from this source should be skipped.''' - ok_sources = self.ui.config('notify', 'sources').split() + ok_sources = self.ui.config('notify', 'sources', 'serve').split() return source not in ok_sources def send(self, ctx, count, data): @@ -360,7 +316,7 @@ else: s = ctx.description().lstrip().split('\n', 1)[0].rstrip() subject = '%s: %s' % (self.root, s) - maxsubject = int(self.ui.config('notify', 'maxsubject')) + maxsubject = int(self.ui.config('notify', 'maxsubject', 67)) if maxsubject: subject = util.ellipsis(subject, maxsubject) msg['Subject'] = mail.headencode(self.ui, subject, @@ -394,7 +350,7 @@ def diff(self, ctx, ref=None): - maxdiff = int(self.ui.config('notify', 'maxdiff')) + maxdiff = int(self.ui.config('notify', 'maxdiff', 300)) prev = ctx.p1().node() if ref: ref = ref.node() @@ -404,7 +360,7 @@ opts=patch.diffallopts(self.ui)) difflines = ''.join(chunks).splitlines() - if self.ui.configbool('notify', 'diffstat'): + if self.ui.configbool('notify', 'diffstat', True): s = patch.diffstat(difflines) # s may be nil, don't include the header if it is if s: diff -Nru mercurial-4.3.1+207-xenial/hgext/rebase.py mercurial-4.3.1/hgext/rebase.py --- mercurial-4.3.1+207-xenial/hgext/rebase.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/hgext/rebase.py 2017-09-10 00:05:18.000000000 +0000 @@ -60,10 +60,13 @@ # Indicates that a revision needs to be rebased revtodo = -1 - -# legacy revstates no longer needed in current code -# -2: nullmerge, -3: revignored, -4: revprecursor, -5: revpruned -legacystates = {'-2', '-3', '-4', '-5'} +nullmerge = -2 +revignored = -3 +# successor in rebase destination +revprecursor = -4 +# plain prune (no successor) +revpruned = -5 +revskipped = (revignored, revprecursor, revpruned) cmdtable = {} command = registrar.command(cmdtable) @@ -120,16 +123,6 @@ sourceset = revset.getset(repo, smartset.fullreposet(repo), x) return subset & smartset.baseset([_destrebase(repo, sourceset)]) -def _ctxdesc(ctx): - """short description for a context""" - desc = '%d:%s "%s"' % (ctx.rev(), ctx, - ctx.description().split('\n', 1)[0]) - repo = ctx.repo() - names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node()) - if names: - desc += ' (%s)' % ' '.join(names) - return desc - class rebaseruntime(object): """This class is a container for rebase runtime state""" def __init__(self, repo, ui, opts=None): @@ -148,6 +141,7 @@ self.activebookmark = None self.dest = None self.skipped = set() + self.destancestors = set() self.collapsef = opts.get('collapse', False) self.collapsemsg = cmdutil.logmessage(ui, opts) @@ -228,8 +222,9 @@ activebookmark = l else: oldrev, newrev = l.split(':') - if newrev in legacystates: - continue + if newrev in (str(nullmerge), str(revignored), + str(revprecursor), str(revpruned)): + state[repo[oldrev].rev()] = int(newrev) elif newrev == nullid: state[repo[oldrev].rev()] = revtodo # Legacy compat special case @@ -278,11 +273,12 @@ if not self.ui.configbool('experimental', 'rebaseskipobsolete', default=True): return + rebaseset = set(rebaserevs) obsoleteset = set(obsoleterevs) self.obsoletenotrebased = _computeobsoletenotrebased(self.repo, obsoleteset, dest) skippedset = set(self.obsoletenotrebased) - _checkobsrebase(self.repo, self.ui, obsoleteset, skippedset) + _checkobsrebase(self.repo, self.ui, obsoleteset, rebaseset, skippedset) def _prepareabortorcontinue(self, isabort): try: @@ -303,6 +299,9 @@ return abort(self.repo, self.originalwd, self.dest, self.state, activebookmark=self.activebookmark) + obsrevs = (r for r, st in self.state.items() if st == revprecursor) + self._handleskippingobsolete(self.state.keys(), obsrevs, self.dest) + def _preparenewrebase(self, dest, rebaseset): if dest is None: return _nothingtorebase() @@ -335,9 +334,11 @@ (self.originalwd, self.dest, self.state) = result if self.collapsef: - destancestors = self.repo.changelog.ancestors([self.dest], - inclusive=True) - self.external = externalparent(self.repo, self.state, destancestors) + self.destancestors = self.repo.changelog.ancestors( + [self.dest], + inclusive=True) + self.external = externalparent(self.repo, self.state, + self.destancestors) if dest.closesbranch() and not self.keepbranchesf: self.ui.status(_('reopening closed branch head %s\n') % dest) @@ -357,6 +358,11 @@ raise error.Abort(_('cannot collapse multiple named ' 'branches')) + # Rebase + if not self.destancestors: + self.destancestors = repo.changelog.ancestors([self.dest], + inclusive=True) + # Keep track of the active bookmarks in order to reset them later self.activebookmark = self.activebookmark or repo._activebookmark if self.activebookmark: @@ -372,7 +378,11 @@ pos = 0 for rev in sortedrevs: ctx = repo[rev] - desc = _ctxdesc(ctx) + desc = '%d:%s "%s"' % (ctx.rev(), ctx, + ctx.description().split('\n', 1)[0]) + names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node()) + if names: + desc += ' (%s)' % ' '.join(names) if self.state[rev] == rev: ui.status(_('already rebased %s\n') % desc) elif self.state[rev] == revtodo: @@ -380,7 +390,10 @@ ui.status(_('rebasing %s\n') % desc) ui.progress(_("rebasing"), pos, ("%d:%s" % (rev, ctx)), _('changesets'), total) - p1, p2, base = defineparents(repo, rev, self.dest, self.state) + p1, p2, base = defineparents(repo, rev, self.dest, + self.state, + self.destancestors, + self.obsoletenotrebased) self.storestatus(tr=tr) storecollapsemsg(repo, self.collapsemsg) if len(repo[None].parents()) == 2: @@ -426,6 +439,19 @@ self.skipped.add(rev) self.state[rev] = p1 ui.debug('next revision set to %s\n' % p1) + elif self.state[rev] == nullmerge: + ui.debug('ignoring null merge rebase of %s\n' % rev) + elif self.state[rev] == revignored: + ui.status(_('not rebasing ignored %s\n') % desc) + elif self.state[rev] == revprecursor: + destctx = repo[self.obsoletenotrebased[rev]] + descdest = '%d:%s "%s"' % (destctx.rev(), destctx, + destctx.description().split('\n', 1)[0]) + msg = _('note: not rebasing %s, already in destination as %s\n') + ui.status(msg % (desc, descdest)) + elif self.state[rev] == revpruned: + msg = _('note: not rebasing %s, it has no successor\n') + ui.status(msg % desc) else: ui.status(_('already rebased %s as %s\n') % (desc, repo[self.state[rev]])) @@ -437,7 +463,9 @@ repo, ui, opts = self.repo, self.ui, self.opts if self.collapsef and not self.keepopen: p1, p2, _base = defineparents(repo, min(self.state), - self.dest, self.state) + self.dest, self.state, + self.destancestors, + self.obsoletenotrebased) editopt = opts.get('edit') editform = 'rebase.collapse' if self.collapsemsg: @@ -445,25 +473,24 @@ else: commitmsg = 'Collapsed revision' for rebased in sorted(self.state): - if rebased not in self.skipped: + if rebased not in self.skipped and\ + self.state[rebased] > nullmerge: commitmsg += '\n* %s' % repo[rebased].description() editopt = True editor = cmdutil.getcommiteditor(edit=editopt, editform=editform) revtoreuse = max(self.state) - - dsguard = None - if ui.configbool('rebase', 'singletransaction'): - dsguard = dirstateguard.dirstateguard(repo, 'rebase') - with util.acceptintervention(dsguard): - newnode = concludenode(repo, revtoreuse, p1, self.external, - commitmsg=commitmsg, - extrafn=_makeextrafn(self.extrafns), - editor=editor, - keepbranches=self.keepbranchesf, - date=self.date) - if newnode is not None: + newnode = concludenode(repo, revtoreuse, p1, self.external, + commitmsg=commitmsg, + extrafn=_makeextrafn(self.extrafns), + editor=editor, + keepbranches=self.keepbranchesf, + date=self.date) + if newnode is None: + newrev = self.dest + else: newrev = repo[newnode].rev() - for oldrev in self.state.iterkeys(): + for oldrev in self.state.iterkeys(): + if self.state[oldrev] > nullmerge: self.state[oldrev] = newrev if 'qtip' in repo.tags(): @@ -472,7 +499,9 @@ # restore original working directory # (we do this before stripping) newwd = self.state.get(self.originalwd, self.originalwd) - if newwd < 0: + if newwd == revprecursor: + newwd = self.obsoletenotrebased[self.originalwd] + elif newwd < 0: # original directory is a parent of rebase set root or ignored newwd = self.originalwd if newwd not in [c.rev() for c in repo[None].parents()]: @@ -682,16 +711,10 @@ return retcode tr = None - dsguard = None - - singletr = ui.configbool('rebase', 'singletransaction') - if singletr: + if ui.configbool('rebase', 'singletransaction'): tr = repo.transaction('rebase') with util.acceptintervention(tr): - if singletr: - dsguard = dirstateguard.dirstateguard(repo, 'rebase') - with util.acceptintervention(dsguard): - rbsrt._performrebase(tr) + rbsrt._performrebase(tr) rbsrt._finishrebase() @@ -818,10 +841,8 @@ '''Commit the wd changes with parents p1 and p2. Reuse commit info from rev but also store useful information in extra. Return node of committed revision.''' - dsguard = util.nullcontextmanager() - if not repo.ui.configbool('rebase', 'singletransaction'): - dsguard = dirstateguard.dirstateguard(repo, 'rebase') - with dsguard: + dsguard = dirstateguard.dirstateguard(repo, 'rebase') + try: repo.setparents(repo[p1].node(), repo[p2].node()) ctx = repo[rev] if commitmsg is None: @@ -843,7 +864,10 @@ date=date, extra=extra, editor=editor) repo.dirstate.setbranch(repo[newnode].branch()) + dsguard.close() return newnode + finally: + release(dsguard) def rebasenode(repo, rev, p1, base, state, collapse, dest): 'Rebase a single revision rev on top of p1 using base as merge ancestor' @@ -914,24 +938,33 @@ |/ |/ A A """ - # pick already rebased revs from state - source = [s for s, d in state.items() if d > 0] - result = [] for prev in repo.changelog.parentrevs(rev): adjusted = dest if prev != nullrev: + # pick already rebased revs from state + source = [s for s, d in state.items() if d > 0] candidate = repo.revs('max(%ld and (::%d))', source, prev).first() if candidate is not None: adjusted = state[candidate] result.append(adjusted) return result -def _checkobsrebase(repo, ui, rebaseobsrevs, rebaseobsskipped): +def nearestrebased(repo, rev, state): + """return the nearest ancestors of rev in the rebase result""" + rebased = [r for r in state if state[r] > nullmerge] + candidates = repo.revs('max(%ld and (::%d))', rebased, rev) + if candidates: + return state[candidates.first()] + else: + return None + +def _checkobsrebase(repo, ui, rebaseobsrevs, rebasesetrevs, rebaseobsskipped): """ Abort if rebase will create divergence or rebase is noop because of markers `rebaseobsrevs`: set of obsolete revision in source + `rebasesetrevs`: set of revisions to be rebased from source `rebaseobsskipped`: set of revisions from source skipped because they have successors in destination """ @@ -949,192 +982,107 @@ "experimental.allowdivergence=True") raise error.Abort(msg % (",".join(divhashes),), hint=h) -def successorrevs(repo, rev): - """yield revision numbers for successors of rev""" - unfi = repo.unfiltered() - nodemap = unfi.changelog.nodemap - for s in obsutil.allsuccessors(unfi.obsstore, [unfi[rev].node()]): - if s in nodemap: - yield nodemap[s] - -def defineparents(repo, rev, dest, state): - """Return new parents and optionally a merge base for rev being rebased - - The destination specified by "dest" cannot always be used directly because - previously rebase result could affect destination. For example, - - D E rebase -r C+D+E -d B - |/ C will be rebased to C' - B C D's new destination will be C' instead of B - |/ E's new destination will be C' instead of B - A - - The new parents of a merge is slightly more complicated. See the comment - block below. - """ - cl = repo.changelog - def isancestor(a, b): - # take revision numbers instead of nodes - if a == b: - return True - elif a > b: - return False - return cl.isancestor(cl.node(a), cl.node(b)) - - oldps = repo.changelog.parentrevs(rev) # old parents - newps = [nullrev, nullrev] # new parents - dests = adjustdest(repo, rev, dest, state) # adjusted destinations - bases = list(oldps) # merge base candidates, initially just old parents - - if all(r == nullrev for r in oldps[1:]): - # For non-merge changeset, just move p to adjusted dest as requested. - newps[0] = dests[0] +def defineparents(repo, rev, dest, state, destancestors, + obsoletenotrebased): + 'Return the new parent relationship of the revision that will be rebased' + parents = repo[rev].parents() + p1 = p2 = nullrev + rp1 = None + + p1n = parents[0].rev() + if p1n in destancestors: + p1 = dest + elif p1n in state: + if state[p1n] == nullmerge: + p1 = dest + elif state[p1n] in revskipped: + p1 = nearestrebased(repo, p1n, state) + if p1 is None: + p1 = dest + else: + p1 = state[p1n] + else: # p1n external + p1 = dest + p2 = p1n + + if len(parents) == 2 and parents[1].rev() not in destancestors: + p2n = parents[1].rev() + # interesting second parent + if p2n in state: + if p1 == dest: # p1n in destancestors or external + p1 = state[p2n] + if p1 == revprecursor: + rp1 = obsoletenotrebased[p2n] + elif state[p2n] in revskipped: + p2 = nearestrebased(repo, p2n, state) + if p2 is None: + # no ancestors rebased yet, detach + p2 = dest + else: + p2 = state[p2n] + else: # p2n external + if p2 != nullrev: # p1n external too => rev is a merged revision + raise error.Abort(_('cannot use revision %d as base, result ' + 'would have 3 parents') % rev) + p2 = p2n + repo.ui.debug(" future parents are %d and %d\n" % + (repo[rp1 or p1].rev(), repo[p2].rev())) + + if not any(p.rev() in state for p in parents): + # Case (1) root changeset of a non-detaching rebase set. + # Let the merge mechanism find the base itself. + base = None + elif not repo[rev].p2(): + # Case (2) detaching the node with a single parent, use this parent + base = repo[rev].p1().rev() else: - # For merge changeset, if we move p to dests[i] unconditionally, both - # parents may change and the end result looks like "the merge loses a - # parent", which is a surprise. This is a limit because "--dest" only - # accepts one dest per src. + # Assuming there is a p1, this is the case where there also is a p2. + # We are thus rebasing a merge and need to pick the right merge base. # - # Therefore, only move p with reasonable conditions (in this order): - # 1. use dest, if dest is a descendent of (p or one of p's successors) - # 2. use p's rebased result, if p is rebased (state[p] > 0) + # Imagine we have: + # - M: current rebase revision in this step + # - A: one parent of M + # - B: other parent of M + # - D: destination of this merge step (p1 var) # - # Comparing with adjustdest, the logic here does some additional work: - # 1. decide which parents will not be moved towards dest - # 2. if the above decision is "no", should a parent still be moved - # because it was rebased? + # Consider the case where D is a descendant of A or B and the other is + # 'outside'. In this case, the right merge base is the D ancestor. # - # For example: + # An informal proof, assuming A is 'outside' and B is the D ancestor: # - # C # "rebase -r C -d D" is an error since none of the parents - # /| # can be moved. "rebase -r B+C -d D" will move C's parent - # A B D # B (using rule "2."), since B will be rebased. + # If we pick B as the base, the merge involves: + # - changes from B to M (actual changeset payload) + # - changes from B to D (induced by rebase) as D is a rebased + # version of B) + # Which exactly represent the rebase operation. # - # The loop tries to be not rely on the fact that a Mercurial node has - # at most 2 parents. - for i, p in enumerate(oldps): - np = p # new parent - if any(isancestor(x, dests[i]) for x in successorrevs(repo, p)): - np = dests[i] - elif p in state and state[p] > 0: - np = state[p] - - # "bases" only record "special" merge bases that cannot be - # calculated from changelog DAG (i.e. isancestor(p, np) is False). - # For example: - # - # B' # rebase -s B -d D, when B was rebased to B'. dest for C - # | C # is B', but merge base for C is B, instead of - # D | # changelog.ancestor(C, B') == A. If changelog DAG and - # | B # "state" edges are merged (so there will be an edge from - # |/ # B to B'), the merge base is still ancestor(C, B') in - # A # the merged graph. - # - # Also see https://bz.mercurial-scm.org/show_bug.cgi?id=1950#c8 - # which uses "virtual null merge" to explain this situation. - if isancestor(p, np): - bases[i] = nullrev - - # If one parent becomes an ancestor of the other, drop the ancestor - for j, x in enumerate(newps[:i]): - if x == nullrev: - continue - if isancestor(np, x): # CASE-1 - np = nullrev - elif isancestor(x, np): # CASE-2 - newps[j] = np - np = nullrev - # New parents forming an ancestor relationship does not - # mean the old parents have a similar relationship. Do not - # set bases[x] to nullrev. - bases[j], bases[i] = bases[i], bases[j] - - newps[i] = np - - # "rebasenode" updates to new p1, and the old p1 will be used as merge - # base. If only p2 changes, merging using unchanged p1 as merge base is - # suboptimal. Therefore swap parents to make the merge sane. - if newps[1] != nullrev and oldps[0] == newps[0]: - assert len(newps) == 2 and len(oldps) == 2 - newps.reverse() - bases.reverse() - - # No parent change might be an error because we fail to make rev a - # descendent of requested dest. This can happen, for example: + # If we pick A as the base, the merge involves: + # - changes from A to M (actual changeset payload) + # - changes from A to D (with include changes between unrelated A and B + # plus changes induced by rebase) + # Which does not represent anything sensible and creates a lot of + # conflicts. A is thus not the right choice - B is. # - # C # rebase -r C -d D - # /| # None of A and B will be changed to D and rebase fails. - # A B D - if set(newps) == set(oldps) and dest not in newps: - raise error.Abort(_('cannot rebase %d:%s without ' - 'moving at least one of its parents') - % (rev, repo[rev])) - - # "rebasenode" updates to new p1, use the corresponding merge base. - if bases[0] != nullrev: - base = bases[0] - else: - base = None - - # Check if the merge will contain unwanted changes. That may happen if - # there are multiple special (non-changelog ancestor) merge bases, which - # cannot be handled well by the 3-way merge algorithm. For example: - # - # F - # /| - # D E # "rebase -r D+E+F -d Z", when rebasing F, if "D" was chosen - # | | # as merge base, the difference between D and F will include - # B C # C, so the rebased F will contain C surprisingly. If "E" was - # |/ # chosen, the rebased F will contain B. - # A Z - # - # But our merge base candidates (D and E in above case) could still be - # better than the default (ancestor(F, Z) == null). Therefore still - # pick one (so choose p1 above). - if sum(1 for b in bases if b != nullrev) > 1: - unwanted = [None, None] # unwanted[i]: unwanted revs if choose bases[i] - for i, base in enumerate(bases): - if base == nullrev: - continue - # Revisions in the side (not chosen as merge base) branch that - # might contain "surprising" contents - siderevs = list(repo.revs('((%ld-%d) %% (%d+%d))', - bases, base, base, dest)) - - # If those revisions are covered by rebaseset, the result is good. - # A merge in rebaseset would be considered to cover its ancestors. - if siderevs: - rebaseset = [r for r, d in state.items() if d > 0] - merges = [r for r in rebaseset - if cl.parentrevs(r)[1] != nullrev] - unwanted[i] = list(repo.revs('%ld - (::%ld) - %ld', - siderevs, merges, rebaseset)) - - # Choose a merge base that has a minimal number of unwanted revs. - l, i = min((len(revs), i) - for i, revs in enumerate(unwanted) if revs is not None) - base = bases[i] - - # newps[0] should match merge base if possible. Currently, if newps[i] - # is nullrev, the only case is newps[i] and newps[j] (j < i), one is - # the other's ancestor. In that case, it's fine to not swap newps here. - # (see CASE-1 and CASE-2 above) - if i != 0 and newps[i] != nullrev: - newps[0], newps[i] = newps[i], newps[0] - - # The merge will include unwanted revisions. Abort now. Revisit this if - # we have a more advanced merge algorithm that handles multiple bases. - if l > 0: - unwanteddesc = _(' or ').join( - (', '.join('%d:%s' % (r, repo[r]) for r in revs) - for revs in unwanted if revs is not None)) - raise error.Abort( - _('rebasing %d:%s will include unwanted changes from %s') - % (rev, repo[rev], unwanteddesc)) - - repo.ui.debug(" future parents are %d and %d\n" % tuple(newps)) - - return newps[0], newps[1], base + # Note: The base found in this 'proof' is only correct in the specified + # case. This base does not make sense if is not D a descendant of A or B + # or if the other is not parent 'outside' (especially not if the other + # parent has been rebased). The current implementation does not + # make it feasible to consider different cases separately. In these + # other cases we currently just leave it to the user to correctly + # resolve an impossible merge using a wrong ancestor. + # + # xx, p1 could be -4, and both parents could probably be -4... + for p in repo[rev].parents(): + if state.get(p.rev()) == p1: + base = p.rev() + break + else: # fallback when base not found + base = None + + # Raise because this function is called wrong (see issue 4106) + raise AssertionError('no base found to rebase on ' + '(defineparents called wrong)') + return rp1 or p1, p2, base def isagitpatch(repo, patchname): 'Return true if the given patch is in git format' @@ -1317,6 +1265,7 @@ raise error.Abort(_('no matching revisions')) roots.sort() state = dict.fromkeys(rebaseset, revtodo) + detachset = set() emptyrebase = True for root in roots: commonbase = root.ancestor(dest) @@ -1338,6 +1287,47 @@ emptyrebase = False repo.ui.debug('rebase onto %s starting from %s\n' % (dest, root)) + # Rebase tries to turn into a parent of while + # preserving the number of parents of rebased changesets: + # + # - A changeset with a single parent will always be rebased as a + # changeset with a single parent. + # + # - A merge will be rebased as merge unless its parents are both + # ancestors of or are themselves in the rebased set and + # pruned while rebased. + # + # If one parent of is an ancestor of , the rebased + # version of this parent will be . This is always true with + # --base option. + # + # Otherwise, we need to *replace* the original parents with + # . This "detaches" the rebased set from its former location + # and rebases it onto . Changes introduced by ancestors of + # not common with (the detachset, marked as + # nullmerge) are "removed" from the rebased changesets. + # + # - If has a single parent, set it to . + # + # - If is a merge, we cannot decide which parent to + # replace, the rebase operation is not clearly defined. + # + # The table below sums up this behavior: + # + # +------------------+----------------------+-------------------------+ + # | | one parent | merge | + # +------------------+----------------------+-------------------------+ + # | parent in | new parent is | parents in :: are | + # | :: | | remapped to | + # +------------------+----------------------+-------------------------+ + # | unrelated source | new parent is | ambiguous, abort | + # +------------------+----------------------+-------------------------+ + # + # The actual abort is handled by `defineparents` + if len(root.parents()) <= 1: + # ancestors of not ancestors of + detachset.update(repo.changelog.findmissingrevs([commonbase.rev()], + [root.rev()])) if emptyrebase: return None for rev in sorted(state): @@ -1345,21 +1335,23 @@ # if all parents of this revision are done, then so is this revision if parents and all((state.get(p) == p for p in parents)): state[rev] = rev - unfi = repo.unfiltered() + for r in detachset: + if r not in state: + state[r] = nullmerge + if len(roots) > 1: + # If we have multiple roots, we may have "hole" in the rebase set. + # Rebase roots that descend from those "hole" should not be detached as + # other root are. We use the special `revignored` to inform rebase that + # the revision should be ignored but that `defineparents` should search + # a rebase destination that make sense regarding rebased topology. + rebasedomain = set(repo.revs('%ld::%ld', rebaseset, rebaseset)) + for ignored in set(rebasedomain) - set(rebaseset): + state[ignored] = revignored for r in obsoletenotrebased: - desc = _ctxdesc(unfi[r]) - succ = obsoletenotrebased[r] - if succ is None: - msg = _('note: not rebasing %s, it has no successor\n') % desc - del state[r] + if obsoletenotrebased[r] is None: + state[r] = revpruned else: - destctx = unfi[succ] - destdesc = '%d:%s "%s"' % (destctx.rev(), destctx, - destctx.description().split('\n', 1)[0]) - msg = (_('note: not rebasing %s, already in destination as %s\n') - % (desc, destdesc)) - del state[r] - repo.ui.status(msg) + state[r] = revprecursor return originalwd, dest.rev(), state def clearrebased(ui, repo, dest, state, skipped, collapsedas=None): diff -Nru mercurial-4.3.1+207-xenial/hgext/releasenotes.py mercurial-4.3.1/hgext/releasenotes.py --- mercurial-4.3.1+207-xenial/hgext/releasenotes.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/hgext/releasenotes.py 2017-09-10 00:05:18.000000000 +0000 @@ -46,7 +46,6 @@ ] RE_DIRECTIVE = re.compile('^\.\. ([a-zA-Z0-9_]+)::\s*([^$]+)?$') -RE_ISSUE = r'\bissue ?[0-9]{4,6}(?![0-9])\b' BULLET_SECTION = _('Other Changes') @@ -93,8 +92,6 @@ This is used to combine multiple sources of release notes together. """ for section in other: - existingnotes = converttitled(self.titledforsection(section)) + \ - convertnontitled(self.nontitledforsection(section)) for title, paragraphs in other.titledforsection(section): if self.hastitledinsection(section, title): # TODO prompt for resolution if different and running in @@ -103,32 +100,16 @@ (title, section)) continue - incoming_str = converttitled([(title, paragraphs)])[0] - if section == 'fix': - issue = getissuenum(incoming_str) - if issue: - if findissue(ui, existingnotes, issue): - continue - - if similar(ui, existingnotes, incoming_str): - continue - + # TODO perform similarity comparison and try to match against + # existing. self.addtitleditem(section, title, paragraphs) for paragraphs in other.nontitledforsection(section): if paragraphs in self.nontitledforsection(section): continue - incoming_str = convertnontitled([paragraphs])[0] - if section == 'fix': - issue = getissuenum(incoming_str) - if issue: - if findissue(ui, existingnotes, issue): - continue - - if similar(ui, existingnotes, incoming_str): - continue - + # TODO perform similarily comparison and try to match against + # existing. self.addnontitleditem(section, paragraphs) class releasenotessections(object): @@ -155,77 +136,6 @@ return None -def converttitled(titledparagraphs): - """ - Convert titled paragraphs to strings - """ - string_list = [] - for title, paragraphs in titledparagraphs: - lines = [] - for para in paragraphs: - lines.extend(para) - string_list.append(' '.join(lines)) - return string_list - -def convertnontitled(nontitledparagraphs): - """ - Convert non-titled bullets to strings - """ - string_list = [] - for paragraphs in nontitledparagraphs: - lines = [] - for para in paragraphs: - lines.extend(para) - string_list.append(' '.join(lines)) - return string_list - -def getissuenum(incoming_str): - """ - Returns issue number from the incoming string if it exists - """ - issue = re.search(RE_ISSUE, incoming_str, re.IGNORECASE) - if issue: - issue = issue.group() - return issue - -def findissue(ui, existing, issue): - """ - Returns true if issue number already exists in notes. - """ - if any(issue in s for s in existing): - ui.write(_('"%s" already exists in notes; ignoring\n') % issue) - return True - else: - return False - -def similar(ui, existing, incoming_str): - """ - Returns true if similar note found in existing notes. - """ - if len(incoming_str.split()) > 10: - merge = similaritycheck(incoming_str, existing) - if not merge: - ui.write(_('"%s" already exists in notes file; ignoring\n') - % incoming_str) - return True - else: - return False - else: - return False - -def similaritycheck(incoming_str, existingnotes): - """ - Returns true when note fragment can be merged to existing notes. - """ - import fuzzywuzzy.fuzz as fuzz - merge = True - for bullet in existingnotes: - score = fuzz.token_set_ratio(incoming_str, bullet) - if score > 75: - merge = False - break - return merge - def getcustomadmonitions(repo): ctx = repo['.'] p = config.config() @@ -426,7 +336,7 @@ lines.append('') - if lines and lines[-1]: + if lines[-1]: lines.append('') return '\n'.join(lines) diff -Nru mercurial-4.3.1+207-xenial/hgext/sparse.py mercurial-4.3.1/hgext/sparse.py --- mercurial-4.3.1+207-xenial/hgext/sparse.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/hgext/sparse.py 2017-09-10 00:05:18.000000000 +0000 @@ -155,8 +155,7 @@ if include or exclude or enableprofile: def clonesparse(orig, self, node, overwrite, *args, **kwargs): sparse.updateconfig(self.unfiltered(), pat, {}, include=include, - exclude=exclude, enableprofile=enableprofile, - usereporootpaths=True) + exclude=exclude, enableprofile=enableprofile) return orig(self, node, overwrite, *args, **kwargs) extensions.wrapfunction(hg, 'updaterepo', clonesparse) return orig(ui, repo, *args, **opts) diff -Nru mercurial-4.3.1+207-xenial/.hgignore mercurial-4.3.1/.hgignore --- mercurial-4.3.1+207-xenial/.hgignore 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/.hgignore 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -syntax: glob - -*.elc -*.tmp -*.orig -*.rej -*~ -*.mergebackup -*.o -*.so -*.dll -*.exe -*.pyd -*.pyc -*.pyo -*$py.class -*.swp -*.prof -*.zip -\#*\# -.\#* -tests/.coverage* -tests/.testtimes* -tests/.hypothesis -tests/hypothesis-generated -tests/annotated -tests/*.err -tests/htmlcov -build -contrib/chg/chg -contrib/hgsh/hgsh -contrib/vagrant/.vagrant -contrib/docker/debian-* -contrib/docker/ubuntu-* -dist -packages -doc/common.txt -doc/*.[0-9] -doc/*.[0-9].txt -doc/*.[0-9].gendoc.txt -doc/*.[0-9].{x,ht}ml -MANIFEST -MANIFEST.in -patches -mercurial/__modulepolicy__.py -mercurial/__version__.py -mercurial/hgpythonlib.h -mercurial.egg-info -.DS_Store -tags -cscope.* -.idea/* -.asv/* -i18n/hg.pot -locale/*/LC_MESSAGES/hg.mo -hgext/__index__.py - -# Generated wheels -wheelhouse/ - -syntax: regexp -^\.pc/ -^\.(pydev)?project - -# hackable windows distribution additions -^hg-python -^hg.py$ diff -Nru mercurial-4.3.1+207-xenial/.hgsigs mercurial-4.3.1/.hgsigs --- mercurial-4.3.1+207-xenial/.hgsigs 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/.hgsigs 1970-01-01 00:00:00.000000000 +0000 @@ -1,152 +0,0 @@ -35fb62a3a673d5322f6274a44ba6456e5e4b3b37 0 iD8DBQBEYmO2ywK+sNU5EO8RAnaYAKCO7x15xUn5mnhqWNXqk/ehlhRt2QCfRDfY0LrUq2q4oK/KypuJYPHgq1A= -2be3001847cb18a23c403439d9e7d0ace30804e9 0 iD8DBQBExUbjywK+sNU5EO8RAhzxAKCtyHAQUzcTSZTqlfJ0by6vhREwWQCghaQFHfkfN0l9/40EowNhuMOKnJk= -36a957364b1b89c150f2d0e60a99befe0ee08bd3 0 iD8DBQBFfL2QywK+sNU5EO8RAjYFAKCoGlaWRTeMsjdmxAjUYx6diZxOBwCfY6IpBYsKvPTwB3oktnPt5Rmrlys= -27230c29bfec36d5540fbe1c976810aefecfd1d2 0 iD8DBQBFheweywK+sNU5EO8RAt7VAKCrqJQWT2/uo2RWf0ZI4bLp6v82jACgjrMdsaTbxRsypcmEsdPhlG6/8F4= -fb4b6d5fe100b0886f8bc3d6731ec0e5ed5c4694 0 iD8DBQBGgHicywK+sNU5EO8RAgNxAJ0VG8ixAaeudx4sZbhngI1syu49HQCeNUJQfWBgA8bkJ2pvsFpNxwYaX3I= -23889160905a1b09fffe1c07378e9fc1827606eb 0 iD8DBQBHGTzoywK+sNU5EO8RAr/UAJ0Y8s4jQtzgS+G9vM8z6CWBThZ8fwCcCT5XDj2XwxKkz/0s6UELwjsO3LU= -bae2e9c838e90a393bae3973a7850280413e091a 0 iD8DBQBH6DO5ywK+sNU5EO8RAsfrAJ0e4r9c9GF/MJsM7Xjd3NesLRC3+ACffj6+6HXdZf8cswAoFPO+DY00oD0= -d5cbbe2c49cee22a9fbeb9ea41daa0ac4e26b846 0 iD8DBQBINdwsywK+sNU5EO8RAjIUAKCPmlFJSpsPAAUKF+iNHAwVnwmzeQCdEXrL27CWclXuUKdbQC8De7LICtE= -d2375bbee6d47e62ba8e415c86e83a465dc4dce9 0 iD8DBQBIo1wpywK+sNU5EO8RAmRNAJ94x3OFt6blbqu/yBoypm/AJ44fuACfUaldXcV5z9tht97hSp22DVTEPGc= -2a67430f92f15ea5159c26b09ec4839a0c549a26 0 iEYEABECAAYFAkk1hykACgkQywK+sNU5EO85QACeNJNUanjc2tl4wUoPHNuv+lSj0ZMAoIm93wSTc/feyYnO2YCaQ1iyd9Nu -3773e510d433969e277b1863c317b674cbee2065 0 iEYEABECAAYFAklNbbAACgkQywK+sNU5EO8o+gCfeb2/lfIJZMvyDA1m+G1CsBAxfFsAoIa6iAMG8SBY7hW1Q85Yf/LXEvaE -11a4eb81fb4f4742451591489e2797dc47903277 0 iEYEABECAAYFAklcAnsACgkQywK+sNU5EO+uXwCbBVHNNsLy1g7BlAyQJwadYVyHOXoAoKvtAVO71+bv7EbVoukwTzT+P4Sx -11efa41037e280d08cfb07c09ad485df30fb0ea8 0 iEYEABECAAYFAkmvJRQACgkQywK+sNU5EO9XZwCeLMgDgPSMWMm6vgjL4lDs2pEc5+0AnRxfiFbpbBfuEFTqKz9nbzeyoBlx -02981000012e3adf40c4849bd7b3d5618f9ce82d 0 iEYEABECAAYFAknEH3wACgkQywK+sNU5EO+uXwCeI+LbLMmhjU1lKSfU3UWJHjjUC7oAoIZLvYDGOL/tNZFUuatc3RnZ2eje -196d40e7c885fa6e95f89134809b3ec7bdbca34b 0 iEYEABECAAYFAkpL2X4ACgkQywK+sNU5EO9FOwCfXJycjyKJXsvQqKkHrglwOQhEKS4An36GfKzptfN8b1qNc3+ya/5c2WOM -3ef6c14a1e8e83a31226f5881b7fe6095bbfa6f6 0 iEYEABECAAYFAkpopLIACgkQywK+sNU5EO8QSgCfZ0ztsd071rOa2lhmp9Fyue/WoI0AoLTei80/xrhRlB8L/rZEf2KBl8dA -31ec469f9b556f11819937cf68ee53f2be927ebf 0 iEYEABECAAYFAksBuxAACgkQywK+sNU5EO+mBwCfagB+A0txzWZ6dRpug3LEoK7Z1QsAoKpbk8vsLjv6/oRDicSk/qBu33+m -439d7ea6fe3aa4ab9ec274a68846779153789de9 0 iEYEABECAAYFAksVw0kACgkQywK+sNU5EO/oZwCfdfBEkgp38xq6wN2F4nj+SzofrJIAnjmxt04vaJSeOOeHylHvk6lzuQsw -296a0b14a68621f6990c54fdba0083f6f20935bf 0 iEYEABECAAYFAks+jCoACgkQywK+sNU5EO9J8wCeMUGF9E/gS2UBsqIz56WS4HMPRPUAoI5J95mwEIK8Clrl7qFRidNI6APq -4aa619c4c2c09907034d9824ebb1dd0e878206eb 0 iEYEABECAAYFAktm9IsACgkQywK+sNU5EO9XGgCgk4HclRQhexEtooPE5GcUCdB6M8EAn2ptOhMVbIoO+JncA+tNACPFXh0O -ff2704a8ded37fbebd8b6eb5ec733731d725da8a 0 iEYEABECAAYFAkuRoSQACgkQywK+sNU5EO//3QCeJDc5r2uFyFCtAlpSA27DEE5rrxAAn2FSwTy9fhrB3QAdDQlwkEZcQzDh -2b01dab594167bc0dd33331dbaa6dca3dca1b3aa 0 iEYEABECAAYFAku1IwIACgkQywK+sNU5EO9MjgCdHLVwkTZlNHxhcznZKBL1rjN+J7cAoLLWi9LTL6f/TgBaPSKOy1ublbaW -39f725929f0c48c5fb3b90c071fc3066012456ca 0 iEYEABECAAYFAkvclvsACgkQywK+sNU5EO9FSwCeL9i5x8ALW/LE5+lCX6MFEAe4MhwAn1ev5o6SX6GrNdDfKweiemfO2VBk -fdcf80f26604f233dc4d8f0a5ef9d7470e317e8a 0 iEYEABECAAYFAkvsKTkACgkQywK+sNU5EO9qEACgiSiRGvTG2vXGJ65tUSOIYihTuFAAnRzRIqEVSw8M8/RGeUXRps0IzaCO -24fe2629c6fd0c74c90bd066e77387c2b02e8437 0 iEYEABECAAYFAkwFLRsACgkQywK+sNU5EO+pJACgp13tPI+pbwKZV+LeMjcQ4H6tCZYAoJebzhd6a8yYx6qiwpJxA9BXZNXy -f786fc4b8764cd2a5526d259cf2f94d8a66924d9 0 iEYEABECAAYFAkwsyxcACgkQywK+sNU5EO+crACfUpNAF57PmClkSri9nJcBjb2goN4AniPCNaKvnki7TnUsi1u2oxltpKKL -bf1774d95bde614af3956d92b20e2a0c68c5fec7 0 iEYEABECAAYFAkxVwccACgkQywK+sNU5EO+oFQCeJzwZ+we1fIIyBGCddHceOUAN++cAnjvT6A8ZWW0zV21NXIFF1qQmjxJd -c00f03a4982e467fb6b6bd45908767db6df4771d 0 iEYEABECAAYFAkxXDqsACgkQywK+sNU5EO/GJACfT9Rz4hZOxPQEs91JwtmfjevO84gAmwSmtfo5mmWSm8gtTUebCcdTv0Kf -ff5cec76b1c5b6be9c3bb923aae8c3c6d079d6b9 0 iD8DBQBMdo+qywK+sNU5EO8RAqQpAJ975BL2CCAiWMz9SXthNQ9xG181IwCgp4O+KViHPkufZVFn2aTKMNvcr1A= -93d8bff78c96fe7e33237b257558ee97290048a4 0 iD8DBQBMpfvdywK+sNU5EO8RAsxVAJ0UaL1XB51C76JUBhafc9GBefuMxwCdEWkTOzwvE0SarJBe9i008jhbqW4= -333421b9e0f96c7bc788e5667c146a58a9440a55 0 iD8DBQBMz0HOywK+sNU5EO8RAlsEAJ0USh6yOG7OrWkADGunVt9QimBQnwCbBqeMnKgSbwEw8jZwE3Iz1mdrYlo= -4438875ec01bd0fc32be92b0872eb6daeed4d44f 0 iD8DBQBM4WYUywK+sNU5EO8RAhCVAJ0dJswachwFAHALmk1x0RJehxzqPQCbBNskP9n/X689jB+btNTZTyKU/fw= -6aff4f144ad356311318b0011df0bb21f2c97429 0 iD8DBQBM9uxXywK+sNU5EO8RAv+4AKCDj4qKP16GdPaq1tP6BUwpM/M1OACfRyzLPp/qiiN8xJTWoWYSe/XjJug= -e3bf16703e2601de99e563cdb3a5d50b64e6d320 0 iD8DBQBNH8WqywK+sNU5EO8RAiQTAJ9sBO+TeiGro4si77VVaQaA6jcRUgCfSA28dBbjj0oFoQwvPoZjANiZBH8= -a6c855c32ea081da3c3b8ff628f1847ff271482f 0 iD8DBQBNSJJ+ywK+sNU5EO8RAoJaAKCweDEF70fu+r1Zn7pYDXdlk5RuSgCeO9gK/eit8Lin/1n3pO7aYguFLok= -2b2155623ee2559caf288fd333f30475966c4525 0 iD8DBQBNSJeBywK+sNU5EO8RAm1KAJ4hW9Cm9nHaaGJguchBaPLlAr+O3wCgqgmMok8bdAS06N6PL60PSTM//Gg= -2616325766e3504c8ae7c84bd15ee610901fe91d 0 iD8DBQBNbWy9ywK+sNU5EO8RAlWCAJ4mW8HbzjJj9GpK98muX7k+7EvEHwCfaTLbC/DH3QEsZBhEP+M8tzL6RU4= -aa1f3be38ab127280761889d2dca906ca465b5f4 0 iD8DBQBNeQq7ywK+sNU5EO8RAlEOAJ4tlEDdetE9lKfjGgjbkcR8PrC3egCfXCfF3qNVvU/2YYjpgvRwevjvDy0= -b032bec2c0a651ca0ddecb65714bfe6770f67d70 0 iD8DBQBNlg5kywK+sNU5EO8RAnGEAJ9gmEx6MfaR4XcG2m/93vwtfyzs3gCgltzx8/YdHPwqDwRX/WbpYgi33is= -3cb1e95676ad089596bd81d0937cad37d6e3b7fb 0 iD8DBQBNvTy4ywK+sNU5EO8RAmp8AJ9QnxK4jTJ7G722MyeBxf0UXEdGwACgtlM7BKtNQfbEH/fOW5y+45W88VI= -733af5d9f6b22387913e1d11350fb8cb7c1487dd 0 iD8DBQBN5q/8ywK+sNU5EO8RArRGAKCNGT94GKIYtSuwZ57z1sQbcw6uLACfffpbMV4NAPMl8womAwg+7ZPKnIU= -de9eb6b1da4fc522b1cab16d86ca166204c24f25 0 iD8DBQBODhfhywK+sNU5EO8RAr2+AJ4ugbAj8ae8/K0bYZzx3sascIAg1QCeK3b+zbbVVqd3b7CDpwFnaX8kTd4= -4a43e23b8c55b4566b8200bf69fe2158485a2634 0 iD8DBQBONzIMywK+sNU5EO8RAj5SAJ0aPS3+JHnyI6bHB2Fl0LImbDmagwCdGbDLp1S7TFobxXudOH49bX45Iik= -d629f1e89021103f1753addcef6b310e4435b184 0 iD8DBQBOWAsBywK+sNU5EO8RAht4AJwJl9oNFopuGkj5m8aKuf7bqPkoAQCeNrEm7UhFsZKYT5iUOjnMV7s2LaM= -351a9292e430e35766c552066ed3e87c557b803b 0 iD8DBQBOh3zUywK+sNU5EO8RApFMAKCD3Y/u3avDFndznwqfG5UeTHMlvACfUivPIVQZyDZnhZMq0UhC6zhCEQg= -384082750f2c51dc917d85a7145748330fa6ef4d 0 iD8DBQBOmd+OywK+sNU5EO8RAgDgAJ9V/X+G7VLwhTpHrZNiOHabzSyzYQCdE2kKfIevJUYB9QLAWCWP6DPwrwI= -41453d55b481ddfcc1dacb445179649e24ca861d 0 iD8DBQBOsFhpywK+sNU5EO8RAqM6AKCyfxUae3/zLuiLdQz+JR78690eMACfQ6JTBQib4AbE+rUDdkeFYg9K/+4= -195dbd1cef0c2f9f8bcf4ea303238105f716bda3 0 iD8DBQBO1/fWywK+sNU5EO8RAmoPAKCR5lpv1D6JLURHD8KVLSV4GRVEBgCgnd0Sy78ligNfqAMafmACRDvj7vo= -6344043924497cd06d781d9014c66802285072e4 0 iD8DBQBPALgmywK+sNU5EO8RAlfhAJ9nYOdWnhfVDHYtDTJAyJtXBAQS9wCgnefoSQt7QABkbGxM+Q85UYEBuD0= -db33555eafeaf9df1e18950e29439eaa706d399b 0 iD8DBQBPGdzxywK+sNU5EO8RAppkAJ9jOXhUVE/97CPgiMA0pMGiIYnesQCfengAszcBiSiKGugiI8Okc9ghU+Y= -2aa5b51f310fb3befd26bed99c02267f5c12c734 0 iD8DBQBPKZ9bywK+sNU5EO8RAt1TAJ45r1eJ0YqSkInzrrayg4TVCh0SnQCgm0GA/Ua74jnnDwVQ60lAwROuz1Q= -53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 0 iD8DBQBPT/fvywK+sNU5EO8RAnfYAKCn7d0vwqIb100YfWm1F7nFD5B+FACeM02YHpQLSNsztrBCObtqcnfod7Q= -b9bd95e61b49c221c4cca24e6da7c946fc02f992 0 iD8DBQBPeLsIywK+sNU5EO8RAvpNAKCtKe2gitz8dYn52IRF0hFOPCR7AQCfRJL/RWCFweu2T1vH/mUOCf8SXXc= -d9e2f09d5488c395ae9ddbb320ceacd24757e055 0 iD8DBQBPju/dywK+sNU5EO8RArBYAJ9xtifdbk+hCOJO8OZa4JfHX8OYZQCeKPMBaBWiT8N/WHoOm1XU0q+iono= -00182b3d087909e3c3ae44761efecdde8f319ef3 0 iD8DBQBPoFhIywK+sNU5EO8RAhzhAKCBj1n2jxPTkZNJJ5pSp3soa+XHIgCgsZZpAQxOpXwCp0eCdNGe0+pmxmg= -5983de86462c5a9f42a3ad0f5e90ce5b1d221d25 0 iD8DBQBPovNWywK+sNU5EO8RAhgiAJ980T91FdPTRMmVONDhpkMsZwVIMACgg3bKvoWSeuCW28llUhAJtUjrMv0= -85a358df5bbbe404ca25730c9c459b34263441dc 0 iD8DBQBPyZsWywK+sNU5EO8RAnpLAJ48qrGDJRT+pteS0mSQ11haqHstPwCdG4ccGbk+0JHb7aNy8/NRGAOqn9w= -b013baa3898e117959984fc64c29d8c784d2f28b 0 iD8DBQBP8QOPywK+sNU5EO8RAqimAKCFRSx0lvG6y8vne2IhNG062Hn0dACeMLI5/zhpWpHBIVeAAquYfx2XFeA= -7f5094bb3f423fc799e471aac2aee81a7ce57a0b 0 iD8DBQBQGiL8ywK+sNU5EO8RAq5oAJ4rMMCPx6O+OuzNXVOexogedWz/QgCeIiIxLd76I4pXO48tdXhr0hQcBuM= -072209ae4ddb654eb2d5fd35bff358c738414432 0 iD8DBQBQQkq0ywK+sNU5EO8RArDTAJ9nk5CySnNAjAXYvqvx4uWCw9ThZwCgqmFRehH/l+oTwj3f8nw8u8qTCdc= -b3f0f9a39c4e1d0250048cd803ab03542d6f140a 0 iD8DBQBQamltywK+sNU5EO8RAlsqAJ4qF/m6aFu4mJCOKTiAP5RvZFK02ACfawYShUZO6OXEFfveU0aAxDR0M1k= -d118a4f4fd16d9b558ec3f3e87bfee772861d2b7 0 iD8DBQBQgPV5ywK+sNU5EO8RArylAJ0abcx5NlDjyv3ZDWpAfRIHyRsJtQCgn4TMuEayqgxzrvadQZHdTEU2g38= -195ad823b5d58c68903a6153a25e3fb4ed25239d 0 iD8DBQBQkuT9ywK+sNU5EO8RAhB4AKCeerItoK2Jipm2cVf4euGofAa/WACeJj3TVd4pFILpb+ogj7ebweFLJi0= -0c10cf8191469e7c3c8844922e17e71a176cb7cb 0 iD8DBQBQvQWoywK+sNU5EO8RAnq3AJoCn98u4geFx5YaQaeh99gFhCd7bQCgjoBwBSUyOvGd0yBy60E3Vv3VZhM= -a4765077b65e6ae29ba42bab7834717b5072d5ba 0 iD8DBQBQ486sywK+sNU5EO8RAhmJAJ90aLfLKZhmcZN7kqphigQJxiFOQACeJ5IUZxjGKH4xzi3MrgIcx9n+dB0= -f5fbe15ca7449f2c9a3cf817c86d0ae68b307214 0 iD8DBQBQ+yuYywK+sNU5EO8RAm9JAJoD/UciWvpGeKBcpGtZJBFJVcL/HACghDXSgQ+xQDjB+6uGrdgAQsRR1Lg= -a6088c05e43a8aee0472ca3a4f6f8d7dd914ebbf 0 iD8DBQBRDDROywK+sNU5EO8RAh75AJ9uJCGoCWnP0Lv/+XuYs4hvUl+sAgCcD36QgAnuw8IQXrvv684BAXAnHcA= -7511d4df752e61fe7ae4f3682e0a0008573b0402 0 iD8DBQBRFYaoywK+sNU5EO8RAuErAJoDyhXn+lptU3+AevVdwAIeNFyR2gCdHzPHyWd+JDeWCUR+pSOBi8O2ppM= -5b7175377babacce80a6c1e12366d8032a6d4340 0 iD8DBQBRMCYgywK+sNU5EO8RAq1/AKCWKlt9ysibyQgYwoxxIOZv5J8rpwCcDSHQaaf1fFZUTnQsOePwcM2Y/Sg= -50c922c1b5145dab8baefefb0437d363b6a6c21c 0 iD8DBQBRWnUnywK+sNU5EO8RAuQRAJwM42cJqJPeqJ0jVNdMqKMDqr4dSACeP0cRVGz1gitMuV0x8f3mrZrqc7I= -8a7bd2dccd44ed571afe7424cd7f95594f27c092 0 iD8DBQBRXfBvywK+sNU5EO8RAn+LAKCsMmflbuXjYRxlzFwId5ptm8TZcwCdGkyLbZcASBOkzQUm/WW1qfknJHU= -292cd385856d98bacb2c3086f8897bc660c2beea 0 iD8DBQBRcM0BywK+sNU5EO8RAjp4AKCJBykQbvXhKuvLSMxKx3a2TBiXcACfbr/kLg5GlZTF/XDPmY+PyHgI/GM= -23f785b38af38d2fca6b8f3db56b8007a84cd73a 0 iD8DBQBRgZwNywK+sNU5EO8RAmO4AJ4u2ILGuimRP6MJgE2t65LZ5dAdkACgiENEstIdrlFC80p+sWKD81kKIYI= -ddc7a6be20212d18f3e27d9d7e6f079a66d96f21 0 iD8DBQBRkswvywK+sNU5EO8RAiYYAJsHTHyHbJeAgmGvBTmDrfcKu4doUgCeLm7eGBjx7yAPUvEtxef8rAkQmXI= -cceaf7af4c9e9e6fa2dbfdcfe9856c5da69c4ffd 0 iD8DBQBRqnFLywK+sNU5EO8RAsWNAJ9RR6t+y1DLFc2HeH0eN9VfZAKF9gCeJ8ezvhtKq/LMs0/nvcgKQc/d5jk= -009794acc6e37a650f0fae37872e733382ac1c0c 0 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 diff -Nru mercurial-4.3.1+207-xenial/.hgtags mercurial-4.3.1/.hgtags --- mercurial-4.3.1+207-xenial/.hgtags 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/.hgtags 1970-01-01 00:00:00.000000000 +0000 @@ -1,165 +0,0 @@ -d40cc5aacc31ed673d9b5b24f98bee78c283062c 0.4f -1c590d34bf61e2ea12c71738e5a746cd74586157 0.4e -7eca4cfa8aad5fce9a04f7d8acadcd0452e2f34e 0.4d -b4d0c3786ad3e47beacf8412157326a32b6d25a4 0.4c -f40273b0ad7b3a6d3012fd37736d0611f41ecf54 0.5 -0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 0.5b -12e0fdbc57a0be78f0e817fd1d170a3615cd35da 0.6 -4ccf3de52989b14c3d84e1097f59e39a992e00bd 0.6b -eac9c8efcd9bd8244e72fb6821f769f450457a32 0.6c -979c049974485125e1f9357f6bbe9c1b548a64c3 0.7 -3a56574f329a368d645853e0f9e09472aee62349 0.8 -6a03cff2b0f5d30281e6addefe96b993582f2eac 0.8.1 -35fb62a3a673d5322f6274a44ba6456e5e4b3b37 0.9 -2be3001847cb18a23c403439d9e7d0ace30804e9 0.9.1 -36a957364b1b89c150f2d0e60a99befe0ee08bd3 0.9.2 -27230c29bfec36d5540fbe1c976810aefecfd1d2 0.9.3 -fb4b6d5fe100b0886f8bc3d6731ec0e5ed5c4694 0.9.4 -23889160905a1b09fffe1c07378e9fc1827606eb 0.9.5 -bae2e9c838e90a393bae3973a7850280413e091a 1.0 -d5cbbe2c49cee22a9fbeb9ea41daa0ac4e26b846 1.0.1 -d2375bbee6d47e62ba8e415c86e83a465dc4dce9 1.0.2 -2a67430f92f15ea5159c26b09ec4839a0c549a26 1.1 -3773e510d433969e277b1863c317b674cbee2065 1.1.1 -11a4eb81fb4f4742451591489e2797dc47903277 1.1.2 -11efa41037e280d08cfb07c09ad485df30fb0ea8 1.2 -02981000012e3adf40c4849bd7b3d5618f9ce82d 1.2.1 -196d40e7c885fa6e95f89134809b3ec7bdbca34b 1.3 -3ef6c14a1e8e83a31226f5881b7fe6095bbfa6f6 1.3.1 -31ec469f9b556f11819937cf68ee53f2be927ebf 1.4 -439d7ea6fe3aa4ab9ec274a68846779153789de9 1.4.1 -296a0b14a68621f6990c54fdba0083f6f20935bf 1.4.2 -4aa619c4c2c09907034d9824ebb1dd0e878206eb 1.4.3 -ff2704a8ded37fbebd8b6eb5ec733731d725da8a 1.5 -2b01dab594167bc0dd33331dbaa6dca3dca1b3aa 1.5.1 -39f725929f0c48c5fb3b90c071fc3066012456ca 1.5.2 -fdcf80f26604f233dc4d8f0a5ef9d7470e317e8a 1.5.3 -24fe2629c6fd0c74c90bd066e77387c2b02e8437 1.5.4 -f786fc4b8764cd2a5526d259cf2f94d8a66924d9 1.6 -bf1774d95bde614af3956d92b20e2a0c68c5fec7 1.6.1 -c00f03a4982e467fb6b6bd45908767db6df4771d 1.6.2 -ff5cec76b1c5b6be9c3bb923aae8c3c6d079d6b9 1.6.3 -93d8bff78c96fe7e33237b257558ee97290048a4 1.6.4 -333421b9e0f96c7bc788e5667c146a58a9440a55 1.7 -4438875ec01bd0fc32be92b0872eb6daeed4d44f 1.7.1 -6aff4f144ad356311318b0011df0bb21f2c97429 1.7.2 -e3bf16703e2601de99e563cdb3a5d50b64e6d320 1.7.3 -a6c855c32ea081da3c3b8ff628f1847ff271482f 1.7.4 -2b2155623ee2559caf288fd333f30475966c4525 1.7.5 -2616325766e3504c8ae7c84bd15ee610901fe91d 1.8 -aa1f3be38ab127280761889d2dca906ca465b5f4 1.8.1 -b032bec2c0a651ca0ddecb65714bfe6770f67d70 1.8.2 -3cb1e95676ad089596bd81d0937cad37d6e3b7fb 1.8.3 -733af5d9f6b22387913e1d11350fb8cb7c1487dd 1.8.4 -de9eb6b1da4fc522b1cab16d86ca166204c24f25 1.9 -4a43e23b8c55b4566b8200bf69fe2158485a2634 1.9.1 -d629f1e89021103f1753addcef6b310e4435b184 1.9.2 -351a9292e430e35766c552066ed3e87c557b803b 1.9.3 -384082750f2c51dc917d85a7145748330fa6ef4d 2.0-rc -41453d55b481ddfcc1dacb445179649e24ca861d 2.0 -195dbd1cef0c2f9f8bcf4ea303238105f716bda3 2.0.1 -6344043924497cd06d781d9014c66802285072e4 2.0.2 -db33555eafeaf9df1e18950e29439eaa706d399b 2.1-rc -2aa5b51f310fb3befd26bed99c02267f5c12c734 2.1 -53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 2.1.1 -b9bd95e61b49c221c4cca24e6da7c946fc02f992 2.1.2 -d9e2f09d5488c395ae9ddbb320ceacd24757e055 2.2-rc -00182b3d087909e3c3ae44761efecdde8f319ef3 2.2 -5983de86462c5a9f42a3ad0f5e90ce5b1d221d25 2.2.1 -85a358df5bbbe404ca25730c9c459b34263441dc 2.2.2 -b013baa3898e117959984fc64c29d8c784d2f28b 2.2.3 -a06e2681dd1786e2354d84a5fa9c1c88dd4fa3e0 2.3-rc -7f5094bb3f423fc799e471aac2aee81a7ce57a0b 2.3 -072209ae4ddb654eb2d5fd35bff358c738414432 2.3.1 -b3f0f9a39c4e1d0250048cd803ab03542d6f140a 2.3.2 -d118a4f4fd16d9b558ec3f3e87bfee772861d2b7 2.4-rc -195ad823b5d58c68903a6153a25e3fb4ed25239d 2.4 -0c10cf8191469e7c3c8844922e17e71a176cb7cb 2.4.1 -a4765077b65e6ae29ba42bab7834717b5072d5ba 2.4.2 -f5fbe15ca7449f2c9a3cf817c86d0ae68b307214 2.5-rc -a6088c05e43a8aee0472ca3a4f6f8d7dd914ebbf 2.5 -7511d4df752e61fe7ae4f3682e0a0008573b0402 2.5.1 -5b7175377babacce80a6c1e12366d8032a6d4340 2.5.2 -50c922c1b5145dab8baefefb0437d363b6a6c21c 2.5.3 -8a7bd2dccd44ed571afe7424cd7f95594f27c092 2.5.4 -292cd385856d98bacb2c3086f8897bc660c2beea 2.6-rc -23f785b38af38d2fca6b8f3db56b8007a84cd73a 2.6 -ddc7a6be20212d18f3e27d9d7e6f079a66d96f21 2.6.1 -cceaf7af4c9e9e6fa2dbfdcfe9856c5da69c4ffd 2.6.2 -009794acc6e37a650f0fae37872e733382ac1c0c 2.6.3 -f0d7721d7322dcfb5af33599c2543f27335334bb 2.7-rc -f37b5a17e6a0ee17afde2cdde5393dd74715fb58 2.7 -335a558f81dc73afeab4d7be63617392b130117f 2.7.1 -e7fa36d2ad3a7944a52dca126458d6f482db3524 2.7.2 -1596f2d8f2421314b1ddead8f7d0c91009358994 2.8-rc -d825e4025e39d1c39db943cdc89818abd0a87c27 2.8 -209e04a06467e2969c0cc6501335be0406d46ef0 2.8.1 -ca387377df7a3a67dbb90b6336b781cdadc3ef41 2.8.2 -8862469e16f9236208581b20de5f96bd13cc039d 2.9-rc -3cec5134e9c4bceab6a00c60f52a4f80677a78f2 2.9 -b96cb15ec9e04d8ac5ee08b34fcbbe4200588965 2.9.1 -3f83fc5cfe715d292069ee8417c83804f6c6c1e4 2.9.2 -564f55b251224f16508dd1311452db7780dafe2b 3.0-rc -2195ac506c6ababe86985b932f4948837c0891b5 3.0 -269c80ee5b3cb3684fa8edc61501b3506d02eb10 3.0.1 -2d8cd3d0e83c7336c0cb45a9f88638363f993848 3.0.2 -6c36dc6cd61a0e1b563f1d51e55bdf4dacf12162 3.1-rc -3178e49892020336491cdc6945885c4de26ffa8b 3.1 -5dc91146f35369949ea56b40172308158b59063a 3.1.1 -f768c888aaa68d12dd7f509dcc7f01c9584357d0 3.1.2 -7f8d16af8cae246fa5a48e723d48d58b015aed94 3.2-rc -ced632394371a36953ce4d394f86278ae51a2aae 3.2 -643c58303fb0ec020907af28b9e486be299ba043 3.2.1 -902554884335e5ca3661d63be9978eb4aec3f68a 3.2.2 -6dad422ecc5adb63d9fa649eeb8e05a5f9bc4900 3.2.3 -1265a3a71d75396f5d4cf6935ae7d9ba5407a547 3.2.4 -db8e3f7948b1fdeb9ad12d448fc3525759908b9f 3.3-rc -fbdd5195528fae4f41feebc1838215c110b25d6a 3.3 -5b4ed033390bf6e2879c8f5c28c84e1ee3b87231 3.3.1 -07a92bbd02e5e3a625e0820389b47786b02b2cea 3.3.2 -2e2e9a0750f91a6fe0ad88e4de34f8efefdcab08 3.3.3 -e89f909edffad558b56f4affa8239e4832f88de0 3.4-rc -8cc6036bca532e06681c5a8fa37efaa812de67b5 3.4 -ed18f4acf435a2824c6f49fba40f42b9df5da7ad 3.4.1 -540cd0ddac49c1125b2e013aa2ff18ecbd4dd954 3.4.2 -96a38d44ba093bd1d1ecfd34119e94056030278b 3.5-rc -21aa1c313b05b1a85f8ffa1120d51579ddf6bf24 3.5 -1a45e49a6bed023deb229102a8903234d18054d3 3.5.1 -9a466b9f9792e3ad7ae3fc6c43c3ff2e136b718d 3.5.2 -b66e3ca0b90c3095ea28dfd39aa24247bebf5c20 3.6-rc -47dd34f2e7272be9e3b2a5a83cd0d20be44293f4 3.6 -1aa5083cbebbe7575c88f3402ab377539b484897 3.6.1 -2d437a0f3355834a9485bbbeb30a52a052c98f19 3.6.2 -ea389970c08449440587712117f178d33bab3f1e 3.6.3 -158bdc8965720ca4061f8f8d806563cfc7cdb62e 3.7-rc -2408645de650d8a29a6ce9e7dce601d8dd0d1474 3.7 -b698abf971e7377d9b7ec7fc8c52df45255b0329 3.7.1 -d493d64757eb45ada99fcb3693e479a51b7782da 3.7.2 -ae279d4a19e9683214cbd1fe8298cf0b50571432 3.7.3 -740156eedf2c450aee58b1a90b0e826f47c5da64 3.8-rc -f85de28eae32e7d3064b1a1321309071bbaaa069 3.8 -a56296f55a5e1038ea5016dace2076b693c28a56 3.8.1 -aaabed77791a75968a12b8c43ad263631a23ee81 3.8.2 -a9764ab80e11bcf6a37255db7dd079011f767c6c 3.8.3 -26a5d605b8683a292bb89aea11f37a81b06ac016 3.8.4 -519bb4f9d3a47a6e83c2b414d58811ed38f503c2 3.9-rc -299546f84e68dbb9bd026f0f3a974ce4bdb93686 3.9 -ccd436f7db6d5d7b9af89715179b911d031d44f1 3.9.1 -149433e68974eb5c63ccb03f794d8b57339a80c4 3.9.2 -438173c415874f6ac653efc1099dec9c9150e90f 4.0-rc -eab27446995210c334c3d06f1a659e3b9b5da769 4.0 -b3b1ae98f6a0e14c1e1ba806a6c18e193b6dae5c 4.0.1 -e69874dc1f4e142746ff3df91e678a09c6fc208c 4.0.2 -a1dd2c0c479e0550040542e392e87bc91262517e 4.1-rc -e1526da1e6d84e03146151c9b6e6950fe9a83d7d 4.1 -25703b624d27e3917d978af56d6ad59331e0464a 4.1.1 -ed5b25874d998ababb181a939dd37a16ea644435 4.1.2 -77eaf9539499a1b8be259ffe7ada787d07857f80 4.1.3 -616e788321cc4ae9975b7f0c54c849f36d82182b 4.2-rc -bb96d4a497432722623ae60d9bc734a1e360179e 4.2 -c850f0ed54c1d42f9aa079ad528f8127e5775217 4.2.1 -26c49ed51a698ec016d2b4c6b44ca3c3f73cc788 4.2.2 -857876ebaed4e315f63157bd157d6ce553c7ab73 4.3-rc -5544af8622863796a0027566f6b646e10d522c4c 4.3 -943c91326b23954e6e1c6960d0239511f9530258 4.2.3 -3fee7f7d2da04226914c2258cc2884dc27384fd7 4.3.1 diff -Nru mercurial-4.3.1+207-xenial/i18n/check-translation.py mercurial-4.3.1/i18n/check-translation.py --- mercurial-4.3.1+207-xenial/i18n/check-translation.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/i18n/check-translation.py 2017-09-10 00:05:18.000000000 +0000 @@ -51,7 +51,7 @@ ... msgstr='prompt missing &sep$$missing amp$$followed by none&') >>> match(promptchoice, pe) True - >>> for e in promptchoice(pe): print(e) + >>> for e in promptchoice(pe): print e number of choices differs between msgid and msgstr msgstr has invalid choice missing '&' msgstr has invalid '&' followed by none @@ -88,19 +88,19 @@ ... msgstr= 'something (DEPRECATED)') >>> match(deprecated, pe) True - >>> for e in deprecated(pe): print(e) + >>> for e in deprecated(pe): print e >>> pe = polib.POEntry( ... msgid = 'Something (DEPRECATED)', ... msgstr= 'something (DETACERPED)') >>> match(deprecated, pe) True - >>> for e in deprecated(pe): print(e) + >>> for e in deprecated(pe): print e >>> pe = polib.POEntry( ... msgid = 'Something (DEPRECATED)', ... msgstr= 'something') >>> match(deprecated, pe) True - >>> for e in deprecated(pe): print(e) + >>> for e in deprecated(pe): print e msgstr inconsistently translated (DEPRECATED) >>> pe = polib.POEntry( ... msgid = 'Something (DEPRECATED, foo bar)', @@ -124,16 +124,16 @@ >>> pe = polib.POEntry( ... msgid ='ends with ::', ... msgstr='ends with ::') - >>> for e in taildoublecolons(pe): print(e) + >>> for e in taildoublecolons(pe): print e >>> pe = polib.POEntry( ... msgid ='ends with ::', ... msgstr='ends without double-colons') - >>> for e in taildoublecolons(pe): print(e) + >>> for e in taildoublecolons(pe): print e tail '::'-ness differs between msgid and msgstr >>> pe = polib.POEntry( ... msgid ='ends without double-colons', ... msgstr='ends with ::') - >>> for e in taildoublecolons(pe): print(e) + >>> for e in taildoublecolons(pe): print e tail '::'-ness differs between msgid and msgstr """ if pe.msgid.endswith('::') != pe.msgstr.endswith('::'): @@ -149,7 +149,7 @@ >>> pe = polib.POEntry( ... msgid =' indented text', ... msgstr=' narrowed indentation') - >>> for e in indentation(pe): print(e) + >>> for e in indentation(pe): print e initial indentation width differs betweeen msgid and msgstr """ idindent = len(pe.msgid) - len(pe.msgid.lstrip()) diff -Nru mercurial-4.3.1+207-xenial/i18n/hggettext mercurial-4.3.1/i18n/hggettext --- mercurial-4.3.1+207-xenial/i18n/hggettext 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/i18n/hggettext 2017-09-10 00:05:18.000000000 +0000 @@ -24,7 +24,6 @@ import inspect import os -import re import sys @@ -61,15 +60,9 @@ 'msgid %s\n' % normalize(s) + 'msgstr ""\n') -doctestre = re.compile(r'^ +>>> ', re.MULTILINE) def offset(src, doc, name, default): """Compute offset or issue a warning on stdout.""" - # remove doctest part, in order to avoid backslash mismatching - m = doctestre.search(doc) - if m: - doc = doc[:m.start()] - # Backslashes in doc appear doubled in src. end = src.find(doc.replace('\\', '\\\\')) if end == -1: @@ -103,7 +96,7 @@ only extract docstrings from functions mentioned in these tables. """ mod = importpath(path) - if not path.startswith('mercurial/') and mod.__doc__: + if mod.__doc__: src = open(path).read() lineno = 1 + offset(src, mod.__doc__, path, 7) print(poentry(path, lineno, mod.__doc__)) @@ -119,8 +112,6 @@ for func, rstrip in functions: if func.__doc__: - docobj = func # this might be a proxy to provide formatted doc - func = getattr(func, '_origfunc', func) funcmod = inspect.getmodule(func) extra = '' if funcmod.__package__ == funcmod.__name__: @@ -130,15 +121,10 @@ src = inspect.getsource(func) name = "%s.%s" % (actualpath, func.__name__) lineno = inspect.getsourcelines(func)[1] - doc = docobj.__doc__ - origdoc = getattr(docobj, '_origdoc', '') + doc = func.__doc__ if rstrip: doc = doc.rstrip() - origdoc = origdoc.rstrip() - if origdoc: - lineno += offset(src, origdoc, name, 1) - else: - lineno += offset(src, doc, name, 1) + lineno += offset(src, doc, name, 1) print(poentry(actualpath, lineno, doc)) diff -Nru mercurial-4.3.1+207-xenial/Makefile mercurial-4.3.1/Makefile --- mercurial-4.3.1+207-xenial/Makefile 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/Makefile 2017-09-10 00:05:18.000000000 +0000 @@ -132,7 +132,6 @@ mercurial/templater.py \ mercurial/filemerge.py \ mercurial/hgweb/webcommands.py \ - mercurial/util.py \ $(DOCFILES) > i18n/hg.pot.tmp # All strings marked for translation in Mercurial contain # ASCII characters only. But some files contain string @@ -187,7 +186,7 @@ PREFIX=/usr/local \ clean install mkdir -p $${OUTPUTDIR:-dist} - HGVER=$$(python contrib/genosxversion.py $(OSXVERSIONFLAGS) build/mercurial/Library/Python/2.7/site-packages/mercurial/__version__.py) && \ + HGVER=$(shell python contrib/genosxversion.py $(OSXVERSIONFLAGS) build/mercurial/Library/Python/2.7/site-packages/mercurial/__version__.py ) && \ OSXVER=$$(sw_vers -productVersion | cut -d. -f1,2) && \ pkgbuild --filter \\.DS_Store --root build/mercurial/ \ --identifier org.mercurial-scm.mercurial \ diff -Nru mercurial-4.3.1+207-xenial/mercurial/branchmap.py mercurial-4.3.1/mercurial/branchmap.py --- mercurial-4.3.1+207-xenial/mercurial/branchmap.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/branchmap.py 2017-09-10 00:05:18.000000000 +0000 @@ -406,8 +406,7 @@ # fast path: extract data from cache, use it if node is matching reponode = changelog.node(rev)[:_rbcnodelen] - cachenode, branchidx = unpack_from( - _rbcrecfmt, util.buffer(self._rbcrevs), rbcrevidx) + cachenode, branchidx = unpack_from(_rbcrecfmt, self._rbcrevs, rbcrevidx) close = bool(branchidx & _rbccloseflag) if close: branchidx &= _rbcbranchidxmask diff -Nru mercurial-4.3.1+207-xenial/mercurial/bundle2.py mercurial-4.3.1/mercurial/bundle2.py --- mercurial-4.3.1+207-xenial/mercurial/bundle2.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/bundle2.py 2017-09-10 00:05:18.000000000 +0000 @@ -145,7 +145,7 @@ preserve. """ -from __future__ import absolute_import, division +from __future__ import absolute_import import errno import re @@ -296,31 +296,9 @@ self.repo = repo self.ui = repo.ui self.records = unbundlerecords() + self.gettransaction = transactiongetter self.reply = None self.captureoutput = captureoutput - self.hookargs = {} - self._gettransaction = transactiongetter - - def gettransaction(self): - transaction = self._gettransaction() - - if self.hookargs: - # the ones added to the transaction supercede those added - # to the operation. - self.hookargs.update(transaction.hookargs) - transaction.hookargs = self.hookargs - - # mark the hookargs as flushed. further attempts to add to - # hookargs will result in an abort. - self.hookargs = None - - return transaction - - def addhookargs(self, hookargs): - if self.hookargs is None: - raise error.ProgrammingError('attempted to add hookargs to ' - 'operation after transaction started') - self.hookargs.update(hookargs) class TransactionUnavailable(RuntimeError): pass @@ -372,7 +350,7 @@ msg = ['bundle2-input-bundle:'] if unbundler.params: msg.append(' %i params' % len(unbundler.params)) - if op._gettransaction is None or op._gettransaction is _notransaction: + if op.gettransaction is None or op.gettransaction is _notransaction: msg.append(' no-transaction') else: msg.append(' with-transaction') @@ -490,8 +468,7 @@ if output: outpart = op.reply.newpart('output', data=output, mandatory=False) - outpart.addparam( - 'in-reply-to', pycompat.bytestr(part.id), mandatory=False) + outpart.addparam('in-reply-to', str(part.id), mandatory=False) # If exiting or interrupted, do not attempt to seek the stream in the # finally block below. This makes abort faster. except (SystemExit, KeyboardInterrupt): @@ -999,7 +976,7 @@ parttype = self.type.upper() else: parttype = self.type.lower() - outdebug(ui, 'part %s: "%s"' % (pycompat.bytestr(self.id), parttype)) + outdebug(ui, 'part %s: "%s"' % (self.id, parttype)) ## parttype header = [_pack(_fparttypesize, len(parttype)), parttype, _pack(_fpartid, self.id), @@ -1017,7 +994,7 @@ for key, value in advpar: parsizes.append(len(key)) parsizes.append(len(value)) - paramsizes = _pack(_makefpartparamsizes(len(parsizes) // 2), *parsizes) + paramsizes = _pack(_makefpartparamsizes(len(parsizes) / 2), *parsizes) header.append(paramsizes) # key, value for key, value in manpar: @@ -1044,12 +1021,11 @@ ui.debug('bundle2-generatorexit\n') raise except BaseException as exc: - bexc = util.forcebytestr(exc) # backup exception data for later ui.debug('bundle2-input-stream-interrupt: encoding exception %s' - % bexc) + % exc) tb = sys.exc_info()[2] - msg = 'unexpected error: %s' % bexc + msg = 'unexpected error: %s' % exc interpart = bundlepart('error:abort', [('message', msg)], mandatory=False) interpart.id = 0 @@ -1071,8 +1047,7 @@ Exists to handle the different methods to provide data to a part.""" # we only support fixed size data now. # This will be improved in the future. - if (util.safehasattr(self.data, 'next') - or util.safehasattr(self.data, '__next__')): + if util.safehasattr(self.data, 'next'): buff = util.chunkbuffer(self.data) chunk = buff.read(preferedchunksize) while chunk: @@ -1238,7 +1213,7 @@ self.type = self._fromheader(typesize) indebug(self.ui, 'part type: "%s"' % self.type) self.id = self._unpackheader(_fpartid)[0] - indebug(self.ui, 'part id: "%s"' % pycompat.bytestr(self.id)) + indebug(self.ui, 'part id: "%s"' % self.id) # extract mandatory bit from type self.mandatory = (self.type != self.type.lower()) self.type = self.type.lower() @@ -1250,7 +1225,7 @@ fparamsizes = _makefpartparamsizes(mancount + advcount) paramsizes = self._unpackheader(fparamsizes) # make it a list of couple again - paramsizes = list(zip(paramsizes[::2], paramsizes[1::2])) + paramsizes = zip(paramsizes[::2], paramsizes[1::2]) # split mandatory from advisory mansizes = paramsizes[:mancount] advsizes = paramsizes[mancount:] @@ -1579,8 +1554,7 @@ # This is definitely not the final form of this # return. But one need to start somewhere. part = op.reply.newpart('reply:changegroup', mandatory=False) - part.addparam( - 'in-reply-to', pycompat.bytestr(inpart.id), mandatory=False) + part.addparam('in-reply-to', str(inpart.id), mandatory=False) part.addparam('return', '%i' % ret, mandatory=False) assert not inpart.read() @@ -1643,8 +1617,7 @@ # This is definitely not the final form of this # return. But one need to start somewhere. part = op.reply.newpart('reply:changegroup') - part.addparam( - 'in-reply-to', pycompat.bytestr(inpart.id), mandatory=False) + part.addparam('in-reply-to', str(inpart.id), mandatory=False) part.addparam('return', '%i' % ret, mandatory=False) try: real_part.validate() @@ -1787,8 +1760,7 @@ op.records.add('pushkey', record) if op.reply is not None: rpart = op.reply.newpart('reply:pushkey') - rpart.addparam( - 'in-reply-to', pycompat.bytestr(inpart.id), mandatory=False) + rpart.addparam('in-reply-to', str(inpart.id), mandatory=False) rpart.addparam('return', '%i' % ret, mandatory=False) if inpart.mandatory and not ret: kwargs = {} @@ -1843,8 +1815,7 @@ op.records.add('obsmarkers', {'new': new}) if op.reply is not None: rpart = op.reply.newpart('reply:obsmarkers') - rpart.addparam( - 'in-reply-to', pycompat.bytestr(inpart.id), mandatory=False) + rpart.addparam('in-reply-to', str(inpart.id), mandatory=False) rpart.addparam('new', '%i' % new, mandatory=False) @@ -1878,17 +1849,3 @@ cache.write() op.ui.debug('applied %i hgtags fnodes cache entries\n' % count) - -@parthandler('pushvars') -def bundle2getvars(op, part): - '''unbundle a bundle2 containing shellvars on the server''' - # An option to disable unbundling on server-side for security reasons - if op.ui.configbool('push', 'pushvars.server'): - hookargs = {} - for key, value in part.advisoryparams: - key = key.upper() - # We want pushed variables to have USERVAR_ prepended so we know - # they came from the --pushvar flag. - key = "USERVAR_" + key - hookargs[key] = value - op.addhookargs(hookargs) diff -Nru mercurial-4.3.1+207-xenial/mercurial/cext/charencode.c mercurial-4.3.1/mercurial/cext/charencode.c --- mercurial-4.3.1+207-xenial/mercurial/cext/charencode.c 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/cext/charencode.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,219 +0,0 @@ -/* - charencode.c - miscellaneous character encoding - - Copyright 2008 Matt Mackall and others - - This software may be used and distributed according to the terms of - the GNU General Public License, incorporated herein by reference. -*/ - -#define PY_SSIZE_T_CLEAN -#include - -#include "charencode.h" -#include "util.h" - -#ifdef IS_PY3K -/* The mapping of Python types is meant to be temporary to get Python - * 3 to compile. We should remove this once Python 3 support is fully - * supported and proper types are used in the extensions themselves. */ -#define PyInt_Type PyLong_Type -#define PyInt_AS_LONG PyLong_AS_LONG -#endif - -static const char lowertable[128] = { - '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', - '\x08', '\x09', '\x0a', '\x0b', '\x0c', '\x0d', '\x0e', '\x0f', - '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', - '\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f', - '\x20', '\x21', '\x22', '\x23', '\x24', '\x25', '\x26', '\x27', - '\x28', '\x29', '\x2a', '\x2b', '\x2c', '\x2d', '\x2e', '\x2f', - '\x30', '\x31', '\x32', '\x33', '\x34', '\x35', '\x36', '\x37', - '\x38', '\x39', '\x3a', '\x3b', '\x3c', '\x3d', '\x3e', '\x3f', - '\x40', - '\x61', '\x62', '\x63', '\x64', '\x65', '\x66', '\x67', /* A-G */ - '\x68', '\x69', '\x6a', '\x6b', '\x6c', '\x6d', '\x6e', '\x6f', /* H-O */ - '\x70', '\x71', '\x72', '\x73', '\x74', '\x75', '\x76', '\x77', /* P-W */ - '\x78', '\x79', '\x7a', /* X-Z */ - '\x5b', '\x5c', '\x5d', '\x5e', '\x5f', - '\x60', '\x61', '\x62', '\x63', '\x64', '\x65', '\x66', '\x67', - '\x68', '\x69', '\x6a', '\x6b', '\x6c', '\x6d', '\x6e', '\x6f', - '\x70', '\x71', '\x72', '\x73', '\x74', '\x75', '\x76', '\x77', - '\x78', '\x79', '\x7a', '\x7b', '\x7c', '\x7d', '\x7e', '\x7f' -}; - -static const char uppertable[128] = { - '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', - '\x08', '\x09', '\x0a', '\x0b', '\x0c', '\x0d', '\x0e', '\x0f', - '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', - '\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f', - '\x20', '\x21', '\x22', '\x23', '\x24', '\x25', '\x26', '\x27', - '\x28', '\x29', '\x2a', '\x2b', '\x2c', '\x2d', '\x2e', '\x2f', - '\x30', '\x31', '\x32', '\x33', '\x34', '\x35', '\x36', '\x37', - '\x38', '\x39', '\x3a', '\x3b', '\x3c', '\x3d', '\x3e', '\x3f', - '\x40', '\x41', '\x42', '\x43', '\x44', '\x45', '\x46', '\x47', - '\x48', '\x49', '\x4a', '\x4b', '\x4c', '\x4d', '\x4e', '\x4f', - '\x50', '\x51', '\x52', '\x53', '\x54', '\x55', '\x56', '\x57', - '\x58', '\x59', '\x5a', '\x5b', '\x5c', '\x5d', '\x5e', '\x5f', - '\x60', - '\x41', '\x42', '\x43', '\x44', '\x45', '\x46', '\x47', /* a-g */ - '\x48', '\x49', '\x4a', '\x4b', '\x4c', '\x4d', '\x4e', '\x4f', /* h-o */ - '\x50', '\x51', '\x52', '\x53', '\x54', '\x55', '\x56', '\x57', /* p-w */ - '\x58', '\x59', '\x5a', /* x-z */ - '\x7b', '\x7c', '\x7d', '\x7e', '\x7f' -}; - -/* - * Turn a hex-encoded string into binary. - */ -PyObject *unhexlify(const char *str, Py_ssize_t len) -{ - PyObject *ret; - char *d; - Py_ssize_t i; - - ret = PyBytes_FromStringAndSize(NULL, len / 2); - - if (!ret) - return NULL; - - d = PyBytes_AsString(ret); - - for (i = 0; i < len;) { - int hi = hexdigit(str, i++); - int lo = hexdigit(str, i++); - *d++ = (hi << 4) | lo; - } - - return ret; -} - -static inline PyObject *_asciitransform(PyObject *str_obj, - const char table[128], - PyObject *fallback_fn) -{ - char *str, *newstr; - Py_ssize_t i, len; - PyObject *newobj = NULL; - PyObject *ret = NULL; - - str = PyBytes_AS_STRING(str_obj); - len = PyBytes_GET_SIZE(str_obj); - - newobj = PyBytes_FromStringAndSize(NULL, len); - if (!newobj) - goto quit; - - newstr = PyBytes_AS_STRING(newobj); - - for (i = 0; i < len; i++) { - char c = str[i]; - if (c & 0x80) { - if (fallback_fn != NULL) { - ret = PyObject_CallFunctionObjArgs(fallback_fn, - str_obj, NULL); - } else { - PyObject *err = PyUnicodeDecodeError_Create( - "ascii", str, len, i, (i + 1), - "unexpected code byte"); - PyErr_SetObject(PyExc_UnicodeDecodeError, err); - Py_XDECREF(err); - } - goto quit; - } - newstr[i] = table[(unsigned char)c]; - } - - ret = newobj; - Py_INCREF(ret); -quit: - Py_XDECREF(newobj); - return ret; -} - -PyObject *asciilower(PyObject *self, PyObject *args) -{ - PyObject *str_obj; - if (!PyArg_ParseTuple(args, "O!:asciilower", &PyBytes_Type, &str_obj)) - return NULL; - return _asciitransform(str_obj, lowertable, NULL); -} - -PyObject *asciiupper(PyObject *self, PyObject *args) -{ - PyObject *str_obj; - if (!PyArg_ParseTuple(args, "O!:asciiupper", &PyBytes_Type, &str_obj)) - return NULL; - return _asciitransform(str_obj, uppertable, NULL); -} - -PyObject *make_file_foldmap(PyObject *self, PyObject *args) -{ - PyObject *dmap, *spec_obj, *normcase_fallback; - PyObject *file_foldmap = NULL; - enum normcase_spec spec; - PyObject *k, *v; - dirstateTupleObject *tuple; - Py_ssize_t pos = 0; - const char *table; - - if (!PyArg_ParseTuple(args, "O!O!O!:make_file_foldmap", - &PyDict_Type, &dmap, - &PyInt_Type, &spec_obj, - &PyFunction_Type, &normcase_fallback)) - goto quit; - - spec = (int)PyInt_AS_LONG(spec_obj); - switch (spec) { - case NORMCASE_LOWER: - table = lowertable; - break; - case NORMCASE_UPPER: - table = uppertable; - break; - case NORMCASE_OTHER: - table = NULL; - break; - default: - PyErr_SetString(PyExc_TypeError, "invalid normcasespec"); - goto quit; - } - - /* Add some more entries to deal with additions outside this - function. */ - file_foldmap = _dict_new_presized((PyDict_Size(dmap) / 10) * 11); - if (file_foldmap == NULL) - goto quit; - - while (PyDict_Next(dmap, &pos, &k, &v)) { - if (!dirstate_tuple_check(v)) { - PyErr_SetString(PyExc_TypeError, - "expected a dirstate tuple"); - goto quit; - } - - tuple = (dirstateTupleObject *)v; - if (tuple->state != 'r') { - PyObject *normed; - if (table != NULL) { - normed = _asciitransform(k, table, - normcase_fallback); - } else { - normed = PyObject_CallFunctionObjArgs( - normcase_fallback, k, NULL); - } - - if (normed == NULL) - goto quit; - if (PyDict_SetItem(file_foldmap, normed, k) == -1) { - Py_DECREF(normed); - goto quit; - } - Py_DECREF(normed); - } - } - return file_foldmap; -quit: - Py_XDECREF(file_foldmap); - return NULL; -} diff -Nru mercurial-4.3.1+207-xenial/mercurial/cext/charencode.h mercurial-4.3.1/mercurial/cext/charencode.h --- mercurial-4.3.1+207-xenial/mercurial/cext/charencode.h 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/cext/charencode.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -/* - charencode.h - miscellaneous character encoding - - This software may be used and distributed according to the terms of - the GNU General Public License, incorporated herein by reference. -*/ - -#ifndef _HG_CHARENCODE_H_ -#define _HG_CHARENCODE_H_ - -#include -#include "compat.h" - -/* This should be kept in sync with normcasespecs in encoding.py. */ -enum normcase_spec { - NORMCASE_LOWER = -1, - NORMCASE_UPPER = 1, - NORMCASE_OTHER = 0 -}; - -PyObject *unhexlify(const char *str, Py_ssize_t len); -PyObject *asciilower(PyObject *self, PyObject *args); -PyObject *asciiupper(PyObject *self, PyObject *args); -PyObject *make_file_foldmap(PyObject *self, PyObject *args); - -static const int8_t hextable[256] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /* 0-9 */ - -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* A-F */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* a-f */ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 -}; - -static inline int hexdigit(const char *p, Py_ssize_t off) -{ - int8_t val = hextable[(unsigned char)p[off]]; - - if (val >= 0) { - return val; - } - - PyErr_SetString(PyExc_ValueError, "input contains non-hex character"); - return 0; -} - -#endif /* _HG_CHARENCODE_H_ */ diff -Nru mercurial-4.3.1+207-xenial/mercurial/cext/manifest.c mercurial-4.3.1/mercurial/cext/manifest.c --- mercurial-4.3.1+207-xenial/mercurial/cext/manifest.c 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/cext/manifest.c 2017-09-10 00:05:18.000000000 +0000 @@ -12,7 +12,6 @@ #include #include -#include "charencode.h" #include "util.h" #define DEFAULT_LINES 100000 @@ -39,6 +38,9 @@ #define MANIFEST_NOT_SORTED -2 #define MANIFEST_MALFORMED -3 +/* defined in parsers.c */ +PyObject *unhexlify(const char *str, int len); + /* get the length of the path for a line */ static size_t pathlen(line *l) { return strlen(l->start); diff -Nru mercurial-4.3.1+207-xenial/mercurial/cext/parsers.c mercurial-4.3.1/mercurial/cext/parsers.c --- mercurial-4.3.1+207-xenial/mercurial/cext/parsers.c 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/cext/parsers.c 2017-09-10 00:05:18.000000000 +0000 @@ -12,7 +12,6 @@ #include #include -#include "charencode.h" #include "util.h" #include "bitmanipulation.h" @@ -20,14 +19,154 @@ /* The mapping of Python types is meant to be temporary to get Python * 3 to compile. We should remove this once Python 3 support is fully * supported and proper types are used in the extensions themselves. */ +#define PyInt_Type PyLong_Type #define PyInt_Check PyLong_Check #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSsize_t PyLong_FromSsize_t +#define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsLong PyLong_AsLong #endif static const char *const versionerrortext = "Python minor version mismatch"; +static const char lowertable[128] = { + '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', + '\x08', '\x09', '\x0a', '\x0b', '\x0c', '\x0d', '\x0e', '\x0f', + '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', + '\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f', + '\x20', '\x21', '\x22', '\x23', '\x24', '\x25', '\x26', '\x27', + '\x28', '\x29', '\x2a', '\x2b', '\x2c', '\x2d', '\x2e', '\x2f', + '\x30', '\x31', '\x32', '\x33', '\x34', '\x35', '\x36', '\x37', + '\x38', '\x39', '\x3a', '\x3b', '\x3c', '\x3d', '\x3e', '\x3f', + '\x40', + '\x61', '\x62', '\x63', '\x64', '\x65', '\x66', '\x67', /* A-G */ + '\x68', '\x69', '\x6a', '\x6b', '\x6c', '\x6d', '\x6e', '\x6f', /* H-O */ + '\x70', '\x71', '\x72', '\x73', '\x74', '\x75', '\x76', '\x77', /* P-W */ + '\x78', '\x79', '\x7a', /* X-Z */ + '\x5b', '\x5c', '\x5d', '\x5e', '\x5f', + '\x60', '\x61', '\x62', '\x63', '\x64', '\x65', '\x66', '\x67', + '\x68', '\x69', '\x6a', '\x6b', '\x6c', '\x6d', '\x6e', '\x6f', + '\x70', '\x71', '\x72', '\x73', '\x74', '\x75', '\x76', '\x77', + '\x78', '\x79', '\x7a', '\x7b', '\x7c', '\x7d', '\x7e', '\x7f' +}; + +static const char uppertable[128] = { + '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', + '\x08', '\x09', '\x0a', '\x0b', '\x0c', '\x0d', '\x0e', '\x0f', + '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', + '\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f', + '\x20', '\x21', '\x22', '\x23', '\x24', '\x25', '\x26', '\x27', + '\x28', '\x29', '\x2a', '\x2b', '\x2c', '\x2d', '\x2e', '\x2f', + '\x30', '\x31', '\x32', '\x33', '\x34', '\x35', '\x36', '\x37', + '\x38', '\x39', '\x3a', '\x3b', '\x3c', '\x3d', '\x3e', '\x3f', + '\x40', '\x41', '\x42', '\x43', '\x44', '\x45', '\x46', '\x47', + '\x48', '\x49', '\x4a', '\x4b', '\x4c', '\x4d', '\x4e', '\x4f', + '\x50', '\x51', '\x52', '\x53', '\x54', '\x55', '\x56', '\x57', + '\x58', '\x59', '\x5a', '\x5b', '\x5c', '\x5d', '\x5e', '\x5f', + '\x60', + '\x41', '\x42', '\x43', '\x44', '\x45', '\x46', '\x47', /* a-g */ + '\x48', '\x49', '\x4a', '\x4b', '\x4c', '\x4d', '\x4e', '\x4f', /* h-o */ + '\x50', '\x51', '\x52', '\x53', '\x54', '\x55', '\x56', '\x57', /* p-w */ + '\x58', '\x59', '\x5a', /* x-z */ + '\x7b', '\x7c', '\x7d', '\x7e', '\x7f' +}; + +/* + * Turn a hex-encoded string into binary. + */ +PyObject *unhexlify(const char *str, int len) +{ + PyObject *ret; + char *d; + int i; + + ret = PyBytes_FromStringAndSize(NULL, len / 2); + + if (!ret) + return NULL; + + d = PyBytes_AsString(ret); + + for (i = 0; i < len;) { + int hi = hexdigit(str, i++); + int lo = hexdigit(str, i++); + *d++ = (hi << 4) | lo; + } + + return ret; +} + +static inline PyObject *_asciitransform(PyObject *str_obj, + const char table[128], + PyObject *fallback_fn) +{ + char *str, *newstr; + Py_ssize_t i, len; + PyObject *newobj = NULL; + PyObject *ret = NULL; + + str = PyBytes_AS_STRING(str_obj); + len = PyBytes_GET_SIZE(str_obj); + + newobj = PyBytes_FromStringAndSize(NULL, len); + if (!newobj) + goto quit; + + newstr = PyBytes_AS_STRING(newobj); + + for (i = 0; i < len; i++) { + char c = str[i]; + if (c & 0x80) { + if (fallback_fn != NULL) { + ret = PyObject_CallFunctionObjArgs(fallback_fn, + str_obj, NULL); + } else { + PyObject *err = PyUnicodeDecodeError_Create( + "ascii", str, len, i, (i + 1), + "unexpected code byte"); + PyErr_SetObject(PyExc_UnicodeDecodeError, err); + Py_XDECREF(err); + } + goto quit; + } + newstr[i] = table[(unsigned char)c]; + } + + ret = newobj; + Py_INCREF(ret); +quit: + Py_XDECREF(newobj); + return ret; +} + +static PyObject *asciilower(PyObject *self, PyObject *args) +{ + PyObject *str_obj; + if (!PyArg_ParseTuple(args, "O!:asciilower", &PyBytes_Type, &str_obj)) + return NULL; + return _asciitransform(str_obj, lowertable, NULL); +} + +static PyObject *asciiupper(PyObject *self, PyObject *args) +{ + PyObject *str_obj; + if (!PyArg_ParseTuple(args, "O!:asciiupper", &PyBytes_Type, &str_obj)) + return NULL; + return _asciitransform(str_obj, uppertable, NULL); +} + +static inline PyObject *_dict_new_presized(Py_ssize_t expected_size) +{ + /* _PyDict_NewPresized expects a minused parameter, but it actually + creates a dictionary that's the nearest power of two bigger than the + parameter. For example, with the initial minused = 1000, the + dictionary created has size 1024. Of course in a lot of cases that + can be greater than the maximum load factor Python's dict object + expects (= 2/3), so as soon as we cross the threshold we'll resize + anyway. So create a dictionary that's at least 3/2 the size. */ + return _PyDict_NewPresized(((1 + expected_size) / 2) * 3); +} + static PyObject *dict_new_presized(PyObject *self, PyObject *args) { Py_ssize_t expected_size; @@ -38,6 +177,77 @@ return _dict_new_presized(expected_size); } +static PyObject *make_file_foldmap(PyObject *self, PyObject *args) +{ + PyObject *dmap, *spec_obj, *normcase_fallback; + PyObject *file_foldmap = NULL; + enum normcase_spec spec; + PyObject *k, *v; + dirstateTupleObject *tuple; + Py_ssize_t pos = 0; + const char *table; + + if (!PyArg_ParseTuple(args, "O!O!O!:make_file_foldmap", + &PyDict_Type, &dmap, + &PyInt_Type, &spec_obj, + &PyFunction_Type, &normcase_fallback)) + goto quit; + + spec = (int)PyInt_AS_LONG(spec_obj); + switch (spec) { + case NORMCASE_LOWER: + table = lowertable; + break; + case NORMCASE_UPPER: + table = uppertable; + break; + case NORMCASE_OTHER: + table = NULL; + break; + default: + PyErr_SetString(PyExc_TypeError, "invalid normcasespec"); + goto quit; + } + + /* Add some more entries to deal with additions outside this + function. */ + file_foldmap = _dict_new_presized((PyDict_Size(dmap) / 10) * 11); + if (file_foldmap == NULL) + goto quit; + + while (PyDict_Next(dmap, &pos, &k, &v)) { + if (!dirstate_tuple_check(v)) { + PyErr_SetString(PyExc_TypeError, + "expected a dirstate tuple"); + goto quit; + } + + tuple = (dirstateTupleObject *)v; + if (tuple->state != 'r') { + PyObject *normed; + if (table != NULL) { + normed = _asciitransform(k, table, + normcase_fallback); + } else { + normed = PyObject_CallFunctionObjArgs( + normcase_fallback, k, NULL); + } + + if (normed == NULL) + goto quit; + if (PyDict_SetItem(file_foldmap, normed, k) == -1) { + Py_DECREF(normed); + goto quit; + } + Py_DECREF(normed); + } + } + return file_foldmap; +quit: + Py_XDECREF(file_foldmap); + return NULL; +} + /* * This code assumes that a manifest is stitched together with newline * ('\n') characters. @@ -83,7 +293,7 @@ nlen = newline - zero - 1; - node = unhexlify(zero + 1, nlen > 40 ? 40 : (Py_ssize_t)nlen); + node = unhexlify(zero + 1, nlen > 40 ? 40 : (int)nlen); if (!node) goto bail; diff -Nru mercurial-4.3.1+207-xenial/mercurial/cext/revlog.c mercurial-4.3.1/mercurial/cext/revlog.c --- mercurial-4.3.1+207-xenial/mercurial/cext/revlog.c 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/cext/revlog.c 2017-09-10 00:05:18.000000000 +0000 @@ -13,7 +13,6 @@ #include #include -#include "charencode.h" #include "util.h" #include "bitmanipulation.h" diff -Nru mercurial-4.3.1+207-xenial/mercurial/cext/util.h mercurial-4.3.1/mercurial/cext/util.h --- mercurial-4.3.1+207-xenial/mercurial/cext/util.h 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/cext/util.h 2017-09-10 00:05:18.000000000 +0000 @@ -25,6 +25,13 @@ extern PyTypeObject dirstateTupleType; #define dirstate_tuple_check(op) (Py_TYPE(op) == &dirstateTupleType) +/* This should be kept in sync with normcasespecs in encoding.py. */ +enum normcase_spec { + NORMCASE_LOWER = -1, + NORMCASE_UPPER = 1, + NORMCASE_OTHER = 0 +}; + #define MIN(a, b) (((a)<(b))?(a):(b)) /* VC9 doesn't include bool and lacks stdbool.h based on my searching */ #if defined(_MSC_VER) || __STDC_VERSION__ < 199901L @@ -35,16 +42,35 @@ #include #endif -static inline PyObject *_dict_new_presized(Py_ssize_t expected_size) +static const int8_t hextable[256] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /* 0-9 */ + -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* A-F */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* a-f */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 +}; + +static inline int hexdigit(const char *p, Py_ssize_t off) { - /* _PyDict_NewPresized expects a minused parameter, but it actually - creates a dictionary that's the nearest power of two bigger than the - parameter. For example, with the initial minused = 1000, the - dictionary created has size 1024. Of course in a lot of cases that - can be greater than the maximum load factor Python's dict object - expects (= 2/3), so as soon as we cross the threshold we'll resize - anyway. So create a dictionary that's at least 3/2 the size. */ - return _PyDict_NewPresized(((1 + expected_size) / 2) * 3); + int8_t val = hextable[(unsigned char)p[off]]; + + if (val >= 0) { + return val; + } + + PyErr_SetString(PyExc_ValueError, "input contains non-hex character"); + return 0; } #endif /* _HG_UTIL_H_ */ diff -Nru mercurial-4.3.1+207-xenial/mercurial/cffi/base85.py mercurial-4.3.1/mercurial/cffi/base85.py --- mercurial-4.3.1+207-xenial/mercurial/cffi/base85.py 1970-01-01 00:00:00.000000000 +0000 +++ mercurial-4.3.1/mercurial/cffi/base85.py 2017-09-10 00:05:18.000000000 +0000 @@ -0,0 +1,10 @@ +# base85.py: pure python base85 codec +# +# Copyright (C) 2009 Brendan Cully +# +# 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 ..pure.base85 import * diff -Nru mercurial-4.3.1+207-xenial/mercurial/cffi/diffhelpers.py mercurial-4.3.1/mercurial/cffi/diffhelpers.py --- mercurial-4.3.1+207-xenial/mercurial/cffi/diffhelpers.py 1970-01-01 00:00:00.000000000 +0000 +++ mercurial-4.3.1/mercurial/cffi/diffhelpers.py 2017-09-10 00:05:18.000000000 +0000 @@ -0,0 +1,10 @@ +# diffhelpers.py - pure Python implementation of diffhelpers.c +# +# Copyright 2009 Matt Mackall 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 ..pure.diffhelpers import * diff -Nru mercurial-4.3.1+207-xenial/mercurial/cffi/parsers.py mercurial-4.3.1/mercurial/cffi/parsers.py --- mercurial-4.3.1+207-xenial/mercurial/cffi/parsers.py 1970-01-01 00:00:00.000000000 +0000 +++ mercurial-4.3.1/mercurial/cffi/parsers.py 2017-09-10 00:05:18.000000000 +0000 @@ -0,0 +1,10 @@ +# parsers.py - Python implementation of parsers.c +# +# Copyright 2009 Matt Mackall 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 ..pure.parsers import * diff -Nru mercurial-4.3.1+207-xenial/mercurial/changegroup.py mercurial-4.3.1/mercurial/changegroup.py --- mercurial-4.3.1+207-xenial/mercurial/changegroup.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/changegroup.py 2017-09-10 00:05:18.000000000 +0000 @@ -266,8 +266,7 @@ # in this function. srctype = tr.hookargs.setdefault('source', srctype) url = tr.hookargs.setdefault('url', url) - repo.hook('prechangegroup', - throw=True, **pycompat.strkwargs(tr.hookargs)) + repo.hook('prechangegroup', throw=True, **tr.hookargs) # write changelog data to temp files so concurrent readers # will not see an inconsistent view @@ -354,8 +353,7 @@ hookargs = dict(tr.hookargs) hookargs['node'] = hex(cl.node(clstart)) hookargs['node_last'] = hex(cl.node(clend - 1)) - repo.hook('pretxnchangegroup', - throw=True, **pycompat.strkwargs(hookargs)) + repo.hook('pretxnchangegroup', throw=True, **hookargs) added = [cl.node(r) for r in xrange(clstart, clend)] phaseall = None @@ -390,13 +388,13 @@ if clstart >= len(repo): return - repo.hook("changegroup", **pycompat.strkwargs(hookargs)) + repo.hook("changegroup", **hookargs) for n in added: args = hookargs.copy() args['node'] = hex(n) del args['node_last'] - repo.hook("incoming", **pycompat.strkwargs(args)) + repo.hook("incoming", **args) newheads = [h for h in repo.heads() if h not in oldheads] diff -Nru mercurial-4.3.1+207-xenial/mercurial/chgserver.py mercurial-4.3.1/mercurial/chgserver.py --- mercurial-4.3.1+207-xenial/mercurial/chgserver.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/chgserver.py 2017-09-10 00:05:18.000000000 +0000 @@ -565,11 +565,8 @@ self._hashstate, self._baseaddress) def chgunixservice(ui, repo, opts): - # CHGINTERNALMARK is set by chg client. It is an indication of things are - # started by chg so other code can do things accordingly, like disabling - # demandimport or detecting chg client started by chg client. When executed - # here, CHGINTERNALMARK is no longer useful and hence dropped to make - # environ cleaner. + # CHGINTERNALMARK is temporarily set by chg client to detect if chg will + # start another chg. drop it to avoid possible side effects. if 'CHGINTERNALMARK' in encoding.environ: del encoding.environ['CHGINTERNALMARK'] diff -Nru mercurial-4.3.1+207-xenial/mercurial/cmdutil.py mercurial-4.3.1/mercurial/cmdutil.py --- mercurial-4.3.1+207-xenial/mercurial/cmdutil.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/cmdutil.py 2017-09-10 00:05:18.000000000 +0000 @@ -467,12 +467,12 @@ return True def isignoreddir(localpath): - """Return True if `localpath` directory is ignored or contains only - ignored files and should hence be considered ignored. + """ + This function checks whether the directory contains only ignored files + and hence should the directory be considered ignored. Returns True, if + that should be ignored otherwise False. """ dirpath = os.path.join(root, localpath) - if ignorefn(dirpath): - return True for f in os.listdir(dirpath): filepath = os.path.join(dirpath, f) if os.path.isdir(filepath): @@ -573,111 +573,6 @@ return finalrs -def _commentlines(raw): - '''Surround lineswith a comment char and a new line''' - lines = raw.splitlines() - commentedlines = ['# %s' % line for line in lines] - return '\n'.join(commentedlines) + '\n' - -def _conflictsmsg(repo): - # avoid merge cycle - from . import merge as mergemod - mergestate = mergemod.mergestate.read(repo) - if not mergestate.active(): - return - - m = scmutil.match(repo[None]) - unresolvedlist = [f for f in mergestate if m(f) and mergestate[f] == 'u'] - if unresolvedlist: - mergeliststr = '\n'.join( - [' %s' % os.path.relpath( - os.path.join(repo.root, path), - pycompat.getcwd()) for path in unresolvedlist]) - msg = _('''Unresolved merge conflicts: - -%s - -To mark files as resolved: hg resolve --mark FILE''') % mergeliststr - else: - msg = _('No unresolved merge conflicts.') - - return _commentlines(msg) - -def _helpmessage(continuecmd, abortcmd): - msg = _('To continue: %s\n' - 'To abort: %s') % (continuecmd, abortcmd) - return _commentlines(msg) - -def _rebasemsg(): - return _helpmessage('hg rebase --continue', 'hg rebase --abort') - -def _histeditmsg(): - return _helpmessage('hg histedit --continue', 'hg histedit --abort') - -def _unshelvemsg(): - return _helpmessage('hg unshelve --continue', 'hg unshelve --abort') - -def _updatecleanmsg(dest=None): - warning = _('warning: this will discard uncommitted changes') - return 'hg update --clean %s (%s)' % (dest or '.', warning) - -def _graftmsg(): - # tweakdefaults requires `update` to have a rev hence the `.` - return _helpmessage('hg graft --continue', _updatecleanmsg()) - -def _mergemsg(): - # tweakdefaults requires `update` to have a rev hence the `.` - return _helpmessage('hg commit', _updatecleanmsg()) - -def _bisectmsg(): - msg = _('To mark the changeset good: hg bisect --good\n' - 'To mark the changeset bad: hg bisect --bad\n' - 'To abort: hg bisect --reset\n') - return _commentlines(msg) - -def fileexistspredicate(filename): - return lambda repo: repo.vfs.exists(filename) - -def _mergepredicate(repo): - return len(repo[None].parents()) > 1 - -STATES = ( - # (state, predicate to detect states, helpful message function) - ('histedit', fileexistspredicate('histedit-state'), _histeditmsg), - ('bisect', fileexistspredicate('bisect.state'), _bisectmsg), - ('graft', fileexistspredicate('graftstate'), _graftmsg), - ('unshelve', fileexistspredicate('unshelverebasestate'), _unshelvemsg), - ('rebase', fileexistspredicate('rebasestate'), _rebasemsg), - # The merge state is part of a list that will be iterated over. - # They need to be last because some of the other unfinished states may also - # be in a merge or update state (eg. rebase, histedit, graft, etc). - # We want those to have priority. - ('merge', _mergepredicate, _mergemsg), -) - -def _getrepostate(repo): - # experimental config: commands.status.skipstates - skip = set(repo.ui.configlist('commands', 'status.skipstates')) - for state, statedetectionpredicate, msgfn in STATES: - if state in skip: - continue - if statedetectionpredicate(repo): - return (state, statedetectionpredicate, msgfn) - -def morestatus(repo, fm): - statetuple = _getrepostate(repo) - label = 'status.morestatus' - if statetuple: - fm.startitem() - state, statedetectionpredicate, helpfulmsg = statetuple - statemsg = _('The repository is in an unfinished *%s* state.') % state - fm.write('statemsg', '%s\n', _commentlines(statemsg), label=label) - conmsg = _conflictsmsg(repo) - fm.write('conflictsmsg', '%s\n', conmsg, label=label) - if helpfulmsg: - helpmsg = helpfulmsg() - fm.write('helpmsg', '%s\n', helpmsg, label=label) - def findpossible(cmd, table, strict=False): """ Return cmd -> (aliases, command table entry) @@ -1570,10 +1465,10 @@ labels = ['log.changeset', 'changeset.%s' % ctx.phasestr()] if ctx.obsolete(): labels.append('changeset.obsolete') - if ctx.isunstable(): - labels.append('changeset.unstable') - for instability in ctx.instabilities(): - labels.append('instability.%s' % instability) + if ctx.troubled(): + labels.append('changeset.troubled') + for trouble in ctx.troubles(): + labels.append('trouble.%s' % trouble) return ' '.join(labels) class changeset_printer(object): @@ -1683,11 +1578,10 @@ self.ui.write(_("date: %s\n") % date, label='log.date') - if ctx.isunstable(): + if ctx.troubled(): # i18n: column positioning for "hg log" - instabilities = ctx.instabilities() - self.ui.write(_("instability: %s\n") % ', '.join(instabilities), - label='log.instability') + self.ui.write(_("trouble: %s\n") % ', '.join(ctx.troubles()), + label='log.trouble') self._exthook(ctx) @@ -2019,7 +1913,7 @@ To be used by debug function.""" if index is not None: fm.write('index', '%i ', index) - fm.write('prednode', '%s ', hex(marker.prednode())) + fm.write('precnode', '%s ', hex(marker.precnode())) succs = marker.succnodes() fm.condwrite(succs, 'succnodes', '%s ', fm.formatlist(map(hex, succs), name='node')) @@ -2652,18 +2546,14 @@ revmatchfn = None if filematcher is not None: revmatchfn = filematcher(ctx.rev()) - edges = edgefn(type, char, state, rev, parents) - firstedge = next(edges) - width = firstedge[2] - displayer.show(ctx, copies=copies, matchfn=revmatchfn, - _graphwidth=width) + displayer.show(ctx, copies=copies, matchfn=revmatchfn) lines = displayer.hunk.pop(rev).split('\n') if not lines[-1]: del lines[-1] displayer.flush(ctx) - for type, char, width, coldata in itertools.chain([firstedge], edges): + edges = edgefn(type, char, lines, state, rev, parents) + for type, char, lines, coldata in edges: graphmod.ascii(ui, state, type, char, lines, coldata) - lines = [] displayer.close() def graphlog(ui, repo, pats, opts): @@ -3002,15 +2892,20 @@ dsguard = None # extract addremove carefully -- this function can be called from a command # that doesn't support addremove - if opts.get('addremove'): - dsguard = dirstateguard.dirstateguard(repo, 'commit') - with dsguard or util.nullcontextmanager(): - if dsguard: + try: + if opts.get('addremove'): + dsguard = dirstateguard.dirstateguard(repo, 'commit') if scmutil.addremove(repo, matcher, "", opts) != 0: raise error.Abort( _("failed to mark all new/missing files as added/removed")) - return commitfunc(ui, repo, message, matcher, opts) + r = commitfunc(ui, repo, message, matcher, opts) + if dsguard: + dsguard.close() + return r + finally: + if dsguard: + dsguard.release() def samefile(f, ctx1, ctx2): if f in ctx1.manifest(): diff -Nru mercurial-4.3.1+207-xenial/mercurial/color.py mercurial-4.3.1/mercurial/color.py --- mercurial-4.3.1+207-xenial/mercurial/color.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/color.py 2017-09-10 00:05:18.000000000 +0000 @@ -130,7 +130,7 @@ def loadcolortable(ui, extname, colortable): _defaultstyles.update(colortable) -def _terminfosetup(ui, mode, formatted): +def _terminfosetup(ui, mode): '''Initialize terminfo data and the terminal if we're in terminfo mode.''' # If we failed to load curses, we go ahead and return. @@ -164,8 +164,8 @@ del ui._terminfoparams[key] if not curses.tigetstr('setaf') or not curses.tigetstr('setab'): # Only warn about missing terminfo entries if we explicitly asked for - # terminfo mode and we're in a formatted terminal. - if mode == "terminfo" and formatted: + # terminfo mode. + if mode == "terminfo": ui.warn(_("no terminfo entry for setab/setaf: reverting to " "ECMA-48 color\n")) ui._terminfoparams.clear() @@ -242,7 +242,7 @@ def modewarn(): # only warn if color.mode was explicitly set and we're in # a formatted terminal - if mode == realmode and formatted: + if mode == realmode and ui.formatted(): ui.warn(_('warning: failed to set color mode to %s\n') % mode) if realmode == 'win32': @@ -253,7 +253,7 @@ elif realmode == 'ansi': ui._terminfoparams.clear() elif realmode == 'terminfo': - _terminfosetup(ui, mode, formatted) + _terminfosetup(ui, mode) if not ui._terminfoparams: ## FIXME Shouldn't we return None in this case too? modewarn() diff -Nru mercurial-4.3.1+207-xenial/mercurial/commands.py mercurial-4.3.1/mercurial/commands.py --- mercurial-4.3.1+207-xenial/mercurial/commands.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/commands.py 2017-09-10 00:05:18.000000000 +0000 @@ -1227,7 +1227,7 @@ contentopts = {'cg.version': cgversion} - if repo.ui.configbool('experimental', 'stabilization.bundle-obsmarker'): + if repo.ui.configbool('experimental', 'evolution.bundle-obsmarker'): contentopts['obsolescence'] = True if repo.ui.configbool('experimental', 'bundle-phases'): contentopts['phases'] = True @@ -1644,8 +1644,8 @@ samplehgrc = uimod.samplehgrcs['user'] f = paths[0] - fp = open(f, "wb") - fp.write(util.tonativeeol(samplehgrc)) + fp = open(f, "w") + fp.write(samplehgrc) fp.close() editor = ui.geteditor() @@ -3335,9 +3335,7 @@ revisions. See :hg:`help templates` for more about pre-packaged styles and - specifying custom templates. The default template used by the log - command can be customized via the ``ui.logtemplate`` configuration - setting. + specifying custom templates. Returns 0 on success. @@ -3972,7 +3970,6 @@ ('b', 'branch', [], _('a specific branch you would like to push'), _('BRANCH')), ('', 'new-branch', False, _('allow pushing a new branch')), - ('', 'pushvars', [], _('variables that can be sent to server (ADVANCED)')), ] + remoteopts, _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]')) def push(ui, repo, dest=None, **opts): @@ -4010,25 +4007,6 @@ Please see :hg:`help urls` for important details about ``ssh://`` URLs. If DESTINATION is omitted, a default path will be used. - .. container:: verbose - - The --pushvars option sends strings to the server that become - environment variables prepended with ``HG_USERVAR_``. For example, - ``--pushvars ENABLE_FEATURE=true``, provides the server side hooks with - ``HG_USERVAR_ENABLE_FEATURE=true`` as part of their environment. - - pushvars can provide for user-overridable hooks as well as set debug - levels. One example is having a hook that blocks commits containing - conflict markers, but enables the user to override the hook if the file - is using conflict markers for testing purposes or the file format has - strings that look like conflict markers. - - By default, servers will ignore `--pushvars`. To enable it add the - following to your configuration file:: - - [push] - pushvars.server = true - Returns 0 if push was successful, 1 if nothing to push. """ @@ -4081,28 +4059,11 @@ return not result finally: del repo._subtoppath - - pushvars = opts.get('pushvars') - if pushvars: - shellvars = {} - for raw in pushvars: - if '=' not in raw: - msg = ("unable to parse variable '%s', should follow " - "'KEY=VALUE' or 'KEY=' format") - raise error.Abort(msg % raw) - k, v = raw.split('=', 1) - shellvars[k] = v - - repo._shellvars = shellvars - pushop = exchange.push(repo, other, opts.get('force'), revs=revs, newbranch=opts.get('new_branch'), bookmarks=opts.get('bookmark', ()), opargs=opts.get('opargs')) - if pushvars: - del repo._shellvars - result = not pushop.cgresult if pushop.bkresult is not None: @@ -4712,19 +4673,6 @@ files are not considered while tersing until 'i' is there in --terse value or the --ignored option is used. - --verbose option shows more context about the state of the repo - like the repository is in unfinised merge, shelve, rebase state etc. - You can have this behaviour turned on by default by following config: - - [commands] - status.verbose = true - - You can also skip some states like bisect by adding following in - configuration file. - - [commands] - status.skipstates = bisect - Examples: - show changes in the working directory relative to a @@ -4814,10 +4762,6 @@ if f in copy: fm.write("copy", ' %s' + end, repo.pathto(copy[f], cwd), label='status.copied') - - if ((ui.verbose or ui.configbool('commands', 'status.verbose')) - and not ui.plain()): - cmdutil.morestatus(repo, fm) fm.end() @command('^summary|sum', @@ -4868,11 +4812,10 @@ ui.write(_(' (no revision checked out)')) if p.obsolete(): ui.write(_(' (obsolete)')) - if p.isunstable(): - instabilities = (ui.label(instability, 'trouble.%s' % instability) - for instability in p.instabilities()) + if p.troubled(): ui.write(' (' - + ', '.join(instabilities) + + ', '.join(ui.label(trouble, 'trouble.%s' % trouble) + for trouble in p.troubles()) + ')') ui.write('\n') if p.description(): @@ -4994,13 +4937,13 @@ ui.status(_('phases: %s\n') % ', '.join(t)) if obsolete.isenabled(repo, obsolete.createmarkersopt): - for trouble in ("orphan", "contentdivergent", "phasedivergent"): + for trouble in ("unstable", "divergent", "bumped"): numtrouble = len(repo.revs(trouble + "()")) # We write all the possibilities to ease translation troublemsg = { - "orphan": _("orphan: %d changesets"), - "contentdivergent": _("content-divergent: %d changesets"), - "phasedivergent": _("phase-divergent: %d changesets"), + "unstable": _("unstable: %d changesets"), + "divergent": _("divergent: %d changesets"), + "bumped": _("bumped: %d changesets"), } if numtrouble > 0: ui.status(troublemsg[trouble] % numtrouble + "\n") diff -Nru mercurial-4.3.1+207-xenial/mercurial/configitems.py mercurial-4.3.1/mercurial/configitems.py --- mercurial-4.3.1+207-xenial/mercurial/configitems.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/configitems.py 2017-09-10 00:05:18.000000000 +0000 @@ -97,12 +97,6 @@ coreconfigitem('commands', 'status.relative', default=False, ) -coreconfigitem('commands', 'status.skipstates', - default=[], -) -coreconfigitem('commands', 'status.verbose', - default=False, -) coreconfigitem('commands', 'update.requiredest', default=False, ) @@ -181,17 +175,14 @@ coreconfigitem('experimental', 'editortmpinhg', default=False, ) -coreconfigitem('experimental', 'stabilization', +coreconfigitem('experimental', 'evolution', default=list, - alias=[('experimental', 'evolution')], ) -coreconfigitem('experimental', 'stabilization.bundle-obsmarker', +coreconfigitem('experimental', 'evolution.bundle-obsmarker', default=False, - alias=[('experimental', 'evolution.bundle-obsmarker')], ) -coreconfigitem('experimental', 'stabilization.track-operation', +coreconfigitem('experimental', 'evolution.track-operation', default=False, - alias=[('experimental', 'evolution.track-operation')] ) coreconfigitem('experimental', 'exportableenviron', default=list, @@ -361,9 +352,6 @@ coreconfigitem('progress', 'width', default=dynamicdefault, ) -coreconfigitem('push', 'pushvars.server', - default=False, -) coreconfigitem('server', 'bundle1', default=True, ) diff -Nru mercurial-4.3.1+207-xenial/mercurial/context.py mercurial-4.3.1/mercurial/context.py --- mercurial-4.3.1+207-xenial/mercurial/context.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/context.py 2017-09-10 00:05:18.000000000 +0000 @@ -204,85 +204,44 @@ return self.rev() in obsmod.getrevs(self._repo, 'extinct') def unstable(self): - msg = ("'context.unstable' is deprecated, " - "use 'context.orphan'") - self._repo.ui.deprecwarn(msg, '4.4') - return self.orphan() - - def orphan(self): """True if the changeset is not obsolete but it's ancestor are""" - return self.rev() in obsmod.getrevs(self._repo, 'orphan') + return self.rev() in obsmod.getrevs(self._repo, 'unstable') def bumped(self): - msg = ("'context.bumped' is deprecated, " - "use 'context.phasedivergent'") - self._repo.ui.deprecwarn(msg, '4.4') - return self.phasedivergent() - - def phasedivergent(self): """True if the changeset try to be a successor of a public changeset Only non-public and non-obsolete changesets may be bumped. """ - return self.rev() in obsmod.getrevs(self._repo, 'phasedivergent') + return self.rev() in obsmod.getrevs(self._repo, 'bumped') def divergent(self): - msg = ("'context.divergent' is deprecated, " - "use 'context.contentdivergent'") - self._repo.ui.deprecwarn(msg, '4.4') - return self.contentdivergent() - - def contentdivergent(self): """Is a successors of a changeset with multiple possible successors set Only non-public and non-obsolete changesets may be divergent. """ - return self.rev() in obsmod.getrevs(self._repo, 'contentdivergent') + return self.rev() in obsmod.getrevs(self._repo, 'divergent') def troubled(self): - msg = ("'context.troubled' is deprecated, " - "use 'context.isunstable'") - self._repo.ui.deprecwarn(msg, '4.4') - return self.isunstable() - - def isunstable(self): """True if the changeset is either unstable, bumped or divergent""" - return self.orphan() or self.phasedivergent() or self.contentdivergent() + return self.unstable() or self.bumped() or self.divergent() def troubles(self): - """Keep the old version around in order to avoid breaking extensions - about different return values. - """ - msg = ("'context.troubles' is deprecated, " - "use 'context.instabilities'") - self._repo.ui.deprecwarn(msg, '4.4') + """return the list of troubles affecting this changesets. + Troubles are returned as strings. possible values are: + - unstable, + - bumped, + - divergent. + """ troubles = [] - if self.orphan(): - troubles.append('orphan') - if self.phasedivergent(): + if self.unstable(): + troubles.append('unstable') + if self.bumped(): troubles.append('bumped') - if self.contentdivergent(): + if self.divergent(): troubles.append('divergent') return troubles - def instabilities(self): - """return the list of instabilities affecting this changeset. - - Instabilities are returned as strings. possible values are: - - orphan, - - phase-divergent, - - content-divergent. - """ - instabilities = [] - if self.orphan(): - instabilities.append('orphan') - if self.phasedivergent(): - instabilities.append('phase-divergent') - if self.contentdivergent(): - instabilities.append('content-divergent') - return instabilities - def parents(self): """return contexts for each parent changeset""" return self._parents diff -Nru mercurial-4.3.1+207-xenial/mercurial/copies.py mercurial-4.3.1/mercurial/copies.py --- mercurial-4.3.1+207-xenial/mercurial/copies.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/copies.py 2017-09-10 00:05:18.000000000 +0000 @@ -304,28 +304,6 @@ def mergecopies(repo, c1, c2, base): """ - The basic algorithm for copytracing. Copytracing is used in commands like - rebase, merge, unshelve, etc to merge files that were moved/ copied in one - merge parent and modified in another. For example: - - o ---> 4 another commit - | - | o ---> 3 commit that modifies a.txt - | / - o / ---> 2 commit that moves a.txt to b.txt - |/ - o ---> 1 merge base - - If we try to rebase revision 3 on revision 4, since there is no a.txt in - revision 4, and if user have copytrace disabled, we prints the following - message: - - ```other changed which local deleted``` - - If copytrace is enabled, this function finds all the new files that were - added from merge base up to the top commit (here 4), and for each file it - checks if this file was copied from another file (a.txt in the above case). - Find moves and copies between context c1 and c2 that are relevant for merging. 'base' will be used as the merge base. diff -Nru mercurial-4.3.1+207-xenial/mercurial/crecord.py mercurial-4.3.1/mercurial/crecord.py --- mercurial-4.3.1+207-xenial/mercurial/crecord.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/crecord.py 2017-09-10 00:05:18.000000000 +0000 @@ -1010,13 +1010,6 @@ def _getstatuslinesegments(self): """-> [str]. return segments""" selected = self.currentselecteditem.applied - spaceselect = _('space: select') - spacedeselect = _('space: deselect') - # Format the selected label into a place as long as the longer of the - # two possible labels. This may vary by language. - spacelen = max(len(spaceselect), len(spacedeselect)) - selectedlabel = '%-*s' % (spacelen, - spacedeselect if selected else spaceselect) segments = [ _headermessages[self.operation], '-', @@ -1024,7 +1017,7 @@ _('c: confirm'), _('q: abort'), _('arrow keys: move/expand/collapse'), - selectedlabel, + _('space: deselect') if selected else _('space: select'), _('?: help'), ] return segments diff -Nru mercurial-4.3.1+207-xenial/mercurial/dagparser.py mercurial-4.3.1/mercurial/dagparser.py --- mercurial-4.3.1+207-xenial/mercurial/dagparser.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/dagparser.py 2017-09-10 00:05:18.000000000 +0000 @@ -156,7 +156,7 @@ Error: >>> try: list(parsedag('+1 bad')) - ... except Exception, e: print(e) + ... except Exception, e: print e invalid character in dag description: bad... ''' diff -Nru mercurial-4.3.1+207-xenial/mercurial/dirstateguard.py mercurial-4.3.1/mercurial/dirstateguard.py --- mercurial-4.3.1+207-xenial/mercurial/dirstateguard.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/dirstateguard.py 2017-09-10 00:05:18.000000000 +0000 @@ -11,10 +11,9 @@ from . import ( error, - util, ) -class dirstateguard(util.transactional): +class dirstateguard(object): '''Restore dirstate at unexpected failure. At the construction, this class does: diff -Nru mercurial-4.3.1+207-xenial/mercurial/dirstate.py mercurial-4.3.1/mercurial/dirstate.py --- mercurial-4.3.1+207-xenial/mercurial/dirstate.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/dirstate.py 2017-09-10 00:05:18.000000000 +0000 @@ -359,7 +359,8 @@ return key in self._map def __iter__(self): - return iter(sorted(self._map)) + for x in sorted(self._map): + yield x def items(self): return self._map.iteritems() diff -Nru mercurial-4.3.1+207-xenial/mercurial/encoding.py mercurial-4.3.1/mercurial/encoding.py --- mercurial-4.3.1+207-xenial/mercurial/encoding.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/encoding.py 2017-09-10 00:05:18.000000000 +0000 @@ -8,7 +8,6 @@ from __future__ import absolute_import import array -import io import locale import os import unicodedata @@ -19,11 +18,6 @@ pycompat, ) -charencode = policy.importmod(r'charencode') - -asciilower = charencode.asciilower -asciiupper = charencode.asciiupper - _sysstr = pycompat.sysstr if pycompat.ispy3: @@ -79,11 +73,11 @@ encodingmode = environ.get("HGENCODINGMODE", "strict") fallbackencoding = 'ISO-8859-1' -class localstr(bytes): +class localstr(str): '''This class allows strings that are unmodified to be round-tripped to the local encoding and back''' def __new__(cls, u, l): - s = bytes.__new__(cls, l) + s = str.__new__(cls, l) s._utf8 = u return s def __hash__(self): @@ -324,6 +318,38 @@ return concat(usub.encode(_sysstr(encoding))) return ellipsis # no enough room for multi-column characters +def _asciilower(s): + '''convert a string to lowercase if ASCII + + Raises UnicodeDecodeError if non-ASCII characters are found.''' + s.decode('ascii') + return s.lower() + +def asciilower(s): + # delay importing avoids cyclic dependency around "parsers" in + # pure Python build (util => i18n => encoding => parsers => util) + parsers = policy.importmod(r'parsers') + impl = getattr(parsers, 'asciilower', _asciilower) + global asciilower + asciilower = impl + return impl(s) + +def _asciiupper(s): + '''convert a string to uppercase if ASCII + + Raises UnicodeDecodeError if non-ASCII characters are found.''' + s.decode('ascii') + return s.upper() + +def asciiupper(s): + # delay importing avoids cyclic dependency around "parsers" in + # pure Python build (util => i18n => encoding => parsers => util) + parsers = policy.importmod(r'parsers') + impl = getattr(parsers, 'asciiupper', _asciiupper) + global asciiupper + asciiupper = impl + return impl(s) + def lower(s): "best-effort encoding-aware case-folding of local string s" try: @@ -574,18 +600,3 @@ c = chr(ord(c.decode("utf-8")) & 0xff) r += c return r - -if pycompat.ispy3: - class strio(io.TextIOWrapper): - """Wrapper around TextIOWrapper that respects hg's encoding assumptions. - - Also works around Python closing streams. - """ - - def __init__(self, buffer): - super(strio, self).__init__(buffer, encoding=_sysstr(encoding)) - - def __del__(self): - """Override __del__ so it doesn't close the underlying stream.""" -else: - strio = pycompat.identity diff -Nru mercurial-4.3.1+207-xenial/mercurial/exchange.py mercurial-4.3.1/mercurial/exchange.py --- mercurial-4.3.1+207-xenial/mercurial/exchange.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/exchange.py 2017-09-10 00:05:18.000000000 +0000 @@ -308,6 +308,8 @@ self.bookmarks = bookmarks # allow push of new branch self.newbranch = newbranch + # did a local lock get acquired? + self.locallocked = None # step already performed # (used to check what steps have been already performed through bundle2) self.stepsdone = set() @@ -431,26 +433,28 @@ " %s") % (', '.join(sorted(missing))) raise error.Abort(msg) + # there are two ways to push to remote repo: + # + # addchangegroup assumes local user can lock remote + # repo (local filesystem, old ssh servers). + # + # unbundle assumes local user cannot lock remote repo (new ssh + # servers, http servers). + if not pushop.remote.canpush(): raise error.Abort(_("destination does not support push")) - - if not pushop.remote.capable('unbundle'): - raise error.Abort(_('cannot push: destination does not support the ' - 'unbundle wire protocol command')) - - # get lock as we might write phase data - wlock = lock = None + # get local lock as we might write phase data + localwlock = locallock = None try: # bundle2 push may receive a reply bundle touching bookmarks or other # things requiring the wlock. Take it now to ensure proper ordering. maypushback = pushop.ui.configbool('experimental', 'bundle2.pushback') if (not _forcebundle1(pushop)) and maypushback: - wlock = pushop.repo.wlock() - lock = pushop.repo.lock() - pushop.trmanager = transactionmanager(pushop.repo, - 'push-response', - pushop.remote.url()) + localwlock = pushop.repo.wlock() + locallock = pushop.repo.lock() + pushop.locallocked = True except IOError as err: + pushop.locallocked = False if err.errno != errno.EACCES: raise # source repo cannot be locked. @@ -458,18 +462,36 @@ # synchronisation. msg = 'cannot lock source repository: %s\n' % err pushop.ui.debug(msg) - - with wlock or util.nullcontextmanager(), \ - lock or util.nullcontextmanager(), \ - pushop.trmanager or util.nullcontextmanager(): + try: + if pushop.locallocked: + pushop.trmanager = transactionmanager(pushop.repo, + 'push-response', + pushop.remote.url()) pushop.repo.checkpush(pushop) - _pushdiscovery(pushop) - if not _forcebundle1(pushop): - _pushbundle2(pushop) - _pushchangeset(pushop) - _pushsyncphase(pushop) - _pushobsolete(pushop) - _pushbookmark(pushop) + lock = None + unbundle = pushop.remote.capable('unbundle') + if not unbundle: + lock = pushop.remote.lock() + try: + _pushdiscovery(pushop) + if not _forcebundle1(pushop): + _pushbundle2(pushop) + _pushchangeset(pushop) + _pushsyncphase(pushop) + _pushobsolete(pushop) + _pushbookmark(pushop) + finally: + if lock is not None: + lock.release() + if pushop.trmanager: + pushop.trmanager.close() + finally: + if pushop.trmanager: + pushop.trmanager.release() + if locallock is not None: + locallock.release() + if localwlock is not None: + localwlock.release() return pushop @@ -655,11 +677,9 @@ if unfi.obsstore: # this message are here for 80 char limit reason mso = _("push includes obsolete changeset: %s!") - mspd = _("push includes phase-divergent changeset: %s!") - mscd = _("push includes content-divergent changeset: %s!") - mst = {"orphan": _("push includes orphan changeset: %s!"), - "phase-divergent": mspd, - "content-divergent": mscd} + mst = {"unstable": _("push includes unstable changeset: %s!"), + "bumped": _("push includes bumped changeset: %s!"), + "divergent": _("push includes divergent changeset: %s!")} # If we are to push if there is at least one # obsolete or unstable changeset in missing, at # least one of the missinghead will be obsolete or @@ -668,10 +688,8 @@ ctx = unfi[node] if ctx.obsolete(): raise error.Abort(mso % ctx) - elif ctx.isunstable(): - # TODO print more than one instability in the abort - # message - raise error.Abort(mst[ctx.instabilities()[0]] % ctx) + elif ctx.troubled(): + raise error.Abort(mst[ctx.troubles()[0]] % ctx) discovery.checkheads(pushop) return True @@ -873,14 +891,6 @@ pushop.bkresult = 1 return handlereply -@b2partsgenerator('pushvars', idx=0) -def _getbundlesendvars(pushop, bundler): - '''send shellvars via bundle2''' - if getattr(pushop.repo, '_shellvars', ()): - part = bundler.newpart('pushvars') - - for key, value in pushop.repo._shellvars.iteritems(): - part.addparam(key, value, mandatory=False) def _pushbundle2(pushop): """push data to the remote using bundle2 @@ -938,12 +948,9 @@ pushop.stepsdone.add('changesets') if not _pushcheckoutgoing(pushop): return - - # Should have verified this in push(). - assert pushop.remote.capable('unbundle') - pushop.repo.prepushoutgoinghooks(pushop) outgoing = pushop.outgoing + unbundle = pushop.remote.capable('unbundle') # TODO: get bundlecaps from remote bundlecaps = None # create a changegroup from local @@ -962,18 +969,24 @@ bundlecaps=bundlecaps) # apply changegroup to remote - # local repo finds heads on server, finds out what - # revs it must push. once revs transferred, if server - # finds it has different heads (someone else won - # commit/push race), server aborts. - if pushop.force: - remoteheads = ['force'] + if unbundle: + # local repo finds heads on server, finds out what + # revs it must push. once revs transferred, if server + # finds it has different heads (someone else won + # commit/push race), server aborts. + if pushop.force: + remoteheads = ['force'] + else: + remoteheads = pushop.remoteheads + # ssh: return remote's addchangegroup() + # http: return remote's addchangegroup() or 0 for error + pushop.cgresult = pushop.remote.unbundle(cg, remoteheads, + pushop.repo.url()) else: - remoteheads = pushop.remoteheads - # ssh: return remote's addchangegroup() - # http: return remote's addchangegroup() or 0 for error - pushop.cgresult = pushop.remote.unbundle(cg, remoteheads, - pushop.repo.url()) + # we return an integer indicating remote head count + # change + pushop.cgresult = pushop.remote.addchangegroup(cg, 'push', + pushop.repo.url()) def _pushsyncphase(pushop): """synchronise phase information locally and remotely""" @@ -1160,7 +1173,7 @@ # deprecated; talk to trmanager directly return self.trmanager.transaction() -class transactionmanager(util.transactional): +class transactionmanager(object): """An object to manage the life cycle of a transaction It creates the transaction on demand and calls the appropriate hooks when @@ -1216,10 +1229,8 @@ opargs = {} pullop = pulloperation(repo, remote, heads, force, bookmarks=bookmarks, streamclonerequested=streamclonerequested, **opargs) - - peerlocal = pullop.remote.local() - if peerlocal: - missing = set(peerlocal.requirements) - pullop.repo.supported + if pullop.remote.local(): + missing = set(pullop.remote.requirements) - pullop.repo.supported if missing: msg = _("required features are not" " supported in the destination:" diff -Nru mercurial-4.3.1+207-xenial/mercurial/extensions.py mercurial-4.3.1/mercurial/extensions.py --- mercurial-4.3.1+207-xenial/mercurial/extensions.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/extensions.py 2017-09-10 00:05:18.000000000 +0000 @@ -19,6 +19,7 @@ from . import ( cmdutil, configitems, + encoding, error, pycompat, util, @@ -113,11 +114,16 @@ mod = _importh(name) return mod +def _forbytes(inst): + """Portably format an import error into a form suitable for + %-formatting into bytestrings.""" + return encoding.strtolocal(str(inst)) + def _reportimporterror(ui, err, failed, next): # note: this ui.debug happens before --debug is processed, # Use --config ui.debug=1 to see them. ui.debug('could not import %s (%s): trying %s\n' - % (failed, util.forcebytestr(err), next)) + % (failed, _forbytes(err), next)) if ui.debugflag: ui.traceback() @@ -174,7 +180,7 @@ uisetup(ui) except Exception as inst: ui.traceback() - msg = util.forcebytestr(inst) + msg = _forbytes(inst) ui.warn(_("*** failed to set up extension %s: %s\n") % (name, msg)) return False return True @@ -186,16 +192,12 @@ try: extsetup(ui) except TypeError: - # Try to use getfullargspec (Python 3) first, and fall - # back to getargspec only if it doesn't exist so as to - # avoid warnings. - if getattr(inspect, 'getfullargspec', - getattr(inspect, 'getargspec'))(extsetup).args: + if inspect.getargspec(extsetup).args: raise extsetup() # old extsetup with no ui argument except Exception as inst: ui.traceback() - msg = util.forcebytestr(inst) + msg = _forbytes(inst) ui.warn(_("*** failed to set up extension %s: %s\n") % (name, msg)) return False return True @@ -213,7 +215,7 @@ try: load(ui, name, path) except Exception as inst: - msg = util.forcebytestr(inst) + msg = _forbytes(inst) if path: ui.warn(_("*** failed to import extension %s from %s: %s\n") % (name, path, msg)) @@ -254,7 +256,6 @@ from . import ( color, commands, - filemerge, fileset, revset, templatefilters, @@ -273,7 +274,6 @@ ('colortable', color, 'loadcolortable'), ('configtable', configitems, 'loadconfigtable'), ('filesetpredicate', fileset, 'loadpredicate'), - ('internalmerge', filemerge, 'loadinternalmerge'), ('revsetpredicate', revset, 'loadpredicate'), ('templatefilter', templatefilters, 'loadfilter'), ('templatefunc', templater, 'loadfunction'), @@ -384,7 +384,6 @@ These can't be wrapped using the normal wrapfunction. """ - propname = pycompat.sysstr(propname) assert callable(wrapper) for currcls in cls.__mro__: if propname in currcls.__dict__: @@ -396,8 +395,8 @@ break if currcls is object: - raise AttributeError(r"type '%s' has no property '%s'" % ( - cls, propname)) + raise AttributeError( + _("type '%s' has no property '%s'") % (cls, propname)) def wrapfunction(container, funcname, wrapper): '''Wrap the function named funcname in container diff -Nru mercurial-4.3.1+207-xenial/mercurial/filemerge.py mercurial-4.3.1/mercurial/filemerge.py --- mercurial-4.3.1+207-xenial/mercurial/filemerge.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/filemerge.py 2017-09-10 00:05:18.000000000 +0000 @@ -21,7 +21,6 @@ formatter, match, pycompat, - registrar, scmutil, simplemerge, tagmerge, @@ -45,12 +44,10 @@ # Merge tools to document. internalsdoc = {} -internaltool = registrar.internalmerge() - # internal tool merge types -nomerge = internaltool.nomerge -mergeonly = internaltool.mergeonly # just the full merge, no premerge -fullmerge = internaltool.fullmerge # both premerge and merge +nomerge = None +mergeonly = 'mergeonly' # just the full merge, no premerge +fullmerge = 'fullmerge' # both premerge and merge _localchangedotherdeletedmsg = _( "local%(l)s changed %(fd)s which other%(o)s deleted\n" @@ -107,6 +104,21 @@ def isabsent(self): return True +def internaltool(name, mergetype, onfailure=None, precheck=None): + '''return a decorator for populating internal merge tool table''' + def decorator(func): + fullname = ':' + name + func.__doc__ = (pycompat.sysstr("``%s``\n" % fullname) + + func.__doc__.strip()) + internals[fullname] = func + internals['internal:' + name] = func + internalsdoc[fullname] = func + func.mergetype = mergetype + func.onfailure = onfailure + func.precheck = precheck + return func + return decorator + def _findtool(ui, tool): if tool in internals: return tool @@ -341,8 +353,7 @@ labels = _defaultconflictlabels if len(labels) < 3: labels.append('base') - r = simplemerge.simplemerge(ui, a, b, c, fcd, fca, fco, - quiet=True, label=labels, repo=repo) + r = simplemerge.simplemerge(ui, a, b, c, quiet=True, label=labels) if not r: ui.debug(" premerge successful\n") return 0 @@ -372,8 +383,7 @@ ui = repo.ui - r = simplemerge.simplemerge(ui, a, b, c, fcd, fca, fco, - label=labels, mode=mode, repo=repo) + r = simplemerge.simplemerge(ui, a, b, c, label=labels, mode=mode) return True, r, False @internaltool('union', fullmerge, @@ -425,9 +435,8 @@ assert localorother is not None tool, toolpath, binary, symlink = toolconf a, b, c, back = files - r = simplemerge.simplemerge(repo.ui, a, b, c, fcd, fca, fco, - label=labels, localorother=localorother, - repo=repo) + r = simplemerge.simplemerge(repo.ui, a, b, c, label=labels, + localorother=localorother) return True, r @internaltool('merge-local', mergeonly, precheck=_mergecheck) @@ -734,17 +743,5 @@ def filemerge(repo, mynode, orig, fcd, fco, fca, labels=None): return _filemerge(False, repo, mynode, orig, fcd, fco, fca, labels=labels) -def loadinternalmerge(ui, extname, registrarobj): - """Load internal merge tool from specified registrarobj - """ - for name, func in registrarobj._table.iteritems(): - fullname = ':' + name - internals[fullname] = func - internals['internal:' + name] = func - internalsdoc[fullname] = func - -# load built-in merge tools explicitly to setup internalsdoc -loadinternalmerge(None, None, internaltool) - # tell hggettext to extract docstrings from these functions: i18nfunctions = internals.values() diff -Nru mercurial-4.3.1+207-xenial/mercurial/graphmod.py mercurial-4.3.1/mercurial/graphmod.py --- mercurial-4.3.1+207-xenial/mercurial/graphmod.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/graphmod.py 2017-09-10 00:05:18.000000000 +0000 @@ -172,7 +172,7 @@ yield (cur, type, data, (col, color), edges) seen = next -def asciiedges(type, char, state, rev, parents): +def asciiedges(type, char, lines, state, rev, parents): """adds edge info to changelog DAG walk suitable for ascii()""" seen = state['seen'] if rev not in seen: @@ -192,7 +192,6 @@ state['edges'][parent] = state['styles'].get(ptype, '|') ncols = len(seen) - width = 1 + ncols * 2 nextseen = seen[:] nextseen[nodeidx:nodeidx + 1] = newparents edges = [(nodeidx, nextseen.index(p)) for p in knownparents] @@ -206,9 +205,9 @@ edges.append((nodeidx, nodeidx)) edges.append((nodeidx, nodeidx + 1)) nmorecols = 1 - width += 2 - yield (type, char, width, (nodeidx, edges, ncols, nmorecols)) + yield (type, char, lines, (nodeidx, edges, ncols, nmorecols)) char = '\\' + lines = [] nodeidx += 1 ncols += 1 edges = [] @@ -219,11 +218,9 @@ if len(newparents) > 1: edges.append((nodeidx, nodeidx + 1)) nmorecols = len(nextseen) - ncols - if nmorecols > 0: - width += 2 # remove current node from edge characters, no longer needed state['edges'].pop(rev, None) - yield (type, char, width, (nodeidx, edges, ncols, nmorecols)) + yield (type, char, lines, (nodeidx, edges, ncols, nmorecols)) def _fixlongrightedges(edges): for (i, (start, end)) in enumerate(edges): diff -Nru mercurial-4.3.1+207-xenial/mercurial/hg.py mercurial-4.3.1/mercurial/hg.py --- mercurial-4.3.1+207-xenial/mercurial/hg.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/hg.py 2017-09-10 00:05:18.000000000 +0000 @@ -641,11 +641,11 @@ destrepo = destpeer.local() if destrepo: template = uimod.samplehgrcs['cloned'] - fp = destrepo.vfs("hgrc", "wb") + fp = destrepo.vfs("hgrc", "w", text=True) u = util.url(abspath) u.passwd = None - defaulturl = bytes(u) - fp.write(util.tonativeeol(template % defaulturl)) + defaulturl = str(u) + fp.write(template % defaulturl) fp.close() destrepo.ui.setconfig('paths', 'default', defaulturl, 'clone') diff -Nru mercurial-4.3.1+207-xenial/mercurial/hgweb/protocol.py mercurial-4.3.1/mercurial/hgweb/protocol.py --- mercurial-4.3.1+207-xenial/mercurial/hgweb/protocol.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/hgweb/protocol.py 2017-09-10 00:05:18.000000000 +0000 @@ -75,9 +75,6 @@ return args def getfile(self, fp): length = int(self.req.env['CONTENT_LENGTH']) - # If httppostargs is used, we need to read Content-Length - # minus the amount that was consumed by args. - length -= int(self.req.env.get('HTTP_X_HGARGS_POST', 0)) for s in util.filechunkiter(self.req, limit=length): fp.write(s) def redirect(self): diff -Nru mercurial-4.3.1+207-xenial/mercurial/httppeer.py mercurial-4.3.1/mercurial/httppeer.py --- mercurial-4.3.1+207-xenial/mercurial/httppeer.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/httppeer.py 2017-09-10 00:05:18.000000000 +0000 @@ -9,7 +9,6 @@ from __future__ import absolute_import import errno -import io import os import socket import struct @@ -87,51 +86,13 @@ resp.__class__ = readerproxy -class _multifile(object): - def __init__(self, *fileobjs): - for f in fileobjs: - if not util.safehasattr(f, 'length'): - raise ValueError( - '_multifile only supports file objects that ' - 'have a length but this one does not:', type(f), f) - self._fileobjs = fileobjs - self._index = 0 - - @property - def length(self): - return sum(f.length for f in self._fileobjs) - - def read(self, amt=None): - if amt <= 0: - return ''.join(f.read() for f in self._fileobjs) - parts = [] - while amt and self._index < len(self._fileobjs): - parts.append(self._fileobjs[self._index].read(amt)) - got = len(parts[-1]) - if got < amt: - self._index += 1 - amt -= got - return ''.join(parts) - - def seek(self, offset, whence=os.SEEK_SET): - if whence != os.SEEK_SET: - raise NotImplementedError( - '_multifile does not support anything other' - ' than os.SEEK_SET for whence on seek()') - if offset != 0: - raise NotImplementedError( - '_multifile only supports seeking to start, but that ' - 'could be fixed if you need it') - for f in self._fileobjs: - f.seek(0) - self._index = 0 - class httppeer(wireproto.wirepeer): def __init__(self, ui, path): - self._path = path - self._caps = None - self._urlopener = None - self._requestbuilder = None + self.path = path + self.caps = None + self.handler = None + self.urlopener = None + self.requestbuilder = None u = util.url(path) if u.query or u.fragment: raise error.Abort(_('unsupported URL component: "%s"') % @@ -140,60 +101,39 @@ # urllib cannot handle URLs with embedded user or passwd self._url, authinfo = u.authinfo() - self._ui = ui - ui.debug('using %s\n' % self._url) + self.ui = ui + self.ui.debug('using %s\n' % self._url) - self._urlopener = url.opener(ui, authinfo) - self._requestbuilder = urlreq.request + self.urlopener = url.opener(ui, authinfo) + self.requestbuilder = urlreq.request def __del__(self): - urlopener = getattr(self, '_urlopener', None) + urlopener = getattr(self, 'urlopener', None) if urlopener: for h in urlopener.handlers: h.close() getattr(h, "close_all", lambda : None)() - # Begin of _basepeer interface. - - @util.propertycache - def ui(self): - return self._ui - def url(self): - return self._path - - def local(self): - return None - - def peer(self): - return self - - def canpush(self): - return True - - def close(self): - pass + return self.path - # End of _basepeer interface. + # look up capabilities only when needed - # Begin of _basewirepeer interface. + def _fetchcaps(self): + self.caps = set(self._call('capabilities').split()) - def capabilities(self): - if self._caps is None: + def _capabilities(self): + if self.caps is None: try: self._fetchcaps() except error.RepoError: - self._caps = set() + self.caps = set() self.ui.debug('capabilities: %s\n' % - (' '.join(self._caps or ['none']))) - return self._caps + (' '.join(self.caps or ['none']))) + return self.caps - # End of _basewirepeer interface. - - # look up capabilities only when needed - - def _fetchcaps(self): - self._caps = set(self._call('capabilities').split()) + def lock(self): + raise error.Abort(_('operation not supported over http')) def _callstream(self, cmd, _compressible=False, **args): if cmd == 'pushkey': @@ -208,20 +148,18 @@ # Important: don't use self.capable() here or else you end up # with infinite recursion when trying to look up capabilities # for the first time. - postargsok = self._caps is not None and 'httppostargs' in self._caps - if postargsok and args: + postargsok = self.caps is not None and 'httppostargs' in self.caps + # TODO: support for httppostargs when data is a file-like + # object rather than a basestring + canmungedata = not data or isinstance(data, basestring) + if postargsok and canmungedata: strargs = urlreq.urlencode(sorted(args.items())) - if not data: - data = strargs - else: - if isinstance(data, basestring): - i = io.BytesIO(data) - i.length = len(data) - data = i - argsio = io.BytesIO(strargs) - argsio.length = len(strargs) - data = _multifile(argsio, data) - headers['X-HgArgs-Post'] = len(strargs) + if strargs: + if not data: + data = strargs + elif isinstance(data, basestring): + data = strargs + data + headers['X-HgArgs-Post'] = len(strargs) else: if len(args) > 0: httpheader = self.capable('httpheader') @@ -255,7 +193,7 @@ protoparams = [] mediatypes = set() - if self._caps is not None: + if self.caps is not None: mt = self.capable('httpmediatype') if mt: protoparams.append('0.1') @@ -283,13 +221,13 @@ if varyheaders: headers['Vary'] = ','.join(varyheaders) - req = self._requestbuilder(cu, data, headers) + req = self.requestbuilder(cu, data, headers) if data is not None: self.ui.debug("sending %s bytes\n" % size) req.add_unredirected_header('Content-Length', '%d' % size) try: - resp = self._urlopener.open(req) + resp = self.urlopener.open(req) except urlerr.httperror as inst: if inst.code == 401: raise error.Abort(_('authorization failed')) diff -Nru mercurial-4.3.1+207-xenial/mercurial/localrepo.py mercurial-4.3.1/mercurial/localrepo.py --- mercurial-4.3.1+207-xenial/mercurial/localrepo.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/localrepo.py 2017-09-10 00:05:18.000000000 +0000 @@ -49,7 +49,6 @@ phases, pushkey, pycompat, - repository, repoview, revset, revsetlang, @@ -145,52 +144,45 @@ 'unbundle'} legacycaps = moderncaps.union({'changegroupsubset'}) -class localpeer(repository.peer): +class localpeer(peer.peerrepository): '''peer for a local repo; reflects only the most recent API''' def __init__(self, repo, caps=None): - super(localpeer, self).__init__() - if caps is None: caps = moderncaps.copy() + peer.peerrepository.__init__(self) self._repo = repo.filtered('served') - self._ui = repo.ui + self.ui = repo.ui self._caps = repo._restrictcapabilities(caps) + self.requirements = repo.requirements + self.supportedformats = repo.supportedformats - # Begin of _basepeer interface. - - @util.propertycache - def ui(self): - return self._ui + def close(self): + self._repo.close() - def url(self): - return self._repo.url() + def _capabilities(self): + return self._caps def local(self): return self._repo - def peer(self): - return self - def canpush(self): return True - def close(self): - self._repo.close() - - # End of _basepeer interface. + def url(self): + return self._repo.url() - # Begin of _basewirecommands interface. + def lookup(self, key): + return self._repo.lookup(key) def branchmap(self): return self._repo.branchmap() - def capabilities(self): - return self._caps + def heads(self): + return self._repo.heads() - def debugwireargs(self, one, two, three=None, four=None, five=None): - """Used to test argument passing over the wire""" - return "%s %s %s %s %s" % (one, two, three, four, five) + def known(self, nodes): + return self._repo.known(nodes) def getbundle(self, source, heads=None, common=None, bundlecaps=None, **kwargs): @@ -207,24 +199,8 @@ else: return changegroup.getunbundler('01', cb, None) - def heads(self): - return self._repo.heads() - - def known(self, nodes): - return self._repo.known(nodes) - - def listkeys(self, namespace): - return self._repo.listkeys(namespace) - - def lookup(self, key): - return self._repo.lookup(key) - - def pushkey(self, namespace, key, old, new): - return self._repo.pushkey(namespace, key, old, new) - - def stream_out(self): - raise error.Abort(_('cannot perform stream clone against local ' - 'peer')) + # TODO We might want to move the next two calls into legacypeer and add + # unbundle instead. def unbundle(self, cg, heads, url): """apply a bundle on a repo @@ -261,38 +237,38 @@ except error.PushRaced as exc: raise error.ResponseError(_('push failed:'), str(exc)) - # End of _basewirecommands interface. + def lock(self): + return self._repo.lock() - # Begin of peer interface. + def pushkey(self, namespace, key, old, new): + return self._repo.pushkey(namespace, key, old, new) - def iterbatch(self): - return peer.localiterbatcher(self) + def listkeys(self, namespace): + return self._repo.listkeys(namespace) - # End of peer interface. + def debugwireargs(self, one, two, three=None, four=None, five=None): + '''used to test argument passing over the wire''' + return "%s %s %s %s %s" % (one, two, three, four, five) -class locallegacypeer(repository.legacypeer, localpeer): +class locallegacypeer(localpeer): '''peer extension which implements legacy methods too; used for tests with restricted capabilities''' def __init__(self, repo): - super(locallegacypeer, self).__init__(repo, caps=legacycaps) + localpeer.__init__(self, repo, caps=legacycaps) - # Begin of baselegacywirecommands interface. + def branches(self, nodes): + return self._repo.branches(nodes) def between(self, pairs): return self._repo.between(pairs) - def branches(self, nodes): - return self._repo.branches(nodes) - def changegroup(self, basenodes, source): return changegroup.changegroup(self._repo, basenodes, source) def changegroupsubset(self, bases, heads, source): return changegroup.changegroupsubset(self._repo, bases, heads, source) - # End of baselegacywirecommands interface. - # Increment the sub-version when the revlog v2 format changes to lock out old # clients. REVLOGV2_REQUIREMENT = 'exp-revlogv2.0' @@ -1491,13 +1467,6 @@ # dirstate is invalidated separately in invalidatedirstate() if k == 'dirstate': continue - if (k == 'changelog' and - self.currenttransaction() and - self.changelog._delayed): - # The changelog object may store unwritten revisions. We don't - # want to lose them. - # TODO: Solve the problem instead of working around it. - continue if clearfilecache: del self._filecache[k] diff -Nru mercurial-4.3.1+207-xenial/mercurial/match.py mercurial-4.3.1/mercurial/match.py --- mercurial-4.3.1+207-xenial/mercurial/match.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/match.py 2017-09-10 00:05:18.000000000 +0000 @@ -18,11 +18,6 @@ util, ) -allpatternkinds = ('re', 'glob', 'path', 'relglob', 'relpath', 'relre', - 'listfile', 'listfile0', 'set', 'include', 'subinclude', - 'rootfilesin') -cwdrelativepatternkinds = ('relpath', 'glob') - propertycache = util.propertycache def _rematcher(regex): @@ -195,7 +190,7 @@ normalized and rooted patterns and with listfiles expanded.''' kindpats = [] for kind, pat in [_patsplit(p, default) for p in patterns]: - if kind in cwdrelativepatternkinds: + if kind in ('glob', 'relpath'): pat = pathutil.canonpath(root, cwd, pat, auditor) elif kind in ('relglob', 'path', 'rootfilesin'): pat = util.normpath(pat) @@ -696,7 +691,9 @@ pattern.""" if ':' in pattern: kind, pat = pattern.split(':', 1) - if kind in allpatternkinds: + if kind in ('re', 'glob', 'path', 'relglob', 'relpath', 'relre', + 'listfile', 'listfile0', 'set', 'include', 'subinclude', + 'rootfilesin'): return kind, pat return default, pattern diff -Nru mercurial-4.3.1+207-xenial/mercurial/merge.py mercurial-4.3.1/mercurial/merge.py --- mercurial-4.3.1+207-xenial/mercurial/merge.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/merge.py 2017-09-10 00:05:18.000000000 +0000 @@ -753,7 +753,7 @@ # check case-folding collision in provisional merged manifest foldmap = {} - for f in pmmf: + for f in sorted(pmmf): fold = util.normcase(f) if fold in foldmap: raise error.Abort(_("case-folding collision between %s and %s") diff -Nru mercurial-4.3.1+207-xenial/mercurial/obsolete.py mercurial-4.3.1/mercurial/obsolete.py --- mercurial-4.3.1+207-xenial/mercurial/obsolete.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/obsolete.py 2017-09-10 00:05:18.000000000 +0000 @@ -20,12 +20,12 @@ besides old and news changeset identifiers, such as creation date or author name. -The old obsoleted changeset is called a "predecessor" and possible +The old obsoleted changeset is called a "precursor" and possible replacements are called "successors". Markers that used changeset X as -a predecessor are called "successor markers of X" because they hold +a precursor are called "successor markers of X" because they hold information about the successors of X. Markers that use changeset Y as -a successors are call "predecessor markers of Y" because they hold -information about the predecessors of Y. +a successors are call "precursor markers of Y" because they hold +information about the precursors of Y. Examples: @@ -102,7 +102,7 @@ """Returns True if the given repository has the given obsolete option enabled. """ - result = set(repo.ui.configlist('experimental', 'stabilization')) + result = set(repo.ui.configlist('experimental', 'evolution')) if 'all' in result: return True @@ -294,11 +294,11 @@ # # - uint8: number of metadata entries M # -# - 20 or 32 bytes: predecessor changeset identifier. +# - 20 or 32 bytes: precursor changeset identifier. # # - N*(20 or 32) bytes: successors changesets identifiers. # -# - P*(20 or 32) bytes: parents of the predecessors changesets. +# - P*(20 or 32) bytes: parents of the precursors changesets. # # - M*(uint8, uint8): size of all metadata entries (key and value) # @@ -314,7 +314,7 @@ _fm1parentshift = 14 _fm1parentmask = (_fm1parentnone << _fm1parentshift) _fm1metapair = 'BB' -_fm1metapairsize = _calcsize(_fm1metapair) +_fm1metapairsize = _calcsize('BB') def _fm1purereadmarkers(data, off, stop): # make some global constants local for performance @@ -470,18 +470,11 @@ for mark in markers: successors.setdefault(mark[0], set()).add(mark) -def _addprecursors(*args, **kwargs): - msg = ("'obsolete._addprecursors' is deprecated, " - "use 'obsolete._addpredecessors'") - util.nouideprecwarn(msg, '4.4') - - return _addpredecessors(*args, **kwargs) - @util.nogc -def _addpredecessors(predecessors, markers): +def _addprecursors(precursors, markers): for mark in markers: for suc in mark[1]: - predecessors.setdefault(suc, set()).add(mark) + precursors.setdefault(suc, set()).add(mark) @util.nogc def _addchildren(children, markers): @@ -506,18 +499,18 @@ """Store obsolete markers Markers can be accessed with two mappings: - - predecessors[x] -> set(markers on predecessors edges of x) + - precursors[x] -> set(markers on precursors edges of x) - successors[x] -> set(markers on successors edges of x) - - children[x] -> set(markers on predecessors edges of children(x) + - children[x] -> set(markers on precursors edges of children(x) """ fields = ('prec', 'succs', 'flag', 'meta', 'date', 'parents') - # prec: nodeid, predecessors changesets + # prec: nodeid, precursor changesets # succs: tuple of nodeid, successor changesets (0-N length) # flag: integer, flag field carrying modifier for the markers (see doc) # meta: binary blob, encoded metadata dictionary # date: (float, int) tuple, date of marker creation - # parents: (tuple of nodeid) or None, parents of predecessors + # parents: (tuple of nodeid) or None, parents of precursors # None is used when no data has been recorded def __init__(self, svfs, defaultformat=_fm1version, readonly=False): @@ -590,7 +583,7 @@ metadata = tuple(sorted(metadata.iteritems())) - marker = (bytes(prec), tuple(succs), int(flag), metadata, date, parents) + marker = (str(prec), tuple(succs), int(flag), metadata, date, parents) return bool(self.add(transaction, [marker])) def add(self, transaction, markers): @@ -665,19 +658,11 @@ _addsuccessors(successors, self._all) return successors - @property - def precursors(self): - msg = ("'obsstore.precursors' is deprecated, " - "use 'obsstore.predecessors'") - util.nouideprecwarn(msg, '4.4') - - return self.predecessors - @propertycache - def predecessors(self): - predecessors = {} - _addpredecessors(predecessors, self._all) - return predecessors + def precursors(self): + precursors = {} + _addprecursors(precursors, self._all) + return precursors @propertycache def children(self): @@ -694,8 +679,8 @@ self._all.extend(markers) if self._cached('successors'): _addsuccessors(self.successors, markers) - if self._cached('predecessors'): - _addpredecessors(self.predecessors, markers) + if self._cached('precursors'): + _addprecursors(self.precursors, markers) if self._cached('children'): _addchildren(self.children, markers) _checkinvalidmarkers(markers) @@ -707,15 +692,14 @@ - marker that use this changeset as successor - prune marker of direct children on this changeset - - recursive application of the two rules on predecessors of these - markers + - recursive application of the two rules on precursors of these markers It is a set so you cannot rely on order.""" pendingnodes = set(nodes) seenmarkers = set() seennodes = set(pendingnodes) - precursorsmarkers = self.predecessors + precursorsmarkers = self.precursors succsmarkers = self.successors children = self.children while pendingnodes: @@ -908,14 +892,6 @@ @cachefor('unstable') def _computeunstableset(repo): - msg = ("'unstable' volatile set is deprecated, " - "use 'orphan'") - repo.ui.deprecwarn(msg, '4.4') - - return _computeorphanset(repo) - -@cachefor('orphan') -def _computeorphanset(repo): """the set of non obsolete revisions with obsolete parents""" pfunc = repo.changelog.parentrevs mutable = _mutablerevs(repo) @@ -934,7 +910,7 @@ @cachefor('suspended') def _computesuspendedset(repo): """the set of obsolete parents with non obsolete descendants""" - suspended = repo.changelog.ancestors(getrevs(repo, 'orphan')) + suspended = repo.changelog.ancestors(getrevs(repo, 'unstable')) return set(r for r in getrevs(repo, 'obsolete') if r in suspended) @cachefor('extinct') @@ -942,16 +918,9 @@ """the set of obsolete parents without non obsolete descendants""" return getrevs(repo, 'obsolete') - getrevs(repo, 'suspended') + @cachefor('bumped') def _computebumpedset(repo): - msg = ("'bumped' volatile set is deprecated, " - "use 'phasedivergent'") - repo.ui.deprecwarn(msg, '4.4') - - return _computephasedivergentset(repo) - -@cachefor('phasedivergent') -def _computephasedivergentset(repo): """the set of revs trying to obsolete public revisions""" bumped = set() # util function (avoid attribute lookup in the loop) @@ -963,33 +932,25 @@ rev = ctx.rev() # We only evaluate mutable, non-obsolete revision node = ctx.node() - # (future) A cache of predecessors may worth if split is very common - for pnode in obsutil.allpredecessors(repo.obsstore, [node], + # (future) A cache of precursors may worth if split is very common + for pnode in obsutil.allprecursors(repo.obsstore, [node], ignoreflags=bumpedfix): prev = torev(pnode) # unfiltered! but so is phasecache if (prev is not None) and (phase(repo, prev) <= public): - # we have a public predecessor + # we have a public precursor bumped.add(rev) break # Next draft! return bumped @cachefor('divergent') def _computedivergentset(repo): - msg = ("'divergent' volatile set is deprecated, " - "use 'contentdivergent'") - repo.ui.deprecwarn(msg, '4.4') - - return _computecontentdivergentset(repo) - -@cachefor('contentdivergent') -def _computecontentdivergentset(repo): """the set of rev that compete to be the final successors of some revision. """ divergent = set() obsstore = repo.obsstore newermap = {} for ctx in repo.set('(not public()) - obsolete()'): - mark = obsstore.predecessors.get(ctx.node(), ()) + mark = obsstore.precursors.get(ctx.node(), ()) toprocess = set(mark) seen = set() while toprocess: @@ -1003,7 +964,7 @@ if len(newer) > 1: divergent.add(ctx.rev()) break - toprocess.update(obsstore.predecessors.get(prec, ())) + toprocess.update(obsstore.precursors.get(prec, ())) return divergent @@ -1030,7 +991,7 @@ if 'user' not in metadata: metadata['user'] = repo.ui.username() useoperation = repo.ui.configbool('experimental', - 'stabilization.track-operation') + 'evolution.track-operation') if useoperation and operation: metadata['operation'] = operation tr = repo.transaction('add-obsolescence-marker') diff -Nru mercurial-4.3.1+207-xenial/mercurial/obsutil.py mercurial-4.3.1/mercurial/obsutil.py --- mercurial-4.3.1+207-xenial/mercurial/obsutil.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/obsutil.py 2017-09-10 00:05:18.000000000 +0000 @@ -9,7 +9,6 @@ from . import ( phases, - util ) class marker(object): @@ -30,13 +29,7 @@ return self._data == other._data def precnode(self): - msg = ("'marker.precnode' is deprecated, " - "use 'marker.prednode'") - util.nouideprecwarn(msg, '4.4') - return self.prednode() - - def prednode(self): - """Predecessor changeset node identifier""" + """Precursor changeset node identifier""" return self._data[0] def succnodes(self): @@ -44,7 +37,7 @@ return self._data[1] def parentnodes(self): - """Parents of the predecessors (None if not recorded)""" + """Parents of the precursors (None if not recorded)""" return self._data[5] def metadata(self): @@ -81,7 +74,7 @@ considered missing. """ - precursors = repo.obsstore.predecessors + precursors = repo.obsstore.precursors stack = [nodeid] seen = set(stack) @@ -102,16 +95,7 @@ else: stack.append(precnodeid) -def allprecursors(*args, **kwargs): - """ (DEPRECATED) - """ - msg = ("'obsutil.allprecursors' is deprecated, " - "use 'obsutil.allpredecessors'") - util.nouideprecwarn(msg, '4.4') - - return allpredecessors(*args, **kwargs) - -def allpredecessors(obsstore, nodes, ignoreflags=0): +def allprecursors(obsstore, nodes, ignoreflags=0): """Yield node for every precursors of . Some precursors may be unknown locally. @@ -124,7 +108,7 @@ while remaining: current = remaining.pop() yield current - for mark in obsstore.predecessors.get(current, ()): + for mark in obsstore.precursors.get(current, ()): # ignore marker flagged with specified flag if mark[2] & ignoreflags: continue @@ -216,7 +200,7 @@ # shortcut to various useful item nm = unfi.changelog.nodemap - precursorsmarkers = unfi.obsstore.predecessors + precursorsmarkers = unfi.obsstore.precursors successormarkers = unfi.obsstore.successors childrenmarkers = unfi.obsstore.children @@ -323,7 +307,7 @@ seenrevs.add(rev) if phase(repo, rev) == public: continue - if set(succsmarkers(node) or []).issubset(addedmarkers): + if set(succsmarkers(node)).issubset(addedmarkers): obsoleted.add(rev) return obsoleted diff -Nru mercurial-4.3.1+207-xenial/mercurial/peer.py mercurial-4.3.1/mercurial/peer.py --- mercurial-4.3.1+207-xenial/mercurial/peer.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/peer.py 2017-09-10 00:05:18.000000000 +0000 @@ -8,6 +8,7 @@ from __future__ import absolute_import +from .i18n import _ from . import ( error, util, @@ -48,6 +49,15 @@ def results(self): raise NotImplementedError() +class localbatch(batcher): + '''performs the queued calls directly''' + def __init__(self, local): + batcher.__init__(self) + self.local = local + def submit(self): + for name, args, opts, resref in self.calls: + resref.set(getattr(self.local, name)(*args, **opts)) + class localiterbatcher(iterbatcher): def __init__(self, local): super(iterbatcher, self).__init__() @@ -59,8 +69,7 @@ def results(self): for name, args, opts, resref in self.calls: - resref.set(getattr(self.local, name)(*args, **opts)) - yield resref.value + yield getattr(self.local, name)(*args, **opts) def batchable(f): '''annotation for batchable methods @@ -69,6 +78,9 @@ @batchable def sample(self, one, two=None): + # Handle locally computable results first: + if not one: + yield "a local result", None # Build list of encoded arguments suitable for your wire protocol: encargs = [('one', encode(one),), ('two', encode(two),)] # Create future for injection of encoded result: @@ -94,3 +106,50 @@ return next(batchable) setattr(plain, 'batchable', f) return plain + +class peerrepository(object): + + def batch(self): + return localbatch(self) + + def iterbatch(self): + """Batch requests but allow iterating over the results. + + This is to allow interleaving responses with things like + progress updates for clients. + """ + return localiterbatcher(self) + + def capable(self, name): + '''tell whether repo supports named capability. + return False if not supported. + if boolean capability, return True. + if string capability, return string.''' + caps = self._capabilities() + if name in caps: + return True + name_eq = name + '=' + for cap in caps: + if cap.startswith(name_eq): + return cap[len(name_eq):] + return False + + def requirecap(self, name, purpose): + '''raise an exception if the given capability is not present''' + if not self.capable(name): + raise error.CapabilityError( + _('cannot %s; remote repository does not ' + 'support the %r capability') % (purpose, name)) + + def local(self): + '''return peer as a localrepo, or None''' + return None + + def peer(self): + return self + + def canpush(self): + return True + + def close(self): + pass diff -Nru mercurial-4.3.1+207-xenial/mercurial/policy.py mercurial-4.3.1/mercurial/policy.py --- mercurial-4.3.1+207-xenial/mercurial/policy.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/policy.py 2017-09-10 00:05:18.000000000 +0000 @@ -78,15 +78,6 @@ (r'cext', r'parsers'): 1, } -# map import request to other package or module -_modredirects = { - (r'cext', r'charencode'): (r'cext', r'parsers'), - (r'cffi', r'base85'): (r'pure', r'base85'), - (r'cffi', r'charencode'): (r'pure', r'charencode'), - (r'cffi', r'diffhelpers'): (r'pure', r'diffhelpers'), - (r'cffi', r'parsers'): (r'pure', r'parsers'), -} - def _checkmod(pkgname, modname, mod): expected = _cextversions.get((pkgname, modname)) actual = getattr(mod, r'version', None) @@ -103,14 +94,11 @@ raise ImportError(r'invalid HGMODULEPOLICY %r' % policy) assert verpkg or purepkg if verpkg: - pn, mn = _modredirects.get((verpkg, modname), (verpkg, modname)) try: - mod = _importfrom(pn, mn) - if pn == verpkg: - _checkmod(pn, mn, mod) + mod = _importfrom(verpkg, modname) + _checkmod(verpkg, modname, mod) return mod except ImportError: if not purepkg: raise - pn, mn = _modredirects.get((purepkg, modname), (purepkg, modname)) - return _importfrom(pn, mn) + return _importfrom(purepkg, modname) diff -Nru mercurial-4.3.1+207-xenial/mercurial/pure/charencode.py mercurial-4.3.1/mercurial/pure/charencode.py --- mercurial-4.3.1+207-xenial/mercurial/pure/charencode.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/pure/charencode.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -# charencode.py - miscellaneous character encoding -# -# Copyright 2005-2009 Matt Mackall 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 - -def asciilower(s): - '''convert a string to lowercase if ASCII - - Raises UnicodeDecodeError if non-ASCII characters are found.''' - s.decode('ascii') - return s.lower() - -def asciiupper(s): - '''convert a string to uppercase if ASCII - - Raises UnicodeDecodeError if non-ASCII characters are found.''' - s.decode('ascii') - return s.upper() diff -Nru mercurial-4.3.1+207-xenial/mercurial/pycompat.py mercurial-4.3.1/mercurial/pycompat.py --- mercurial-4.3.1+207-xenial/mercurial/pycompat.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/pycompat.py 2017-09-10 00:05:18.000000000 +0000 @@ -63,7 +63,6 @@ sysexecutable = os.fsencode(sysexecutable) stringio = io.BytesIO maplist = lambda *args: list(map(*args)) - rawinput = input # TODO: .buffer might not exist if std streams were replaced; we'll need # a silly wrapper to make a bytes stream backed by a unicode one. @@ -313,7 +312,6 @@ shlexsplit = shlex.split stringio = cStringIO.StringIO maplist = map - rawinput = raw_input class _pycompatstub(object): def __init__(self): diff -Nru mercurial-4.3.1+207-xenial/mercurial/registrar.py mercurial-4.3.1/mercurial/registrar.py --- mercurial-4.3.1+207-xenial/mercurial/registrar.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/registrar.py 2017-09-10 00:05:18.000000000 +0000 @@ -308,64 +308,3 @@ def _extrasetup(self, name, func, argspec=None): func._argspec = argspec - -class internalmerge(_funcregistrarbase): - """Decorator to register in-process merge tool - - Usage:: - - internalmerge = registrar.internalmerge() - - @internalmerge('mymerge', internalmerge.mergeonly, - onfailure=None, precheck=None): - def mymergefunc(repo, mynode, orig, fcd, fco, fca, - toolconf, files, labels=None): - '''Explanation of this internal merge tool .... - ''' - return 1, False # means "conflicted", "no deletion needed" - - The first string argument is used to compose actual merge tool name, - ":name" and "internal:name" (the latter is historical one). - - The second argument is one of merge types below: - - ========== ======== ======== ========= - merge type precheck premerge fullmerge - ========== ======== ======== ========= - nomerge x x x - mergeonly o x o - fullmerge o o o - ========== ======== ======== ========= - - Optional argument 'onfalure' is the format of warning message - to be used at failure of merging (target filename is specified - at formatting). Or, None or so, if warning message should be - suppressed. - - Optional argument 'precheck' is the function to be used - before actual invocation of internal merge tool itself. - It takes as same arguments as internal merge tool does, other than - 'files' and 'labels'. If it returns false value, merging is aborted - immediately (and file is marked as "unresolved"). - - 'internalmerge' instance in example above can be used to - decorate multiple functions. - - Decorated functions are registered automatically at loading - extension, if an instance named as 'internalmerge' is used for - decorating in extension. - - Otherwise, explicit 'filemerge.loadinternalmerge()' is needed. - """ - _docformat = "``:%s``\n %s" - - # merge type definitions: - nomerge = None - mergeonly = 'mergeonly' # just the full merge, no premerge - fullmerge = 'fullmerge' # both premerge and merge - - def _extrasetup(self, name, func, mergetype, - onfailure=None, precheck=None): - func.mergetype = mergetype - func.onfailure = onfailure - func.precheck = precheck diff -Nru mercurial-4.3.1+207-xenial/mercurial/repair.py mercurial-4.3.1/mercurial/repair.py --- mercurial-4.3.1+207-xenial/mercurial/repair.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/repair.py 2017-09-10 00:05:18.000000000 +0000 @@ -67,20 +67,16 @@ return sorted(files) -def _collectrevlog(revlog, striprev): - _, brokenset = revlog.getstrippoint(striprev) - return [revlog.linkrev(r) for r in brokenset] - -def _collectmanifest(repo, striprev): - return _collectrevlog(repo.manifestlog._revlog, striprev) - def _collectbrokencsets(repo, files, striprev): """return the changesets which will be broken by the truncation""" s = set() + def collectone(revlog): + _, brokenset = revlog.getstrippoint(striprev) + s.update([revlog.linkrev(r) for r in brokenset]) - s.update(_collectmanifest(repo, striprev)) + collectone(repo.manifestlog._revlog) for fname in files: - s.update(_collectrevlog(repo.file(fname), striprev)) + collectone(repo.file(fname)) return s @@ -178,13 +174,16 @@ tmpbundlefile = _bundle(repo, savebases, saveheads, node, 'temp', compress=False, obsolescence=False) + mfst = repo.manifestlog._revlog + try: with repo.transaction("strip") as tr: offset = len(tr.entries) tr.startgroup() cl.strip(striprev, tr) - stripmanifest(repo, striprev, tr, files) + mfst.strip(striprev, tr) + striptrees(repo, tr, striprev, files) for fn in files: repo.file(fn).strip(striprev, tr) @@ -311,11 +310,6 @@ callback.topic = topic callback.addnodes(nodelist) -def stripmanifest(repo, striprev, tr, files): - revlog = repo.manifestlog._revlog - revlog.strip(striprev, tr) - striptrees(repo, tr, striprev, files) - def striptrees(repo, tr, striprev, files): if 'treemanifest' in repo.requirements: # safe but unnecessary # otherwise diff -Nru mercurial-4.3.1+207-xenial/mercurial/repository.py mercurial-4.3.1/mercurial/repository.py --- mercurial-4.3.1+207-xenial/mercurial/repository.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/repository.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,268 +0,0 @@ -# repository.py - Interfaces and base classes for repositories and peers. -# -# Copyright 2017 Gregory Szorc -# -# 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 - -import abc - -from .i18n import _ -from . import ( - error, -) - -class _basepeer(object): - """Represents a "connection" to a repository. - - This is the base interface for representing a connection to a repository. - It holds basic properties and methods applicable to all peer types. - - This is not a complete interface definition and should not be used - outside of this module. - """ - __metaclass__ = abc.ABCMeta - - @abc.abstractproperty - def ui(self): - """ui.ui instance.""" - - @abc.abstractmethod - def url(self): - """Returns a URL string representing this peer. - - Currently, implementations expose the raw URL used to construct the - instance. It may contain credentials as part of the URL. The - expectations of the value aren't well-defined and this could lead to - data leakage. - - TODO audit/clean consumers and more clearly define the contents of this - value. - """ - - @abc.abstractmethod - def local(self): - """Returns a local repository instance. - - If the peer represents a local repository, returns an object that - can be used to interface with it. Otherwise returns ``None``. - """ - - @abc.abstractmethod - def peer(self): - """Returns an object conforming to this interface. - - Most implementations will ``return self``. - """ - - @abc.abstractmethod - def canpush(self): - """Returns a boolean indicating if this peer can be pushed to.""" - - @abc.abstractmethod - def close(self): - """Close the connection to this peer. - - This is called when the peer will no longer be used. Resources - associated with the peer should be cleaned up. - """ - -class _basewirecommands(object): - """Client-side interface for communicating over the wire protocol. - - This interface is used as a gateway to the Mercurial wire protocol. - methods commonly call wire protocol commands of the same name. - """ - __metaclass__ = abc.ABCMeta - - @abc.abstractmethod - def branchmap(self): - """Obtain heads in named branches. - - Returns a dict mapping branch name to an iterable of nodes that are - heads on that branch. - """ - - @abc.abstractmethod - def capabilities(self): - """Obtain capabilities of the peer. - - Returns a set of string capabilities. - """ - - @abc.abstractmethod - def debugwireargs(self, one, two, three=None, four=None, five=None): - """Used to facilitate debugging of arguments passed over the wire.""" - - @abc.abstractmethod - def getbundle(self, source, **kwargs): - """Obtain remote repository data as a bundle. - - This command is how the bulk of repository data is transferred from - the peer to the local repository - - Returns a generator of bundle data. - """ - - @abc.abstractmethod - def heads(self): - """Determine all known head revisions in the peer. - - Returns an iterable of binary nodes. - """ - - @abc.abstractmethod - def known(self, nodes): - """Determine whether multiple nodes are known. - - Accepts an iterable of nodes whose presence to check for. - - Returns an iterable of booleans indicating of the corresponding node - at that index is known to the peer. - """ - - @abc.abstractmethod - def listkeys(self, namespace): - """Obtain all keys in a pushkey namespace. - - Returns an iterable of key names. - """ - - @abc.abstractmethod - def lookup(self, key): - """Resolve a value to a known revision. - - Returns a binary node of the resolved revision on success. - """ - - @abc.abstractmethod - def pushkey(self, namespace, key, old, new): - """Set a value using the ``pushkey`` protocol. - - Arguments correspond to the pushkey namespace and key to operate on and - the old and new values for that key. - - Returns a string with the peer result. The value inside varies by the - namespace. - """ - - @abc.abstractmethod - def stream_out(self): - """Obtain streaming clone data. - - Successful result should be a generator of data chunks. - """ - - @abc.abstractmethod - def unbundle(self, bundle, heads, url): - """Transfer repository data to the peer. - - This is how the bulk of data during a push is transferred. - - Returns the integer number of heads added to the peer. - """ - -class _baselegacywirecommands(object): - """Interface for implementing support for legacy wire protocol commands. - - Wire protocol commands transition to legacy status when they are no longer - used by modern clients. To facilitate identifying which commands are - legacy, the interfaces are split. - """ - __metaclass__ = abc.ABCMeta - - @abc.abstractmethod - def between(self, pairs): - """Obtain nodes between pairs of nodes. - - ``pairs`` is an iterable of node pairs. - - Returns an iterable of iterables of nodes corresponding to each - requested pair. - """ - - @abc.abstractmethod - def branches(self, nodes): - """Obtain ancestor changesets of specific nodes back to a branch point. - - For each requested node, the peer finds the first ancestor node that is - a DAG root or is a merge. - - Returns an iterable of iterables with the resolved values for each node. - """ - - @abc.abstractmethod - def changegroup(self, nodes, kind): - """Obtain a changegroup with data for descendants of specified nodes.""" - - @abc.abstractmethod - def changegroupsubset(self, bases, heads, kind): - pass - -class peer(_basepeer, _basewirecommands): - """Unified interface and base class for peer repositories. - - All peer instances must inherit from this class and conform to its - interface. - """ - - @abc.abstractmethod - def iterbatch(self): - """Obtain an object to be used for multiple method calls. - - Various operations call several methods on peer instances. If each - method call were performed immediately and serially, this would - require round trips to remote peers and/or would slow down execution. - - Some peers have the ability to "batch" method calls to avoid costly - round trips or to facilitate concurrent execution. - - This method returns an object that can be used to indicate intent to - perform batched method calls. - - The returned object is a proxy of this peer. It intercepts calls to - batchable methods and queues them instead of performing them - immediately. This proxy object has a ``submit`` method that will - perform all queued batchable method calls. A ``results()`` method - exposes the results of queued/batched method calls. It is a generator - of results in the order they were called. - - Not all peers or wire protocol implementations may actually batch method - calls. However, they must all support this API. - """ - - def capable(self, name): - """Determine support for a named capability. - - Returns ``False`` if capability not supported. - - Returns ``True`` if boolean capability is supported. Returns a string - if capability support is non-boolean. - """ - caps = self.capabilities() - if name in caps: - return True - - name = '%s=' % name - for cap in caps: - if cap.startswith(name): - return cap[len(name):] - - return False - - def requirecap(self, name, purpose): - """Require a capability to be present. - - Raises a ``CapabilityError`` if the capability isn't present. - """ - if self.capable(name): - return - - raise error.CapabilityError( - _('cannot %s; remote repository does not support the %r ' - 'capability') % (purpose, name)) - -class legacypeer(peer, _baselegacywirecommands): - """peer but with support for legacy wire protocol commands.""" diff -Nru mercurial-4.3.1+207-xenial/mercurial/revset.py mercurial-4.3.1/mercurial/revset.py --- mercurial-4.3.1+207-xenial/mercurial/revset.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/revset.py 2017-09-10 00:05:18.000000000 +0000 @@ -459,23 +459,14 @@ @predicate('bumped()', safe=True) def bumped(repo, subset, x): - msg = ("'bumped()' is deprecated, " - "use 'phasedivergent()'") - repo.ui.deprecwarn(msg, '4.4') - - return phasedivergent(repo, subset, x) - -@predicate('phasedivergent()', safe=True) -def phasedivergent(repo, subset, x): """Mutable changesets marked as successors of public changesets. - Only non-public and non-obsolete changesets can be `phasedivergent`. - (EXPERIMENTAL) + Only non-public and non-obsolete changesets can be `bumped`. """ - # i18n: "phasedivergent" is a keyword - getargs(x, 0, 0, _("phasedivergent takes no arguments")) - phasedivergent = obsmod.getrevs(repo, 'phasedivergent') - return subset & phasedivergent + # i18n: "bumped" is a keyword + getargs(x, 0, 0, _("bumped takes no arguments")) + bumped = obsmod.getrevs(repo, 'bumped') + return subset & bumped @predicate('bundle()', safe=True) def bundle(repo, subset, x): @@ -720,22 +711,13 @@ @predicate('divergent()', safe=True) def divergent(repo, subset, x): - msg = ("'divergent()' is deprecated, " - "use 'contentdivergent()'") - repo.ui.deprecwarn(msg, '4.4') - - return contentdivergent(repo, subset, x) - -@predicate('contentdivergent()', safe=True) -def contentdivergent(repo, subset, x): - """ - Final successors of changesets with an alternative set of final - successors. (EXPERIMENTAL) - """ - # i18n: "contentdivergent" is a keyword - getargs(x, 0, 0, _("contentdivergent takes no arguments")) - contentdivergent = obsmod.getrevs(repo, 'contentdivergent') - return subset & contentdivergent + """ + Final successors of changesets with an alternative set of final successors. + """ + # i18n: "divergent" is a keyword + getargs(x, 0, 0, _("divergent takes no arguments")) + divergent = obsmod.getrevs(repo, 'divergent') + return subset & divergent @predicate('extinct()', safe=True) def extinct(repo, subset, x): @@ -1937,20 +1919,12 @@ @predicate('unstable()', safe=True) def unstable(repo, subset, x): - msg = ("'unstable()' is deprecated, " - "use 'orphan()'") - repo.ui.deprecwarn(msg, '4.4') - - return orphan(repo, subset, x) - -@predicate('orphan()', safe=True) -def orphan(repo, subset, x): - """Non-obsolete changesets with obsolete ancestors. (EXPERIMENTAL) - """ - # i18n: "orphan" is a keyword - getargs(x, 0, 0, _("orphan takes no arguments")) - orphan = obsmod.getrevs(repo, 'orphan') - return subset & orphan + """Non-obsolete changesets with obsolete ancestors. + """ + # i18n: "unstable" is a keyword + getargs(x, 0, 0, _("unstable takes no arguments")) + unstables = obsmod.getrevs(repo, 'unstable') + return subset & unstables @predicate('user(string)', safe=True) diff -Nru mercurial-4.3.1+207-xenial/mercurial/scmutil.py mercurial-4.3.1/mercurial/scmutil.py --- mercurial-4.3.1+207-xenial/mercurial/scmutil.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/scmutil.py 2017-09-10 00:05:18.000000000 +0000 @@ -273,7 +273,7 @@ if abort or warn: msg = util.checkwinfilename(f) if msg: - msg = "%s: %s" % (msg, util.shellquote(f)) + msg = "%s: %r" % (msg, f) if abort: raise error.Abort(msg) ui.warn(_("warning: %s\n") % msg) diff -Nru mercurial-4.3.1+207-xenial/mercurial/simplemerge.py mercurial-4.3.1/mercurial/simplemerge.py --- mercurial-4.3.1+207-xenial/mercurial/simplemerge.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/simplemerge.py 2017-09-10 00:05:18.000000000 +0000 @@ -397,90 +397,51 @@ return unc -def _verifytext(text, path, ui, opts): - """verifies that text is non-binary (unless opts[text] is passed, - then we just warn)""" - if util.binary(text): - msg = _("%s looks like a binary file.") % path - if not opts.get('quiet'): - ui.warn(_('warning: %s\n') % msg) - if not opts.get('text'): - raise error.Abort(msg) - return text - -def _picklabels(defaults, overrides): - name_a, name_b, name_base = defaults - - if len(overrides) > 0: - name_a = overrides[0] - if len(overrides) > 1: - name_b = overrides[1] - if len(overrides) > 2: - name_base = overrides[2] - if len(overrides) > 3: - raise error.Abort(_("can only specify three labels.")) - - return [name_a, name_b, name_base] - -def simplemerge(ui, localfile, basefile, otherfile, - localctx=None, basectx=None, otherctx=None, repo=None, **opts): - """Performs the simplemerge algorithm. - - {local|base|other}ctx are optional. If passed, they (local/base/other) will - be read from and the merge result written to (local). You should pass - explicit labels in this mode since the default is to use the file paths.""" +def simplemerge(ui, local, base, other, **opts): def readfile(filename): f = open(filename, "rb") text = f.read() f.close() - return _verifytext(text, filename, ui, opts) - - def readctx(ctx): - if not ctx: - return None - if not repo: - raise error.ProgrammingError('simplemerge: repo must be passed if ' - 'using contexts') - # `wwritedata` is used to get the post-filter data from `ctx` (i.e., - # what would have been in the working copy). Since merges were run in - # the working copy, and thus used post-filter data, we do the same to - # maintain behavior. - return repo.wwritedata(ctx.path(), - _verifytext(ctx.data(), ctx.path(), ui, opts)) - - class ctxwriter(object): - def __init__(self, ctx): - self.ctx = ctx - self.text = "" - - def write(self, text): - self.text += text - - def close(self): - self.ctx.write(self.text, self.ctx.flags()) + if util.binary(text): + msg = _("%s looks like a binary file.") % filename + if not opts.get('quiet'): + ui.warn(_('warning: %s\n') % msg) + if not opts.get('text'): + raise error.Abort(msg) + return text mode = opts.get('mode','merge') - name_a, name_b, name_base = None, None, None - if mode != 'union': - name_a, name_b, name_base = _picklabels([localfile, - otherfile, None], - opts.get('label', [])) + if mode == 'union': + name_a = None + name_b = None + name_base = None + else: + name_a = local + name_b = other + name_base = None + labels = opts.get('label', []) + if len(labels) > 0: + name_a = labels[0] + if len(labels) > 1: + name_b = labels[1] + if len(labels) > 2: + name_base = labels[2] + if len(labels) > 3: + raise error.Abort(_("can only specify three labels.")) try: - localtext = readctx(localctx) if localctx else readfile(localfile) - basetext = readctx(basectx) if basectx else readfile(basefile) - othertext = readctx(otherctx) if otherctx else readfile(otherfile) + localtext = readfile(local) + basetext = readfile(base) + othertext = readfile(other) except error.Abort: return 1 - if opts.get('print'): - out = ui.fout - elif localctx: - out = ctxwriter(localctx) + local = os.path.realpath(local) + if not opts.get('print'): + opener = vfsmod.vfs(os.path.dirname(local)) + out = opener(os.path.basename(local), "w", atomictemp=True) else: - localfile = os.path.realpath(localfile) - opener = vfsmod.vfs(os.path.dirname(localfile)) - out = opener(os.path.basename(localfile), "w", atomictemp=True) + out = ui.fout m3 = Merge3Text(basetext, localtext, othertext) extrakwargs = { diff -Nru mercurial-4.3.1+207-xenial/mercurial/sparse.py mercurial-4.3.1/mercurial/sparse.py --- mercurial-4.3.1+207-xenial/mercurial/sparse.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/sparse.py 2017-09-10 00:05:18.000000000 +0000 @@ -17,7 +17,6 @@ error, match as matchmod, merge as mergemod, - pathutil, pycompat, scmutil, util, @@ -617,7 +616,7 @@ def updateconfig(repo, pats, opts, include=False, exclude=False, reset=False, delete=False, enableprofile=False, disableprofile=False, - force=False, usereporootpaths=False): + force=False): """Perform a sparse config update. Only one of the actions may be performed. @@ -637,24 +636,10 @@ newexclude = set(oldexclude) newprofiles = set(oldprofiles) - if any(os.path.isabs(pat) for pat in pats): - raise error.Abort(_('paths cannot be absolute')) - - if not usereporootpaths: - # let's treat paths as relative to cwd - root, cwd = repo.root, repo.getcwd() - abspats = [] - for kindpat in pats: - kind, pat = matchmod._patsplit(kindpat, None) - if kind in matchmod.cwdrelativepatternkinds or kind is None: - ap = (kind + ':' if kind else '') +\ - pathutil.canonpath(root, cwd, pat) - abspats.append(ap) - else: - abspats.append(kindpat) - pats = abspats - - if include: + if any(pat.startswith('/') for pat in pats): + repo.ui.warn(_('warning: paths cannot start with /, ignoring: %s\n') + % ([pat for pat in pats if pat.startswith('/')])) + elif include: newinclude.update(pats) elif exclude: newexclude.update(pats) diff -Nru mercurial-4.3.1+207-xenial/mercurial/sshpeer.py mercurial-4.3.1/mercurial/sshpeer.py --- mercurial-4.3.1+207-xenial/mercurial/sshpeer.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/sshpeer.py 2017-09-10 00:05:18.000000000 +0000 @@ -17,6 +17,21 @@ wireproto, ) +class remotelock(object): + def __init__(self, repo): + self.repo = repo + def release(self): + self.repo.unlock() + self.repo = None + def __enter__(self): + return self + def __exit__(self, exc_type, exc_val, exc_tb): + if self.repo: + self.release() + def __del__(self): + if self.repo: + self.release() + def _serverquote(s): if not s: return s @@ -117,8 +132,8 @@ class sshpeer(wireproto.wirepeer): def __init__(self, ui, path, create=False): self._url = path - self._ui = ui - self._pipeo = self._pipei = self._pipee = None + self.ui = ui + self.pipeo = self.pipei = self.pipee = None u = util.url(path, parsequery=False, parsefragment=False) if u.scheme != 'ssh' or not u.host or u.path is None: @@ -126,23 +141,22 @@ util.checksafessh(path) + self.user = u.user if u.passwd is not None: self._abort(error.RepoError(_("password in URL not supported"))) - - self._user = u.user - self._host = u.host - self._port = u.port - self._path = u.path or '.' + self.host = u.host + self.port = u.port + self.path = u.path or "." sshcmd = self.ui.config("ui", "ssh") remotecmd = self.ui.config("ui", "remotecmd") - args = util.sshargs(sshcmd, self._host, self._user, self._port) + args = util.sshargs(sshcmd, self.host, self.user, self.port) if create: cmd = '%s %s %s' % (sshcmd, args, util.shellquote("%s init %s" % - (_serverquote(remotecmd), _serverquote(self._path)))) + (_serverquote(remotecmd), _serverquote(self.path)))) ui.debug('running %s\n' % cmd) res = ui.system(cmd, blockedtag='sshpeer') if res != 0: @@ -150,58 +164,31 @@ self._validaterepo(sshcmd, args, remotecmd) - # Begin of _basepeer interface. - - @util.propertycache - def ui(self): - return self._ui - def url(self): return self._url - def local(self): - return None - - def peer(self): - return self - - def canpush(self): - return True - - def close(self): - pass - - # End of _basepeer interface. - - # Begin of _basewirecommands interface. - - def capabilities(self): - return self._caps - - # End of _basewirecommands interface. - def _validaterepo(self, sshcmd, args, remotecmd): # cleanup up previous run - self._cleanup() + self.cleanup() cmd = '%s %s %s' % (sshcmd, args, util.shellquote("%s -R %s serve --stdio" % - (_serverquote(remotecmd), _serverquote(self._path)))) + (_serverquote(remotecmd), _serverquote(self.path)))) self.ui.debug('running %s\n' % cmd) cmd = util.quotecommand(cmd) - # while self._subprocess isn't used, having it allows the subprocess to + # while self.subprocess isn't used, having it allows the subprocess to # to clean up correctly later # # no buffer allow the use of 'select' # feel free to remove buffering and select usage when we ultimately # move to threading. sub = util.popen4(cmd, bufsize=0) - self._pipeo, self._pipei, self._pipee, self._subprocess = sub + self.pipeo, self.pipei, self.pipee, self.subprocess = sub - self._pipei = util.bufferedinputpipe(self._pipei) - self._pipei = doublepipe(self.ui, self._pipei, self._pipee) - self._pipeo = doublepipe(self.ui, self._pipeo, self._pipee) + self.pipei = util.bufferedinputpipe(self.pipei) + self.pipei = doublepipe(self.ui, self.pipei, self.pipee) + self.pipeo = doublepipe(self.ui, self.pipeo, self.pipee) # skip any noise generated by remote shell self._callstream("hello") @@ -210,7 +197,7 @@ max_noise = 500 while lines[-1] and max_noise: l = r.readline() - self._readerr() + self.readerr() if lines[-1] == "1\n" and l == "\n": break if l: @@ -227,27 +214,30 @@ self._caps.update(l[:-1].split(":")[1].split()) break - def _readerr(self): - _forwardoutput(self.ui, self._pipee) + def _capabilities(self): + return self._caps + + def readerr(self): + _forwardoutput(self.ui, self.pipee) def _abort(self, exception): - self._cleanup() + self.cleanup() raise exception - def _cleanup(self): - if self._pipeo is None: + def cleanup(self): + if self.pipeo is None: return - self._pipeo.close() - self._pipei.close() + self.pipeo.close() + self.pipei.close() try: # read the error descriptor until EOF - for l in self._pipee: + for l in self.pipee: self.ui.status(_("remote: "), l) except (IOError, ValueError): pass - self._pipee.close() + self.pipee.close() - __del__ = _cleanup + __del__ = cleanup def _submitbatch(self, req): rsp = self._callstream("batch", cmds=wireproto.encodebatchcmds(req)) @@ -271,7 +261,7 @@ def _callstream(self, cmd, **args): args = pycompat.byteskwargs(args) self.ui.debug("sending %s command\n" % cmd) - self._pipeo.write("%s\n" % cmd) + self.pipeo.write("%s\n" % cmd) _func, names = wireproto.commands[cmd] keys = names.split() wireargs = {} @@ -283,16 +273,16 @@ wireargs[k] = args[k] del args[k] for k, v in sorted(wireargs.iteritems()): - self._pipeo.write("%s %d\n" % (k, len(v))) + self.pipeo.write("%s %d\n" % (k, len(v))) if isinstance(v, dict): for dk, dv in v.iteritems(): - self._pipeo.write("%s %d\n" % (dk, len(dv))) - self._pipeo.write(dv) + self.pipeo.write("%s %d\n" % (dk, len(dv))) + self.pipeo.write(dv) else: - self._pipeo.write(v) - self._pipeo.flush() + self.pipeo.write(v) + self.pipeo.flush() - return self._pipei + return self.pipei def _callcompressable(self, cmd, **args): return self._callstream(cmd, **args) @@ -321,29 +311,58 @@ for d in iter(lambda: fp.read(4096), ''): self._send(d) self._send("", flush=True) - return self._pipei + return self.pipei def _getamount(self): - l = self._pipei.readline() + l = self.pipei.readline() if l == '\n': - self._readerr() + self.readerr() msg = _('check previous remote output') self._abort(error.OutOfBandError(hint=msg)) - self._readerr() + self.readerr() try: return int(l) except ValueError: self._abort(error.ResponseError(_("unexpected response:"), l)) def _recv(self): - return self._pipei.read(self._getamount()) + return self.pipei.read(self._getamount()) def _send(self, data, flush=False): - self._pipeo.write("%d\n" % len(data)) + self.pipeo.write("%d\n" % len(data)) if data: - self._pipeo.write(data) + self.pipeo.write(data) if flush: - self._pipeo.flush() - self._readerr() + self.pipeo.flush() + self.readerr() + + def lock(self): + self._call("lock") + return remotelock(self) + + def unlock(self): + self._call("unlock") + + def addchangegroup(self, cg, source, url, lock=None): + '''Send a changegroup to the remote server. Return an integer + similar to unbundle(). DEPRECATED, since it requires locking the + remote.''' + d = self._call("addchangegroup") + if d: + self._abort(error.RepoError(_("push refused: %s") % d)) + for d in iter(lambda: cg.read(4096), ''): + self.pipeo.write(d) + self.readerr() + + self.pipeo.flush() + + self.readerr() + r = self._recv() + if not r: + return 1 + try: + return int(r) + except ValueError: + self._abort(error.ResponseError(_("unexpected response:"), r)) instance = sshpeer diff -Nru mercurial-4.3.1+207-xenial/mercurial/templatekw.py mercurial-4.3.1/mercurial/templatekw.py --- mercurial-4.3.1+207-xenial/mercurial/templatekw.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/templatekw.py 2017-09-10 00:05:18.000000000 +0000 @@ -208,22 +208,10 @@ latesttags[rev] = ctx.date()[0], 0, [t for t in sorted(tags)] continue try: - ptags = [latesttags[p.rev()] for p in ctx.parents()] - if len(ptags) > 1: - if ptags[0][2] == ptags[1][2]: - # The tuples are laid out so the right one can be found by - # comparison in this case. - pdate, pdist, ptag = max(ptags) - else: - def key(x): - changessincetag = len(repo.revs('only(%d, %s)', - ctx.rev(), x[2][0])) - # Smallest number of changes since tag wins. Date is - # used as tiebreaker. - return [-changessincetag, x[0]] - pdate, pdist, ptag = max(ptags, key=key) - else: - pdate, pdist, ptag = ptags[0] + # The tuples are laid out so the right one can be found by + # comparison. + pdate, pdist, ptag = max( + latesttags[p.rev()] for p in ctx.parents()) except KeyError: # Cache miss - recurse todo.append(rev) @@ -481,13 +469,6 @@ else: return 'o' -@templatekeyword('graphwidth') -def showgraphwidth(repo, ctx, templ, **args): - """Integer. The width of the graph drawn by 'log --graph' or zero.""" - # The value args['graphwidth'] will be this function, so we use an internal - # name to pass the value through props into this function. - return args.get('_graphwidth', 0) - @templatekeyword('index') def showindex(**args): """Integer. The current iteration of the loop. (0 indexed)""" @@ -779,31 +760,18 @@ keywords[name] = func @templatekeyword('termwidth') -def showtermwidth(repo, ctx, templ, **args): +def termwidth(repo, ctx, templ, **args): """Integer. The width of the current terminal.""" return repo.ui.termwidth() @templatekeyword('troubles') -def showtroubles(repo, **args): +def showtroubles(**args): """List of strings. Evolution troubles affecting the changeset. - (DEPRECATED) - """ - msg = ("'troubles' is deprecated, " - "use 'instabilities'") - repo.ui.deprecwarn(msg, '4.4') - - return showinstabilities(repo=repo, **args) - -@templatekeyword('instabilities') -def showinstabilities(**args): - """List of strings. Evolution instabilities affecting the changeset. - (EXPERIMENTAL) """ args = pycompat.byteskwargs(args) - return showlist('instability', args['ctx'].instabilities(), args, - plural='instabilities') + return showlist('trouble', args['ctx'].troubles(), args) # tell hggettext to extract docstrings from these functions: i18nfunctions = keywords.values() diff -Nru mercurial-4.3.1+207-xenial/mercurial/templates/map-cmdline.default mercurial-4.3.1/mercurial/templates/map-cmdline.default --- mercurial-4.3.1+207-xenial/mercurial/templates/map-cmdline.default 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/templates/map-cmdline.default 2017-09-10 00:05:18.000000000 +0000 @@ -28,8 +28,8 @@ % ' {name} ({source})'}\n"))}' # General templates -_instability_label = 'instability.{instability}' -_troubles_labels = '{if(instabilities, "changeset.unstable {instabilities%_instability_label}")}' +_trouble_label = 'trouble.{trouble}' +_troubles_labels = '{if(troubles, "changeset.troubled {troubles%_trouble_label}")}' _obsolete_label = '{if(obsolete, "changeset.obsolete")}' _cset_labels = '{separate(" ", "log.changeset", "changeset.{phase}", "{_obsolete_label}", "{_troubles_labels}")}' cset = '{label("{_cset_labels}", @@ -68,8 +68,8 @@ ldate = '{label("log.date", "date: {date|date}")}\n' -ltroubles = '{if(instabilities, "{label('log.instability', - 'instability: {join(instabilities, ", ")}')}\n")}' +ltroubles = '{if(troubles, "{label('log.trouble', + 'trouble: {join(troubles, ", ")}')}\n")}' extra = '{label("ui.debug log.extra", "extra: {key}={value|stringescape}")}\n' diff -Nru mercurial-4.3.1+207-xenial/mercurial/transaction.py mercurial-4.3.1/mercurial/transaction.py --- mercurial-4.3.1+207-xenial/mercurial/transaction.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/transaction.py 2017-09-10 00:05:18.000000000 +0000 @@ -101,7 +101,7 @@ # only pure backup file remains, it is sage to ignore any error pass -class transaction(util.transactional): +class transaction(object): def __init__(self, report, opener, vfsmap, journalname, undoname=None, after=None, createmode=None, validator=None, releasefn=None, checkambigfiles=None): @@ -376,6 +376,16 @@ if self.count > 0 and self.usages == 0: self._abort() + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + try: + if exc_type is None: + self.close() + finally: + self.release() + def running(self): return self.count > 0 diff -Nru mercurial-4.3.1+207-xenial/mercurial/ui.py mercurial-4.3.1/mercurial/ui.py --- mercurial-4.3.1+207-xenial/mercurial/ui.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/ui.py 2017-09-10 00:05:18.000000000 +0000 @@ -60,7 +60,7 @@ samplehgrcs = { 'user': -b"""# example user config (see 'hg help config' for more info) +"""# example user config (see 'hg help config' for more info) [ui] # name and email, e.g. # username = Jane Doe @@ -82,7 +82,7 @@ """, 'cloned': -b"""# example repository config (see 'hg help config' for more info) +"""# example repository config (see 'hg help config' for more info) [paths] default = %s @@ -99,7 +99,7 @@ """, 'local': -b"""# example repository config (see 'hg help config' for more info) +"""# example repository config (see 'hg help config' for more info) [paths] # path aliases to other clones of this repo in URLs or filesystem paths # (see 'hg help config.paths' for more info) @@ -115,7 +115,7 @@ """, 'global': -b"""# example system-wide hg config (see 'hg help config' for more info) +"""# example system-wide hg config (see 'hg help config' for more info) [ui] # uncomment to disable color in command output @@ -904,8 +904,7 @@ if not getattr(self.ferr, 'closed', False): self.ferr.flush() except IOError as inst: - if inst.errno not in (errno.EPIPE, errno.EIO, errno.EBADF): - raise error.StdioError(inst) + raise error.StdioError(inst) def flush(self): # opencode timeblockedsection because this is a critical path @@ -914,14 +913,12 @@ try: self.fout.flush() except IOError as err: - if err.errno not in (errno.EPIPE, errno.EIO, errno.EBADF): - raise error.StdioError(err) + raise error.StdioError(err) finally: try: self.ferr.flush() except IOError as err: - if err.errno not in (errno.EPIPE, errno.EIO, errno.EBADF): - raise error.StdioError(err) + raise error.StdioError(err) finally: self._blockedtimes['stdio_blocked'] += \ (util.timer() - starttime) * 1000 @@ -1220,10 +1217,18 @@ self.write(prompt, prompt=True) self.flush() + # instead of trying to emulate raw_input, swap (self.fin, + # self.fout) with (sys.stdin, sys.stdout) + oldin = sys.stdin + oldout = sys.stdout + sys.stdin = self.fin + sys.stdout = self.fout # prompt ' ' must exist; otherwise readline may delete entire line # - http://bugs.python.org/issue12833 with self.timeblockedsection('stdio'): - line = util.bytesinput(self.fin, self.fout, r' ') + line = raw_input(' ') + sys.stdin = oldin + sys.stdout = oldout # When stdin is in binary mode on Windows, it can cause # raw_input() to emit an extra trailing carriage return @@ -1271,10 +1276,9 @@ m = re.match(br'(?s)(.+?)\$\$([^\$]*&[^ \$].*)', prompt) msg = m.group(1) choices = [p.strip(' ') for p in m.group(2).split('$$')] - def choicetuple(s): - ampidx = s.index('&') - return s[ampidx + 1:ampidx + 2].lower(), s.replace('&', '', 1) - return (msg, [choicetuple(s) for s in choices]) + return (msg, + [(s[s.index('&') + 1].lower(), s.replace('&', '', 1)) + for s in choices]) def promptchoice(self, prompt, default=0): """Prompt user with a message, read response, and ensure it matches diff -Nru mercurial-4.3.1+207-xenial/mercurial/util.py mercurial-4.3.1/mercurial/util.py --- mercurial-4.3.1+207-xenial/mercurial/util.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/util.py 2017-09-10 00:05:18.000000000 +0000 @@ -15,7 +15,6 @@ from __future__ import absolute_import -import abc import bz2 import calendar import codecs @@ -172,14 +171,6 @@ def safehasattr(thing, attr): return getattr(thing, attr, _notset) is not _notset -def bytesinput(fin, fout, *args, **kwargs): - sin, sout = sys.stdin, sys.stdout - try: - sys.stdin, sys.stdout = encoding.strio(fin), encoding.strio(fout) - return encoding.strtolocal(pycompat.rawinput(*args, **kwargs)) - finally: - sys.stdin, sys.stdout = sin, sout - def bitsfrom(container): bits = 0 for bit in container: @@ -601,31 +592,6 @@ for k, v in src: self[k] = v -class transactional(object): - """Base class for making a transactional type into a context manager.""" - __metaclass__ = abc.ABCMeta - - @abc.abstractmethod - def close(self): - """Successfully closes the transaction.""" - - @abc.abstractmethod - def release(self): - """Marks the end of the transaction. - - If the transaction has not been closed, it will be aborted. - """ - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - try: - if exc_type is None: - self.close() - finally: - self.release() - @contextlib.contextmanager def acceptintervention(tr=None): """A context manager that closes the transaction on InterventionRequired @@ -644,10 +610,6 @@ finally: tr.release() -@contextlib.contextmanager -def nullcontextmanager(): - yield - class _lrucachenode(object): """A node in a doubly linked list. @@ -972,9 +934,10 @@ into. As a workaround, disable GC while building complex (huge) containers. - This garbage collector issue have been fixed in 2.7. But it still affect - CPython's performance. + This garbage collector issue have been fixed in 2.7. """ + if sys.version_info >= (2, 7): + return func def wrapper(*args, **kwargs): gcenabled = gc.isenabled() gc.disable() @@ -985,10 +948,6 @@ gc.enable() return wrapper -if pycompat.ispypy: - # PyPy runs slower with gc disabled - nogc = lambda x: x - def pathto(root, n1, n2): '''return the relative path from one place to another. root should use os.sep to separate directories @@ -2313,15 +2272,6 @@ def unescapestr(s): return codecs.escape_decode(s)[0] -def forcebytestr(obj): - """Portably format an arbitrary object (e.g. exception) into a byte - string.""" - try: - return pycompat.bytestr(obj) - except UnicodeEncodeError: - # non-ascii string, may be lossy - return pycompat.bytestr(encoding.strtolocal(str(obj))) - def uirepr(s): # Avoid double backslash in Windows path repr() return repr(s).replace('\\\\', '\\') @@ -3760,14 +3710,10 @@ value = docobject() value.__doc__ = doc - value._origdoc = engine.bundletype.__doc__ - value._origfunc = engine.bundletype items[bt[0]] = value return items -i18nfunctions = bundlecompressiontopics().values() - # convenient shortcut dst = debugstacktrace diff -Nru mercurial-4.3.1+207-xenial/mercurial/wireproto.py mercurial-4.3.1/mercurial/wireproto.py --- mercurial-4.3.1+207-xenial/mercurial/wireproto.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/mercurial/wireproto.py 2017-09-10 00:05:18.000000000 +0000 @@ -8,6 +8,7 @@ from __future__ import absolute_import import hashlib +import itertools import os import tempfile @@ -27,7 +28,6 @@ peer, pushkey as pushkeymod, pycompat, - repository, streamclone, util, ) @@ -80,19 +80,49 @@ # """ # raise NotImplementedError() +class remotebatch(peer.batcher): + '''batches the queued calls; uses as few roundtrips as possible''' + def __init__(self, remote): + '''remote must support _submitbatch(encbatch) and + _submitone(op, encargs)''' + peer.batcher.__init__(self) + self.remote = remote + def submit(self): + req, rsp = [], [] + for name, args, opts, resref in self.calls: + mtd = getattr(self.remote, name) + batchablefn = getattr(mtd, 'batchable', None) + if batchablefn is not None: + batchable = batchablefn(mtd.im_self, *args, **opts) + encargsorres, encresref = next(batchable) + if encresref: + req.append((name, encargsorres,)) + rsp.append((batchable, encresref, resref,)) + else: + resref.set(encargsorres) + else: + if req: + self._submitreq(req, rsp) + req, rsp = [], [] + resref.set(mtd(*args, **opts)) + if req: + self._submitreq(req, rsp) + def _submitreq(self, req, rsp): + encresults = self.remote._submitbatch(req) + for encres, r in zip(encresults, rsp): + batchable, encresref, resref = r + encresref.set(encres) + resref.set(next(batchable)) + class remoteiterbatcher(peer.iterbatcher): def __init__(self, remote): super(remoteiterbatcher, self).__init__() self._remote = remote def __getattr__(self, name): - # Validate this method is batchable, since submit() only supports - # batchable methods. - fn = getattr(self._remote, name) - if not getattr(fn, 'batchable', None): - raise error.ProgrammingError('Attempted to batch a non-batchable ' - 'call to %r' % name) - + if not getattr(self._remote, name, False): + raise AttributeError( + 'Attempted to iterbatch non-batchable call to %r' % name) return super(remoteiterbatcher, self).__getattr__(name) def submit(self): @@ -101,47 +131,23 @@ This is mostly valuable over http where request sizes can be limited, but can be used in other places as well. """ - # 2-tuple of (command, arguments) that represents what will be - # sent over the wire. - requests = [] - - # 4-tuple of (command, final future, @batchable generator, remote - # future). - results = [] - - for command, args, opts, finalfuture in self.calls: - mtd = getattr(self._remote, command) + req, rsp = [], [] + for name, args, opts, resref in self.calls: + mtd = getattr(self._remote, name) batchable = mtd.batchable(mtd.im_self, *args, **opts) - - commandargs, fremote = next(batchable) - assert fremote - requests.append((command, commandargs)) - results.append((command, finalfuture, batchable, fremote)) - - if requests: - self._resultiter = self._remote._submitbatch(requests) - - self._results = results + encargsorres, encresref = next(batchable) + assert encresref + req.append((name, encargsorres)) + rsp.append((batchable, encresref)) + if req: + self._resultiter = self._remote._submitbatch(req) + self._rsp = rsp def results(self): - for command, finalfuture, batchable, remotefuture in self._results: - # Get the raw result, set it in the remote future, feed it - # back into the @batchable generator so it can be decoded, and - # set the result on the final future to this value. - remoteresult = next(self._resultiter) - remotefuture.set(remoteresult) - finalfuture.set(next(batchable)) - - # Verify our @batchable generators only emit 2 values. - try: - next(batchable) - except StopIteration: - pass - else: - raise error.ProgrammingError('%s @batchable generator emitted ' - 'unexpected value count' % command) - - yield finalfuture.value + for (batchable, encresref), encres in itertools.izip( + self._rsp, self._resultiter): + encresref.set(encres) + yield next(batchable) # Forward a couple of names from peer to make wireproto interactions # slightly more sensible. @@ -213,7 +219,7 @@ # client side -class wirepeer(repository.legacypeer): +class wirepeer(peer.peerrepository): """Client-side interface for communicating with a peer repository. Methods commonly call wire protocol commands of the same name. @@ -221,7 +227,33 @@ See also httppeer.py and sshpeer.py for protocol-specific implementations of this interface. """ - # Begin of basewirepeer interface. + def batch(self): + if self.capable('batch'): + return remotebatch(self) + else: + return peer.localbatch(self) + def _submitbatch(self, req): + """run batch request on the server + + Returns an iterator of the raw responses from the server. + """ + rsp = self._callstream("batch", cmds=encodebatchcmds(req)) + chunk = rsp.read(1024) + work = [chunk] + while chunk: + while ';' not in chunk and chunk: + chunk = rsp.read(1024) + work.append(chunk) + merged = ''.join(work) + while ';' in merged: + one, merged = merged.split(';', 1) + yield unescapearg(one) + chunk = rsp.read(1024) + work = [merged, chunk] + yield unescapearg(''.join(work)) + + def _submitone(self, op, args): + return self._call(op, **args) def iterbatch(self): return remoteiterbatcher(self) @@ -273,17 +305,26 @@ except TypeError: self._abort(error.ResponseError(_("unexpected response:"), d)) - @batchable - def listkeys(self, namespace): - if not self.capable('pushkey'): - yield {}, None - f = future() - self.ui.debug('preparing listkeys for "%s"\n' % namespace) - yield {'namespace': encoding.fromlocal(namespace)}, f - d = f.value - self.ui.debug('received listkey for "%s": %i bytes\n' - % (namespace, len(d))) - yield pushkeymod.decodekeys(d) + def branches(self, nodes): + n = encodelist(nodes) + d = self._call("branches", nodes=n) + try: + br = [tuple(decodelist(b)) for b in d.splitlines()] + return br + except ValueError: + self._abort(error.ResponseError(_("unexpected response:"), d)) + + def between(self, pairs): + batch = 8 # avoid giant requests + r = [] + for i in xrange(0, len(pairs), batch): + n = " ".join([encodelist(p, '-') for p in pairs[i:i + batch]]) + d = self._call("between", pairs=n) + try: + r.extend(l and decodelist(l) or [] for l in d.splitlines()) + except ValueError: + self._abort(error.ResponseError(_("unexpected response:"), d)) + return r @batchable def pushkey(self, namespace, key, old, new): @@ -306,9 +347,34 @@ self.ui.status(_('remote: '), l) yield d + @batchable + def listkeys(self, namespace): + if not self.capable('pushkey'): + yield {}, None + f = future() + self.ui.debug('preparing listkeys for "%s"\n' % namespace) + yield {'namespace': encoding.fromlocal(namespace)}, f + d = f.value + self.ui.debug('received listkey for "%s": %i bytes\n' + % (namespace, len(d))) + yield pushkeymod.decodekeys(d) + def stream_out(self): return self._callstream('stream_out') + def changegroup(self, nodes, kind): + n = encodelist(nodes) + f = self._callcompressable("changegroup", roots=n) + return changegroupmod.cg1unpacker(f, 'UN') + + def changegroupsubset(self, bases, heads, kind): + self.requirecap('changegroupsubset', _('look up remote changes')) + bases = encodelist(bases) + heads = encodelist(heads) + f = self._callcompressable("changegroupsubset", + bases=bases, heads=heads) + return changegroupmod.cg1unpacker(f, 'UN') + def getbundle(self, source, **kwargs): self.requirecap('getbundle', _('look up remote changes')) opts = {} @@ -379,69 +445,6 @@ ret = bundle2.getunbundler(self.ui, stream) return ret - # End of basewirepeer interface. - - # Begin of baselegacywirepeer interface. - - def branches(self, nodes): - n = encodelist(nodes) - d = self._call("branches", nodes=n) - try: - br = [tuple(decodelist(b)) for b in d.splitlines()] - return br - except ValueError: - self._abort(error.ResponseError(_("unexpected response:"), d)) - - def between(self, pairs): - batch = 8 # avoid giant requests - r = [] - for i in xrange(0, len(pairs), batch): - n = " ".join([encodelist(p, '-') for p in pairs[i:i + batch]]) - d = self._call("between", pairs=n) - try: - r.extend(l and decodelist(l) or [] for l in d.splitlines()) - except ValueError: - self._abort(error.ResponseError(_("unexpected response:"), d)) - return r - - def changegroup(self, nodes, kind): - n = encodelist(nodes) - f = self._callcompressable("changegroup", roots=n) - return changegroupmod.cg1unpacker(f, 'UN') - - def changegroupsubset(self, bases, heads, kind): - self.requirecap('changegroupsubset', _('look up remote changes')) - bases = encodelist(bases) - heads = encodelist(heads) - f = self._callcompressable("changegroupsubset", - bases=bases, heads=heads) - return changegroupmod.cg1unpacker(f, 'UN') - - # End of baselegacywirepeer interface. - - def _submitbatch(self, req): - """run batch request on the server - - Returns an iterator of the raw responses from the server. - """ - rsp = self._callstream("batch", cmds=encodebatchcmds(req)) - chunk = rsp.read(1024) - work = [chunk] - while chunk: - while ';' not in chunk and chunk: - chunk = rsp.read(1024) - work.append(chunk) - merged = ''.join(work) - while ';' in merged: - one, merged = merged.split(';', 1) - yield unescapearg(one) - chunk = rsp.read(1024) - work = [merged, chunk] - yield unescapearg(''.join(work)) - - def _submitone(self, op, args): - return self._call(op, **args) - def debugwireargs(self, one, two, three=None, four=None, five=None): # don't pass optional arguments left at their default value opts = {} diff -Nru mercurial-4.3.1+207-xenial/setup.py mercurial-4.3.1/setup.py --- mercurial-4.3.1+207-xenial/setup.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/setup.py 2017-09-10 00:26:03.000000000 +0000 @@ -320,7 +320,7 @@ if version: with open("mercurial/__version__.py", "w") as f: f.write('# this file is autogenerated by setup.py\n') - f.write('version = "%s"\n' % version) + f.write('version = "%s"\n' % "4.3.1") try: oldpolicy = os.environ.get('HGMODULEPOLICY', None) @@ -760,14 +760,13 @@ 'mercurial/cext/mpatch.c'], include_dirs=common_include_dirs, depends=common_depends), - Extension('mercurial.cext.parsers', ['mercurial/cext/charencode.c', - 'mercurial/cext/dirs.c', + Extension('mercurial.cext.parsers', ['mercurial/cext/dirs.c', 'mercurial/cext/manifest.c', 'mercurial/cext/parsers.c', 'mercurial/cext/pathencode.c', 'mercurial/cext/revlog.c'], include_dirs=common_include_dirs, - depends=common_depends + ['mercurial/cext/charencode.h']), + depends=common_depends), Extension('mercurial.cext.osutil', ['mercurial/cext/osutil.c'], include_dirs=common_include_dirs, extra_compile_args=osutil_cflags, @@ -785,11 +784,11 @@ from distutils import cygwinccompiler # the -mno-cygwin option has been deprecated for years - mingw32compilerclass = cygwinccompiler.Mingw32CCompiler + compiler = cygwinccompiler.Mingw32CCompiler class HackedMingw32CCompiler(cygwinccompiler.Mingw32CCompiler): def __init__(self, *args, **kwargs): - mingw32compilerclass.__init__(self, *args, **kwargs) + compiler.__init__(self, *args, **kwargs) for i in 'compiler compiler_so linker_exe linker_so'.split(): try: getattr(self, i).remove('-mno-cygwin') @@ -810,11 +809,11 @@ # effect. from distutils import msvccompiler - msvccompilerclass = msvccompiler.MSVCCompiler + compiler = msvccompiler.MSVCCompiler class HackedMSVCCompiler(msvccompiler.MSVCCompiler): def initialize(self): - msvccompilerclass.initialize(self) + compiler.initialize(self) # "warning LNK4197: export 'func' specified multiple times" self.ldflags_shared.append('/ignore:4197') self.ldflags_shared_debug.append('/ignore:4197') diff -Nru mercurial-4.3.1+207-xenial/tests/bruterebase.py mercurial-4.3.1/tests/bruterebase.py --- mercurial-4.3.1+207-xenial/tests/bruterebase.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/bruterebase.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -# bruterebase.py - brute force rebase testing -# -# Copyright 2017 Facebook, Inc. -# -# 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 mercurial import ( - error, - registrar, - revsetlang, -) - -from hgext import rebase - -cmdtable = {} -command = registrar.command(cmdtable) - -@command('debugbruterebase') -def debugbruterebase(ui, repo, source, dest): - """for every non-empty subset of source, run rebase -r subset -d dest - - Print one line summary for each subset. Assume obsstore is enabled. - """ - srevs = list(repo.revs(source)) - - with repo.wlock(), repo.lock(): - repolen = len(repo) - cl = repo.changelog - - def getdesc(rev): - result = cl.changelogrevision(rev).description - if rev >= repolen: - result += "'" - return result - - for i in xrange(1, 2 ** len(srevs)): - subset = [rev for j, rev in enumerate(srevs) if i & (1 << j) != 0] - spec = revsetlang.formatspec('%ld', subset) - tr = repo.transaction('rebase') - tr.report = lambda x: 0 # hide "transaction abort" - - ui.pushbuffer() - try: - rebase.rebase(ui, repo, dest=dest, rev=[spec]) - except error.Abort as ex: - summary = 'ABORT: %s' % ex - except Exception as ex: - summary = 'CRASH: %s' % ex - else: - # short summary about new nodes - cl = repo.changelog - descs = [] - for rev in xrange(repolen, len(repo)): - desc = '%s:' % getdesc(rev) - for prev in cl.parentrevs(rev): - if prev > -1: - desc += getdesc(prev) - descs.append(desc) - descs.sort() - summary = ' '.join(descs) - ui.popbuffer() - repo.vfs.tryunlink('rebasestate') - - subsetdesc = ''.join(getdesc(rev) for rev in subset) - ui.write(('%s: %s\n') % (subsetdesc.rjust(len(srevs)), summary)) - tr.abort() diff -Nru mercurial-4.3.1+207-xenial/tests/drawdag.py mercurial-4.3.1/tests/drawdag.py --- mercurial-4.3.1+207-xenial/tests/drawdag.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/drawdag.py 2017-09-10 00:05:18.000000000 +0000 @@ -84,7 +84,6 @@ import collections import itertools -import re from mercurial.i18n import _ from mercurial import ( @@ -276,12 +275,6 @@ if leaf in v: v.remove(leaf) -def _getcomments(text): - for line in text.splitlines(): - if ' # ' not in line: - continue - yield line.split(' # ', 1)[1].split(' # ')[0].strip() - @command('debugdrawdag', []) def debugdrawdag(ui, repo, **opts): """read an ASCII graph from stdin and create changesets @@ -308,13 +301,6 @@ raise error.Abort(_('%s: too many parents: %s') % (k, ' '.join(v))) - # parse comments to get extra file content instructions - files = collections.defaultdict(dict) # {(name, path): content} - comments = list(_getcomments(text)) - filere = re.compile(r'^(\w+)/([\w/]+)\s*=\s*(.*)$', re.M) - for name, path, content in filere.findall('\n'.join(comments)): - files[name][path] = content.replace(r'\n', '\n') - committed = {None: node.nullid} # {name: node} # for leaf nodes, try to find existing nodes in repo @@ -340,9 +326,6 @@ else: # If it's not a merge, add a single file added[name] = name - # add extra file contents in comments - for path, content in files.get(name, {}).items(): - added[path] = content ctx = simplecommitctx(repo, name, pctxs, added) n = ctx.commit() committed[name] = n @@ -352,8 +335,12 @@ # handle special comments with repo.wlock(), repo.lock(), repo.transaction('drawdag'): getctx = lambda x: repo.unfiltered()[committed[x.strip()]] - for comment in comments: + for line in text.splitlines(): + if ' # ' not in line: + continue + rels = [] # obsolete relationships + comment = line.split(' # ', 1)[1].split(' # ')[0].strip() args = comment.split(':', 1) if len(args) <= 1: continue diff -Nru mercurial-4.3.1+207-xenial/tests/hghave.py mercurial-4.3.1/tests/hghave.py --- mercurial-4.3.1+207-xenial/tests/hghave.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/hghave.py 2017-09-10 00:05:18.000000000 +0000 @@ -652,12 +652,3 @@ @check("fsmonitor", "running tests with fsmonitor") def has_fsmonitor(): return 'HGFSMONITOR_TESTS' in os.environ - -@check("fuzzywuzzy", "Fuzzy string matching library") -def has_fuzzywuzzy(): - try: - import fuzzywuzzy - fuzzywuzzy.__version__ - return True - except ImportError: - return False diff -Nru mercurial-4.3.1+207-xenial/tests/notcapable mercurial-4.3.1/tests/notcapable --- mercurial-4.3.1+207-xenial/tests/notcapable 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/notcapable 2017-09-10 00:05:18.000000000 +0000 @@ -6,9 +6,9 @@ fi cat > notcapable-$CAP.py << EOF -from mercurial import extensions, localrepo, repository +from mercurial import extensions, peer, localrepo def extsetup(): - extensions.wrapfunction(repository.peer, 'capable', wrapcapable) + extensions.wrapfunction(peer.peerrepository, 'capable', wrapcapable) extensions.wrapfunction(localrepo.localrepository, 'peer', wrappeer) def wrapcapable(orig, self, name, *args, **kwargs): if name in '$CAP'.split(' '): diff -Nru mercurial-4.3.1+207-xenial/tests/run-tests.py mercurial-4.3.1/tests/run-tests.py --- mercurial-4.3.1+207-xenial/tests/run-tests.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/run-tests.py 2017-09-10 00:05:18.000000000 +0000 @@ -94,59 +94,20 @@ try: # is pygments installed import pygments import pygments.lexers as lexers - import pygments.lexer as lexer import pygments.formatters as formatters - import pygments.token as token - import pygments.style as style pygmentspresent = True difflexer = lexers.DiffLexer() terminal256formatter = formatters.Terminal256Formatter() except ImportError: pass -if pygmentspresent: - class TestRunnerStyle(style.Style): - default_style = "" - skipped = token.string_to_tokentype("Token.Generic.Skipped") - failed = token.string_to_tokentype("Token.Generic.Failed") - error = token.string_to_tokentype("Token.Generic.Error") - skippedname = token.string_to_tokentype("Token.Generic.SName") - failedname = token.string_to_tokentype("Token.Generic.FName") - styles = { - skipped: '#e5e5e5', - skippedname: '#00ffff', - failed: '#7f0000', - failedname: '#ff0000', - } - - class TestRunnerLexer(lexer.RegexLexer): - tokens = { - 'root': [ - (r'^Skipped', token.Generic.Skipped, 'skipped'), - (r'^Failed ', token.Generic.Failed, 'failed'), - (r'^ERROR: ', token.Generic.Failed, 'failed'), - ], - 'skipped': [ - (r'[\w-]+\.t', token.Generic.SName), - (r':.*', token.Generic.Skipped), - ], - 'failed': [ - (r'[\w-]+\.t', token.Generic.FName), - (r'(:| ).*', token.Generic.Failed), - ] - } - if sys.version_info > (3, 5, 0): PYTHON3 = True xrange = range # we use xrange in one place, and we'd rather not use range def _bytespath(p): - if p is None: - return p return p.encode('utf-8') def _strpath(p): - if p is None: - return p return p.decode('utf-8') elif sys.version_info >= (3, 0, 0): @@ -1398,7 +1359,7 @@ while i < len(els): el = els[i] - r = self.linematch(el, lout) + r = TTest.linematch(el, lout) if isinstance(r, str): if r == '+glob': lout = el[:-1] + ' (glob)\n' @@ -1422,10 +1383,11 @@ else: m = optline.match(el) if m: - conditions = [ - c for c in m.group(2).split(b' ')] + conditions = [c for c in m.group(2).split(' ')] - if not self._hghave(conditions)[0]: + if self._hghave(conditions)[0]: + lout = el + else: optional.append(i) i += 1 @@ -1454,16 +1416,9 @@ while expected.get(pos, None): el = expected[pos].pop(0) if el: - if not el.endswith(b" (?)\n"): - m = optline.match(el) - if m: - conditions = [c for c in m.group(2).split(' ')] - - if self._hghave(conditions)[0]: - # Don't append as optional line - continue - else: - continue + if (not optline.match(el) + and not el.endswith(b" (?)\n")): + break postout.append(b' ' + el) if lcmd: @@ -1526,7 +1481,8 @@ res += re.escape(c) return TTest.rematch(res, l) - def linematch(self, el, l): + @staticmethod + def linematch(el, l): retry = False if el == l: # perfect match (fast) return True @@ -1537,11 +1493,8 @@ else: m = optline.match(el) if m: - conditions = [c for c in m.group(2).split(b' ')] - el = m.group(1) + b"\n" - if not self._hghave(conditions)[0]: - retry = "retry" # Not required by listed features + retry = "retry" if el.endswith(b" (esc)\n"): if PYTHON3: @@ -1633,14 +1586,7 @@ self.stream.write('t') else: if not self._options.nodiff: - formatted = '\nERROR: %s output changed\n' % test - if self.color: - formatted = pygments.highlight( - formatted, - TestRunnerLexer(), - formatters.Terminal256Formatter( - style=TestRunnerStyle)) - self.stream.write(formatted) + self.stream.write('\nERROR: %s output changed\n' % test) self.stream.write('!') self.stream.flush() @@ -2042,23 +1988,9 @@ if not self._runner.options.noskips: for test, msg in result.skipped: - formatted = 'Skipped %s: %s' % (test.name, msg) - if result.color: - formatted = pygments.highlight( - formatted, - TestRunnerLexer(), - formatters.Terminal256Formatter( - style=TestRunnerStyle)).strip("\n") - self.stream.writeln(formatted) + self.stream.writeln('Skipped %s: %s' % (test.name, msg)) for test, msg in result.failures: - formatted = 'Failed %s: %s' % (test.name, msg) - if result.color: - formatted = pygments.highlight( - formatted, - TestRunnerLexer(), - formatters.Terminal256Formatter( - style=TestRunnerStyle)).strip("\n") - self.stream.writeln(formatted) + self.stream.writeln('Failed %s: %s' % (test.name, msg)) for test, msg in result.errors: self.stream.writeln('Errored %s: %s' % (test.name, msg)) diff -Nru mercurial-4.3.1+207-xenial/tests/test-acl.t mercurial-4.3.1/tests/test-acl.t --- mercurial-4.3.1+207-xenial/tests/test-acl.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-acl.t 2017-09-10 00:05:18.000000000 +0000 @@ -883,7 +883,7 @@ added 3 changesets with 3 changes to 3 files calling hook pretxnchangegroup.acl: hgext.acl.hook acl: checking access for user "barney" - error: pretxnchangegroup.acl hook raised an exception: [Errno *] * (glob) + error: pretxnchangegroup.acl hook raised an exception: [Errno 2] No such file or directory: '../acl.config' bundle2-input-part: total payload size 1553 bundle2-input-bundle: 3 parts total transaction abort! diff -Nru mercurial-4.3.1+207-xenial/tests/test-add.t mercurial-4.3.1/tests/test-add.t --- mercurial-4.3.1+207-xenial/tests/test-add.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-add.t 2017-09-10 00:05:18.000000000 +0000 @@ -44,14 +44,14 @@ abort: ui.portablefilenames value is invalid ('jump') [255] $ hg --config ui.portablefilenames=abort add con.xml - abort: filename contains 'con', which is reserved on Windows: con.xml + abort: filename contains 'con', which is reserved on Windows: 'con.xml' [255] $ hg st A a A b ? con.xml $ hg add con.xml - warning: filename contains 'con', which is reserved on Windows: con.xml + warning: filename contains 'con', which is reserved on Windows: 'con.xml' $ hg st A a A b diff -Nru mercurial-4.3.1+207-xenial/tests/test-amend.t mercurial-4.3.1/tests/test-amend.t --- mercurial-4.3.1+207-xenial/tests/test-amend.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-amend.t 2017-09-10 00:05:18.000000000 +0000 @@ -11,7 +11,7 @@ #if obsstore-on $ cat << EOF >> $HGRCPATH > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > EOF #endif @@ -176,7 +176,7 @@ $ cat >> $HGRCPATH < [experimental] - > stabilization=createmarkers, allowunstable + > evolution=createmarkers, allowunstable > EOF $ hg amend diff -Nru mercurial-4.3.1+207-xenial/tests/test-batching.py mercurial-4.3.1/tests/test-batching.py --- mercurial-4.3.1+207-xenial/tests/test-batching.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-batching.py 2017-09-10 00:05:18.000000000 +0000 @@ -8,9 +8,7 @@ from __future__ import absolute_import, print_function from mercurial import ( - error, peer, - util, wireproto, ) @@ -29,9 +27,9 @@ return "%s und %s" % (b, a,) def greet(self, name=None): return "Hello, %s" % name - def batchiter(self): + def batch(self): '''Support for local batching.''' - return peer.localiterbatcher(self) + return peer.localbatch(self) # usage of "thing" interface def use(it): @@ -43,54 +41,29 @@ print(it.foo("Un", two="Deux")) print(it.bar("Eins", "Zwei")) - # Batched call to a couple of proxied methods. - batch = it.batchiter() + # Batched call to a couple of (possibly proxied) methods. + batch = it.batch() # The calls return futures to eventually hold results. foo = batch.foo(one="One", two="Two") + foo2 = batch.foo(None) bar = batch.bar("Eins", "Zwei") + # We can call non-batchable proxy methods, but the break the current batch + # request and cause additional roundtrips. + greet = batch.greet(name="John Smith") + # We can also add local methods into the mix, but they break the batch too. + hello = batch.hello() bar2 = batch.bar(b="Uno", a="Due") - - # Future shouldn't be set until we submit(). - assert isinstance(foo, peer.future) - assert not util.safehasattr(foo, 'value') - assert not util.safehasattr(bar, 'value') + # Only now are all the calls executed in sequence, with as few roundtrips + # as possible. batch.submit() - # Call results() to obtain results as a generator. - results = batch.results() - - # Future results shouldn't be set until we consume a value. - assert not util.safehasattr(foo, 'value') - foovalue = next(results) - assert util.safehasattr(foo, 'value') - assert foovalue == foo.value + # After the call to submit, the futures actually contain values. print(foo.value) - next(results) + print(foo2.value) print(bar.value) - next(results) + print(greet.value) + print(hello.value) print(bar2.value) - # We should be at the end of the results generator. - try: - next(results) - except StopIteration: - print('proper end of results generator') - else: - print('extra emitted element!') - - # Attempting to call a non-batchable method inside a batch fails. - batch = it.batchiter() - try: - batch.greet(name='John Smith') - except error.ProgrammingError as e: - print(e) - - # Attempting to call a local method inside a batch fails. - batch = it.batchiter() - try: - batch.hello() - except error.ProgrammingError as e: - print(e) - # local usage mylocal = localthing() print() @@ -173,14 +146,15 @@ req.append(name + ':' + args) req = ';'.join(req) res = self._submitone('batch', [('cmds', req,)]) - for r in res.split(';'): - yield r + return res.split(';') - def batchiter(self): - return wireproto.remoteiterbatcher(self) + def batch(self): + return wireproto.remotebatch(self) @peer.batchable def foo(self, one, two=None): + if not one: + yield "Nope", None encargs = [('one', mangle(one),), ('two', mangle(two),)] encresref = peer.future() yield encargs, encresref diff -Nru mercurial-4.3.1+207-xenial/tests/test-batching.py.out mercurial-4.3.1/tests/test-batching.py.out --- mercurial-4.3.1+207-xenial/tests/test-batching.py.out 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-batching.py.out 2017-09-10 00:05:18.000000000 +0000 @@ -4,9 +4,11 @@ Un and Deux Eins und Zwei One and Two +Nope Eins und Zwei +Hello, John Smith +Ready. Uno und Due -proper end of results generator == Remote Ready. @@ -16,11 +18,15 @@ REQ: bar?b=Fjot&a=[xfj -> Fjot!voe![xfj Eins und Zwei -REQ: batch?cmds=foo:one=Pof,two=Uxp;bar:b=Fjot,a=[xfj;bar:b=Vop,a=Evf - -> Pof!boe!Uxp;Fjot!voe![xfj;Vop!voe!Evf +REQ: batch?cmds=foo:one=Pof,two=Uxp;bar:b=Fjot,a=[xfj + -> Pof!boe!Uxp;Fjot!voe![xfj +REQ: greet?name=Kpio!Tnjui + -> Ifmmp-!Kpio!Tnjui +REQ: batch?cmds=bar:b=Vop,a=Evf + -> Vop!voe!Evf One and Two +Nope Eins und Zwei +Hello, John Smith +Ready. Uno und Due -proper end of results generator -Attempted to batch a non-batchable call to 'greet' -Attempted to batch a non-batchable call to 'hello' diff -Nru mercurial-4.3.1+207-xenial/tests/test-bisect.t mercurial-4.3.1/tests/test-bisect.t --- mercurial-4.3.1+207-xenial/tests/test-bisect.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-bisect.t 2017-09-10 00:05:18.000000000 +0000 @@ -184,15 +184,6 @@ $ hg bisect -r $ hg bisect -b - $ hg status -v - # The repository is in an unfinished *bisect* state. - - None - # To mark the changeset good: hg bisect --good - # To mark the changeset bad: hg bisect --bad - # To abort: hg bisect --reset - - $ hg status -v --config commands.status.skipstates=bisect $ hg summary parent: 31:58c80a7c8a40 tip msg 31 @@ -574,7 +565,7 @@ $ cat >> $HGRCPATH << EOF > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > EOF tip is obsolete diff -Nru mercurial-4.3.1+207-xenial/tests/test-bookmarks-pushpull.t mercurial-4.3.1/tests/test-bookmarks-pushpull.t --- mercurial-4.3.1+207-xenial/tests/test-bookmarks-pushpull.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-bookmarks-pushpull.t 2017-09-10 00:05:18.000000000 +0000 @@ -6,7 +6,7 @@ > [phases] > publish=False > [experimental] - > stabilization=createmarkers,exchange + > evolution=createmarkers,exchange > EOF initialize diff -Nru mercurial-4.3.1+207-xenial/tests/test-bundle2-exchange.t mercurial-4.3.1/tests/test-bundle2-exchange.t --- mercurial-4.3.1+207-xenial/tests/test-bundle2-exchange.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-bundle2-exchange.t 2017-09-10 00:05:18.000000000 +0000 @@ -15,7 +15,7 @@ $ cat >> $HGRCPATH << EOF > [experimental] - > stabilization=createmarkers,exchange + > evolution=createmarkers,exchange > bundle2-output-capture=True > [ui] > ssh="$PYTHON" "$TESTDIR/dummyssh" diff -Nru mercurial-4.3.1+207-xenial/tests/test-bundle2-format.t mercurial-4.3.1/tests/test-bundle2-format.t --- mercurial-4.3.1+207-xenial/tests/test-bundle2-format.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-bundle2-format.t 2017-09-10 00:05:18.000000000 +0000 @@ -227,7 +227,7 @@ > [extensions] > bundle2=$TESTTMP/bundle2.py > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > [ui] > ssh=$PYTHON "$TESTDIR/dummyssh" > logtemplate={rev}:{node|short} {phase} {author} {bookmarks} {desc|firstline} diff -Nru mercurial-4.3.1+207-xenial/tests/test-cache-abuse.t mercurial-4.3.1/tests/test-cache-abuse.t --- mercurial-4.3.1+207-xenial/tests/test-cache-abuse.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-cache-abuse.t 2017-09-10 00:05:18.000000000 +0000 @@ -2,7 +2,7 @@ $ cat >> $HGRCPATH << EOF > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > [phases] > publish=False > EOF diff -Nru mercurial-4.3.1+207-xenial/tests/test-check-interfaces.py mercurial-4.3.1/tests/test-check-interfaces.py --- mercurial-4.3.1+207-xenial/tests/test-check-interfaces.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-check-interfaces.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -# Test that certain objects conform to well-defined interfaces. - -from __future__ import absolute_import, print_function - -from mercurial import ( - httppeer, - localrepo, - sshpeer, - ui as uimod, -) - -def checkobject(o): - """Verify a constructed object conforms to interface rules. - - An object must have __abstractmethods__ defined. - - All "public" attributes of the object (attributes not prefixed with - an underscore) must be in __abstractmethods__ or appear on a base class - with __abstractmethods__. - """ - name = o.__class__.__name__ - - allowed = set() - for cls in o.__class__.__mro__: - if not getattr(cls, '__abstractmethods__', set()): - continue - - allowed |= cls.__abstractmethods__ - allowed |= {a for a in dir(cls) if not a.startswith('_')} - - if not allowed: - print('%s does not have abstract methods' % name) - return - - public = {a for a in dir(o) if not a.startswith('_')} - - for attr in sorted(public - allowed): - print('public attributes not in abstract interface: %s.%s' % ( - name, attr)) - -# Facilitates testing localpeer. -class dummyrepo(object): - def __init__(self): - self.ui = uimod.ui() - def filtered(self, name): - pass - def _restrictcapabilities(self, caps): - pass - -# Facilitates testing sshpeer without requiring an SSH server. -class testingsshpeer(sshpeer.sshpeer): - def _validaterepo(self, *args, **kwargs): - pass - -class badpeer(httppeer.httppeer): - def __init__(self): - super(badpeer, self).__init__(uimod.ui(), 'http://localhost') - self.badattribute = True - - def badmethod(self): - pass - -def main(): - ui = uimod.ui() - - checkobject(badpeer()) - checkobject(httppeer.httppeer(ui, 'http://localhost')) - checkobject(localrepo.localpeer(dummyrepo())) - checkobject(testingsshpeer(ui, 'ssh://localhost/foo')) - -main() diff -Nru mercurial-4.3.1+207-xenial/tests/test-check-interfaces.py.out mercurial-4.3.1/tests/test-check-interfaces.py.out --- mercurial-4.3.1+207-xenial/tests/test-check-interfaces.py.out 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-check-interfaces.py.out 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -public attributes not in abstract interface: badpeer.badattribute -public attributes not in abstract interface: badpeer.badmethod diff -Nru mercurial-4.3.1+207-xenial/tests/test-clone.t mercurial-4.3.1/tests/test-clone.t --- mercurial-4.3.1+207-xenial/tests/test-clone.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-clone.t 2017-09-10 00:05:18.000000000 +0000 @@ -706,7 +706,7 @@ $ cd filteredrev0 $ cat >> .hg/hgrc << EOF > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > EOF $ echo initial1 > foo $ hg -q commit -A -m initial0 diff -Nru mercurial-4.3.1+207-xenial/tests/test-commandserver.t mercurial-4.3.1/tests/test-commandserver.t --- mercurial-4.3.1+207-xenial/tests/test-commandserver.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-commandserver.t 2017-09-10 00:05:18.000000000 +0000 @@ -497,7 +497,7 @@ $ cat >> .hg/hgrc << EOF > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > EOF >>> import os diff -Nru mercurial-4.3.1+207-xenial/tests/test-command-template.t mercurial-4.3.1/tests/test-command-template.t --- mercurial-4.3.1+207-xenial/tests/test-command-template.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-command-template.t 2017-09-10 00:05:18.000000000 +0000 @@ -2871,189 +2871,95 @@ No tag set: - $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n' - @ 5: null+5 - |\ - | o 4: null+4 - | | - | o 3: null+3 - | | - o | 2: null+3 - |/ - o 1: null+2 - | - o 0: null+1 - + $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n' + 5: null+5 + 4: null+4 + 3: null+3 + 2: null+3 + 1: null+2 + 0: null+1 -One common tag: longest path wins for {latesttagdistance}: +One common tag: longest path wins: $ hg tag -r 1 -m t1 -d '6 0' t1 - $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n' - @ 6: t1+4 - | - o 5: t1+3 - |\ - | o 4: t1+2 - | | - | o 3: t1+1 - | | - o | 2: t1+1 - |/ - o 1: t1+0 - | - o 0: null+1 - + $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n' + 6: t1+4 + 5: t1+3 + 4: t1+2 + 3: t1+1 + 2: t1+1 + 1: t1+0 + 0: null+1 -One ancestor tag: closest wins: +One ancestor tag: more recent wins: $ hg tag -r 2 -m t2 -d '7 0' t2 - $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n' - @ 7: t2+3 - | - o 6: t2+2 - | - o 5: t2+1 - |\ - | o 4: t1+2 - | | - | o 3: t1+1 - | | - o | 2: t2+0 - |/ - o 1: t1+0 - | - o 0: null+1 - + $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n' + 7: t2+3 + 6: t2+2 + 5: t2+1 + 4: t1+2 + 3: t1+1 + 2: t2+0 + 1: t1+0 + 0: null+1 -Two branch tags: more recent wins if same number of changes: +Two branch tags: more recent wins: $ hg tag -r 3 -m t3 -d '8 0' t3 - $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n' - @ 8: t3+5 - | - o 7: t3+4 - | - o 6: t3+3 - | - o 5: t3+2 - |\ - | o 4: t3+1 - | | - | o 3: t3+0 - | | - o | 2: t2+0 - |/ - o 1: t1+0 - | - o 0: null+1 - - -Two branch tags: fewest changes wins: - - $ hg tag -r 4 -m t4 -d '4 0' t4 # older than t2, but should not matter - $ hg log -G --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n" - @ 9: t4+5,6 - | - o 8: t4+4,5 - | - o 7: t4+3,4 - | - o 6: t4+2,3 - | - o 5: t4+1,2 - |\ - | o 4: t4+0,0 - | | - | o 3: t3+0,0 - | | - o | 2: t2+0,0 - |/ - o 1: t1+0,0 - | - o 0: null+1,1 - + $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n' + 8: t3+5 + 7: t3+4 + 6: t3+3 + 5: t3+2 + 4: t3+1 + 3: t3+0 + 2: t2+0 + 1: t1+0 + 0: null+1 Merged tag overrides: $ hg tag -r 5 -m t5 -d '9 0' t5 $ hg tag -r 3 -m at3 -d '10 0' at3 - $ hg log -G --template '{rev}: {latesttag}+{latesttagdistance}\n' - @ 11: t5+6 - | - o 10: t5+5 - | - o 9: t5+4 - | - o 8: t5+3 - | - o 7: t5+2 - | - o 6: t5+1 - | - o 5: t5+0 - |\ - | o 4: t4+0 - | | - | o 3: at3:t3+0 - | | - o | 2: t2+0 - |/ - o 1: t1+0 - | - o 0: null+1 - - - $ hg log -G --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n" - @ 11: t5+6,6 - | - o 10: t5+5,5 - | - o 9: t5+4,4 - | - o 8: t5+3,3 - | - o 7: t5+2,2 - | - o 6: t5+1,1 - | - o 5: t5+0,0 - |\ - | o 4: t4+0,0 - | | - | o 3: at3+0,0 t3+0,0 - | | - o | 2: t2+0,0 - |/ - o 1: t1+0,0 - | - o 0: null+1,1 - - - $ hg log -G --template "{rev}: {latesttag('re:^t[13]$') % '{tag}, C: {changes}, D: {distance}'}\n" - @ 11: t3, C: 9, D: 8 - | - o 10: t3, C: 8, D: 7 - | - o 9: t3, C: 7, D: 6 - | - o 8: t3, C: 6, D: 5 - | - o 7: t3, C: 5, D: 4 - | - o 6: t3, C: 4, D: 3 - | - o 5: t3, C: 3, D: 2 - |\ - | o 4: t3, C: 1, D: 1 - | | - | o 3: t3, C: 0, D: 0 - | | - o | 2: t1, C: 1, D: 1 - |/ - o 1: t1, C: 0, D: 0 - | - o 0: null, C: 1, D: 1 - + $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n' + 10: t5+5 + 9: t5+4 + 8: t5+3 + 7: t5+2 + 6: t5+1 + 5: t5+0 + 4: at3:t3+1 + 3: at3:t3+0 + 2: t2+0 + 1: t1+0 + 0: null+1 + + $ hg log --template "{rev}: {latesttag % '{tag}+{distance},{changes} '}\n" + 10: t5+5,5 + 9: t5+4,4 + 8: t5+3,3 + 7: t5+2,2 + 6: t5+1,1 + 5: t5+0,0 + 4: at3+1,1 t3+1,1 + 3: at3+0,0 t3+0,0 + 2: t2+0,0 + 1: t1+0,0 + 0: null+1,1 + + $ hg log --template "{rev}: {latesttag('re:^t[13]$') % '{tag}, C: {changes}, D: {distance}'}\n" + 10: t3, C: 8, D: 7 + 9: t3, C: 7, D: 6 + 8: t3, C: 6, D: 5 + 7: t3, C: 5, D: 4 + 6: t3, C: 4, D: 3 + 5: t3, C: 3, D: 2 + 4: t3, C: 1, D: 1 + 3: t3, C: 0, D: 0 + 2: t1, C: 1, D: 1 + 1: t1, C: 0, D: 0 + 0: null, C: 1, D: 1 $ cd .. @@ -3075,7 +2981,7 @@ > EOF $ hg -R latesttag tip - test 11:97e5943b523a + test 10:9b4a630e5f5f Test recursive showlist template (issue1989): @@ -3088,7 +2994,7 @@ $ hg -R latesttag log -r tip --style=style1989 M|test - 11,test + 10,test branch: test Test new-style inline templating: @@ -3121,7 +3027,6 @@ $ hg log -R latesttag --template '{desc}\n' at3 t5 - t4 t3 t2 t1 @@ -3135,7 +3040,6 @@ $ hg log -R latesttag --template '{strip(desc, "te")}\n' at3 5 - 4 3 2 1 @@ -3151,7 +3055,6 @@ $ hg log -R latesttag --template 'date: {date(date, "%y %m %d %S %z")}\n' date: 70 01 01 10 +0000 date: 70 01 01 09 +0000 - date: 70 01 01 04 +0000 date: 70 01 01 08 +0000 date: 70 01 01 07 +0000 date: 70 01 01 06 +0000 @@ -3664,7 +3567,7 @@ $ cd hashcollision $ cat <> .hg/hgrc > [experimental] - > stabilization = createmarkers + > evolution = createmarkers > EOF $ echo 0 > a $ hg ci -qAm 0 @@ -4416,155 +4319,3 @@ custom $ cd .. - -Test 'graphwidth' in 'hg log' on various topologies. The key here is that the -printed graphwidths 3, 5, 7, etc. should all line up in their respective -columns. We don't care about other aspects of the graph rendering here. - - $ hg init graphwidth - $ cd graphwidth - - $ wrappabletext="a a a a a a a a a a a a" - - $ printf "first\n" > file - $ hg add file - $ hg commit -m "$wrappabletext" - - $ printf "first\nsecond\n" > file - $ hg commit -m "$wrappabletext" - - $ hg checkout 0 - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - $ printf "third\nfirst\n" > file - $ hg commit -m "$wrappabletext" - created new head - - $ hg merge - merging file - 0 files updated, 1 files merged, 0 files removed, 0 files unresolved - (branch merge, don't forget to commit) - - $ hg log --graph -T "{graphwidth}" - @ 3 - | - | @ 5 - |/ - o 3 - - $ hg commit -m "$wrappabletext" - - $ hg log --graph -T "{graphwidth}" - @ 5 - |\ - | o 5 - | | - o | 5 - |/ - o 3 - - - $ hg checkout 0 - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - $ printf "third\nfirst\nsecond\n" > file - $ hg commit -m "$wrappabletext" - created new head - - $ hg log --graph -T "{graphwidth}" - @ 3 - | - | o 7 - | |\ - +---o 7 - | | - | o 5 - |/ - o 3 - - - $ hg log --graph -T "{graphwidth}" -r 3 - o 5 - |\ - ~ ~ - - $ hg log --graph -T "{graphwidth}" -r 1 - o 3 - | - ~ - - $ hg merge - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - (branch merge, don't forget to commit) - $ hg commit -m "$wrappabletext" - - $ printf "seventh\n" >> file - $ hg commit -m "$wrappabletext" - - $ hg log --graph -T "{graphwidth}" - @ 3 - | - o 5 - |\ - | o 5 - | | - o | 7 - |\ \ - | o | 7 - | |/ - o / 5 - |/ - o 3 - - -The point of graphwidth is to allow wrapping that accounts for the space taken -by the graph. - - $ COLUMNS=10 hg log --graph -T "{fill(desc, termwidth - graphwidth)}" - @ a a a a - | a a a a - | a a a a - o a a a - |\ a a a - | | a a a - | | a a a - | o a a a - | | a a a - | | a a a - | | a a a - o | a a - |\ \ a a - | | | a a - | | | a a - | | | a a - | | | a a - | o | a a - | |/ a a - | | a a - | | a a - | | a a - | | a a - o | a a a - |/ a a a - | a a a - | a a a - o a a a a - a a a a - a a a a - -Something tricky happens when there are elided nodes; the next drawn row of -edges can be more than one column wider, but the graph width only increases by -one column. The remaining columns are added in between the nodes. - - $ hg log --graph -T "{graphwidth}" -r "0|2|4|5" - o 5 - |\ - | \ - | :\ - o : : 7 - :/ / - : o 5 - :/ - o 3 - - - $ cd .. - diff -Nru mercurial-4.3.1+207-xenial/tests/test-commit-amend.t mercurial-4.3.1/tests/test-commit-amend.t --- mercurial-4.3.1+207-xenial/tests/test-commit-amend.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-commit-amend.t 2017-09-10 00:05:18.000000000 +0000 @@ -520,7 +520,7 @@ $ cat >> $HGRCPATH << EOF > [experimental] - > stabilization=createmarkers,allowunstable + > evolution=createmarkers,allowunstable > EOF Amend with no files changes @@ -604,13 +604,13 @@ babar $ hg commit --amend - $ hg log -r 'orphan()' + $ hg log -r 'unstable()' changeset: 18:b99e5df575f7 branch: a parent: 11:3334b7925910 user: test date: Thu Jan 01 00:00:00 1970 +0000 - instability: orphan + trouble: unstable summary: babar diff -Nru mercurial-4.3.1+207-xenial/tests/test-commit-interactive-curses.t mercurial-4.3.1/tests/test-commit-interactive-curses.t --- mercurial-4.3.1+207-xenial/tests/test-commit-interactive-curses.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-commit-interactive-curses.t 2017-09-10 00:05:18.000000000 +0000 @@ -345,7 +345,7 @@ > $PYTHON < from mercurial import hg, ui;\ > repo = hg.repository(ui.ui.load(), ".");\ - > print(repo.ui.interface("chunkselector")) + > print repo.ui.interface("chunkselector") > EOF > } $ chunkselectorinterface diff -Nru mercurial-4.3.1+207-xenial/tests/test-commit-multiple.t mercurial-4.3.1/tests/test-commit-multiple.t --- mercurial-4.3.1+207-xenial/tests/test-commit-multiple.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-commit-multiple.t 2017-09-10 00:05:18.000000000 +0000 @@ -90,7 +90,7 @@ > f.close() > > def printfiles(repo, rev): - > print("revision %s files: %s" % (rev, repo[rev].files())) + > print "revision %s files: %s" % (rev, repo[rev].files()) > > repo = hg.repository(ui.ui.load(), '.') > assert len(repo) == 6, \ @@ -99,14 +99,14 @@ > replacebyte("bugfix", "u") > sleep(2) > try: - > print("PRE: len(repo): %d" % len(repo)) + > print "PRE: len(repo): %d" % len(repo) > wlock = repo.wlock() > lock = repo.lock() > replacebyte("file1", "x") > repo.commit(text="x", user="test", date=(0, 0)) > replacebyte("file1", "y") > repo.commit(text="y", user="test", date=(0, 0)) - > print("POST: len(repo): %d" % len(repo)) + > print "POST: len(repo): %d" % len(repo) > finally: > lock.release() > wlock.release() diff -Nru mercurial-4.3.1+207-xenial/tests/test-completion.t mercurial-4.3.1/tests/test-completion.t --- mercurial-4.3.1+207-xenial/tests/test-completion.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-completion.t 2017-09-10 00:05:18.000000000 +0000 @@ -228,7 +228,7 @@ log: follow, follow-first, date, copies, keyword, rev, removed, only-merges, user, only-branch, branch, prune, patch, git, limit, no-merges, stat, graph, style, template, include, exclude merge: force, rev, preview, tool pull: update, force, rev, bookmark, branch, ssh, remotecmd, insecure - push: force, rev, bookmark, branch, new-branch, pushvars, ssh, remotecmd, insecure + push: force, rev, bookmark, branch, new-branch, ssh, remotecmd, insecure remove: after, force, subrepos, include, exclude serve: accesslog, daemon, daemon-postexec, errorlog, port, address, prefix, name, web-conf, webdir-conf, pid-file, stdio, cmdserver, templates, style, ipv6, certificate, subrepos status: all, modified, added, removed, deleted, clean, unknown, ignored, no-status, terse, copies, print0, rev, change, include, exclude, subrepos, template diff -Nru mercurial-4.3.1+207-xenial/tests/test-conflict.t mercurial-4.3.1/tests/test-conflict.t --- mercurial-4.3.1+207-xenial/tests/test-conflict.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-conflict.t 2017-09-10 00:05:18.000000000 +0000 @@ -44,23 +44,6 @@ $ hg id 618808747361+c0c68e4fe667+ tip - $ echo "[commands]" >> $HGRCPATH - $ echo "status.verbose=true" >> $HGRCPATH - $ hg status - M a - ? a.orig - # The repository is in an unfinished *merge* state. - - # Unresolved merge conflicts: - # - # a - # - # To mark files as resolved: hg resolve --mark FILE - - # To continue: hg commit - # To abort: hg update --clean . (warning: this will discard uncommitted changes) - - $ cat a Small Mathematical Series. 1 @@ -75,7 +58,7 @@ >>>>>>> merge rev: c0c68e4fe667 - test: branch1 Hop we are done. - $ hg status --config commands.status.verbose=0 + $ hg status M a ? a.orig diff -Nru mercurial-4.3.1+207-xenial/tests/test-context.py mercurial-4.3.1/tests/test-context.py --- mercurial-4.3.1+207-xenial/tests/test-context.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-context.py 2017-09-10 00:05:18.000000000 +0000 @@ -24,10 +24,11 @@ repo[None].add(['foo']) repo.commit(text='commit1', date="0 0") -d = repo[None]['foo'].date() if os.name == 'nt': - d = d[:2] -print("workingfilectx.date = (%d, %d)" % d) + d = repo[None]['foo'].date() + print("workingfilectx.date = (%d, %d)" % (d[0], d[1])) +else: + print("workingfilectx.date =", repo[None]['foo'].date()) # test memctx with non-ASCII commit message @@ -178,14 +179,3 @@ print('data mismatch') except Exception as ex: print('cannot read data: %r' % ex) - -with repo.wlock(), repo.lock(), repo.transaction('test'): - with open(b'4', 'wb') as f: - f.write(b'4') - repo.dirstate.normal('4') - repo.commit('4') - revsbefore = len(repo.changelog) - repo.invalidate(clearfilecache=True) - revsafter = len(repo.changelog) - if revsbefore != revsafter: - print('changeset lost by repo.invalidate()') diff -Nru mercurial-4.3.1+207-xenial/tests/test-contrib-check-code.t mercurial-4.3.1/tests/test-contrib-check-code.t --- mercurial-4.3.1+207-xenial/tests/test-contrib-check-code.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-contrib-check-code.t 2017-09-10 00:05:18.000000000 +0000 @@ -213,32 +213,32 @@ [1] $ cat > ./map-inside-gettext.py < print(_("map inside gettext %s" % v)) + > print _("map inside gettext %s" % v) > - > print(_("concatenating " " by " " space %s" % v)) - > print(_("concatenating " + " by " + " '+' %s" % v)) + > print _("concatenating " " by " " space %s" % v) + > print _("concatenating " + " by " + " '+' %s" % v) > - > print(_("mapping operation in different line %s" - > % v)) + > print _("mapping operation in different line %s" + > % v) > - > print(_( - > "leading spaces inside of '(' %s" % v)) + > print _( + > "leading spaces inside of '(' %s" % v) > EOF $ "$check_code" ./map-inside-gettext.py ./map-inside-gettext.py:1: - > print(_("map inside gettext %s" % v)) + > print _("map inside gettext %s" % v) don't use % inside _() ./map-inside-gettext.py:3: - > print(_("concatenating " " by " " space %s" % v)) + > print _("concatenating " " by " " space %s" % v) don't use % inside _() ./map-inside-gettext.py:4: - > print(_("concatenating " + " by " + " '+' %s" % v)) + > print _("concatenating " + " by " + " '+' %s" % v) don't use % inside _() ./map-inside-gettext.py:6: - > print(_("mapping operation in different line %s" + > print _("mapping operation in different line %s" don't use % inside _() ./map-inside-gettext.py:9: - > print(_( + > print _( don't use % inside _() [1] diff -Nru mercurial-4.3.1+207-xenial/tests/test-convert-cvs.t mercurial-4.3.1/tests/test-convert-cvs.t --- mercurial-4.3.1+207-xenial/tests/test-convert-cvs.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-convert-cvs.t 2017-09-10 00:05:18.000000000 +0000 @@ -12,10 +12,10 @@ $ echo "convert = " >> $HGRCPATH $ cat > cvshooks.py < def cvslog(ui,repo,hooktype,log): - > print("%s hook: %d entries"%(hooktype,len(log))) + > print "%s hook: %d entries"%(hooktype,len(log)) > > def cvschangesets(ui,repo,hooktype,changesets): - > print("%s hook: %d changesets"%(hooktype,len(changesets))) + > print "%s hook: %d changesets"%(hooktype,len(changesets)) > EOF $ hookpath=`pwd` $ cat <> $HGRCPATH diff -Nru mercurial-4.3.1+207-xenial/tests/test-copy.t mercurial-4.3.1/tests/test-copy.t --- mercurial-4.3.1+207-xenial/tests/test-copy.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-copy.t 2017-09-10 00:05:18.000000000 +0000 @@ -15,7 +15,7 @@ $ hg status $ hg copy a b $ hg --config ui.portablefilenames=abort copy a con.xml - abort: filename contains 'con', which is reserved on Windows: con.xml + abort: filename contains 'con', which is reserved on Windows: 'con.xml' [255] $ hg status A b diff -Nru mercurial-4.3.1+207-xenial/tests/test-drawdag.t mercurial-4.3.1/tests/test-drawdag.t --- mercurial-4.3.1+207-xenial/tests/test-drawdag.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-drawdag.t 2017-09-10 00:05:18.000000000 +0000 @@ -2,7 +2,7 @@ > [extensions] > drawdag=$TESTDIR/drawdag.py > [experimental] - > stabilization=all + > evolution=all > EOF $ reinit () { @@ -232,41 +232,3 @@ be0ef73c17ade3fc89dc41701eb9fc3a91b58282 575c4b5ec114d64b681d33f8792853568bfb2b2c 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} 64a8289d249234b9886244d379f15e6b650b28e3 0 {7fb047a69f220c21711122dfd94305a9efb60cba} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} 58e6b987bf7045fcd9c54f496396ca1d1fc81047 0 {575c4b5ec114d64b681d33f8792853568bfb2b2c} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'} - -Change file contents via comments - - $ reinit - $ hg debugdrawdag <<'EOS' - > C # A/dir1/a = 1\n2 - > |\ # B/dir2/b = 34 - > A B # C/dir1/c = 5 - > # C/dir2/c = 6 - > # C/A = a - > # C/B = b - > EOS - - $ hg log -G -T '{desc} {files}' - o C A B dir1/c dir2/c - |\ - | o B B dir2/b - | - o A A dir1/a - - $ for f in `hg files -r C`; do - > echo FILE "$f" - > hg cat -r C "$f" - > echo - > done - FILE A - a - FILE B - b - FILE dir1/a - 1 - 2 - FILE dir1/c - 5 - FILE dir2/b - 34 - FILE dir2/c - 6 diff -Nru mercurial-4.3.1+207-xenial/tests/test-duplicateoptions.py mercurial-4.3.1/tests/test-duplicateoptions.py --- mercurial-4.3.1+207-xenial/tests/test-duplicateoptions.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-duplicateoptions.py 2017-09-10 00:05:18.000000000 +0000 @@ -6,18 +6,18 @@ ui as uimod, ) -ignore = {b'highlight', b'win32text', b'factotum'} +ignore = {'highlight', 'win32text', 'factotum'} if os.name != 'nt': - ignore.add(b'win32mbcs') + ignore.add('win32mbcs') disabled = [ext for ext in extensions.disabled().keys() if ext not in ignore] -hgrc = open(os.environ["HGRCPATH"], 'wb') -hgrc.write(b'[extensions]\n') +hgrc = open(os.environ["HGRCPATH"], 'w') +hgrc.write('[extensions]\n') for ext in disabled: - hgrc.write(ext + b'=\n') + hgrc.write(ext + '=\n') hgrc.close() @@ -30,7 +30,7 @@ option[0] and globalshort.add(option[0]) option[1] and globallong.add(option[1]) -for cmd, entry in commands.table.items(): +for cmd, entry in commands.table.iteritems(): seenshort = globalshort.copy() seenlong = globallong.copy() for option in entry[1]: diff -Nru mercurial-4.3.1+207-xenial/tests/test-eol.t mercurial-4.3.1/tests/test-eol.t --- mercurial-4.3.1+207-xenial/tests/test-eol.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-eol.t 2017-09-10 00:05:18.000000000 +0000 @@ -16,7 +16,7 @@ > except ImportError: > pass > (old, new) = sys.argv[1] == 'LF' and ('\n', '\r\n') or ('\r\n', '\n') - > print("%% switching encoding from %r to %r" % (old, new)) + > print "%% switching encoding from %r to %r" % (old, new) > for path in sys.argv[2:]: > data = file(path, 'rb').read() > data = data.replace(old, new) diff -Nru mercurial-4.3.1+207-xenial/tests/test-extension.t mercurial-4.3.1/tests/test-extension.t --- mercurial-4.3.1+207-xenial/tests/test-extension.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-extension.t 2017-09-10 00:05:18.000000000 +0000 @@ -75,13 +75,13 @@ $ cat > foo.py < import os > name = os.path.basename(__file__).rsplit('.', 1)[0] - > print("1) %s imported" % name) + > print "1) %s imported" % name > def uisetup(ui): - > print("2) %s uisetup" % name) + > print "2) %s uisetup" % name > def extsetup(): - > print("3) %s extsetup" % name) + > print "3) %s extsetup" % name > def reposetup(ui, repo): - > print("4) %s reposetup" % name) + > print "4) %s reposetup" % name > > # custom predicate to check registration of functions at loading > from mercurial import ( @@ -172,7 +172,7 @@ $ cat > loadabs.py < import mod.ambigabs as ambigabs > def extsetup(): - > print('ambigabs.s=%s' % ambigabs.s) + > print 'ambigabs.s=%s' % ambigabs.s > EOF $ (PYTHONPATH=${PYTHONPATH}${PATHSEP}${TESTTMP}/libroot; hg --config extensions.loadabs=loadabs.py root) ambigabs.s=libroot/ambig.py @@ -186,7 +186,7 @@ $ cat > loadrel.py < import mod.ambigrel as ambigrel > def extsetup(): - > print('ambigrel.s=%s' % ambigrel.s) + > print 'ambigrel.s=%s' % ambigrel.s > EOF $ (PYTHONPATH=${PYTHONPATH}${PATHSEP}${TESTTMP}/libroot; hg --config extensions.loadrel=loadrel.py root) ambigrel.s=libroot/mod/ambig.py diff -Nru mercurial-4.3.1+207-xenial/tests/test-filebranch.t mercurial-4.3.1/tests/test-filebranch.t --- mercurial-4.3.1+207-xenial/tests/test-filebranch.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-filebranch.t 2017-09-10 00:05:18.000000000 +0000 @@ -2,9 +2,8 @@ when we do a merge. $ cat < merge - > from __future__ import print_function > import sys, os - > print("merging for", os.path.basename(sys.argv[1])) + > print "merging for", os.path.basename(sys.argv[1]) > EOF $ HGMERGE="$PYTHON ../merge"; export HGMERGE diff -Nru mercurial-4.3.1+207-xenial/tests/test-glog.t mercurial-4.3.1/tests/test-glog.t --- mercurial-4.3.1+207-xenial/tests/test-glog.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-glog.t 2017-09-10 00:05:18.000000000 +0000 @@ -1633,7 +1633,7 @@ Test glob expansion of pats $ expandglobs=`$PYTHON -c "import mercurial.util; \ - > print(mercurial.util.expandglobs and 'true' or 'false')"` + > print mercurial.util.expandglobs and 'true' or 'false'"` $ if [ $expandglobs = "true" ]; then > testlog 'a*'; > else @@ -2290,7 +2290,7 @@ $ cat >> $HGRCPATH << EOF > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > EOF $ hg debugobsolete `hg id --debug -i -r 8` diff -Nru mercurial-4.3.1+207-xenial/tests/test-graft.t mercurial-4.3.1/tests/test-graft.t --- mercurial-4.3.1+207-xenial/tests/test-graft.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-graft.t 2017-09-10 00:05:18.000000000 +0000 @@ -221,25 +221,6 @@ $ hg summary |grep graft commit: 2 modified, 2 unknown, 1 unresolved (graft in progress) -Using status to get more context - - $ hg status --verbose - M d - M e - ? a.orig - ? e.orig - # The repository is in an unfinished *graft* state. - - # Unresolved merge conflicts: - # - # e - # - # To mark files as resolved: hg resolve --mark FILE - - # To continue: hg graft --continue - # To abort: hg update --clean . (warning: this will discard uncommitted changes) - - Commit while interrupted should fail: $ hg ci -m 'commit interrupted graft' diff -Nru mercurial-4.3.1+207-xenial/tests/test-hardlinks.t mercurial-4.3.1/tests/test-hardlinks.t --- mercurial-4.3.1+207-xenial/tests/test-hardlinks.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-hardlinks.t 2017-09-10 00:05:18.000000000 +0000 @@ -1,12 +1,11 @@ #require hardlink $ cat > nlinks.py < from __future__ import print_function > import sys > from mercurial import util > for f in sorted(sys.stdin.readlines()): > f = f[:-1] - > print(util.nlinks(f), f) + > print util.nlinks(f), f > EOF $ nlinksdir() diff -Nru mercurial-4.3.1+207-xenial/tests/test-help.t mercurial-4.3.1/tests/test-help.t --- mercurial-4.3.1+207-xenial/tests/test-help.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-help.t 2017-09-10 00:05:18.000000000 +0000 @@ -1709,7 +1709,7 @@ $ $PYTHON < upper = "\x8bL\x98^" - > print("hg --encoding cp932 help -e ambiguous.%s" % upper) + > print "hg --encoding cp932 help -e ambiguous.%s" % upper > EOF \x8bL\x98^ (esc) ---- @@ -1719,7 +1719,7 @@ $ $PYTHON < lower = "\x8bl\x98^" - > print("hg --encoding cp932 help -e ambiguous.%s" % lower) + > print "hg --encoding cp932 help -e ambiguous.%s" % lower > EOF \x8bl\x98^ (esc) ---- diff -Nru mercurial-4.3.1+207-xenial/tests/test-hgweb-non-interactive.t mercurial-4.3.1/tests/test-hgweb-non-interactive.t --- mercurial-4.3.1+207-xenial/tests/test-hgweb-non-interactive.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-hgweb-non-interactive.t 2017-09-10 00:05:18.000000000 +0000 @@ -41,11 +41,11 @@ > output = stringio() > > def startrsp(status, headers): - > print('---- STATUS') - > print(status) - > print('---- HEADERS') - > print([i for i in headers if i[0] != 'ETag']) - > print('---- DATA') + > print '---- STATUS' + > print status + > print '---- HEADERS' + > print [i for i in headers if i[0] != 'ETag'] + > print '---- DATA' > return output.write > > env = { @@ -68,13 +68,13 @@ > i = hgweb('.') > for c in i(env, startrsp): > pass - > print('---- ERRORS') - > print(errors.getvalue()) - > print('---- OS.ENVIRON wsgi variables') - > print(sorted([x for x in os.environ if x.startswith('wsgi')])) - > print('---- request.ENVIRON wsgi variables') + > print '---- ERRORS' + > print errors.getvalue() + > print '---- OS.ENVIRON wsgi variables' + > print sorted([x for x in os.environ if x.startswith('wsgi')]) + > print '---- request.ENVIRON wsgi variables' > with i._obtainrepo() as repo: - > print(sorted([x for x in repo.ui.environ if x.startswith('wsgi')])) + > print sorted([x for x in repo.ui.environ if x.startswith('wsgi')]) > EOF $ $PYTHON request.py ---- STATUS diff -Nru mercurial-4.3.1+207-xenial/tests/test-hgweb-no-path-info.t mercurial-4.3.1/tests/test-hgweb-no-path-info.t --- mercurial-4.3.1+207-xenial/tests/test-hgweb-no-path-info.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-hgweb-no-path-info.t 2017-09-10 00:05:18.000000000 +0000 @@ -31,11 +31,11 @@ > input = stringio() > > def startrsp(status, headers): - > print('---- STATUS') - > print(status) - > print('---- HEADERS') - > print([i for i in headers if i[0] != 'ETag']) - > print('---- DATA') + > print '---- STATUS' + > print status + > print '---- HEADERS' + > print [i for i in headers if i[0] != 'ETag'] + > print '---- DATA' > return output.write > > env = { @@ -59,8 +59,8 @@ > sys.stdout.write(output.getvalue()) > sys.stdout.write(''.join(content)) > getattr(content, 'close', lambda : None)() - > print('---- ERRORS') - > print(errors.getvalue()) + > print '---- ERRORS' + > print errors.getvalue() > > output = stringio() > env['QUERY_STRING'] = 'style=atom' diff -Nru mercurial-4.3.1+207-xenial/tests/test-hgweb-no-request-uri.t mercurial-4.3.1/tests/test-hgweb-no-request-uri.t --- mercurial-4.3.1+207-xenial/tests/test-hgweb-no-request-uri.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-hgweb-no-request-uri.t 2017-09-10 00:05:18.000000000 +0000 @@ -31,11 +31,11 @@ > input = stringio() > > def startrsp(status, headers): - > print('---- STATUS') - > print(status) - > print('---- HEADERS') - > print([i for i in headers if i[0] != 'ETag']) - > print('---- DATA') + > print '---- STATUS' + > print status + > print '---- HEADERS' + > print [i for i in headers if i[0] != 'ETag'] + > print '---- DATA' > return output.write > > env = { @@ -58,8 +58,8 @@ > sys.stdout.write(output.getvalue()) > sys.stdout.write(''.join(content)) > getattr(content, 'close', lambda : None)() - > print('---- ERRORS') - > print(errors.getvalue()) + > print '---- ERRORS' + > print errors.getvalue() > > output = stringio() > env['PATH_INFO'] = '/' diff -Nru mercurial-4.3.1+207-xenial/tests/test-highlight.t mercurial-4.3.1/tests/test-highlight.t --- mercurial-4.3.1+207-xenial/tests/test-highlight.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-highlight.t 2017-09-10 00:05:18.000000000 +0000 @@ -49,7 +49,7 @@ > except (ValueError, IndexError): > n = 10 > p = primes() - > print("The first %d primes: %s" % (n, list(islice(p, n)))) + > print "The first %d primes: %s" % (n, list(islice(p, n))) > EOF $ echo >> primes.py # to test html markup with an empty line just before EOF $ hg ci -Ama @@ -74,7 +74,7 @@ - test: f4fca47b67e6 primes.py + test: 1af356141006 primes.py @@ -112,7 +112,7 @@

- view primes.py @ 0:f4fca47b67e6 + view primes.py @ 0:1af356141006 tip

@@ -182,7 +182,7 @@ except (ValueError, IndexError): n = 10 p = primes() - print("The first %d primes: %s" % (n, list(islice(p, n)))) + print "The first %d primes: %s" % (n, list(islice(p, n)))
@@ -251,7 +251,7 @@

- annotate primes.py @ 0:f4fca47b67e6 + annotate primes.py @ 0:1af356141006 tip

@@ -299,19 +299,19 @@ - + 0 1 """Fun with generators. Corresponding Haskell implementation: @@ -321,14 +321,14 @@ 2 @@ -338,14 +338,14 @@ 3 primes = 2 : sieve [3, 5..] @@ -355,14 +355,14 @@ 4 where sieve (p:ns) = p : sieve [n | n <- ns, mod n p /= 0] @@ -372,14 +372,14 @@ 5 """ @@ -389,14 +389,14 @@ 6 @@ -406,14 +406,14 @@ 7 from itertools import dropwhile, ifilter, islice, count, chain @@ -423,14 +423,14 @@ 8 @@ -440,14 +440,14 @@ 9 def primes(): @@ -457,14 +457,14 @@ 10 """Generate all primes.""" @@ -474,14 +474,14 @@ 11 def sieve(ns): @@ -491,14 +491,14 @@ 12 p = ns.next() @@ -508,14 +508,14 @@ 13 # It is important to yield *here* in order to stop the @@ -525,14 +525,14 @@ 14 # infinite recursion. @@ -542,14 +542,14 @@ 15 yield p @@ -559,14 +559,14 @@ 16 ns = ifilter(lambda n: n % p != 0, ns) @@ -576,14 +576,14 @@ 17 for n in sieve(ns): @@ -593,14 +593,14 @@ 18 yield n @@ -610,14 +610,14 @@ 19 @@ -627,14 +627,14 @@ 20 odds = ifilter(lambda i: i % 2 == 1, count()) @@ -644,14 +644,14 @@ 21 return chain([2], sieve(dropwhile(lambda n: n < 3, odds))) @@ -661,14 +661,14 @@ 22 @@ -678,14 +678,14 @@ 23 if __name__ == "__main__": @@ -695,14 +695,14 @@ 24 import sys @@ -712,14 +712,14 @@ 25 try: @@ -729,14 +729,14 @@ 26 n = int(sys.argv[1]) @@ -746,14 +746,14 @@ 27 except (ValueError, IndexError): @@ -763,14 +763,14 @@ 28 n = 10 @@ -780,14 +780,14 @@ 29 p = primes() @@ -797,31 +797,31 @@ - 30 print("The first %d primes: %s" % (n, list(islice(p, n)))) + 30 print "The first %d primes: %s" % (n, list(islice(p, n))) 31 diff -Nru mercurial-4.3.1+207-xenial/tests/test-histedit-arguments.t mercurial-4.3.1/tests/test-histedit-arguments.t --- mercurial-4.3.1+207-xenial/tests/test-histedit-arguments.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-histedit-arguments.t 2017-09-10 00:05:18.000000000 +0000 @@ -494,7 +494,7 @@ $ cat >>$HGRCPATH < [experimental] - > stabilization=createmarkers,allowunstable + > evolution=createmarkers,allowunstable > EOF $ hg commit --amend -m 'allow this fold' $ hg histedit --continue diff -Nru mercurial-4.3.1+207-xenial/tests/test-histedit-edit.t mercurial-4.3.1/tests/test-histedit-edit.t --- mercurial-4.3.1+207-xenial/tests/test-histedit-edit.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-histedit-edit.t 2017-09-10 00:05:18.000000000 +0000 @@ -460,7 +460,7 @@ > EOF $ HGEDITOR="sh ../edit.sh" hg histedit 2 warning: histedit rules saved to: .hg/histedit-last-edit.txt - hg: parse error: first changeset cannot use verb "fold" + hg: parse error: cannot fold into public change 18aa70c8ad22 [255] $ cat .hg/histedit-last-edit.txt fold 0012be4a27ea 2 extend a diff -Nru mercurial-4.3.1+207-xenial/tests/test-histedit-fold.t mercurial-4.3.1/tests/test-histedit-fold.t --- mercurial-4.3.1+207-xenial/tests/test-histedit-fold.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-histedit-fold.t 2017-09-10 00:05:18.000000000 +0000 @@ -294,21 +294,9 @@ [1] There were conflicts, we keep P1 content. This should effectively drop the changes from +6. - - $ hg status -v + $ hg status M file ? file.orig - # The repository is in an unfinished *histedit* state. - - # Unresolved merge conflicts: - # - # file - # - # To mark files as resolved: hg resolve --mark FILE - - # To continue: hg histedit --continue - # To abort: hg histedit --abort - $ hg resolve -l U file $ hg revert -r 'p1()' file @@ -553,36 +541,3 @@ END $ cd .. - -Test rolling into a commit with multiple children (issue5498) - - $ hg init roll - $ cd roll - $ echo a > a - $ hg commit -qAm aa - $ echo b > b - $ hg commit -qAm bb - $ hg up -q ".^" - $ echo c > c - $ hg commit -qAm cc - $ hg log -G -T '{node|short} {desc}' - @ 5db65b93a12b cc - | - | o 301d76bdc3ae bb - |/ - o 8f0162e483d0 aa - - - $ hg histedit . --commands - << EOF - > r 5db65b93a12b - > EOF - hg: parse error: first changeset cannot use verb "roll" - [255] - $ hg log -G -T '{node|short} {desc}' - @ 5db65b93a12b cc - | - | o 301d76bdc3ae bb - |/ - o 8f0162e483d0 aa - - diff -Nru mercurial-4.3.1+207-xenial/tests/test-histedit-obsolete.t mercurial-4.3.1/tests/test-histedit-obsolete.t --- mercurial-4.3.1+207-xenial/tests/test-histedit-obsolete.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-histedit-obsolete.t 2017-09-10 00:05:18.000000000 +0000 @@ -8,7 +8,7 @@ > [phases] > publish=False > [experimental] - > stabilization=createmarkers,allowunstable + > evolution=createmarkers,allowunstable > [extensions] > histedit= > rebase= @@ -223,12 +223,12 @@ $ echo c >> c $ hg histedit --continue - $ hg log -r 'orphan()' + $ hg log -r 'unstable()' 11:c13eb81022ca f (no-eol) stabilise - $ hg rebase -r 'orphan()' -d . + $ hg rebase -r 'unstable()' -d . rebasing 11:c13eb81022ca "f" $ hg up tip -q @@ -545,7 +545,7 @@ | o 0:cb9a9f314b8b (public) a - $ hg histedit -r 'b449568bf7fc' --commands - << EOF --config experimental.stabilization.track-operation=1 + $ hg histedit -r 'b449568bf7fc' --commands - << EOF --config experimental.evolution.track-operation=1 > pick b449568bf7fc 13 f > pick 7395e1ff83bd 15 h > pick 6b70183d2492 14 g @@ -556,7 +556,7 @@ Editing (ee118ab9fa44), you may commit or record as needed now. (hg histedit --continue to resume) [1] - $ hg histedit --continue --config experimental.stabilization.track-operation=1 + $ hg histedit --continue --config experimental.evolution.track-operation=1 $ hg log -G @ 23:175d6b286a22 (secret) k | diff -Nru mercurial-4.3.1+207-xenial/tests/test-hook.t mercurial-4.3.1/tests/test-hook.t --- mercurial-4.3.1+207-xenial/tests/test-hook.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-hook.t 2017-09-10 00:05:18.000000000 +0000 @@ -409,7 +409,6 @@ $ cd "$TESTTMP/b" $ cat > hooktests.py < from __future__ import print_function > from mercurial import error > > uncallable = 0 @@ -419,9 +418,9 @@ > args.pop('repo', None) > a = list(args.items()) > a.sort() - > print('hook args:') + > print 'hook args:' > for k, v in a: - > print(' ', k, v) + > print ' ', k, v > > def passhook(**args): > printargs(args) @@ -446,7 +445,7 @@ > ui.note('verbose output from hook\n') > > def printtags(ui, repo, **args): - > print(sorted(repo.tags())) + > print sorted(repo.tags()) > > class container: > unreachable = 1 @@ -631,7 +630,7 @@ $ cat > hookext.py < def autohook(**args): - > print("Automatically installed hook") + > print "Automatically installed hook" > > def reposetup(ui, repo): > repo.ui.setconfig("hooks", "commit.auto", autohook) @@ -668,7 +667,7 @@ $ cd hooks $ cat > testhooks.py < def testhook(**args): - > print('hook works') + > print 'hook works' > EOF $ echo '[hooks]' > ../repo/.hg/hgrc $ echo "pre-commit.test = python:`pwd`/testhooks.py:testhook" >> ../repo/.hg/hgrc diff -Nru mercurial-4.3.1+207-xenial/tests/test-https.t mercurial-4.3.1/tests/test-https.t --- mercurial-4.3.1+207-xenial/tests/test-https.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-https.t 2017-09-10 00:05:18.000000000 +0000 @@ -624,6 +624,7 @@ $ P="$CERTSDIR" hg id https://localhost:$HGPORT/ warning: connecting to localhost using legacy security technology (TLS 1.0); see https://mercurial-scm.org/wiki/SecureConnections for more info (?) + (the full certificate chain may not be available locally; see "hg help debugssl") (windows !) abort: error: *handshake failure* (glob) [255] diff -Nru mercurial-4.3.1+207-xenial/tests/test-inherit-mode.t mercurial-4.3.1/tests/test-inherit-mode.t --- mercurial-4.3.1+207-xenial/tests/test-inherit-mode.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-inherit-mode.t 2017-09-10 00:05:18.000000000 +0000 @@ -25,13 +25,13 @@ > allnames.sort() > for name in allnames: > suffix = name in isdir and '/' or '' - > print('%05o %s%s' % (os.lstat(name).st_mode & 07777, name, suffix)) + > print '%05o %s%s' % (os.lstat(name).st_mode & 07777, name, suffix) > EOF $ cat >mode.py < import sys > import os - > print('%05o' % os.lstat(sys.argv[1]).st_mode) + > print '%05o' % os.lstat(sys.argv[1]).st_mode > EOF $ umask 077 diff -Nru mercurial-4.3.1+207-xenial/tests/test-issue4074.t mercurial-4.3.1/tests/test-issue4074.t --- mercurial-4.3.1+207-xenial/tests/test-issue4074.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-issue4074.t 2017-09-10 00:05:18.000000000 +0000 @@ -8,7 +8,7 @@ > print > if random.randint(0, 100) >= 50: > x += 1 - > print(hex(x)) + > print hex(x) > EOF $ hg init a diff -Nru mercurial-4.3.1+207-xenial/tests/test-largefiles-cache.t mercurial-4.3.1/tests/test-largefiles-cache.t --- mercurial-4.3.1+207-xenial/tests/test-largefiles-cache.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-largefiles-cache.t 2017-09-10 00:05:18.000000000 +0000 @@ -96,7 +96,7 @@ > #!$PYTHON > import sys, os > path = sys.argv[1] - > print('%03o' % (os.lstat(path).st_mode & 0777)) + > print '%03o' % (os.lstat(path).st_mode & 0777) > EOF $ chmod +x ls-l.py diff -Nru mercurial-4.3.1+207-xenial/tests/test-lfconvert.t mercurial-4.3.1/tests/test-lfconvert.t --- mercurial-4.3.1+207-xenial/tests/test-lfconvert.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-lfconvert.t 2017-09-10 00:05:18.000000000 +0000 @@ -128,7 +128,7 @@ $ hg merge merging sub/maybelarge.dat and stuff/maybelarge.dat to stuff/maybelarge.dat merging sub/normal2 and stuff/normal2 to stuff/normal2 - warning: stuff/maybelarge.dat looks like a binary file. (glob) + warning: $TESTTMP/bigfile-repo/stuff/maybelarge.dat looks like a binary file. (glob) warning: conflicts while merging stuff/maybelarge.dat! (edit, then use 'hg resolve --mark') 0 files updated, 1 files merged, 0 files removed, 1 files unresolved use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon @@ -326,7 +326,7 @@ $ cd largefiles-repo-hg $ cat >> .hg/hgrc < [experimental] - > stabilization=createmarkers + > evolution=createmarkers > EOF $ hg debugobsolete `hg log -r tip -T "{node}"` obsoleted 1 changesets diff -Nru mercurial-4.3.1+207-xenial/tests/test-log.t mercurial-4.3.1/tests/test-log.t --- mercurial-4.3.1+207-xenial/tests/test-log.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-log.t 2017-09-10 00:05:18.000000000 +0000 @@ -1700,7 +1700,7 @@ $ cat >> $HGRCPATH << EOF > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > EOF $ hg log --template='{rev}:{node}\n' @@ -1793,7 +1793,7 @@ $ cd problematicencoding $ $PYTHON > setup.sh < print(u''' + > print u''' > echo a > text > hg add text > hg --encoding utf-8 commit -u '\u30A2' -m none @@ -1803,13 +1803,13 @@ > hg --encoding utf-8 commit -u none -m '\u30A2' > echo d > text > hg --encoding utf-8 commit -u none -m '\u30C2' - > '''.encode('utf-8')) + > '''.encode('utf-8') > EOF $ sh < setup.sh test in problematic encoding $ $PYTHON > test.sh < print(u''' + > print u''' > hg --encoding cp932 log --template '{rev}\\n' -u '\u30A2' > echo ==== > hg --encoding cp932 log --template '{rev}\\n' -u '\u30C2' @@ -1817,7 +1817,7 @@ > hg --encoding cp932 log --template '{rev}\\n' -k '\u30A2' > echo ==== > hg --encoding cp932 log --template '{rev}\\n' -k '\u30C2' - > '''.encode('cp932')) + > '''.encode('cp932') > EOF $ sh < test.sh 0 @@ -2280,7 +2280,7 @@ $ hg init issue4490 $ cd issue4490 $ echo '[experimental]' >> .hg/hgrc - $ echo 'stabilization=createmarkers' >> .hg/hgrc + $ echo 'evolution=createmarkers' >> .hg/hgrc $ echo a > a $ hg ci -Am0 adding a diff -Nru mercurial-4.3.1+207-xenial/tests/test-merge1.t mercurial-4.3.1/tests/test-merge1.t --- mercurial-4.3.1+207-xenial/tests/test-merge1.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-merge1.t 2017-09-10 00:05:18.000000000 +0000 @@ -1,5 +1,4 @@ $ cat < merge - > from __future__ import print_function > import sys, os > > try: @@ -9,7 +8,7 @@ > except ImportError: > pass > - > print("merging for", os.path.basename(sys.argv[1])) + > print "merging for", os.path.basename(sys.argv[1]) > EOF $ HGMERGE="$PYTHON ../merge"; export HGMERGE diff -Nru mercurial-4.3.1+207-xenial/tests/test-merge6.t mercurial-4.3.1/tests/test-merge6.t --- mercurial-4.3.1+207-xenial/tests/test-merge6.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-merge6.t 2017-09-10 00:05:18.000000000 +0000 @@ -1,6 +1,6 @@ $ cat < merge > import sys, os - > print("merging for", os.path.basename(sys.argv[1])) + > print "merging for", os.path.basename(sys.argv[1]) > EOF $ HGMERGE="$PYTHON ../merge"; export HGMERGE diff -Nru mercurial-4.3.1+207-xenial/tests/test-merge-symlinks.t mercurial-4.3.1/tests/test-merge-symlinks.t --- mercurial-4.3.1+207-xenial/tests/test-merge-symlinks.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-merge-symlinks.t 2017-09-10 00:05:18.000000000 +0000 @@ -1,6 +1,5 @@ $ cat > echo.py < #!$PYTHON - > from __future__ import print_function > import os, sys > try: > import msvcrt @@ -10,7 +9,7 @@ > pass > > for k in ('HG_FILE', 'HG_MY_ISLINK', 'HG_OTHER_ISLINK', 'HG_BASE_ISLINK'): - > print(k, os.environ[k]) + > print k, os.environ[k] > EOF Create 2 heads containing the same file, once as diff -Nru mercurial-4.3.1+207-xenial/tests/test-mq-eol.t mercurial-4.3.1/tests/test-mq-eol.t --- mercurial-4.3.1+207-xenial/tests/test-mq-eol.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-mq-eol.t 2017-09-10 00:05:18.000000000 +0000 @@ -33,7 +33,7 @@ > for line in file(sys.argv[1], 'rb'): > line = line.replace('\r', '') > line = line.replace('\n', '') - > print(line) + > print line > EOF $ hg init repo diff -Nru mercurial-4.3.1+207-xenial/tests/test-notify-changegroup.t mercurial-4.3.1/tests/test-notify-changegroup.t --- mercurial-4.3.1+207-xenial/tests/test-notify-changegroup.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-notify-changegroup.t 2017-09-10 00:05:18.000000000 +0000 @@ -39,7 +39,7 @@ push $ hg --traceback --cwd b push ../a 2>&1 | - > $PYTHON -c 'from __future__ import print_function ; import sys,re; print(re.sub("\n\t", " ", sys.stdin.read()), end="")' + > $PYTHON -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),' pushing to ../a searching for changes adding changesets @@ -92,7 +92,7 @@ unbundle with correct source $ hg --config notify.sources=unbundle --cwd a unbundle ../test.hg 2>&1 | - > $PYTHON -c 'from __future__ import print_function ; import sys,re; print(re.sub("\n\t", " ", sys.stdin.read()), end="")' + > $PYTHON -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),' adding changesets adding manifests adding file changes @@ -167,7 +167,7 @@ push $ hg --traceback --cwd b --config notify.fromauthor=True push ../a 2>&1 | - > $PYTHON -c 'from __future__ import print_function ; import sys,re; print(re.sub("\n\t", " ", sys.stdin.read()), end="")' + > $PYTHON -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),' pushing to ../a searching for changes adding changesets diff -Nru mercurial-4.3.1+207-xenial/tests/test-notify.t mercurial-4.3.1/tests/test-notify.t --- mercurial-4.3.1+207-xenial/tests/test-notify.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-notify.t 2017-09-10 00:05:18.000000000 +0000 @@ -1,8 +1,3 @@ - $ cat > $TESTTMP/filter.py < from __future__ import print_function - > import sys, re - > print(re.sub("\n[ \t]", " ", sys.stdin.read()), end="") - > EOF $ cat <> $HGRCPATH > [extensions] @@ -180,7 +175,8 @@ of the very long subject line pull (minimal config) - $ hg --traceback --cwd b pull ../a | $PYTHON $TESTTMP/filter.py + $ hg --traceback --cwd b pull ../a | \ + > $PYTHON -c 'import sys,re; print re.sub("\n[\t ]", " ", sys.stdin.read()),' pulling from ../a searching for changes adding changesets @@ -209,7 +205,6 @@ @@ -1,1 +1,2 @@ a +a (run 'hg update' to get a working copy) - $ cat <> $HGRCPATH > [notify] > config = `pwd`/.notify.conf @@ -233,7 +228,8 @@ $ hg --cwd b rollback repository tip rolled back to revision 0 (undo pull) - $ hg --traceback --cwd b pull ../a | $PYTHON $TESTTMP/filter.py + $ hg --traceback --cwd b pull ../a | \ + > $PYTHON -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),' pulling from ../a searching for changes adding changesets @@ -258,7 +254,8 @@ diff -r cb9a9f314b8b -r 0647d048b600 a --- a/a Thu Jan 01 00:00:00 1970 +0000 +++ b/a Thu Jan 01 00:00:01 1970 +0000 - @@ -1,1 +1,2 @@ a + @@ -1,1 +1,2 @@ + a +a (run 'hg update' to get a working copy) @@ -275,7 +272,8 @@ $ hg --cwd b rollback repository tip rolled back to revision 0 (undo pull) - $ hg --traceback --cwd b pull ../a | $PYTHON $TESTTMP/filter.py + $ hg --traceback --cwd b pull ../a | \ + > $PYTHON -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),' pulling from ../a searching for changes adding changesets @@ -296,14 +294,17 @@ changeset 0647d048b600 in b description: b diffstat: - a | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) + + a | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) diffs (6 lines): diff -r cb9a9f314b8b -r 0647d048b600 a --- a/a Thu Jan 01 00:00:00 1970 +0000 +++ b/a Thu Jan 01 00:00:01 1970 +0000 - @@ -1,1 +1,2 @@ a + @@ -1,1 +1,2 @@ + a +a (run 'hg update' to get a working copy) @@ -320,7 +321,8 @@ (branch merge, don't forget to commit) $ hg ci -m merge -d '3 0' $ cd .. - $ hg --traceback --cwd b pull ../a | $PYTHON $TESTTMP/filter.py + $ hg --traceback --cwd b pull ../a | \ + > $PYTHON -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),' pulling from ../a searching for changes adding changesets @@ -341,14 +343,17 @@ changeset 0a184ce6067f in b description: adda2 diffstat: - a | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) + + a | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) diffs (6 lines): diff -r cb9a9f314b8b -r 0a184ce6067f a --- a/a Thu Jan 01 00:00:00 1970 +0000 +++ b/a Thu Jan 01 00:00:02 1970 +0000 - @@ -1,1 +1,2 @@ a + @@ -1,1 +1,2 @@ + a +a Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 @@ -375,7 +380,7 @@ $ hg --cwd a --encoding utf-8 commit -A -d '0 0' \ > -m `$PYTHON -c 'print "\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4"'` $ hg --traceback --cwd b --encoding utf-8 pull ../a | \ - > $PYTHON $TESTTMP/filter.py + > $PYTHON -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),' pulling from ../a searching for changes adding changesets @@ -396,14 +401,18 @@ changeset 7ea05ad269dc in b description: \xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4 (esc) diffstat: - a | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) + + a | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) diffs (7 lines): diff -r 6a0cf76b2701 -r 7ea05ad269dc a --- a/a Thu Jan 01 00:00:03 1970 +0000 +++ b/a Thu Jan 01 00:00:00 1970 +0000 - @@ -1,2 +1,3 @@ a a + @@ -1,2 +1,3 @@ + a + a +a (run 'hg update' to get a working copy) @@ -426,7 +435,7 @@ added 1 changesets with 1 changes to 1 files notify: sending 2 subscribers 1 changes (run 'hg update' to get a working copy) - $ $PYTHON $TESTTMP/filter.py < b/mbox + $ $PYTHON -c 'import sys,re; print re.sub("\n\t", " ", file("b/mbox").read()),' From test@test.com ... ... .. ..:..:.. .... (re) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 @@ -442,14 +451,19 @@ changeset e0be44cf638b in b description: long line diffstat: - a | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) + + a | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) diffs (8 lines): diff -r 7ea05ad269dc -r e0be44cf638b a --- a/a Thu Jan 01 00:00:00 1970 +0000 +++ b/a Thu Jan 01 00:00:00 1970 +0000 - @@ -1,3 +1,4 @@ a a a + @@ -1,3 +1,4 @@ + a + a + a +nonononononononononononononononononononononononononononononononononononono= nononononononononononononononononononononononononononononononononononononon= ononononononononononononononononononononononononononononononononononononono= @@ -486,7 +500,8 @@ (branches are permanent and global, did you want a bookmark?) $ echo a >> a/a $ hg --cwd a ci -m test -d '1 0' - $ hg --traceback --cwd b pull ../a | $PYTHON $TESTTMP/filter.py + $ hg --traceback --cwd b pull ../a | \ + > $PYTHON -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),' pulling from ../a searching for changes adding changesets @@ -515,7 +530,8 @@ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ echo a >> a/a $ hg --cwd a ci -m test -d '1 0' - $ hg --traceback --cwd b pull ../a | $PYTHON $TESTTMP/filter.py + $ hg --traceback --cwd b pull ../a | \ + > $PYTHON -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),' pulling from ../a searching for changes adding changesets @@ -543,7 +559,8 @@ $ mv "$HGRCPATH.new" $HGRCPATH $ echo a >> a/a $ hg --cwd a commit -m 'default template' - $ hg --cwd b pull ../a -q | $PYTHON $TESTTMP/filter.py + $ hg --cwd b pull ../a -q | \ + > $PYTHON -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),' Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit @@ -572,7 +589,8 @@ > EOF $ echo a >> a/a $ hg --cwd a commit -m 'with style' - $ hg --cwd b pull ../a -q | $PYTHON $TESTTMP/filter.py + $ hg --cwd b pull ../a -q | \ + > $PYTHON -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),' Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit @@ -595,7 +613,8 @@ > EOF $ echo a >> a/a $ hg --cwd a commit -m 'with template' - $ hg --cwd b pull ../a -q | $PYTHON $TESTTMP/filter.py + $ hg --cwd b pull ../a -q | \ + > $PYTHON -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),' Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit diff -Nru mercurial-4.3.1+207-xenial/tests/test-obsmarker-template.t mercurial-4.3.1/tests/test-obsmarker-template.t --- mercurial-4.3.1+207-xenial/tests/test-obsmarker-template.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-obsmarker-template.t 2017-09-10 00:05:18.000000000 +0000 @@ -10,7 +10,7 @@ > [phases] > publish=False > [experimental] - > stabilization=all + > evolution=all > [alias] > tlog = log -G -T '{node|short}\ > {if(predecessors, "\n Predecessors: {predecessors}")}\ @@ -442,14 +442,14 @@ | parent: 0:ea207398892e | user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | instability: content-divergent + | trouble: divergent | summary: A2 | | o changeset: 2:fdf9bde5129a |/ parent: 0:ea207398892e | user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | instability: content-divergent + | trouble: divergent | summary: A1 | | x changeset: 1:471f378eab4c @@ -469,7 +469,7 @@ | parent: 0:ea207398892e | user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | instability: content-divergent + | trouble: divergent | summary: A3 | | x changeset: 3:65b757b745b9 @@ -482,7 +482,7 @@ |/ parent: 0:ea207398892e | user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | instability: content-divergent + | trouble: divergent | summary: A1 | | x changeset: 1:471f378eab4c @@ -1086,20 +1086,20 @@ | parent: 5:dd800401bd8c | user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | instability: content-divergent + | trouble: divergent | summary: Add B only | | o changeset: 8:b18bc8331526 |/ parent: 5:dd800401bd8c | user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | instability: content-divergent + | trouble: divergent | summary: Add only B | | o changeset: 7:ba2ed02b0c9a | | user: test | | date: Thu Jan 01 00:00:00 1970 +0000 - | | instability: orphan, content-divergent + | | trouble: unstable, divergent | | summary: Add A,B,C | | | x changeset: 6:4a004186e638 @@ -1111,7 +1111,7 @@ | parent: 3:f897c6137566 | user: test | date: Thu Jan 01 00:00:00 1970 +0000 - | instability: content-divergent + | trouble: divergent | summary: Add A,B,C | o changeset: 3:f897c6137566 diff -Nru mercurial-4.3.1+207-xenial/tests/test-obsolete-bundle-strip.t mercurial-4.3.1/tests/test-obsolete-bundle-strip.t --- mercurial-4.3.1+207-xenial/tests/test-obsolete-bundle-strip.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-obsolete-bundle-strip.t 2017-09-10 00:05:18.000000000 +0000 @@ -15,10 +15,10 @@ > > [experimental] > # enable evolution - > stabilization = all + > evolution = all > > # include obsmarkers in bundle - > stabilization.bundle-obsmarker = yes + > evolution.bundle-obsmarker = yes > > [extensions] > # needed for some tests diff -Nru mercurial-4.3.1+207-xenial/tests/test-obsolete-changeset-exchange.t mercurial-4.3.1/tests/test-obsolete-changeset-exchange.t --- mercurial-4.3.1+207-xenial/tests/test-obsolete-changeset-exchange.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-obsolete-changeset-exchange.t 2017-09-10 00:05:18.000000000 +0000 @@ -3,7 +3,7 @@ $ cat >> $HGRCPATH << EOF > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > EOF Push does not corrupt remote @@ -87,7 +87,7 @@ check-that bundle can contain markers: - $ hg bundle --hidden --rev f89bcc95eba5 --base "f89bcc95eba5^" ../f89bcc95eba5-obs.hg --config experimental.stabilization.bundle-obsmarker=1 + $ hg bundle --hidden --rev f89bcc95eba5 --base "f89bcc95eba5^" ../f89bcc95eba5-obs.hg --config experimental.evolution.bundle-obsmarker=1 1 changesets found $ hg debugbundle ../f89bcc95eba5.hg Stream params: sortdict([('Compression', 'BZ')]) diff -Nru mercurial-4.3.1+207-xenial/tests/test-obsolete-checkheads.t mercurial-4.3.1/tests/test-obsolete-checkheads.t --- mercurial-4.3.1+207-xenial/tests/test-obsolete-checkheads.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-obsolete-checkheads.t 2017-09-10 00:05:18.000000000 +0000 @@ -6,7 +6,7 @@ > [ui] > logtemplate='{node|short} ({phase}) {desc|firstline}\n' > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > EOF $ mkcommit() { > echo "$1" > "$1" diff -Nru mercurial-4.3.1+207-xenial/tests/test-obsolete-divergent.t mercurial-4.3.1/tests/test-obsolete-divergent.t --- mercurial-4.3.1+207-xenial/tests/test-obsolete-divergent.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-obsolete-divergent.t 2017-09-10 00:05:18.000000000 +0000 @@ -9,7 +9,7 @@ > [ui] > logtemplate = {rev}:{node|short} {desc}\n > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > [extensions] > drawdag=$TESTDIR/drawdag.py > [alias] @@ -80,7 +80,7 @@ 82623d38b9ba 392fd25390da 392fd25390da - $ hg log -r 'contentdivergent()' + $ hg log -r 'divergent()' 2:82623d38b9ba A_1 3:392fd25390da A_2 $ hg debugsuccessorssets 'all()' --closest @@ -107,7 +107,7 @@ $ hg push ../other pushing to ../other searching for changes - abort: push includes content-divergent changeset: 392fd25390da! + abort: push includes divergent changeset: 392fd25390da! [255] $ cd .. @@ -147,7 +147,7 @@ 01f36c5a8fda 01f36c5a8fda 01f36c5a8fda - $ hg log -r 'contentdivergent()' + $ hg log -r 'divergent()' 2:82623d38b9ba A_1 4:01f36c5a8fda A_3 $ hg debugsuccessorssets 'all()' --closest @@ -199,7 +199,7 @@ 82623d38b9ba 392fd25390da 392fd25390da - $ hg log -r 'contentdivergent()' + $ hg log -r 'divergent()' 2:82623d38b9ba A_1 3:392fd25390da A_2 $ hg debugsuccessorssets 'all()' --closest @@ -278,7 +278,7 @@ 01f36c5a8fda 01f36c5a8fda 01f36c5a8fda - $ hg log -r 'contentdivergent()' + $ hg log -r 'divergent()' $ hg debugsuccessorssets 'all()' --closest d20a80d4def3 d20a80d4def3 @@ -322,7 +322,7 @@ 82623d38b9ba 392fd25390da 392fd25390da - $ hg log -r 'contentdivergent()' + $ hg log -r 'divergent()' $ hg debugsuccessorssets 'all()' --closest d20a80d4def3 d20a80d4def3 @@ -410,7 +410,7 @@ e442cfc57690 e442cfc57690 e442cfc57690 - $ hg log -r 'contentdivergent()' + $ hg log -r 'divergent()' Check more complex obsolescence graft (with divergence) @@ -515,7 +515,7 @@ 14608b260df8 bed64f5d2f5a bed64f5d2f5a - $ hg log -r 'contentdivergent()' + $ hg log -r 'divergent()' 4:01f36c5a8fda A_3 8:7ae126973a96 A_7 9:14608b260df8 A_8 @@ -614,7 +614,7 @@ a139f71be9da a139f71be9da a139f71be9da - $ hg log -r 'contentdivergent()' + $ hg log -r 'divergent()' $ cd .. @@ -670,10 +670,10 @@ $ rm .hg/localtags $ hg cleanup --config extensions.t=$TESTTMP/scmutilcleanup.py - $ hg log -G -T '{rev}:{node|short} {desc} {instabilities}' -r 'sort(all(), topo)' - @ 5:1a2a9b5b0030 B2 content-divergent + $ hg log -G -T '{rev}:{node|short} {desc} {troubles}' -r 'sort(all(), topo)' + @ 5:1a2a9b5b0030 B2 divergent | - | o 4:70d5a63ca112 B4 content-divergent + | o 4:70d5a63ca112 B4 divergent | | | o 1:48b9aae0607f Z | diff -Nru mercurial-4.3.1+207-xenial/tests/test-obsolete.t mercurial-4.3.1/tests/test-obsolete.t --- mercurial-4.3.1+207-xenial/tests/test-obsolete.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-obsolete.t 2017-09-10 00:05:18.000000000 +0000 @@ -3,7 +3,7 @@ > # public changeset are not obsolete > publish=false > [ui] - > logtemplate="{rev}:{node|short} ({phase}{if(obsolete, ' *{obsolete}*')}{if(instabilities, ' {instabilities}')}) [{tags} {bookmarks}] {desc|firstline}\n" + > logtemplate="{rev}:{node|short} ({phase}{if(obsolete, ' *{obsolete}*')}{if(troubles, ' {troubles}')}) [{tags} {bookmarks}] {desc|firstline}\n" > EOF $ mkcommit() { > echo "$1" > "$1" @@ -39,7 +39,7 @@ $ cat >> $HGRCPATH << EOF > [experimental] - > stabilization=createmarkers,exchange + > evolution=createmarkers,exchange > EOF Killing a single changeset without replacement @@ -207,7 +207,7 @@ $ hg --hidden phase --public 2 $ hg log -G - @ 5:5601fb93a350 (draft phase-divergent) [tip ] add new_3_c + @ 5:5601fb93a350 (draft bumped) [tip ] add new_3_c | | o 2:245bde4270cd (public) [ ] add original_c |/ @@ -223,8 +223,8 @@ note that the bumped changeset (5:5601fb93a350) is not a direct successor of the public changeset - $ hg log --hidden -r 'phasedivergent()' - 5:5601fb93a350 (draft phase-divergent) [tip ] add new_3_c + $ hg log --hidden -r 'bumped()' + 5:5601fb93a350 (draft bumped) [tip ] add new_3_c And that we can't push bumped changeset @@ -239,20 +239,20 @@ $ hg push ../tmpa pushing to ../tmpa searching for changes - abort: push includes phase-divergent changeset: 5601fb93a350! + abort: push includes bumped changeset: 5601fb93a350! [255] Fixing "bumped" situation We need to create a clone of 5 and add a special marker with a flag $ hg summary - parent: 5:5601fb93a350 tip (phase-divergent) + parent: 5:5601fb93a350 tip (bumped) add new_3_c branch: default commit: (clean) update: 1 new changesets, 2 branch heads (merge) phases: 1 draft - phase-divergent: 1 changesets + bumped: 1 changesets $ hg up '5^' 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg revert -ar 5 @@ -261,7 +261,7 @@ created new head $ hg debugobsolete -d '1338 0' --flags 1 `getid new_3_c` `getid n3w_3_c` obsoleted 1 changesets - $ hg log -r 'phasedivergent()' + $ hg log -r 'bumped()' $ hg log -G @ 6:6f9641995072 (draft) [tip ] add n3w_3_c | @@ -520,15 +520,15 @@ $ hg log -r 'obsolete()' 4:94b33453f93b (draft *obsolete*) [ ] add original_d $ hg summary - parent: 5:cda648ca50f5 tip (orphan) + parent: 5:cda648ca50f5 tip (unstable) add original_e branch: default commit: (clean) update: 1 new changesets, 2 branch heads (merge) phases: 3 draft - orphan: 1 changesets - $ hg log -G -r '::orphan()' - @ 5:cda648ca50f5 (draft orphan) [tip ] add original_e + unstable: 1 changesets + $ hg log -G -r '::unstable()' + @ 5:cda648ca50f5 (draft unstable) [tip ] add original_e | x 4:94b33453f93b (draft *obsolete*) [ ] add original_d | @@ -552,7 +552,7 @@ $ hg push ../tmpc/ pushing to ../tmpc/ searching for changes - abort: push includes orphan changeset: cda648ca50f5! + abort: push includes unstable changeset: cda648ca50f5! [255] Test that extinct changeset are properly detected @@ -570,7 +570,7 @@ 2:245bde4270cd (public) [ ] add original_c 3:6f9641995072 (draft) [ ] add n3w_3_c 4:94b33453f93b (draft *obsolete*) [ ] add original_d - 5:cda648ca50f5 (draft orphan) [tip ] add original_e + 5:cda648ca50f5 (draft unstable) [tip ] add original_e $ hg push ../tmpf -f # -f because be push unstable too pushing to ../tmpf searching for changes @@ -591,7 +591,7 @@ Do not warn about new head when the new head is a successors of a remote one $ hg log -G - @ 5:cda648ca50f5 (draft orphan) [tip ] add original_e + @ 5:cda648ca50f5 (draft unstable) [tip ] add original_e | x 4:94b33453f93b (draft *obsolete*) [ ] add original_d | @@ -699,42 +699,42 @@ "date": [1339.0, 0], "flag": 0, "metadata": {"user": "test"}, - "prednode": "1339133913391339133913391339133913391339", + "precnode": "1339133913391339133913391339133913391339", "succnodes": ["ca819180edb99ed25ceafb3e9584ac287e240b00"] }, { "date": [1339.0, 0], "flag": 0, "metadata": {"user": "test"}, - "prednode": "1337133713371337133713371337133713371337", + "precnode": "1337133713371337133713371337133713371337", "succnodes": ["5601fb93a350734d935195fee37f4054c529ff39"] }, { "date": [121.0, 120], "flag": 12, "metadata": {"user": "test"}, - "prednode": "245bde4270cd1072a27757984f9cda8ba26f08ca", + "precnode": "245bde4270cd1072a27757984f9cda8ba26f08ca", "succnodes": ["cdbce2fbb16313928851e97e0d85413f3f7eb77f"] }, { "date": [1338.0, 0], "flag": 1, "metadata": {"user": "test"}, - "prednode": "5601fb93a350734d935195fee37f4054c529ff39", + "precnode": "5601fb93a350734d935195fee37f4054c529ff39", "succnodes": ["6f96419950729f3671185b847352890f074f7557"] }, { "date": [1338.0, 0], "flag": 0, "metadata": {"user": "test"}, - "prednode": "ca819180edb99ed25ceafb3e9584ac287e240b00", + "precnode": "ca819180edb99ed25ceafb3e9584ac287e240b00", "succnodes": ["1337133713371337133713371337133713371337"] }, { "date": [1337.0, 0], "flag": 0, "metadata": {"user": "test"}, - "prednode": "cdbce2fbb16313928851e97e0d85413f3f7eb77f", + "precnode": "cdbce2fbb16313928851e97e0d85413f3f7eb77f", "succnodes": ["ca819180edb99ed25ceafb3e9584ac287e240b00"] }, { @@ -742,14 +742,14 @@ "flag": 0, "metadata": {"user": "test"}, "parentnodes": ["6f96419950729f3671185b847352890f074f7557"], - "prednode": "94b33453f93bdb8d457ef9b770851a618bf413e1", + "precnode": "94b33453f93bdb8d457ef9b770851a618bf413e1", "succnodes": [] }, { "date": *, (glob) "flag": 0, "metadata": {"user": "test "}, - "prednode": "cda648ca50f50482b7055c0b0c4c117bba6733d9", + "precnode": "cda648ca50f50482b7055c0b0c4c117bba6733d9", "succnodes": ["3de5eca88c00aa039da7399a220f4a5221faa585"] } ] @@ -892,7 +892,7 @@ Checking _enable=False warning if obsolete marker exists $ echo '[experimental]' >> $HGRCPATH - $ echo "stabilization=" >> $HGRCPATH + $ echo "evolution=" >> $HGRCPATH $ hg log -r tip obsolete feature not enabled but 68 markers found! 68:c15e9edfca13 (draft) [tip ] add celestine @@ -900,7 +900,7 @@ reenable for later test $ echo '[experimental]' >> $HGRCPATH - $ echo "stabilization=createmarkers,exchange" >> $HGRCPATH + $ echo "evolution=createmarkers,exchange" >> $HGRCPATH $ rm hg.pid access.log errors.log #endif @@ -910,11 +910,11 @@ $ hg debugobsolete `getid obsolete_e` obsoleted 1 changesets $ hg debugobsolete `getid original_c` `getid babar` - $ hg log --config ui.logtemplate= -r 'phasedivergent() and orphan()' + $ hg log --config ui.logtemplate= -r 'bumped() and unstable()' changeset: 7:50c51b361e60 user: test date: Thu Jan 01 00:00:00 1970 +0000 - instability: orphan, phase-divergent + trouble: unstable, bumped summary: add babar @@ -925,16 +925,16 @@ test the "troubles" templatekw - $ hg log -r 'phasedivergent() and orphan()' - 7:50c51b361e60 (draft orphan phase-divergent) [ ] add babar + $ hg log -r 'bumped() and unstable()' + 7:50c51b361e60 (draft unstable bumped) [ ] add babar test the default cmdline template - $ hg log -T default -r 'phasedivergent()' + $ hg log -T default -r 'bumped()' changeset: 7:50c51b361e60 user: test date: Thu Jan 01 00:00:00 1970 +0000 - instability: orphan, phase-divergent + trouble: unstable, bumped summary: add babar $ hg log -T default -r 'obsolete()' @@ -945,53 +945,19 @@ summary: add obsolete_e -test the obsolete labels - - $ hg log --config ui.logtemplate= --color=debug -r 'phasedivergent()' - [log.changeset changeset.draft changeset.unstable instability.orphan instability.phase-divergent|changeset: 7:50c51b361e60] - [log.user|user: test] - [log.date|date: Thu Jan 01 00:00:00 1970 +0000] - [log.instability|instability: orphan, phase-divergent] - [log.summary|summary: add babar] - - - $ hg log -T default -r 'phasedivergent()' --color=debug - [log.changeset changeset.draft changeset.unstable instability.orphaninstability.phase-divergent|changeset: 7:50c51b361e60] - [log.user|user: test] - [log.date|date: Thu Jan 01 00:00:00 1970 +0000] - [log.instability|instability: orphan, phase-divergent] - [log.summary|summary: add babar] - - - $ hg log --config ui.logtemplate= --color=debug -r "obsolete()" - [log.changeset changeset.draft changeset.obsolete|changeset: 6:3de5eca88c00] - [log.parent changeset.draft|parent: 3:6f9641995072] - [log.user|user: test] - [log.date|date: Thu Jan 01 00:00:00 1970 +0000] - [log.summary|summary: add obsolete_e] - - - $ hg log -T default -r 'obsolete()' --color=debug - [log.changeset changeset.draft changeset.obsolete|changeset: 6:3de5eca88c00] - [log.parent changeset.draft|parent: 3:6f9641995072] - [log.user|user: test] - [log.date|date: Thu Jan 01 00:00:00 1970 +0000] - [log.summary|summary: add obsolete_e] - - test summary output - $ hg up -r 'phasedivergent() and orphan()' + $ hg up -r 'bumped() and unstable()' 1 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg summary - parent: 7:50c51b361e60 (orphan, phase-divergent) + parent: 7:50c51b361e60 (unstable, bumped) add babar branch: default commit: (clean) update: 2 new changesets (update) phases: 4 draft - orphan: 2 changesets - phase-divergent: 1 changesets + unstable: 2 changesets + bumped: 1 changesets $ hg up -r 'obsolete()' 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg summary @@ -1001,8 +967,8 @@ commit: (clean) update: 3 new changesets (update) phases: 4 draft - orphan: 2 changesets - phase-divergent: 1 changesets + unstable: 2 changesets + bumped: 1 changesets Test incoming/outcoming with changesets obsoleted remotely, known locally =============================================================================== @@ -1297,7 +1263,7 @@ $ hg ci -m '2' $ echo bar > f2 - $ hg commit --amend --config experimetnal.stabilization=createmarkers + $ hg commit --amend --config experimetnal.evolution=createmarkers $ hg log -G @ 4:b0551702f918 (draft) [tip ] 2 | @@ -1436,7 +1402,7 @@ $ echo d > d $ hg ci -Am d adding d - $ hg ci --amend -m dd --config experimental.stabilization.track-operation=1 + $ hg ci --amend -m dd --config experimental.evolution.track-operation=1 $ hg debugobsolete --index --rev "3+7" 1 6fdef60fcbabbd3d50e9b9cbc2a240724b91a5e1 d27fb9b066076fd921277a4b9e8b9cb48c95bc6a 0 \(.*\) {'user': 'test'} (re) 3 4715cf767440ed891755448016c2b8cf70760c30 7ae79c5d60f049c7b0dd02f5f25b9d60aaf7b36d 0 \(.*\) {'operation': 'amend', 'user': 'test'} (re) @@ -1447,7 +1413,7 @@ "flag": 0, "index": 1, "metadata": {"user": "test"}, - "prednode": "6fdef60fcbabbd3d50e9b9cbc2a240724b91a5e1", + "precnode": "6fdef60fcbabbd3d50e9b9cbc2a240724b91a5e1", "succnodes": ["d27fb9b066076fd921277a4b9e8b9cb48c95bc6a"] }, { @@ -1455,7 +1421,7 @@ "flag": 0, "index": 3, "metadata": {"operation": "amend", "user": "test"}, - "prednode": "4715cf767440ed891755448016c2b8cf70760c30", + "precnode": "4715cf767440ed891755448016c2b8cf70760c30", "succnodes": ["7ae79c5d60f049c7b0dd02f5f25b9d60aaf7b36d"] } ] diff -Nru mercurial-4.3.1+207-xenial/tests/test-obsolete-tag-cache.t mercurial-4.3.1/tests/test-obsolete-tag-cache.t --- mercurial-4.3.1+207-xenial/tests/test-obsolete-tag-cache.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-obsolete-tag-cache.t 2017-09-10 00:05:18.000000000 +0000 @@ -5,7 +5,7 @@ > mock=$TESTDIR/mockblackbox.py > > [experimental] - > stabilization = createmarkers + > evolution = createmarkers > EOF Create a repo with some tags diff -Nru mercurial-4.3.1+207-xenial/tests/test-phases.t mercurial-4.3.1/tests/test-phases.t --- mercurial-4.3.1+207-xenial/tests/test-phases.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-phases.t 2017-09-10 00:05:18.000000000 +0000 @@ -588,7 +588,7 @@ (enabling evolution) $ cat >> $HGRCPATH << EOF > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > EOF (making a changeset hidden; H in that case) diff -Nru mercurial-4.3.1+207-xenial/tests/test-push-http.t mercurial-4.3.1/tests/test-push-http.t --- mercurial-4.3.1+207-xenial/tests/test-push-http.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-push-http.t 2017-09-10 00:05:18.000000000 +0000 @@ -172,20 +172,4 @@ % serve errors [255] - $ cat > .hg/hgrc < [web] - > push_ssl = false - > allow_push = * - > [experimental] - > httppostargs=true - > EOF - $ req - pushing to http://localhost:$HGPORT/ - searching for changes - remote: adding changesets - remote: adding manifests - remote: adding file changes - remote: added 1 changesets with 1 changes to 1 files - % serve errors - $ cd .. diff -Nru mercurial-4.3.1+207-xenial/tests/test-push-race.t mercurial-4.3.1/tests/test-push-race.t --- mercurial-4.3.1+207-xenial/tests/test-push-race.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-push-race.t 2017-09-10 00:05:18.000000000 +0000 @@ -98,7 +98,7 @@ > [phases] > publish = no > [experimental] - > stabilization = all + > evolution = all > [alias] > graph = log -G --rev 'sort(all(), "topo")' > EOF diff -Nru mercurial-4.3.1+207-xenial/tests/test-pushvars.t mercurial-4.3.1/tests/test-pushvars.t --- mercurial-4.3.1+207-xenial/tests/test-pushvars.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-pushvars.t 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -Setup - - $ PYTHONPATH=$TESTDIR/..:$PYTHONPATH - $ export PYTHONPATH - - $ cat > $TESTTMP/pretxnchangegroup.sh << EOF - > #!/bin/sh - > env | egrep "^HG_USERVAR_(DEBUG|BYPASS_REVIEW)" | sort - > exit 0 - > EOF - $ cat >> $HGRCPATH << EOF - > [hooks] - > pretxnchangegroup = sh $TESTTMP/pretxnchangegroup.sh - > [experimental] - > bundle2-exp = true - > EOF - - $ hg init repo - $ hg clone -q repo child - $ cd child - -Test pushing vars to repo with pushvars.server not set - - $ echo b > a - $ hg commit -Aqm a - $ hg push --pushvars "DEBUG=1" --pushvars "BYPASS_REVIEW=true" - pushing to $TESTTMP/repo (glob) - searching for changes - adding changesets - adding manifests - adding file changes - added 1 changesets with 1 changes to 1 files - -Setting pushvars.sever = true and then pushing. - - $ echo [push] >> $HGRCPATH - $ echo "pushvars.server = true" >> $HGRCPATH - $ echo b >> a - $ hg commit -Aqm a - $ hg push --pushvars "DEBUG=1" --pushvars "BYPASS_REVIEW=true" - pushing to $TESTTMP/repo (glob) - searching for changes - adding changesets - adding manifests - adding file changes - added 1 changesets with 1 changes to 1 files - HG_USERVAR_BYPASS_REVIEW=true - HG_USERVAR_DEBUG=1 - -Test pushing var with empty right-hand side - - $ echo b >> a - $ hg commit -Aqm a - $ hg push --pushvars "DEBUG=" - pushing to $TESTTMP/repo (glob) - searching for changes - adding changesets - adding manifests - adding file changes - added 1 changesets with 1 changes to 1 files - HG_USERVAR_DEBUG= - -Test pushing bad vars - - $ echo b >> a - $ hg commit -Aqm b - $ hg push --pushvars "DEBUG" - pushing to $TESTTMP/repo (glob) - abort: unable to parse variable 'DEBUG', should follow 'KEY=VALUE' or 'KEY=' format - [255] diff -Nru mercurial-4.3.1+207-xenial/tests/test-rebase-base.t mercurial-4.3.1/tests/test-rebase-base.t --- mercurial-4.3.1+207-xenial/tests/test-rebase-base.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-rebase-base.t 2017-09-10 00:05:18.000000000 +0000 @@ -379,40 +379,3 @@ / o 0: A -Rebasing using a single transaction - - $ hg init singletr && cd singletr - $ cat >> .hg/hgrc < [rebase] - > singletransaction=True - > EOF - $ hg debugdrawdag <<'EOF' - > Z - > | - > | D - > | | - > | C - > | | - > Y B - > |/ - > A - > EOF -- We should only see two status stored messages. One from the start, one from -- the end. - $ hg rebase --debug -b D -d Z | grep 'status stored' - rebase status stored - rebase status stored - $ hg tglog - o 5: D - | - o 4: C - | - o 3: B - | - o 2: Z - | - o 1: Y - | - o 0: A - - $ cd .. diff -Nru mercurial-4.3.1+207-xenial/tests/test-rebase-brute-force.t mercurial-4.3.1/tests/test-rebase-brute-force.t --- mercurial-4.3.1+207-xenial/tests/test-rebase-brute-force.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-rebase-brute-force.t 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ - $ cat >> $HGRCPATH < [extensions] - > drawdag=$TESTDIR/drawdag.py - > bruterebase=$TESTDIR/bruterebase.py - > [experimental] - > evolution=createmarkers,allowunstable - > EOF - $ init() { - > N=`expr ${N:-0} + 1` - > cd $TESTTMP && hg init repo$N && cd repo$N - > hg debugdrawdag - > } - -Source looks like "N" - - $ init <<'EOS' - > C D - > |\| - > A B Z - > EOS - - $ hg debugbruterebase 'all()-Z' Z - A: A':Z - B: B':Z - AB: A':Z B':Z - C: ABORT: cannot rebase 3:a35c07e8a2a4 without moving at least one of its parents - AC: A':Z C':A'B - BC: B':Z C':B'A - ABC: A':Z B':Z C':A'B' - D: D':Z - AD: A':Z D':Z - BD: B':Z D':B' - ABD: A':Z B':Z D':B' - CD: ABORT: cannot rebase 3:a35c07e8a2a4 without moving at least one of its parents - ACD: A':Z C':A'B D':Z - BCD: B':Z C':B'A D':B' - ABCD: A':Z B':Z C':A'B' D':B' - -Moving backwards - - $ init <<'EOS' - > C - > |\ - > A B - > | - > Z - > EOS - $ hg debugbruterebase 'all()-Z' Z - B: B':Z - A: - BA: B':Z - C: ABORT: cannot rebase 3:b8d7149b562b without moving at least one of its parents - BC: B':Z C':B'A - AC: - BAC: B':Z C':B'A diff -Nru mercurial-4.3.1+207-xenial/tests/test-rebase-conflicts.t mercurial-4.3.1/tests/test-rebase-conflicts.t --- mercurial-4.3.1+207-xenial/tests/test-rebase-conflicts.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-rebase-conflicts.t 2017-09-10 00:05:18.000000000 +0000 @@ -71,21 +71,6 @@ unresolved conflicts (see hg resolve, then hg rebase --continue) [1] - $ hg status --config commands.status.verbose=1 - M common - ? common.orig - # The repository is in an unfinished *rebase* state. - - # Unresolved merge conflicts: - # - # common - # - # To mark files as resolved: hg resolve --mark FILE - - # To continue: hg rebase --continue - # To abort: hg rebase --abort - - Try to continue without solving the conflict: $ hg rebase --continue @@ -235,6 +220,10 @@ $ hg rebase -s9 -d2 --debug # use debug to really check merge base used rebase onto 4bc80088dc6b starting from e31216eec445 rebase status stored + ignoring null merge rebase of 3 + ignoring null merge rebase of 4 + ignoring null merge rebase of 6 + ignoring null merge rebase of 8 rebasing 9:e31216eec445 "more changes to f1" future parents are 2 and -1 rebase status stored @@ -396,7 +385,7 @@ $ hg update E -q $ echo 3 > B $ hg commit --amend -m E -A B -q - $ hg rebase -r B+D -d . --config experimental.stabilization=all + $ hg rebase -r B+D -d . --config experimental.evolution=all rebasing 1:112478962961 "B" (B) merging B warning: conflicts while merging B! (edit, then use 'hg resolve --mark') @@ -407,8 +396,9 @@ $ hg resolve -m (no more unresolved files) continue: hg rebase --continue - $ hg rebase --continue --config experimental.stabilization=none + $ hg rebase --continue --config experimental.evolution=none rebasing 1:112478962961 "B" (B) + not rebasing ignored 2:26805aba1e60 "C" (C) rebasing 3:f585351a92f8 "D" (D) warning: orphaned descendants detected, not stripping 112478962961 saved backup bundle to $TESTTMP/b/.hg/strip-backup/f585351a92f8-e536a9e4-rebase.hg (glob) diff -Nru mercurial-4.3.1+207-xenial/tests/test-rebase-newancestor.t mercurial-4.3.1/tests/test-rebase-newancestor.t --- mercurial-4.3.1+207-xenial/tests/test-rebase-newancestor.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-rebase-newancestor.t 2017-09-10 00:05:18.000000000 +0000 @@ -3,7 +3,7 @@ > usegeneraldelta=yes > [extensions] > rebase= - > drawdag=$TESTDIR/drawdag.py + > > [alias] > tglog = log -G --template "{rev}: '{desc}' {branches}\n" > EOF @@ -334,93 +334,3 @@ |/ o 0: 'common' -Due to the limitation of 3-way merge algorithm (1 merge base), rebasing a merge -may include unwanted content: - - $ hg init $TESTTMP/dual-merge-base1 - $ cd $TESTTMP/dual-merge-base1 - $ hg debugdrawdag <<'EOS' - > F - > /| - > D E - > | | - > B C - > |/ - > A Z - > |/ - > R - > EOS - $ hg rebase -r D+E+F -d Z - rebasing 5:5f2c926dfecf "D" (D) - rebasing 6:b296604d9846 "E" (E) - rebasing 7:caa9781e507d "F" (F tip) - abort: rebasing 7:caa9781e507d will include unwanted changes from 4:d6003a550c2c or 3:c1e6b162678d - [255] - -The warning does not get printed if there is no unwanted change detected: - - $ hg init $TESTTMP/dual-merge-base2 - $ cd $TESTTMP/dual-merge-base2 - $ hg debugdrawdag <<'EOS' - > D - > /| - > B C - > |/ - > A Z - > |/ - > R - > EOS - $ hg rebase -r B+C+D -d Z - rebasing 3:c1e6b162678d "B" (B) - rebasing 4:d6003a550c2c "C" (C) - rebasing 5:c8f78076273e "D" (D tip) - saved backup bundle to $TESTTMP/dual-merge-base2/.hg/strip-backup/d6003a550c2c-6f1424b6-rebase.hg (glob) - $ hg manifest -r 'desc(D)' - B - C - R - Z - -The merge base could be different from old p1 (changed parent becomes new p1): - - $ hg init $TESTTMP/chosen-merge-base1 - $ cd $TESTTMP/chosen-merge-base1 - $ hg debugdrawdag <<'EOS' - > F - > /| - > D E - > | | - > B C Z - > EOS - $ hg rebase -r D+F -d Z - rebasing 3:004dc1679908 "D" (D) - rebasing 5:4be4cbf6f206 "F" (F tip) - saved backup bundle to $TESTTMP/chosen-merge-base1/.hg/strip-backup/004dc1679908-06a66a3c-rebase.hg (glob) - $ hg manifest -r 'desc(F)' - C - D - E - Z - $ hg log -r `hg log -r 'desc(F)' -T '{p1node}'` -T '{desc}\n' - D - - $ hg init $TESTTMP/chosen-merge-base2 - $ cd $TESTTMP/chosen-merge-base2 - $ hg debugdrawdag <<'EOS' - > F - > /| - > D E - > | | - > B C Z - > EOS - $ hg rebase -r E+F -d Z - rebasing 4:974e4943c210 "E" (E) - rebasing 5:4be4cbf6f206 "F" (F tip) - saved backup bundle to $TESTTMP/chosen-merge-base2/.hg/strip-backup/974e4943c210-b2874da5-rebase.hg (glob) - $ hg manifest -r 'desc(F)' - B - D - E - Z - $ hg log -r `hg log -r 'desc(F)' -T '{p1node}'` -T '{desc}\n' - E diff -Nru mercurial-4.3.1+207-xenial/tests/test-rebase-obsolete.t mercurial-4.3.1/tests/test-rebase-obsolete.t --- mercurial-4.3.1+207-xenial/tests/test-rebase-obsolete.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-rebase-obsolete.t 2017-09-10 00:05:18.000000000 +0000 @@ -8,12 +8,11 @@ > [ui] > logtemplate= {rev}:{node|short} {desc|firstline} > [experimental] - > stabilization=createmarkers,allowunstable + > evolution=createmarkers,allowunstable > [phases] > publish=False > [extensions] > rebase= - > drawdag=$TESTDIR/drawdag.py > EOF Setup rebase canonical repo @@ -205,8 +204,8 @@ o 0:cd010b8cd998 A $ hg rebase --source 'desc(B)' --dest 'tip' --config experimental.rebaseskipobsolete=True - note: not rebasing 9:08483444fef9 "D", already in destination as 11:4596109a6a43 "D" rebasing 8:8877864f1edb "B" + note: not rebasing 9:08483444fef9 "D", already in destination as 11:4596109a6a43 "D" rebasing 10:5ae4c968c6ac "C" $ hg debugobsolete 42ccdea3bb16d28e1848c95fe2e44c000f3f21b1 0 {cd010b8cd998f3981a5a8115f94f8da4ab506089} (*) {'user': 'test'} (glob) @@ -215,7 +214,7 @@ 08483444fef91d6224f6655ee586a65d263ad34c 4596109a6a4328c398bde3a4a3b6737cfade3003 0 (*) {'user': 'test'} (glob) 8877864f1edb05d0e07dc4ba77b67a80a7b86672 462a34d07e599b87ea08676a449373fe4e2e1347 0 (*) {'user': 'test'} (glob) 5ae4c968c6aca831df823664e706c9d4aa34473d 98f6af4ee9539e14da4465128f894c274900b6e5 0 (*) {'user': 'test'} (glob) - $ hg log --rev 'contentdivergent()' + $ hg log --rev 'divergent()' $ hg log -G o 13:98f6af4ee953 C | @@ -450,6 +449,7 @@ $ hg rebase --dest 4 --rev '7+11+9' rebasing 9:cf44d2f5a9f4 "D" rebasing 7:02de42196ebe "H" + not rebasing ignored 10:7c6027df6a99 "B" rebasing 11:0d8f238b634c "C" (tip) $ hg log -G o 14:1e8370e38cca C @@ -472,30 +472,6 @@ $ cd .. -Detach both parents - - $ hg init double-detach - $ cd double-detach - - $ hg debugdrawdag < F - > /| - > C E - > | | - > B D G - > \|/ - > A - > EOF - - $ hg rebase -d G -r 'B + D + F' - rebasing 1:112478962961 "B" (B) - rebasing 2:b18e25de2cf5 "D" (D) - rebasing 6:f15c3adaf214 "F" (F tip) - abort: cannot rebase 6:f15c3adaf214 without moving at least one of its parents - [255] - - $ cd .. - test on rebase dropping a merge (setup) @@ -543,6 +519,7 @@ $ hg rebase --dest 6 --rev '((desc(H) + desc(D))::) - desc(M)' rebasing 3:32af7686d403 "D" rebasing 7:02de42196ebe "H" + not rebasing ignored 8:53a6a128b2b7 "M" rebasing 9:4bde274eefcf "I" (tip) $ hg log -G @ 12:acd174b7ab39 I @@ -733,11 +710,11 @@ | o 0:4a2df7238c3b A - $ hg debugobsolete `hg log -r 7 -T '{node}\n'` --config experimental.stabilization=all + $ hg debugobsolete `hg log -r 7 -T '{node}\n'` --config experimental.evolution=all obsoleted 1 changesets $ hg rebase -d 6 -r "4::" - note: not rebasing 7:360bbaa7d3ce "O", it has no successor rebasing 4:ff2c4d47b71d "C" + note: not rebasing 7:360bbaa7d3ce "O", it has no successor rebasing 8:8d47583e023f "P" (tip) If all the changeset to be rebased are obsolete and present in the destination, we @@ -761,7 +738,7 @@ $ hg add nonrelevant $ hg commit -m nonrelevant created new head - $ hg debugobsolete `hg log -r 11 -T '{node}\n'` --config experimental.stabilization=all + $ hg debugobsolete `hg log -r 11 -T '{node}\n'` --config experimental.evolution=all obsoleted 1 changesets $ hg rebase -r . -d 10 note: not rebasing 11:f44da1f4954c "nonrelevant" (tip), it has no successor @@ -816,13 +793,13 @@ o 0:4a2df7238c3b A $ hg summary - parent: 15:73568ab6879d tip (orphan) + parent: 15:73568ab6879d tip (unstable) bar foo branch: default commit: (clean) update: 2 new changesets, 3 branch heads (merge) phases: 8 draft - orphan: 1 changesets + unstable: 1 changesets $ hg rebase -s 10 -d 12 abort: this rebase will cause divergences from: 121d9e3bc4c6 (to force the rebase please set experimental.allowdivergence=True) @@ -856,7 +833,7 @@ commit: (clean) update: 1 new changesets, 2 branch heads (merge) phases: 8 draft - content-divergent: 2 changesets + divergent: 2 changesets rebase --continue + skipped rev because their successors are in destination we make a change in trunk and work on conflicting changes to make rebase abort. @@ -886,7 +863,7 @@ $ printf "dummy" > L $ hg add L $ hg commit -m "dummy change" - $ hg debugobsolete `hg log -r ".^" -T '{node}'` `hg log -r 19 -T '{node}'` --config experimental.stabilization=all + $ hg debugobsolete `hg log -r ".^" -T '{node}'` `hg log -r 19 -T '{node}'` --config experimental.evolution=all obsoleted 1 changesets $ hg log -G -r 17:: @@ -904,7 +881,6 @@ | ~ $ hg rebase -r ".^^ + .^ + ." -d 19 - note: not rebasing 21:8b31da3c4919 "dummy change", already in destination as 19:601db7a18f51 "dummy change successor" rebasing 20:b82fb57ea638 "willconflict second version" merging willconflict warning: conflicts while merging willconflict! (edit, then use 'hg resolve --mark') @@ -916,296 +892,67 @@ continue: hg rebase --continue $ hg rebase --continue rebasing 20:b82fb57ea638 "willconflict second version" + note: not rebasing 21:8b31da3c4919 "dummy change", already in destination as 19:601db7a18f51 "dummy change successor" rebasing 22:7bdc8a87673d "dummy change" (tip) $ cd .. -Rebase merge where successor of one parent is equal to destination (issue5198) - - $ hg init p1-succ-is-dest - $ cd p1-succ-is-dest - - $ hg debugdrawdag < F - > /| - > E D B # replace: D -> B - > \|/ - > A - > EOF - - $ hg rebase -d B -s D - note: not rebasing 2:b18e25de2cf5 "D" (D), already in destination as 1:112478962961 "B" - rebasing 4:66f1a38021c9 "F" (F tip) - $ hg log -G - o 5:50e9d60b99c6 F - |\ - | | x 4:66f1a38021c9 F - | |/| - | o | 3:7fb047a69f22 E - | | | - | | x 2:b18e25de2cf5 D - | |/ - o | 1:112478962961 B - |/ - o 0:426bada5c675 A - - $ cd .. - -Rebase merge where successor of other parent is equal to destination - - $ hg init p2-succ-is-dest - $ cd p2-succ-is-dest - - $ hg debugdrawdag < F - > /| - > E D B # replace: E -> B - > \|/ - > A - > EOF +rebase source is obsoleted (issue5198) +--------------------------------- - $ hg rebase -d B -s E - note: not rebasing 3:7fb047a69f22 "E" (E), already in destination as 1:112478962961 "B" - rebasing 4:66f1a38021c9 "F" (F tip) + $ hg clone base amended + updating to branch default + 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd amended + $ hg up 9520eea781bc + 1 files updated, 0 files merged, 2 files removed, 0 files unresolved + $ echo 1 >> E + $ hg commit --amend -m "E'" -d "0 0" $ hg log -G - o 5:aae1787dacee F - |\ - | | x 4:66f1a38021c9 F + @ 9:69abe8906104 E' + | + | o 7:02de42196ebe H + | | + | | o 6:eea13746799a G | |/| - | | x 3:7fb047a69f22 E - | | | - | o | 2:b18e25de2cf5 D - | |/ - o / 1:112478962961 B + | o | 5:24b6387c8c8c F + |/ / + | x 4:9520eea781bc E |/ - o 0:426bada5c675 A - - $ cd .. - -Rebase merge where successor of one parent is ancestor of destination - - $ hg init p1-succ-in-dest - $ cd p1-succ-in-dest - - $ hg debugdrawdag < F C - > /| | - > E D B # replace: D -> B - > \|/ - > A - > EOF - - $ hg rebase -d C -s D - note: not rebasing 2:b18e25de2cf5 "D" (D), already in destination as 1:112478962961 "B" - rebasing 5:66f1a38021c9 "F" (F tip) - - $ hg log -G - o 6:0913febf6439 F - |\ - +---x 5:66f1a38021c9 F - | | | - | o | 4:26805aba1e60 C - | | | - o | | 3:7fb047a69f22 E - | | | - +---x 2:b18e25de2cf5 D + | o 3:32af7686d403 D + | | + | o 2:5fddd98957c8 C | | - | o 1:112478962961 B + | o 1:42ccdea3bb16 B |/ - o 0:426bada5c675 A + o 0:cd010b8cd998 A - $ cd .. - -Rebase merge where successor of other parent is ancestor of destination - - $ hg init p2-succ-in-dest - $ cd p2-succ-in-dest - - $ hg debugdrawdag < F C - > /| | - > E D B # replace: E -> B - > \|/ - > A - > EOF - - $ hg rebase -d C -s E - note: not rebasing 3:7fb047a69f22 "E" (E), already in destination as 1:112478962961 "B" - rebasing 5:66f1a38021c9 "F" (F tip) + $ hg rebase -d . -s 9520eea781bc + note: not rebasing 4:9520eea781bc "E", already in destination as 9:69abe8906104 "E'" + rebasing 6:eea13746799a "G" $ hg log -G - o 6:c6ab0cc6d220 F + o 10:17be06e82e95 G |\ - +---x 5:66f1a38021c9 F - | | | - | o | 4:26805aba1e60 C - | | | - | | x 3:7fb047a69f22 E - | | | - o---+ 2:b18e25de2cf5 D - / / - o / 1:112478962961 B - |/ - o 0:426bada5c675 A - - $ cd .. - -Rebase merge where successor of one parent is ancestor of destination - - $ hg init p1-succ-in-dest-b - $ cd p1-succ-in-dest-b - - $ hg debugdrawdag < F C - > /| | - > E D B # replace: E -> B - > \|/ - > A - > EOF - - $ hg rebase -d C -b F - note: not rebasing 3:7fb047a69f22 "E" (E), already in destination as 1:112478962961 "B" - rebasing 2:b18e25de2cf5 "D" (D) - rebasing 5:66f1a38021c9 "F" (F tip) - note: rebase of 5:66f1a38021c9 created no changes to commit - $ hg log -G - o 6:8f47515dda15 D - | - | x 5:66f1a38021c9 F - | |\ - o | | 4:26805aba1e60 C - | | | - | | x 3:7fb047a69f22 E - | | | - | x | 2:b18e25de2cf5 D - | |/ - o / 1:112478962961 B + | @ 9:69abe8906104 E' + | | + +---o 7:02de42196ebe H + | | + o | 5:24b6387c8c8c F |/ - o 0:426bada5c675 A - - $ cd .. - -Rebase merge where successor of other parent is ancestor of destination - - $ hg init p2-succ-in-dest-b - $ cd p2-succ-in-dest-b - - $ hg debugdrawdag < F C - > /| | - > E D B # replace: D -> B - > \|/ - > A - > EOF - - $ hg rebase -d C -b F - note: not rebasing 2:b18e25de2cf5 "D" (D), already in destination as 1:112478962961 "B" - rebasing 3:7fb047a69f22 "E" (E) - rebasing 5:66f1a38021c9 "F" (F tip) - note: rebase of 5:66f1a38021c9 created no changes to commit - - $ hg log -G - o 6:533690786a86 E - | - | x 5:66f1a38021c9 F - | |\ - o | | 4:26805aba1e60 C - | | | - | | x 3:7fb047a69f22 E - | | | - | x | 2:b18e25de2cf5 D - | |/ - o / 1:112478962961 B + | o 3:32af7686d403 D + | | + | o 2:5fddd98957c8 C + | | + | o 1:42ccdea3bb16 B |/ - o 0:426bada5c675 A + o 0:cd010b8cd998 A $ cd .. -Rebase merge where both parents have successors in destination - - $ hg init p12-succ-in-dest - $ cd p12-succ-in-dest - $ hg debugdrawdag <<'EOS' - > E F - > /| /| # replace: A -> C - > A B C D # replace: B -> D - > | | - > X Y - > EOS - $ hg rebase -r A+B+E -d F - note: not rebasing 4:a3d17304151f "A" (A), already in destination as 0:96cc3511f894 "C" - note: not rebasing 5:b23a2cc00842 "B" (B), already in destination as 1:058c1e1fb10a "D" - rebasing 7:dac5d11c5a7d "E" (E tip) - abort: rebasing 7:dac5d11c5a7d will include unwanted changes from 3:59c792af609c, 5:b23a2cc00842 or 2:ba2b7fa7166d, 4:a3d17304151f - [255] - $ cd .. - -Rebase a non-clean merge. One parent has successor in destination, the other -parent moves as requested. - - $ hg init p1-succ-p2-move - $ cd p1-succ-p2-move - $ hg debugdrawdag <<'EOS' - > D Z - > /| | # replace: A -> C - > A B C # D/D = D - > EOS - $ hg rebase -r A+B+D -d Z - note: not rebasing 0:426bada5c675 "A" (A), already in destination as 2:96cc3511f894 "C" - rebasing 1:fc2b737bb2e5 "B" (B) - rebasing 3:b8ed089c80ad "D" (D) - - $ rm .hg/localtags - $ hg log -G - o 6:e4f78693cc88 D - | - o 5:76840d832e98 B - | - o 4:50e41c1f3950 Z - | - o 2:96cc3511f894 C - - $ hg files -r tip - B - C - D - Z - - $ cd .. - - $ hg init p1-move-p2-succ - $ cd p1-move-p2-succ - $ hg debugdrawdag <<'EOS' - > D Z - > /| | # replace: B -> C - > A B C # D/D = D - > EOS - $ hg rebase -r B+A+D -d Z - note: not rebasing 1:fc2b737bb2e5 "B" (B), already in destination as 2:96cc3511f894 "C" - rebasing 0:426bada5c675 "A" (A) - rebasing 3:b8ed089c80ad "D" (D) - - $ rm .hg/localtags - $ hg log -G - o 6:1b355ed94d82 D - | - o 5:a81a74d764a6 A - | - o 4:50e41c1f3950 Z - | - o 2:96cc3511f894 C - - $ hg files -r tip - A - C - D - Z - - $ cd .. - Test that bookmark is moved and working dir is updated when all changesets have equivalents in destination $ hg init rbsrepo && cd rbsrepo $ echo "[experimental]" > .hg/hgrc - $ echo "stabilization=all" >> .hg/hgrc + $ echo "evolution=all" >> .hg/hgrc $ echo "rebaseskipobsolete=on" >> .hg/hgrc $ echo root > root && hg ci -Am root adding root @@ -1224,12 +971,12 @@ $ hg up 2 && hg log -r . # working dir is at rev 2 again 0 files updated, 0 files merged, 1 files removed, 0 files unresolved 2:1e9a3c00cbe9 b (no-eol) - $ hg rebase -r 2 -d 3 --config experimental.stabilization.track-operation=1 + $ hg rebase -r 2 -d 3 --config experimental.evolution.track-operation=1 note: not rebasing 2:1e9a3c00cbe9 "b" (mybook), already in destination as 3:be1832deae9a "b" -Check that working directory was not updated to rev 3 because rev 2 was skipped +Check that working directory was updated to rev 3 although rev 2 was skipped during the rebase operation $ hg log -r . - 2:1e9a3c00cbe9 b (no-eol) + 3:be1832deae9a b (no-eol) Check that bookmark was not moved to rev 3 if rev 2 was skipped during the rebase operation. This makes sense because if rev 2 has a successor, the diff -Nru mercurial-4.3.1+207-xenial/tests/test-rebase-partial.t mercurial-4.3.1/tests/test-rebase-partial.t --- mercurial-4.3.1+207-xenial/tests/test-rebase-partial.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-rebase-partial.t 2017-09-10 00:05:18.000000000 +0000 @@ -7,7 +7,7 @@ > drawdag=$TESTDIR/drawdag.py > > [experimental] - > stabilization=createmarkers,allowunstable + > evolution=createmarkers,allowunstable > > [alias] > tglog = log -G --template "{rev}: {desc}" @@ -81,6 +81,7 @@ > A > EOF already rebased 1:112478962961 "B" (B) + not rebasing ignored 2:26805aba1e60 "C" (C) rebasing 3:f585351a92f8 "D" (D tip) o 4: D | diff -Nru mercurial-4.3.1+207-xenial/tests/test-rebase-scenario-global.t mercurial-4.3.1/tests/test-rebase-scenario-global.t --- mercurial-4.3.1+207-xenial/tests/test-rebase-scenario-global.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-rebase-scenario-global.t 2017-09-10 00:05:18.000000000 +0000 @@ -271,7 +271,7 @@ $ hg rebase -s 6 -d 1 rebasing 6:eea13746799a "G" - abort: cannot rebase 6:eea13746799a without moving at least one of its parents + abort: cannot use revision 6 as base, result would have 3 parents [255] $ hg rebase --abort rebase aborted @@ -933,7 +933,7 @@ > [extensions] > wraprebase=$TESTTMP/wraprebase.py > [experimental] - > stabilization=all + > evolution=all > EOF $ hg debugdrawdag <<'EOS' diff -Nru mercurial-4.3.1+207-xenial/tests/test-releasenotes-formatting.t mercurial-4.3.1/tests/test-releasenotes-formatting.t --- mercurial-4.3.1+207-xenial/tests/test-releasenotes-formatting.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-releasenotes-formatting.t 2017-09-10 00:05:18.000000000 +0000 @@ -1,5 +1,3 @@ -#require fuzzywuzzy - $ cat >> $HGRCPATH << EOF > [extensions] > releasenotes= diff -Nru mercurial-4.3.1+207-xenial/tests/test-releasenotes-merging.t mercurial-4.3.1/tests/test-releasenotes-merging.t --- mercurial-4.3.1+207-xenial/tests/test-releasenotes-merging.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-releasenotes-merging.t 2017-09-10 00:05:18.000000000 +0000 @@ -1,5 +1,3 @@ -#require fuzzywuzzy - $ cat >> $HGRCPATH << EOF > [extensions] > releasenotes= @@ -160,122 +158,3 @@ * this is fix3. - $ cd .. - -Ignores commit messages containing issueNNNN based on issue number. - - $ hg init simple-fuzzrepo - $ cd simple-fuzzrepo - $ touch fix1 - $ hg -q commit -A -l - << EOF - > commit 1 - > - > .. fix:: - > - > Resolved issue4567. - > EOF - - $ cat >> $TESTTMP/issue-number-notes << EOF - > Bug Fixes - > ========= - > - > * Fixed issue1234 related to XYZ. - > - > * Fixed issue4567 related to ABC. - > - > * Fixed issue3986 related to PQR. - > EOF - - $ hg releasenotes -r . $TESTTMP/issue-number-notes - "issue4567" already exists in notes; ignoring - - $ cat $TESTTMP/issue-number-notes - Bug Fixes - ========= - - * Fixed issue1234 related to XYZ. - - * Fixed issue4567 related to ABC. - - * Fixed issue3986 related to PQR. - - $ cd .. - -Adds short commit messages (words < 10) without -comparison unless there is an exact match. - - $ hg init tempdir - $ cd tempdir - $ touch feature1 - $ hg -q commit -A -l - << EOF - > commit 1 - > - > .. feature:: - > - > Adds a new feature 1. - > EOF - - $ hg releasenotes -r . $TESTTMP/short-sentence-notes - - $ touch feature2 - $ hg -q commit -A -l - << EOF - > commit 2 - > - > .. feature:: - > - > Adds a new feature 2. - > EOF - - $ hg releasenotes -r . $TESTTMP/short-sentence-notes - $ cat $TESTTMP/short-sentence-notes - New Features - ============ - - * Adds a new feature 1. - - * Adds a new feature 2. - - $ cd .. - -Ignores commit messages based on fuzzy comparison. - - $ hg init fuzznotes - $ cd fuzznotes - $ touch fix1 - $ hg -q commit -A -l - << EOF - > commit 1 - > - > .. fix:: - > - > This is a fix with another line. - > And it is a big one. - > EOF - - $ cat >> $TESTTMP/fuzz-ignore-notes << EOF - > Bug Fixes - > ========= - > - > * Fixed issue4567 by improving X. - > - > * This is the first line. This is next line with one newline. - > - > This is another line written after two newlines. This is going to be a big one. - > - > * This fixes another problem. - > EOF - - $ hg releasenotes -r . $TESTTMP/fuzz-ignore-notes - "This is a fix with another line. And it is a big one." already exists in notes file; ignoring - - $ cat $TESTTMP/fuzz-ignore-notes - Bug Fixes - ========= - - * Fixed issue4567 by improving X. - - * This is the first line. This is next line with one newline. - - This is another line written after two newlines. This is going to be a big - one. - - * This fixes another problem. diff -Nru mercurial-4.3.1+207-xenial/tests/test-releasenotes-parsing.t mercurial-4.3.1/tests/test-releasenotes-parsing.t --- mercurial-4.3.1+207-xenial/tests/test-releasenotes-parsing.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-releasenotes-parsing.t 2017-09-10 00:05:18.000000000 +0000 @@ -1,5 +1,3 @@ -#require fuzzywuzzy - $ cat >> $HGRCPATH << EOF > [extensions] > releasenotes= diff -Nru mercurial-4.3.1+207-xenial/tests/test-rename.t mercurial-4.3.1/tests/test-rename.t --- mercurial-4.3.1+207-xenial/tests/test-rename.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-rename.t 2017-09-10 00:05:18.000000000 +0000 @@ -12,7 +12,7 @@ $ hg rename d1/d11/a1 d2/c $ hg --config ui.portablefilenames=abort rename d1/a d1/con.xml - abort: filename contains 'con', which is reserved on Windows: d1/con.xml + abort: filename contains 'con', which is reserved on Windows: 'd1/con.xml' [255] $ hg sum parent: 0:9b4b6e7b2c26 tip diff -Nru mercurial-4.3.1+207-xenial/tests/test-repair-strip.t mercurial-4.3.1/tests/test-repair-strip.t --- mercurial-4.3.1+207-xenial/tests/test-repair-strip.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-repair-strip.t 2017-09-10 00:05:18.000000000 +0000 @@ -4,7 +4,7 @@ > import sys > for entry in sys.stdin.read().split('\n'): > if entry: - > print(entry.split('\x00')[0]) + > print entry.split('\x00')[0] > EOF $ echo "[extensions]" >> $HGRCPATH diff -Nru mercurial-4.3.1+207-xenial/tests/test-revset.t mercurial-4.3.1/tests/test-revset.t --- mercurial-4.3.1+207-xenial/tests/test-revset.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-revset.t 2017-09-10 00:05:18.000000000 +0000 @@ -1830,7 +1830,7 @@ $ cd wdir-hashcollision $ cat <> .hg/hgrc > [experimental] - > stabilization = createmarkers + > evolution = createmarkers > EOF $ echo 0 > a $ hg ci -qAm 0 @@ -4465,7 +4465,7 @@ $ cd repo1 $ cat <> .hg/hgrc > [experimental] - > stabilization = createmarkers + > evolution = createmarkers > EOF $ hg debugdrawdag <<'EOS' @@ -4504,10 +4504,10 @@ E G - $ hg log -r 'successors(B+A)-contentdivergent()' -T '{desc}\n' + $ hg log -r 'successors(B+A)-divergent()' -T '{desc}\n' A Z B - $ hg log -r 'successors(B+A)-contentdivergent()-obsolete()' -T '{desc}\n' + $ hg log -r 'successors(B+A)-divergent()-obsolete()' -T '{desc}\n' Z diff -Nru mercurial-4.3.1+207-xenial/tests/test-rollback.t mercurial-4.3.1/tests/test-rollback.t --- mercurial-4.3.1+207-xenial/tests/test-rollback.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-rollback.t 2017-09-10 00:05:18.000000000 +0000 @@ -210,248 +210,3 @@ abort: rollback is disabled because it is unsafe (see `hg help -v rollback` for information) [255] - - $ cd .. - -I/O errors on stdio are handled properly (issue5658) - - $ cat > badui.py << EOF - > import errno - > from mercurial.i18n import _ - > from mercurial import ( - > error, - > ui as uimod, - > ) - > - > def pretxncommit(ui, repo, **kwargs): - > ui.warn('warn during pretxncommit\n') - > - > def pretxnclose(ui, repo, **kwargs): - > ui.warn('warn during pretxnclose\n') - > - > def txnclose(ui, repo, **kwargs): - > ui.warn('warn during txnclose\n') - > - > def txnabort(ui, repo, **kwargs): - > ui.warn('warn during abort\n') - > - > class fdproxy(object): - > def __init__(self, ui, o): - > self._ui = ui - > self._o = o - > - > def __getattr__(self, attr): - > return getattr(self._o, attr) - > - > def write(self, msg): - > errors = set(self._ui.configlist('ui', 'ioerrors', [])) - > pretxncommit = msg == 'warn during pretxncommit\n' - > pretxnclose = msg == 'warn during pretxnclose\n' - > txnclose = msg == 'warn during txnclose\n' - > txnabort = msg == 'warn during abort\n' - > msgabort = msg == _('transaction abort!\n') - > msgrollback = msg == _('rollback completed\n') - > - > if pretxncommit and 'pretxncommit' in errors: - > raise IOError(errno.EPIPE, 'simulated epipe') - > if pretxnclose and 'pretxnclose' in errors: - > raise IOError(errno.EIO, 'simulated eio') - > if txnclose and 'txnclose' in errors: - > raise IOError(errno.EBADF, 'simulated badf') - > if txnabort and 'txnabort' in errors: - > raise IOError(errno.EPIPE, 'simulated epipe') - > if msgabort and 'msgabort' in errors: - > raise IOError(errno.EBADF, 'simulated ebadf') - > if msgrollback and 'msgrollback' in errors: - > raise IOError(errno.EIO, 'simulated eio') - > - > return self._o.write(msg) - > - > def uisetup(ui): - > class badui(ui.__class__): - > def write_err(self, *args, **kwargs): - > olderr = self.ferr - > try: - > self.ferr = fdproxy(self, olderr) - > return super(badui, self).write_err(*args, **kwargs) - > finally: - > self.ferr = olderr - > - > ui.__class__ = badui - > - > def reposetup(ui, repo): - > ui.setconfig('hooks', 'pretxnclose.badui', pretxnclose, 'badui') - > ui.setconfig('hooks', 'txnclose.badui', txnclose, 'badui') - > ui.setconfig('hooks', 'pretxncommit.badui', pretxncommit, 'badui') - > ui.setconfig('hooks', 'txnabort.badui', txnabort, 'badui') - > EOF - - $ cat >> $HGRCPATH << EOF - > [extensions] - > badui = $TESTTMP/badui.py - > EOF - -An I/O error during pretxncommit is handled - - $ hg init ioerror-pretxncommit - $ cd ioerror-pretxncommit - $ echo 0 > foo - $ hg -q commit -A -m initial - warn during pretxncommit - warn during pretxnclose - warn during txnclose - $ echo 1 > foo - $ hg --config ui.ioerrors=pretxncommit commit -m 'error during pretxncommit' - warn during pretxnclose - warn during txnclose - - $ hg commit -m 'commit 1' - nothing changed - [1] - - $ cd .. - -An I/O error during pretxnclose is handled - - $ hg init ioerror-pretxnclose - $ cd ioerror-pretxnclose - $ echo 0 > foo - $ hg -q commit -A -m initial - warn during pretxncommit - warn during pretxnclose - warn during txnclose - - $ echo 1 > foo - $ hg --config ui.ioerrors=pretxnclose commit -m 'error during pretxnclose' - warn during pretxncommit - warn during txnclose - - $ hg commit -m 'commit 1' - nothing changed - [1] - - $ cd .. - -An I/O error during txnclose is handled - - $ hg init ioerror-txnclose - $ cd ioerror-txnclose - $ echo 0 > foo - $ hg -q commit -A -m initial - warn during pretxncommit - warn during pretxnclose - warn during txnclose - - $ echo 1 > foo - $ hg --config ui.ioerrors=txnclose commit -m 'error during txnclose' - warn during pretxncommit - warn during pretxnclose - - $ hg commit -m 'commit 1' - nothing changed - [1] - - $ cd .. - -An I/O error writing "transaction abort" is handled - - $ hg init ioerror-msgabort - $ cd ioerror-msgabort - - $ echo 0 > foo - $ hg -q commit -A -m initial - warn during pretxncommit - warn during pretxnclose - warn during txnclose - - $ echo 1 > foo - $ hg --config ui.ioerrors=msgabort --config hooks.pretxncommit=false commit -m 'error during abort message' - warn during abort - rollback completed - abort: pretxncommit hook exited with status 1 - [255] - - $ hg commit -m 'commit 1' - warn during pretxncommit - warn during pretxnclose - warn during txnclose - - $ cd .. - -An I/O error during txnabort should still result in rollback - - $ hg init ioerror-txnabort - $ cd ioerror-txnabort - - $ echo 0 > foo - $ hg -q commit -A -m initial - warn during pretxncommit - warn during pretxnclose - warn during txnclose - - $ echo 1 > foo - $ hg --config ui.ioerrors=txnabort --config hooks.pretxncommit=false commit -m 'error during abort' - transaction abort! - rollback completed - abort: pretxncommit hook exited with status 1 - [255] - - $ hg commit -m 'commit 1' - warn during pretxncommit - warn during pretxnclose - warn during txnclose - - $ cd .. - -An I/O error writing "rollback completed" is handled - - $ hg init ioerror-msgrollback - $ cd ioerror-msgrollback - - $ echo 0 > foo - $ hg -q commit -A -m initial - warn during pretxncommit - warn during pretxnclose - warn during txnclose - - $ echo 1 > foo - - $ hg --config ui.ioerrors=msgrollback --config hooks.pretxncommit=false commit -m 'error during rollback message' - transaction abort! - warn during abort - abort: pretxncommit hook exited with status 1 - [255] - - $ hg verify - checking changesets - checking manifests - crosschecking files in changesets and manifests - checking files - 1 files, 1 changesets, 1 total revisions - - $ cd .. - -Multiple I/O errors after transaction open are handled. -This is effectively what happens if a peer disconnects in the middle -of a transaction. - - $ hg init ioerror-multiple - $ cd ioerror-multiple - $ echo 0 > foo - $ hg -q commit -A -m initial - warn during pretxncommit - warn during pretxnclose - warn during txnclose - - $ echo 1 > foo - - $ hg --config ui.ioerrors=pretxncommit,pretxnclose,txnclose,txnabort,msgabort,msgrollback commit -m 'multiple errors' - - $ hg verify - checking changesets - checking manifests - crosschecking files in changesets and manifests - checking files - 1 files, 2 changesets, 2 total revisions - - $ cd .. diff -Nru mercurial-4.3.1+207-xenial/tests/test-run-tests.py mercurial-4.3.1/tests/test-run-tests.py --- mercurial-4.3.1+207-xenial/tests/test-run-tests.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-run-tests.py 2017-09-10 00:05:18.000000000 +0000 @@ -39,8 +39,7 @@ and output.endswith(b'\n')), 'missing newline' assert not re.search(br'[^ \w\\/\r\n()*?]', expected + output), \ b'single backslash or unknown char' - test = run_tests.TTest(b'test-run-test.t', b'.', b'.') - match = test.linematch(expected, output) + match = run_tests.TTest.linematch(expected, output) if isinstance(match, str): return 'special: ' + match elif isinstance(match, bytes): diff -Nru mercurial-4.3.1+207-xenial/tests/test-run-tests.t mercurial-4.3.1/tests/test-run-tests.t --- mercurial-4.3.1+207-xenial/tests/test-run-tests.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-run-tests.t 2017-09-10 00:05:18.000000000 +0000 @@ -131,9 +131,10 @@ \x1b[38;5;34m+ bar*baz (glob)\x1b[39m (esc) bar*bad (glob) \x1b[38;5;124m- bar*baz (glob)\x1b[39m (esc) - \x1b[38;5;88mERROR: \x1b[39m\x1b[38;5;9mtest-failure.t\x1b[39m\x1b[38;5;88m output changed\x1b[39m (esc) + + ERROR: test-failure.t output changed ! - \x1b[38;5;88mFailed \x1b[39m\x1b[38;5;9mtest-failure.t\x1b[39m\x1b[38;5;88m: output changed\x1b[39m (esc) + Failed test-failure.t: output changed # Ran 1 tests, 0 skipped, 1 failed. python hash seed: * (glob) [1] @@ -157,73 +158,6 @@ python hash seed: * (glob) #endif - $ cat > test-failure.t << EOF - > $ true - > should go away (true !) - > $ true - > should stay (false !) - > - > Should remove first line, not second or third - > $ echo 'testing' - > baz*foo (glob) (true !) - > foobar*foo (glob) (false !) - > te*ting (glob) (true !) - > - > Should keep first two lines, remove third and last - > $ echo 'testing' - > test.ng (re) (true !) - > foo.ar (re) (false !) - > b.r (re) (true !) - > missing (?) - > awol (true !) - > - > The "missing" line should stay, even though awol is dropped - > $ echo 'testing' - > test.ng (re) (true !) - > foo.ar (?) - > awol - > missing (?) - > EOF - $ rt test-failure.t - - --- $TESTTMP/test-failure.t - +++ $TESTTMP/test-failure.t.err - @@ -1,11 +1,9 @@ - $ true - - should go away (true !) - $ true - should stay (false !) - - Should remove first line, not second or third - $ echo 'testing' - - baz*foo (glob) (true !) - foobar*foo (glob) (false !) - te*ting (glob) (true !) - - foo.ar (re) (false !) - missing (?) - @@ -13,13 +11,10 @@ - $ echo 'testing' - test.ng (re) (true !) - foo.ar (re) (false !) - - b.r (re) (true !) - missing (?) - - awol (true !) - - The "missing" line should stay, even though awol is dropped - $ echo 'testing' - test.ng (re) (true !) - foo.ar (?) - - awol - missing (?) - - ERROR: test-failure.t output changed - ! - Failed test-failure.t: output changed - # Ran 1 tests, 0 skipped, 1 failed. - python hash seed: * (glob) - [1] - basic failing test $ cat > test-failure.t << EOF > $ echo babar diff -Nru mercurial-4.3.1+207-xenial/tests/test-shelve.t mercurial-4.3.1/tests/test-shelve.t --- mercurial-4.3.1+207-xenial/tests/test-shelve.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-shelve.t 2017-09-10 00:05:18.000000000 +0000 @@ -342,23 +342,6 @@ warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark') unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue') [1] - $ hg status -v - M a/a - M b.rename/b - M c.copy - R b/b - ? a/a.orig - # The repository is in an unfinished *unshelve* state. - - # Unresolved merge conflicts: - # - # a/a - # - # To mark files as resolved: hg resolve --mark FILE - - # To continue: hg unshelve --continue - # To abort: hg unshelve --abort - ensure that we have a merge with unresolved conflicts @@ -696,7 +679,7 @@ $ cat >> $HGRCPATH << EOF > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > EOF $ hg shelve shelved as default diff -Nru mercurial-4.3.1+207-xenial/tests/test-sparse.t mercurial-4.3.1/tests/test-sparse.t --- mercurial-4.3.1+207-xenial/tests/test-sparse.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-sparse.t 2017-09-10 00:05:18.000000000 +0000 @@ -29,50 +29,23 @@ #if no-windows $ hg debugsparse --include /foo/bar - abort: paths cannot be absolute - [255] + warning: paths cannot start with /, ignoring: ['/foo/bar'] $ hg debugsparse --include '$TESTTMP/myrepo/hide' $ hg debugsparse --include '/root' - abort: paths cannot be absolute - [255] + warning: paths cannot start with /, ignoring: ['/root'] #else TODO: See if this can be made to fail the same way as on Unix $ hg debugsparse --include /c/foo/bar - abort: paths cannot be absolute + abort: c:/foo/bar not under root '$TESTTMP/myrepo' (glob) [255] $ hg debugsparse --include '$TESTTMP/myrepo/hide' $ hg debugsparse --include '/c/root' - abort: paths cannot be absolute + abort: c:/root not under root '$TESTTMP/myrepo' (glob) [255] #endif -Paths should be treated as cwd-relative, not repo-root-relative - $ mkdir subdir && cd subdir - $ hg debugsparse --include path - $ hg debugsparse - [include] - $TESTTMP/myrepo/hide - hide - subdir/path - - $ cd .. - $ echo hello > subdir/file2.ext - $ cd subdir - $ hg debugsparse --include '**.ext' # let us test globs - $ hg debugsparse --include 'path:abspath' # and a path: pattern - $ cd .. - $ hg debugsparse - [include] - $TESTTMP/myrepo/hide - hide - path:abspath - subdir/**.ext - subdir/path - - $ rm -rf subdir - Verify commiting while sparse includes other files $ echo z > hide diff -Nru mercurial-4.3.1+207-xenial/tests/test-strip.t mercurial-4.3.1/tests/test-strip.t --- mercurial-4.3.1+207-xenial/tests/test-strip.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-strip.t 2017-09-10 00:05:18.000000000 +0000 @@ -1063,8 +1063,8 @@ $ cd $TESTTMP/scmutilcleanup.obsstore $ cat >> .hg/hgrc < [experimental] - > stabilization=all - > stabilization.track-operation=1 + > evolution=all + > evolution.track-operation=1 > EOF $ hg log -r . -T '\n' --config extensions.t=$TESTTMP/scmutilcleanup.py diff -Nru mercurial-4.3.1+207-xenial/tests/test-subrepo-missing.t mercurial-4.3.1/tests/test-subrepo-missing.t --- mercurial-4.3.1+207-xenial/tests/test-subrepo-missing.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-subrepo-missing.t 2017-09-10 00:05:18.000000000 +0000 @@ -76,7 +76,7 @@ > [phases] > publish=False > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > EOF check that we can update parent repo with missing (amended) subrepo revision diff -Nru mercurial-4.3.1+207-xenial/tests/test-tags.t mercurial-4.3.1/tests/test-tags.t --- mercurial-4.3.1+207-xenial/tests/test-tags.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-tags.t 2017-09-10 00:05:18.000000000 +0000 @@ -381,7 +381,7 @@ $ hg blackbox -l 6 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> tags - 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> couldn't write cache/hgtagsfnodes1: [Errno *] * (glob) + 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> couldn't write cache/hgtagsfnodes1: [Errno 13] Permission denied: '$TESTTMP/t2/.hg/cache/hgtagsfnodes1' 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> 2/3 cache hits/lookups in * seconds (glob) 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> writing .hg/cache/tags2-visible with 1 tags 1970/01/01 00:00:00 bob @b968051b5cf3f624b771779c6d5f84f1d4c3fb5d (5000)> tags exited 0 after * seconds (glob) diff -Nru mercurial-4.3.1+207-xenial/tests/test-template-engine.t mercurial-4.3.1/tests/test-template-engine.t --- mercurial-4.3.1+207-xenial/tests/test-template-engine.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-template-engine.t 2017-09-10 00:05:18.000000000 +0000 @@ -10,7 +10,7 @@ > def process(self, t, map): > tmpl = self.loader(t) > for k, v in map.iteritems(): - > if k in ('templ', 'ctx', 'repo', 'revcache', 'cache', 'troubles'): + > if k in ('templ', 'ctx', 'repo', 'revcache', 'cache'): > continue > if hasattr(v, '__call__'): > v = v(**map) diff -Nru mercurial-4.3.1+207-xenial/tests/test-update-branches.t mercurial-4.3.1/tests/test-update-branches.t --- mercurial-4.3.1+207-xenial/tests/test-update-branches.t 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-update-branches.t 2017-09-10 00:05:18.000000000 +0000 @@ -473,7 +473,7 @@ > [ui] > logtemplate={rev}:{node|short} {desc|firstline} > [experimental] - > stabilization=createmarkers + > evolution=createmarkers > EOF Test no-argument update to a successor of an obsoleted changeset diff -Nru mercurial-4.3.1+207-xenial/tests/test-wireproto.py mercurial-4.3.1/tests/test-wireproto.py --- mercurial-4.3.1+207-xenial/tests/test-wireproto.py 2017-08-22 04:35:06.000000000 +0000 +++ mercurial-4.3.1/tests/test-wireproto.py 2017-09-10 00:05:18.000000000 +0000 @@ -19,26 +19,7 @@ def __init__(self, serverrepo): self.serverrepo = serverrepo - @property - def ui(self): - return self.serverrepo.ui - - def url(self): - return 'test' - - def local(self): - return None - - def peer(self): - return self - - def canpush(self): - return True - - def close(self): - pass - - def capabilities(self): + def _capabilities(self): return ['batch'] def _call(self, cmd, **args): @@ -74,7 +55,7 @@ clt = clientpeer(srv) print(clt.greet("Foobar")) -b = clt.iterbatch() -map(b.greet, ('Fo, =;: