Show outdated sdk packages. (#2841)

Mention the source of non-hosted package-versions.
diff --git a/lib/src/command/outdated.dart b/lib/src/command/outdated.dart
index 7c7806c..590daf9 100644
--- a/lib/src/command/outdated.dart
+++ b/lib/src/command/outdated.dart
@@ -19,6 +19,8 @@
 import '../pubspec.dart';
 import '../pubspec_utils.dart';
 import '../solver.dart';
+import '../source/git.dart';
+import '../source/path.dart';
 import '../source/sdk.dart' show SdkSource;
 import '../system_cache.dart';
 import '../utils.dart';
@@ -227,7 +229,7 @@
       ...upgradablePackages,
       ...resolvablePackages
     ]) {
-      if (!visited.add(id.name) || id.source is SdkSource) continue;
+      if (!visited.add(id.name)) continue;
       rows.add(await analyzeDependency(id.toRef()));
     }
 
@@ -789,7 +791,17 @@
   /// A string representation of this version to include in the outdated report.
   String get describe {
     final version = _pubspec.version;
-    final suffix = _overridden ? ' (overridden)' : '';
+    var suffix = '';
+    if (_overridden) {
+      suffix = ' (overridden)';
+    } else if (_id.source is SdkSource) {
+      // Version is not relevant for sdk-packages.
+      return '(sdk)';
+    } else if (_id.source is GitSource) {
+      suffix = ' (git)';
+    } else if (_id.source is PathSource) {
+      suffix = ' (path)';
+    }
     return '$version$suffix';
   }
 
diff --git a/test/outdated/goldens/ignores_sdk_dependencies.txt b/test/outdated/goldens/handles_sdk_dependencies.txt
similarity index 84%
rename from test/outdated/goldens/ignores_sdk_dependencies.txt
rename to test/outdated/goldens/handles_sdk_dependencies.txt
index 43fea60..6d4d76c 100644
--- a/test/outdated/goldens/ignores_sdk_dependencies.txt
+++ b/test/outdated/goldens/handles_sdk_dependencies.txt
@@ -54,9 +54,11 @@
 Package Name  Current  Upgradable  Resolvable  Latest  
 
 direct dependencies:
+flutter       (sdk)    (sdk)       (sdk)       (sdk)   
 foo           *1.1.0   *1.1.0      2.0.0       2.0.0   
 
-dev_dependencies: all up-to-date.
+dev_dependencies:
+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`.
@@ -109,9 +111,10 @@
 Package Name  Current  Upgradable  Resolvable  Latest  
 
 direct dependencies:
-foo           ✗1.1.0   ✗1.1.0      ✗2.0.0      ✗2.0.0  
+foo           ✗1.1.0   ✗1.1.0      ✓2.0.0      ✓2.0.0  
 
-dev_dependencies: all support null safety.
+dev_dependencies:
+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`.
@@ -124,9 +127,10 @@
 Package Name  Current  Upgradable  Resolvable  Latest  
 
 direct dependencies:
-foo           ✗1.1.0   ✗1.1.0      ✗2.0.0      ✗2.0.0  
+foo           ✗1.1.0   ✗1.1.0      ✓2.0.0      ✓2.0.0  
 
