Scrutinizer GitHub App not installed

We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.

Install GitHub App

Test Failed
Pull Request — master (#971)
by Ruud
01:35
created
src/Annotation/Mutation.php 1 patch
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -34,7 +34,7 @@
 block discarded – undo
34 34
         ?string $type = null,
35 35
         ?string $resolve = null,
36 36
         ?string $complexity = null,
37
-        array|string|null $targetTypes = null
37
+        array | string | null $targetTypes = null
38 38
     ) {
39 39
         parent::__construct($name, $type, $resolve, $complexity);
40 40
         if ($targetTypes) {
Please login to merge, or discard this patch.
src/Config/Parser/MetadataParser/MetadataParser.php 1 patch
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -346,7 +346,7 @@  discard block
 block discarded – undo
346 346
 
347 347
         $buildersAnnotations = self::getMetadataMatching($metadatas, Metadata\FieldsBuilder::class);
348 348
         if (!empty($buildersAnnotations)) {
349
-            $typeConfiguration['builders'] = array_map(fn ($fieldsBuilderAnnotation) => ['builder' => $fieldsBuilderAnnotation->name, 'builderConfig' => $fieldsBuilderAnnotation->config], $buildersAnnotations);
349
+            $typeConfiguration['builders'] = array_map(fn($fieldsBuilderAnnotation) => ['builder' => $fieldsBuilderAnnotation->name, 'builderConfig' => $fieldsBuilderAnnotation->config], $buildersAnnotations);
350 350
         }
351 351
 
352 352
         if (isset($typeAnnotation->isTypeOf)) {
@@ -440,7 +440,7 @@  discard block
 block discarded – undo
440 440
             $reflectionConstant = new ReflectionClassConstant($reflectionClass->getName(), $name);
441 441
             $valueConfig = self::getDescriptionConfiguration(static::getMetadatas($reflectionConstant), true);
442 442
 
443
-            $enumValueAnnotation = current(array_filter($enumValues, fn ($enumValueAnnotation) => $enumValueAnnotation->name === $name));
443
+            $enumValueAnnotation = current(array_filter($enumValues, fn($enumValueAnnotation) => $enumValueAnnotation->name === $name));
444 444
             $valueConfig['value'] = $value;
445 445
 
446 446
             if (false !== $enumValueAnnotation) {
Please login to merge, or discard this patch.
src/Annotation/Query.php 1 patch
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -34,7 +34,7 @@
 block discarded – undo
34 34
         ?string $type = null,
35 35
         ?string $resolve = null,
36 36
         ?string $complexity = null,
37
-        array|string|null $targetTypes = null
37
+        array | string | null $targetTypes = null
38 38
     ) {
39 39
         parent::__construct($name, $type, $resolve, $complexity);
40 40
         if ($targetTypes) {
Please login to merge, or discard this patch.
tests/Functional/Controller/GraphControllerTest.php 1 patch
Spacing   -318 removed lines patch added patch discarded remove patch
@@ -14,321 +14,3 @@
 block discarded – undo
14 14
 final class GraphControllerTest extends TestCase
15 15
 {
16 16
     private string $friendsQuery = <<<'EOF'
17
-        query FriendsQuery {
18
-          user {
19
-            friends(first: 2) {
20
-              totalCount
21
-              edges {
22
-                friendshipTime
23
-                node {
24
-                  name
25
-                }
26
-              }
27
-            }
28
-          }
29
-        }
30
-        EOF;
31
-
32
-    private string $friendsTotalCountQuery = <<<'EOF'
33
-        query FriendsTotalCountQuery {
34
-          user {
35
-            friends {
36
-              totalCount
37
-            }
38
-          }
39
-        }
40
-        EOF;
41
-
42
-    private array $expectedData = [
43
-        'user' => [
44
-            'friends' => [
45
-                'totalCount' => 4,
46
-                'edges' => [
47
-                    [
48
-                        'friendshipTime' => 'Yesterday',
49
-                        'node' => [
50
-                            'name' => 'Nick',
51
-                        ],
52
-                    ],
53
-                    [
54
-                        'friendshipTime' => 'Yesterday',
55
-                        'node' => [
56
-                            'name' => 'Lee',
57
-                        ],
58
-                    ],
59
-                ],
60
-            ],
61
-        ],
62
-    ];
63
-
64
-    /**
65
-     * @dataProvider graphQLEndpointUriProvider
66
-     */
67
-    public function testEndpointAction(string $uri): void
68
-    {
69
-        $client = static::createClient(['test_case' => 'connectionWithCORS']);
70
-        $this->disableCatchExceptions($client);
71
-
72
-        $client->request('GET', $uri, ['query' => $this->friendsQuery], [], ['CONTENT_TYPE' => 'application/graphql;charset=utf8', 'HTTP_Origin' => 'http://example.com']);
73
-        $result = $client->getResponse()->getContent();
74
-        $this->assertSame(['data' => $this->expectedData], json_decode($result, true), $result);
75
-        $this->assertCORSHeadersExists($client);
76
-    }
77
-
78
-    public function graphQLEndpointUriProvider(): array
79
-    {
80
-        return [
81
-            ['/'],
82
-            ['/graphql/default'],
83
-        ];
84
-    }
85
-
86
-    public function testEndpointWithEmptyQuery(): void
87
-    {
88
-        $this->expectException(BadRequestHttpException::class);
89
-        $this->expectExceptionMessage('Must provide query parameter');
90
-        $client = static::createClient();
91
-        $this->disableCatchExceptions($client);
92
-        $client->request('GET', '/', []);
93
-        $client->getResponse()->getContent();
94
-    }
95
-
96
-    public function testEndpointWithEmptyPostJsonBodyQuery(): void
97
-    {
98
-        $this->expectException(BadRequestHttpException::class);
99
-        $this->expectExceptionMessage('The request content body must not be empty when using json content type request.');
100
-        $client = static::createClient();
101
-        $this->disableCatchExceptions($client);
102
-        $client->request('POST', '/', [], [], ['CONTENT_TYPE' => 'application/json']);
103
-    }
104
-
105
-    public function testEndpointWithJsonContentTypeAndGetQuery(): void
106
-    {
107
-        $client = static::createClient(['test_case' => 'connectionWithCORS']);
108
-        $this->disableCatchExceptions($client);
109
-        $client->request('GET', '/', ['query' => $this->friendsQuery], [], ['CONTENT_TYPE' => 'application/json']);
110
-        $result = $client->getResponse()->getContent();
111
-        $this->assertSame(['data' => $this->expectedData], json_decode($result, true), $result);
112
-    }
113
-
114
-    public function testEndpointWithInvalidBodyQuery(): void
115
-    {
116
-        $this->expectException(BadRequestHttpException::class);
117
-        $this->expectExceptionMessage('POST body sent invalid JSON');
118
-        $client = static::createClient();
119
-        $this->disableCatchExceptions($client);
120
-        $client->request('GET', '/', [], [], ['CONTENT_TYPE' => 'application/json'], '{');
121
-        $client->getResponse()->getContent();
122
-    }
123
-
124
-    public function testEndpointActionWithVariables(): void
125
-    {
126
-        $client = static::createClient(['test_case' => 'connection']);
127
-        $this->disableCatchExceptions($client);
128
-
129
-        $query = <<<'EOF'
130
-            query FriendsQuery($firstFriends: Int) {
131
-              user {
132
-                friends(first: $firstFriends) {
133
-                  totalCount
134
-                  edges {
135
-                    friendshipTime
136
-                    node {
137
-                      name
138
-                    }
139
-                  }
140
-                }
141
-              }
142
-            }
143
-            EOF;
144
-
145
-        $content = json_encode(['query' => $query, 'variables' => '{"firstFriends": 2}']) ?: null;
146
-        $client->request('GET', '/', [], [], ['CONTENT_TYPE' => 'application/json'], $content);
147
-        $this->assertSame(200, $client->getResponse()->getStatusCode());
148
-    }
149
-
150
-    public function testEndpointActionWithInvalidVariables(): void
151
-    {
152
-        $this->expectException(BadRequestHttpException::class);
153
-        $this->expectExceptionMessage('Variables are invalid JSON');
154
-        $client = static::createClient(['test_case' => 'connection']);
155
-        $this->disableCatchExceptions($client);
156
-
157
-        $query = <<<'EOF'
158
-            query {
159
-              user
160
-            }
161
-            EOF;
162
-
163
-        $client->request('GET', '/', ['query' => $query, 'variables' => '"firstFriends": 2}']);
164
-    }
165
-
166
-    public function testMultipleEndpointActionWithUnknownSchemaName(): void
167
-    {
168
-        $this->expectException(NotFoundHttpException::class);
169
-        $this->expectExceptionMessage('Could not find "fake" schema.');
170
-        $client = static::createClient(['test_case' => 'connection']);
171
-        $this->disableCatchExceptions($client);
172
-
173
-        $query = <<<'EOF'
174
-            query {
175
-              user
176
-            }
177
-            EOF;
178
-
179
-        $client->request('GET', '/graphql/fake', ['query' => $query]);
180
-    }
181
-
182
-    public function testEndpointActionWithOperationName(): void
183
-    {
184
-        $client = static::createClient(['test_case' => 'connection']);
185
-        $this->disableCatchExceptions($client);
186
-
187
-        $query = $this->friendsQuery."\n".$this->friendsTotalCountQuery;
188
-
189
-        $client->request('POST', '/', ['query' => $query, 'operationName' => 'FriendsQuery'], [], ['CONTENT_TYPE' => 'application/x-www-form-urlencoded']);
190
-        $result = $client->getResponse()->getContent();
191
-        $this->assertSame(['data' => $this->expectedData], json_decode($result, true), $result);
192
-    }
193
-
194
-    /**
195
-     * @dataProvider graphQLBatchEndpointUriProvider
196
-     */
197
-    public function testBatchEndpointAction(string $uri): void
198
-    {
199
-        $client = static::createClient(['test_case' => 'connection']);
200
-        $this->disableCatchExceptions($client);
201
-
202
-        $data = [
203
-            [
204
-                'id' => 'friends',
205
-                'query' => $this->friendsQuery,
206
-            ],
207
-            [
208
-                'id' => 'friendsTotalCount',
209
-                'query' => $this->friendsTotalCountQuery,
210
-            ],
211
-        ];
212
-
213
-        $content = json_encode($data) ?: null;
214
-        $client->request('POST', $uri, [], [], ['CONTENT_TYPE' => 'application/json'], $content);
215
-        $result = $client->getResponse()->getContent();
216
-
217
-        $expected = [
218
-            ['id' => 'friends', 'payload' => ['data' => $this->expectedData]],
219
-            ['id' => 'friendsTotalCount', 'payload' => ['data' => ['user' => ['friends' => ['totalCount' => 4]]]]],
220
-        ];
221
-        $this->assertSame($expected, json_decode($result, true), $result);
222
-    }
223
-
224
-    public function graphQLBatchEndpointUriProvider(): array
225
-    {
226
-        return [
227
-            ['/batch'],
228
-            ['/graphql/default/batch'],
229
-        ];
230
-    }
231
-
232
-    public function testBatchEndpointWithEmptyQuery(): void
233
-    {
234
-        $this->expectException(BadRequestHttpException::class);
235
-        $this->expectExceptionMessage('Must provide at least one valid query.');
236
-        $client = static::createClient();
237
-        $this->disableCatchExceptions($client);
238
-        $client->request('GET', '/batch', [], [], ['CONTENT_TYPE' => 'application/json'], '{}');
239
-        $client->getResponse()->getContent();
240
-    }
241
-
242
-    public function testBatchEndpointWrongContentType(): void
243
-    {
244
-        $this->expectException(BadRequestHttpException::class);
245
-        $this->expectExceptionMessage('Batching parser only accepts "application/json" or "multipart/form-data" content-type but got "".');
246
-        $client = static::createClient();
247
-        $this->disableCatchExceptions($client);
248
-        $client->request('GET', '/batch');
249
-        $client->getResponse()->getContent();
250
-    }
251
-
252
-    public function testBatchEndpointWithInvalidJson(): void
253
-    {
254
-        $this->expectException(BadRequestHttpException::class);
255
-        $this->expectExceptionMessage('POST body sent invalid JSON');
256
-        $client = static::createClient();
257
-        $this->disableCatchExceptions($client);
258
-        $client->request('GET', '/batch', [], [], ['CONTENT_TYPE' => 'application/json'], '{');
259
-        $client->getResponse()->getContent();
260
-    }
261
-
262
-    public function testBatchEndpointWithInvalidQuery(): void
263
-    {
264
-        $this->expectException(BadRequestHttpException::class);
265
-        $this->expectExceptionMessage('1 is not a valid query');
266
-        $client = static::createClient();
267
-        $this->disableCatchExceptions($client);
268
-        $client->request('GET', '/batch', [], [], ['CONTENT_TYPE' => 'application/json'], '{"test" : {"query": 1}}');
269
-        $client->getResponse()->getContent();
270
-    }
271
-
272
-    public function testPreflightedRequestWhenDisabled(): void
273
-    {
274
-        $client = static::createClient(['test_case' => 'connection']);
275
-        $this->disableCatchExceptions($client);
276
-        $client->request('OPTIONS', '/', [], [], ['HTTP_Origin' => 'http://example.com']);
277
-        $response = $client->getResponse();
278
-        $this->assertSame(200, $response->getStatusCode());
279
-        $this->assertCORSHeadersNotExists($client);
280
-    }
281
-
282
-    public function testUnAuthorizedMethod(): void
283
-    {
284
-        $client = static::createClient(['test_case' => 'connection']);
285
-        $this->disableCatchExceptions($client);
286
-        $client->request('PUT', '/', [], [], ['HTTP_Origin' => 'http://example.com']);
287
-        $this->assertSame(405, $client->getResponse()->getStatusCode());
288
-    }
289
-
290
-    public function testPreflightedRequestWhenEnabled(): void
291
-    {
292
-        $client = static::createClient(['test_case' => 'connectionWithCORS']);
293
-        $this->disableCatchExceptions($client);
294
-        $client->request('OPTIONS', '/batch', [], [], ['HTTP_Origin' => 'http://example.com']);
295
-        $this->assertCORSHeadersExists($client);
296
-    }
297
-
298
-    public function testNoCORSHeadersIfOriginHeaderNotExists(): void
299
-    {
300
-        $client = static::createClient(['test_case' => 'connectionWithCORS']);
301
-        $this->disableCatchExceptions($client);
302
-        $client->request('GET', '/', ['query' => $this->friendsQuery], [], ['CONTENT_TYPE' => 'application/graphql']);
303
-        $result = $client->getResponse()->getContent();
304
-        $this->assertSame(['data' => $this->expectedData], json_decode($result, true), $result);
305
-        $this->assertCORSHeadersNotExists($client);
306
-    }
307
-
308
-    /**
309
-     * @param KernelBrowser $client
310
-     */
311
-    private function assertCORSHeadersNotExists($client): void
312
-    {
313
-        $headers = $client->getResponse()->headers->all();
314
-        $this->assertArrayNotHasKey('access-control-allow-origin', $headers);
315
-        $this->assertArrayNotHasKey('access-control-allow-methods', $headers);
316
-        $this->assertArrayNotHasKey('access-control-allow-credentials', $headers);
317
-        $this->assertArrayNotHasKey('access-control-allow-headers', $headers);
318
-        $this->assertArrayNotHasKey('access-control-max-age', $headers);
319
-    }
320
-
321
-    /**
322
-     * @param KernelBrowser $client
323
-     */
324
-    private function assertCORSHeadersExists($client): void
325
-    {
326
-        $response = $client->getResponse();
327
-        $this->assertSame(200, $response->getStatusCode());
328
-        $this->assertSame('http://example.com', $response->headers->get('Access-Control-Allow-Origin'));
329
-        $this->assertSame('OPTIONS, GET, POST', $response->headers->get('Access-Control-Allow-Methods'));
330
-        $this->assertSame('true', $response->headers->get('Access-Control-Allow-Credentials'));
331
-        $this->assertSame('Content-Type, Authorization', $response->headers->get('Access-Control-Allow-Headers'));
332
-        $this->assertSame('3600', $response->headers->get('Access-Control-Max-Age'));
333
-    }
334
-}
Please login to merge, or discard this patch.
tests/Functional/Security/QueryComplexityTest.php 1 patch
Spacing   -70 removed lines patch added patch discarded remove patch
@@ -9,73 +9,3 @@
 block discarded – undo
9 9
 final class QueryComplexityTest extends TestCase
10 10
 {
11 11
     private string $userFriendsWithoutLimitQuery = <<<'EOF'
12
-        query {
13
-          user {
14
-            friends {
15
-              edges {
16
-                node {
17
-                  name
18
-                }
19
-              }
20
-            }
21
-          }
22
-        }
23
-        EOF;
24
-
25
-    private string $userFriendsWithLimitQuery = <<<'EOF'
26
-        query {
27
-          user {
28
-            friends(first: 1) {
29
-              edges {
30
-                node {
31
-                  name
32
-                }
33
-              }
34
-            }
35
-          }
36
-        }
37
-        EOF;
38
-
39
-    public function testComplexityReachLimitation(): void
40
-    {
41
-        $expected = [
42
-            'errors' => [
43
-                [
44
-                    'message' => 'Max query complexity should be 10 but got 54.',
45
-                ],
46
-            ],
47
-        ];
48
-
49
-        $this->assertResponse($this->userFriendsWithoutLimitQuery, $expected, self::ANONYMOUS_USER, 'queryComplexity');
50
-    }
51
-
52
-    public function testComplexityReachLimitationEnv(): void
53
-    {
54
-        $expected = [
55
-            'errors' => [
56
-                [
57
-                    'message' => 'Max query complexity should be 10 but got 54.',
58
-                ],
59
-            ],
60
-        ];
61
-
62
-        $this->assertResponse($this->userFriendsWithoutLimitQuery, $expected, self::ANONYMOUS_USER, 'queryComplexityEnv');
63
-    }
64
-
65
-    public function testComplexityUnderLimitation(): void
66
-    {
67
-        $expected = [
68
-            'data' => [
69
-                'user' => [
70
-                    'friends' => [
71
-                        'edges' => [
72
-                            ['node' => ['name' => 'Nick']],
73
-                        ],
74
-                    ],
75
-                ],
76
-            ],
77
-        ];
78
-
79
-        $this->assertResponse($this->userFriendsWithLimitQuery, $expected, self::ANONYMOUS_USER, 'queryComplexity');
80
-    }
81
-}
Please login to merge, or discard this patch.
tests/Functional/Security/QueryMaxDepthTest.php 1 patch
Spacing   -77 removed lines patch added patch discarded remove patch
@@ -9,80 +9,3 @@
 block discarded – undo
9 9
 final class QueryMaxDepthTest extends TestCase
10 10
 {
11 11
     private string $userFriendsWithoutViolationQuery = <<<'EOF'
12
-        query {
13
-          user {
14
-            friends(first:1) {
15
-              edges {
16
-                node {
17
-                  name
18
-                }
19
-              }
20
-            }
21
-          }
22
-        }
23
-        EOF;
24
-
25
-    private string $userFriendsWithViolationQuery = <<<'EOF'
26
-        query {
27
-          user {
28
-            friends(first: 1) {
29
-              edges {
30
-                node {
31
-                  name
32
-                  friends {
33
-                    edges {
34
-                      node {
35
-                        name
36
-                      }
37
-                    }
38
-                  }
39
-                }
40
-              }
41
-            }
42
-          }
43
-        }
44
-        EOF;
45
-
46
-    public function testMaxDepthReachLimitation(): void
47
-    {
48
-        $expected = [
49
-            'errors' => [
50
-                [
51
-                    'message' => 'Max query depth should be 3 but got 6.',
52
-                ],
53
-            ],
54
-        ];
55
-
56
-        $this->assertResponse($this->userFriendsWithViolationQuery, $expected, self::ANONYMOUS_USER, 'queryMaxDepth');
57
-    }
58
-
59
-    public function testMaxDepthReachLimitationEnv(): void
60
-    {
61
-        $expected = [
62
-            'errors' => [
63
-                [
64
-                    'message' => 'Max query depth should be 3 but got 6.',
65
-                ],
66
-            ],
67
-        ];
68
-
69
-        $this->assertResponse($this->userFriendsWithViolationQuery, $expected, self::ANONYMOUS_USER, 'queryMaxDepthEnv');
70
-    }
71
-
72
-    public function testComplexityUnderLimitation(): void
73
-    {
74
-        $expected = [
75
-            'data' => [
76
-                'user' => [
77
-                    'friends' => [
78
-                        'edges' => [
79
-                            ['node' => ['name' => 'Nick']],
80
-                        ],
81
-                    ],
82
-                ],
83
-            ],
84
-        ];
85
-
86
-        $this->assertResponse($this->userFriendsWithoutViolationQuery, $expected, self::ANONYMOUS_USER, 'queryMaxDepth');
87
-    }
88
-}
Please login to merge, or discard this patch.
tests/Functional/Security/DisableIntrospectionTest.php 1 patch
Spacing   -29 removed lines patch added patch discarded remove patch
@@ -9,32 +9,3 @@
 block discarded – undo
9 9
 final class DisableIntrospectionTest extends TestCase
10 10
 {
11 11
     private string $introspectionQuery = <<<'EOF'
12
-        query {
13
-          __schema {
14
-            types {
15
-              name
16
-              description
17
-            }
18
-          }
19
-        }
20
-        EOF;
21
-
22
-    public function testIntrospectionDisabled(): void
23
-    {
24
-        $expected = [
25
-            'errors' => [
26
-                [
27
-                    'message' => 'GraphQL introspection is not allowed, but the query contained __schema or __type',
28
-                    'locations' => [
29
-                        [
30
-                            'line' => 2,
31
-                            'column' => 3,
32
-                        ],
33
-                    ],
34
-                ],
35
-            ],
36
-        ];
37
-
38
-        $this->assertResponse($this->introspectionQuery, $expected, self::ANONYMOUS_USER, 'disableIntrospection');
39
-    }
40
-}
Please login to merge, or discard this patch.
src/Validator/ValidationNode.php 1 patch
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -46,7 +46,7 @@
 block discarded – undo
46 46
     private ?ResolverArgs $__resolverArgs;
47 47
 
48 48
     public function __construct(
49
-        ObjectType|InputObjectType $type,
49
+        ObjectType | InputObjectType $type,
50 50
         string $field = null,
51 51
         ?ValidationNode $parent = null,
52 52
         ?ResolverArgs $resolverArgs = null
Please login to merge, or discard this patch.
src/Validator/InputValidator.php 1 patch
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -62,7 +62,7 @@  discard block
 block discarded – undo
62 62
     /**
63 63
      * @throws ArgumentsValidationException
64 64
      */
65
-    public function validate(string|array|null $groups = null, bool $throw = true): ?ConstraintViolationListInterface
65
+    public function validate(string | array | null $groups = null, bool $throw = true): ?ConstraintViolationListInterface
66 66
     {
67 67
         $rootNode = new ValidationNode(
68 68
             $this->info->parentType,
@@ -206,7 +206,7 @@  discard block
 block discarded – undo
206 206
         return $rootObject;
207 207
     }
208 208
 
209
-    private static function isListOfType(GeneratedTypeInterface|ListOfType|NonNull $type): bool
209
+    private static function isListOfType(GeneratedTypeInterface | ListOfType | NonNull $type): bool
210 210
     {
211 211
         if ($type instanceof ListOfType || ($type instanceof NonNull && $type->getWrappedType() instanceof ListOfType)) {
212 212
             return true;
@@ -215,7 +215,7 @@  discard block
 block discarded – undo
215 215
         return false;
216 216
     }
217 217
 
218
-    private function createCollectionNode(array $values, ObjectType|InputObjectType $type, ValidationNode $parent): array
218
+    private function createCollectionNode(array $values, ObjectType | InputObjectType $type, ValidationNode $parent): array
219 219
     {
220 220
         $collection = [];
221 221
 
@@ -226,7 +226,7 @@  discard block
 block discarded – undo
226 226
         return $collection;
227 227
     }
228 228
 
229
-    private function createObjectNode(array $value, ObjectType|InputObjectType $type, ValidationNode $parent): ValidationNode
229
+    private function createObjectNode(array $value, ObjectType | InputObjectType $type, ValidationNode $parent): ValidationNode
230 230
     {
231 231
         /** @phpstan-ignore-next-line */
232 232
         $classValidation = static::normalizeConfig($type->config['validation'] ?? []);
Please login to merge, or discard this patch.