@@ -56,6 +56,7 @@ function fetchAllData($url, Client $client) {
56
56
57
57
// Security releases
58
58
$ results = fetchAllData ('https://www.drupal.org/api-d7/node.json?type=project_release&taxonomy_vocabulary_7=100&field_release_build_type=static ' , $ client );
59
+ $ securityVersions = [];
59
60
foreach ($ results as $ result ) {
60
61
$ nid = $ result ->field_release_project ->id ;
61
62
$ core = (int ) substr ($ result ->field_release_version , 0 , 1 );
@@ -73,18 +74,33 @@ function fetchAllData($url, Client $client) {
73
74
}
74
75
75
76
try {
76
- $ is_core = ($ project ->field_project_machine_name == 'drupal ' ) ? TRUE : FALSE ;
77
- $ constraint = VersionParser::generateRangeConstraint ($ result ->field_release_version , $ is_core );
78
- if (!$ constraint ) {
79
- throw new InvalidArgumentException ('Invalid version number. ' );
77
+ $ is_core = ($ project ->field_project_machine_name == 'drupal ' );
78
+ $ versionGroup = $ result ->field_release_version_major . (($ is_core && $ core == 8 ) ? '. ' . $ result ->field_release_version_minor : '' );
79
+
80
+ if (empty ($ securityVersions [$ core ]['drupal/ ' . $ project ->field_project_machine_name ][$ versionGroup ])
81
+ ||
82
+ version_compare ($ securityVersions [$ core ]['drupal/ ' . $ project ->field_project_machine_name ][$ versionGroup ], $ result ->field_release_version , '< ' )
83
+ ) {
84
+ $ securityVersions [$ core ]['drupal/ ' . $ project ->field_project_machine_name ][$ versionGroup ] = $ result ->field_release_version ;
80
85
}
81
- $ conflict [$ core ]['drupal/ ' . $ project ->field_project_machine_name ][] = $ constraint ;
82
86
} catch (\Exception $ e ) {
83
87
// @todo: log exception
84
88
continue ;
85
89
}
86
90
}
87
91
92
+ foreach ($ securityVersions as $ core => $ packages ) {
93
+ foreach ($ packages as $ package => $ majorVersions ) {
94
+ foreach ($ majorVersions as $ versionGroup => $ version ) {
95
+ $ constraint = VersionParser::generateRangeConstraint ($ version , ($ package == 'drupal/drupal ' ));
96
+ if (!$ constraint ) {
97
+ throw new InvalidArgumentException ('Invalid version number. ' );
98
+ }
99
+ $ conflict [$ core ][$ package ][] = $ constraint ;
100
+ }
101
+ }
102
+ }
103
+
88
104
// Insecure releases
89
105
$ results = fetchAllData ('https://www.drupal.org/api-d7/node.json?type=project_release&taxonomy_vocabulary_7=188131&field_release_build_type=static ' , $ client );
90
106
foreach ($ results as $ result ) {
@@ -104,7 +120,23 @@ function fetchAllData($url, Client $client) {
104
120
}
105
121
106
122
try {
107
- $ is_core = ($ project ->field_project_machine_name == 'drupal ' ) ? TRUE : FALSE ;
123
+ $ is_core = ($ project ->field_project_machine_name == 'drupal ' );
124
+ $ versionGroup = $ result ->field_release_version_major . (($ is_core && $ core == 8 ) ? '. ' . $ result ->field_release_version_minor : '' );
125
+
126
+ // Cleanup core versions prior to SemVer (e.g. 8.0-alpha1).
127
+ if ($ is_core && $ core == 8 && empty ($ result ->field_release_version_patch )) {
128
+ continue ;
129
+ }
130
+
131
+ // Filter any individual releases older than a security release.
132
+ if (
133
+ !empty ($ securityVersions [$ core ]['drupal/ ' . $ project ->field_project_machine_name ][$ versionGroup ])
134
+ &&
135
+ version_compare ($ securityVersions [$ core ]['drupal/ ' . $ project ->field_project_machine_name ][$ versionGroup ], $ result ->field_release_version , '> ' )
136
+ ) {
137
+ continue ;
138
+ }
139
+
108
140
$ constraint = VersionParser::generateExplicitConstraint ($ result ->field_release_version , $ is_core );
109
141
if (!$ constraint ) {
110
142
throw new InvalidArgumentException ('Invalid version number. ' );
@@ -131,7 +163,11 @@ function fetchAllData($url, Client $client) {
131
163
];
132
164
133
165
foreach ($ packages as $ package => $ constraints ) {
134
- natsort ($ constraints );
166
+ usort ($ constraints , function ($ a , $ b ) {
167
+ preg_match ('/<?(\d+(?:.\d+)+?(?:-.+)?)$/ ' , $ a , $ aMatches );
168
+ preg_match ('/<?(\d+(?:.\d+)+?(?:-.+)?)$/ ' , $ b , $ bMatches );
169
+ return version_compare ($ aMatches [1 ], $ bMatches [1 ]);
170
+ });
135
171
$ composer ['conflict ' ][$ package ] = implode ('| ' , $ constraints );
136
172
}
137
173
0 commit comments