[gitlab] Annotate GQL data and queries with @SinceGitLab

This puts a version on GitLab's 'versionless' API.

For this, I pulled ~50 docker images, usually for different
minor versions. Starting at 8.1.2, going through to 12.0.0
only major versions were checked. 12.0 introduces a GraphQL
API that has downloadable metadata. For each version of
GitLab CE, I span up a container and retrieved a GQL schema.

The currently annotations only cover community edition APIs
as EE that's the docker images I got to pull. Currently,
these annotations might seem a bit much, but I believe it's
useful to have a constant reminder of compatibility in the
codebase rather than having a step in-between.

GitOrigin-RevId: 2722680168df507588895df12ea34451136a6941
This commit is contained in:
Chris Lemaire
2023-08-18 17:46:53 +02:00
committed by intellij-monorepo-bot
parent e068068a87
commit d030a52289
18 changed files with 116 additions and 47 deletions

View File

@@ -2,26 +2,45 @@
package org.jetbrains.plugins.gitlab.api
enum class GitLabGQLQuery(val filePath: String) {
@SinceGitLab("12.5", note = "No exact version") GET_CURRENT_USER("graphql/query/getCurrentUser.graphql"),
@SinceGitLab("10.0", note = "No exact version") GET_MERGE_REQUEST("graphql/query/getMergeRequest.graphql"),
@SinceGitLab("12.5")
GET_CURRENT_USER("graphql/query/getCurrentUser.graphql"),
@SinceGitLab("12.0")
GET_MERGE_REQUEST("graphql/query/getMergeRequest.graphql"),
@SinceGitLab("13.1")
FIND_MERGE_REQUESTS("graphql/query/findProjectMergeRequests.graphql"),
@SinceGitLab("12.3")
GET_MERGE_REQUEST_DISCUSSIONS("graphql/query/getMergeRequestDiscussions.graphql"),
@SinceGitLab("13.1", note = "No exact version") GET_PROJECT_LABELS("graphql/query/getProjectLabels.graphql"),
@SinceGitLab("13.1", note = "No exact version")
GET_PROJECT_LABELS("graphql/query/getProjectLabels.graphql"),
@SinceGitLab("13.0")
GET_MEMBER_PROJECTS("graphql/query/getMemberProjects.graphql"),
@SinceGitLab("13.1", note = "Different ID type until 13.6, should work")
TOGGLE_MERGE_REQUEST_DISCUSSION_RESOLVE("graphql/query/toggleMergeRequestDiscussionResolve.graphql"),
@SinceGitLab("12.1", note = "Different ID type until 13.6, should work")
CREATE_NOTE("graphql/query/createNote.graphql"),
@SinceGitLab("12.1", note = "Different ID type until 13.6, should work")
CREATE_DIFF_NOTE("graphql/query/createDiffNote.graphql"),
@SinceGitLab("12.1", note = "Different ID type until 13.6, should work")
CREATE_REPLY_NOTE("graphql/query/createReplyNote.graphql"),
@SinceGitLab("13.3.1")
CREATE_SNIPPET("graphql/query/createSnippet.graphql"),
@SinceGitLab("12.1", note = "Different ID type until 13.6, should work")
UPDATE_NOTE("graphql/query/updateNote.graphql"),
@SinceGitLab("13.3.1", note = "Different ID type until 13.6, should work")
UPDATE_SNIPPET_BLOB("graphql/query/updateSnippetBlob.graphql"),
@SinceGitLab("12.1", note = "Different ID type until 13.6, should work")
DESTROY_NOTE("graphql/query/destroyNote.graphql"),
@SinceGitLab("13.10")
MERGE_REQUEST_ACCEPT("graphql/query/mergeRequestAccept.graphql"),
@SinceGitLab("13.12")
MERGE_REQUEST_SET_DRAFT("graphql/query/mergeRequestSetDraft.graphql"),
@SinceGitLab("15.3")
MERGE_REQUEST_SET_REVIEWERS("graphql/query/mergeRequestSetReviewers.graphql"),
@SinceGitLab("13.9")
MERGE_REQUEST_UPDATE("graphql/query/mergeRequestUpdate.graphql"),
@SinceGitLab("13.9")
MERGE_REQUEST_REVIEWER_REREVIEW("graphql/query/mergeRequestReviewerRereview.graphql")
}

