Show More
@@ -42,7 +42,7 b' from rhodecode.lib.exceptions import Non' | |||
|
42 | 42 | from rhodecode.lib.codeblocks import ( |
|
43 | 43 | filenode_as_lines_tokens, filenode_as_annotated_lines_tokens) |
|
44 | 44 | from rhodecode.lib.utils2 import ( |
|
45 | convert_line_endings, detect_mode, safe_str, str2bool, safe_int) | |
|
45 | convert_line_endings, detect_mode, safe_str, str2bool, safe_int, sha1) | |
|
46 | 46 | from rhodecode.lib.auth import ( |
|
47 | 47 | LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired) |
|
48 | 48 | from rhodecode.lib.vcs import path as vcspath |
@@ -243,16 +243,16 b' class RepoFilesView(RepoAppView):' | |||
|
243 | 243 | |
|
244 | 244 | @region.conditional_cache_on_arguments(namespace=cache_namespace_uid, |
|
245 | 245 | condition=cache_on) |
|
246 | def compute_file_tree(repo_id, commit_id, f_path, full_load): | |
|
247 | log.debug('Generating cached file tree for repo_id: %s, %s, %s', | |
|
248 | repo_id, commit_id, f_path) | |
|
246 | def compute_file_tree(ver, repo_id, commit_id, f_path, full_load): | |
|
247 | log.debug('Generating cached file tree at ver:%s for repo_id: %s, %s, %s', | |
|
248 | ver, repo_id, commit_id, f_path) | |
|
249 | 249 | |
|
250 | 250 | c.full_load = full_load |
|
251 | 251 | return render( |
|
252 | 252 | 'rhodecode:templates/files/files_browser_tree.mako', |
|
253 | 253 | self._get_template_context(c), self.request) |
|
254 | 254 | |
|
255 | return compute_file_tree(self.db_repo.repo_id, commit_id, f_path, full_load) | |
|
255 | return compute_file_tree('v1', self.db_repo.repo_id, commit_id, f_path, full_load) | |
|
256 | 256 | |
|
257 | 257 | def _get_archive_spec(self, fname): |
|
258 | 258 | log.debug('Detecting archive spec for: `%s`', fname) |
@@ -291,6 +291,7 b' class RepoFilesView(RepoAppView):' | |||
|
291 | 291 | |
|
292 | 292 | fname = self.request.matchdict['fname'] |
|
293 | 293 | subrepos = self.request.GET.get('subrepos') == 'true' |
|
294 | at_path = self.request.GET.get('at_path') or '/' | |
|
294 | 295 | |
|
295 | 296 | if not self.db_repo.enable_downloads: |
|
296 | 297 | return Response(_('Downloads disabled')) |
@@ -310,10 +311,19 b' class RepoFilesView(RepoAppView):' | |||
|
310 | 311 | except EmptyRepositoryError: |
|
311 | 312 | return Response(_('Empty repository')) |
|
312 | 313 | |
|
313 | archive_name = '%s-%s%s%s' % ( | |
|
314 | try: | |
|
315 | at_path = commit.get_node(at_path).path | |
|
316 | except Exception: | |
|
317 | return Response(_('No node at path {} for this repository').format(at_path)) | |
|
318 | ||
|
319 | path_sha = sha1(at_path)[:8] | |
|
320 | ||
|
321 | archive_name = '{}-{}{}-{}{}'.format( | |
|
314 | 322 | safe_str(self.db_repo_name.replace('/', '_')), |
|
315 | 323 | '-sub' if subrepos else '', |
|
316 |
safe_str(commit.short_id), |
|
|
324 | safe_str(commit.short_id), | |
|
325 | path_sha, | |
|
326 | ext) | |
|
317 | 327 | |
|
318 | 328 | use_cached_archive = False |
|
319 | 329 | archive_cache_enabled = CONFIG.get( |
@@ -338,7 +348,8 b' class RepoFilesView(RepoAppView):' | |||
|
338 | 348 | fd, archive = tempfile.mkstemp() |
|
339 | 349 | log.debug('Creating new temp archive in %s', archive) |
|
340 | 350 | try: |
|
341 |
commit.archive_repo(archive, kind=fileformat, subrepos=subrepos |
|
|
351 | commit.archive_repo(archive, kind=fileformat, subrepos=subrepos, | |
|
352 | archive_at_path=at_path) | |
|
342 | 353 | except ImproperArchiveTypeError: |
|
343 | 354 | return _('Unknown archive type') |
|
344 | 355 | if archive_cache_enabled: |
@@ -1094,12 +1094,12 b' class BaseCommit(object):' | |||
|
1094 | 1094 | """ |
|
1095 | 1095 | return None |
|
1096 | 1096 | |
|
1097 |
def archive_repo(self, |
|
|
1098 | prefix=None, write_metadata=False, mtime=None): | |
|
1097 | def archive_repo(self, archive_dest_path, kind='tgz', subrepos=None, | |
|
1098 | prefix=None, write_metadata=False, mtime=None, archive_at_path='/'): | |
|
1099 | 1099 | """ |
|
1100 | 1100 | Creates an archive containing the contents of the repository. |
|
1101 | 1101 | |
|
1102 |
:param |
|
|
1102 | :param archive_dest_path: path to the file which to create the archive. | |
|
1103 | 1103 | :param kind: one of following: ``"tbz2"``, ``"tgz"``, ``"zip"``. |
|
1104 | 1104 | :param prefix: name of root directory in archive. |
|
1105 | 1105 | Default is repository name and commit's short_id joined with dash: |
@@ -1107,6 +1107,7 b' class BaseCommit(object):' | |||
|
1107 | 1107 | :param write_metadata: write a metadata file into archive. |
|
1108 | 1108 | :param mtime: custom modification time for archive creation, defaults |
|
1109 | 1109 | to time.time() if not given. |
|
1110 | :param archive_at_path: pack files at this path (default '/') | |
|
1110 | 1111 | |
|
1111 | 1112 | :raise VCSError: If prefix has a problem. |
|
1112 | 1113 | """ |
@@ -1122,7 +1123,7 b' class BaseCommit(object):' | |||
|
1122 | 1123 | |
|
1123 | 1124 | file_info = [] |
|
1124 | 1125 | cur_rev = self.repository.get_commit(commit_id=self.raw_id) |
|
1125 |
for _r, _d, files in cur_rev.walk( |
|
|
1126 | for _r, _d, files in cur_rev.walk(archive_at_path): | |
|
1126 | 1127 | for f in files: |
|
1127 | 1128 | f_path = os.path.join(prefix, f.path) |
|
1128 | 1129 | file_info.append( |
@@ -1131,6 +1132,7 b' class BaseCommit(object):' | |||
|
1131 | 1132 | if write_metadata: |
|
1132 | 1133 | metadata = [ |
|
1133 | 1134 | ('repo_name', self.repository.name), |
|
1135 | ('commit_id', self.raw_id), | |
|
1134 | 1136 | ('rev', self.raw_id), |
|
1135 | 1137 | ('create_time', mtime), |
|
1136 | 1138 | ('branch', self.branch), |
@@ -1139,7 +1141,7 b' class BaseCommit(object):' | |||
|
1139 | 1141 | meta = ["%s:%s" % (f_name, value) for f_name, value in metadata] |
|
1140 | 1142 | file_info.append(('.archival.txt', 0o644, False, '\n'.join(meta))) |
|
1141 | 1143 | |
|
1142 |
connection.Hg.archive_repo( |
|
|
1144 | connection.Hg.archive_repo(archive_dest_path, mtime, file_info, kind) | |
|
1143 | 1145 | |
|
1144 | 1146 | def _validate_archive_prefix(self, prefix): |
|
1145 | 1147 | if prefix is None: |
@@ -35,7 +35,7 b'' | |||
|
35 | 35 | </td> |
|
36 | 36 | <td class="td-actions"> |
|
37 | 37 | <a href="${h.route_path('repo_compare',repo_name=c.repo_name, source_ref_type="rev", source_ref=cs.raw_id,target_ref_type="rev", target_ref=c.commit_id,_query=dict(merge='1',f_path=c.changelog_for_path))}"> |
|
38 | ${_('Diff File')} | |
|
38 | <span title="${'Diff {} vs {}'.format(cs.raw_id[:8],c.commit_id[:8])}">${_('Diff File')}</span> | |
|
39 | 39 | </a> |
|
40 | 40 | </td> |
|
41 | 41 | </tr> |
@@ -35,7 +35,7 b'' | |||
|
35 | 35 | ${_('Download full tree ZIP')} |
|
36 | 36 | </a> |
|
37 | 37 | % else: |
|
38 | <a href="${h.route_path('repo_archivefile',repo_name=c.repo_name, fname='{}.zip'.format(c.commit.raw_id))}"> | |
|
38 | <a href="${h.route_path('repo_archivefile',repo_name=c.repo_name, fname='{}.zip'.format(c.commit.raw_id), _query={'at_path':c.f_path})}"> | |
|
39 | 39 | ${_('Download this tree ZIP')} |
|
40 | 40 | </a> |
|
41 | 41 | % endif |
General Comments 0
You need to be logged in to leave comments.
Login now