dev.knotless.getMergeStatus
Schema Diff
+51 -4
Compatibility Analysis
Breaking Changes Detected
2 breaking changes, 19 non-breaking changes.
Breaking Changes (2)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "dev.knotless.getMergeStatus#note", src: "dev.knotless.getMergeStatus#note", tgt: "dev.knotless.getMergeStatus#note.text", kind: "prop", name: Some("text") }
- ConstraintTightened ConstraintTightened { vertex_id: "dev.knotless.getMergeStatus:output.state", sort: "knownValues", old_value: "[\"clean\",\"conflicting\",\"blocked\"]", new_value: "[\"clean\",\"conflicting\",\"blocked\",\"draft\"]" }
Non-Breaking Changes (19)
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus#note" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus#note.text" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.codeOwnersWarnings" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.codeOwnersWarnings:items" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.reviews" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.reviewsMissing" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.reviewsMissing:items" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.reviewsUncounted" }
- AddedVertex AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.reviewsUncounted:items" }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus:output", tgt: "dev.knotless.getMergeStatus:output.codeOwnersWarnings", kind: "prop", name: Some("codeOwnersWarnings") }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus:output", tgt: "dev.knotless.getMergeStatus:output.reviews", kind: "prop", name: Some("reviews") }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus:output", tgt: "dev.knotless.getMergeStatus:output.reviewsMissing", kind: "prop", name: Some("reviewsMissing") }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus:output", tgt: "dev.knotless.getMergeStatus:output.reviewsUncounted", kind: "prop", name: Some("reviewsUncounted") }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus:output.codeOwnersWarnings", tgt: "dev.knotless.getMergeStatus:output.codeOwnersWarnings:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus:output.codeOwnersWarnings:items", tgt: "dev.knotless.getMergeStatus#note", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus:output.reviewsMissing", tgt: "dev.knotless.getMergeStatus:output.reviewsMissing:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus:output.reviewsMissing:items", tgt: "dev.knotless.getMergeStatus#note", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus:output.reviewsUncounted", tgt: "dev.knotless.getMergeStatus:output.reviewsUncounted:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "dev.knotless.getMergeStatus:output.reviewsUncounted:items", tgt: "dev.knotless.getMergeStatus#note", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "dev.knotless.getMergeStatus#note" }AddedVertex { vertex_id: "dev.knotless.getMergeStatus#note.text" }AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.codeOwnersWarnings" }AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.codeOwnersWarnings:items" }AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.reviews" }AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.reviewsMissing" }AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.reviewsMissing:items" }AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.reviewsUncounted" }AddedVertex { vertex_id: "dev.knotless.getMergeStatus:output.reviewsUncounted:items" }
Constraint Changes
- ConstraintTightened ConstraintTightened { vertex_id: "dev.knotless.getMergeStatus:output.state", sort: "knownValues", old_value: "[\"clean\",\"conflicting\",\"blocked\"]", new_value: "[\"clean\",\"conflicting\",\"blocked\",\"draft\"]" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "dev.knotless.getMergeStatus#note", src: "dev.knotless.getMergeStatus#note", tgt: "dev.knotless.getMergeStatus#note.text", kind: "prop", name: Some("text") }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus:output", tgt: "dev.knotless.getMergeStatus:output.codeOwnersWarnings", kind: "prop", name: Some("codeOwnersWarnings") }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus:output", tgt: "dev.knotless.getMergeStatus:output.reviews", kind: "prop", name: Some("reviews") }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus:output", tgt: "dev.knotless.getMergeStatus:output.reviewsMissing", kind: "prop", name: Some("reviewsMissing") }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus:output", tgt: "dev.knotless.getMergeStatus:output.reviewsUncounted", kind: "prop", name: Some("reviewsUncounted") }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus:output.codeOwnersWarnings", tgt: "dev.knotless.getMergeStatus:output.codeOwnersWarnings:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus:output.codeOwnersWarnings:items", tgt: "dev.knotless.getMergeStatus#note", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus:output.reviewsMissing", tgt: "dev.knotless.getMergeStatus:output.reviewsMissing:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus:output.reviewsMissing:items", tgt: "dev.knotless.getMergeStatus#note", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus:output.reviewsUncounted", tgt: "dev.knotless.getMergeStatus:output.reviewsUncounted:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "dev.knotless.getMergeStatus:output.reviewsUncounted:items", tgt: "dev.knotless.getMergeStatus#note", kind: "ref", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"conflict": {
5
5
"description": "A file that both sides changed so that they do not merge.",
6
6
"properties": {
7
7
"path": {
8
8
"description": "From the repository's root.",
9
9
"type": "string"
10
10
}
11
11
},
12
12
"required": [
13
13
"path"
14
14
],
15
15
"type": "object"
16
16
},
17
17
"main": {
18
18
"description": "Whether an open pull can merge now, decided as `knotless merge` decides it, without merging: whether its head merges with its target branch as it is now, and, in a repository that names runners, whether each workflow that runs on it passed there. And what the account asking may do to it: merge it, queue it, retarget it or run its checks again. Requires the session cookie the pages' login sets, or a service token from the caller's PDS, audience the appview's DID, for this method.",
19
19
"errors": [
20
20
{
21
21
"description": "No such repository.",
22
22
"name": "NotFound"
23
23
},
24
24
{
25
25
"description": "No one asked: log in to the pages first.",
26
26
"name": "AuthenticationRequired"
27
27
}
28
28
],
29
29
"output": {
30
30
"encoding": "application/json",
31
31
"schema": {
32
32
"properties": {
33
33
"base": {
34
34
"description": "The commit its target branch is at, in hex.",
35
35
"type": "string"
36
36
},
37
37
"checks": {
38
38
"description": "Where its checks stand at its head merged with its base: pending for those not run there; none when the repository names no runners, so a merge waits for none, or when it conflicts.",
39
39
"knownValues": [
40
40
"passed",
41
41
"failed",
42
42
"running",
43
43
"pending",
44
44
"none"
45
45
],
46
46
"type": "string"
47
47
},
48
+
"codeOwnersWarnings": {
49
+
"description": "The lines of the target branch's CODEOWNERS file that were skipped, and why: one naming a team, say.",
50
+
"items": {
51
+
"ref": "#note",
52
+
"type": "ref"
53
+
},
54
+
"type": "array"
55
+
},
48
56
"conflicts": {
49
57
"description": "The files that conflict.",
50
58
"items": {
51
59
"ref": "#conflict",
52
60
"type": "ref"
53
61
},
54
62
"type": "array"
55
63
},
56
64
"deletes": {
57
65
"description": "Its head branch, which merging deletes unless asked to keep it.",
58
66
"type": "string"
59
67
},
60
68
"head": {
61
69
"description": "The commit its head branch is at, in hex.",
62
70
"type": "string"
63
71
},
64
72
"may": {
65
73
"ref": "#permissions",
66
74
"type": "ref"
67
75
},
68
76
"method": {
69
77
"description": "How it would merge: a fast-forward when the base has not moved since its head branched off, else a merge commit; into a branch protected as linear, one squashed commit.",
70
78
"knownValues": [
71
79
"fastForward",
72
80
"merge",
73
81
"squash"
74
82
],
75
83
"type": "string"
76
84
},
77
85
"queueBlocked": {
78
86
"description": "Why the merge queue would not land it yet, when this server knows: undelegated when no runner the repository names may push, so its queue lands through this server's gateway, and the owner has not delegated writes to it.",
79
87
"knownValues": [
80
88
"undelegated"
81
89
],
82
90
"type": "string"
83
91
},
84
92
"queueOnly": {
85
93
"description": "Its target branch takes pulls only through the merge queue: queue it with dev.knotless.queuePull, as dev.knotless.mergePull refuses it. Absent is false.",
86
94
"type": "boolean"
87
95
},
88
96
"reason": {
89
-
"description": "Why it cannot merge now, in the words a merge would refuse it with.",
97
+
"description": "Why it cannot merge now, in the words a merge would refuse it with; and when the account asking may not merge it, that too.",
98
+
"type": "string"
99
+
},
100
+
"reviews": {
101
+
"description": "Where its reviews stand against what its target branch's rule asks of them (dev.knotless.repo#reviews): none when the rule asks nothing of them, or when it conflicts.",
102
+
"knownValues": [
103
+
"passed",
104
+
"blocked",
105
+
"none"
106
+
],
90
107
"type": "string"
91
108
},
109
+
"reviewsMissing": {
110
+
"description": "What its reviews lack, each as `knotless merge --check` lists it: `reviews 1 of 2`, `owners of web/: @alice or @bob`, `changes asked by @carol`.",
111
+
"items": {
112
+
"ref": "#note",
113
+
"type": "ref"
114
+
},
115
+
"type": "array"
116
+
},
117
+
"reviewsUncounted": {
118
+
"description": "The approvals that do not count toward its target branch's rule, and why: `@dan's approval does not count: only the owner's and collaborators' approvals count`, or one of an earlier head when only approvals of its head as it is now count.",
119
+
"items": {
120
+
"ref": "#note",
121
+
"type": "ref"
122
+
},
123
+
"type": "array"
124
+
},
92
125
"state": {
93
-
"description": "clean when it can merge now; conflicting when its head does not merge with its base; blocked when its checks have not all passed.",
126
+
"description": "clean when it can merge now; conflicting when its head does not merge with its base; blocked when its checks have not all passed, or it is not reviewed as its target branch's rule asks; draft, whatever else holds, while its author has not marked it ready.",
94
127
"knownValues": [
95
128
"clean",
96
129
"conflicting",
97
-
"blocked"
130
+
"blocked",
131
+
"draft"
98
132
],
99
133
"type": "string"
100
134
}
101
135
},
102
136
"required": [
103
137
"state",
104
138
"checks",
105
139
"method",
106
140
"base",
107
141
"head",
108
142
"may"
109
143
],
110
144
"type": "object"
111
145
}
112
146
},
113
147
"parameters": {
114
148
"properties": {
115
149
"pull": {
116
150
"description": "The dev.knotless.pull record.",
117
151
"format": "at-uri",
118
152
"type": "string"
119
153
},
120
154
"repo": {
121
155
"description": "The repository's dev.knotless.repo record, as dev.knotless.getRepo takes it.",
122
156
"format": "at-uri",
123
157
"type": "string"
124
158
}
125
159
},
126
160
"required": [
127
161
"repo",
128
162
"pull"
129
163
],
130
164
"type": "params"
131
165
},
132
166
"type": "query"
133
167
},
168
+
"note": {
169
+
"description": "A line of text about the pull's reviews.",
170
+
"properties": {
171
+
"text": {
172
+
"description": "In plain words.",
173
+
"type": "string"
174
+
}
175
+
},
176
+
"required": [
177
+
"text"
178
+
],
179
+
"type": "object"
180
+
},
134
181
"permissions": {
135
-
"description": "What the account asking may do to the pull.",
182
+
"description": "What the account asking may do to the pull: what its part in the repository lets it do, not whether that would work now. state and reason say that: a merge refuses a blocked pull, the owner's merge too, unless the owner forces it.",
136
183
"properties": {
137
184
"base": {
138
185
"description": "Change its target branch: those who may close it.",
139
186
"type": "boolean"
140
187
},
141
188
"force": {
142
189
"description": "Merge it past its checks: the owner alone.",
143
190
"type": "boolean"
144
191
},
145
192
"head": {
146
193
"description": "Change its head branch: its author.",
147
194
"type": "boolean"
148
195
},
149
196
"merge": {
150
197
"description": "Merge it: the owner and collaborators.",
151
198
"type": "boolean"
152
199
},
153
200
"queue": {
154
201
"description": "Put it in the merge queue or take it out: those who may merge it, in a repository whose runners land a queue.",
155
202
"type": "boolean"
156
203
},
157
204
"rerun": {
158
205
"description": "Ask the runners to run its checks again: the owner, in a repository that names runners.",
159
206
"type": "boolean"
160
207
}
161
208
},
162
209
"required": [
163
210
"merge",
164
211
"force",
165
212
"queue",
166
213
"base",
167
214
"head",
168
215
"rerun"
169
216
],
170
217
"type": "object"
171
218
}
172
219
},
173
220
"description": "Whether an open pull can merge now, and what the account asking may do to it.",
174
221
"id": "dev.knotless.getMergeStatus",
175
222
"lexicon": 1
176
223
}