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 Setup Failed
Pull Request — main (#5725)
by Pedro
25:49 queued 10:59
created
src/app/Library/Uploaders/Uploader.php 1 patch
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -25,7 +25,7 @@  discard block
 block discarded – undo
25 25
 
26 26
     private bool $deleteWhenEntryIsDeleted = true;
27 27
 
28
-    private bool|string $attachedToFakeField = false;
28
+    private bool | string $attachedToFakeField = false;
29 29
 
30 30
     /**
31 31
      * Cloud disks have the ability to generate temporary URLs to files, should we do it?
@@ -62,7 +62,7 @@  discard block
 block discarded – undo
62 62
     /*******************************
63 63
      * Static methods
64 64
      *******************************/
65
-    public static function for(array $crudObject, array $definition): UploaderInterface
65
+    public static function for (array $crudObject, array $definition): UploaderInterface
66 66
     {
67 67
         return new static($crudObject, $definition);
68 68
     }
@@ -102,7 +102,7 @@  discard block
 block discarded – undo
102 102
 
103 103
     public function deleteUploadedFiles(Model $entry): void
104 104
     {
105
-        if (! in_array(SoftDeletes::class, class_uses_recursive($entry), true)) {
105
+        if (!in_array(SoftDeletes::class, class_uses_recursive($entry), true)) {
106 106
             $this->performFileDeletion($entry);
107 107
 
108 108
             return;
@@ -177,7 +177,7 @@  discard block
 block discarded – undo
177 177
 
178 178
     public function getPreviousFiles(Model $entry): mixed
179 179
     {
180
-        if (! $this->attachedToFakeField) {
180
+        if (!$this->attachedToFakeField) {
181 181
             return $this->getOriginalValue($entry);
182 182
         }
183 183
         $value = $this->getOriginalValue($entry, $this->attachedToFakeField);
@@ -196,7 +196,7 @@  discard block
 block discarded – undo
196 196
         return $this->attachedToFakeField !== false;
197 197
     }
198 198
 
199
-    public function getFakeAttribute(): bool|string
199
+    public function getFakeAttribute(): bool | string
200 200
     {
201 201
         return $this->attachedToFakeField;
202 202
     }
@@ -223,7 +223,7 @@  discard block
 block discarded – undo
223 223
         return $this;
224 224
     }
225 225
 
226
-    public function fake(bool|string $isFake): self
226
+    public function fake(bool | string $isFake): self
227 227
     {
228 228
         $this->attachedToFakeField = $isFake;
229 229
 
@@ -254,7 +254,7 @@  discard block
 block discarded – undo
254 254
         }
255 255
 
256 256
         if ($this->handleMultipleFiles) {
257
-            if (! isset($entry->getCasts()[$this->getName()]) && is_string($value)) {
257
+            if (!isset($entry->getCasts()[$this->getName()]) && is_string($value)) {
258 258
                 $entry->{$this->getAttributeName()} = json_decode($value, true);
259 259
             }
260 260
 
@@ -268,7 +268,7 @@  discard block
 block discarded – undo
268 268
 
269 269
     protected function deleteFiles(Model $entry)
270 270
     {
271
-        if (! $this->shouldDeleteFiles()) {
271
+        if (!$this->shouldDeleteFiles()) {
272 272
             return;
273 273
         }
274 274
 
@@ -303,7 +303,7 @@  discard block
 block discarded – undo
303 303
 
304 304
     private function performFileDeletion(Model $entry)
305 305
     {
306
-        if (! $this->handleRepeatableFiles && $this->deleteWhenEntryIsDeleted) {
306
+        if (!$this->handleRepeatableFiles && $this->deleteWhenEntryIsDeleted) {
307 307
             $this->deleteFiles($entry);
308 308
 
309 309
             return;
@@ -332,7 +332,7 @@  discard block
 block discarded – undo
332 332
 
333 333
         $previousValue = $entry->getOriginal($field);
334 334
 
335
-        if (! $previousValue) {
335
+        if (!$previousValue) {
336 336
             return $previousValue;
337 337
         }
338 338
 
Please login to merge, or discard this patch.
src/app/Library/Uploaders/Support/Traits/HandleRepeatableUploads.php 1 patch
Spacing   +23 added lines, -23 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
 {
19 19
     public bool $handleRepeatableFiles = false;
20 20
 
21
-    public null|string $repeatableContainerName = null;
21
+    public null | string $repeatableContainerName = null;
22 22
 
23 23
     /*******************************
24 24
      * Setters - fluently configure the uploader
@@ -35,7 +35,7 @@  discard block
 block discarded – undo
35 35
     /*******************************
36 36
      * Getters
37 37
      *******************************/
38
-    public function getRepeatableContainerName(): null|string
38
+    public function getRepeatableContainerName(): null | string
39 39
     {
40 40
         return $this->repeatableContainerName;
41 41
     }
@@ -162,7 +162,7 @@  discard block
 block discarded – undo
162 162
         foreach (app('UploadersRepository')->getRepeatableUploadersFor($this->getRepeatableContainerName()) as $uploader) {
163 163
             $uploadedValues = $uploader->uploadRepeatableFiles($values->pluck($uploader->getAttributeName())->toArray(), $this->getPreviousRepeatableValues($entry, $uploader));
164 164
 
165
-            $values = $values->map(function ($item, $key) use ($uploadedValues, $uploader) {
165
+            $values = $values->map(function($item, $key) use ($uploadedValues, $uploader) {
166 166
                 $item[$uploader->getAttributeName()] = $uploadedValues[$key] ?? null;
167 167
 
168 168
                 return $item;
@@ -193,7 +193,7 @@  discard block
 block discarded – undo
193 193
 
194 194
         $values = $entry->{$this->getRepeatableContainerName()};
195 195
         $values = is_string($values) ? json_decode($values, true) : $values;
196
-        $values = array_map(function ($item) use ($repeatableUploaders) {
196
+        $values = array_map(function($item) use ($repeatableUploaders) {
197 197
             foreach ($repeatableUploaders as $upload) {
198 198
                 $item[$upload->getAttributeName()] = $this->getValuesWithPathStripped($item, $upload);
199 199
             }
@@ -208,7 +208,7 @@  discard block
 block discarded – undo
208 208
 
209 209
     private function retrieveRepeatableRelationFiles(Model $entry)
210 210
     {
211
-        switch($this->getRepeatableRelationType()) {
211
+        switch ($this->getRepeatableRelationType()) {
212 212
             case 'BelongsToMany':
213 213
             case 'MorphToMany':
214 214
                 $pivotClass = app('crud')->getModel()->{$this->getUploaderSubfield()['baseEntity']}()->getPivotClass();
@@ -261,12 +261,12 @@  discard block
 block discarded – undo
261 261
         $repeatableValues ??= collect($entry->{$this->getRepeatableContainerName()});
262 262
 
263 263
         foreach (app('UploadersRepository')->getRepeatableUploadersFor($this->getRepeatableContainerName()) as $upload) {
264
-            if (! $upload->shouldDeleteFiles()) {
264
+            if (!$upload->shouldDeleteFiles()) {
265 265
                 continue;
266 266
             }
267 267
             $values = $repeatableValues->pluck($upload->getName())->toArray();
268 268
             foreach ($values as $value) {
269
-                if (! $value) {
269
+                if (!$value) {
270 270
                     continue;
271 271
                 }
272 272
 
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
     /**
290 290
      * Given two multidimensional arrays/collections, merge them recursively.
291 291
      */
292
-    protected function mergeValuesRecursive(array|Collection $array1, array|Collection $array2): array|Collection
292
+    protected function mergeValuesRecursive(array | Collection $array1, array | Collection $array2): array | Collection
293 293
     {
294 294
         $merged = $array1;
295 295
         foreach ($array2 as $key => &$value) {
@@ -311,7 +311,7 @@  discard block
 block discarded – undo
311 311
     {
312 312
         $items = CRUD::getRequest()->input('_order_'.$this->getRepeatableContainerName()) ?? [];
313 313
 
314
-        array_walk($items, function (&$key, $value) {
314
+        array_walk($items, function(&$key, $value) {
315 315
             $requestValue = $key[$this->getName()] ?? null;
316 316
             $key = $this->handleMultipleFiles ? (is_string($requestValue) ? explode(',', $requestValue) : $requestValue) : $requestValue;
317 317
         });
@@ -323,22 +323,22 @@  discard block
 block discarded – undo
323 323
     {
324 324
         $previousValues = $entry->getOriginal($uploader->getRepeatableContainerName());
325 325
 
326
-        if (! is_array($previousValues)) {
326
+        if (!is_array($previousValues)) {
327 327
             $previousValues = json_decode($previousValues, true);
328 328
         }
329 329
 
330
-        if (! empty($previousValues)) {
330
+        if (!empty($previousValues)) {
331 331
             $previousValues = array_column($previousValues, $uploader->getName());
332 332
         }
333 333
 
334 334
         return $previousValues ?? [];
335 335
     }
336 336
 
337
-    private function getValuesWithPathStripped(array|string|null $item, UploaderInterface $uploader)
337
+    private function getValuesWithPathStripped(array | string | null $item, UploaderInterface $uploader)
338 338
     {
339 339
         $uploadedValues = $item[$uploader->getName()] ?? null;
340 340
         if (is_array($uploadedValues)) {
341
-            return array_map(function ($value) use ($uploader) {
341
+            return array_map(function($value) use ($uploader) {
342 342
                 return $uploader->getValueWithoutPath($value);
343 343
             }, $uploadedValues);
344 344
         }
@@ -348,8 +348,8 @@  discard block
 block discarded – undo
348 348
 
349 349
     private function deleteRelationshipFiles(Model $entry): void
350 350
     {
351
-        if (! is_a($entry, Pivot::class, true) &&
352
-            ! $entry->relationLoaded($this->getRepeatableContainerName()) &&
351
+        if (!is_a($entry, Pivot::class, true) &&
352
+            !$entry->relationLoaded($this->getRepeatableContainerName()) &&
353 353
             method_exists($entry, $this->getRepeatableContainerName())
354 354
         ) {
355 355
             $entry->loadMissing($this->getRepeatableContainerName());
@@ -376,8 +376,8 @@  discard block
 block discarded – undo
376 376
             $relatedEntries = $entry->{$this->getRepeatableContainerName()} ?? [];
377 377
         }
378 378
 
379
-        if (! is_a($relatedEntries ?? '', Collection::class, true)) {
380
-            $relatedEntries = ! empty($relatedEntries) ? [$relatedEntries] : [$entry];
379
+        if (!is_a($relatedEntries ?? '', Collection::class, true)) {
380
+            $relatedEntries = !empty($relatedEntries) ? [$relatedEntries] : [$entry];
381 381
         }
382 382
 
383 383
         foreach ($relatedEntries as $relatedEntry) {
@@ -385,9 +385,9 @@  discard block
 block discarded – undo
385 385
         }
386 386
     }
387 387
 
388
-    protected function deletePivotFiles(Pivot|Model $entry)
388
+    protected function deletePivotFiles(Pivot | Model $entry)
389 389
     {
390
-        if (! is_a($entry, Pivot::class, true)) {
390
+        if (!is_a($entry, Pivot::class, true)) {
391 391
             $pivots = $entry->{$this->getRepeatableContainerName()};
392 392
             foreach ($pivots as $pivot) {
393 393
                 $this->deletePivotModelFiles($pivot);
@@ -397,24 +397,24 @@  discard block
 block discarded – undo
397 397
         }
398 398
 
399 399
         $pivotAttributes = $entry->getAttributes();
400
-        $connectedPivot = $entry->pivotParent->{$this->getRepeatableContainerName()}->where(function ($item) use ($pivotAttributes) {
400
+        $connectedPivot = $entry->pivotParent->{$this->getRepeatableContainerName()}->where(function($item) use ($pivotAttributes) {
401 401
             $itemPivotAttributes = $item->pivot->only(array_keys($pivotAttributes));
402 402
 
403 403
             return $itemPivotAttributes === $pivotAttributes;
404 404
         })->first();
405 405
 
406
-        if (! $connectedPivot) {
406
+        if (!$connectedPivot) {
407 407
             return;
408 408
         }
409 409
 
410 410
         $this->deletePivotModelFiles($connectedPivot);
411 411
     }
412 412
 
413
-    private function deletePivotModelFiles(Pivot|Model $entry)
413
+    private function deletePivotModelFiles(Pivot | Model $entry)
414 414
     {
415 415
         $files = $entry->getOriginal()['pivot_'.$this->getAttributeName()];
416 416
 
417
-        if (! $files) {
417
+        if (!$files) {
418 418
             return;
419 419
         }
420 420
 
Please login to merge, or discard this patch.
src/app/Console/Commands/PublishHeaderMetas.php 1 patch
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -60,7 +60,7 @@  discard block
 block discarded – undo
60 60
         ];
61 61
 
62 62
         foreach ($filesToPublish as $destination => $stub) {
63
-            if (! is_string($destination)) {
63
+            if (!is_string($destination)) {
64 64
                 $destination = $stub;
65 65
                 $stub = null;
66 66
             }
@@ -71,11 +71,11 @@  discard block
 block discarded – undo
71 71
                 continue;
72 72
             }
73 73
 
74
-            if (! File::isDirectory(dirname($destination))) {
74
+            if (!File::isDirectory(dirname($destination))) {
75 75
                 File::makeDirectory(dirname($destination), 0755, true);
76 76
             }
77 77
 
78
-            if (! $stub) {
78
+            if (!$stub) {
79 79
                 File::copy(__DIR__.'/../../../public/'.basename($destination), $destination);
80 80
                 $this->info("File {$destination} published.");
81 81
                 continue;
Please login to merge, or discard this patch.
src/app/Library/CrudPanel/Traits/Columns.php 1 patch
Spacing   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -74,7 +74,7 @@  discard block
 block discarded – undo
74 74
     /**
75 75
      * Add a column at the end of the CRUD object's "columns" array and return it.
76 76
      */
77
-    public function addAndReturnColumn(array|string $column): CrudColumn
77
+    public function addAndReturnColumn(array | string $column): CrudColumn
78 78
     {
79 79
         $column = $this->prepareAttributesAndAddColumn($column);
80 80
 
@@ -122,7 +122,7 @@  discard block
 block discarded – undo
122 122
      */
123 123
     public function makeFirstColumn()
124 124
     {
125
-        if (! $this->columns()) {
125
+        if (!$this->columns()) {
126 126
             return false;
127 127
         }
128 128
 
@@ -166,7 +166,7 @@  discard block
 block discarded – undo
166 166
      */
167 167
     public function removeColumns($columns)
168 168
     {
169
-        if (! empty($columns)) {
169
+        if (!empty($columns)) {
170 170
             foreach ($columns as $columnKey) {
171 171
                 $this->removeColumn($columnKey);
172 172
             }
@@ -331,7 +331,7 @@  discard block
 block discarded – undo
331 331
      */
332 332
     public function hasColumnWhere($attribute, $value)
333 333
     {
334
-        $match = Arr::first($this->columns(), function ($column, $columnKey) use ($attribute, $value) {
334
+        $match = Arr::first($this->columns(), function($column, $columnKey) use ($attribute, $value) {
335 335
             return isset($column[$attribute]) && $column[$attribute] == $value;
336 336
         });
337 337
 
@@ -347,7 +347,7 @@  discard block
 block discarded – undo
347 347
      */
348 348
     public function firstColumnWhere($attribute, $value)
349 349
     {
350
-        return Arr::first($this->columns(), function ($column, $columnKey) use ($attribute, $value) {
350
+        return Arr::first($this->columns(), function($column, $columnKey) use ($attribute, $value) {
351 351
             return isset($column[$attribute]) && $column[$attribute] == $value;
352 352
         });
353 353
     }
@@ -396,8 +396,8 @@  discard block
 block discarded – undo
396 396
      */
397 397
     public function countColumnsWithoutActions()
398 398
     {
399
-        return collect($this->columns())->filter(function ($column, $key) {
400
-            return ! isset($column['hasActions']) || $column['hasActions'] == false;
399
+        return collect($this->columns())->filter(function($column, $key) {
400
+            return !isset($column['hasActions']) || $column['hasActions'] == false;
401 401
         })->count();
402 402
     }
403 403
 
Please login to merge, or discard this patch.
src/app/Library/CrudPanel/Traits/Read.php 1 patch
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -54,7 +54,7 @@  discard block
 block discarded – undo
54 54
     {
55 55
         $entry = $this->getCurrentEntry();
56 56
 
57
-        if (! $entry) {
57
+        if (!$entry) {
58 58
             return false;
59 59
         }
60 60
 
@@ -69,7 +69,7 @@  discard block
 block discarded – undo
69 69
      */
70 70
     public function getEntry($id)
71 71
     {
72
-        if (! $this->entry) {
72
+        if (!$this->entry) {
73 73
             if ($this->getOperationSetting('eagerLoadRelationships')) {
74 74
                 $this->eagerLoadRelationshipFields();
75 75
             }
@@ -80,7 +80,7 @@  discard block
 block discarded – undo
80 80
         return $this->entry;
81 81
     }
82 82
 
83
-    private function shouldUseFallbackLocale(): bool|string
83
+    private function shouldUseFallbackLocale(): bool | string
84 84
     {
85 85
         $fallbackRequestValue = $this->getRequest()->get('_fallback_locale');
86 86
 
@@ -96,7 +96,7 @@  discard block
 block discarded – undo
96 96
      */
97 97
     public function getEntryWithLocale($id)
98 98
     {
99
-        if (! $this->entry) {
99
+        if (!$this->entry) {
100 100
             $this->entry = $this->getEntry($id);
101 101
         }
102 102
 
@@ -147,7 +147,7 @@  discard block
 block discarded – undo
147 147
         foreach ($crudObjects as $crudObjectName => $attributes) {
148 148
             $relationString = isset($attributes['entity']) && $attributes['entity'] !== false ? $attributes['entity'] : '';
149 149
 
150
-            if (! $relationString) {
150
+            if (!$relationString) {
151 151
                 continue;
152 152
             }
153 153
 
@@ -213,7 +213,7 @@  discard block
 block discarded – undo
213 213
      */
214 214
     public function enableDetailsRow()
215 215
     {
216
-        if (! backpack_pro()) {
216
+        if (!backpack_pro()) {
217 217
             throw new BackpackProRequiredException('Details row');
218 218
         }
219 219
 
@@ -312,7 +312,7 @@  discard block
 block discarded – undo
312 312
                 // we will apply the same labels as the values to the menu if developer didn't
313 313
                 $this->abortIfInvalidPageLength($menu[0]);
314 314
 
315
-                if (! isset($menu[1]) || ! is_array($menu[1])) {
315
+                if (!isset($menu[1]) || !is_array($menu[1])) {
316 316
                     $menu[1] = $menu[0];
317 317
                 }
318 318
             } else {
@@ -400,7 +400,7 @@  discard block
 block discarded – undo
400 400
      */
401 401
     public function enableExportButtons()
402 402
     {
403
-        if (! backpack_pro()) {
403
+        if (!backpack_pro()) {
404 404
             throw new BackpackProRequiredException('Export buttons');
405 405
         }
406 406
 
Please login to merge, or discard this patch.
src/routes/backpack/custom.php 1 patch
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@
 block discarded – undo
15 15
         (array) config('backpack.base.middleware_key', 'admin')
16 16
     ),
17 17
     'namespace' => 'App\Http\Controllers\Admin',
18
-], function () { // custom admin routes
18
+], function() { // custom admin routes
19 19
 }); // this should be the absolute last line of this file
20 20
 
21 21
 /**
Please login to merge, or discard this patch.
tests/Unit/CrudPanel/CrudPanelButtonsTest.php 1 patch
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -276,7 +276,7 @@  discard block
 block discarded – undo
276 276
     public function testAddButtonFluently()
277 277
     {
278 278
         $button1 = CrudButton::name('lineTest')->to('line')->view('crud::buttons.test')->type('view');
279
-        $button2 = CrudButton::add('modelFunction')->model_function(function () {
279
+        $button2 = CrudButton::add('modelFunction')->model_function(function() {
280 280
             return 'test';
281 281
         })->section('top')->makeFirst();
282 282
         $this->assertEquals($button1->toArray(), $this->crudPanel->buttons()->last()->toArray());
@@ -290,7 +290,7 @@  discard block
 block discarded – undo
290 290
 
291 291
         $this->expectException(\Symfony\Component\HttpKernel\Exception\HttpException::class);
292 292
 
293
-        $this->crudPanel->modifyButton('unknownButton', function ($button) {
293
+        $this->crudPanel->modifyButton('unknownButton', function($button) {
294 294
             $button->name = 'newName';
295 295
         });
296 296
     }
@@ -342,7 +342,7 @@  discard block
 block discarded – undo
342 342
 
343 343
     private function getButtonByName($name)
344 344
     {
345
-        return $this->crudPanel->buttons()->first(function ($value) use ($name) {
345
+        return $this->crudPanel->buttons()->first(function($value) use ($name) {
346 346
             return $value->name == $name;
347 347
         });
348 348
     }
Please login to merge, or discard this patch.
tests/Unit/CrudPanel/CrudPanelAccessTest.php 1 patch
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -105,7 +105,7 @@  discard block
 block discarded – undo
105 105
 
106 106
     public function testItCanUseAClosureToResolveAccess()
107 107
     {
108
-        $this->crudPanel->setAccessCondition('list', function () {
108
+        $this->crudPanel->setAccessCondition('list', function() {
109 109
             return true;
110 110
         });
111 111
 
@@ -116,7 +116,7 @@  discard block
 block discarded – undo
116 116
 
117 117
     public function testItCanUseAClosureToResolveAccessForMultipleOperations()
118 118
     {
119
-        $this->crudPanel->setAccessCondition(['list', 'create'], function () {
119
+        $this->crudPanel->setAccessCondition(['list', 'create'], function() {
120 120
             return true;
121 121
         });
122 122
 
@@ -127,7 +127,7 @@  discard block
 block discarded – undo
127 127
 
128 128
     public function testItCanCheckIfAnOperationHasAccessConditions()
129 129
     {
130
-        $this->crudPanel->setAccessCondition(['list', 'create'], function () {
130
+        $this->crudPanel->setAccessCondition(['list', 'create'], function() {
131 131
             return true;
132 132
         });
133 133
 
@@ -137,7 +137,7 @@  discard block
 block discarded – undo
137 137
 
138 138
     public function testItCanCheckAccessToAll()
139 139
     {
140
-        $this->crudPanel->allowAccess(['list', 'create'], function () {
140
+        $this->crudPanel->allowAccess(['list', 'create'], function() {
141 141
             return true;
142 142
         });
143 143
 
@@ -147,7 +147,7 @@  discard block
 block discarded – undo
147 147
 
148 148
     public function testItCanAllowAccessToSomeSpecificOperationWhileDenyingOthers()
149 149
     {
150
-        $this->crudPanel->allowAccess(['list', 'create'], function () {
150
+        $this->crudPanel->allowAccess(['list', 'create'], function() {
151 151
             return true;
152 152
         });
153 153
 
Please login to merge, or discard this patch.
tests/config/CrudPanel/BaseCrudPanel.php 1 patch
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -24,7 +24,7 @@  discard block
 block discarded – undo
24 24
     {
25 25
         parent::setUp();
26 26
 
27
-        $this->app->singleton('crud', function ($app) {
27
+        $this->app->singleton('crud', function($app) {
28 28
             return new CrudPanel($app);
29 29
         });
30 30
         $this->crudPanel = app('crud');
@@ -43,7 +43,7 @@  discard block
 block discarded – undo
43 43
         $app['config']->set('database.default', 'testing');
44 44
         $app['config']->set('backpack.base.route_prefix', 'admin');
45 45
 
46
-        $app->bind('App\Http\Middleware\CheckIfAdmin', function () {
46
+        $app->bind('App\Http\Middleware\CheckIfAdmin', function() {
47 47
             return new class
48 48
             {
49 49
                 public function handle($request, $next)
Please login to merge, or discard this patch.