Recommend running `flutter pub` instead of `dart pub` when running from inside flutter. (#2842)

diff --git a/lib/src/command/outdated.dart b/lib/src/command/outdated.dart
index 590daf9..87e71b1 100644
--- a/lib/src/command/outdated.dart
+++ b/lib/src/command/outdated.dart
@@ -8,6 +8,7 @@
 import 'dart:math';
 
 import 'package:meta/meta.dart';
+import 'package:pub/src/command_runner.dart';
 import 'package:pub_semver/pub_semver.dart';
 
 import '../command.dart';
@@ -560,12 +561,12 @@
       if (upgradable == 1) {
         log.message('\n1 upgradable dependency is locked (in pubspec.lock) to '
             'an older version.\n'
-            'To update it, use `dart pub upgrade`.');
+            'To update it, use `$topLevelProgram pub upgrade`.');
       } else {
         log.message(
             '\n$upgradable upgradable dependencies are locked (in pubspec.lock) '
             'to older versions.\n'
-            'To update these dependencies, use `dart pub upgrade`.');
+            'To update these dependencies, use `$topLevelProgram pub upgrade`.');
       }
     }
 
@@ -623,11 +624,11 @@
 
   @override
   String get noResolutionText =>
-      '''No resolution was found. Try running `dart pub upgrade --dry-run` to explore why.''';
+      '''No resolution was found. Try running `$topLevelProgram pub upgrade --dry-run` to explore why.''';
 
   @override
   String get upgradeConstrained =>
