| Index: sdk/lib/_internal/pub_generated/lib/src/package.dart
 | 
| diff --git a/sdk/lib/_internal/pub_generated/lib/src/package.dart b/sdk/lib/_internal/pub_generated/lib/src/package.dart
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..73b5b05aac946805fa9fa4a22f022ee66b9924f2
 | 
| --- /dev/null
 | 
| +++ b/sdk/lib/_internal/pub_generated/lib/src/package.dart
 | 
| @@ -0,0 +1,165 @@
 | 
| +library pub.package;
 | 
| +import 'dart:io';
 | 
| +import 'package:path/path.dart' as path;
 | 
| +import 'package:barback/barback.dart';
 | 
| +import 'io.dart';
 | 
| +import 'git.dart' as git;
 | 
| +import 'pubspec.dart';
 | 
| +import 'source_registry.dart';
 | 
| +import 'utils.dart';
 | 
| +import 'version.dart';
 | 
| +final _README_REGEXP = new RegExp(r"^README($|\.)", caseSensitive: false);
 | 
| +class Package {
 | 
| +  static int orderByNameAndVersion(Package a, Package b) {
 | 
| +    var name = a.name.compareTo(b.name);
 | 
| +    if (name != 0) return name;
 | 
| +    return a.version.compareTo(b.version);
 | 
| +  }
 | 
| +  final String dir;
 | 
| +  String get name {
 | 
| +    if (pubspec.name != null) return pubspec.name;
 | 
| +    if (dir != null) return path.basename(dir);
 | 
| +    return null;
 | 
| +  }
 | 
| +  Version get version => pubspec.version;
 | 
| +  final Pubspec pubspec;
 | 
| +  List<PackageDep> get dependencies => pubspec.dependencies;
 | 
| +  List<PackageDep> get devDependencies => pubspec.devDependencies;
 | 
| +  List<PackageDep> get dependencyOverrides => pubspec.dependencyOverrides;
 | 
| +  Set<PackageDep> get immediateDependencies {
 | 
| +    var deps = {};
 | 
| +    addToMap(dep) {
 | 
| +      deps[dep.name] = dep;
 | 
| +    }
 | 
| +    dependencies.forEach(addToMap);
 | 
| +    devDependencies.forEach(addToMap);
 | 
| +    dependencyOverrides.forEach(addToMap);
 | 
| +    return deps.values.toSet();
 | 
| +  }
 | 
| +  List<AssetId> get executableIds {
 | 
| +    var binDir = path.join(dir, 'bin');
 | 
| +    if (!dirExists(binDir)) return [];
 | 
| +    return ordered(
 | 
| +        listFiles(
 | 
| +            beneath: binDir,
 | 
| +            recursive: false)).where(
 | 
| +                (executable) => path.extension(executable) == '.dart').map((executable) {
 | 
| +      return new AssetId(
 | 
| +          name,
 | 
| +          path.toUri(path.relative(executable, from: dir)).toString());
 | 
| +    }).toList();
 | 
| +  }
 | 
| +  String get readmePath {
 | 
| +    var readmes = listDir(
 | 
| +        dir).map(path.basename).where((entry) => entry.contains(_README_REGEXP));
 | 
| +    if (readmes.isEmpty) return null;
 | 
| +    return path.join(dir, readmes.reduce((readme1, readme2) {
 | 
| +      var extensions1 = ".".allMatches(readme1).length;
 | 
| +      var extensions2 = ".".allMatches(readme2).length;
 | 
| +      var comparison = extensions1.compareTo(extensions2);
 | 
| +      if (comparison == 0) comparison = readme1.compareTo(readme2);
 | 
| +      return (comparison <= 0) ? readme1 : readme2;
 | 
| +    }));
 | 
| +  }
 | 
| +  Package.load(String name, String packageDir, SourceRegistry sources)
 | 
| +      : dir = packageDir,
 | 
| +        pubspec = new Pubspec.load(packageDir, sources, expectedName: name);
 | 
| +  Package.inMemory(this.pubspec) : dir = null;
 | 
| +  Package(this.pubspec, this.dir);
 | 
| +  static final _WHITELISTED_FILES = const ['.htaccess'];
 | 
| +  static final _blacklistedFiles = createFileFilter(['pubspec.lock']);
 | 
| +  static final _blacklistedDirs = createDirectoryFilter(['packages']);
 | 
| +  List<String> listFiles({String beneath, recursive: true}) {
 | 
| +    if (beneath == null) beneath = dir;
 | 
| +    var files;
 | 
| +    if (git.isInstalled && dirExists(path.join(dir, '.git'))) {
 | 
| +      var relativeBeneath = path.relative(beneath, from: dir);
 | 
| +      files = git.runSync(
 | 
| +          ["ls-files", "--cached", "--others", "--exclude-standard", relativeBeneath],
 | 
| +          workingDir: dir);
 | 
| +      if (!recursive) {
 | 
| +        var relativeStart =
 | 
| +            relativeBeneath == '.' ? 0 : relativeBeneath.length + 1;
 | 
| +        files = files.where((file) => !file.contains('/', relativeStart));
 | 
| +      }
 | 
| +      files = files.map((file) {
 | 
| +        if (Platform.operatingSystem != 'windows') return "$dir/$file";
 | 
| +        return "$dir\\${file.replaceAll("/", "\\")}";
 | 
| +      }).where((file) {
 | 
| +        return fileExists(file);
 | 
| +      });
 | 
| +    } else {
 | 
| +      files = listDir(
 | 
| +          beneath,
 | 
| +          recursive: recursive,
 | 
| +          includeDirs: false,
 | 
| +          whitelist: _WHITELISTED_FILES);
 | 
| +    }
 | 
| +    return files.where((file) {
 | 
| +      assert(file.startsWith(beneath));
 | 
| +      file = file.substring(beneath.length);
 | 
| +      return !_blacklistedFiles.any(file.endsWith) &&
 | 
| +          !_blacklistedDirs.any(file.contains);
 | 
| +    }).toList();
 | 
| +  }
 | 
| +  String toString() => '$name $version ($dir)';
 | 
| +}
 | 
