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

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

Issue 12772005: Handle broken symlinks when creating package dirs. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Revise. Created 7 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « utils/pub/entrypoint.dart ('k') | utils/pub/path_source.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) 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 /// Helper functionality to make working with IO easier. 5 /// Helper functionality to make working with IO easier.
6 library io; 6 library io;
7 7
8 import 'dart:async'; 8 import 'dart:async';
9 import 'dart:io'; 9 import 'dart:io';
10 import 'dart:isolate'; 10 import 'dart:isolate';
(...skipping 11 matching lines...) Expand all
22 22
23 final NEWLINE_PATTERN = new RegExp("\r\n?|\n\r?"); 23 final NEWLINE_PATTERN = new RegExp("\r\n?|\n\r?");
24 24
25 /// Returns whether or not [entry] is nested somewhere within [dir]. This just 25 /// Returns whether or not [entry] is nested somewhere within [dir]. This just
26 /// performs a path comparison; it doesn't look at the actual filesystem. 26 /// performs a path comparison; it doesn't look at the actual filesystem.
27 bool isBeneath(String entry, String dir) { 27 bool isBeneath(String entry, String dir) {
28 var relative = path.relative(entry, from: dir); 28 var relative = path.relative(entry, from: dir);
29 return !path.isAbsolute(relative) && path.split(relative)[0] != '..'; 29 return !path.isAbsolute(relative) && path.split(relative)[0] != '..';
30 } 30 }
31 31
32 /// Determines if a file or directory at [path] exists. 32 /// Determines if a file or directory exists at [path].
33 bool entryExists(String path) => fileExists(path) || dirExists(path); 33 bool entryExists(String path) => dirExists(path) || fileExists(path);
34 34
35 /// Determines if [file] exists on the file system. 35 /// Determines if [file] exists on the file system. Will also return `true` if
36 bool fileExists(String file) => new File(file).existsSync(); 36 /// [file] points to a symlink, even a directory symlink.
37 bool fileExists(String file) =>
38 new File(file).existsSync() || new Link(file).existsSync();
37 39
38 /// Reads the contents of the text file [file]. 40 /// Reads the contents of the text file [file].
39 String readTextFile(String file) => 41 String readTextFile(String file) =>
40 new File(file).readAsStringSync(Encoding.UTF_8); 42 new File(file).readAsStringSync(Encoding.UTF_8);
41 43
42 /// Reads the contents of the binary file [file]. 44 /// Reads the contents of the binary file [file].
43 List<int> readBinaryFile(String file) { 45 List<int> readBinaryFile(String file) {
44 log.io("Reading binary file $file."); 46 log.io("Reading binary file $file.");
45 var contents = new File(file).readAsBytesSync(); 47 var contents = new File(file).readAsBytesSync();
46 log.io("Read ${contents.length} bytes from $file."); 48 log.io("Read ${contents.length} bytes from $file.");
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 bool dirExists(String dir) => new Directory(dir).existsSync(); 207 bool dirExists(String dir) => new Directory(dir).existsSync();
206 208
207 /// "Cleans" [dir]. If that directory already exists, it will be deleted. Then a 209 /// "Cleans" [dir]. If that directory already exists, it will be deleted. Then a
208 /// new empty directory will be created. Returns a [Future] that completes when 210 /// new empty directory will be created. Returns a [Future] that completes when
209 /// the new clean directory is created. 211 /// the new clean directory is created.
210 Future<String> cleanDir(String dir) { 212 Future<String> cleanDir(String dir) {
211 return defer(() { 213 return defer(() {
212 if (dirExists(dir)) { 214 if (dirExists(dir)) {
213 // Delete it first. 215 // Delete it first.
214 return deleteDir(dir).then((_) => createDir(dir)); 216 return deleteDir(dir).then((_) => createDir(dir));
215 } else { 217 }
216 // Just create it. 218
219 if (fileExists(dir)) {
220 // If there is a non-directory there (file or symlink), delete it.
221 deleteFile(dir);
217 return createDir(dir); 222 return createDir(dir);
218 } 223 }
224
225 // Just create it.
226 return createDir(dir);
219 }); 227 });
220 } 228 }
221 229
222 /// Renames (i.e. moves) the directory [from] to [to]. Returns a [Future] with 230 /// Renames (i.e. moves) the directory [from] to [to]. Returns a [Future] with
223 /// the destination directory. 231 /// the destination directory.
224 Future<String> renameDir(String from, String to) { 232 Future<String> renameDir(String from, String to) {
225 log.io("Renaming directory $from to $to."); 233 log.io("Renaming directory $from to $to.");
226 234
227 return _attemptRetryable(() => new Directory(from).rename(to)).then((dir) { 235 return _attemptRetryable(() => new Directory(from).rename(to)).then((dir) {
228 log.fine("Renamed directory $from to $to."); 236 log.fine("Renamed directory $from to $to.");
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after
802 const PubProcessResult(this.stdout, this.stderr, this.exitCode); 810 const PubProcessResult(this.stdout, this.stderr, this.exitCode);
803 811
804 bool get success => exitCode == 0; 812 bool get success => exitCode == 0;
805 } 813 }
806 814
807 /// Gets a [Uri] for [uri], which can either already be one, or be a [String]. 815 /// Gets a [Uri] for [uri], which can either already be one, or be a [String].
808 Uri _getUri(uri) { 816 Uri _getUri(uri) {
809 if (uri is Uri) return uri; 817 if (uri is Uri) return uri;
810 return Uri.parse(uri); 818 return Uri.parse(uri);
811 } 819 }
OLDNEW
« no previous file with comments | « utils/pub/entrypoint.dart ('k') | utils/pub/path_source.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698