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() |
|