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