Skip to content

Commit 4c40878

Browse files
authored
Merge pull request #44 from lutraconsulting/async_rebased
Asynchronous download/push/pull
2 parents a989bc5 + a225526 commit 4c40878

File tree

8 files changed

+1396
-884
lines changed

8 files changed

+1396
-884
lines changed

cli.py

Lines changed: 82 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
MerginProject,
1717
InvalidProject
1818
)
19+
from mergin.client_pull import download_project_async, download_project_is_running, download_project_finalize, download_project_cancel
20+
from mergin.client_pull import pull_project_async, pull_project_is_running, pull_project_finalize, pull_project_cancel
21+
from mergin.client_push import push_project_async, push_project_is_running, push_project_finalize, push_project_cancel
1922

2023

2124
def get_changes_count(diff):
@@ -99,18 +102,48 @@ def init(project, directory, public):
99102
click.secho(str(e), fg='red')
100103

101104

105+
@cli.command()
106+
@click.option('--flag', help="What kind of projects (e.g. 'created' for just my projects,"
107+
"'shared' for projects shared with me. No flag means returns all public projects.")
108+
def list_projects(flag):
109+
"""List projects on the server"""
110+
filter_str = "(filter flag={})".format(flag) if flag is not None else "(all public)"
111+
click.echo('List of projects {}:'.format(filter_str))
112+
c = _init_client()
113+
projects_list = c.projects_list(flag=flag)
114+
for project in projects_list:
115+
full_name = "{} / {}".format(project["namespace"], project["name"])
116+
click.echo(" {:40}\t{:6.1f} MB\t{}".format(full_name, project["disk_usage"]/(1024*1024), project['version']))
117+
118+
102119
@cli.command()
103120
@click.argument('project')
104121
@click.argument('directory', type=click.Path(), required=False)
105-
@click.option('--parallel/--no-parallel', default=True, help='Download by sending parallel requests')
106-
def download(project, directory, parallel):
122+
def download(project, directory):
107123
"""Download last version of mergin project"""
124+
108125
c = _init_client()
109126
directory = directory or os.path.basename(project)
127+
110128
click.echo('Downloading into {}'.format(directory))
111129
try:
112-
c.download_project(project, directory, parallel)
130+
job = download_project_async(c, project, directory)
131+
132+
import time
133+
with click.progressbar(length=job.total_size) as bar:
134+
last_transferred_size = 0
135+
while download_project_is_running(job):
136+
time.sleep(1/10) # 100ms
137+
new_transferred_size = job.transferred_size
138+
bar.update(new_transferred_size - last_transferred_size) # the update() needs increment only
139+
last_transferred_size = new_transferred_size
140+
141+
download_project_finalize(job)
142+
113143
click.echo('Done')
144+
except KeyboardInterrupt:
145+
print("Cancelling...")
146+
download_project_cancel(job)
114147
except Exception as e:
115148
click.secho(str(e), fg='red')
116149

@@ -140,31 +173,70 @@ def status():
140173

141174

142175
@cli.command()
143-
@click.option('--parallel/--no-parallel', default=True, help='Upload by sending parallel requests')
144-
def push(parallel):
176+
def push():
145177
"""Upload local changes into Mergin repository"""
146178

147179
c = _init_client()
180+
directory = os.getcwd()
181+
148182
try:
149-
c.push_project(os.getcwd(), parallel)
183+
job = push_project_async(c, directory)
184+
185+
if job is not None: # if job is none, we don't upload any files, and the transaction is finished already
186+
import time
187+
with click.progressbar(length=job.total_size) as bar:
188+
last_transferred_size = 0
189+
while push_project_is_running(job):
190+
time.sleep(1/10) # 100ms
191+
new_transferred_size = job.transferred_size
192+
bar.update(new_transferred_size - last_transferred_size) # the update() needs increment only
193+
last_transferred_size = new_transferred_size
194+
195+
push_project_finalize(job)
196+
150197
click.echo('Done')
151198
except InvalidProject:
152199
click.echo('Invalid project directory')
200+
except KeyboardInterrupt:
201+
print("Cancelling...")
202+
push_project_cancel(job)
153203
except Exception as e:
154204
click.secho(str(e), fg='red')
155205

156206

157207
@cli.command()
158-
@click.option('--parallel/--no-parallel', default=True, help='Download by sending parallel requests')
159-
def pull(parallel):
208+
def pull():
160209
"""Fetch changes from Mergin repository"""
161210

162211
c = _init_client()
212+
directory = os.getcwd()
213+
163214
try:
164-
c.pull_project(os.getcwd(), parallel)
215+
job = pull_project_async(c, directory)
216+
217+
if job is None:
218+
click.echo('Project is up to date')
219+
return
220+
221+
import time
222+
with click.progressbar(length=job.total_size) as bar:
223+
last_transferred_size = 0
224+
while pull_project_is_running(job):
225+
time.sleep(1/10) # 100ms
226+
new_transferred_size = job.transferred_size
227+
bar.update(new_transferred_size - last_transferred_size) # the update() needs increment only
228+
last_transferred_size = new_transferred_size
229+
230+
pull_project_finalize(job)
231+
165232
click.echo('Done')
166233
except InvalidProject:
167-
click.secho('Invalid project directory', fg='red')
234+
click.echo('Invalid project directory')
235+
except KeyboardInterrupt:
236+
print("Cancelling...")
237+
pull_project_cancel(job)
238+
except Exception as e:
239+
click.secho(str(e), fg='red')
168240

169241

170242
@cli.command()

mergin/__init__.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
from .client import (
2-
MerginClient,
3-
MerginProject,
4-
ClientError,
5-
InvalidProject
6-
)
1+
from . import common
2+
3+
from .client import MerginClient
4+
from .common import ClientError
5+
from .merginproject import MerginProject, InvalidProject

0 commit comments

Comments
 (0)