Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • project/automatic_updates
  • issue/automatic_updates-3159719
  • issue/automatic_updates-3227923
  • issue/automatic_updates-3227927
  • issue/automatic_updates-3227122
  • issue/automatic_updates-3227940
  • issue/automatic_updates-3228095
  • issue/automatic_updates-3228101
  • issue/automatic_updates-3228115
  • issue/automatic_updates-3228125
  • issue/automatic_updates-3228359
  • issue/automatic_updates-3228392
  • issue/automatic_updates-3225753
  • issue/automatic_updates-3227588
  • issue/automatic_updates-3228521
  • issue/automatic_updates-3228539
  • issue/automatic_updates-3226570
  • issue/automatic_updates-3228806
  • issue/automatic_updates-3227575
  • issue/automatic_updates-3229485
  • issue/automatic_updates-3228955
  • issue/automatic_updates-3230024
  • issue/automatic_updates-3230250
  • issue/automatic_updates-3230249
  • issue/automatic_updates-3230264
  • issue/automatic_updates-3230510
  • issue/automatic_updates-3230235
  • issue/automatic_updates-3230050
  • issue/automatic_updates-3230934
  • issue/automatic_updates-3230049
  • issue/automatic_updates-3230507
  • issue/automatic_updates-3231153
  • issue/automatic_updates-3231992
  • issue/automatic_updates-3232003
  • issue/automatic_updates-3232004
  • issue/automatic_updates-3231996
  • issue/automatic_updates-3231999
  • issue/automatic_updates-3230668
  • issue/automatic_updates-3232000
  • issue/automatic_updates-3232420
  • issue/automatic_updates-3232729
  • issue/automatic_updates-3232761
  • issue/automatic_updates-3231997
  • issue/automatic_updates-3232927
  • issue/automatic_updates-3232959
  • issue/automatic_updates-3233124
  • issue/automatic_updates-3230856
  • issue/automatic_updates-3233493
  • issue/automatic_updates-3233587
  • issue/automatic_updates-3233521
  • issue/automatic_updates-3236405
  • issue/automatic_updates-3236299
  • issue/automatic_updates-3238586
  • issue/automatic_updates-3238647
  • issue/automatic_updates-3238717
  • issue/automatic_updates-3238846
  • issue/automatic_updates-3238852
  • issue/automatic_updates-3238866
  • issue/automatic_updates-3238714
  • issue/automatic_updates-3239103
  • issue/automatic_updates-3233138
  • issue/automatic_updates-3239466
  • issue/automatic_updates-3239645
  • issue/automatic_updates-3239673
  • issue/automatic_updates-3277775
  • issue/automatic_updates-3280923
  • issue/automatic_updates-3275315
  • issue/automatic_updates-3279527
  • issue/automatic_updates-3279733
  • issue/automatic_updates-3281405
  • issue/automatic_updates-3281397
  • issue/automatic_updates-3280204
  • issue/automatic_updates-3277817
  • issue/automatic_updates-3277230
  • issue/automatic_updates-3276534
  • issue/automatic_updates-3279538
  • issue/automatic_updates-3280168
  • issue/automatic_updates-3271502
  • issue/automatic_updates-3283644
  • issue/automatic_updates-3302524
  • issue/automatic_updates-3275883
  • issue/automatic_updates-3280180
  • issue/automatic_updates-3274837
  • issue/automatic_updates-3281473
  • issue/automatic_updates-3281634
  • issue/automatic_updates-3239889
  • issue/automatic_updates-3240753
  • issue/automatic_updates-3233103
  • issue/automatic_updates-3240971
  • issue/automatic_updates-3233564
  • issue/automatic_updates-3241380
  • issue/automatic_updates-3241105
  • issue/automatic_updates-3242626
  • issue/automatic_updates-3242724
  • issue/automatic_updates-3243057
  • issue/automatic_updates-3243348
  • issue/automatic_updates-3243339
  • issue/automatic_updates-3243422
  • issue/automatic_updates-3243436
  • issue/automatic_updates-3243600
  • issue/automatic_updates-3243851
  • issue/automatic_updates-3243405
  • issue/automatic_updates-3244338
  • issue/automatic_updates-3244337
  • issue/automatic_updates-3244360
  • issue/automatic_updates-3244358
  • issue/automatic_updates-3244679
  • issue/automatic_updates-3244939
  • issue/automatic_updates-3244976
  • issue/automatic_updates-3245376
  • issue/automatic_updates-3245388
  • issue/automatic_updates-3245428
  • issue/automatic_updates-3245655
  • issue/automatic_updates-3245766
  • issue/automatic_updates-3245810
  • issue/automatic_updates-3245846
  • issue/automatic_updates-3246036
  • issue/automatic_updates-3246194
  • issue/automatic_updates-3246203
  • issue/automatic_updates-3246283
  • issue/automatic_updates-3279064
  • issue/automatic_updates-3246420
  • issue/automatic_updates-3246638
  • issue/automatic_updates-3246660
  • issue/automatic_updates-3246673
  • issue/automatic_updates-3246695
  • issue/automatic_updates-3245996
  • issue/automatic_updates-3247308
  • issue/automatic_updates-3247478
  • issue/automatic_updates-3247479
  • issue/automatic_updates-3279086
  • issue/automatic_updates-3248312
  • issue/automatic_updates-3248523
  • issue/automatic_updates-3248527
  • issue/automatic_updates-3244412
  • issue/automatic_updates-3248976
  • issue/automatic_updates-3248909
  • issue/automatic_updates-3246507
  • issue/automatic_updates-3249531
  • issue/automatic_updates-3249517
  • issue/automatic_updates-3249983
  • issue/automatic_updates-3249135
  • issue/automatic_updates-3250136
  • issue/automatic_updates-3250386
  • issue/automatic_updates-3251701
  • issue/automatic_updates-3250696
  • issue/automatic_updates-3248911
  • issue/automatic_updates-3227420
  • issue/automatic_updates-3252071
  • issue/automatic_updates-3252097
  • issue/automatic_updates-3252109
  • issue/automatic_updates-3252126
  • issue/automatic_updates-3249130
  • issue/automatic_updates-3251972
  • issue/automatic_updates-3252187
  • issue/automatic_updates-3252328
  • issue/automatic_updates-3252324
  • issue/automatic_updates-3252533
  • issue/automatic_updates-3253055
  • issue/automatic_updates-3253186
  • issue/automatic_updates-3253395
  • issue/automatic_updates-3253400
  • issue/automatic_updates-3253624
  • issue/automatic_updates-3253647
  • issue/automatic_updates-3253649
  • issue/automatic_updates-3253858
  • issue/automatic_updates-3254166
  • issue/automatic_updates-3254207
  • issue/automatic_updates-3279108
  • issue/automatic_updates-3254606
  • issue/automatic_updates-3254616
  • issue/automatic_updates-3254911
  • issue/automatic_updates-3255011
  • issue/automatic_updates-3255014
  • issue/automatic_updates-3255320
  • issue/automatic_updates-3277562
  • issue/automatic_updates-3255678
  • issue/automatic_updates-3256958
  • issue/automatic_updates-3257115
  • issue/automatic_updates-3257432
  • issue/automatic_updates-3257446
  • issue/automatic_updates-3257473
  • issue/automatic_updates-3257134
  • issue/automatic_updates-3257849
  • issue/automatic_updates-3258065
  • issue/automatic_updates-3258056
  • issue/automatic_updates-3258048
  • issue/automatic_updates-3258045
  • issue/automatic_updates-3258464
  • issue/automatic_updates-3258611
  • issue/automatic_updates-3258646
  • issue/automatic_updates-3258661
  • issue/automatic_updates-3258667
  • issue/automatic_updates-3258590
  • issue/automatic_updates-3259228
  • issue/automatic_updates-3259656
  • issue/automatic_updates-3252299
  • issue/automatic_updates-3259664
  • issue/automatic_updates-3259822
  • issue/automatic_updates-3259810
  • issue/automatic_updates-3259814
  • issue/automatic_updates-3260368
  • issue/automatic_updates-3257845
  • issue/automatic_updates-3260664
  • issue/automatic_updates-3260672
  • issue/automatic_updates-3260698
  • issue/automatic_updates-3260662
  • issue/automatic_updates-3260669
  • issue/automatic_updates-3260668
  • issue/automatic_updates-3261637
  • issue/automatic_updates-3261772
  • issue/automatic_updates-3261847
  • issue/automatic_updates-3262016
  • issue/automatic_updates-3262244
  • issue/automatic_updates-3262303
  • issue/automatic_updates-3261642
  • issue/automatic_updates-3262359
  • issue/automatic_updates-3262542
  • issue/automatic_updates-3261098
  • issue/automatic_updates-3260666
  • issue/automatic_updates-3262587
  • issue/automatic_updates-3262965
  • issue/automatic_updates-3263155
  • issue/automatic_updates-3263223
  • issue/automatic_updates-3254755
  • issue/automatic_updates-3261758
  • issue/automatic_updates-3258059
  • issue/automatic_updates-3259196
  • issue/automatic_updates-3263865
  • issue/automatic_updates-3262284
  • issue/automatic_updates-3264554
  • issue/automatic_updates-3248928
  • issue/automatic_updates-3248929
  • issue/automatic_updates-3265072
  • issue/automatic_updates-3265057
  • issue/automatic_updates-3265873
  • issue/automatic_updates-3266092
  • issue/automatic_updates-3266633
  • issue/automatic_updates-3266640
  • issue/automatic_updates-3266687
  • issue/automatic_updates-3266981
  • issue/automatic_updates-3267387
  • issue/automatic_updates-3267389
  • issue/automatic_updates-3267411
  • issue/automatic_updates-3267603
  • issue/automatic_updates-3265874
  • issue/automatic_updates-3267577
  • issue/automatic_updates-3267386
  • issue/automatic_updates-3268363
  • issue/automatic_updates-3268868
  • issue/automatic_updates-3268612
  • issue/automatic_updates-3269097
  • issue/automatic_updates-3267632
  • issue/automatic_updates-3270736
  • issue/automatic_updates-3271144
  • issue/automatic_updates-3271226
  • issue/automatic_updates-3271078
  • issue/automatic_updates-3271371
  • issue/automatic_updates-3267646
  • issue/automatic_updates-3272060
  • issue/automatic_updates-3265031
  • issue/automatic_updates-3253591
  • issue/automatic_updates-3272520
  • issue/automatic_updates-3272061
  • issue/automatic_updates-3272785
  • issue/automatic_updates-3273011
  • issue/automatic_updates-3273008
  • issue/automatic_updates-3273364
  • issue/automatic_updates-3273407
  • issue/automatic_updates-3271235
  • issue/automatic_updates-3273006
  • issue/automatic_updates-3271240
  • issue/automatic_updates-3271468
  • issue/automatic_updates-3272326
  • issue/automatic_updates-3273693
  • issue/automatic_updates-3264849
  • issue/automatic_updates-3273807
  • issue/automatic_updates-3273017
  • issue/automatic_updates-3274269
  • issue/automatic_updates-3274273
  • issue/automatic_updates-3274292
  • issue/automatic_updates-3273812
  • issue/automatic_updates-3274323
  • issue/automatic_updates-3274633
  • issue/automatic_updates-3274858
  • issue/automatic_updates-3274830
  • issue/automatic_updates-3274892
  • issue/automatic_updates-3275075
  • issue/automatic_updates-3275256
  • issue/automatic_updates-3275282
  • issue/automatic_updates-3275320
  • issue/automatic_updates-3275323
  • issue/automatic_updates-3275324
  • issue/automatic_updates-3275317
  • issue/automatic_updates-3275313
  • issue/automatic_updates-3275357
  • issue/automatic_updates-3275474
  • issue/automatic_updates-3275311
  • issue/automatic_updates-3275546
  • issue/automatic_updates-3275508
  • issue/automatic_updates-3275810
  • issue/automatic_updates-3275860
  • issue/automatic_updates-3275865
  • issue/automatic_updates-3275886
  • issue/automatic_updates-3275887
  • issue/automatic_updates-3276031
  • issue/automatic_updates-3276041
  • issue/automatic_updates-3276072
  • issue/automatic_updates-3276159
  • issue/automatic_updates-3276255
  • issue/automatic_updates-3275825
  • issue/automatic_updates-3276661
  • issue/automatic_updates-3275369
  • issue/automatic_updates-3277014
  • issue/automatic_updates-3277035
  • issue/automatic_updates-3272813
  • issue/automatic_updates-3277211
  • issue/automatic_updates-3277229
  • issue/automatic_updates-3275316
  • issue/automatic_updates-3274047
  • issue/automatic_updates-3277815
  • issue/automatic_updates-3276662
  • issue/automatic_updates-3277235
  • issue/automatic_updates-3278411
  • issue/automatic_updates-3278435
  • issue/automatic_updates-3279229
  • issue/automatic_updates-3277007
  • issue/automatic_updates-3284346
  • issue/automatic_updates-3239759
  • issue/automatic_updates-3284495
  • issue/automatic_updates-3284530
  • issue/automatic_updates-3282677
  • issue/automatic_updates-3281379
  • issue/automatic_updates-3285408
  • issue/automatic_updates-3285631
  • issue/automatic_updates-3285669
  • issue/automatic_updates-3273014
  • issue/automatic_updates-3273369
  • issue/automatic_updates-3285491
  • issue/automatic_updates-3285898
  • issue/automatic_updates-3287251
  • issue/automatic_updates-3291147
  • issue/automatic_updates-3286650
  • issue/automatic_updates-3291770
  • issue/automatic_updates-3280403
  • issue/automatic_updates-3291959
  • issue/automatic_updates-3287398
  • issue/automatic_updates-3285145
  • issue/automatic_updates-3292027
  • issue/automatic_updates-3278445
  • issue/automatic_updates-3292933
  • issue/automatic_updates-3292958
  • issue/automatic_updates-3293157
  • issue/automatic_updates-3292956
  • issue/automatic_updates-3293146
  • issue/automatic_updates-3293381
  • issue/automatic_updates-3293449
  • issue/automatic_updates-3293427
  • issue/automatic_updates-3293422
  • issue/automatic_updates-3293685
  • issue/automatic_updates-3291730
  • issue/automatic_updates-3293866
  • issue/automatic_updates-3294338
  • issue/automatic_updates-3293656
  • issue/automatic_updates-3294600
  • issue/automatic_updates-3294335
  • issue/automatic_updates-3295013
  • issue/automatic_updates-3284936
  • issue/automatic_updates-3295596
  • issue/automatic_updates-3295758
  • issue/automatic_updates-3295791
  • issue/automatic_updates-3295830
  • issue/automatic_updates-3295874
  • issue/automatic_updates-3295897
  • issue/automatic_updates-3296074
  • issue/automatic_updates-3295965
  • issue/automatic_updates-3296181
  • issue/automatic_updates-3296065
  • issue/automatic_updates-3296178
  • issue/automatic_updates-3296261
  • issue/automatic_updates-3293148
  • issue/automatic_updates-3303953
  • issue/automatic_updates-3304367
  • issue/automatic_updates-3304640
  • issue/automatic_updates-3304836
  • issue/automatic_updates-3304142
  • issue/automatic_updates-3298349
  • issue/automatic_updates-3298444
  • issue/automatic_updates-3298510
  • issue/automatic_updates-3298431
  • issue/automatic_updates-3298863
  • issue/automatic_updates-3298877
  • issue/automatic_updates-3298904
  • issue/automatic_updates-3298951
  • issue/automatic_updates-3299101
  • issue/automatic_updates-3299417
  • issue/automatic_updates-3293417
  • issue/automatic_updates-3299612
  • issue/automatic_updates-3299093
  • issue/automatic_updates-3299087
  • issue/automatic_updates-3300006
  • issue/automatic_updates-3300036
  • issue/automatic_updates-3293150
  • issue/automatic_updates-3303807
  • issue/automatic_updates-3303929
  • issue/automatic_updates-3304417
  • issue/automatic_updates-3303727
  • issue/automatic_updates-3305527
  • issue/automatic_updates-3301844
  • issue/automatic_updates-3302527
  • issue/automatic_updates-3302673
  • issue/automatic_updates-3302897
  • issue/automatic_updates-3303143
  • issue/automatic_updates-3303168
  • issue/automatic_updates-3303174
  • issue/automatic_updates-3303185
  • issue/automatic_updates-3303200
  • issue/automatic_updates-3303113
  • issue/automatic_updates-3304036
  • issue/automatic_updates-3304165
  • issue/automatic_updates-3304583
  • issue/automatic_updates-3303902
  • issue/automatic_updates-3304651
  • issue/automatic_updates-3305312
  • issue/automatic_updates-3305612
  • issue/automatic_updates-3305568
  • issue/automatic_updates-3305773
  • issue/automatic_updates-3305874
  • issue/automatic_updates-3310901
  • issue/automatic_updates-3310929
  • issue/automatic_updates-3310936
  • issue/automatic_updates-3310972
  • issue/automatic_updates-3311001
  • issue/automatic_updates-3311020
  • issue/automatic_updates-3305240
  • issue/automatic_updates-3305994
  • issue/automatic_updates-3305564
  • issue/automatic_updates-3305998
  • issue/automatic_updates-3306600
  • issue/automatic_updates-3306631
  • issue/automatic_updates-3307086
  • issue/automatic_updates-3307103
  • issue/automatic_updates-3307168
  • issue/automatic_updates-3306163
  • issue/automatic_updates-3304617
  • issue/automatic_updates-3307163
  • issue/automatic_updates-3307398
  • issue/automatic_updates-3307478
  • issue/automatic_updates-3307369
  • issue/automatic_updates-3308404
  • issue/automatic_updates-3307611
  • issue/automatic_updates-3308372
  • issue/automatic_updates-3308686
  • issue/automatic_updates-3308886
  • issue/automatic_updates-3309220
  • issue/automatic_updates-3309270
  • issue/automatic_updates-3308711
  • issue/automatic_updates-3309486
  • issue/automatic_updates-3305167
  • issue/automatic_updates-3309676
  • issue/automatic_updates-3309025
  • issue/automatic_updates-3309891
  • issue/automatic_updates-3308365
  • issue/automatic_updates-3310000
  • issue/automatic_updates-3309205
  • issue/automatic_updates-3248975
  • issue/automatic_updates-3310702
  • issue/automatic_updates-3272313
  • issue/automatic_updates-3310990
  • issue/automatic_updates-3310997
  • issue/automatic_updates-3311200
  • issue/automatic_updates-3310696
  • issue/automatic_updates-3311265
  • issue/automatic_updates-3303167
  • issue/automatic_updates-3310946
  • issue/automatic_updates-3308828
  • issue/automatic_updates-3310666
  • issue/automatic_updates-3109082
  • issue/automatic_updates-3311534
  • issue/automatic_updates-3311436
  • issue/automatic_updates-3308843
  • issue/automatic_updates-3303900
  • issue/automatic_updates-3312085
  • issue/automatic_updates-3312420
  • issue/automatic_updates-3312373
  • issue/automatic_updates-3312421
  • issue/automatic_updates-3312619
  • issue/automatic_updates-3312779
  • issue/automatic_updates-3275991
  • issue/automatic_updates-3312938
  • issue/automatic_updates-3312937
  • issue/automatic_updates-3312960
  • issue/automatic_updates-3312669
  • issue/automatic_updates-3312981
  • issue/automatic_updates-3313319
  • issue/automatic_updates-3313346
  • issue/automatic_updates-3310914
  • issue/automatic_updates-3317220
  • issue/automatic_updates-3317232
  • issue/automatic_updates-3317278
  • issue/automatic_updates-3317409
  • issue/automatic_updates-3317267
  • issue/automatic_updates-3317599
  • issue/automatic_updates-3317988
  • issue/automatic_updates-3318313
  • issue/automatic_updates-3313630
  • issue/automatic_updates-3313717
  • issue/automatic_updates-3313947
  • issue/automatic_updates-3313507
  • issue/automatic_updates-3276645
  • issue/automatic_updates-3313349
  • issue/automatic_updates-3314137
  • issue/automatic_updates-3314143
  • issue/automatic_updates-3304365
  • issue/automatic_updates-3317796
  • issue/automatic_updates-3317996
  • issue/automatic_updates-3316484
  • issue/automatic_updates-3313414
  • issue/automatic_updates-3314764
  • issue/automatic_updates-3314771
  • issue/automatic_updates-3314787
  • issue/automatic_updates-3314805
  • issue/automatic_updates-3314734
  • issue/automatic_updates-3298889
  • issue/automatic_updates-3314803
  • issue/automatic_updates-3315139
  • issue/automatic_updates-3314946
  • issue/automatic_updates-3315449
  • issue/automatic_updates-3315798
  • issue/automatic_updates-3315834
  • issue/automatic_updates-3309602
  • issue/automatic_updates-3316115
  • issue/automatic_updates-3316131
  • issue/automatic_updates-3316293
  • issue/automatic_updates-3316318
  • issue/automatic_updates-3310729
  • issue/automatic_updates-3315700
  • issue/automatic_updates-3316668
  • issue/automatic_updates-3316721
  • issue/automatic_updates-3306283
  • issue/automatic_updates-3316611
  • issue/automatic_updates-3316895
  • issue/automatic_updates-3317385
  • issue/automatic_updates-3318625
  • issue/automatic_updates-3318770
  • issue/automatic_updates-3318846
  • issue/automatic_updates-3318927
  • issue/automatic_updates-3318933
  • issue/automatic_updates-3319044
  • issue/automatic_updates-3319045
  • issue/automatic_updates-3325716
  • issue/automatic_updates-3324421
  • issue/automatic_updates-3320486
  • issue/automatic_updates-3320558
  • issue/automatic_updates-3321206
  • issue/automatic_updates-3326934
  • issue/automatic_updates-3320755
  • issue/automatic_updates-3328765
  • issue/automatic_updates-3325654
  • issue/automatic_updates-3325869
  • issue/automatic_updates-3277034
  • issue/automatic_updates-3328516
  • issue/automatic_updates-3322546
  • issue/automatic_updates-3320487
  • issue/automatic_updates-3320792
  • issue/automatic_updates-3320815
  • issue/automatic_updates-3320638
  • issue/automatic_updates-3321256
  • issue/automatic_updates-3321684
  • issue/automatic_updates-3325522
  • issue/automatic_updates-3326334
  • issue/automatic_updates-3328234
  • issue/automatic_updates-3328740
  • issue/automatic_updates-3316932
  • issue/automatic_updates-3321386
  • issue/automatic_updates-3321933
  • issue/automatic_updates-3321282
  • issue/automatic_updates-3326801
  • issue/automatic_updates-3327753
  • issue/automatic_updates-3328742
  • issue/automatic_updates-3322313
  • issue/automatic_updates-3322203
  • issue/automatic_updates-3322150
  • issue/automatic_updates-3322404
  • issue/automatic_updates-3321236
  • issue/automatic_updates-3321994
  • issue/automatic_updates-3322589
  • issue/automatic_updates-3321904
  • issue/automatic_updates-3316855
  • issue/automatic_updates-3322931
  • issue/automatic_updates-3322913
  • issue/automatic_updates-3323037
  • issue/automatic_updates-3322918
  • issue/automatic_updates-3323211
  • issue/automatic_updates-3323565
  • issue/automatic_updates-3320824
  • issue/automatic_updates-3320836
  • issue/automatic_updates-3329002
  • issue/automatic_updates-3321971
  • issue/automatic_updates-3299094
  • issue/automatic_updates-3248544
  • issue/automatic_updates-3330139
  • issue/automatic_updates-3330365
  • issue/automatic_updates-3330712
  • issue/automatic_updates-3318065
  • issue/automatic_updates-3331310
  • issue/automatic_updates-3322917
  • issue/automatic_updates-3330140
  • issue/automatic_updates-3323003
  • issue/automatic_updates-3331355
  • issue/automatic_updates-3334054
  • issue/automatic_updates-3323706
  • issue/automatic_updates-3331168
  • issue/automatic_updates-3343430
  • issue/automatic_updates-3344562
  • issue/automatic_updates-3345039
  • issue/automatic_updates-3344039
  • issue/automatic_updates-3345313
  • issue/automatic_updates-3331471
  • issue/automatic_updates-3334994
  • issue/automatic_updates-3327229
  • issue/automatic_updates-3343889
  • issue/automatic_updates-3344124
  • issue/automatic_updates-3344689
  • issue/automatic_updates-3316368
  • issue/automatic_updates-3345767
  • issue/automatic_updates-3317815
  • issue/automatic_updates-3328600
  • issue/automatic_updates-3332256
  • issue/automatic_updates-3335766
  • issue/automatic_updates-3335802
  • issue/automatic_updates-3335908
  • issue/automatic_updates-3336243
  • issue/automatic_updates-3336247
  • issue/automatic_updates-3336255
  • issue/automatic_updates-3336259
  • issue/automatic_updates-3337062
  • issue/automatic_updates-3337068
  • issue/automatic_updates-3311229
  • issue/automatic_updates-3337697
  • issue/automatic_updates-3343768
  • issue/automatic_updates-3344127
  • issue/automatic_updates-3344595
  • issue/automatic_updates-3345763
  • issue/automatic_updates-3345765
  • issue/automatic_updates-3345771
  • issue/automatic_updates-3337760
  • issue/automatic_updates-3337049
  • issue/automatic_updates-3342430
  • issue/automatic_updates-3319507
  • issue/automatic_updates-3344583
  • issue/automatic_updates-3345764
  • issue/automatic_updates-3345768
  • issue/automatic_updates-3338667
  • issue/automatic_updates-3339016
  • issue/automatic_updates-3343827
  • issue/automatic_updates-3344556
  • issue/automatic_updates-3338666
  • issue/automatic_updates-3345649
  • issue/automatic_updates-3339657
  • issue/automatic_updates-3339719
  • issue/automatic_updates-3338789
  • issue/automatic_updates-3340022
  • issue/automatic_updates-3340284
  • issue/automatic_updates-3340638
  • issue/automatic_updates-3316617
  • issue/automatic_updates-3341224
  • issue/automatic_updates-3337953
  • issue/automatic_updates-3339714
  • issue/automatic_updates-3341708
  • issue/automatic_updates-3341841
  • issue/automatic_updates-3326486
  • issue/automatic_updates-3321474
  • issue/automatic_updates-3341974
  • issue/automatic_updates-3342120
  • issue/automatic_updates-3342227
  • issue/automatic_updates-3323461
  • issue/automatic_updates-3342137
  • issue/automatic_updates-3342460
  • issue/automatic_updates-3342364
  • issue/automatic_updates-3345028
  • issue/automatic_updates-3345549
  • issue/automatic_updates-3345881
  • issue/automatic_updates-3345762
  • issue/automatic_updates-3342726
  • issue/automatic_updates-3337667
  • issue/automatic_updates-3343463
  • issue/automatic_updates-3345766
  • issue/automatic_updates-3345754
  • issue/automatic_updates-3345633
  • issue/automatic_updates-3345772
  • issue/automatic_updates-3345769
  • issue/automatic_updates-3345761
  • issue/automatic_updates-3345755
  • issue/automatic_updates-3345760
  • issue/automatic_updates-3345757
  • issue/automatic_updates-3346520
  • issue/automatic_updates-3346545
  • issue/automatic_updates-3337054
  • issue/automatic_updates-3346628
  • issue/automatic_updates-3346717
  • issue/automatic_updates-3346594
  • issue/automatic_updates-3346659
  • issue/automatic_updates-3347031
  • issue/automatic_updates-3346547
  • issue/automatic_updates-3347164
  • issue/automatic_updates-3318306
  • issue/automatic_updates-3345646
  • issue/automatic_updates-3347165
  • issue/automatic_updates-3347959
  • issue/automatic_updates-3347267
  • issue/automatic_updates-3338346
  • issue/automatic_updates-3348122
  • issue/automatic_updates-3348129
  • issue/automatic_updates-3348162
  • issue/automatic_updates-3348276
  • issue/automatic_updates-3348441
  • issue/automatic_updates-3351604
  • issue/automatic_updates-3316843
  • issue/automatic_updates-3351908
  • issue/automatic_updates-3352731
  • issue/automatic_updates-3352898
  • issue/automatic_updates-3348866
  • issue/automatic_updates-3342817
  • issue/automatic_updates-3348159
  • issue/automatic_updates-3349142
  • issue/automatic_updates-3349966
  • issue/automatic_updates-3350909
  • issue/automatic_updates-3351594
  • issue/automatic_updates-3351883
  • issue/automatic_updates-3351925
  • issue/automatic_updates-3352198
  • issue/automatic_updates-3334552
  • issue/automatic_updates-3342790
  • issue/automatic_updates-3345222
  • issue/automatic_updates-3351212
  • issue/automatic_updates-3351093
  • issue/automatic_updates-3351247
  • issue/automatic_updates-3351962
  • issue/automatic_updates-3345641
  • issue/automatic_updates-3338940
  • issue/automatic_updates-3343721
  • issue/automatic_updates-3351069
  • issue/automatic_updates-3353219
  • issue/automatic_updates-3159920
  • issue/automatic_updates-3352355
  • issue/automatic_updates-3341469
  • issue/automatic_updates-3354099
  • issue/automatic_updates-3339659
  • issue/automatic_updates-3354312
  • issue/automatic_updates-3351895
  • issue/automatic_updates-3354249
  • issue/automatic_updates-3353270
  • issue/automatic_updates-3354003
  • issue/automatic_updates-3355074
  • issue/automatic_updates-3355094
  • issue/automatic_updates-3355105
  • issue/automatic_updates-3355162
  • issue/automatic_updates-3355446
  • issue/automatic_updates-3355045
  • issue/automatic_updates-3355558
  • issue/automatic_updates-3355553
  • issue/automatic_updates-3354594
  • issue/automatic_updates-3355609
  • issue/automatic_updates-3354325
  • issue/automatic_updates-3356395
  • issue/automatic_updates-3356638
  • issue/automatic_updates-3356640
  • issue/automatic_updates-3354701
  • issue/automatic_updates-3355463
  • issue/automatic_updates-3356804
  • issue/automatic_updates-3357721
  • issue/automatic_updates-3357578
  • issue/automatic_updates-3357657
  • issue/automatic_updates-3304108
  • issue/automatic_updates-3357941
  • issue/automatic_updates-3358012
  • issue/automatic_updates-3345535
  • issue/automatic_updates-3354827
  • issue/automatic_updates-3358570
  • issue/automatic_updates-3358878
  • issue/automatic_updates-3355628
  • issue/automatic_updates-3358504
  • issue/automatic_updates-3357969
  • issue/automatic_updates-3359609
  • issue/automatic_updates-3359727
  • issue/automatic_updates-3359825
  • issue/automatic_updates-3359820
  • issue/automatic_updates-3360548
  • issue/automatic_updates-3357480
  • issue/automatic_updates-3360656
  • issue/automatic_updates-3360763
  • issue/automatic_updates-3360655
  • issue/automatic_updates-3355618
  • issue/automatic_updates-3349351
  • issue/automatic_updates-3362110
  • issue/automatic_updates-3362143
  • issue/automatic_updates-3362589
  • issue/automatic_updates-3349004
  • issue/automatic_updates-3362507
  • issue/automatic_updates-3362746
  • issue/automatic_updates-3362978
  • issue/automatic_updates-3363259
  • issue/automatic_updates-3363725
  • issue/automatic_updates-3363926
  • issue/automatic_updates-3363937
  • issue/automatic_updates-3364514
  • issue/automatic_updates-3284443
  • issue/automatic_updates-3363938
  • issue/automatic_updates-3364731
  • issue/automatic_updates-3364748
  • issue/automatic_updates-3364735
  • issue/automatic_updates-3364725
  • issue/automatic_updates-3359670
  • issue/automatic_updates-3365133
  • issue/automatic_updates-3365151
  • issue/automatic_updates-3365177
  • issue/automatic_updates-3364958
  • issue/automatic_updates-3365390
  • issue/automatic_updates-3365414
  • issue/automatic_updates-3346644
  • issue/automatic_updates-3366267
  • issue/automatic_updates-3366289
  • issue/automatic_updates-3366499
  • issue/automatic_updates-3365437
  • issue/automatic_updates-3354914
  • issue/automatic_updates-3253828
  • issue/automatic_updates-3345484
  • issue/automatic_updates-3352846
  • issue/automatic_updates-3368741
  • issue/automatic_updates-3406008
  • issue/automatic_updates-3406122
  • issue/automatic_updates-3370197
  • issue/automatic_updates-3366271
  • issue/automatic_updates-3364135
  • issue/automatic_updates-3370603
  • issue/automatic_updates-3400146
  • issue/automatic_updates-3406010
  • issue/automatic_updates-3404429
  • issue/automatic_updates-3371212
  • issue/automatic_updates-3371076
  • issue/automatic_updates-3372673
  • issue/automatic_updates-3368808
  • issue/automatic_updates-3374175
  • issue/automatic_updates-3374739
  • issue/automatic_updates-3374753
  • issue/automatic_updates-3375679
  • issue/automatic_updates-3377237
  • issue/automatic_updates-3377245
  • issue/automatic_updates-3378774
  • issue/automatic_updates-3378793
  • issue/automatic_updates-3360485
  • issue/automatic_updates-3380698
  • issue/automatic_updates-3375940
  • issue/automatic_updates-3381294
  • issue/automatic_updates-3381484
  • issue/automatic_updates-3382942
  • issue/automatic_updates-3383462
  • issue/automatic_updates-3383451
  • issue/automatic_updates-3384359
  • issue/automatic_updates-3384637
  • issue/automatic_updates-3375640
  • issue/automatic_updates-3386135
  • issue/automatic_updates-3386533
  • issue/automatic_updates-3387610
  • issue/automatic_updates-3387637
  • issue/automatic_updates-3387656
  • issue/automatic_updates-3389157
  • issue/automatic_updates-3388965
  • issue/automatic_updates-3387379
  • issue/automatic_updates-3390493
  • issue/automatic_updates-3308235
  • issue/automatic_updates-3391715
  • issue/automatic_updates-3392246
  • issue/automatic_updates-3393633
  • issue/automatic_updates-3379344
  • issue/automatic_updates-3394413
  • issue/automatic_updates-3394705
  • issue/automatic_updates-3394936
  • issue/automatic_updates-3363497
  • issue/automatic_updates-3395782
  • issue/automatic_updates-3341406
  • issue/automatic_updates-3311472
  • issue/automatic_updates-3397228
  • issue/automatic_updates-3352654
  • issue/automatic_updates-3398782
  • issue/automatic_updates-3399147
  • issue/automatic_updates-3399155
  • issue/automatic_updates-3406812
  • issue/automatic_updates-3408483
  • issue/automatic_updates-3408488
  • issue/automatic_updates-3408560
  • issue/automatic_updates-3437633
  • issue/automatic_updates-3408835
  • issue/automatic_updates-3408937
  • issue/automatic_updates-3409491
  • issue/automatic_updates-3409519
  • issue/automatic_updates-3377458
  • issue/automatic_updates-3437951
  • issue/automatic_updates-3409774
  • issue/automatic_updates-3410047
  • issue/automatic_updates-3411110
  • issue/automatic_updates-3411241
  • issue/automatic_updates-3411276
  • issue/automatic_updates-3411392
  • issue/automatic_updates-3411240
  • issue/automatic_updates-3412630
  • issue/automatic_updates-3413866
  • issue/automatic_updates-3414168
  • issue/automatic_updates-3415291
  • issue/automatic_updates-3415389
  • issue/automatic_updates-3415403
  • issue/automatic_updates-3416768
  • issue/automatic_updates-3417905
  • issue/automatic_updates-3420188
  • issue/automatic_updates-3421641
  • issue/automatic_updates-3424290
  • issue/automatic_updates-3426229
  • issue/automatic_updates-3426666
  • issue/automatic_updates-3426716
  • issue/automatic_updates-3428199
  • issue/automatic_updates-3436741
  • issue/automatic_updates-3441923
  • issue/automatic_updates-3428651
  • issue/automatic_updates-3441799
  • issue/automatic_updates-3443249
  • issue/automatic_updates-3428922
  • issue/automatic_updates-3441817
  • issue/automatic_updates-3429248
  • issue/automatic_updates-3440646
  • issue/automatic_updates-3437877
  • issue/automatic_updates-3445149
  • issue/automatic_updates-3429268
  • issue/automatic_updates-3442153
  • issue/automatic_updates-3438156
  • issue/automatic_updates-3436993
  • issue/automatic_updates-3437704
  • issue/automatic_updates-3432496
  • issue/automatic_updates-3440006
  • issue/automatic_updates-3435893
  • issue/automatic_updates-3441577
  • issue/automatic_updates-3437023
  • issue/automatic_updates-3432391
  • issue/automatic_updates-3432447
  • issue/automatic_updates-3432472
  • issue/automatic_updates-3432489
  • issue/automatic_updates-3432476
  • issue/automatic_updates-3435918
  • issue/automatic_updates-3439067
  • issue/automatic_updates-3437409
  • issue/automatic_updates-3449093
  • issue/automatic_updates-3449480
  • issue/automatic_updates-3449519
  • issue/automatic_updates-3449631
  • issue/automatic_updates-3449636
  • issue/automatic_updates-3449689
  • issue/automatic_updates-3449693
  • issue/automatic_updates-3450884
  • issue/automatic_updates-3452870
  • issue/automatic_updates-3453030
  • issue/automatic_updates-3455161
  • issue/automatic_updates-3459557
  • issue/automatic_updates-3462138
  • issue/automatic_updates-3462168
  • issue/automatic_updates-3462883
  • issue/automatic_updates-3463662
  • issue/automatic_updates-3463813
  • issue/automatic_updates-3446371
  • issue/automatic_updates-3465155
  • issue/automatic_updates-3340355
  • issue/automatic_updates-3467749
  • issue/automatic_updates-3473410
  • issue/automatic_updates-3441926
  • issue/automatic_updates-3474603
  • issue/automatic_updates-3484802
  • issue/automatic_updates-3498586
  • issue/automatic_updates-3499481
  • issue/automatic_updates-3498018
  • issue/automatic_updates-3506632
  • issue/automatic_updates-3511959
  • issue/automatic_updates-3511943
