Skip to content

Commit 586b15c

Browse files
[flutter_tools] Upgrade only from flutter update-packages (#103924)
1 parent aa35c85 commit 586b15c

File tree

2 files changed

+66
-8
lines changed

2 files changed

+66
-8
lines changed

packages/flutter_tools/lib/src/commands/update_packages.dart

+24-8
Original file line numberDiff line numberDiff line change
@@ -382,9 +382,9 @@ class UpdatePackagesCommand extends FlutterCommand {
382382
final File fakePackage = _pubspecFor(tempDir);
383383
fakePackage.createSync();
384384
fakePackage.writeAsStringSync(
385-
_generateFakePubspec(
385+
generateFakePubspec(
386386
dependencies,
387-
useAnyVersion: doUpgrade,
387+
doUpgrade: doUpgrade,
388388
),
389389
);
390390
// Create a synthetic flutter SDK so that transitive flutter SDK
@@ -1321,8 +1321,22 @@ class PubspecDependency extends PubspecLine {
13211321

13221322
/// This generates the entry for this dependency for the pubspec.yaml for the
13231323
/// fake package that we'll use to get the version numbers figured out.
1324-
void describeForFakePubspec(StringBuffer dependencies, StringBuffer overrides, { bool useAnyVersion = true}) {
1325-
final String versionToUse = useAnyVersion || version.isEmpty ? 'any' : version;
1324+
///
1325+
/// When called with [doUpgrade] as [true], the version constrains will be set
1326+
/// to >= whatever the previous version was. If [doUpgrade] is [false], then
1327+
/// the previous version is used again as an exact pin.
1328+
void describeForFakePubspec(StringBuffer dependencies, StringBuffer overrides, { bool doUpgrade = true }) {
1329+
final String versionToUse;
1330+
// This should only happen when manually adding new dependencies; otherwise
1331+
// versions should always be pinned exactly
1332+
if (version.isEmpty || version == 'any') {
1333+
versionToUse = 'any';
1334+
} else if (doUpgrade) {
1335+
// Must wrap in quotes for Yaml parsing
1336+
versionToUse = "'>= $version'";
1337+
} else {
1338+
versionToUse = version;
1339+
}
13261340
switch (kind) {
13271341
case DependencyKind.unknown:
13281342
case DependencyKind.overridden:
@@ -1362,6 +1376,7 @@ class PubspecDependency extends PubspecLine {
13621376
dependencies.writeln(' $name:');
13631377
dependencies.writeln(lockLine);
13641378
}
1379+
break;
13651380
}
13661381
}
13671382

@@ -1379,13 +1394,14 @@ File _pubspecFor(Directory directory) {
13791394

13801395
/// Generates the source of a fake pubspec.yaml file given a list of
13811396
/// dependencies.
1382-
String _generateFakePubspec(
1397+
@visibleForTesting
1398+
String generateFakePubspec(
13831399
Iterable<PubspecDependency> dependencies, {
1384-
bool useAnyVersion = false
1400+
bool doUpgrade = false
13851401
}) {
13861402
final StringBuffer result = StringBuffer();
13871403
final StringBuffer overrides = StringBuffer();
1388-
final bool verbose = useAnyVersion;
1404+
final bool verbose = doUpgrade;
13891405
result.writeln('name: flutter_update_packages');
13901406
result.writeln('environment:');
13911407
result.writeln(" sdk: '>=2.10.0 <3.0.0'");
@@ -1415,7 +1431,7 @@ String _generateFakePubspec(
14151431
}
14161432
for (final PubspecDependency dependency in dependencies) {
14171433
if (!dependency.pointsToSdk) {
1418-
dependency.describeForFakePubspec(result, overrides, useAnyVersion: useAnyVersion);
1434+
dependency.describeForFakePubspec(result, overrides, doUpgrade: doUpgrade);
14191435
}
14201436
}
14211437
result.write(overrides.toString());

packages/flutter_tools/test/commands.shard/hermetic/update_packages_test.dart

+42
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import 'package:flutter_tools/src/commands/update_packages.dart';
1212
import 'package:flutter_tools/src/dart/pub.dart';
1313
import 'package:meta/meta.dart';
1414
import 'package:test/fake.dart';
15+
import 'package:yaml/yaml.dart';
1516

1617
import '../../src/common.dart';
1718
import '../../src/context.dart';
@@ -173,6 +174,47 @@ void main() {
173174
),
174175
});
175176
});
177+
178+
group('generateFakePubspec', () {
179+
const String prevVersion = '1.2.0';
180+
testUsingContext('constrains package versions to >= previous version if doUpgrade: true', () {
181+
final String pubspecSource = generateFakePubspec(
182+
<PubspecDependency>[
183+
PubspecDependency(
184+
' foo: $prevVersion',
185+
'foo',
186+
'',
187+
version: prevVersion,
188+
sourcePath: '/path/to/pubspec.yaml',
189+
kind: DependencyKind.normal,
190+
isTransitive: false,
191+
),
192+
],
193+
doUpgrade: true,
194+
);
195+
final YamlMap pubspec = loadYaml(pubspecSource) as YamlMap;
196+
expect((pubspec['dependencies'] as YamlMap)['foo'], '>= $prevVersion');
197+
});
198+
199+
testUsingContext('uses previous package versions doUpgrade: false', () {
200+
final String pubspecSource = generateFakePubspec(
201+
<PubspecDependency>[
202+
PubspecDependency(
203+
' foo: $prevVersion',
204+
'foo',
205+
'',
206+
version: prevVersion,
207+
sourcePath: '/path/to/pubspec.yaml',
208+
kind: DependencyKind.normal,
209+
isTransitive: false,
210+
),
211+
],
212+
doUpgrade: false,
213+
);
214+
final YamlMap pubspec = loadYaml(pubspecSource) as YamlMap;
215+
expect((pubspec['dependencies'] as YamlMap)['foo'], prevVersion);
216+
});
217+
});
176218
}
177219

178220
class FakePub extends Fake implements Pub {

0 commit comments

Comments
 (0)