View File

@@ -2,11 +2,13 @@
package org.jetbrains.plugins.gitlab.api.dto
import com.intellij.collaboration.api.dto.GraphQLFragment
import org.jetbrains.plugins.gitlab.api.SinceGitLab
import org.jetbrains.plugins.gitlab.mergerequest.data.GitLabCiJobStatus
@SinceGitLab("13.3.1")
@GraphQLFragment("/graphql/fragment/ciJob.graphql")
data class GitLabCiJobDTO(
val name: String,
val status: GitLabCiJobStatus,
val webPath: String
@SinceGitLab("13.11") val status: GitLabCiJobStatus,
@SinceGitLab("15.4") val webPath: String
)

View File

@@ -3,15 +3,17 @@ package org.jetbrains.plugins.gitlab.api.dto
import com.intellij.collaboration.api.dto.GraphQLFragment
import com.intellij.openapi.util.NlsSafe
import org.jetbrains.plugins.gitlab.api.SinceGitLab
import java.util.*
@SinceGitLab("12.1")
@GraphQLFragment("/graphql/fragment/glCommit.graphql")
data class GitLabCommitDTO(
val sha: String,
val shortId: String,
val fullTitle: @NlsSafe String?,
@SinceGitLab("13.7") val shortId: String,
@SinceGitLab("14.5") val fullTitle: @NlsSafe String?,
val description: @NlsSafe String?,
val author: GitLabUserDTO?,
val authorName: String,
@SinceGitLab("12.5") val authorName: String,
val authoredDate: Date
)

View File

