mercurial/streamclone.py
changeset 6782 b9d6ab187523
parent 6762 f67d1468ac50
child 6794 8ff321a381d0
equal deleted inserted replaced
6781:b4b7261164d5 6782:b9d6ab187523
    49 #   server writes out line that says file name, how many bytes in
    49 #   server writes out line that says file name, how many bytes in
    50 #   file.  separator is ascii nul, byte count is string.
    50 #   file.  separator is ascii nul, byte count is string.
    51 #
    51 #
    52 #   server writes out raw file data.
    52 #   server writes out raw file data.
    53 
    53 
    54 def stream_out(repo, fileobj, untrusted=False):
    54 def stream_out(repo, untrusted=False):
    55     '''stream out all metadata files in repository.
    55     '''stream out all metadata files in repository.
    56     writes to file-like object, must support write() and optional flush().'''
    56     writes to file-like object, must support write() and optional flush().'''
    57 
    57 
    58     if not repo.ui.configbool('server', 'uncompressed', untrusted=untrusted):
    58     if not repo.ui.configbool('server', 'uncompressed', untrusted=untrusted):
    59         fileobj.write('1\n')
    59         yield '1\n'
    60         return
    60         return
    61 
    61 
    62     # get consistent snapshot of repo. lock during scan so lock not
    62     # get consistent snapshot of repo. lock during scan so lock not
    63     # needed while we stream, and commits can happen.
    63     # needed while we stream, and commits can happen.
    64     repolock = None
    64     repolock = None
    65     try:
    65     try:
    66         try:
    66         try:
    67             repolock = repo.lock()
    67             repolock = repo.lock()
    68         except (lock.LockHeld, lock.LockUnavailable), inst:
    68         except (lock.LockHeld, lock.LockUnavailable), inst:
    69             repo.ui.warn('locking the repository failed: %s\n' % (inst,))
    69             repo.ui.warn('locking the repository failed: %s\n' % (inst,))
    70             fileobj.write('2\n')
    70             yield '2\n'
    71             return
    71             return
    72 
    72 
    73         fileobj.write('0\n')
    73         yield '0\n'
    74         repo.ui.debug('scanning\n')
    74         repo.ui.debug('scanning\n')
    75         entries = []
    75         entries = []
    76         total_bytes = 0
    76         total_bytes = 0
    77         for name, size in walkrepo(repo.spath):
    77         for name, size in walkrepo(repo.spath):
    78             name = repo.decodefn(util.pconvert(name))
    78             name = repo.decodefn(util.pconvert(name))
    81     finally:
    81     finally:
    82         del repolock
    82         del repolock
    83 
    83 
    84     repo.ui.debug('%d files, %d bytes to transfer\n' %
    84     repo.ui.debug('%d files, %d bytes to transfer\n' %
    85                   (len(entries), total_bytes))
    85                   (len(entries), total_bytes))
    86     fileobj.write('%d %d\n' % (len(entries), total_bytes))
    86     yield '%d %d\n' % (len(entries), total_bytes)
    87     for name, size in entries:
    87     for name, size in entries:
    88         repo.ui.debug('sending %s (%d bytes)\n' % (name, size))
    88         repo.ui.debug('sending %s (%d bytes)\n' % (name, size))
    89         fileobj.write('%s\0%d\n' % (name, size))
    89         yield '%s\0%d\n' % (name, size)
    90         for chunk in util.filechunkiter(repo.sopener(name), limit=size):
    90         for chunk in util.filechunkiter(repo.sopener(name), limit=size):
    91             fileobj.write(chunk)
    91             yield chunk
    92     flush = getattr(fileobj, 'flush', None)
       
    93     if flush: flush()