##// END OF EJS Templates
api: allow uncached content fetching....
marcink -
r3479:58288c09 default
parent child
Show More
@@ -504,7 +504,8 def get_repo_nodes(request, apiuser, rep
504
504
505 @jsonrpc_method()
505 @jsonrpc_method()
506 def get_repo_file(request, apiuser, repoid, commit_id, file_path,
506 def get_repo_file(request, apiuser, repoid, commit_id, file_path,
507 max_file_bytes=Optional(None), details=Optional('basic')):
507 max_file_bytes=Optional(None), details=Optional('basic'),
508 cache=Optional(True)):
508 """
509 """
509 Returns a single file from repository at given revision.
510 Returns a single file from repository at given revision.
510
511
@@ -523,8 +524,10 def get_repo_file(request, apiuser, repo
523 The valid options are ``minimal`` ``basic`` and ``full``.
524 The valid options are ``minimal`` ``basic`` and ``full``.
524 :type details: Optional(str)
525 :type details: Optional(str)
525 :param max_file_bytes: Only return file content under this file size bytes
526 :param max_file_bytes: Only return file content under this file size bytes
526 :type details: Optional(int)
527 :type max_file_bytes: Optional(int)
527
528 :param cache: Use internal caches for fetching files. If disabled fetching
529 files is slower but more memory efficient
530 :type cache: Optional(bool)
528 Example output:
531 Example output:
529
532
530 .. code-block:: bash
533 .. code-block:: bash
@@ -549,6 +552,7 def get_repo_file(request, apiuser, repo
549 _perms = ('repository.admin', 'repository.write', 'repository.read',)
552 _perms = ('repository.admin', 'repository.write', 'repository.read',)
550 validate_repo_permissions(apiuser, repoid, repo, _perms)
553 validate_repo_permissions(apiuser, repoid, repo, _perms)
551
554
555 cache = Optional.extract(cache, binary=True)
552 details = Optional.extract(details)
556 details = Optional.extract(details)
553 _extended_types = ['minimal', 'minimal+search', 'basic', 'full']
557 _extended_types = ['minimal', 'minimal+search', 'basic', 'full']
554 if details not in _extended_types:
558 if details not in _extended_types:
@@ -574,7 +578,7 def get_repo_file(request, apiuser, repo
574
578
575 node = ScmModel().get_node(
579 node = ScmModel().get_node(
576 repo, commit_id, file_path, extended_info=extended_info,
580 repo, commit_id, file_path, extended_info=extended_info,
577 content=content, max_file_bytes=max_file_bytes)
581 content=content, max_file_bytes=max_file_bytes, cache=cache)
578
582
579 except Exception:
583 except Exception:
580 log.exception("Exception occurred while trying to get repo node")
584 log.exception("Exception occurred while trying to get repo node")
@@ -381,16 +381,25 class FileNode(Node):
381 Returns md5, binary flag of the file node, without any cache usage.
381 Returns md5, binary flag of the file node, without any cache usage.
382 """
382 """
383
383
384 if self.commit:
384 content = self.content_uncached()
385 content = self.commit.get_file_content(self.path)
386 else:
387 content = self._content
388
385
389 is_binary = content and '\0' in content
386 is_binary = content and '\0' in content
390 size = 0
387 size = 0
391 if content:
388 if content:
392 size = len(content)
389 size = len(content)
393 return is_binary, md5(content), size
390
391 return is_binary, md5(content), size, content
392
393 def content_uncached(self):
394 """
395 Returns lazily content of the FileNode. If possible, would try to
396 decode content from UTF-8.
397 """
398 if self.commit:
399 content = self.commit.get_file_content(self.path)
400 else:
401 content = self._content
402 return content
394
403
395 @LazyProperty
404 @LazyProperty
396 def content(self):
405 def content(self):
@@ -583,7 +583,7 class ScmModel(BaseModel):
583 return _dirs, _files
583 return _dirs, _files
584
584
585 def get_node(self, repo_name, commit_id, file_path,
585 def get_node(self, repo_name, commit_id, file_path,
586 extended_info=False, content=False, max_file_bytes=None):
586 extended_info=False, content=False, max_file_bytes=None, cache=True):
587 """
587 """
588 retrieve single node from commit
588 retrieve single node from commit
589 """
589 """
@@ -606,12 +606,21 class ScmModel(BaseModel):
606
606
607 if extended_info:
607 if extended_info:
608 file_data.update({
608 file_data.update({
609 "md5": file_node.md5,
610 "binary": file_node.is_binary,
611 "size": file_node.size,
612 "extension": file_node.extension,
609 "extension": file_node.extension,
613 "mimetype": file_node.mimetype,
610 "mimetype": file_node.mimetype,
614 "lines": file_node.lines()[0]
611 })
612
613 if cache:
614 md5 = file_node.md5
615 is_binary = file_node.is_binary
616 size = file_node.size
617 else:
618 is_binary, md5, size, _content = file_node.metadata_uncached()
619
620 file_data.update({
621 "md5": md5,
622 "binary": is_binary,
623 "size": size,
615 })
624 })
616
625
617 if content:
626 if content:
@@ -619,7 +628,13 class ScmModel(BaseModel):
619 and file_node.size > max_file_bytes)
628 and file_node.size > max_file_bytes)
620 full_content = None
629 full_content = None
621 if not file_node.is_binary and not over_size_limit:
630 if not file_node.is_binary and not over_size_limit:
622 full_content = safe_str(file_node.content)
631 if cache:
632 full_content = safe_str(file_node.content)
633 else:
634 if _content is None:
635 is_binary, md5, size, _content = \
636 file_node.metadata_uncached()
637 full_content = safe_str(_content)
623
638
624 file_data.update({
639 file_data.update({
625 "content": full_content,
640 "content": full_content,
@@ -647,7 +662,7 class ScmModel(BaseModel):
647 for f in files:
662 for f in files:
648 _content = None
663 _content = None
649 _data = f_name = f.unicode_path
664 _data = f_name = f.unicode_path
650 is_binary, md5, size = f.metadata_uncached()
665 is_binary, md5, size, _content = f.metadata_uncached()
651 _data = {
666 _data = {
652 "name": h.escape(f_name),
667 "name": h.escape(f_name),
653 "md5": md5,
668 "md5": md5,
General Comments 0
You need to be logged in to leave comments. Login now