OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 library package_config.packages_file; | 5 library package_config.packages_file; |
6 | 6 |
7 import "package:charcode/ascii.dart"; | 7 import "package:charcode/ascii.dart"; |
8 import "src/util.dart" show isValidPackageName; | 8 import "src/util.dart" show isValidPackageName; |
9 | 9 |
10 /// Parses a `.packages` file into a map from package name to base URI. | 10 /// Parses a `.packages` file into a map from package name to base URI. |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 | 73 |
74 /// Writes the mapping to a [StringSink]. | 74 /// Writes the mapping to a [StringSink]. |
75 /// | 75 /// |
76 /// If [comment] is provided, the output will contain this comment | 76 /// If [comment] is provided, the output will contain this comment |
77 /// with `# ` in front of each line. | 77 /// with `# ` in front of each line. |
78 /// Lines are defined as ending in line feed (`'\n'`). If the final | 78 /// Lines are defined as ending in line feed (`'\n'`). If the final |
79 /// line of the comment doesn't end in a line feed, one will be added. | 79 /// line of the comment doesn't end in a line feed, one will be added. |
80 /// | 80 /// |
81 /// If [baseUri] is provided, package locations will be made relative | 81 /// If [baseUri] is provided, package locations will be made relative |
82 /// to the base URI, if possible, before writing. | 82 /// to the base URI, if possible, before writing. |
| 83 /// |
| 84 /// All the keys of [packageMapping] must be valid package names, |
| 85 /// and the values must be URIs that do not have the `package:` scheme. |
83 void write(StringSink output, Map<String, Uri> packageMapping, | 86 void write(StringSink output, Map<String, Uri> packageMapping, |
84 {Uri baseUri, String comment}) { | 87 {Uri baseUri, String comment}) { |
85 if (baseUri != null && !baseUri.isAbsolute) { | 88 if (baseUri != null && !baseUri.isAbsolute) { |
86 throw new ArgumentError.value(baseUri, "baseUri", "Must be absolute"); | 89 throw new ArgumentError.value(baseUri, "baseUri", "Must be absolute"); |
87 } | 90 } |
88 | 91 |
89 if (comment != null) { | 92 if (comment != null) { |
90 var lines = comment.split('\n'); | 93 var lines = comment.split('\n'); |
91 if (lines.last.isEmpty) lines.removeLast(); | 94 if (lines.last.isEmpty) lines.removeLast(); |
92 for (var commentLine in lines) { | 95 for (var commentLine in lines) { |
93 output.write('# '); | 96 output.write('# '); |
94 output.writeln(commentLine); | 97 output.writeln(commentLine); |
95 } | 98 } |
96 } else { | 99 } else { |
97 output.write("# generated by package:package_config at "); | 100 output.write("# generated by package:package_config at "); |
98 output.write(new DateTime.now()); | 101 output.write(new DateTime.now()); |
99 output.writeln(); | 102 output.writeln(); |
100 } | 103 } |
101 | 104 |
102 packageMapping.forEach((String packageName, Uri uri) { | 105 packageMapping.forEach((String packageName, Uri uri) { |
103 // Validate packageName. | 106 // Validate packageName. |
104 if (!isValidPackageName(packageName)) { | 107 if (!isValidPackageName(packageName)) { |
105 throw new ArgumentError('"$packageName" is not a valid package name'); | 108 throw new ArgumentError('"$packageName" is not a valid package name'); |
106 } | 109 } |
| 110 if (uri.scheme == "package") { |
| 111 throw new ArgumentError.value( |
| 112 "Package location must not be a package: URI", uri); |
| 113 } |
107 output.write(packageName); | 114 output.write(packageName); |
108 output.write(':'); | 115 output.write(':'); |
109 // If baseUri provided, make uri relative. | 116 // If baseUri provided, make uri relative. |
110 if (baseUri != null) { | 117 if (baseUri != null) { |
111 uri = _relativize(uri, baseUri); | 118 uri = _relativize(uri, baseUri); |
112 } | 119 } |
113 output.write(uri); | 120 output.write(uri); |
114 if (!uri.path.endsWith('/')) { | 121 if (!uri.path.endsWith('/')) { |
115 output.write('/'); | 122 output.write('/'); |
116 } | 123 } |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 } else if (index > 0) { | 181 } else if (index > 0) { |
175 return new Uri( | 182 return new Uri( |
176 path: '../' * (base.length - index) + target.skip(index).join('/')); | 183 path: '../' * (base.length - index) + target.skip(index).join('/')); |
177 } else { | 184 } else { |
178 return uri; | 185 return uri; |
179 } | 186 } |
180 } | 187 } |
181 | 188 |
182 // TODO: inline to uri.normalizePath() when we move to 1.11 | 189 // TODO: inline to uri.normalizePath() when we move to 1.11 |
183 Uri _normalizePath(Uri uri) => new Uri().resolveUri(uri); | 190 Uri _normalizePath(Uri uri) => new Uri().resolveUri(uri); |
OLD | NEW |