-dev_dependencies: all support null safety.
+dev_dependencies:
+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`.
@@ -139,9 +143,10 @@
 Package Name  Current  Upgradable  Resolvable  Latest  
 
 direct dependencies:
-foo           ✗1.1.0   ✗1.1.0      ✗2.0.0      ✗2.0.0  
+foo           ✗1.1.0   ✗1.1.0      ✓2.0.0      ✓2.0.0  
 
-dev_dependencies: all support null safety.
+dev_dependencies:
+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`.
@@ -150,6 +155,25 @@
 {
   "packages": [
     {
+      "package": "flutter_test",
+      "current": {
+        "version": "1.0.0",
+        "nullSafety": false
+      },
+      "upgradable": {
+        "version": "1.0.0",
+        "nullSafety": false
+      },
+      "resolvable": {
+        "version": "1.0.0",
+        "nullSafety": false
+      },
+      "latest": {
+        "version": "1.0.0",
+        "nullSafety": false
+      }
+    },
+    {
       "package": "foo",
       "current": {
         "version": "1.1.0",
@@ -161,11 +185,11 @@
       },
       "resolvable": {
         "version": "2.0.0",
-        "nullSafety": false
+        "nullSafety": true
       },
       "latest": {
         "version": "2.0.0",
-        "nullSafety": false
+        "nullSafety": true
       }
     }
   ]
diff --git a/test/outdated/goldens/newer_versions.txt b/test/outdated/goldens/newer_versions.txt
index 97ac5ab..6e74a3e 100644
--- a/test/outdated/goldens/newer_versions.txt
+++ b/test/outdated/goldens/newer_versions.txt
@@ -132,23 +132,23 @@
 Showing outdated packages.
 [*] indicates versions that are not the latest available.
 
-Package Name   Current  Upgradable  Resolvable  Latest  
+Package Name   Current       Upgradable    Resolvable    Latest        
 
 direct dependencies:
-bar            1.0.0    1.0.0       1.0.0       1.0.0   
-foo            *1.2.3   *1.3.0      *2.0.0      3.0.0   
-local_package  0.0.1    0.0.1       0.0.1       0.0.1   
+bar            1.0.0         1.0.0         1.0.0         1.0.0         
+foo            *1.2.3        *1.3.0        *2.0.0        3.0.0         
+local_package  0.0.1 (path)  0.0.1 (path)  0.0.1 (path)  0.0.1 (path)  
 
 dev_dependencies:
-builder        *1.2.3   *1.3.0      2.0.0       2.0.0   
+builder        *1.2.3        *1.3.0        2.0.0         2.0.0         
 
 transitive dependencies:
-transitive     *1.2.3   *1.3.0      *1.3.0      2.0.0   
-transitive2    -        -           1.0.0       1.0.0   
+transitive     *1.2.3        *1.3.0        *1.3.0        2.0.0         
+transitive2    -             -             1.0.0         1.0.0         
 
 transitive dev_dependencies:
-dev_trans      *1.0.0   -           *1.0.0      2.0.0   
-transitive3    -        -           1.0.0       1.0.0   
+dev_trans      *1.0.0        -             *1.0.0        2.0.0         
+transitive3    -             -             1.0.0         1.0.0         
 
 3 upgradable dependencies are locked (in pubspec.lock) to older versions.
 To update these dependencies, use `dart pub upgrade`.
@@ -231,15 +231,15 @@
 [✗] indicates versions without null safety support.
 [✓] indicates versions opting in to null safety.
 
-Package Name   Current  Upgradable  Resolvable  Latest        
+Package Name   Current        Upgradable     Resolvable     Latest         
 
 direct dependencies:
-bar            ✗1.0.0   ✗1.0.0      ✗1.0.0      ✗1.0.0        
-foo            ✗1.2.3   ✗1.3.0      ✗2.0.0      ✗3.0.0        
-local_package  ✗0.0.1   ✗0.0.1      ✗0.0.1      ✗0.0.1        
+bar            ✗1.0.0         ✗1.0.0         ✗1.0.0         ✗1.0.0         
+foo            ✗1.2.3         ✗1.3.0         ✗2.0.0         ✗3.0.0         
+local_package  ✗0.0.1 (path)  ✗0.0.1 (path)  ✗0.0.1 (path)  ✗0.0.1 (path)  
 
 dev_dependencies:
-builder        ✗1.2.3   ✗1.3.0      ✗2.0.0      ✗3.0.0-alpha  
+builder        ✗1.2.3         ✗1.3.0         ✗2.0.0         ✗3.0.0-alpha   
 
 2 upgradable dependencies are locked (in pubspec.lock) to older versions.
 To update these dependencies, use `dart pub upgrade`.
@@ -252,23 +252,23 @@
 [✗] indicates versions without null safety support.
 [✓] indicates versions opting in to null safety.
 
-Package Name   Current  Upgradable  Resolvable  Latest        
+Package Name   Current        Upgradable     Resolvable     Latest         
 
 direct dependencies:
-bar            ✗1.0.0   ✗1.0.0      ✗1.0.0      ✗1.0.0        
-foo            ✗1.2.3   ✗1.3.0      ✗2.0.0      ✗3.0.0        
-local_package  ✗0.0.1   ✗0.0.1      ✗0.0.1      ✗0.0.1        
+bar            ✗1.0.0         ✗1.0.0         ✗1.0.0         ✗1.0.0         
+foo            ✗1.2.3         ✗1.3.0         ✗2.0.0         ✗3.0.0         
+local_package  ✗0.0.1 (path)  ✗0.0.1 (path)  ✗0.0.1 (path)  ✗0.0.1 (path)  
 
 dev_dependencies:
-builder        ✗1.2.3   ✗1.3.0      ✗2.0.0      ✗3.0.0-alpha  
+builder        ✗1.2.3         ✗1.3.0         ✗2.0.0         ✗3.0.0-alpha   
 
 transitive dependencies:
-transitive     ✗1.2.3   ✗1.3.0      ✗1.3.0      ✗2.0.0        
-transitive2    -        -           ✗1.0.0      ✗1.0.0        
+transitive     ✗1.2.3         ✗1.3.0         ✗1.3.0         ✗2.0.0         
+transitive2    -              -              ✗1.0.0         ✗1.0.0         
 
 transitive dev_dependencies:
-dev_trans      ✗1.0.0   -           ✗1.0.0      ✗2.0.0        
-transitive3    -        -           ✗1.0.0      ✗1.0.0        
+dev_trans      ✗1.0.0         -              ✗1.0.0         ✗2.0.0         
+transitive3    -              -              ✗1.0.0         ✗1.0.0         
 
 3 upgradable dependencies are locked (in pubspec.lock) to older versions.
 To update these dependencies, use `dart pub upgrade`.
@@ -281,15 +281,15 @@
 [✗] indicates versions without null safety support.
 [✓] indicates versions opting in to null safety.
 
-Package Name   Current  Upgradable  Resolvable  Latest  
+Package Name   Current        Upgradable     Resolvable     Latest         
 
 direct dependencies:
-bar            ✗1.0.0   ✗1.0.0      ✗1.0.0      ✗1.0.0  
-foo            ✗1.2.3   ✗1.3.0      ✗2.0.0      ✗3.0.0  
-local_package  ✗0.0.1   ✗0.0.1      ✗0.0.1      ✗0.0.1  
+bar            ✗1.0.0         ✗1.0.0         ✗1.0.0         ✗1.0.0         
+foo            ✗1.2.3         ✗1.3.0         ✗2.0.0         ✗3.0.0         
+local_package  ✗0.0.1 (path)  ✗0.0.1 (path)  ✗0.0.1 (path)  ✗0.0.1 (path)  
 
 dev_dependencies:
-builder        ✗1.2.3   ✗1.3.0      ✗2.0.0      ✗2.0.0  
+builder        ✗1.2.3         ✗1.3.0         ✗2.0.0         ✗2.0.0         
 
 2 upgradable dependencies are locked (in pubspec.lock) to older versions.
 To update these dependencies, use `dart pub upgrade`.
diff --git a/test/outdated/outdated_test.dart b/test/outdated/outdated_test.dart
index 7d2b1cd..a882120 100644
--- a/test/outdated/outdated_test.dart
+++ b/test/outdated/outdated_test.dart
@@ -399,20 +399,26 @@
     await variations('prereleases');
   });
 
