Allow `dart pub add` with existing package, update constraint instead of adding (#3570)
diff --git a/lib/src/command/add.dart b/lib/src/command/add.dart
index 78b1e5d..15b64a4 100644
--- a/lib/src/command/add.dart
+++ b/lib/src/command/add.dart
@@ -213,11 +213,10 @@
final range =
package.ref.withConstraint(package.constraint ?? VersionConstraint.any);
if (isDev) {
- /// TODO(walnut): Change the error message once pub upgrade --bump is
- /// released
if (devDependencyNames.contains(name)) {
- dataError('"$name" is already in "dev_dependencies". '
- 'Use "pub upgrade $name" to upgrade to a later version!');
+ log.message('"$name" is already in "dev_dependencies". '
+ 'Will try to update the constraint.');
+ devDependencies.removeWhere((element) => element.name == name);
}
/// If package is originally in dependencies and we wish to add it to
@@ -232,11 +231,10 @@
devDependencies.add(range);
} else {
- /// TODO(walnut): Change the error message once pub upgrade --bump is
- /// released
if (dependencyNames.contains(name)) {
- dataError('"$name" is already in "dependencies". '
- 'Use "pub upgrade $name" to upgrade to a later version!');
+ log.message(
+ '"$name" is already in "dependencies". Will try to update the constraint.');
+ dependencies.removeWhere((element) => element.name == name);
}
/// If package is originally in dev_dependencies and we wish to add it to
@@ -245,7 +243,7 @@
if (devDependencyNames.contains(name)) {
log.message('"$name" was found in dev_dependencies. '
'Removing "$name" and adding it to dependencies instead.');
- devDependencies = devDependencies.where((d) => d.name != name).toList();
+ devDependencies.removeWhere((element) => element.name == name);
}
dependencies.add(range);
diff --git a/test/add/common/add_test.dart b/test/add/common/add_test.dart
index f1e76a7..25f9d8d 100644
--- a/test/add/common/add_test.dart
+++ b/test/add/common/add_test.dart
@@ -185,7 +185,7 @@
await d.appDir({'foo': '1.2.3'}).validate();
});
- group('warns user to use pub upgrade if package exists', () {
+ group('notifies user about existing constraint', () {
test('if package is added without a version constraint', () async {
await servePackages()
..serve('foo', '1.2.3')
@@ -194,13 +194,13 @@
await d.appDir({'foo': '1.2.2'}).create();
await pubAdd(
- args: ['foo'],
- exitCode: exit_codes.DATA,
- error:
- contains('"foo" is already in "dependencies". Use "pub upgrade '
- 'foo" to upgrade to a later version!'));
+ args: ['foo'],
+ output: contains(
+ '"foo" is already in "dependencies". Will try to update the constraint.',
+ ),
+ );
- await d.appDir({'foo': '1.2.2'}).validate();
+ await d.appDir({'foo': '^1.2.3'}).validate();
});
test('if package is added with a specific version constraint', () async {
@@ -211,13 +211,13 @@
await d.appDir({'foo': '1.2.2'}).create();
await pubAdd(
- args: ['foo:1.2.3'],
- exitCode: exit_codes.DATA,
- error:
- contains('"foo" is already in "dependencies". Use "pub upgrade '
- 'foo" to upgrade to a later version!'));
+ args: ['foo:1.2.3'],
+ output: contains(
+ '"foo" is already in "dependencies". Will try to update the constraint.',
+ ),
+ );
- await d.appDir({'foo': '1.2.2'}).validate();
+ await d.appDir({'foo': '1.2.3'}).validate();
});
test('if package is added with a version constraint range', () async {
@@ -229,12 +229,10 @@
await pubAdd(
args: ['foo:>=1.2.2'],
- exitCode: exit_codes.DATA,
- error:
- contains('"foo" is already in "dependencies". Use "pub upgrade '
- 'foo" to upgrade to a later version!'));
+ output: contains(
+ '"foo" is already in "dependencies". Will try to update the constraint.'));
- await d.appDir({'foo': '1.2.2'}).validate();
+ await d.appDir({'foo': '>=1.2.2'}).validate();
});
});
@@ -517,7 +515,7 @@
]).validate();
});
- group('warns user to use pub upgrade if package exists', () {
+ group('notifies user if package exists', () {
test('if package is added without a version constraint', () async {
await servePackages()
..serve('foo', '1.2.3')
@@ -532,15 +530,13 @@
await pubAdd(
args: ['foo', '--dev'],
- exitCode: exit_codes.DATA,
- error: contains(
- '"foo" is already in "dev_dependencies". Use "pub upgrade '
- 'foo" to upgrade to a later version!'));
+ output: contains(
+ '"foo" is already in "dev_dependencies". Will try to update the constraint.'));
await d.dir(appPath, [
d.pubspec({
'name': 'myapp',
- 'dev_dependencies': {'foo': '1.2.2'}
+ 'dev_dependencies': {'foo': '^1.2.3'}
})
]).validate();
});
@@ -559,15 +555,13 @@
await pubAdd(
args: ['foo:1.2.3', '--dev'],
- exitCode: exit_codes.DATA,
- error: contains(
- '"foo" is already in "dev_dependencies". Use "pub upgrade '
- 'foo" to upgrade to a later version!'));
+ output: contains(
+ '"foo" is already in "dev_dependencies". Will try to update the constraint.'));
await d.dir(appPath, [
d.pubspec({
'name': 'myapp',
- 'dev_dependencies': {'foo': '1.2.2'}
+ 'dev_dependencies': {'foo': '1.2.3'}
})
]).validate();
});
@@ -586,15 +580,13 @@
await pubAdd(
args: ['foo:>=1.2.2', '--dev'],
- exitCode: exit_codes.DATA,
- error: contains(
- '"foo" is already in "dev_dependencies". Use "pub upgrade '
- 'foo" to upgrade to a later version!'));
+ output: contains(
+ '"foo" is already in "dev_dependencies". Will try to update the constraint.'));
await d.dir(appPath, [
d.pubspec({
'name': 'myapp',
- 'dev_dependencies': {'foo': '1.2.2'}
+ 'dev_dependencies': {'foo': '>=1.2.2'}
})
]).validate();
});