| +class _PackageName {
 | 
| +  _PackageName(this.name, this.source, this.description);
 | 
| +  final String name;
 | 
| +  final String source;
 | 
| +  final description;
 | 
| +  bool get isRoot => source == null;
 | 
| +  String toString() {
 | 
| +    if (isRoot) return "$name (root)";
 | 
| +    return "$name from $source";
 | 
| +  }
 | 
| +  PackageRef toRef() => new PackageRef(name, source, description);
 | 
| +  PackageId atVersion(Version version) =>
 | 
| +      new PackageId(name, source, version, description);
 | 
| +  PackageDep withConstraint(VersionConstraint constraint) =>
 | 
| +      new PackageDep(name, source, constraint, description);
 | 
| +}
 | 
| +class PackageRef extends _PackageName {
 | 
| +  PackageRef(String name, String source, description)
 | 
| +      : super(name, source, description);
 | 
| +  int get hashCode => name.hashCode ^ source.hashCode;
 | 
| +  bool operator ==(other) {
 | 
| +    return other is PackageRef && other.name == name && other.source == source;
 | 
| +  }
 | 
| +}
 | 
| +class PackageId extends _PackageName {
 | 
| +  final Version version;
 | 
| +  PackageId(String name, String source, this.version, description)
 | 
| +      : super(name, source, description);
 | 
| +  PackageId.root(Package package)
 | 
| +      : version = package.version,
 | 
| +        super(package.name, null, package.name);
 | 
| +  int get hashCode => name.hashCode ^ source.hashCode ^ version.hashCode;
 | 
| +  bool operator ==(other) {
 | 
| +    return other is PackageId &&
 | 
| +        other.name == name &&
 | 
| +        other.source == source &&
 | 
| +        other.version == version;
 | 
| +  }
 | 
| +  String toString() {
 | 
| +    if (isRoot) return "$name $version (root)";
 | 
| +    return "$name $version from $source";
 | 
| +  }
 | 
| +}
 | 
| +class PackageDep extends _PackageName {
 | 
| +  final VersionConstraint constraint;
 | 
| +  PackageDep(String name, String source, this.constraint, description)
 | 
| +      : super(name, source, description);
 | 
| +  String toString() {
 | 
| +    if (isRoot) return "$name $constraint (root)";
 | 
| +    return "$name $constraint from $source ($description)";
 | 
| +  }
 | 
| +  int get hashCode => name.hashCode ^ source.hashCode;
 | 
| +  bool operator ==(other) {
 | 
| +    return other is PackageDep &&
 | 
| +        other.name == name &&
 | 
| +        other.source == source &&
 | 
| +        other.constraint == constraint;
 | 
| +  }
 | 
| +}
 | 
| 
 |