Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(889)

Side by Side Diff: lib/src/source/path.dart

Issue 2079303003: Track Source objects in PackageNames. (Closed) Base URL: git@github.com:dart-lang/pub.git@master
Patch Set: Code review changes Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/src/source/hosted.dart ('k') | lib/src/source/unknown.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 import 'dart:async'; 5 import 'dart:async';
6 6
7 import 'package:path/path.dart' as p; 7 import 'package:path/path.dart' as p;
8 import 'package:pub_semver/pub_semver.dart'; 8 import 'package:pub_semver/pub_semver.dart';
9 9
10 import '../exceptions.dart'; 10 import '../exceptions.dart';
(...skipping 13 matching lines...) Expand all
24 24
25 /// Given a valid path reference description, returns the file path it 25 /// Given a valid path reference description, returns the file path it
26 /// describes. 26 /// describes.
27 /// 27 ///
28 /// This returned path may be relative or absolute and it is up to the caller 28 /// This returned path may be relative or absolute and it is up to the caller
29 /// to know how to interpret a relative path. 29 /// to know how to interpret a relative path.
30 String pathFromDescription(description) => description["path"]; 30 String pathFromDescription(description) => description["path"];
31 31
32 /// Returns a reference to a path package named [name] at [path]. 32 /// Returns a reference to a path package named [name] at [path].
33 PackageRef refFor(String name, String path) { 33 PackageRef refFor(String name, String path) {
34 return new PackageRef(name, 'path', { 34 return new PackageRef(name, this, {
35 "path": path, 35 "path": path,
36 "relative": p.isRelative(path) 36 "relative": p.isRelative(path)
37 }); 37 });
38 } 38 }
39 39
40 /// Returns an ID for a path package with the given [name] and [version] at 40 /// Returns an ID for a path package with the given [name] and [version] at
41 /// [path]. 41 /// [path].
42 PackageId idFor(String name, Version version, String path) { 42 PackageId idFor(String name, Version version, String path) {
43 return new PackageId(name, 'path', version, { 43 return new PackageId(name, this, version, {
44 "path": path, 44 "path": path,
45 "relative": p.isRelative(path) 45 "relative": p.isRelative(path)
46 }); 46 });
47 } 47 }
48 48
49 bool descriptionsEqual(description1, description2) { 49 bool descriptionsEqual(description1, description2) {
50 // Compare real paths after normalizing and resolving symlinks. 50 // Compare real paths after normalizing and resolving symlinks.
51 var path1 = canonicalize(description1["path"]); 51 var path1 = canonicalize(description1["path"]);
52 var path2 = canonicalize(description2["path"]); 52 var path2 = canonicalize(description2["path"]);
53 return path1 == path2; 53 return path1 == path2;
54 } 54 }
55 55
56 int hashDescription(description) =>
57 canonicalize(description["path"]).hashCode;
58
56 /// Parses a path dependency. 59 /// Parses a path dependency.
57 /// 60 ///
58 /// This takes in a path string and returns a map. The "path" key will be the 61 /// This takes in a path string and returns a map. The "path" key will be the
59 /// original path but resolved relative to the containing path. The 62 /// original path but resolved relative to the containing path. The
60 /// "relative" key will be `true` if the original path was relative. 63 /// "relative" key will be `true` if the original path was relative.
61 PackageRef parseRef(String name, description, {String containingPath}) { 64 PackageRef parseRef(String name, description, {String containingPath}) {
62 if (description is! String) { 65 if (description is! String) {
63 throw new FormatException("The description must be a path string."); 66 throw new FormatException("The description must be a path string.");
64 } 67 }
65 68
66 // Resolve the path relative to the containing file path, and remember 69 // Resolve the path relative to the containing file path, and remember
67 // whether the original path was relative or absolute. 70 // whether the original path was relative or absolute.
68 var isRelative = p.isRelative(description); 71 var isRelative = p.isRelative(description);
69 if (isRelative) { 72 if (isRelative) {
70 // Relative paths coming from pubspecs that are not on the local file 73 // Relative paths coming from pubspecs that are not on the local file
71 // system aren't allowed. This can happen if a hosted or git dependency 74 // system aren't allowed. This can happen if a hosted or git dependency
72 // has a path dependency. 75 // has a path dependency.
73 if (containingPath == null) { 76 if (containingPath == null) {
74 throw new FormatException('"$description" is a relative path, but this ' 77 throw new FormatException('"$description" is a relative path, but this '
75 'isn\'t a local pubspec.'); 78 'isn\'t a local pubspec.');
76 } 79 }
77 80
78 description = p.normalize( 81 description = p.normalize(
79 p.join(p.dirname(containingPath), description)); 82 p.join(p.dirname(containingPath), description));
80 } 83 }
81 84
82 return new PackageRef(name, this.name, { 85 return new PackageRef(name, this, {
83 "path": description, 86 "path": description,
84 "relative": isRelative 87 "relative": isRelative
85 }); 88 });
86 } 89 }
87 90
88 PackageId parseId(String name, Version version, description) { 91 PackageId parseId(String name, Version version, description) {
89 if (description is! Map) { 92 if (description is! Map) {
90 throw new FormatException("The description must be a map."); 93 throw new FormatException("The description must be a map.");
91 } 94 }
92 95
93 if (description["path"] is! String) { 96 if (description["path"] is! String) {
94 throw new FormatException("The 'path' field of the description must " 97 throw new FormatException("The 'path' field of the description must "
95 "be a string."); 98 "be a string.");
96 } 99 }
97 100
98 if (description["relative"] is! bool) { 101 if (description["relative"] is! bool) {
99 throw new FormatException("The 'relative' field of the description " 102 throw new FormatException("The 'relative' field of the description "
100 "must be a boolean."); 103 "must be a boolean.");
101 } 104 }
102 105
103 return new PackageId(name, this.name, version, description); 106 return new PackageId(name, this, version, description);
104 } 107 }
105 108
106 /// Serializes path dependency's [description]. 109 /// Serializes path dependency's [description].
107 /// 110 ///
108 /// For the descriptions where `relative` attribute is `true`, tries to make 111 /// For the descriptions where `relative` attribute is `true`, tries to make
109 /// `path` relative to the specified [containingPath]. 112 /// `path` relative to the specified [containingPath].
110 dynamic serializeDescription(String containingPath, description) { 113 dynamic serializeDescription(String containingPath, description) {
111 if (description["relative"]) { 114 if (description["relative"]) {
112 return { 115 return {
113 "path": p.relative(description['path'], from: containingPath), 116 "path": p.relative(description['path'], from: containingPath),
(...skipping 19 matching lines...) Expand all
133 final PathSource source; 136 final PathSource source;
134 137
135 final SystemCache systemCache; 138 final SystemCache systemCache;
136 139
137 BoundPathSource(this.source, this.systemCache); 140 BoundPathSource(this.source, this.systemCache);
138 141
139 Future<List<PackageId>> doGetVersions(PackageRef ref) async { 142 Future<List<PackageId>> doGetVersions(PackageRef ref) async {
140 // There's only one package ID for a given path. We just need to find the 143 // There's only one package ID for a given path. We just need to find the
141 // version. 144 // version.
142 var pubspec = _loadPubspec(ref); 145 var pubspec = _loadPubspec(ref);
143 var id = new PackageId( 146 var id = new PackageId(ref.name, source, pubspec.version, ref.description);
144 ref.name, source.name, pubspec.version, ref.description);
145 memoizePubspec(id, pubspec); 147 memoizePubspec(id, pubspec);
146 return [id]; 148 return [id];
147 } 149 }
148 150
149 Future<Pubspec> doDescribe(PackageId id) async => _loadPubspec(id.toRef()); 151 Future<Pubspec> doDescribe(PackageId id) async => _loadPubspec(id.toRef());
150 152
151 Pubspec _loadPubspec(PackageRef ref) { 153 Pubspec _loadPubspec(PackageRef ref) {
152 var dir = _validatePath(ref.name, ref.description); 154 var dir = _validatePath(ref.name, ref.description);
153 return new Pubspec.load(dir, systemCache.sources, expectedName: ref.name); 155 return new Pubspec.load(dir, systemCache.sources, expectedName: ref.name);
154 } 156 }
(...skipping 21 matching lines...) Expand all
176 178
177 if (fileExists(dir)) { 179 if (fileExists(dir)) {
178 fail('Path dependency for package $name must refer to a directory, ' 180 fail('Path dependency for package $name must refer to a directory, '
179 'not a file. Was "$dir".'); 181 'not a file. Was "$dir".');
180 } 182 }
181 183
182 throw new PackageNotFoundException( 184 throw new PackageNotFoundException(
183 'Could not find package $name at "$dir".'); 185 'Could not find package $name at "$dir".');
184 } 186 }
185 } 187 }
OLDNEW
« no previous file with comments | « lib/src/source/hosted.dart ('k') | lib/src/source/unknown.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698