|
1 | 1 | import logging |
| 2 | +from time import sleep |
| 3 | + |
2 | 4 | import math |
3 | 5 | import os |
4 | 6 | import json |
|
19 | 21 |
|
20 | 22 | from typing import List |
21 | 23 |
|
22 | | -from .client_sync import Syncer |
23 | 24 | from .common import ClientError, LoginError, WorkspaceRole, ProjectRole, LOG_FILE_SIZE_TO_SEND, MERGIN_DEFAULT_LOGS_URL |
24 | 25 | from .merginproject import MerginProject |
25 | 26 | from .client_pull import ( |
|
32 | 33 | download_project_finalize, |
33 | 34 | download_project_wait, |
34 | 35 | download_diffs_finalize, |
| 36 | + pull_project_is_running, |
| 37 | + pull_project_async, |
| 38 | + pull_project_wait, |
| 39 | + pull_project_finalize |
35 | 40 | ) |
36 | | -from .client_pull import pull_project_async, pull_project_wait, pull_project_finalize |
37 | | -from .client_push import push_next_change, push_project_wait, push_project_finalize, push_project_async |
| 41 | +from .client_push import push_project_wait, push_project_finalize, push_project_async, push_project_is_running, \ |
| 42 | + ChangesHandler |
38 | 43 | from .utils import DateTimeEncoder, get_versions_with_file_changes, int_version, is_version_acceptable |
39 | 44 | from .version import __version__ |
40 | 45 |
|
@@ -104,6 +109,8 @@ def __init__( |
104 | 109 | if plugin_version is not None: # this could be e.g. "Plugin/2020.1 QGIS/3.14" |
105 | 110 | self.client_version += " " + plugin_version |
106 | 111 | self.setup_logging() |
| 112 | + self.pull_job = None |
| 113 | + self.push_job = None |
107 | 114 | if auth_token: |
108 | 115 | try: |
109 | 116 | token_data = decode_token_data(auth_token) |
@@ -891,11 +898,6 @@ def project_user_permissions(self, project_path): |
891 | 898 | result["readers"] = access.get("readersnames", []) |
892 | 899 | return result |
893 | 900 |
|
894 | | - |
895 | | - |
896 | | - |
897 | | - |
898 | | - |
899 | 901 | def push_project(self, directory): |
900 | 902 | """ |
901 | 903 | Upload local changes to the repository. |
@@ -923,23 +925,56 @@ def pull_project(self, directory): |
923 | 925 | pull_project_wait(job) |
924 | 926 | return pull_project_finalize(job) |
925 | 927 |
|
| 928 | + def sync_project(self, project_dir): |
| 929 | + """ |
| 930 | + Syncs project by loop with these steps: |
| 931 | + 1. Pull server version |
| 932 | + 2. Get local changes |
| 933 | + 3. Push first change batch |
| 934 | + Repeat if there are more changes pending. |
| 935 | + """ |
| 936 | + has_more_changes = True |
| 937 | + while has_more_changes: |
| 938 | + self.pull_job = pull_project_async(self, project_dir) |
| 939 | + pull_project_wait(self.pull_job) |
| 940 | + pull_project_finalize(self.pull_job) |
| 941 | + |
| 942 | + changes_handler = ChangesHandler(self, project_dir) |
| 943 | + changes_batch, has_more_changes = changes_handler.get_change_batch() |
| 944 | + |
| 945 | + self.push_job = push_project_async(project_dir, changes_batch) |
| 946 | + push_project_wait(self.push_job) |
| 947 | + push_project_finalize(self.push_job) |
| 948 | + |
| 949 | + def sync_project_with_callback(self, project_dir, progress_callback=None, sleep_time=100): |
| 950 | + """ |
| 951 | + Syncs project while sending push progress info as callback. |
| 952 | + Sync is done in this loop: |
| 953 | + Pending changes? -> Pull -> Push change batch -> repeat |
| 954 | + """ |
| 955 | + has_more_changes = True |
| 956 | + while has_more_changes: |
| 957 | + changes_handler = ChangesHandler(self, project_dir) |
| 958 | + |
| 959 | + self.pull_job = pull_project_async(self, project_dir) |
| 960 | + if self.pull_job is None: |
| 961 | + return |
| 962 | + pull_project_wait(self.pull_job) |
| 963 | + pull_project_finalize(self.pull_job) |
926 | 964 |
|
927 | | - def sync_project(self, directory): |
| 965 | + changes_batch, has_more_changes = changes_handler.get_change_batch() |
928 | 966 |
|
929 | | - syncer = Syncer(self, directory) |
930 | | - syncer.sync_loop() |
| 967 | + self.push_job = push_project_async(self, project_dir, changes_batch) |
| 968 | + if not self.push_job: |
| 969 | + return |
931 | 970 |
|
932 | | - # self.pull_project(directory) |
933 | | - # |
934 | | - # mp = MerginProject(directory) |
935 | | - # changes = mp.get_push_changes() |
936 | | - # |
937 | | - # if not changes: |
938 | | - # return |
939 | | - # |
940 | | - # push_changes(self, mp, changes) |
941 | | - # |
942 | | - # self.sync_project(directory) |
| 971 | + last = 0 |
| 972 | + while push_project_is_running(self.push_job): |
| 973 | + sleep(sleep_time) |
| 974 | + now = self.push_job.transferred_size |
| 975 | + progress_callback(last, now) |
| 976 | + last = now |
| 977 | + push_project_finalize(self.push_job) |
943 | 978 |
|
944 | 979 |
|
945 | 980 | def clone_project(self, source_project_path, cloned_project_name, cloned_project_namespace=None): |
|
0 commit comments