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

Unified Diff: utils/pub/io.dart

Issue 11308298: Restrict the set of files that will be pub lished. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « utils/pub/command_lish.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: utils/pub/io.dart
diff --git a/utils/pub/io.dart b/utils/pub/io.dart
index 0c6903f19483ed0f3ecb276ca251f902be2cc5dc..803b8feed24f03323191f0ec268ad7243943a357 100644
--- a/utils/pub/io.dart
+++ b/utils/pub/io.dart
@@ -62,6 +62,8 @@ String join(part1, [part2, part3, part4]) {
return Strings.join(parts, Platform.pathSeparator);
}
+List<String> splitPath(path) => _sanitizePath(path).split('/');
Bob Nystrom 2012/11/30 21:31:59 Doc comment.
nweiz 2012/11/30 21:37:45 Done.
+
/**
* Gets the basename, the file name without any leading directory path, for
* [file], which can either be a [String], [File], or [Directory].
@@ -245,8 +247,8 @@ Future<Directory> deleteDir(dir) {
/**
* Asynchronously lists the contents of [dir], which can be a [String] directory
* path or a [Directory]. If [recursive] is `true`, lists subdirectory contents
- * (defaults to `false`). If [includeHiddenFiles] is `true`, includes files
- * beginning with `.` (defaults to `false`).
+ * (defaults to `false`). If [includeHiddenFiles] is `true`, includes files and
+ * directories beginning with `.` (defaults to `false`).
*/
Future<List<String>> listDir(dir,
{bool recursive: false, bool includeHiddenFiles: false}) {
@@ -271,7 +273,10 @@ Future<List<String>> listDir(dir,
}
lister.onError = (error) => completer.completeException(error, stackTrace);
- lister.onDir = (file) => contents.add(file);
+ lister.onDir = (file) {
+ if (!includeHiddenFiles && basename(file).startsWith('.')) return;
+ contents.add(file);
+ };
lister.onFile = (file) {
if (!includeHiddenFiles && basename(file).startsWith('.')) return;
contents.add(file);
@@ -372,14 +377,7 @@ String getFullPath(entry) {
var path = _getPath(entry);
// Don't do anything if it's already absolute.
- if (Platform.operatingSystem == 'windows') {
- // An absolute path on Windows is either UNC (two leading backslashes),
- // or a drive letter followed by a colon and a slash.
- var ABSOLUTE = new RegExp(r'^(\\\\|[a-zA-Z]:[/\\])');
- if (ABSOLUTE.hasMatch(path)) return path;
- } else {
- if (path.startsWith('/')) return path;
- }
+ if (isAbsolute(path)) return path;
// Using Path.join here instead of File().fullPathSync() because the former
// does not require an actual file to exist at that path.
@@ -387,6 +385,23 @@ String getFullPath(entry) {
.toNativePath();
}
+bool isAbsolute(entry) => _splitAbsolute(entry).first != null;
+
+Pair<String, String> _splitAbsolute(entry) {
+ var path = _getPath(entry);
+
+ if (Platform.operatingSystem != 'windows') {
+ return !path.startsWith('/') ? new Pair(null, path)
+ : new Pair('/', path.substring(1));
+ }
+
+ // An absolute path on Windows is either UNC (two leading backslashes),
+ // or a drive letter followed by a colon and a slash.
+ var match = new RegExp(r'^(\\\\|[a-zA-Z]:[/\\])').firstMatch(path);
+ return match == null ? new Pair(null, path)
+ : new Pair(match.group(0), path.substring(match.end));
+}
+
/// Resolves [path] relative to the location of pub.dart.
String relativeToPub(String path) {
var scriptPath = new File(new Options().script).fullPathSync();
@@ -950,10 +965,16 @@ String _getPath(entry) {
/// backslashes to forward slashes on Windows.
String _sanitizePath(entry) {
entry = _getPath(entry);
- if (Platform.operatingSystem == 'windows') {
- entry = entry.replaceAll('\\', '/');
- }
- return entry;
+ if (Platform.operatingSystem != 'windows') return entry;
+
+ var split = _splitAbsolute(entry);
+ if (split.first == null) return split.last.replaceAll('\\', '/');
+
+ // For absolute Windows paths, we don't want the prefix (either "\\" or e.g.
+ // "C:\") to look like a normal path component, so we ensure that it only
+ // contains backslashes.
+ return '${split.first.replaceAll('/', '\\')}'
+ '${split.last.replaceAll('\\', '/')}';
}
/**
« no previous file with comments | « utils/pub/command_lish.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698