##// END OF EJS Templates
initial version of #788 tarball cache
marcink -
r3490:c0ac34b8 beta
parent child Browse files
Show More
@@ -65,6 +65,8 b' static_files = true'
65 lang = en
65 lang = en
66 cache_dir = %(here)s/data
66 cache_dir = %(here)s/data
67 index_dir = %(here)s/data/index
67 index_dir = %(here)s/data/index
68 # set this path to use archive download cache
69 #archive_cache_dir = /tmp/rhodecode_tarballcache
68 app_instance_uuid = rc-develop
70 app_instance_uuid = rc-develop
69 cut_off_limit = 256000
71 cut_off_limit = 256000
70 vcs_full_cache = True
72 vcs_full_cache = True
@@ -65,6 +65,8 b' static_files = true'
65 lang = en
65 lang = en
66 cache_dir = %(here)s/data
66 cache_dir = %(here)s/data
67 index_dir = %(here)s/data/index
67 index_dir = %(here)s/data/index
68 # set this path to use archive download cache
69 #archive_cache_dir = /tmp/rhodecode_tarballcache
68 app_instance_uuid = rc-production
70 app_instance_uuid = rc-production
69 cut_off_limit = 256000
71 cut_off_limit = 256000
70 vcs_full_cache = True
72 vcs_full_cache = True
@@ -65,6 +65,8 b' static_files = true'
65 lang = en
65 lang = en
66 cache_dir = %(here)s/data
66 cache_dir = %(here)s/data
67 index_dir = %(here)s/data/index
67 index_dir = %(here)s/data/index
68 # set this path to use archive download cache
69 #archive_cache_dir = /tmp/rhodecode_tarballcache
68 app_instance_uuid = ${app_instance_uuid}
70 app_instance_uuid = ${app_instance_uuid}
69 cut_off_limit = 256000
71 cut_off_limit = 256000
70 vcs_full_cache = True
72 vcs_full_cache = True
@@ -27,6 +27,7 b' import os'
27 import logging
27 import logging
28 import traceback
28 import traceback
29 import tempfile
29 import tempfile
30 import shutil
30
31
31 from pylons import request, response, tmpl_context as c, url
32 from pylons import request, response, tmpl_context as c, url
32 from pylons.i18n.translation import _
33 from pylons.i18n.translation import _
@@ -429,10 +430,39 b' class FilesController(BaseRepoController'
429 return _('Empty repository')
430 return _('Empty repository')
430 except (ImproperArchiveTypeError, KeyError):
431 except (ImproperArchiveTypeError, KeyError):
431 return _('Unknown archive type')
432 return _('Unknown archive type')
433 # archive cache
434 from rhodecode import CONFIG
435 rev_name = cs.raw_id[:12]
436 archive_name = '%s-%s%s' % (safe_str(repo_name.replace('/', '_')),
437 safe_str(rev_name), ext)
432
438
439 use_cached_archive = False # defines if we use cached version of archive
440 archive_cache_enabled = CONFIG.get('archive_cache_dir')
441 if not subrepos and archive_cache_enabled:
442 #check if we it's ok to write
443 if not os.path.isdir(CONFIG['archive_cache_dir']):
444 os.makedirs(CONFIG['archive_cache_dir'])
445 cached_archive_path = os.path.join(CONFIG['archive_cache_dir'], archive_name)
446 if os.path.isfile(cached_archive_path):
447 log.debug('Found cached archive in %s' % cached_archive_path)
448 fd, archive = None, cached_archive_path
449 use_cached_archive = True
450 else:
451 log.debug('Archive %s is not yet cached' % (archive_name))
452
453 if not use_cached_archive:
454 #generate new archive
455 try:
433 fd, archive = tempfile.mkstemp()
456 fd, archive = tempfile.mkstemp()
434 t = open(archive, 'wb')
457 t = open(archive, 'wb')
458 log.debug('Creating new temp archive in %s' % archive)
435 cs.fill_archive(stream=t, kind=fileformat, subrepos=subrepos)
459 cs.fill_archive(stream=t, kind=fileformat, subrepos=subrepos)
460 if archive_cache_enabled:
461 #if we generated the archive and use cache rename that
462 log.debug('Storing new archive in %s' % cached_archive_path)
463 shutil.move(archive, cached_archive_path)
464 archive = cached_archive_path
465 finally:
436 t.close()
466 t.close()
437
467
438 def get_chunked_archive(archive):
468 def get_chunked_archive(archive):
@@ -441,14 +471,15 b' class FilesController(BaseRepoController'
441 data = stream.read(16 * 1024)
471 data = stream.read(16 * 1024)
442 if not data:
472 if not data:
443 stream.close()
473 stream.close()
474 if fd: # fd means we used temporary file
444 os.close(fd)
475 os.close(fd)
476 if not archive_cache_enabled:
477 log.debug('Destroing temp archive %s' % archive)
445 os.remove(archive)
478 os.remove(archive)
446 break
479 break
447 yield data
480 yield data
448
481
449 response.content_disposition = str('attachment; filename=%s-%s%s' \
482 response.content_disposition = str('attachment; filename=%s' % (archive_name))
450 % (safe_str(repo_name),
451 safe_str(revision), ext))
452 response.content_type = str(content_type)
483 response.content_type = str(content_type)
453 return get_chunked_archive(archive)
484 return get_chunked_archive(archive)
454
485
@@ -65,6 +65,8 b' static_files = true'
65 lang = en
65 lang = en
66 cache_dir = /tmp/rc/data
66 cache_dir = /tmp/rc/data
67 index_dir = /tmp/rc/index
67 index_dir = /tmp/rc/index
68 # set this path to use archive download cache
69 #archive_cache_dir = /tmp/rhodecode_tarballcache
68 app_instance_uuid = develop-test
70 app_instance_uuid = develop-test
69 cut_off_limit = 256000
71 cut_off_limit = 256000
70 vcs_full_cache = False
72 vcs_full_cache = False
General Comments 0
You need to be logged in to leave comments. Login now