##// END OF EJS Templates
hgweb: handle None from templatedir() equally bad in webcommands.py...
hgweb: handle None from templatedir() equally bad in webcommands.py The following paragraph is based just on my reading of the code; I have not tried to test it. Before my recent work on templates in frozen binaries, it seems both `hgwebdir_mod.py` and `webcommands.py` would pass in an empty list into `staticfile()` when running in a frozen binary. That would then result in a variable in that function (`path`) not getting bound before its first use. I then changed that without thinking in D8786 so we passed a `None` value into the function, which made it break in another way (trying to iterate over `None`). Then I tried to fix it up in D8810, but I only changed `hgwebdir_mod.py` for some reason, and it still doesn't actually work in frozen binaries (which seems fair, since was broken before my changes too). This patch just replicates the half-assed "fix" from D8810 in `webcommands.py`, so they look more similar so I can start refactoring them in the same way. Differential Revision: https://phab.mercurial-scm.org/D8933

File last commit:

r43375:649d3ac3 default
r45937:da3b7c80 default
Show More
bundleparts.py
128 lines | 3.6 KiB | text/x-python | PythonLexer
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204 # 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.i18n import _
from mercurial import (
bundle2,
changegroup,
error,
extensions,
Augie Fackler
bookmarks: remove changectx() method from bmstore (API)...
r43248 node as nodemod,
Gregory Szorc
py3: define and use pycompat.iteritems() for hgext/...
r43375 pycompat,
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204 revsetlang,
util,
)
from . import common
isremotebooksenabled = common.isremotebooksenabled
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 scratchbranchparttype = b'b2x:infinitepush'
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204
Augie Fackler
formatting: blacken the codebase...
r43346
Pulkit Goyal
infinitepush: delete the non-forward-move flag for hg push...
r37220 def getscratchbranchparts(repo, peer, outgoing, ui, bookmark):
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204 if not outgoing.missing:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'no commits to push'))
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204
if scratchbranchparttype not in bundle2.bundle2caps(peer):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(
_(b'no server support for %r') % scratchbranchparttype
)
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204
Augie Fackler
formatting: blacken the codebase...
r43346 _validaterevset(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 repo, revsetlang.formatspec(b'%ln', outgoing.missing), bookmark
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204
supportedversions = changegroup.supportedoutgoingversions(repo)
# Explicitly avoid using '01' changegroup version in infinitepush to
# support general delta
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 supportedversions.discard(b'01')
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204 cgversion = min(supportedversions)
_handlelfs(repo, outgoing.missing)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 cg = changegroup.makestream(repo, outgoing, cgversion, b'push')
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204
params = {}
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 params[b'cgversion'] = cgversion
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204 if bookmark:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 params[b'bookmark'] = bookmark
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204 # 'prevbooknode' is necessary for pushkey reply part
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 params[b'bookprevnode'] = b''
Martin von Zweigbergk
infinitepush: look up bookmarks only among bookmarks...
r37471 bookmarks = repo._bookmarks
if bookmark in bookmarks:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 params[b'bookprevnode'] = nodemod.hex(bookmarks[bookmark])
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204
# Do not send pushback bundle2 part with bookmarks if remotenames extension
# is enabled. It will be handled manually in `_push()`
if not isremotebooksenabled(ui):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 params[b'pushbackbookmarks'] = b'1'
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204
parts = []
# .upper() marks this as a mandatory part: server will abort if there's no
# handler
Augie Fackler
formatting: blacken the codebase...
r43346 parts.append(
bundle2.bundlepart(
scratchbranchparttype.upper(),
Gregory Szorc
py3: define and use pycompat.iteritems() for hgext/...
r43375 advisoryparams=pycompat.iteritems(params),
Augie Fackler
formatting: blacken the codebase...
r43346 data=cg,
)
)
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204
return parts
Augie Fackler
formatting: blacken the codebase...
r43346
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204 def _validaterevset(repo, revset, bookmark):
"""Abort if the revs to be pushed aren't valid for a scratch branch."""
if not repo.revs(revset):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise error.Abort(_(b'nothing to push'))
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204 if bookmark:
# Allow bundle with many heads only if no bookmark is specified
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 heads = repo.revs(b'heads(%r)', revset)
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204 if len(heads) > 1:
raise error.Abort(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'cannot push more than one head to a scratch branch')
Augie Fackler
formatting: blacken the codebase...
r43346 )
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204
def _handlelfs(repo, missing):
'''Special case if lfs is enabled
If lfs is enabled then we need to call prepush hook
to make sure large files are uploaded to lfs
'''
try:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 lfsmod = extensions.find(b'lfs')
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204 lfsmod.wrapper.uploadblobsfromrevs(repo, missing)
except KeyError:
# Ignore if lfs extension is not enabled
return
Augie Fackler
formatting: blacken the codebase...
r43346
Pulkit Goyal
infinitepush: move the extension to core from fb-hgext...
r37204 class copiedpart(object):
"""a copy of unbundlepart content that can be consumed later"""
def __init__(self, part):
# copy "public properties"
self.type = part.type
self.id = part.id
self.mandatory = part.mandatory
self.mandatoryparams = part.mandatoryparams
self.advisoryparams = part.advisoryparams
self.params = part.params
self.mandatorykeys = part.mandatorykeys
# copy the buffer
self._io = util.stringio(part.read())
def consume(self):
return
def read(self, size=None):
if size is None:
return self._io.read()
else:
return self._io.read(size)