From c3ae796aebbd830d65b3ca7ecea6746f51f7027b Mon Sep 17 00:00:00 2001 From: "m.gauzins" Date: Thu, 12 Sep 2024 17:43:20 +0200 Subject: [PATCH 1/3] Set Assignees for issue --- .../kotlin/com/dailymotion/kinta/GitTool.kt | 10 +++- .../integration/github/GithubIntegration.kt | 53 +++++++++++++++++-- .../integration/gitlab/GitlabIntegration.kt | 17 +++++- 3 files changed, 72 insertions(+), 8 deletions(-) diff --git a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/GitTool.kt b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/GitTool.kt index 2e6ea75206..422e15c845 100644 --- a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/GitTool.kt +++ b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/GitTool.kt @@ -25,7 +25,7 @@ interface GitTool { base: String? = null, title: String? = null, body: String? = null, - ) + ): String? fun deleteRef( token: String? = null, @@ -33,4 +33,12 @@ interface GitTool { repo: String? = null, ref: String ) + + fun setAssignee( + token: String? = null, + owner: String? = null, + repo: String? = null, + issue: String, + assignees: List + ) } \ No newline at end of file diff --git a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/github/GithubIntegration.kt b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/github/GithubIntegration.kt index 45762646a1..7f95ecd41d 100644 --- a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/github/GithubIntegration.kt +++ b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/github/GithubIntegration.kt @@ -2,7 +2,13 @@ package com.dailymotion.kinta.integration.github import com.apollographql.apollo.ApolloClient import com.apollographql.apollo.coroutines.await -import com.dailymotion.kinta.* +import com.dailymotion.kinta.GetPullRequestWithBase +import com.dailymotion.kinta.GetPullRequestWithHead +import com.dailymotion.kinta.GetRefs +import com.dailymotion.kinta.GitTool +import com.dailymotion.kinta.KintaEnv +import com.dailymotion.kinta.Logger +import com.dailymotion.kinta.Project import com.dailymotion.kinta.integration.git.model.BranchInfo import com.dailymotion.kinta.integration.git.model.PullRequestInfo import com.dailymotion.kinta.integration.github.internal.GithubOauthClient @@ -14,7 +20,12 @@ import kotlinx.coroutines.runBlocking import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString -import kotlinx.serialization.json.* +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive import okhttp3.MediaType import okhttp3.OkHttpClient import okhttp3.Request @@ -23,7 +34,7 @@ import okio.ByteString.Companion.encodeUtf8 import org.eclipse.jgit.api.Git import org.eclipse.jgit.transport.URIish import java.io.File -import java.util.* +import java.util.Base64 @Suppress("NAME_SHADOWING") @@ -38,7 +49,7 @@ object GithubIntegration : GitTool { base: String?, title: String?, body: String?, - ) { + ): String? { val token = token ?: retrieveToken() val owner = owner ?: repository().owner val repo = repo ?: repository().name @@ -73,12 +84,14 @@ object GithubIntegration : GitTool { throw Exception(response.body()?.string() ?: "") } - response.body()?.charStream()?.let { + return response.body()?.charStream()?.let { try { val htmlUrl = json.parseToJsonElement(it.readText()).jsonObject["html_url"]?.jsonPrimitive?.content Logger.i("-> $htmlUrl") + htmlUrl } catch (e: Exception) { e.printStackTrace() + null } } } @@ -370,4 +383,34 @@ object GithubIntegration : GitTool { "cannot delete secret $name: ${response.body()?.byteStream()?.reader()?.readText()}" } } + + override fun setAssignee( + token: String?, + owner: String?, + repo: String?, + issue: String, + assignees: List + ) { + val token = token ?: retrieveToken() + val owner = owner ?: repository().owner + val repo = repo ?: repository().name + + val jsonObject = JsonObject( + mapOf("assignees" to JsonArray(assignees.map { JsonPrimitive(it) })) + ) + + val body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString()) + + val request = Request.Builder() + .url("https://api.github.com/repos/$owner/$repo/issues/$issue/assignees") + .post(body) + .build() + + Logger.i("Assigning...") + val response = httpClient(token).newCall(request).execute() + if (!response.isSuccessful) { + val coucou = response.body()?.string() + throw Exception(coucou ?: "") + } + } } \ No newline at end of file diff --git a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/GitlabIntegration.kt b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/GitlabIntegration.kt index b72ed860e0..3b6059967c 100644 --- a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/GitlabIntegration.kt +++ b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/GitlabIntegration.kt @@ -61,7 +61,7 @@ object GitlabIntegration : GitTool { base: String?, title: String?, body: String?, - ) { + ): String? { val token_ = token ?: retrieveToken() val owner_ = owner ?: repository().owner val repo_ = repo ?: repository().name @@ -88,13 +88,16 @@ object GitlabIntegration : GitTool { } response.body()?.charStream()?.let { - try { + return try { val htmlUrl = json.parseToJsonElement(it.readText()).jsonObject["web_url"]?.jsonPrimitive?.content Logger.i("-> $htmlUrl") + htmlUrl } catch (e: Exception) { e.printStackTrace() + null } } + return null } /** @@ -197,4 +200,14 @@ object GitlabIntegration : GitTool { val repoName = s[1].removeSuffix(".git") return Repository(s[0], repoName) } + + override fun setAssignee( + token: String?, + owner: String?, + repo: String?, + issue: String, + assignees: List + ) { + TODO("Not yet implemented") + } } \ No newline at end of file From f6b9472da8f9dceda25fb9ef64593faf220efca2 Mon Sep 17 00:00:00 2001 From: "m.gauzins" Date: Fri, 13 Sep 2024 12:31:14 +0200 Subject: [PATCH 2/3] Cleanup --- .../dailymotion/kinta/integration/github/GithubIntegration.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/github/GithubIntegration.kt b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/github/GithubIntegration.kt index 7f95ecd41d..a2f3917c1f 100644 --- a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/github/GithubIntegration.kt +++ b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/github/GithubIntegration.kt @@ -409,8 +409,7 @@ object GithubIntegration : GitTool { Logger.i("Assigning...") val response = httpClient(token).newCall(request).execute() if (!response.isSuccessful) { - val coucou = response.body()?.string() - throw Exception(coucou ?: "") + throw Exception(response.body()?.string() ?: "") } } } \ No newline at end of file From d57be62e54086260fbac6d48ce1e752f9444bc54 Mon Sep 17 00:00:00 2001 From: "m.gauzins" Date: Fri, 13 Sep 2024 12:45:09 +0200 Subject: [PATCH 3/3] Cleanup / Gitlab integration --- .../kotlin/com/dailymotion/kinta/GitTool.kt | 2 +- .../integration/github/GithubIntegration.kt | 2 +- .../integration/gitlab/GitlabIntegration.kt | 19 +++++++++++++++++-- .../gitlab/internal/GitlabService.kt | 11 ++++++++++- .../integration/gitlab/internal/Model.kt | 5 +++++ 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/GitTool.kt b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/GitTool.kt index 422e15c845..24812a134f 100644 --- a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/GitTool.kt +++ b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/GitTool.kt @@ -34,7 +34,7 @@ interface GitTool { ref: String ) - fun setAssignee( + fun setAssignees( token: String? = null, owner: String? = null, repo: String? = null, diff --git a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/github/GithubIntegration.kt b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/github/GithubIntegration.kt index a2f3917c1f..65786ea840 100644 --- a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/github/GithubIntegration.kt +++ b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/github/GithubIntegration.kt @@ -384,7 +384,7 @@ object GithubIntegration : GitTool { } } - override fun setAssignee( + override fun setAssignees( token: String?, owner: String?, repo: String?, diff --git a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/GitlabIntegration.kt b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/GitlabIntegration.kt index 3b6059967c..87cac2783c 100644 --- a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/GitlabIntegration.kt +++ b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/GitlabIntegration.kt @@ -8,6 +8,7 @@ import com.dailymotion.kinta.integration.git.model.BranchInfo import com.dailymotion.kinta.integration.git.model.PullRequestInfo import com.dailymotion.kinta.integration.gitlab.internal.GitlabService import com.dailymotion.kinta.integration.gitlab.internal.MergeRequestBody +import com.dailymotion.kinta.integration.gitlab.internal.UpdateMergeRequestBody import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json @@ -201,13 +202,27 @@ object GitlabIntegration : GitTool { return Repository(s[0], repoName) } - override fun setAssignee( + override fun setAssignees( token: String?, owner: String?, repo: String?, issue: String, assignees: List ) { - TODO("Not yet implemented") + val token_ = token ?: retrieveToken() + val owner_ = owner ?: repository().owner + val repo_ = repo ?: repository().name + + Logger.i("Updating assignees...") + val response = service(token_).updatePullRequest( + projectId = "$owner_/$repo_", + mergeRequestId = issue, + mergeRequestBody = UpdateMergeRequestBody( + assignee_ids = assignees + ) + ).execute() + if (!response.isSuccessful) { + throw Exception(response.body()?.string() ?: "") + } } } \ No newline at end of file diff --git a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/internal/GitlabService.kt b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/internal/GitlabService.kt index 7a54a4aac6..93dad95f2e 100644 --- a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/internal/GitlabService.kt +++ b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/internal/GitlabService.kt @@ -2,7 +2,13 @@ package com.dailymotion.kinta.integration.gitlab.internal import okhttp3.ResponseBody import retrofit2.Call -import retrofit2.http.* +import retrofit2.http.Body +import retrofit2.http.DELETE +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.PUT +import retrofit2.http.Path +import retrofit2.http.Query interface GitlabService { @POST("projects/{projectId}/merge_requests") @@ -20,4 +26,7 @@ interface GitlabService { @DELETE("projects/{projectId}/repository/branches/{branch}") fun deleteBranch(@Path("projectId") projectId: String, @Path("branch") branch: String): Call + @PUT("projects/{projectId}/merge_requests/{mergeRequestId}") + fun updatePullRequest(@Path("projectId") projectId: String, @Path("mergeRequestId") mergeRequestId: String, @Body mergeRequestBody: UpdateMergeRequestBody): Call + } diff --git a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/internal/Model.kt b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/internal/Model.kt index 44ecea5db3..7eaf3283c2 100644 --- a/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/internal/Model.kt +++ b/kinta-lib/src/main/kotlin/com/dailymotion/kinta/integration/gitlab/internal/Model.kt @@ -20,4 +20,9 @@ data class MergeRequestBody( val target_branch: String, val title: String, val description: String, +) + +@Serializable +data class UpdateMergeRequestBody( + val assignee_ids: List, ) \ No newline at end of file