Merge generate_tarball_cvs and generate_tarball_svn functions.
* lib/viewcvs.py (generate_tarball, generate_tarball_cvs, generate_tarball_svn): combine svn and cvs functions into a new function (download_tarball): call new generate_tarball function * lib/vclib/svn/__init__.py (StreamPipe.read): support calls that don't specify length git-svn-id: http://viewvc.tigris.org/svn/viewvc/trunk@794 8cb11bc2-c004-0410-86c3-e597b4017df7remotes/tags/1.0.0-rc1
parent
8b7b732983
commit
b8f73030d6
|
@ -21,6 +21,7 @@ import vclib
|
|||
import os
|
||||
import os.path
|
||||
import string
|
||||
import cStringIO
|
||||
|
||||
# Subversion swig libs
|
||||
from svn import fs, repos, core, delta
|
||||
|
@ -240,10 +241,23 @@ class StreamPipe:
|
|||
self._stream = stream
|
||||
self._eof = 0
|
||||
|
||||
def read(self, len):
|
||||
def read(self, len=None):
|
||||
chunk = None
|
||||
if not self._eof:
|
||||
chunk = core.svn_stream_read(self._stream, len)
|
||||
if len is None:
|
||||
buffer = cStringIO.StringIO()
|
||||
try:
|
||||
while 1:
|
||||
hunk = core.svn_stream_read(self._stream, 8192)
|
||||
if not hunk:
|
||||
break
|
||||
buffer.write(hunk)
|
||||
chunk = buffer.getvalue()
|
||||
finally:
|
||||
buffer.close()
|
||||
|
||||
else:
|
||||
chunk = core.svn_stream_read(self._stream, len)
|
||||
if not chunk:
|
||||
self._eof = 1
|
||||
return chunk
|
||||
|
|
|
@ -2240,8 +2240,9 @@ def generate_tarball_header(out, name, size=0, mode=None, mtime=0, uid=0, gid=0,
|
|||
|
||||
out.write(block)
|
||||
|
||||
def generate_tarball_cvs(out, request, tar_top, rep_top, reldir, tag, stack=[]):
|
||||
if (rep_top == '' and 0 < len(reldir) and
|
||||
def generate_tarball(out, request, tar_top, rep_top, reldir, tag, stack=[]):
|
||||
cvs = request.roottype == 'cvs'
|
||||
if cvs and (rep_top == '' and 0 < len(reldir) and
|
||||
((reldir[0] == 'CVSROOT' and cfg.options.hide_cvsroot)
|
||||
or cfg.is_forbidden(reldir[0]))):
|
||||
return
|
||||
|
@ -2249,7 +2250,10 @@ def generate_tarball_cvs(out, request, tar_top, rep_top, reldir, tag, stack=[]):
|
|||
rep_path = rep_top + reldir
|
||||
tar_dir = string.join(tar_top + reldir, '/') + '/'
|
||||
|
||||
entries = request.repos.listdir(rep_path, tag)
|
||||
if cvs:
|
||||
entries = request.repos.listdir(rep_path, tag)
|
||||
else:
|
||||
entries = request.repos.listdir(rep_path)
|
||||
|
||||
subdirs = [ ]
|
||||
for file in entries:
|
||||
|
@ -2258,23 +2262,32 @@ def generate_tarball_cvs(out, request, tar_top, rep_top, reldir, tag, stack=[]):
|
|||
|
||||
stack.append(tar_dir)
|
||||
|
||||
bincvs.get_logs(request.repos, rep_path, entries, tag)
|
||||
if cvs:
|
||||
bincvs.get_logs(request.repos, rep_path, entries, tag)
|
||||
else:
|
||||
rep_dir = string.join(rep_path, '/')
|
||||
vclib.svn.get_logs(request.repos, rep_dir, entries)
|
||||
|
||||
entries.sort(lambda a, b: cmp(a.name, b.name))
|
||||
|
||||
for file in entries:
|
||||
if file.rev is None or file.state == 'dead':
|
||||
if (file.kind != vclib.FILE or
|
||||
(cvs and (file.rev is None or file.state == 'dead'))):
|
||||
continue
|
||||
|
||||
for dir in stack:
|
||||
generate_tarball_header(out, dir)
|
||||
del stack[0:]
|
||||
|
||||
info = os.stat(file.path)
|
||||
mode = (info[stat.ST_MODE] & 0555) | 0200
|
||||
if cvs:
|
||||
info = os.stat(file.path)
|
||||
mode = (info[stat.ST_MODE] & 0555) | 0200
|
||||
rev_flag = '-p' + file.rev
|
||||
fp = request.repos.rcs_popen('co', (rev_flag, file.path), 'rb', 0)
|
||||
else:
|
||||
mode = 0644
|
||||
fp = request.repos.openfile(rep_top + reldir + [file.name])[0]
|
||||
|
||||
rev_flag = '-p' + file.rev
|
||||
fp = request.repos.rcs_popen('co', (rev_flag, file.path), 'rb', 0)
|
||||
contents = fp.read()
|
||||
status = fp.close()
|
||||
|
||||
|
@ -2285,61 +2298,13 @@ def generate_tarball_cvs(out, request, tar_top, rep_top, reldir, tag, stack=[]):
|
|||
|
||||
subdirs.sort()
|
||||
for subdir in subdirs:
|
||||
if subdir != 'Attic':
|
||||
generate_tarball_cvs(out, request, tar_top, rep_top,
|
||||
if not cvs or subdir != 'Attic':
|
||||
generate_tarball(out, request, tar_top, rep_top,
|
||||
reldir + [subdir], tag, stack)
|
||||
|
||||
if len(stack):
|
||||
del stack[-1:]
|
||||
|
||||
def generate_tarball_svn(out, request, tar_top, rep_top, reldir, tag, stack=[]):
|
||||
rep_dir = string.join(rep_top + reldir, '/')
|
||||
tar_dir = string.join(tar_top + reldir, '/') + '/'
|
||||
|
||||
entries = request.repos.listdir(rep_top + reldir)
|
||||
|
||||
subdirs = []
|
||||
for entry in entries:
|
||||
if entry.kind == vclib.DIR:
|
||||
subdirs.append(entry.name)
|
||||
|
||||
vclib.svn.get_logs(request.repos, rep_dir, entries)
|
||||
|
||||
stack.append(tar_dir)
|
||||
|
||||
for file in entries:
|
||||
if file.kind != vclib.FILE:
|
||||
continue
|
||||
|
||||
for dir in stack:
|
||||
generate_tarball_header(out, dir)
|
||||
del stack[0:]
|
||||
|
||||
mode = 0644
|
||||
|
||||
fp = request.repos.openfile(rep_top + reldir + [file.name])[0]
|
||||
|
||||
contents = ""
|
||||
while 1:
|
||||
chunk = fp.read(CHUNK_SIZE)
|
||||
if not chunk:
|
||||
break
|
||||
contents = contents + chunk
|
||||
|
||||
status = fp.close()
|
||||
|
||||
generate_tarball_header(out, tar_dir + file.name,
|
||||
len(contents), mode, file.date)
|
||||
out.write(contents)
|
||||
out.write('\0' * (511 - ((len(contents) + 511) % 512)))
|
||||
|
||||
for subdir in subdirs:
|
||||
generate_tarball_svn(out, request, tar_top, rep_top,
|
||||
reldir + [subdir], tag, stack)
|
||||
|
||||
if len(stack):
|
||||
del stack[-1:]
|
||||
|
||||
def download_tarball(request):
|
||||
if not cfg.options.allow_tar:
|
||||
raise "tarball no allows"
|
||||
|
@ -2354,11 +2319,7 @@ def download_tarball(request):
|
|||
sys.stdout.flush()
|
||||
fp = popen.pipe_cmds([('gzip', '-c', '-n')])
|
||||
|
||||
# Switch based on the repository root type.
|
||||
if request.roottype == 'cvs':
|
||||
generate_tarball_cvs(fp, request, tar_top, rep_top, [], tag)
|
||||
elif request.roottype == 'svn':
|
||||
generate_tarball_svn(fp, request, tar_top, rep_top, [], tag)
|
||||
generate_tarball(fp, request, tar_top, rep_top, [], tag)
|
||||
|
||||
fp.write('\0' * 1024)
|
||||
fp.close()
|
||||
|
|
Loading…
Reference in New Issue