Skip to content

Commit 6542334

Browse files
vsklencarwonder-sk
authored andcommitted
Added project cloning
1 parent dcc795a commit 6542334

File tree

3 files changed

+59
-1
lines changed

3 files changed

+59
-1
lines changed

mergin/cli.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,22 @@ def modtime(directory):
371371
click.echo()
372372

373373

374+
@cli.command()
375+
@click.argument('project_fullname', required=True)
376+
@click.argument('project_namespace', required=True)
377+
@click.argument('project_name', required=True)
378+
def clone(project_fullname, project_namespace, project_name):
379+
"""Clone project from server."""
380+
c = _init_client()
381+
if c is None:
382+
return
383+
try:
384+
c.clone_project(project_fullname, project_namespace, project_name)
385+
click.echo('Done')
386+
except Exception as e:
387+
_print_unhandled_exception()
388+
389+
374390
@cli.command()
375391
@click.argument('project', required=False)
376392
def remove(project):

mergin/client.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def user_agent_info(self):
103103
system_version = "Linux"
104104
elif platform.system() == "Windows":
105105
system_version = platform.win32_ver()[0]
106-
elif platform.system() == "Mac":
106+
elif platform.system() in ["Mac", "Darwin"]:
107107
system_version = platform.mac_ver()[0]
108108
return f"{self.client_version} ({platform.system()}/{system_version})"
109109

@@ -399,6 +399,28 @@ def pull_project(self, directory):
399399
pull_project_wait(job)
400400
return pull_project_finalize(job)
401401

402+
def clone_project(self, full_project_name, namespace, name):
403+
"""
404+
Clone project on server.
405+
406+
:param project_path: Project's full name (<namespace>/<name>)
407+
:type project_path: String
408+
:param namespace: Cloned project's namespace
409+
:type namespace: String
410+
:param name: Cloned project's name
411+
:type name: String
412+
"""
413+
path = "/v1/project/clone/%s" % full_project_name
414+
url = urllib.parse.urljoin(self.url, urllib.parse.quote(path))
415+
json_headers = {'Content-Type': 'application/json', 'Accept': 'application/json'}
416+
data = {
417+
'namespace': namespace,
418+
'project': name
419+
}
420+
421+
request = urllib.request.Request(url, data=json.dumps(data).encode(), headers=json_headers, method="POST")
422+
self._do_request(request)
423+
402424
def delete_project(self, project_path):
403425
"""
404426
Delete project repository on server.

mergin/test/test_client.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,3 +460,23 @@ def test_empty_file_in_subdir(mc):
460460
# check that pull works fine
461461
mc.pull_project(project_dir_2)
462462
assert os.path.exists(os.path.join(project_dir_2, 'subdir2', 'empty2.txt'))
463+
464+
def test_clone_delete_project(mc):
465+
# create new (empty) project on server
466+
test_project = 'test_clone_delete'
467+
mc.create_project(test_project)
468+
projects = mc.projects_list(flag='created')
469+
assert any(p for p in projects if p['name'] == test_project and p['namespace'] == API_USER)
470+
471+
# clone project
472+
cloned_project_name = test_project + "_cloned"
473+
test_project_fullname = API_USER + '/' + test_project
474+
mc.clone_project(test_project_fullname, API_USER, cloned_project_name)
475+
projects = mc.projects_list(flag='created')
476+
assert any(p for p in projects if p['name'] == cloned_project_name and p['namespace'] == API_USER)
477+
478+
project_dir = os.path.join(TMP_DIR, test_project)
479+
cleanup(mc, test_project_fullname, [project_dir])
480+
481+
cloned_project_dir = os.path.join(TMP_DIR, cloned_project_name)
482+
cleanup(mc, API_USER + '/' + cloned_project_name, [cloned_project_dir])

0 commit comments

Comments
 (0)