##// END OF EJS Templates
bookmarks: fix _bookmarks/lookup() reentrancy issue (issue2016)...
bookmarks: fix _bookmarks/lookup() reentrancy issue (issue2016) _bookmarks is loaded lazily and calls super.lookup(). Unfortunately, branch and tags caches initializations also recurse in lookup() and end up trying to access _bookmarks again. Massive confusion ensues. I considered fixing all branches and tags cache loading to avoid recursing in lookup() but it would add complexity to otherwise working code provided lookups are performed on nodes or revnums.

File last commit:

r11624:67260651 default
r12392:74129048 stable
Show More
streamclone.py
69 lines | 2.2 KiB | text/x-python | PythonLexer
Vadim Gelfer
add support for streaming clone....
r2612 # streamclone.py - streaming clone server support for mercurial
#
# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
#
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Vadim Gelfer
add support for streaming clone....
r2612
Matt Mackall
error: move lock errors...
r7640 import util, error
Vadim Gelfer
add support for streaming clone....
r2612
Benoit Boissinot
filelog encoding: move the encoding/decoding into store...
r8531 from mercurial import store
Dirkjan Ochtman
make streamclone.stream_out() a generator
r6925 class StreamException(Exception):
def __init__(self, code):
Exception.__init__(self)
self.code = code
def __str__(self):
return '%i\n' % self.code
Vadim Gelfer
add support for streaming clone....
r2612 # if server supports streaming clone, it advertises "stream"
# capability with value that is version+flags of repo it is serving.
# client only streams if it can read that repo format.
# stream file format is simple.
#
# server writes out line that says how many files, how many total
# bytes. separator is ascii space, byte counts are strings.
#
# then for each file:
#
timeless
Generally replace "file name" with "filename" in help and comments.
r8761 # server writes out line that says filename, how many bytes in
Vadim Gelfer
add support for streaming clone....
r2612 # file. separator is ascii nul, byte count is string.
#
# server writes out raw file data.
Matt Mackall
streamclone: allow uncompressed clones by default
r10377 def allowed(ui):
Matt Mackall
streaming: actually change default
r10414 return ui.configbool('server', 'uncompressed', True, untrusted=True)
Matt Mackall
streamclone: allow uncompressed clones by default
r10377
def stream_out(repo):
Vadim Gelfer
add support for streaming clone....
r2612 '''stream out all metadata files in repository.
writes to file-like object, must support write() and optional flush().'''
Vadim Gelfer
clone: disable stream support on server side by default....
r2621
Matt Mackall
streamclone: allow uncompressed clones by default
r10377 if not allowed(repo.ui):
Dirkjan Ochtman
make streamclone.stream_out() a generator
r6925 raise StreamException(1)
Vadim Gelfer
clone: disable stream support on server side by default....
r2621
Matt Mackall
streamclone: fold in localrepo.storefiles
r6901 entries = []
total_bytes = 0
Thomas Arendsen Hein
Handle locking exceptions if streaming clone can't lock the repo. (Issue324)
r3687 try:
Ronny Pfannschmidt
switch lock releasing in the core from gc to explicit
r8109 # get consistent snapshot of repo, lock during scan
lock = repo.lock()
Matt Mackall
streamclone: fold in localrepo.storefiles
r6901 try:
Martin Geisler
do not attempt to translate ui.debug output
r9467 repo.ui.debug('scanning\n')
Matt Mackall
streamclone: fold in localrepo.storefiles
r6901 for name, ename, size in repo.store.walk():
Greg Ward
streamclone: partially encode filename over the wire, not for local read (issue1847)...
r9506 entries.append((name, size))
Matt Mackall
streamclone: fold in localrepo.storefiles
r6901 total_bytes += size
finally:
Ronny Pfannschmidt
switch lock releasing in the core from gc to explicit
r8109 lock.release()
Matt Mackall
error: move lock errors...
r7640 except error.LockError:
Dirkjan Ochtman
make streamclone.stream_out() a generator
r6925 raise StreamException(2)
Thomas Arendsen Hein
Handle locking exceptions if streaming clone can't lock the repo. (Issue324)
r3687
Dirkjan Ochtman
make streamclone.stream_out() a generator
r6925 yield '0\n'
Martin Geisler
do not attempt to translate ui.debug output
r9467 repo.ui.debug('%d files, %d bytes to transfer\n' %
Vadim Gelfer
add support for streaming clone....
r2612 (len(entries), total_bytes))
Dirkjan Ochtman
make streamclone.stream_out() a generator
r6925 yield '%d %d\n' % (len(entries), total_bytes)
Vadim Gelfer
add support for streaming clone....
r2612 for name, size in entries:
Martin Geisler
do not attempt to translate ui.debug output
r9467 repo.ui.debug('sending %s (%d bytes)\n' % (name, size))
Greg Ward
streamclone: partially encode filename over the wire, not for local read (issue1847)...
r9506 # partially encode name over the wire for backwards compat
yield '%s\0%d\n' % (store.encodedir(name), size)
Benoit Boissinot
introduce localrepo.spath for the store path, sopener fixes
r3791 for chunk in util.filechunkiter(repo.sopener(name), limit=size):
Dirkjan Ochtman
make streamclone.stream_out() a generator
r6925 yield chunk