981 results
Show changes
Showing
with 592 additions and 588 deletions
......@@ -20,5 +20,6 @@
"name": "drupal/core-dev",
"version": "9.8.0"
}
]
],
"dev-package-names": []
}
<?php
namespace Drupal\Tests\package_manager\Kernel;
use Drupal\Tests\package_manager\Traits\FixtureUtilityTrait;
use PHPUnit\Framework\AssertionFailedError;
/**
* @coversDefaultClass \Drupal\Tests\package_manager\Traits\FixtureUtilityTrait
*
* @group package_manager
*/
class FixtureUtilityTraitTest extends PackageManagerKernelTestBase {
use FixtureUtilityTrait;
/**
* The root directory of the virtual project.
*
* @var string
*/
private string $dir;
/**
* {@inheritdoc}
*/
protected function setUp(): void {
parent::setUp();
$this->dir = $this->container->get('package_manager.path_locator')
->getProjectRoot();
$this->addPackage($this->dir, ['name' => 'my/package']);
$this->addPackage($this->dir, [
'name' => 'my/dev-package',
'version' => '2.1.0',
'dev_requirement' => TRUE,
]);
}
/**
* @covers ::addPackage
*/
public function testAddPackage(): void {
// Packages cannot be added without a name.
try {
$this->addPackage($this->dir, ['type' => 'unknown']);
$this->fail('Adding an anonymous package should raise an error.');
}
catch (AssertionFailedError $e) {
$this->assertSame("Failed asserting that an array has the key 'name'.", $e->getMessage());
}
// We should not be able to add an existing package.
try {
$this->addPackage($this->dir, ['name' => 'my/package']);
$this->fail('Trying to add an existing package should raise an error.');
}
catch (AssertionFailedError $e) {
$this->assertStringContainsString("Expected package 'my/package' to not be installed, but it was.", $e->getMessage());
}
$expected_packages = [
'my/package' => [
'name' => 'my/package',
],
'my/dev-package' => [
'name' => 'my/dev-package',
'version' => '2.1.0',
'dev_requirement' => TRUE,
],
];
[$installed_json, $installed_php] = $this->getData();
$installed_json['packages'] = array_intersect_key($installed_json['packages'], $expected_packages);
$this->assertSame($expected_packages, $installed_json['packages']);
$this->assertContains('my/dev-package', $installed_json['dev-package-names']);
$this->assertNotContains('my/package', $installed_json['dev-package-names']);
$this->assertSame($expected_packages, $installed_php);
}
/**
* @covers ::modifyPackage
*/
public function testModifyPackage(): void {
// We should not be able to modify a non-existent package.
try {
$this->modifyPackage($this->dir, 'junk/drawer', ['type' => 'library']);
$this->fail('Modifying a non-existent package should raise an error.');
}
catch (AssertionFailedError $e) {
$this->assertStringContainsString("Expected package 'junk/drawer' to be installed, but it wasn't.", $e->getMessage());
}
// Add a key to an existing package.
$this->modifyPackage($this->dir, 'my/package', ['type' => 'metapackage']);
// Change a key in an existing package.
$this->modifyPackage($this->dir, 'my/dev-package', ['version' => '3.2.1']);
// Move an existing package to dev requirements.
$this->addPackage($this->dir, [
'name' => 'my/other-package',
'type' => 'library',
]);
$this->modifyPackage($this->dir, 'my/other-package', ['dev_requirement' => TRUE]);
$expected_packages = [
'my/package' => [
'name' => 'my/package',
'type' => 'metapackage',
],
'my/dev-package' => [
'name' => 'my/dev-package',
'version' => '3.2.1',
'dev_requirement' => TRUE,
],
'my/other-package' => [
'name' => 'my/other-package',
'type' => 'library',
'dev_requirement' => TRUE,
],
];
[$installed_json, $installed_php] = $this->getData();
$installed_json['packages'] = array_intersect_key($installed_json['packages'], $expected_packages);
$this->assertSame($expected_packages, $installed_json['packages']);
$this->assertContains('my/dev-package', $installed_json['dev-package-names']);
$this->assertContains('my/other-package', $installed_json['dev-package-names']);
$this->assertNotContains('my/package', $installed_json['dev-package-names']);
$this->assertSame($expected_packages, $installed_php);
}
/**
* @covers ::removePackage
*/
public function testRemovePackage(): void {
// We should not be able to remove a package that's not installed.
try {
$this->removePackage($this->dir, 'junk/drawer');
$this->fail('Removing a non-existent package should raise an error.');
}
catch (AssertionFailedError $e) {
$this->assertStringContainsString("Expected package 'junk/drawer' to be installed, but it wasn't.", $e->getMessage());
}
$this->removePackage($this->dir, 'my/package');
$this->removePackage($this->dir, 'my/dev-package');
foreach (['json', 'php'] as $extension) {
$contents = file_get_contents("$this->dir/vendor/composer/installed.$extension");
$this->assertStringNotContainsString('my/package', $contents);
$this->assertStringNotContainsString('my/dev-package', $contents);
}
}
/**
* Returns the data from installed.php and installed.json.
*
* @return array[]
* An array of two arrays. The first array will be the contents of
* installed.json, with the `packages` array keyed by package name. The
* second array will be the `versions` array from installed.php.
*/
private function getData(): array {
$installed_json = file_get_contents("$this->dir/vendor/composer/installed.json");
$installed_json = json_decode($installed_json, TRUE, 512, JSON_THROW_ON_ERROR);
$keyed_packages = [];
foreach ($installed_json['packages'] as $package) {
$keyed_packages[$package['name']] = $package;
}
$installed_json['packages'] = $keyed_packages;
$installed_php = require "$this->dir/vendor/composer/installed.php";
return [
$installed_json,
$installed_php['versions'],
];
}
}
......@@ -2,6 +2,7 @@
namespace Drupal\Tests\package_manager\Traits;
use Drupal\Component\Utility\NestedArray;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Iterator\RecursiveDirectoryIterator;
......@@ -76,4 +77,126 @@ trait FixtureUtilityTrait {
}
}
/**
* Adds a package.
*
* @param string $dir
* The root Composer-managed directory (e.g., the project root or staging
* area).
* @param array $package
* The package info that should be added to installed.json and
* installed.php. Must include a `name` key.
*/
protected function addPackage(string $dir, array $package): void {
$this->assertArrayHasKey('name', $package);
$this->setPackage($dir, $package['name'], $package, FALSE);
}
/**
* Modifies a package's installed info.
*
* @param string $dir
* The root Composer-managed directory (e.g., the project root or staging
* area).
* @param string $name
* The name of the package to modify.
* @param array $package
* The package info that should be updated in installed.json and
* installed.php.
*/
protected function modifyPackage(string $dir, string $name, array $package): void {
$this->setPackage($dir, $name, $package, TRUE);
}
/**
* Removes a package.
*
* @param string $dir
* The root Composer-managed directory (e.g., the project root or staging
* area).
* @param string $name
* The name of the package to remove.
*/
protected function removePackage(string $dir, string $name): void {
$this->setPackage($dir, $name, NULL, TRUE);
}
/**
* Changes a package's installation information in a particular directory.
*
* This function is internal and should not be called directly. Use
* ::addPackage(), ::modifyPackage(), and ::removePackage() instead.
*
* @param string $dir
* The root Composer-managed directory (e.g., the project root or staging
* area).
* @param string $name
* The name of the package to add, update, or remove.
* @param array|null $package
* The package information to be set in installed.json and installed.php, or
* NULL to remove it. Will be merged into the existing information if the
* package is already installed.
* @param bool $should_exist
* Whether or not the package is expected to already be installed.
*/
private function setPackage(string $dir, string $name, ?array $package, bool $should_exist): void {
$file = $dir . '/vendor/composer/installed.json';
$this->assertFileIsWritable($file);
$data = file_get_contents($file);
$data = json_decode($data, TRUE, 512, JSON_THROW_ON_ERROR);
// If the package is already installed, find its numerical index.
$position = NULL;
for ($i = 0; $i < count($data['packages']); $i++) {
if ($data['packages'][$i]['name'] === $name) {
$position = $i;
break;
}
}
// Ensure that we actually expect to find the package already installed (or
// not).
$message = $should_exist
? "Expected package '$name' to be installed, but it wasn't."
: "Expected package '$name' to not be installed, but it was.";
$this->assertSame($should_exist, isset($position), $message);
if (isset($position)) {
// If we're going to be updating the package data, merge the incoming data
// into what we already have.
if ($package) {
$package = NestedArray::mergeDeep($data['packages'][$position], $package);
}
// Remove the existing package; the array will be re-keyed by
// array_splice().
array_splice($data['packages'], $position, 1);
$data['dev-package-names'] = array_diff($data['dev-package-names'], [$name]);
$data['dev-package-names'] = array_values($data['dev-package-names']);
}
// Add the package back to the list, if we have data for it.
if ($package) {
$package['name'] = $name;
$data['packages'][] = $package;
if (!empty($package['dev_requirement'])) {
$data['dev-package-names'][] = $name;
}
}
file_put_contents($file, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
$file = $dir . '/vendor/composer/installed.php';
$this->assertFileIsWritable($file);
$data = require $file;
if ($package) {
$data['versions'][$name] = $package;
}
else {
unset($data['versions'][$name]);
}
$data = var_export($data, TRUE);
file_put_contents($file, "<?php\nreturn $data;");
}
}
# `StagedProjectsValidatorTest` Fixtures
### new_project_added
Simulates a scenario where, while updating Drupal core in a site with no non-core dependencies, a new contrib module and
a new custom module are unexpectedly installed (as runtime and dev dependencies, respectively). Additionally, two new
non-Drupal packages are installed (again, one as a runtime dependency, the other dev).
**Expectation**: The validator should complain about the new modules; the new non-Drupal packages are ignored.
### no_errors
Simulates a scenario where, while updating Drupal core in a site with two unpinned contrib dependencies (one runtime and
one dev), no Drupal packages are updated, but two non-Drupal libraries are removed (again, one a runtime dependency, the
other dev), two are updated (same arrangement), and two are added (ditto).
**Expectation**: The validator to raise no errors; changes to non-Drupal packages are ignored.
### project_removed
Simulates a scenario where, while updating Drupal core in a site with no non-core dependencies, an installed contrib
theme and an installed custom theme are unexpectedly removed (from runtime and dev dependencies, respectively).
Additionally, two installed non-Drupal packages are removed (again, one from a runtime dependency, the other dev). The
existing contrib dependencies' installed versions are unchanged.
**Expectation**: The validator should complain about the removed themes; the removed non-Drupal packages are ignored.
### version_changed
Simulates a scenario where, while updating Drupal core in a site with two unpinned contrib dependencies (one runtime and
one dev), the contrib modules are unexpectedly updated, as are two installed non-Drupal packages (again, one a runtime
dependency, the other dev).
**Expectation**: The validator should complain about the updated modules; the updated non-Drupal packages are ignored.
{
"_readme": [
"This file simulates a list of packages installed in the active directory of a virtual project.",
"It will be compared against staged.installed.json.",
"See \\Drupal\\Tests\\automatic_updates\\Kernel\\StatusCheck\\StagedProjectsValidatorTest::testErrors()"
],
"packages": [
{
"name": "drupal/core",
"version": "9.8.0",
"type": "drupal-core",
"extra": {
"drupal-scaffold": {
"file-mapping": {}
}
}
},
{
"name": "drupal/test_module",
"version": "1.3.0",
"type": "drupal-module"
},
{
"name": "other/removed",
"description": "This project is removed but there should be no error because it is not a Drupal project.",
"version": "1.3.1",
"type": "library"
},
{
"name": "drupal/dev-test_module",
"version": "1.3.0",
"type": "drupal-module"
},
{
"name": "other/dev-removed",
"description": "This project is removed but there should be no error because it is not a Drupal project.",
"version": "1.3.1",
"type": "library"
}
],
"dev": true,
"dev-package-names": [
"drupal/dev-test_module",
"other/dev-removed"
]
}
<?php
/**
* @file
*/
$projects_dir = __DIR__ . '/../../modules';
return [
'versions' => [
'drupal/test_module' => [
'type' => 'drupal-module',
'install_path' => $projects_dir . '/test_module',
],
'drupal/dev-test_module' => [
'type' => 'drupal-module',
'install_path' => $projects_dir . '/dev-test_module',
],
],
];
{
"_readme": [
"This file simulates a list of packages installed in a virtual staging area.",
"It will be compared against active.installed.json.",
"See \\Drupal\\Tests\\automatic_updates\\Kernel\\StatusCheck\\StagedProjectsValidatorTest::testErrors()"
],
"packages": [
{
"name": "drupal/core",
"version": "9.8.1",
"type": "drupal-core",
"extra": {
"drupal-scaffold": {
"file-mapping": {}
}
}
},
{
"name": "drupal/test_module",
"version": "1.3.0",
"type": "drupal-module"
},
{
"name": "drupal/test_module2",
"version": "1.3.1",
"type": "drupal-module"
},
{
"name": "other/new_project",
"description": "This is newly added project but there should be no error because it is not a drupal project",
"version": "1.3.1",
"type": "library"
},
{
"name": "drupal/dev-test_module",
"version": "1.3.0",
"type": "drupal-module"
},
{
"name": "drupal/dev-test_module2",
"version": "1.3.1",
"type": "drupal-custom-module"
},
{
"name": "other/dev-new_project",
"description": "This is newly added project but there should be no error because it is not a drupal project",
"version": "1.3.1",
"type": "library"
}
],
"dev": true,
"dev-package-names": [
"drupal/dev-test_module",
"drupal/dev-test_module2",
"other/dev-new_project"
]
}
<?php
/**
* @file
*/
$projects_dir = __DIR__ . '/../../modules';
return [
'versions' => [
'drupal/test_module' => [
'type' => 'drupal-module',
'install_path' => $projects_dir . '/test_module',
],
'drupal/dev-test_module' => [
'type' => 'drupal-module',
'install_path' => $projects_dir . '/dev-test_module',
],
'drupal/test_module2' => [
'type' => 'drupal-module',
'install_path' => $projects_dir . '/test_module2',
],
'drupal/dev-test_module2' => [
'type' => 'drupal-module',
'install_path' => $projects_dir . '/dev-test_module2',
],
'other/new_project' => [
'type' => 'library',
'install_path' => __DIR__ . '/../../new_project',
],
'other/dev-new_project' => [
'type' => 'library',
'install_path' => __DIR__ . '/../../dev-new_project',
],
],
];
{
"_readme": [
"This file simulates a list of packages installed in the active directory of a virtual project.",
"It will be compared against staged.installed.json.",
"See \\Drupal\\Tests\\automatic_updates\\Kernel\\StatusCheck\\StagedProjectsValidatorTest::testErrors()"
],
"packages": [
{
"name": "drupal/core",
"version": "9.8.0",
"type": "drupal-core",
"extra": {
"drupal-scaffold": {
"file-mapping": {}
}
}
},
{
"name": "drupal/test_module",
"version": "1.3.0",
"type": "drupal-module"
},
{
"name": "other/removed",
"description": "This project is removed but there should be no error because it is not a Drupal project.",
"version": "1.3.1",
"type": "library"
},
{
"name": "other/changed",
"description": "This project version is changed but there should be no error because it is not a Drupal project.",
"version": "1.3.1",
"type": "library"
},
{
"name": "drupal/dev-test_module",
"version": "1.3.0",
"type": "drupal-module"
},
{
"name": "other/dev-removed",
"description": "This project is removed but there should be no error because it is not a Drupal project.",
"version": "1.3.1",
"type": "library"
},
{
"name": "other/dev-changed",
"description": "This project version is changed but there should be no error because it is not a Drupal project.",
"version": "1.3.1",
"type": "library"
}
],
"dev": true,
"dev-package-names": [
"drupal/dev-test_module",
"other/dev-removed",
"other/dev-changed"
]
}
{
"_readme": [
"This file simulates a list of packages installed in a virtual staging area.",
"It will be compared against active.installed.json.",
"See \\Drupal\\Tests\\automatic_updates\\Kernel\\StatusCheck\\StagedProjectsValidatorTest::testErrors()"
],
"packages": [
{
"name": "drupal/core",
"version": "9.8.1",
"type": "drupal-core",
"extra": {
"drupal-scaffold": {
"file-mapping": {}
}
}
},
{
"name": "drupal/test_module",
"version": "1.3.0",
"type": "drupal-module"
},
{
"name": "other/new_project",
"description": "This is newly added project but there should be no error because it is not a drupal project",
"version": "1.3.1",
"type": "library"
},
{
"name": "other/changed",
"description": "This project version is changed but there should be no error because it is not a Drupal project.",
"version": "1.3.2",
"type": "library"
},
{
"name": "drupal/dev-test_module",
"version": "1.3.0",
"type": "drupal-module"
},
{
"name": "other/dev-new_project",
"description": "This is newly added project but there should be no error because it is not a drupal project",
"version": "1.3.1",
"type": "library"
},
{
"name": "other/dev-changed",
"description": "This project version is changed but there should be no error because it is not a Drupal project.",
"version": "1.3.2",
"type": "library"
}
],
"dev": true,
"dev-package-names": [
"drupal/dev-test_module",
"other/dev-new_project",
"other/dev-changed"
]
}
<?php
/**
* @file
* Simulates that 2 packages are installed in virtual staging area.
*/
$projects_dir = __DIR__ . '/../../';
return [
'versions' => [
'other/new_project' => [
'type' => 'library',
'install_path' => $projects_dir . '/other/new_project',
],
'other/dev-new_project' => [
'type' => 'library',
'install_path' => $projects_dir . '/other/dev-new_project',
],
],
];
{
"_readme": [
"This file simulates a list of packages installed in the active directory of a virtual project.",
"It will be compared against staged.installed.json.",
"See \\Drupal\\Tests\\automatic_updates\\Kernel\\StatusCheck\\StagedProjectsValidatorTest::testErrors()"
],
"packages": [
{
"name": "drupal/core",
"version": "9.8.0",
"type": "drupal-core",
"extra": {
"drupal-scaffold": {
"file-mapping": {}
}
}
},
{
"name": "drupal/test_theme",
"version": "1.3.0",
"type": "drupal-theme"
},
{
"name": "drupal/test_module2",
"version": "1.3.1",
"type": "drupal-module"
},
{
"name": "other/removed",
"description": "This project is removed but there should be no error because it is not a Drupal project.",
"version": "1.3.1",
"type": "library"
},
{
"name": "drupal/dev-test_theme",
"version": "1.3.0",
"type": "drupal-custom-theme"
},
{
"name": "drupal/dev-test_module2",
"version": "1.3.1",
"type": "drupal-module"
},
{
"name": "other/dev-removed",
"description": "This project is removed but there should be no error because it is not a Drupal project.",
"version": "1.3.1",
"type": "library"
}
],
"dev": true,
"dev-package-names": [
"drupal/dev-test_theme",
"drupal/dev-test_module2",
"other/dev-removed"
]
}
{
"_readme": [
"This file simulates a list of packages installed in a virtual staging area.",
"It will be compared against active.installed.json.",
"See \\Drupal\\Tests\\automatic_updates\\Kernel\\StatusCheck\\StagedProjectsValidatorTest::testErrors()"
],
"packages": [
{
"name": "drupal/core",
"version": "9.8.1",
"type": "drupal-core",
"extra": {
"drupal-scaffold": {
"file-mapping": {}
}
}
},
{
"name": "drupal/test_module2",
"version": "1.3.1",
"type": "drupal-module"
},
{
"name": "drupal/dev-test_module2",
"version": "1.3.1",
"type": "drupal-module"
}
],
"dev": true,
"dev-package-names": [
"drupal/dev-test_module2"
]
}
{
"_readme": [
"This file simulates a list of packages installed in the active directory of a virtual project.",
"It will be compared against staged.installed.json.",
"See \\Drupal\\Tests\\automatic_updates\\Kernel\\StatusCheck\\StagedProjectsValidatorTest::testErrors()"
],
"packages": [
{
"name": "drupal/core",
"version": "9.8.0",
"type": "drupal-core",
"extra": {
"drupal-scaffold": {
"file-mapping": {}
}
}
},
{
"name": "drupal/test_module",
"version": "1.3.0",
"type": "drupal-module"
},
{
"name": "other/changed",
"description": "This project version is changed but there should be no error because it is not a Drupal project.",
"version": "1.3.1",
"type": "library"
},
{
"name": "drupal/dev-test_module",
"version": "1.3.0",
"type": "drupal-module"
},
{
"name": "other/dev-changed",
"description": "This project version is changed but there should be no error because it is not a Drupal project.",
"version": "1.3.1",
"type": "library"
}
],
"dev": true,
"dev-package-names": [
"drupal/dev-test_module",
"other/dev-changed"
]
}
{
"_readme": [
"This file simulates a list of packages installed in a virtual staging area.",
"It will be compared against active.installed.json.",
"See \\Drupal\\Tests\\automatic_updates\\Kernel\\StatusCheck\\StagedProjectsValidatorTest::testErrors()"
],
"packages": [
{
"name": "drupal/core",
"version": "9.8.1",
"type": "drupal-core",
"extra": {
"drupal-scaffold": {
"file-mapping": {}
}
}
},
{
"name": "drupal/test_module",
"version": "1.3.1",
"type": "drupal-module"
},
{
"name": "other/changed",
"description": "This project version is changed but there should be no error because it is not a Drupal project.",
"version": "1.3.2",
"type": "library"
},
{
"name": "drupal/dev-test_module",
"version": "1.3.1",
"type": "drupal-module"
},
{
"name": "other/dev-changed",
"description": "This project version is changed but there should be no error because it is not a Drupal project.",
"version": "1.3.2",
"type": "library"
}
],
"dev": true,
"dev-package-names": [
"drupal/dev-test_module",
"other/dev-changed"
]
}
......@@ -6,6 +6,7 @@ use Drupal\package_manager\Event\PreApplyEvent;
use Drupal\package_manager\Exception\StageValidationException;
use Drupal\package_manager\ValidationResult;
use Drupal\Tests\automatic_updates\Kernel\AutomaticUpdatesKernelTestBase;
use Drupal\Tests\package_manager\Traits\FixtureUtilityTrait;
/**
* @covers \Drupal\automatic_updates\Validator\StagedProjectsValidator
......@@ -14,6 +15,8 @@ use Drupal\Tests\automatic_updates\Kernel\AutomaticUpdatesKernelTestBase;
*/
class StagedProjectsValidatorTest extends AutomaticUpdatesKernelTestBase {
use FixtureUtilityTrait;
/**
* {@inheritdoc}
*/
......@@ -29,28 +32,6 @@ class StagedProjectsValidatorTest extends AutomaticUpdatesKernelTestBase {
parent::setUp();
}
/**
* Asserts a set of validation results when staged changes are applied.
*
* @param \Drupal\package_manager\ValidationResult[] $expected_results
* The expected validation results.
*/
private function validate(array $expected_results): void {
/** @var \Drupal\automatic_updates\Updater $updater */
$updater = $this->container->get('automatic_updates.updater');
$updater->begin(['drupal' => '9.8.1']);
$updater->stage();
try {
$updater->apply();
// If no exception occurs, ensure we weren't expecting any errors.
$this->assertEmpty($expected_results);
}
catch (StageValidationException $e) {
$this->assertValidationResultsEqual($expected_results, $e->getResults());
}
}
/**
* Tests that exceptions are turned into validation errors.
*/
......@@ -72,75 +53,302 @@ class StagedProjectsValidatorTest extends AutomaticUpdatesKernelTestBase {
$this->container->get('event_dispatcher')
->addListener(PreApplyEvent::class, $listener, PHP_INT_MAX);
$this->validate([
ValidationResult::createError(["Composer could not find the config file: $composer_json\n"]),
/** @var \Drupal\automatic_updates\Updater $updater */
$updater = $this->container->get('automatic_updates.updater');
$updater->begin(['drupal' => '9.8.1']);
$updater->stage();
$error = ValidationResult::createError(["Composer could not find the config file: $composer_json\n"]);
try {
$updater->apply();
$this->fail('Expected an error, but none was raised.');
}
catch (StageValidationException $e) {
$this->assertValidationResultsEqual([$error], $e->getResults());
}
}
/**
* Tests that an error is raised if Drupal extensions are unexpectedly added.
*/
public function testProjectsAdded(): void {
$active_dir = $this->container->get('package_manager.path_locator')
->getProjectRoot();
$this->addPackage($active_dir, [
'name' => 'drupal/test_module',
'version' => '1.3.0',
'type' => 'drupal_module',
]);
$this->addPackage($active_dir, [
'name' => 'other/removed',
'version' => '1.3.1',
'type' => 'library',
]);
$this->addPackage($active_dir, [
'name' => 'drupal/dev-test_module',
'version' => '1.3.0',
'type' => 'drupal_module',
'dev_requirement' => TRUE,
]);
$this->addPackage($active_dir, [
'name' => 'other/dev-removed',
'version' => '1.3.1',
'type' => 'library',
'dev_requirement' => TRUE,
]);
$updater = $this->container->get('automatic_updates.updater');
$updater->begin(['drupal' => '9.8.1']);
$updater->stage();
$stage_dir = $updater->getStageDirectory();
$this->addPackage($stage_dir, [
'name' => 'drupal/test_module2',
'version' => '1.3.1',
'type' => 'drupal-module',
'install_path' => '../../modules/test_module2',
]);
$this->addPackage($stage_dir, [
'name' => 'drupal/dev-test_module2',
'version' => '1.3.1',
'type' => 'drupal-custom-module',
'dev_requirement' => TRUE,
'install_path' => '../../modules/dev-test_module2',
]);
// The validator shouldn't complain about these packages being added or
// removed, since it only cares about Drupal modules and themes.
$this->addPackage($stage_dir, [
'name' => 'other/new_project',
'version' => '1.3.1',
'type' => 'library',
'install_path' => '../other/new_project',
]);
$this->addPackage($stage_dir, [
'name' => 'other/dev-new_project',
'version' => '1.3.1',
'type' => 'library',
'dev_requirement' => TRUE,
'install_path' => '../other/dev-new_project',
]);
$this->removePackage($stage_dir, 'other/removed');
$this->removePackage($stage_dir, 'other/dev-removed');
$messages = [
"module 'drupal/test_module2' installed.",
"custom module 'drupal/dev-test_module2' installed.",
];
$error = ValidationResult::createError($messages, t('The update cannot proceed because the following Drupal projects were installed during the update.'));
try {
$updater->apply();
$this->fail('Expected an error, but none was raised.');
}
catch (StageValidationException $e) {
$this->assertValidationResultsEqual([$error], $e->getResults());
}
}
/**
* Tests validation errors, or lack thereof.
*
* @param string $root_fixture_directory
* A directory containing to fixtures sub-directories, 'active' and
* 'staged'.
* @param string|null $expected_summary
* The expected error summary, or NULL if no errors are expected.
* @param string[] $expected_messages
* The expected error messages, if any.
*
* @dataProvider providerErrors
* Tests that errors are raised if Drupal extensions are unexpectedly removed.
*/
public function testErrors(string $root_fixture_directory, ?string $expected_summary, array $expected_messages): void {
$this->copyFixtureFolderToActiveDirectory("$root_fixture_directory/active");
$this->copyFixtureFolderToStageDirectoryOnApply("$root_fixture_directory/staged");
$expected_results = [];
if ($expected_messages) {
// @codingStandardsIgnoreLine
$expected_results[] = ValidationResult::createError($expected_messages, t($expected_summary));
public function testProjectsRemoved(): void {
$active_dir = $this->container->get('package_manager.path_locator')
->getProjectRoot();
$this->addPackage($active_dir, [
'name' => 'drupal/test_theme',
'version' => '1.3.0',
'type' => 'drupal-theme',
]);
$this->addPackage($active_dir, [
'name' => 'drupal/test_module2',
'version' => '1.3.1',
'type' => 'drupal-module',
]);
$this->addPackage($active_dir, [
'name' => 'other/removed',
'version' => '1.3.1',
'type' => 'library',
]);
$this->addPackage($active_dir, [
'name' => 'drupal/dev-test_theme',
'version' => '1.3.0',
'type' => 'drupal-custom-theme',
'dev_requirement' => TRUE,
]);
$this->addPackage($active_dir, [
'name' => 'drupal/dev-test_module2',
'version' => '1.3.1',
'type' => 'drupal-module',
'dev_requirement' => TRUE,
]);
$this->addPackage($active_dir, [
'name' => 'other/dev-removed',
'version' => '1.3.1',
'type' => 'library',
'dev_requirement' => TRUE,
]);
$updater = $this->container->get('automatic_updates.updater');
$updater->begin(['drupal' => '9.8.1']);
$updater->stage();
$stage_dir = $updater->getStageDirectory();
$this->removePackage($stage_dir, 'drupal/test_theme');
$this->removePackage($stage_dir, 'drupal/dev-test_theme');
// The validator shouldn't complain about these packages being removed,
// since it only cares about Drupal modules and themes.
$this->removePackage($stage_dir, 'other/removed');
$this->removePackage($stage_dir, 'other/dev-removed');
$messages = [
"theme 'drupal/test_theme' removed.",
"custom theme 'drupal/dev-test_theme' removed.",
];
$error = ValidationResult::createError($messages, t('The update cannot proceed because the following Drupal projects were removed during the update.'));
try {
$updater->apply();
$this->fail('Expected an error, but none was raised.');
}
catch (StageValidationException $e) {
$this->assertValidationResultsEqual([$error], $e->getResults());
}
$this->validate($expected_results);
}
/**
* Data provider for testErrors().
*
* @return \string[][]
* The test cases.
* Tests that errors are raised if Drupal extensions are unexpectedly updated.
*/
public function providerErrors(): array {
$fixtures_folder = __DIR__ . '/../../../fixtures/StagedProjectsValidatorTest';
return [
'new_project_added' => [
"$fixtures_folder/new_project_added",
'The update cannot proceed because the following Drupal projects were installed during the update.',
[
"module 'drupal/test_module2' installed.",
"custom module 'drupal/dev-test_module2' installed.",
],
],
'project_removed' => [
"$fixtures_folder/project_removed",
'The update cannot proceed because the following Drupal projects were removed during the update.',
[
"theme 'drupal/test_theme' removed.",
"custom theme 'drupal/dev-test_theme' removed.",
],
],
'version_changed' => [
"$fixtures_folder/version_changed",
'The update cannot proceed because the following Drupal projects were unexpectedly updated. Only Drupal Core updates are currently supported.',
[
"module 'drupal/test_module' from 1.3.0 to 1.3.1.",
"module 'drupal/dev-test_module' from 1.3.0 to 1.3.1.",
],
],
'no_errors' => [
"$fixtures_folder/no_errors",
NULL,
[],
],
public function testVersionsChanged(): void {
$active_dir = $this->container->get('package_manager.path_locator')
->getProjectRoot();
$this->addPackage($active_dir, [
'name' => 'drupal/test_module',
'version' => '1.3.0',
'type' => 'drupal-module',
]);
$this->addPackage($active_dir, [
'name' => 'other/changed',
'version' => '1.3.1',
'type' => 'library',
]);
$this->addPackage($active_dir, [
'name' => 'drupal/dev-test_module',
'version' => '1.3.0',
'type' => 'drupal-module',
'dev_requirement' => TRUE,
]);
$this->addPackage($active_dir, [
'name' => 'other/dev-changed',
'version' => '1.3.1',
'type' => 'library',
'dev_requirement' => TRUE,
]);
$updater = $this->container->get('automatic_updates.updater');
$updater->begin(['drupal' => '9.8.1']);
$updater->stage();
$stage_dir = $updater->getStageDirectory();
$this->modifyPackage($stage_dir, 'drupal/test_module', [
'version' => '1.3.1',
]);
$this->modifyPackage($stage_dir, 'drupal/dev-test_module', [
'version' => '1.3.1',
]);
// The validator shouldn't complain about these packages being updated,
// because it only cares about Drupal modules and themes.
$this->modifyPackage($stage_dir, 'other/changed', [
'version' => '1.3.2',
]);
$this->modifyPackage($stage_dir, 'other/dev-changed', [
'version' => '1.3.2',
]);
$messages = [
"module 'drupal/test_module' from 1.3.0 to 1.3.1.",
"module 'drupal/dev-test_module' from 1.3.0 to 1.3.1.",
];
$error = ValidationResult::createError($messages, t('The update cannot proceed because the following Drupal projects were unexpectedly updated. Only Drupal Core updates are currently supported.'));
try {
$updater->apply();
$this->fail('Expected an error, but none was raised.');
}
catch (StageValidationException $e) {
$this->assertValidationResultsEqual([$error], $e->getResults());
}
}
/**
* Tests that no errors occur if only core and its dependencies are updated.
*/
public function testNoErrors(): void {
$active_dir = $this->container->get('package_manager.path_locator')
->getProjectRoot();
$this->addPackage($active_dir, [
'name' => 'drupal/test_module',
'version' => '1.3.0',
'type' => 'drupal-module',
]);
$this->addPackage($active_dir, [
'name' => 'other/removed',
'version' => '1.3.1',
'type' => 'library',
]);
$this->addPackage($active_dir, [
'name' => 'other/changed',
'version' => '1.3.1',
'type' => 'library',
]);
$this->addPackage($active_dir, [
'name' => 'drupal/dev-test_module',
'version' => '1.3.0',
'type' => 'drupal-module',
'dev_requirement' => TRUE,
]);
$this->addPackage($active_dir, [
'name' => 'other/dev-removed',
'version' => '1.3.1',
'type' => 'library',
'dev_requirement' => TRUE,
]);
$this->addPackage($active_dir, [
'name' => 'other/dev-changed',
'version' => '1.3.1',
'type' => 'library',
'dev_requirement' => TRUE,
]);
$updater = $this->container->get('automatic_updates.updater');
$updater->begin(['drupal' => '9.8.1']);
$updater->stage();
$stage_dir = $updater->getStageDirectory();
$this->modifyPackage($stage_dir, 'drupal/core', [
'version' => '9.8.1',
]);
// The validator shouldn't care what happens to these packages, since it
// only concerns itself with Drupal modules and themes.
$this->addPackage($stage_dir, [
'name' => 'other/new_project',
'version' => '1.3.1',
'type' => 'library',
'install_path' => '../other/new_project',
]);
$this->addPackage($stage_dir, [
'name' => 'other/dev-new_project',
'version' => '1.3.1',
'type' => 'library',
'dev_requirement' => TRUE,
'install_path' => '../other/dev-new_project',
]);
$this->modifyPackage($stage_dir, 'other/changed', [
'version' => '1.3.2',
]);
$this->modifyPackage($stage_dir, 'other/dev-changed', [
'version' => '1.3.2',
]);
$this->removePackage($stage_dir, 'other/removed');
$this->removePackage($stage_dir, 'other/dev-removed');
$updater->apply();
}
}