Skip to content

Commit e6e504a

Browse files
committed
Fixes microsoft#4106: Make 0.x.y extensions compatible with 1.z.t vscode versions
1 parent 1d35290 commit e6e504a

2 files changed

Lines changed: 140 additions & 16 deletions

File tree

src/vs/platform/extensions/node/extensionValidator.ts

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,38 +119,60 @@ export function isValidVersion(_version: string | INormalizedVersion, _desiredVe
119119
return false;
120120
}
121121

122-
if (version.majorBase < desiredVersion.majorBase) {
122+
let majorBase = version.majorBase;
123+
let minorBase = version.minorBase;
124+
let patchBase = version.patchBase;
125+
126+
let desiredMajorBase = desiredVersion.majorBase;
127+
let desiredMinorBase = desiredVersion.minorBase;
128+
let desiredPatchBase = desiredVersion.patchBase;
129+
130+
let majorMustEqual = desiredVersion.majorMustEqual;
131+
let minorMustEqual = desiredVersion.minorMustEqual;
132+
let patchMustEqual = desiredVersion.patchMustEqual;
133+
134+
// Anything < 1.0.0 is compatible with >= 1.0.0, except exact matches
135+
if (majorBase === 1 && desiredMajorBase === 0 && (!majorMustEqual || !minorMustEqual || !patchMustEqual)) {
136+
desiredMajorBase = 1;
137+
desiredMinorBase = 0;
138+
desiredPatchBase = 0;
139+
majorMustEqual = true;
140+
minorMustEqual = false;
141+
patchMustEqual = false;
142+
}
143+
144+
if (majorBase < desiredMajorBase) {
123145
// smaller major version
124146
return false;
125147
}
126148

127-
if (version.majorBase > desiredVersion.majorBase) {
149+
if (majorBase > desiredMajorBase) {
128150
// higher major version
129-
return (!desiredVersion.majorMustEqual);
151+
return (!majorMustEqual);
130152
}
131153

132154
// at this point, majorBase are equal
133155

134-
if (version.minorBase < desiredVersion.minorBase) {
156+
if (minorBase < desiredMinorBase) {
135157
// smaller minor version
136158
return false;
137159
}
138160

139-
if (version.minorBase > desiredVersion.minorBase) {
161+
if (minorBase > desiredMinorBase) {
140162
// higher minor version
141-
return (!desiredVersion.minorMustEqual);
163+
return (!minorMustEqual);
142164
}
143165

144166
// at this point, minorBase are equal
145167

146-
if (version.patchBase < desiredVersion.patchBase) {
168+
if (patchBase < desiredPatchBase) {
147169
// smaller patch version
148170
return false;
149171
}
150172

151-
if (version.patchBase > desiredVersion.patchBase) {
173+
if (patchBase > desiredPatchBase) {
152174
// higher patch version
153-
return (!desiredVersion.patchMustEqual);
175+
return (!patchMustEqual);
154176
}
155177

156178
// at this point, patchBase are equal

src/vs/platform/extensions/test/node/extensionValidator.test.ts

Lines changed: 109 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -139,14 +139,60 @@ suite('Extension Version Validator', () => {
139139
testIsValidVersion('0.11.0', '^0.10.0', false);
140140
testIsValidVersion('0.11.0', '*', true);
141141

142+
// Anything < 1.0.0 is compatible
143+
142144
testIsValidVersion('1.0.0', 'x.x.x', true);
143-
testIsValidVersion('1.0.0', '0.x.x', false);
145+
testIsValidVersion('1.0.0', '0.x.x', true);
144146
testIsValidVersion('1.0.0', '0.10.0', false);
145147
testIsValidVersion('1.0.0', '0.10.2', false);
146-
testIsValidVersion('1.0.0', '^0.10.2', false);
147-
testIsValidVersion('1.0.0', '0.10.x', false);
148-
testIsValidVersion('1.0.0', '^0.10.0', false);
148+
testIsValidVersion('1.0.0', '^0.10.2', true);
149+
testIsValidVersion('1.0.0', '0.10.x', true);
150+
testIsValidVersion('1.0.0', '^0.10.0', true);
151+
testIsValidVersion('1.0.0', '1.0.0', true);
152+
testIsValidVersion('1.0.0', '^1.0.0', true);
153+
testIsValidVersion('1.0.0', '^2.0.0', false);
149154
testIsValidVersion('1.0.0', '*', true);
155+
156+
testIsValidVersion('1.0.100', 'x.x.x', true);
157+
testIsValidVersion('1.0.100', '0.x.x', true);
158+
testIsValidVersion('1.0.100', '0.10.0', false);
159+
testIsValidVersion('1.0.100', '0.10.2', false);
160+
testIsValidVersion('1.0.100', '^0.10.2', true);
161+
testIsValidVersion('1.0.100', '0.10.x', true);
162+
testIsValidVersion('1.0.100', '^0.10.0', true);
163+
testIsValidVersion('1.0.100', '1.0.0', false);
164+
testIsValidVersion('1.0.100', '^1.0.0', true);
165+
testIsValidVersion('1.0.100', '^1.0.1', true);
166+
testIsValidVersion('1.0.100', '^2.0.0', false);
167+
testIsValidVersion('1.0.100', '*', true);
168+
169+
testIsValidVersion('1.100.0', 'x.x.x', true);
170+
testIsValidVersion('1.100.0', '0.x.x', true);
171+
testIsValidVersion('1.100.0', '0.10.0', false);
172+
testIsValidVersion('1.100.0', '0.10.2', false);
173+
testIsValidVersion('1.100.0', '^0.10.2', true);
174+
testIsValidVersion('1.100.0', '0.10.x', true);
175+
testIsValidVersion('1.100.0', '^0.10.0', true);
176+
testIsValidVersion('1.100.0', '1.0.0', false);
177+
testIsValidVersion('1.100.0', '^1.0.0', true);
178+
testIsValidVersion('1.100.0', '^1.1.0', true);
179+
testIsValidVersion('1.100.0', '^1.100.0', true);
180+
testIsValidVersion('1.100.0', '^2.0.0', false);
181+
testIsValidVersion('1.100.0', '*', true);
182+
183+
testIsValidVersion('2.0.0', 'x.x.x', true);
184+
testIsValidVersion('2.0.0', '0.x.x', false);
185+
testIsValidVersion('2.0.0', '0.10.0', false);
186+
testIsValidVersion('2.0.0', '0.10.2', false);
187+
testIsValidVersion('2.0.0', '^0.10.2', false);
188+
testIsValidVersion('2.0.0', '0.10.x', false);
189+
testIsValidVersion('2.0.0', '^0.10.0', false);
190+
testIsValidVersion('2.0.0', '1.0.0', false);
191+
testIsValidVersion('2.0.0', '^1.0.0', false);
192+
testIsValidVersion('2.0.0', '^1.1.0', false);
193+
testIsValidVersion('2.0.0', '^1.100.0', false);
194+
testIsValidVersion('2.0.0', '^2.0.0', true);
195+
testIsValidVersion('2.0.0', '*', true);
150196
});
151197

152198
test('isValidExtensionVersion', () => {
@@ -270,9 +316,9 @@ suite('Extension Version Validator', () => {
270316
testIsValidVersion('1.0.0', '0.x.x', false); // fails due to lack of specificity
271317
testIsValidVersion('1.0.0', '0.10.0', false);
272318
testIsValidVersion('1.0.0', '0.10.2', false);
273-
testIsValidVersion('1.0.0', '^0.10.2', false);
274-
testIsValidVersion('1.0.0', '0.10.x', false);
275-
testIsValidVersion('1.0.0', '^0.10.0', false);
319+
testIsValidVersion('1.0.0', '^0.10.2', true);
320+
testIsValidVersion('1.0.0', '0.10.x', true);
321+
testIsValidVersion('1.0.0', '^0.10.0', true);
276322
testIsValidVersion('1.0.0', '*', false); // fails due to lack of specificity
277323

278324
testIsValidVersion('1.10.0', 'x.x.x', false); // fails due to lack of specificity
@@ -283,5 +329,61 @@ suite('Extension Version Validator', () => {
283329
testIsValidVersion('1.10.0', '1.10.x', true);
284330
testIsValidVersion('1.10.0', '^1.10.0', true);
285331
testIsValidVersion('1.10.0', '*', false); // fails due to lack of specificity
332+
333+
334+
// Anything < 1.0.0 is compatible
335+
336+
testIsValidVersion('1.0.0', 'x.x.x', false); // fails due to lack of specificity
337+
testIsValidVersion('1.0.0', '0.x.x', false); // fails due to lack of specificity
338+
testIsValidVersion('1.0.0', '0.10.0', false);
339+
testIsValidVersion('1.0.0', '0.10.2', false);
340+
testIsValidVersion('1.0.0', '^0.10.2', true);
341+
testIsValidVersion('1.0.0', '0.10.x', true);
342+
testIsValidVersion('1.0.0', '^0.10.0', true);
343+
testIsValidVersion('1.0.0', '1.0.0', true);
344+
testIsValidVersion('1.0.0', '^1.0.0', true);
345+
testIsValidVersion('1.0.0', '^2.0.0', false);
346+
testIsValidVersion('1.0.0', '*', false); // fails due to lack of specificity
347+
348+
testIsValidVersion('1.0.100', 'x.x.x', false); // fails due to lack of specificity
349+
testIsValidVersion('1.0.100', '0.x.x', false); // fails due to lack of specificity
350+
testIsValidVersion('1.0.100', '0.10.0', false);
351+
testIsValidVersion('1.0.100', '0.10.2', false);
352+
testIsValidVersion('1.0.100', '^0.10.2', true);
353+
testIsValidVersion('1.0.100', '0.10.x', true);
354+
testIsValidVersion('1.0.100', '^0.10.0', true);
355+
testIsValidVersion('1.0.100', '1.0.0', false);
356+
testIsValidVersion('1.0.100', '^1.0.0', true);
357+
testIsValidVersion('1.0.100', '^1.0.1', true);
358+
testIsValidVersion('1.0.100', '^2.0.0', false);
359+
testIsValidVersion('1.0.100', '*', false); // fails due to lack of specificity
360+
361+
testIsValidVersion('1.100.0', 'x.x.x', false); // fails due to lack of specificity
362+
testIsValidVersion('1.100.0', '0.x.x', false); // fails due to lack of specificity
363+
testIsValidVersion('1.100.0', '0.10.0', false);
364+
testIsValidVersion('1.100.0', '0.10.2', false);
365+
testIsValidVersion('1.100.0', '^0.10.2', true);
366+
testIsValidVersion('1.100.0', '0.10.x', true);
367+
testIsValidVersion('1.100.0', '^0.10.0', true);
368+
testIsValidVersion('1.100.0', '1.0.0', false);
369+
testIsValidVersion('1.100.0', '^1.0.0', true);
370+
testIsValidVersion('1.100.0', '^1.1.0', true);
371+
testIsValidVersion('1.100.0', '^1.100.0', true);
372+
testIsValidVersion('1.100.0', '^2.0.0', false);
373+
testIsValidVersion('1.100.0', '*', false); // fails due to lack of specificity
374+
375+
testIsValidVersion('2.0.0', 'x.x.x', false); // fails due to lack of specificity
376+
testIsValidVersion('2.0.0', '0.x.x', false); // fails due to lack of specificity
377+
testIsValidVersion('2.0.0', '0.10.0', false);
378+
testIsValidVersion('2.0.0', '0.10.2', false);
379+
testIsValidVersion('2.0.0', '^0.10.2', false);
380+
testIsValidVersion('2.0.0', '0.10.x', false);
381+
testIsValidVersion('2.0.0', '^0.10.0', false);
382+
testIsValidVersion('2.0.0', '1.0.0', false);
383+
testIsValidVersion('2.0.0', '^1.0.0', false);
384+
testIsValidVersion('2.0.0', '^1.1.0', false);
385+
testIsValidVersion('2.0.0', '^1.100.0', false);
386+
testIsValidVersion('2.0.0', '^2.0.0', true);
387+
testIsValidVersion('2.0.0', '*', false); // fails due to lack of specificity
286388
});
287389
});

0 commit comments

Comments
 (0)