-  test('ignores SDK dependencies', () async {
+  test('Handles SDK dependencies', () async {
     await servePackages((builder) => builder
-      ..serve('foo', '1.0.0')
-      ..serve('foo', '1.1.0')
-      ..serve('foo', '2.0.0'));
+      ..serve('foo', '1.0.0', pubspec: {
+        'environment': {'sdk': '>=2.10.0 <3.0.0'}
+      })
+      ..serve('foo', '1.1.0', pubspec: {
+        'environment': {'sdk': '>=2.10.0 <3.0.0'}
+      })
+      ..serve('foo', '2.0.0', pubspec: {
+        'environment': {'sdk': '>=2.12.0 <3.0.0'}
+      }));
 
     await d.dir('flutter-root', [
       d.file('version', '1.2.3'),
       d.dir('packages', [
         d.dir('flutter', [
-          d.libPubspec('flutter', '1.0.0'),
+          d.libPubspec('flutter', '1.0.0', sdk: '>=2.12.0 <3.0.0'),
         ]),
         d.dir('flutter_test', [
-          d.libPubspec('flutter_test', '1.0.0'),
+          d.libPubspec('flutter_test', '1.0.0', sdk: '>=2.10.0 <3.0.0'),
         ]),
       ]),
     ]).create();
@@ -421,6 +427,7 @@
       d.pubspec({
         'name': 'app',
         'version': '1.0.1',
+        'environment': {'sdk': '>=2.12.0 <3.0.0'},
         'dependencies': {
           'foo': '^1.0.0',
           'flutter': {
@@ -438,10 +445,12 @@
 
     await pubGet(environment: {
       'FLUTTER_ROOT': d.path('flutter-root'),
+      '_PUB_TEST_SDK_VERSION': '2.13.0'
     });
 
-    await variations('ignores_sdk_dependencies', environment: {
+    await variations('handles_sdk_dependencies', environment: {
       'FLUTTER_ROOT': d.path('flutter-root'),
+      '_PUB_TEST_SDK_VERSION': '2.13.0'
     });
   });
 }