Don't warn about overrides (#3684)

Also always mention overrides in list of dependencies
diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart
index ddc2189..0f0820b 100644
--- a/lib/src/entrypoint.dart
+++ b/lib/src/entrypoint.dart
@@ -342,11 +342,6 @@
 Try running `$topLevelProgram pub get` to create `$lockFilePath`.''');
     }
 
-    if (!summaryOnly && hasPubspecOverrides) {
-      log.warning(
-          'Warning: pubspec.yaml has overrides from $pubspecOverridesPath');
-    }
-
     SolveResult result;
     try {
       result = await log.progress('Resolving dependencies$suffix', () async {
diff --git a/lib/src/pubspec.dart b/lib/src/pubspec.dart
index 8ac8023..53bcea1 100644
--- a/lib/src/pubspec.dart
+++ b/lib/src/pubspec.dart
@@ -40,6 +40,8 @@
 
   String? get _packageName => fields['name'] != null ? name : null;
 
+  final bool dependencyOverridesFromOverridesFile;
+
   /// The name of the manifest file.
   static const pubspecYamlFilename = 'pubspec.yaml';
 
@@ -289,6 +291,7 @@
     Map? fields,
     SourceRegistry? sources,
     Map<String, SdkConstraint>? sdkConstraints,
+    this.dependencyOverridesFromOverridesFile = false,
   })  : _dependencies = dependencies == null
             ? null
             : Map.fromIterable(dependencies, key: (range) => range.name),
@@ -326,6 +329,8 @@
   })  : _overridesFileFields = overridesFields,
         _includeDefaultSdkConstraint = true,
         _givenSdkConstraints = null,
+        dependencyOverridesFromOverridesFile = overridesFields != null &&
+            overridesFields.containsKey('dependency_overrides'),
         super(fields is YamlMap
             ? fields
             : YamlMap.wrap(fields, sourceUrl: location)) {
diff --git a/lib/src/solver/report.dart b/lib/src/solver/report.dart
index e9cd00e..321a3be 100644
--- a/lib/src/solver/report.dart
+++ b/lib/src/solver/report.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:path/path.dart' as p;
 import 'package:pub_semver/pub_semver.dart';
 
 import '../command_runner.dart';
@@ -9,6 +10,7 @@
 import '../log.dart' as log;
 import '../package.dart';
 import '../package_name.dart';
+import '../pubspec.dart';
 import '../source/hosted.dart';
 import '../source/root.dart';
 import '../system_cache.dart';
@@ -64,7 +66,6 @@
   Future<bool> show() async {
     final hasChanges = await _reportChanges();
     _checkContentHashesMatchOldLockfile();
-    await _reportOverrides();
     return hasChanges;
   }
 
@@ -239,22 +240,6 @@
     return hasChanges;
   }
 
-  /// Displays a warning about the overrides currently in effect.
-  Future<void> _reportOverrides() async {
-    final output = StringBuffer();
-
-    if (_root.dependencyOverrides.isNotEmpty) {
-      output.writeln('Warning: You are using these overridden dependencies:');
-
-      for (var name in ordered(_root.dependencyOverrides.keys)) {
-        await _reportPackage(name, output,
-            alwaysShow: true, highlightOverride: false);
-      }
-
-      warning(output.toString());
-    }
-  }
-
   /// Displays a single-line message, number of discontinued packages
   /// if discontinued packages are detected.
   Future<void> reportDiscontinued() async {
@@ -311,8 +296,11 @@
   /// "(override)" next to overridden packages.
   ///
   /// Returns true if the package had changed.
-  Future<bool> _reportPackage(String name, StringBuffer output,
-      {bool alwaysShow = false, bool highlightOverride = true}) async {
+  Future<bool> _reportPackage(
+    String name,
+    StringBuffer output, {
+    bool alwaysShow = false,
+  }) async {
     var newId = _newLockFile.packages[name];
     var oldId = _previousLockFile.packages[name];
     var id = newId ?? oldId!;
@@ -417,7 +405,11 @@
     }
 
     if (_type == SolveType.get &&
-        !(alwaysShow || changed || addedOrRemoved || message != null)) {
+        !(alwaysShow ||
+            changed ||
+            addedOrRemoved ||
+            message != null ||
+            isOverridden)) {
       return changed || addedOrRemoved;
     }
 
@@ -434,8 +426,11 @@
     }
 
     // Highlight overridden packages.
-    if (isOverridden && highlightOverride) {
-      output.write(" ${log.magenta('(overridden)')}");
+    if (isOverridden) {
+      final location = _root.pubspec.dependencyOverridesFromOverridesFile
+          ? ' in ${p.join(_root.dir, Pubspec.pubspecOverridesFilename)}'
+          : '';
+      output.write(' ${log.magenta('(overridden$location)')}');
     }
 
     if (message != null) output.write(' ${log.cyan(message)}');
diff --git a/test/dependency_override_test.dart b/test/dependency_override_test.dart
index 59f59e4..1c03f57 100644
--- a/test/dependency_override_test.dart
+++ b/test/dependency_override_test.dart
@@ -94,7 +94,7 @@
       ]).validate();
     });
 
-    test('warns about overridden dependencies', () async {
+    test('informs about overridden dependencies', () async {
       await servePackages()
         ..serve('foo', '1.0.0')
         ..serve('bar', '1.0.0');
@@ -116,14 +116,13 @@
       var bazPath = path.join('..', 'baz');
 
       await runPub(
-          args: [command.name],
-          output: command.success,
-          error: '''
-          Warning: You are using these overridden dependencies:
-          ! bar 1.0.0
-          ! baz 0.0.1 from path $bazPath
-          ! foo 1.0.0
-          ''');
+        args: [command.name],
+        output: contains('''
+! bar 1.0.0 (overridden)
+! baz 0.0.1 from path $bazPath (overridden)
+! foo 1.0.0 (overridden)
+'''),
+      );
     });
   });
 }
diff --git a/test/pubspec_overrides_test.dart b/test/pubspec_overrides_test.dart
index 7e0547c..ac5e899 100644
--- a/test/pubspec_overrides_test.dart
+++ b/test/pubspec_overrides_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:path/path.dart' as p;
 import 'package:test/test.dart';
 
 import 'descriptor.dart' as d;
@@ -22,12 +23,12 @@
         }),
       ]).create();
 
+      final overridesPath = p.join('.', 'pubspec_overrides.yaml');
       await pubCommand(
         command,
-        warning:
-            'Warning: pubspec.yaml has overrides from pubspec_overrides.yaml\n'
-            'Warning: You are using these overridden dependencies:\n'
-            '! lib 2.0.0',
+        output: contains(
+          '! lib 2.0.0 (overridden in $overridesPath)',
+        ),
       );
 
       await d.dir(appPath, [
@@ -46,4 +47,57 @@
       ]).validate();
     });
   });
+
+  test('pubspec_overrides.yaml shadows overrides from pubspec.yaml', () async {
+    await servePackages()
+      ..serve('lib', '1.0.0')
+      ..serve('lib', '2.0.0')
+      ..serve('lib', '3.0.0')
+      ..serve('foo', '1.0.0')
+      ..serve('foo', '2.0.0');
+
+    await d.dir(appPath, [
+      d.appPubspec(dependencies: {
+        'lib': '1.0.0',
+        'foo': '1.0.0'
+      }, extras: {
+        'dependency_overrides': {'lib': '2.0.0', 'foo': '2.0.0'}
+      }),
+      d.dir('lib'),
+      // empty overrides file:
+      d.pubspecOverrides({
+        'dependency_overrides': {'lib': '3.0.0'}
+      }),
+    ]).create();
+
+    final overridesPath = p.join('.', 'pubspec_overrides.yaml');
+    await pubGet(
+      output: allOf(
+        contains('! lib 3.0.0 (overridden in $overridesPath)'),
+        contains('+ foo 1.0.0 (2.0.0 available)'),
+      ),
+    );
+  });
+  test(
+      "An empty pubspec_overrides.yaml doesn't shadow overrides from pubspec.yaml",
+      () async {
+    await servePackages()
+      ..serve('lib', '1.0.0')
+      ..serve('lib', '2.0.0');
+
+    await d.dir(appPath, [
+      d.appPubspec(dependencies: {
+        'lib': '1.0.0',
+      }, extras: {
+        'dependency_overrides': {'lib': '2.0.0'}
+      }),
+      d.dir('lib'),
+      // empty overrides file:
+      d.pubspecOverrides({}),
+    ]).create();
+
+    await pubGet(
+      output: contains('! lib 2.0.0 (overridden)'),
+    );
+  });
 }