| Index: sdk/lib/io/path_impl.dart
|
| diff --git a/sdk/lib/io/path_impl.dart b/sdk/lib/io/path_impl.dart
|
| index 58e7ce3abb261a3e45d08e72993310e0ab6a20fa..2a661e0d5d831b0898deb7e0fe418005c0315391 100644
|
| --- a/sdk/lib/io/path_impl.dart
|
| +++ b/sdk/lib/io/path_impl.dart
|
| @@ -4,31 +4,38 @@
|
|
|
| class _Path implements Path {
|
| final String _path;
|
| + final bool isWindowsShare;
|
|
|
| - _Path(String source) : _path = source;
|
| - _Path.fromNative(String source) : _path = _clean(source);
|
| + _Path(String source) : _path = source, isWindowsShare = false;
|
|
|
| - int get hashCode => _path.hashCode;
|
| + _Path.fromNative(String source)
|
| + : _path = _clean(source), isWindowsShare = _isWindowsShare(source);
|
| +
|
| + _Path._internal(String this._path, bool this.isWindowsShare);
|
|
|
| static String _clean(String source) {
|
| - switch (Platform.operatingSystem) {
|
| - case 'windows':
|
| - return _cleanWindows(source);
|
| - default:
|
| - return source;
|
| - }
|
| + if (Platform.operatingSystem == 'windows') return _cleanWindows(source);
|
| + return source;
|
| }
|
|
|
| - static String _cleanWindows(source) {
|
| + static String _cleanWindows(String source) {
|
| // Change \ to /.
|
| var clean = source.replaceAll('\\', '/');
|
| // Add / before intial [Drive letter]:
|
| if (clean.length >= 2 && clean[1] == ':') {
|
| clean = '/$clean';
|
| }
|
| + if (_isWindowsShare(source)) {
|
| + return clean.substring(1, clean.length);
|
| + }
|
| return clean;
|
| }
|
|
|
| + static bool _isWindowsShare(String source) {
|
| + return Platform.operatingSystem == 'windows' && source.startsWith('\\\\');
|
| + }
|
| +
|
| + int get hashCode => _path.hashCode;
|
| bool get isEmpty => _path.isEmpty;
|
| bool get isAbsolute => _path.startsWith('/');
|
| bool get hasTrailingSeparator => _path.endsWith('/');
|
| @@ -42,7 +49,8 @@ class _Path implements Path {
|
| // Throws an exception if no such path exists, or the case is not
|
| // implemented yet.
|
| var basePath = base.toString();
|
| - if (base.isAbsolute && _path.startsWith(basePath)) {
|
| + if (base.isAbsolute && _path.startsWith(basePath) &&
|
| + base.isWindowsShare == isWindowsShare) {
|
| if (_path == basePath) return new Path('.');
|
| if (base.hasTrailingSeparator) {
|
| return new Path(_path.substring(basePath.length));
|
| @@ -50,7 +58,8 @@ class _Path implements Path {
|
| if (_path[basePath.length] == '/') {
|
| return new Path(_path.substring(basePath.length + 1));
|
| }
|
| - } else if (base.isAbsolute && isAbsolute) {
|
| + } else if (base.isAbsolute && isAbsolute &&
|
| + base.isWindowsShare == isWindowsShare) {
|
| List<String> baseSegments = base.canonicalize().segments();
|
| List<String> pathSegments = canonicalize().segments();
|
| int common = 0;
|
| @@ -90,9 +99,11 @@ class _Path implements Path {
|
| return further.canonicalize();
|
| }
|
| if (hasTrailingSeparator) {
|
| - return new Path('$_path${further}').canonicalize();
|
| + var joined = new _Path._internal('$_path${further}', isWindowsShare);
|
| + return joined.canonicalize();
|
| }
|
| - return new Path('$_path/${further}').canonicalize();
|
| + var joined = new _Path._internal('$_path/${further}', isWindowsShare);
|
| + return joined.canonicalize();
|
| }
|
|
|
| // Note: The URI RFC names for these operations are normalize, resolve, and
|
| @@ -182,7 +193,8 @@ class _Path implements Path {
|
| segmentsToJoin.add('');
|
| }
|
| }
|
| - return new Path(Strings.join(segmentsToJoin, '/'));
|
| + return new _Path._internal(Strings.join(segmentsToJoin, '/'),
|
| + isWindowsShare);
|
| }
|
|
|
| String toNativePath() {
|
| @@ -195,6 +207,9 @@ class _Path implements Path {
|
| nativePath = nativePath.substring(1);
|
| }
|
| nativePath = nativePath.replaceAll('/', '\\');
|
| + if (isWindowsShare) {
|
| + return '\\$nativePath';
|
| + }
|
| return nativePath;
|
| }
|
| return _path;
|
| @@ -209,11 +224,11 @@ class _Path implements Path {
|
|
|
| Path append(String finalSegment) {
|
| if (isEmpty) {
|
| - return new Path(finalSegment);
|
| + return new _Path._internal(finalSegment, isWindowsShare);
|
| } else if (hasTrailingSeparator) {
|
| - return new Path('$_path$finalSegment');
|
| + return new _Path._internal('$_path$finalSegment', isWindowsShare);
|
| } else {
|
| - return new Path('$_path/$finalSegment');
|
| + return new _Path._internal('$_path/$finalSegment', isWindowsShare);
|
| }
|
| }
|
|
|
| @@ -234,7 +249,8 @@ class _Path implements Path {
|
| int pos = _path.lastIndexOf('/');
|
| if (pos < 0) return new Path('');
|
| while (pos > 0 && _path[pos - 1] == '/') --pos;
|
| - return new Path((pos > 0) ? _path.substring(0, pos) : '/');
|
| + var dirPath = (pos > 0) ? _path.substring(0, pos) : '/';
|
| + return new _Path._internal(dirPath, isWindowsShare);
|
| }
|
|
|
| String get filename {
|
|
|