| Index: utils/pub/io.dart
|
| diff --git a/utils/pub/io.dart b/utils/pub/io.dart
|
| index 381889db264a782c8a144fcb99dd9c5927f385b4..5694abb8c1e87f3af7f5697291734930db905fce 100644
|
| --- a/utils/pub/io.dart
|
| +++ b/utils/pub/io.dart
|
| @@ -128,12 +128,10 @@ String createTempDir([dir = '']) {
|
| return tempDir.path;
|
| }
|
|
|
| -// TODO(nweiz): Remove this when issue 9252 is fixed.
|
| -/// Asynchronously recursively deletes [dir]. Returns a [Future] that completes
|
| -/// when the deletion is done.
|
| -Future<String> deleteDir(String dir) {
|
| - return _attemptRetryable(() => log.ioAsync("delete directory $dir",
|
| - new Directory(dir).delete(recursive: true).then((_) => dir)));
|
| +/// Recursively deletes [dir].
|
| +void deleteDir(String dir) {
|
| + log.io("Deleting directory $dir.");
|
| + new Directory(dir).deleteSync(recursive: true);
|
| }
|
|
|
| /// Asynchronously lists the contents of [dir]. If [recursive] is `true`, lists
|
| @@ -208,66 +206,24 @@ Future<List<String>> listDir(String dir,
|
| bool dirExists(String dir) => new Directory(dir).existsSync();
|
|
|
| /// "Cleans" [dir]. If that directory already exists, it will be deleted. Then a
|
| -/// new empty directory will be created. Returns a [Future] that completes when
|
| -/// the new clean directory is created.
|
| -Future<String> cleanDir(String dir) {
|
| - return defer(() {
|
| - if (dirExists(dir)) {
|
| - // Delete it first.
|
| - return deleteDir(dir).then((_) => createDir(dir));
|
| - }
|
| -
|
| - if (fileExists(dir)) {
|
| - // If there is a non-directory there (file or symlink), delete it.
|
| - deleteFile(dir);
|
| - return createDir(dir);
|
| - }
|
| +/// new empty directory will be created.
|
| +void cleanDir(String dir) {
|
| + if (dirExists(dir)) {
|
| + // Delete it first.
|
| + deleteDir(dir);
|
| + } else if (fileExists(dir)) {
|
| + // If there is a non-directory there (file or symlink), delete it.
|
| + deleteFile(dir);
|
| + }
|
|
|
| - // Just create it.
|
| - return createDir(dir);
|
| - });
|
| + // Just create it.
|
| + createDir(dir);
|
| }
|
|
|
| -// TODO(nweiz): remove this when issue 9253 is fixed.
|
| -/// Renames (i.e. moves) the directory [from] to [to]. Returns a [Future] with
|
| -/// the destination directory.
|
| -Future<String> renameDir(String from, String to) {
|
| +/// Renames (i.e. moves) the directory [from] to [to].
|
| +void renameDir(String from, String to) {
|
| log.io("Renaming directory $from to $to.");
|
| -
|
| - return _attemptRetryable(() => new Directory(from).rename(to)).then((dir) {
|
| - log.fine("Renamed directory $from to $to.");
|
| - return to;
|
| - });
|
| -}
|
| -
|
| -/// On Windows, we sometimes get failures where the directory is still in use
|
| -/// when we try to do something with it. This is usually because the OS hasn't
|
| -/// noticed yet that a process using that directory has closed. To be a bit
|
| -/// more resilient, we wait and retry a few times.
|
| -///
|
| -/// Takes a [callback] which returns a future for the operation being attempted.
|
| -/// If that future completes with an error, it will slepp and then [callback]
|
| -/// will be invoked again to retry the operation. It will try a few times before
|
| -/// giving up.
|
| -Future _attemptRetryable(Future callback()) {
|
| - // Only do lame retry logic on Windows.
|
| - if (Platform.operatingSystem != 'windows') return callback();
|
| -
|
| - var attempts = 0;
|
| - makeAttempt(_) {
|
| - attempts++;
|
| - return callback().catchError((e) {
|
| - if (attempts >= 10) {
|
| - throw 'Could not complete operation. Gave up after $attempts attempts.';
|
| - }
|
| -
|
| - // Wait a bit and try again.
|
| - log.fine("Operation failed, retrying (attempt $attempts).");
|
| - return sleep(500).then(makeAttempt);
|
| - });
|
| - }
|
| -
|
| - return makeAttempt(null);
|
| + new Directory(from).renameSync(to);
|
| }
|
|
|
| /// Creates a new symlink at path [symlink] that points to [target]. Returns a
|
| @@ -620,16 +576,16 @@ Future timeout(Future input, int milliseconds, String description) {
|
|
|
| /// Creates a temporary directory and passes its path to [fn]. Once the [Future]
|
| /// returned by [fn] completes, the temporary directory and all its contents
|
| -/// will be deleted.
|
| +/// will be deleted. [fn] can also return `null`, in which case the temporary
|
| +/// directory is deleted immediately afterwards.
|
| ///
|
| /// Returns a future that completes to the value that the future returned from
|
| /// [fn] completes to.
|
| Future withTempDir(Future fn(String path)) {
|
| return defer(() {
|
| var tempDir = createTempDir();
|
| - return fn(tempDir).whenComplete(() {
|
| - return deleteDir(tempDir);
|
| - });
|
| + return new Future.of(() => fn(tempDir))
|
| + .whenComplete(() => deleteDir(tempDir));
|
| });
|
| }
|
|
|
|
|