|
16 | 16 | MerginProject,
|
17 | 17 | InvalidProject
|
18 | 18 | )
|
| 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 |
19 | 22 |
|
20 | 23 |
|
21 | 24 | def get_changes_count(diff):
|
@@ -99,18 +102,48 @@ def init(project, directory, public):
|
99 | 102 | click.secho(str(e), fg='red')
|
100 | 103 |
|
101 | 104 |
|
| 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 | + |
102 | 119 | @cli.command()
|
103 | 120 | @click.argument('project')
|
104 | 121 | @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): |
107 | 123 | """Download last version of mergin project"""
|
| 124 | + |
108 | 125 | c = _init_client()
|
109 | 126 | directory = directory or os.path.basename(project)
|
| 127 | + |
110 | 128 | click.echo('Downloading into {}'.format(directory))
|
111 | 129 | 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 | + |
113 | 143 | click.echo('Done')
|
| 144 | + except KeyboardInterrupt: |
| 145 | + print("Cancelling...") |
| 146 | + download_project_cancel(job) |
114 | 147 | except Exception as e:
|
115 | 148 | click.secho(str(e), fg='red')
|
116 | 149 |
|
@@ -140,31 +173,70 @@ def status():
|
140 | 173 |
|
141 | 174 |
|
142 | 175 | @cli.command()
|
143 |
| -@click.option('--parallel/--no-parallel', default=True, help='Upload by sending parallel requests') |
144 |
| -def push(parallel): |
| 176 | +def push(): |
145 | 177 | """Upload local changes into Mergin repository"""
|
146 | 178 |
|
147 | 179 | c = _init_client()
|
| 180 | + directory = os.getcwd() |
| 181 | + |
148 | 182 | 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 | + |
150 | 197 | click.echo('Done')
|
151 | 198 | except InvalidProject:
|
152 | 199 | click.echo('Invalid project directory')
|
| 200 | + except KeyboardInterrupt: |
| 201 | + print("Cancelling...") |
| 202 | + push_project_cancel(job) |
153 | 203 | except Exception as e:
|
154 | 204 | click.secho(str(e), fg='red')
|
155 | 205 |
|
156 | 206 |
|
157 | 207 | @cli.command()
|
158 |
| -@click.option('--parallel/--no-parallel', default=True, help='Download by sending parallel requests') |
159 |
| -def pull(parallel): |
| 208 | +def pull(): |
160 | 209 | """Fetch changes from Mergin repository"""
|
161 | 210 |
|
162 | 211 | c = _init_client()
|
| 212 | + directory = os.getcwd() |
| 213 | + |
163 | 214 | 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 | + |
165 | 232 | click.echo('Done')
|
166 | 233 | 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') |
168 | 240 |
|
169 | 241 |
|
170 | 242 | @cli.command()
|
|
0 commit comments