| Index: sdk/lib/_internal/pub/lib/src/solver/version_solver.dart | 
| diff --git a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart | 
| index ec276ea22d0911d0c8185405897348840e056534..fa2aae0bcc68beccfcff54f204af147cdb6ab156 100644 | 
| --- a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart | 
| +++ b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart | 
| @@ -75,6 +75,22 @@ class SolveResult { | 
| final Package _root; | 
| final LockFile _previousLockFile; | 
|  | 
| +  /// Returns the names of all packages that were changed. | 
| +  /// | 
| +  /// This includes packages that were added or removed. | 
| +  Set<String> get changedPackages { | 
| +    if (packages == null) return null; | 
| + | 
| +    var changed = packages | 
| +        .where((id) => | 
| +            !_sources.idsEqual(_previousLockFile.packages[id.name], id)) | 
| +        .map((id) => id.name).toSet(); | 
| + | 
| +    return changed.union(_previousLockFile.packages.keys | 
| +        .where((package) => !availableVersions.containsKey(package)) | 
| +        .toSet()); | 
| +  } | 
| + | 
| SolveResult.success(this._sources, this._root, this._previousLockFile, | 
| this.packages, this.overrides, this.availableVersions, | 
| this.attemptedSolutions) | 
|  |