@@ -1,6 +1,9 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gitlab.api.dto
import org.jetbrains.plugins.gitlab.api.SinceGitLab
@SinceGitLab("12.1")
data class GitLabDiffRefs(
val baseSha: String?,
val headSha: String,

View File

@@ -4,18 +4,23 @@ package org.jetbrains.plugins.gitlab.api.dto
import com.intellij.collaboration.api.dto.GraphQLConnectionDTO
import com.intellij.collaboration.api.dto.GraphQLCursorPageInfoDTO
import com.intellij.collaboration.api.dto.GraphQLFragment
import org.jetbrains.plugins.gitlab.api.SinceGitLab
import java.util.*
@SinceGitLab("12.0")
@GraphQLFragment("/graphql/fragment/discussion.graphql")
class GitLabDiscussionDTO(
val id: String,
val replyId: String,
@SinceGitLab("12.1") val replyId: String,
val createdAt: Date,
notes: NotesConnection
) {
val notes: List<GitLabNoteDTO> = notes.nodes
class NotesConnection(pageInfo: GraphQLCursorPageInfoDTO, nodes: List<GitLabNoteDTO>) :
class NotesConnection(
pageInfo: GraphQLCursorPageInfoDTO,
@SinceGitLab("12.3") nodes: List<GitLabNoteDTO>
) :
GraphQLConnectionDTO<GitLabNoteDTO>(pageInfo, nodes)
override fun equals(other: Any?): Boolean {

View File

@@ -2,7 +2,9 @@
package org.jetbrains.plugins.gitlab.api.dto
import com.intellij.collaboration.api.dto.GraphQLFragment
import org.jetbrains.plugins.gitlab.api.SinceGitLab
@SinceGitLab("12.0")
@GraphQLFragment("/graphql/fragment/label.graphql")
data class GitLabLabelDTO(
val title: String

View File

@@ -9,11 +9,12 @@ import com.fasterxml.jackson.databind.deser.std.StdDeserializer
import com.intellij.collaboration.api.dto.GraphQLFragment
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.diagnostic.logger
import org.jetbrains.plugins.gitlab.api.SinceGitLab
import org.jetbrains.plugins.gitlab.api.data.GitLabAccessLevel
@JsonDeserialize(using = GitLabMemberDTODeserializer::class)
@SinceGitLab("13.1")
@GraphQLFragment("graphql/fragment/member.graphql")
@JsonDeserialize(using = GitLabMemberDTODeserializer::class)
class GitLabMemberDTO(
val id: String,
val user: GitLabUserDTO,

View File

@@ -2,11 +2,13 @@
package org.jetbrains.plugins.gitlab.api.dto
import com.intellij.collaboration.api.dto.GraphQLFragment
import org.jetbrains.plugins.gitlab.api.SinceGitLab
@SinceGitLab("12.0")
@GraphQLFragment("/graphql/fragment/mergeRequestPermissions.graphql")
data class GitLabMergeRequestPermissionsDTO(
val canApprove: Boolean,
val canMerge: Boolean,
@SinceGitLab("15.9") val canApprove: Boolean,
@SinceGitLab("13.4") val canMerge: Boolean,
val createNote: Boolean,
val updateMergeRequest: Boolean
)

View File

@@ -2,8 +2,10 @@
package org.jetbrains.plugins.gitlab.api.dto
import com.intellij.collaboration.api.dto.GraphQLFragment
import org.jetbrains.plugins.gitlab.api.SinceGitLab
import java.util.*
@SinceGitLab("12.0")
@GraphQLFragment("/graphql/fragment/note.graphql")
data class GitLabNoteDTO(
val author: GitLabUserDTO,
@@ -12,13 +14,13 @@ data class GitLabNoteDTO(
val id: String,
val position: Position?,
val resolvable: Boolean,
val resolved: Boolean,
@SinceGitLab("13.1") val resolved: Boolean,
val system: Boolean,
val url: String,
@SinceGitLab("13.8") val url: String,
val userPermissions: UserPermissions
) {
data class Position(
val diffRefs: GitLabDiffRefs,
@SinceGitLab("12.4") val diffRefs: GitLabDiffRefs,
val filePath: String,
val positionType: String,
val newPath: String?,

View File

@@ -4,11 +4,13 @@ package org.jetbrains.plugins.gitlab.api.dto
import com.intellij.collaboration.api.dto.GraphQLConnectionDTO
import com.intellij.collaboration.api.dto.GraphQLCursorPageInfoDTO
import com.intellij.collaboration.api.dto.GraphQLFragment
import org.jetbrains.plugins.gitlab.api.SinceGitLab
// not a data class bc change in cursor does not constitute a change in data
@SinceGitLab("12.0")
@GraphQLFragment("/graphql/fragment/pipeline.graphql")
class GitLabPipelineDTO(
jobs: CiJobConnection?
@SinceGitLab("13.6") jobs: CiJobConnection?
) {
val jobs: List<GitLabCiJobDTO>? = jobs?.nodes

View File

@@ -4,8 +4,10 @@ package org.jetbrains.plugins.gitlab.api.dto
import com.intellij.collaboration.api.dto.GraphQLFragment
import com.intellij.openapi.util.NlsSafe
import org.jetbrains.annotations.Nls
import org.jetbrains.plugins.gitlab.api.SinceGitLab
// namespace can be null for some reason, so we need to parse paths manually
@SinceGitLab("12.0")
@GraphQLFragment("/graphql/fragment/project.graphql")
data class GitLabProjectDTO(
val name: @Nls String,
@@ -22,6 +24,6 @@ data class GitLabProjectDTO(
* Corresponds to what GL calls ProjectPermissions. These are the permissions a *user* has while accessing a GL *project*.
*/
data class ProjectUserPermissions(
val createSnippet: Boolean
@SinceGitLab("12.6") val createSnippet: Boolean
)
}

View File

@@ -3,7 +3,9 @@ package org.jetbrains.plugins.gitlab.api.dto
import com.intellij.collaboration.api.dto.GraphQLFragment
import com.intellij.openapi.util.NlsSafe
import org.jetbrains.plugins.gitlab.api.SinceGitLab
@SinceGitLab("13.11")
@GraphQLFragment("graphql/fragment/userReviewer.graphql")
class GitLabReviewerDTO(
id: String,

View File

@@ -2,8 +2,10 @@
package org.jetbrains.plugins.gitlab.api.dto
import com.intellij.collaboration.api.dto.GraphQLFragment
import org.jetbrains.plugins.gitlab.api.SinceGitLab
import java.util.*
@SinceGitLab("12.6")
@GraphQLFragment("graphql/fragment/snippet.graphql")
class GitLabSnippetDTO(
val id: String,

View File

@@ -4,11 +4,13 @@ package org.jetbrains.plugins.gitlab.api.dto
import com.intellij.collaboration.api.dto.GraphQLFragment
import com.intellij.collaboration.auth.AccountDetails
import com.intellij.openapi.util.NlsSafe
import org.jetbrains.plugins.gitlab.api.SinceGitLab
import java.net.URL
@SinceGitLab("12.0")
@GraphQLFragment("graphql/fragment/user.graphql")
open class GitLabUserDTO(
val id: String,
@SinceGitLab("13.0") val id: String,
val username: @NlsSafe String,
override val name: @NlsSafe String,
override val avatarUrl: String?,

View File

@@ -5,7 +5,9 @@ import com.intellij.collaboration.api.dto.GraphQLConnectionDTO
import com.intellij.collaboration.api.dto.GraphQLCursorPageInfoDTO
import com.intellij.collaboration.api.dto.GraphQLFragment
import com.intellij.openapi.util.NlsSafe
import org.jetbrains.plugins.gitlab.api.SinceGitLab
@SinceGitLab("12.0")
@GraphQLFragment("graphql/fragment/userDetailed.graphql")
class GitLabUserDetailedDTO(
id: String,
@@ -13,7 +15,7 @@ class GitLabUserDetailedDTO(
name: @NlsSafe String,
avatarUrl: String?,
webUrl: String,
projectMemberships: ProjectMemberConnection
@SinceGitLab("13.1") projectMemberships: ProjectMemberConnection
) : GitLabUserDTO(id, username, name, avatarUrl, webUrl) {
val projectMemberships: List<ProjectMemberDTO> = projectMemberships.nodes

View File

@@ -2,7 +2,9 @@
package org.jetbrains.plugins.gitlab.api.dto
import com.intellij.collaboration.api.dto.GraphQLFragment
import org.jetbrains.plugins.gitlab.api.SinceGitLab
@SinceGitLab("13.1")
@GraphQLFragment("/graphql/fragment/projectMember.graphql")
data class ProjectMemberDTO(
val project: GitLabProjectDTO

View File

@@ -4,11 +4,14 @@ package org.jetbrains.plugins.gitlab.mergerequest.api.dto
import com.intellij.collaboration.api.dto.GraphQLConnectionDTO
import com.intellij.collaboration.api.dto.GraphQLCursorPageInfoDTO
import com.intellij.collaboration.api.dto.GraphQLFragment
import org.jetbrains.plugins.gitlab.api.GitLabEdition.Enterprise
import org.jetbrains.plugins.gitlab.api.SinceGitLab
import org.jetbrains.plugins.gitlab.api.dto.*
import org.jetbrains.plugins.gitlab.mergerequest.data.GitLabMergeRequestState
import org.jetbrains.plugins.gitlab.mergerequest.data.GitLabMergeStatus
import java.util.*
@SinceGitLab("12.0")
@GraphQLFragment("/graphql/fragment/mergeRequest.graphql")
@GraphQLFragment("/graphql/fragment/community/mergeRequest.graphql")
class GitLabMergeRequestDTO(
@@ -20,26 +23,25 @@ class GitLabMergeRequestDTO(
val createdAt: Date,
val targetBranch: String,
val sourceBranch: String,
val diffRefs: GitLabDiffRefs,
// will be missing in community edition
val approved: Boolean?,
val conflicts: Boolean,
@SinceGitLab("12.1") val diffRefs: GitLabDiffRefs,
@SinceGitLab("14.3", editions = [Enterprise]) val approved: Boolean?,
@SinceGitLab("13.4") val conflicts: Boolean,
val headPipeline: GitLabPipelineDTO?,
val mergeStatusEnum: GitLabMergeStatus,
val mergeable: Boolean,
@SinceGitLab("14.0") val mergeStatusEnum: GitLabMergeStatus,
@SinceGitLab("13.7") val mergeable: Boolean,
val state: GitLabMergeRequestState,
val draft: Boolean,
val author: GitLabUserDTO,
@SinceGitLab("13.12") val draft: Boolean,
@SinceGitLab("13.1") val author: GitLabUserDTO,
val targetProject: GitLabProjectDTO,
val sourceProject: GitLabProjectDTO?,
val userPermissions: GitLabMergeRequestPermissionsDTO,
val shouldBeRebased: Boolean,
val rebaseInProgress: Boolean,
approvedBy: UserCoreConnection,
assignees: AssigneeConnection,
reviewers: ReviewerConnection,
commits: CommitConnection,
labels: LabelConnection
@SinceGitLab("13.5") approvedBy: UserCoreConnection,
@SinceGitLab("12.4") assignees: AssigneeConnection,
@SinceGitLab("13.8") reviewers: ReviewerConnection,
@SinceGitLab("14.7") commits: CommitConnection,
@SinceGitLab("12.4") labels: LabelConnection
) {
val approvedBy: List<GitLabUserDTO> = approvedBy.nodes
@@ -51,18 +53,33 @@ class GitLabMergeRequestDTO(
val labels: List<GitLabLabelDTO> = labels.nodes
class UserCoreConnection(pageInfo: GraphQLCursorPageInfoDTO, nodes: List<GitLabUserDTO>)
: GraphQLConnectionDTO<GitLabUserDTO>(pageInfo, nodes)
@SinceGitLab("13.5")
class UserCoreConnection(
pageInfo: GraphQLCursorPageInfoDTO,
nodes: List<GitLabUserDTO>
) : GraphQLConnectionDTO<GitLabUserDTO>(pageInfo, nodes)
class AssigneeConnection(pageInfo: GraphQLCursorPageInfoDTO, nodes: List<GitLabUserDTO>)
: GraphQLConnectionDTO<GitLabUserDTO>(pageInfo, nodes)
@SinceGitLab("12.4")
class AssigneeConnection(
pageInfo: GraphQLCursorPageInfoDTO,
nodes: List<GitLabUserDTO>
) : GraphQLConnectionDTO<GitLabUserDTO>(pageInfo, nodes)
class ReviewerConnection(pageInfo: GraphQLCursorPageInfoDTO, nodes: List<GitLabReviewerDTO>)
: GraphQLConnectionDTO<GitLabReviewerDTO>(pageInfo, nodes)
@SinceGitLab("13.8")
class ReviewerConnection(
pageInfo: GraphQLCursorPageInfoDTO,
nodes: List<GitLabReviewerDTO>
) : GraphQLConnectionDTO<GitLabReviewerDTO>(pageInfo, nodes)
class CommitConnection(pageInfo: GraphQLCursorPageInfoDTO, nodes: List<GitLabCommitDTO>)
: GraphQLConnectionDTO<GitLabCommitDTO>(pageInfo, nodes)
@SinceGitLab("14.7")
class CommitConnection(
pageInfo: GraphQLCursorPageInfoDTO,
nodes: List<GitLabCommitDTO>
) : GraphQLConnectionDTO<GitLabCommitDTO>(pageInfo, nodes)
class LabelConnection(pageInfo: GraphQLCursorPageInfoDTO, nodes: List<GitLabLabelDTO>)
: GraphQLConnectionDTO<GitLabLabelDTO>(pageInfo, nodes)
@SinceGitLab("12.4")
class LabelConnection(
pageInfo: GraphQLCursorPageInfoDTO,
nodes: List<GitLabLabelDTO>
) : GraphQLConnectionDTO<GitLabLabelDTO>(pageInfo, nodes)
}

View File

@@ -57,13 +57,13 @@ suspend fun GitLabApi.GraphQL.findMergeRequestsByBranch(project: GitLabProjectCo
}
}
private class MergeRequestsConnection(pageInfo: GraphQLCursorPageInfoDTO, nodes: List<GitLabMergeRequestIidDTO>)
: GraphQLConnectionDTO<GitLabMergeRequestIidDTO>(pageInfo, nodes)
@SinceGitLab("13.2")
fun getMergeRequestStateEventsUri(project: GitLabProjectCoordinates, mrIid: String): URI =
project.restApiUri.resolveRelative("merge_requests").resolveRelative(mrIid).resolveRelative("resource_state_events")
private class MergeRequestsConnection(pageInfo: GraphQLCursorPageInfoDTO, nodes: List<GitLabMergeRequestIidDTO>)
: GraphQLConnectionDTO<GitLabMergeRequestIidDTO>(pageInfo, nodes)
@SinceGitLab("11.4", note = "Maybe released in 11.3-rc5")
fun getMergeRequestLabelEventsUri(project: GitLabProjectCoordinates, mrIid: String): URI =
project.restApiUri.resolveRelative("merge_requests").resolveRelative(mrIid).resolveRelative("resource_label_events")