##// END OF EJS Templates
revert: remove dangerous `parents` argument from `cmdutil.revert()`...
revert: remove dangerous `parents` argument from `cmdutil.revert()` As we found out the hard way (thanks to spectral@ for figuring it out!), `cmdutil.revert()`'s `parents` argument must be `repo.dirstate.parents()` or things may go wrong. We had an extension that passed in the target commit as the first parent. The `hg split` command from the evolve extension seems to have made the same mistake, but I haven't looked carefully. The problem is that `cmdutil._performrevert()` calls `dirstate.normal()` on reverted files if the commit to revert to equals the first parent. So if you pass in `ctx=foo` and `parents=(foo.node(), nullid)`, then `dirstate.normal()` will be called for the revert files, even though they might not be clean in the working copy. There doesn't seem to be any reason, other than a tiny performance benefit, to passing the `parents` around instead of looking them up again in `cmdutil._performrevert()`, so that's what this patch does. Differential Revision: https://phab.mercurial-scm.org/D8925

File last commit:

r43812:2fe6121c default
r45935:8c466bcb default
Show More
narrowwirepeer.py
150 lines | 4.5 KiB | text/x-python | PythonLexer
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 # narrowwirepeer.py - passes narrow spec with unbundle command
#
# Copyright 2017 Google, 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 (
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 bundle2,
error,
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 extensions,
hg,
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 narrowspec,
pycompat,
wireprototypes,
wireprotov1peer,
Pulkit Goyal
narrow: add narrow and ellipses as server capabilities...
r39559 wireprotov1server,
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 )
Pulkit Goyal
narrow: use narrow_widen wireproto command to widen in case of ellipses...
r42605 from . import narrowbundle2
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 def uisetup():
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 wireprotov1peer.wirepeer.narrow_widen = peernarrowwiden
Pulkit Goyal
narrow: add narrow and ellipses as server capabilities...
r39559
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 def reposetup(repo):
def wirereposetup(ui, peer):
def wrapped(orig, cmd, *args, **kwargs):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if cmd == b'unbundle':
Augie Fackler
narrowwirepeer: add TODO about how we add wireproto args to unbundle :(...
r36119 # TODO: don't blindly add include/exclude wireproto
# arguments to unbundle.
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 include, exclude = repo.narrowpats
Augie Fackler
cleanup: remove pointless r-prefixes on double-quoted strings...
r43809 kwargs["includepats"] = b','.join(include)
kwargs["excludepats"] = b','.join(exclude)
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 return orig(cmd, *args, **kwargs)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 extensions.wrapfunction(peer, b'_calltwowaystream', wrapped)
Augie Fackler
formatting: blacken the codebase...
r43346
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 hg.wirepeersetupfuncs.append(wirereposetup)
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106
Augie Fackler
formatting: blacken the codebase...
r43346
@wireprotov1server.wireprotocommand(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'narrow_widen',
b'oldincludes oldexcludes'
b' newincludes newexcludes'
b' commonheads cgversion'
b' known ellipses',
permission=b'pull',
Augie Fackler
formatting: blacken the codebase...
r43346 )
def narrow_widen(
repo,
proto,
oldincludes,
oldexcludes,
newincludes,
newexcludes,
commonheads,
cgversion,
known,
ellipses,
):
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 """wireprotocol command to send data when a narrow clone is widen. We will
be sending a changegroup here.
The current set of arguments which are required:
oldincludes: the old includes of the narrow copy
oldexcludes: the old excludes of the narrow copy
newincludes: the new includes of the narrow copy
newexcludes: the new excludes of the narrow copy
commonheads: list of heads which are common between the server and client
cgversion(maybe): the changegroup version to produce
known: list of nodes which are known on the client (used in ellipses cases)
ellipses: whether to send ellipses data or not
"""
Pulkit Goyal
narrow: don't compress the bundle2 when sending 'error:abort'...
r40183 preferuncompressed = False
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 try:
Augie Fackler
formatting: blacken the codebase...
r43346
Martin von Zweigbergk
narrow: don't hexify paths and double-hexify known nodes on wire (BC)...
r43214 def splitpaths(data):
# work around ''.split(',') => ['']
return data.split(b',') if data else []
Augie Fackler
formatting: blacken the codebase...
r43346
Martin von Zweigbergk
narrow: don't hexify paths and double-hexify known nodes on wire (BC)...
r43214 oldincludes = splitpaths(oldincludes)
newincludes = splitpaths(newincludes)
oldexcludes = splitpaths(oldexcludes)
newexcludes = splitpaths(newexcludes)
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 # validate the patterns
narrowspec.validatepatterns(set(oldincludes))
narrowspec.validatepatterns(set(newincludes))
narrowspec.validatepatterns(set(oldexcludes))
narrowspec.validatepatterns(set(newexcludes))
common = wireprototypes.decodelist(commonheads)
Pulkit Goyal
narrow: use narrow_widen wireproto command to widen in case of ellipses...
r42605 known = wireprototypes.decodelist(known)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if ellipses == b'0':
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 ellipses = False
else:
ellipses = bool(ellipses)
cgversion = cgversion
Pulkit Goyal
narrow: pass the bundle to bundle2.widen_bundle() instead of generating there...
r42607 bundler = bundle2.bundle20(repo.ui)
Martin von Zweigbergk
widening: pass in matchers instead of patterns...
r43543 newmatch = narrowspec.match(
repo.root, include=newincludes, exclude=newexcludes
)
oldmatch = narrowspec.match(
repo.root, include=oldincludes, exclude=oldexcludes
)
Pulkit Goyal
narrow: use narrow_widen wireproto command to widen in case of ellipses...
r42605 if not ellipses:
Augie Fackler
formatting: blacken the codebase...
r43346 bundle2.widen_bundle(
bundler,
repo,
oldmatch,
newmatch,
common,
known,
cgversion,
ellipses,
)
Pulkit Goyal
narrow: use narrow_widen wireproto command to widen in case of ellipses...
r42605 else:
Martin von Zweigbergk
widening: duplicate generateellipsesbundle2() for widening...
r43536 narrowbundle2.generate_ellipses_bundle2_for_widening(
Martin von Zweigbergk
widening: pass in matchers instead of patterns...
r43543 bundler, repo, oldmatch, newmatch, cgversion, common, known,
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 except error.Abort as exc:
Pulkit Goyal
narrow: start returning bundle2 from widen_bundle()...
r40107 bundler = bundle2.bundle20(repo.ui)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 manargs = [(b'message', pycompat.bytestr(exc))]
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 advargs = []
if exc.hint is not None:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 advargs.append((b'hint', exc.hint))
bundler.addpart(bundle2.bundlepart(b'error:abort', manargs, advargs))
Pulkit Goyal
narrow: don't compress the bundle2 when sending 'error:abort'...
r40183 preferuncompressed = True
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106
chunks = bundler.getchunks()
Augie Fackler
formatting: blacken the codebase...
r43346 return wireprototypes.streamres(
gen=chunks, prefer_uncompressed=preferuncompressed
)
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106
def peernarrowwiden(remote, **kwargs):
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 for ch in ('commonheads', 'known'):
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 kwargs[ch] = wireprototypes.encodelist(kwargs[ch])
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 for ch in ('oldincludes', 'newincludes', 'oldexcludes', 'newexcludes'):
Martin von Zweigbergk
narrow: don't hexify paths and double-hexify known nodes on wire (BC)...
r43214 kwargs[ch] = b','.join(kwargs[ch])
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 kwargs['ellipses'] = b'%i' % bool(kwargs['ellipses'])
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 f = remote._callcompressable(b'narrow_widen', **kwargs)
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 return bundle2.getunbundler(remote.ui, f)