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

Side by Side Diff: utils/pub/io.dart

Issue 11444018: Add a validator that checks package names. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix tests. Created 8 years 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | utils/pub/validator.dart » ('j') | utils/tests/pub/validator_test.dart » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 /** 5 /**
6 * Helper functionality to make working with IO easier. 6 * Helper functionality to make working with IO easier.
7 */ 7 */
8 library io; 8 library io;
9 9
10 import 'dart:io'; 10 import 'dart:io';
(...skipping 23 matching lines...) Expand all
34 stderr.writeString('\n'); 34 stderr.writeString('\n');
35 } 35 }
36 36
37 37
38 /** 38 /**
39 * Joins a number of path string parts into a single path. Handles 39 * Joins a number of path string parts into a single path. Handles
40 * platform-specific path separators. Parts can be [String], [Directory], or 40 * platform-specific path separators. Parts can be [String], [Directory], or
41 * [File] objects. 41 * [File] objects.
42 */ 42 */
43 String join(part1, [part2, part3, part4]) { 43 String join(part1, [part2, part3, part4]) {
44 final parts = _sanitizePath(part1).split('/'); 44 final parts = sanitizePath(part1).split('/');
45 45
46 for (final part in [part2, part3, part4]) { 46 for (final part in [part2, part3, part4]) {
47 if (part == null) continue; 47 if (part == null) continue;
48 48
49 for (final piece in _getPath(part).split('/')) { 49 for (final piece in _getPath(part).split('/')) {
50 if (piece == '..' && parts.length > 0 && 50 if (piece == '..' && parts.length > 0 &&
51 parts.last != '.' && parts.last != '..') { 51 parts.last != '.' && parts.last != '..') {
52 parts.removeLast(); 52 parts.removeLast();
53 } else if (piece != '') { 53 } else if (piece != '') {
54 if (parts.length > 0 && parts.last == '.') { 54 if (parts.length > 0 && parts.last == '.') {
55 parts.removeLast(); 55 parts.removeLast();
56 } 56 }
57 parts.add(piece); 57 parts.add(piece);
58 } 58 }
59 } 59 }
60 } 60 }
61 61
62 return Strings.join(parts, Platform.pathSeparator); 62 return Strings.join(parts, Platform.pathSeparator);
63 } 63 }
64 64
65 /// Splits [path] into its individual components. 65 /// Splits [path] into its individual components.
66 List<String> splitPath(path) => _sanitizePath(path).split('/'); 66 List<String> splitPath(path) => sanitizePath(path).split('/');
67 67
68 /** 68 /**
69 * Gets the basename, the file name without any leading directory path, for 69 * Gets the basename, the file name without any leading directory path, for
70 * [file], which can either be a [String], [File], or [Directory]. 70 * [file], which can either be a [String], [File], or [Directory].
71 */ 71 */
72 // TODO(rnystrom): Copied from file_system (so that we don't have to add 72 // TODO(rnystrom): Copied from file_system (so that we don't have to add
73 // file_system to the SDK). Should unify. 73 // file_system to the SDK). Should unify.
74 String basename(file) { 74 String basename(file) {
75 file = _sanitizePath(file); 75 file = sanitizePath(file);
76 76
77 int lastSlash = file.lastIndexOf('/', file.length); 77 int lastSlash = file.lastIndexOf('/', file.length);
78 if (lastSlash == -1) { 78 if (lastSlash == -1) {
79 return file; 79 return file;
80 } else { 80 } else {
81 return file.substring(lastSlash + 1); 81 return file.substring(lastSlash + 1);
82 } 82 }
83 } 83 }
84 84
85 /** 85 /**
86 * Gets the the leading directory path for [file], which can either be a 86 * Gets the the leading directory path for [file], which can either be a
87 * [String], [File], or [Directory]. 87 * [String], [File], or [Directory].
88 */ 88 */
89 // TODO(nweiz): Copied from file_system (so that we don't have to add 89 // TODO(nweiz): Copied from file_system (so that we don't have to add
90 // file_system to the SDK). Should unify. 90 // file_system to the SDK). Should unify.
91 String dirname(file) { 91 String dirname(file) {
92 file = _sanitizePath(file); 92 file = sanitizePath(file);
93 93
94 int lastSlash = file.lastIndexOf('/', file.length); 94 int lastSlash = file.lastIndexOf('/', file.length);
95 if (lastSlash == -1) { 95 if (lastSlash == -1) {
96 return '.'; 96 return '.';
97 } else { 97 } else {
98 return file.substring(0, lastSlash); 98 return file.substring(0, lastSlash);
99 } 99 }
100 } 100 }
101 101
102 /// Returns whether or not [entry] is nested somewhere within [dir]. This just 102 /// Returns whether or not [entry] is nested somewhere within [dir]. This just
103 /// performs a path comparison; it doesn't look at the actual filesystem. 103 /// performs a path comparison; it doesn't look at the actual filesystem.
104 bool isBeneath(entry, dir) => 104 bool isBeneath(entry, dir) =>
105 _sanitizePath(entry).startsWith('${_sanitizePath(dir)}/'); 105 sanitizePath(entry).startsWith('${sanitizePath(dir)}/');
106 106
107 /** 107 /**
108 * Asynchronously determines if [path], which can be a [String] file path, a 108 * Asynchronously determines if [path], which can be a [String] file path, a
109 * [File], or a [Directory] exists on the file system. Returns a [Future] that 109 * [File], or a [Directory] exists on the file system. Returns a [Future] that
110 * completes with the result. 110 * completes with the result.
111 */ 111 */
112 Future<bool> exists(path) { 112 Future<bool> exists(path) {
113 path = _getPath(path); 113 path = _getPath(path);
114 return Futures.wait([fileExists(path), dirExists(path)]).transform((results) { 114 return Futures.wait([fileExists(path), dirExists(path)]).transform((results) {
115 return results[0] || results[1]; 115 return results[0] || results[1];
(...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after
987 * or be a [File] or [Directory]. Allows working generically with "file-like" 987 * or be a [File] or [Directory]. Allows working generically with "file-like"
988 * objects. 988 * objects.
989 */ 989 */
990 String _getPath(entry) { 990 String _getPath(entry) {
991 if (entry is String) return entry; 991 if (entry is String) return entry;
992 if (entry is File) return entry.name; 992 if (entry is File) return entry.name;
993 if (entry is Directory) return entry.path; 993 if (entry is Directory) return entry.path;
994 throw 'Entry $entry is not a supported type.'; 994 throw 'Entry $entry is not a supported type.';
995 } 995 }
996 996
997 /// Gets the path string for [entry] as in [_getPath], but normalizes 997 /// Gets the path string for [entry], normalizing backslashes to forward slashes
998 /// backslashes to forward slashes on Windows. 998 /// on Windows.
999 String _sanitizePath(entry) { 999 String sanitizePath(entry) {
1000 entry = _getPath(entry); 1000 entry = _getPath(entry);
1001 if (Platform.operatingSystem != 'windows') return entry; 1001 if (Platform.operatingSystem != 'windows') return entry;
1002 1002
1003 var split = _splitAbsolute(entry); 1003 var split = _splitAbsolute(entry);
1004 if (split.first == null) return split.last.replaceAll('\\', '/'); 1004 if (split.first == null) return split.last.replaceAll('\\', '/');
1005 1005
1006 // For absolute Windows paths, we don't want the prefix (either "\\" or e.g. 1006 // For absolute Windows paths, we don't want the prefix (either "\\" or e.g.
1007 // "C:\") to look like a normal path component, so we ensure that it only 1007 // "C:\") to look like a normal path component, so we ensure that it only
1008 // contains backslashes. 1008 // contains backslashes.
1009 return '${split.first.replaceAll('/', '\\')}' 1009 return '${split.first.replaceAll('/', '\\')}'
1010 '${split.last.replaceAll('\\', '/')}'; 1010 '${split.last.replaceAll('\\', '/')}';
1011 } 1011 }
1012 1012
1013 /** 1013 /**
1014 * Gets a [Directory] for [entry], which can either already be one, or be a 1014 * Gets a [Directory] for [entry], which can either already be one, or be a
1015 * [String]. 1015 * [String].
1016 */ 1016 */
1017 Directory _getDirectory(entry) { 1017 Directory _getDirectory(entry) {
1018 if (entry is Directory) return entry; 1018 if (entry is Directory) return entry;
1019 return new Directory(entry); 1019 return new Directory(entry);
1020 } 1020 }
1021 1021
1022 /** 1022 /**
1023 * Gets a [Uri] for [uri], which can either already be one, or be a [String]. 1023 * Gets a [Uri] for [uri], which can either already be one, or be a [String].
1024 */ 1024 */
1025 Uri _getUri(uri) { 1025 Uri _getUri(uri) {
1026 if (uri is Uri) return uri; 1026 if (uri is Uri) return uri;
1027 return new Uri.fromString(uri); 1027 return new Uri.fromString(uri);
1028 } 1028 }
OLDNEW
« no previous file with comments | « no previous file | utils/pub/validator.dart » ('j') | utils/tests/pub/validator_test.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698