-      'edit pubspec.yaml, or run `dart pub upgrade --major-versions`';
+      'edit pubspec.yaml, or run `$topLevelProgram pub upgrade --major-versions`';
 
   @override
   Future<List<List<_MarkedVersionDetails>>> markVersionDetails(
@@ -703,11 +704,11 @@
 
   @override
   String get noResolutionText =>
-      '''No resolution was found. Try running `dart pub upgrade --null-safety --dry-run` to explore why.''';
+      '''No resolution was found. Try running `$topLevelProgram pub upgrade --null-safety --dry-run` to explore why.''';
 
   @override
   String get upgradeConstrained =>
-      'edit pubspec.yaml, or run `dart pub upgrade --null-safety`';
+      'edit pubspec.yaml, or run `$topLevelProgram pub upgrade --null-safety`';
 
   @override
   Future<List<List<_MarkedVersionDetails>>> markVersionDetails(
diff --git a/lib/src/command/upgrade.dart b/lib/src/command/upgrade.dart
index 36713e1..81aa747 100644
--- a/lib/src/command/upgrade.dart
+++ b/lib/src/command/upgrade.dart
@@ -8,6 +8,7 @@
 import 'package:pub_semver/pub_semver.dart';
 
 import '../command.dart';
+import '../command_runner.dart';
 import '../entrypoint.dart';
 import '../exceptions.dart';
 import '../io.dart';
@@ -133,7 +134,7 @@
       }
 
       usageException('''
-Dependencies specified in `dart pub upgrade $modeFlag <dependencies>` must
+Dependencies specified in `$topLevelProgram pub upgrade $modeFlag <dependencies>` must
 be direct 'dependencies' or 'dev_dependencies', following packages are not:
  - ${notInDeps.join('\n - ')}
 
@@ -473,7 +474,7 @@
  - ${hasNoNullSafetyVersions.join('\n - ')}
 
 You can choose to upgrade only some dependencies to null-safety using:
-  dart pub upgrade --nullsafety ${hasNullSafetyVersions.join(' ')}
+  $topLevelProgram pub upgrade --nullsafety ${hasNullSafetyVersions.join(' ')}
 
 Warning: Using null-safety features before upgrading all dependencies is
 discouraged. For more details see: ${NullSafetyAnalysis.guideUrl}
diff --git a/lib/src/command_runner.dart b/lib/src/command_runner.dart
index 8a282a9..f130f37 100644
--- a/lib/src/command_runner.dart
+++ b/lib/src/command_runner.dart
@@ -35,6 +35,13 @@
 import 'log.dart';
 import 'sdk.dart';
 
+/// The name of the program that is invoking pub
+/// 'flutter' if we are running inside `flutter pub` 'dart' otherwise.
+String topLevelProgram = _isrunningInsideFlutter ? 'flutter' : 'dart';
+
+bool _isrunningInsideFlutter =
+    (Platform.environment['PUB_ENVIRONMENT'] ?? '').contains('flutter_cli');
+
 class PubCommandRunner extends CommandRunner<int> implements PubTopLevel {
   @override
   bool get captureStackChains {
diff --git a/lib/src/solver/report.dart b/lib/src/solver/report.dart
index 2d275f9..27c368f 100644
--- a/lib/src/solver/report.dart
+++ b/lib/src/solver/report.dart
@@ -4,6 +4,7 @@
 
 import 'package:pub_semver/pub_semver.dart';
 
+import '../command_runner.dart';
 import '../lock_file.dart';
 import '../log.dart' as log;
 import '../package.dart';
@@ -180,7 +181,7 @@
         packageCountString = '$outdatedPackagesCount packages have';
       }
       log.message('$packageCountString newer versions incompatible with '
-          'dependency constraints.\nTry `dart pub outdated` for more information.');
+          'dependency constraints.\nTry `$topLevelProgram pub outdated` for more information.');
     }
   }
 
diff --git a/test/outdated/goldens/handles_sdk_dependencies.txt b/test/outdated/goldens/handles_sdk_dependencies.txt
index 6d4d76c..aba2f87 100644
--- a/test/outdated/goldens/handles_sdk_dependencies.txt
+++ b/test/outdated/goldens/handles_sdk_dependencies.txt
@@ -31,7 +31,7 @@
 dev_dependencies: all up-to-date.
 
 1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
+To update it, edit pubspec.yaml, or run `flutter pub upgrade --major-versions`.
 
 $ pub outdated --no-color --no-transitive
 Showing outdated packages.
@@ -45,7 +45,7 @@
 dev_dependencies: all up-to-date.
 
 1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
+To update it, edit pubspec.yaml, or run `flutter pub upgrade --major-versions`.
 
 $ pub outdated --no-color --up-to-date
 Showing outdated packages.
@@ -61,7 +61,7 @@
 flutter_test  (sdk)    (sdk)       (sdk)       (sdk)   
 
 1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
+To update it, edit pubspec.yaml, or run `flutter pub upgrade --major-versions`.
 
 $ pub outdated --no-color --prereleases
 Showing outdated packages.
@@ -75,7 +75,7 @@
 dev_dependencies: all up-to-date.
 
 1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
+To update it, edit pubspec.yaml, or run `flutter pub upgrade --major-versions`.
 
 $ pub outdated --no-color --no-dev-dependencies
 Showing outdated packages.
@@ -87,7 +87,7 @@
 foo           *1.1.0   *1.1.0      2.0.0       2.0.0   
 
 1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
+To update it, edit pubspec.yaml, or run `flutter pub upgrade --major-versions`.
 
 $ pub outdated --no-color --no-dependency-overrides
 Showing outdated packages.
@@ -101,7 +101,7 @@
 dev_dependencies: all up-to-date.
 
 1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
+To update it, edit pubspec.yaml, or run `flutter pub upgrade --major-versions`.
 
 $ pub outdated --no-color --mode=null-safety
 Showing dependencies that are currently not opted in to null-safety.
@@ -117,7 +117,7 @@
 flutter_test  ✗(sdk)   ✗(sdk)      ✗(sdk)      ✗(sdk)  
 
 1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `dart pub upgrade --null-safety`.
+To update it, edit pubspec.yaml, or run `flutter pub upgrade --null-safety`.
 
 $ pub outdated --no-color --mode=null-safety --transitive
 Showing dependencies that are currently not opted in to null-safety.
@@ -133,7 +133,7 @@
 flutter_test  ✗(sdk)   ✗(sdk)      ✗(sdk)      ✗(sdk)  
 
 1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `dart pub upgrade --null-safety`.
+To update it, edit pubspec.yaml, or run `flutter pub upgrade --null-safety`.
 
 $ pub outdated --no-color --mode=null-safety --no-prereleases
 Showing dependencies that are currently not opted in to null-safety.
@@ -149,7 +149,7 @@
 flutter_test  ✗(sdk)   ✗(sdk)      ✗(sdk)      ✗(sdk)  
 
 1 dependency is constrained to a version that is older than a resolvable version.
-To update it, edit pubspec.yaml, or run `dart pub upgrade --null-safety`.
+To update it, edit pubspec.yaml, or run `flutter pub upgrade --null-safety`.
 
 $ pub outdated --json --mode=null-safety
 {
diff --git a/test/outdated/outdated_test.dart b/test/outdated/outdated_test.dart
index a882120..c355ae0 100644
--- a/test/outdated/outdated_test.dart
+++ b/test/outdated/outdated_test.dart
@@ -450,7 +450,9 @@
 
     await variations('handles_sdk_dependencies', environment: {
       'FLUTTER_ROOT': d.path('flutter-root'),
-      '_PUB_TEST_SDK_VERSION': '2.13.0'
+      '_PUB_TEST_SDK_VERSION': '2.13.0',
+      // To test that the reproduction command is reflected correctly.
+      'PUB_ENVIRONMENT': 'flutter_cli:get',
     });
   });
 }
diff --git a/test/upgrade/report/shows_pub_outdated_test.dart b/test/upgrade/report/shows_pub_outdated_test.dart
index 6104fc5..9c0fa3d 100644
--- a/test/upgrade/report/shows_pub_outdated_test.dart
+++ b/test/upgrade/report/shows_pub_outdated_test.dart
@@ -43,6 +43,12 @@
 3 packages have newer versions incompatible with dependency constraints.
 Try `dart pub outdated` for more information.$''', multiLine: true));
 
+    // Running inside Flutter this will recommend the Flutter variant.
+    await pubUpgrade(
+        environment: {'PUB_ENVIRONMENT': 'flutter_cli:get'}, output: RegExp(r'''
+3 packages have newer versions incompatible with dependency constraints.
+Try `flutter pub outdated` for more information.$''', multiLine: true));
+
     // Upgrade `multiple_newer` to `1.0.1`.
     await d.appDir({
       'multiple_newer': '1.0.1',