Show More
@@ -1880,6 +1880,8 b' get_repo_nodes' | |||
|
1880 | 1880 | md5, binary, and or content. The valid options are ``basic`` and |
|
1881 | 1881 | ``full``. |
|
1882 | 1882 | :type details: Optional(str) |
|
1883 | :param max_file_bytes: Only return file content under this file size bytes | |
|
1884 | :type details: Optional(int) | |
|
1883 | 1885 | |
|
1884 | 1886 | Example output: |
|
1885 | 1887 | |
@@ -2821,4 +2823,3 b' delete_gist' | |||
|
2821 | 2823 | error : { |
|
2822 | 2824 | "failed to delete gist ID:<gist_id>" |
|
2823 | 2825 | } |
|
2824 |
@@ -73,6 +73,29 b' class TestGetRepoNodes(object):' | |||
|
73 | 73 | expected = 'failed to get repo: `%s` nodes' % (backend.repo_name,) |
|
74 | 74 | assert_error(id_, expected, given=response.body) |
|
75 | 75 | |
|
76 | def test_api_get_repo_nodes_max_file_bytes(self, backend): | |
|
77 | commit_id = 'tip' | |
|
78 | path = '/' | |
|
79 | max_file_bytes = 500 | |
|
80 | ||
|
81 | id_, params = build_data( | |
|
82 | self.apikey, 'get_repo_nodes', | |
|
83 | repoid=backend.repo_name, revision=commit_id, details='full', | |
|
84 | root_path=path) | |
|
85 | response = api_call(self.app, params) | |
|
86 | assert any(file['content'] and len(file['content']) > max_file_bytes | |
|
87 | for file in response.json['result']) | |
|
88 | ||
|
89 | id_, params = build_data( | |
|
90 | self.apikey, 'get_repo_nodes', | |
|
91 | repoid=backend.repo_name, revision=commit_id, | |
|
92 | root_path=path, details='full', | |
|
93 | max_file_bytes=max_file_bytes) | |
|
94 | response = api_call(self.app, params) | |
|
95 | assert all( | |
|
96 | file['content'] is None if file['size'] > max_file_bytes else True | |
|
97 | for file in response.json['result']) | |
|
98 | ||
|
76 | 99 | def test_api_get_repo_nodes_bad_ret_type(self, backend): |
|
77 | 100 | commit_id = 'tip' |
|
78 | 101 | path = '/' |
@@ -400,7 +400,8 b' def get_repo_changesets(request, apiuser' | |||
|
400 | 400 | |
|
401 | 401 | @jsonrpc_method() |
|
402 | 402 | def get_repo_nodes(request, apiuser, repoid, revision, root_path, |
|
403 |
ret_type=Optional('all'), details=Optional('basic') |
|
|
403 | ret_type=Optional('all'), details=Optional('basic'), | |
|
404 | max_file_bytes=Optional(None)): | |
|
404 | 405 | """ |
|
405 | 406 | Returns a list of nodes and children in a flat list for a given |
|
406 | 407 | path at given revision. |
@@ -425,6 +426,8 b' def get_repo_nodes(request, apiuser, rep' | |||
|
425 | 426 | md5, binary, and or content. The valid options are ``basic`` and |
|
426 | 427 | ``full``. |
|
427 | 428 | :type details: Optional(str) |
|
429 | :param max_file_bytes: Only return file content under this file size bytes | |
|
430 | :type details: Optional(int) | |
|
428 | 431 | |
|
429 | 432 | Example output: |
|
430 | 433 | |
@@ -472,7 +475,8 b' def get_repo_nodes(request, apiuser, rep' | |||
|
472 | 475 | |
|
473 | 476 | _d, _f = ScmModel().get_nodes( |
|
474 | 477 | repo, revision, root_path, flat=False, |
|
475 |
extended_info=extended_info, content=content |
|
|
478 | extended_info=extended_info, content=content, | |
|
479 | max_file_bytes=max_file_bytes) | |
|
476 | 480 | _map = { |
|
477 | 481 | 'all': _d + _f, |
|
478 | 482 | 'files': _f, |
@@ -478,7 +478,7 b' class ScmModel(BaseModel):' | |||
|
478 | 478 | return data |
|
479 | 479 | |
|
480 | 480 | def get_nodes(self, repo_name, commit_id, root_path='/', flat=True, |
|
481 | extended_info=False, content=False): | |
|
481 | extended_info=False, content=False, max_file_bytes=None): | |
|
482 | 482 | """ |
|
483 | 483 | recursive walk in root dir and return a set of all path in that dir |
|
484 | 484 | based on repository walk function |
@@ -487,6 +487,7 b' class ScmModel(BaseModel):' | |||
|
487 | 487 | :param commit_id: commit id for which to list nodes |
|
488 | 488 | :param root_path: root path to list |
|
489 | 489 | :param flat: return as a list, if False returns a dict with description |
|
490 | :param max_file_bytes: will not return file contents over this limit | |
|
490 | 491 | |
|
491 | 492 | """ |
|
492 | 493 | _files = list() |
@@ -499,6 +500,8 b' class ScmModel(BaseModel):' | |||
|
499 | 500 | for f in files: |
|
500 | 501 | _content = None |
|
501 | 502 | _data = f.unicode_path |
|
503 | over_size_limit = (max_file_bytes is not None | |
|
504 | and f.size > max_file_bytes) | |
|
502 | 505 | |
|
503 | 506 | if not flat: |
|
504 | 507 | _data = { |
@@ -517,7 +520,7 b' class ScmModel(BaseModel):' | |||
|
517 | 520 | |
|
518 | 521 | if content: |
|
519 | 522 | full_content = None |
|
520 | if not f.is_binary: | |
|
523 | if not f.is_binary and not over_size_limit: | |
|
521 | 524 | full_content = safe_str(f.content) |
|
522 | 525 | |
|
523 | 526 | _data.update({ |
@@ -1096,4 +1099,4 b' def _check_rhodecode_hook(hook_path):' | |||
|
1096 | 1099 | def _read_hook(hook_path): |
|
1097 | 1100 | with open(hook_path, 'rb') as f: |
|
1098 | 1101 | content = f.read() |
|
1099 | return content No newline at end of file | |
|
1102 | return content |
@@ -148,6 +148,23 b' def test_get_nodes_returns_unicode_non_f' | |||
|
148 | 148 | assert_contains_only_unicode([f['name'] for f in files]) |
|
149 | 149 | |
|
150 | 150 | |
|
151 | def test_get_nodes_max_file_bytes(backend_random): | |
|
152 | repo = backend_random.repo | |
|
153 | max_file_bytes = 10 | |
|
154 | directories, files = scm.ScmModel().get_nodes( | |
|
155 | repo.repo_name, repo.get_commit(commit_idx=0).raw_id, content=True, | |
|
156 | extended_info=True, flat=False) | |
|
157 | assert any(file['content'] and len(file['content']) > max_file_bytes | |
|
158 | for file in files) | |
|
159 | ||
|
160 | directories, files = scm.ScmModel().get_nodes( | |
|
161 | repo.repo_name, repo.get_commit(commit_idx=0).raw_id, content=True, | |
|
162 | extended_info=True, flat=False, max_file_bytes=max_file_bytes) | |
|
163 | assert all( | |
|
164 | file['content'] is None if file['size'] > max_file_bytes else True | |
|
165 | for file in files) | |
|
166 | ||
|
167 | ||
|
151 | 168 | def assert_contains_only_unicode(structure): |
|
152 | 169 | assert structure |
|
153 | 170 | for value in structure: |
General Comments 0
You need to be logged in to leave comments.
Login now