From 4d1e3774706f336e87ebe70e1b373ddb37f34b45 Mon Sep 17 00:00:00 2001 From: Sebastian Kratzert Date: Wed, 4 Sep 2019 13:07:35 +0200 Subject: [PATCH 1/3] feat(project): implement update_submodule --- gitlab/tests/test_gitlab.py | 50 +++++++++++++++++++++++++++++++++++++ gitlab/v4/objects.py | 23 +++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/gitlab/tests/test_gitlab.py b/gitlab/tests/test_gitlab.py index ed5556d10..b938cefee 100644 --- a/gitlab/tests/test_gitlab.py +++ b/gitlab/tests/test_gitlab.py @@ -717,6 +717,56 @@ def resp_mark_all_as_done(url, request): with HTTMock(resp_mark_all_as_done): self.gl.todos.mark_all_as_done() + def test_update_submodule(self): + @urlmatch( + scheme="http", netloc="localhost", path="/api/v4/projects/1$", method="get" + ) + def resp_get_project(url, request): + headers = {"content-type": "application/json"} + content = '{"name": "name", "id": 1}'.encode("utf-8") + return response(200, content, headers, None, 5, request) + + @urlmatch( + scheme="http", + netloc="localhost", + path="/api/v4/projects/$1/repository/submodules/foo%2Fbar", + method="post", + ) + def resp_update_submodule(url, request): + headers = {"content-type": "application/json"} + content = """{ + "id": "ed899a2f4b50b4370feeea94676502b42383c746", + "short_id": "ed899a2f4b5", + "title": "Message", + "author_name": "Author", + "author_email": "author@example.com", + "committer_name": "Author", + "committer_email": "author@example.com", + "created_at": "2018-09-20T09:26:24.000-07:00", + "message": "Message", + "parent_ids": [ "ae1d9fb46aa2b07ee9836d49862ec4e2c46fbbba" ], + "committed_date": "2018-09-20T09:26:24.000-07:00", + "authored_date": "2018-09-20T09:26:24.000-07:00", + "status": null}""" + content = content.encode("utf-8") + return response(200, content, headers, None, 5, request) + + with HTTMock(resp_update_submodule): + project = self.gl.projects.get(1) + self.assertIsInstance(project, Project) + self.assertEqual(project.name, "name") + self.assertEqual(project.id, 1) + + ret = project.update_submodule( + submodule="foo/bar", + branch="master", + commit_sha="4c3674f66071e30b3311dac9b9ccc90502a72664", + commit_message="Message", + ) + self.assertIsInstance(ret, dict) + self.assertEqual(ret["message"], "Message") + self.assertEqual(ret["id"], "ed899a2f4b50b4370feeea94676502b42383c746") + def _default_config(self): fd, temp_path = tempfile.mkstemp() os.write(fd, valid_config) diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py index 15aecf540..cdd847fb7 100644 --- a/gitlab/v4/objects.py +++ b/gitlab/v4/objects.py @@ -3885,6 +3885,29 @@ class Project(SaveMixin, ObjectDeleteMixin, RESTObject): ("wikis", "ProjectWikiManager"), ) + @cli.register_custom_action("Project", ("submodule", "branch", "commit_sha")) + @exc.on_http_error(exc.GitlabUpdateError) + def update_submodule(self, submodule, branch, commit_sha, **kwargs): + """Transfer a project to the given namespace ID + + Args: + submodule (str): Full path to the submodule + branch (str): Name of the branch to commit into + commit_sha (str): Full commit SHA to update the submodule to + commit_message (str): Commit message. If no message is provided, a default one will be set (optional) + + Raises: + GitlabAuthenticationError: If authentication is not correct + GitlabPutError: If the submodule could not be updated + """ + + submodule = submodule.replace("/", "%2F") # .replace('.', '%2E') + path = "/projects/%s/repository/submodules/%s" % (self.get_id(), submodule) + data = {"branch": branch, "commit_sha": commit_sha} + if "commit_message" in kwargs: + data["commit_message"] = kwargs["commit_message"] + return self.manager.gitlab.http_put(path, post_data=data) + @cli.register_custom_action("Project", tuple(), ("path", "ref", "recursive")) @exc.on_http_error(exc.GitlabGetError) def repository_tree(self, path="", ref="", recursive=False, **kwargs): From b5969a2dcea77fa608cc29be7a5f39062edd3846 Mon Sep 17 00:00:00 2001 From: Max Wittig Date: Sun, 6 Oct 2019 18:06:11 +0200 Subject: [PATCH 2/3] docs(project): add submodule docs --- docs/gl_objects/projects.rst | 9 +++++++++ gitlab/v4/objects.py | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/gl_objects/projects.rst b/docs/gl_objects/projects.rst index 85e5cb92d..c0f92ae88 100644 --- a/docs/gl_objects/projects.rst +++ b/docs/gl_objects/projects.rst @@ -151,6 +151,15 @@ Get the content and metadata of a file for a commit, using a blob sha:: content = base64.b64decode(file_info['content']) size = file_info['size'] +Update a project submodule:: + + items = project.update_submodule( + submodule="foo/bar", + branch="master", + commit_sha="4c3674f66071e30b3311dac9b9ccc90502a72664", + commit_message="Message", # optional + ) + Get the repository archive:: tgz = project.repository_archive() diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py index cdd847fb7..44188c7c3 100644 --- a/gitlab/v4/objects.py +++ b/gitlab/v4/objects.py @@ -3888,7 +3888,7 @@ class Project(SaveMixin, ObjectDeleteMixin, RESTObject): @cli.register_custom_action("Project", ("submodule", "branch", "commit_sha")) @exc.on_http_error(exc.GitlabUpdateError) def update_submodule(self, submodule, branch, commit_sha, **kwargs): - """Transfer a project to the given namespace ID + """Update a project submodule Args: submodule (str): Full path to the submodule From e59356f6f90d5b01abbe54153441b6093834aa11 Mon Sep 17 00:00:00 2001 From: Max Wittig Date: Sun, 6 Oct 2019 18:47:20 +0200 Subject: [PATCH 3/3] test(submodules): correct test method --- gitlab/tests/test_gitlab.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gitlab/tests/test_gitlab.py b/gitlab/tests/test_gitlab.py index b938cefee..bd968b186 100644 --- a/gitlab/tests/test_gitlab.py +++ b/gitlab/tests/test_gitlab.py @@ -729,8 +729,8 @@ def resp_get_project(url, request): @urlmatch( scheme="http", netloc="localhost", - path="/api/v4/projects/$1/repository/submodules/foo%2Fbar", - method="post", + path="/api/v4/projects/1/repository/submodules/foo%2Fbar", + method="put", ) def resp_update_submodule(url, request): headers = {"content-type": "application/json"} @@ -751,12 +751,12 @@ def resp_update_submodule(url, request): content = content.encode("utf-8") return response(200, content, headers, None, 5, request) - with HTTMock(resp_update_submodule): + with HTTMock(resp_get_project): project = self.gl.projects.get(1) self.assertIsInstance(project, Project) self.assertEqual(project.name, "name") self.assertEqual(project.id, 1) - + with HTTMock(resp_update_submodule): ret = project.update_submodule( submodule="foo/bar", branch="master",