1# Copyright (c) 2012-2016 Seafile Ltd. 2# encoding: utf-8 3import time 4from seaserv import seafile_api 5from seahub.settings import GET_FILE_HISTORY_TIMEOUT 6 7def get_file_revisions_within_limit(repo_id, path, commit_id=None, limit=50): 8 if not commit_id: 9 repo = seafile_api.get_repo(repo_id) 10 commit_id = repo.head_cmmt_id 11 12 file_revisions = seafile_api.get_file_revisions(repo_id, 13 commit_id, path, limit) 14 next_start_commit = file_revisions[-1].next_start_commit 15 return file_revisions[0:-1], next_start_commit 16 17def get_file_revisions_after_renamed(repo_id, path): 18 all_file_revisions = [] 19 repo = seafile_api.get_repo(repo_id) 20 commit_id = repo.head_cmmt_id 21 22 start_time = time.time() 23 keep_on_search = True 24 while keep_on_search: 25 file_revisions = seafile_api.get_file_revisions(repo_id, 26 commit_id, path, 50) 27 28 all_file_revisions += file_revisions[0:-1] 29 30 end_time = time.time() 31 next_start_commit = file_revisions[-1].next_start_commit 32 rev_renamed_old_path = file_revisions[-2].rev_renamed_old_path if \ 33 len(file_revisions) > 1 else None 34 35 if not next_start_commit or \ 36 rev_renamed_old_path or \ 37 end_time - start_time > GET_FILE_HISTORY_TIMEOUT: 38 # have searched all commits or 39 # found a file renamed/moved commit or 40 # timeout 41 keep_on_search = False 42 else: 43 # keep on searching, use next_start_commit 44 # as the commit_id start to search 45 commit_id = next_start_commit 46 47 return all_file_revisions 48 49def get_all_file_revisions(repo_id, path, commit_id=None): 50 """ Only used for test revert file. 51 52 py.test tests/api/endpoints/test_file_view.py::FileViewTest::test_can_revert_file 53 """ 54 55 all_file_revisions = [] 56 57 if not commit_id: 58 repo = seafile_api.get_repo(repo_id) 59 commit_id = repo.head_cmmt_id 60 61 file_revisions = seafile_api.get_file_revisions(repo_id, 62 commit_id, path, -1) 63 all_file_revisions += file_revisions 64 65 # if commit's rev_renamed_old_path value not None, seafile will stop searching. 66 # so always uses `rev_renamed_old_path` info. 67 next_start_commit = file_revisions[-1].next_start_commit 68 if next_start_commit: 69 path = file_revisions[-2].rev_renamed_old_path if \ 70 len(file_revisions) > 1 else None 71 file_revisions = get_all_file_revisions(repo_id, path, 72 next_start_commit) 73 all_file_revisions += file_revisions 74 75 # from seafile_api: 76 # @next_start_commit: commit_id for next page. 77 # An extra commit which only contains @next_start_commit will be appended to the list. 78 return all_file_revisions[0:-1] 79