| Index: sdk/lib/_internal/pub/lib/src/io.dart
|
| diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
|
| index 52752b15209bb4c9875f646d6de35b0f33554695..ea6b19eb7801e78083e929f8b0440a6d84b8cdb8 100644
|
| --- a/sdk/lib/_internal/pub/lib/src/io.dart
|
| +++ b/sdk/lib/_internal/pub/lib/src/io.dart
|
| @@ -36,17 +36,22 @@ final _descriptorPool = new Pool(32);
|
| bool entryExists(String path) =>
|
| dirExists(path) || fileExists(path) || linkExists(path);
|
|
|
| -/// Returns whether [link] exists on the file system. This will return `true`
|
| -/// for any symlink, regardless of what it points at or whether it's broken.
|
| +/// Returns whether [link] exists on the file system.
|
| +///
|
| +/// This returns `true` for any symlink, regardless of what it points at or
|
| +/// whether it's broken.
|
| bool linkExists(String link) => new Link(link).existsSync();
|
|
|
| -/// Returns whether [file] exists on the file system. This will return `true`
|
| -/// for a symlink only if that symlink is unbroken and points to a file.
|
| +/// Returns whether [file] exists on the file system.
|
| +///
|
| +/// This returns `true` for a symlink only if that symlink is unbroken and
|
| +/// points to a file.
|
| bool fileExists(String file) => new File(file).existsSync();
|
|
|
| -/// Returns the canonical path for [pathString]. This is the normalized,
|
| -/// absolute path, with symlinks resolved. As in [transitiveTarget], broken or
|
| -/// recursive symlinks will not be fully resolved.
|
| +/// Returns the canonical path for [pathString].
|
| +///
|
| +/// This is the normalized, absolute path, with symlinks resolved. As in
|
| +/// [transitiveTarget], broken or recursive symlinks will not be fully resolved.
|
| ///
|
| /// This doesn't require [pathString] to point to a path that exists on the
|
| /// filesystem; nonexistent or unreadable path entries are treated as normal
|
| @@ -125,8 +130,10 @@ String canonicalize(String pathString) {
|
| }
|
|
|
| /// Returns the transitive target of [link] (if A links to B which links to C,
|
| -/// this will return C). If [link] is part of a symlink loop (e.g. A links to B
|
| -/// which links back to A), this returns the path to the first repeated link (so
|
| +/// this will return C).
|
| +///
|
| +/// If [link] is part of a symlink loop (e.g. A links to B which links back to
|
| +/// A), this returns the path to the first repeated link (so
|
| /// `transitiveTarget("A")` would return `"A"` and `transitiveTarget("A")` would
|
| /// return `"B"`).
|
| ///
|
| @@ -178,8 +185,10 @@ String writeBinaryFile(String file, List<int> contents) {
|
| return file;
|
| }
|
|
|
| -/// Writes [stream] to a new file at path [file]. Will replace any file already
|
| -/// at that path. Completes when the file is done being written.
|
| +/// Writes [stream] to a new file at path [file].
|
| +///
|
| +/// Replaces any file already at that path. Completes when the file is done
|
| +/// being written.
|
| Future<String> createFileFromStream(Stream<List<int>> stream, String file) {
|
| // TODO(nweiz): remove extra logging when we figure out the windows bot issue.
|
| log.io("Creating $file from stream.");
|
| @@ -192,9 +201,11 @@ Future<String> createFileFromStream(Stream<List<int>> stream, String file) {
|
| });
|
| }
|
|
|
| -/// Copy all files in [files] to the directory [destination]. Their locations in
|
| -/// [destination] will be determined by their relative location to [baseDir].
|
| -/// Any existing files at those paths will be overwritten.
|
| +/// Copies all files in [files] to the directory [destination].
|
| +///
|
| +/// Their locations in [destination] will be determined by their relative
|
| +/// location to [baseDir]. Any existing files at those paths will be
|
| +/// overwritten.
|
| void copyFiles(Iterable<String> files, String baseDir, String destination) {
|
| for (var file in files) {
|
| var newPath = path.join(destination, path.relative(file, from: baseDir));
|
| @@ -203,7 +214,7 @@ void copyFiles(Iterable<String> files, String baseDir, String destination) {
|
| }
|
| }
|
|
|
| -/// Copy a file from [source] to [destination].
|
| +/// Copies a file from [source] to [destination].
|
| void copyFile(String source, String destination) {
|
| writeBinaryFile(destination, readBinaryFile(source));
|
| }
|
| @@ -214,8 +225,9 @@ String createDir(String dir) {
|
| return dir;
|
| }
|
|
|
| -/// Ensures that [dir] and all its parent directories exist. If they don't
|
| -/// exist, creates them.
|
| +/// Ensures that [dir] and all its parent directories exist.
|
| +///
|
| +/// If they don't exist, creates them.
|
| String ensureDir(String dir) {
|
| new Directory(dir).createSync(recursive: true);
|
| return dir;
|
| @@ -223,6 +235,7 @@ String ensureDir(String dir) {
|
|
|
| /// Creates a temp directory in [dir], whose name will be [prefix] with
|
| /// characters appended to it to make a unique name.
|
| +///
|
| /// Returns the path of the created directory.
|
| String createTempDir(String base, String prefix) {
|
| var tempDir = new Directory(base).createTempSync(prefix);
|
| @@ -232,6 +245,7 @@ String createTempDir(String base, String prefix) {
|
|
|
| /// Creates a temp directory in the system temp directory, whose name will be
|
| /// 'pub_' with characters appended to it to make a unique name.
|
| +///
|
| /// Returns the path of the created directory.
|
| String createSystemTempDir() {
|
| var tempDir = Directory.systemTemp.createTempSync('pub_');
|
| @@ -239,9 +253,11 @@ String createSystemTempDir() {
|
| return tempDir.path;
|
| }
|
|
|
| -/// Lists the contents of [dir]. If [recursive] is `true`, lists subdirectory
|
| -/// contents (defaults to `false`). If [includeHidden] is `true`, includes files
|
| -/// and directories beginning with `.` (defaults to `false`).
|
| +/// Lists the contents of [dir].
|
| +///
|
| +/// If [recursive] is `true`, lists subdirectory contents (defaults to
|
| +/// `false`). If [includeHidden] is `true`, includes files and directories
|
| +/// beginning with `.` (defaults to `false`).
|
| ///
|
| /// Note that dart:io handles recursive symlinks in an unfortunate way. You
|
| /// end up with two copies of every entity that is within the recursive loop.
|
| @@ -266,11 +282,13 @@ List<String> listDir(String dir, {bool recursive: false,
|
| return entities.map((entity) => entity.path).toList();
|
| }
|
|
|
| -/// Returns whether [dir] exists on the file system. This will return `true` for
|
| -/// a symlink only if that symlink is unbroken and points to a directory.
|
| +/// Returns whether [dir] exists on the file system.
|
| +///
|
| +/// This returns `true` for a symlink only if that symlink is unbroken and
|
| +/// points to a directory.
|
| bool dirExists(String dir) => new Directory(dir).existsSync();
|
|
|
| -/// Try to resiliently perform [operation].
|
| +/// Tries to resiliently perform [operation].
|
| ///
|
| /// Some file system operations can intermittently fail on Windows because
|
| /// other processes are locking a file. We've seen this with virus scanners
|
| @@ -321,8 +339,9 @@ void _attempt(String description, void operation()) {
|
| }
|
| }
|
|
|
| -/// Deletes whatever's at [path], whether it's a file, directory, or symlink. If
|
| -/// it's a directory, it will be deleted recursively.
|
| +/// Deletes whatever's at [path], whether it's a file, directory, or symlink.
|
| +///
|
| +/// If it's a directory, it will be deleted recursively.
|
| void deleteEntry(String path) {
|
| _attempt("delete entry", () {
|
| if (linkExists(path)) {
|
| @@ -338,8 +357,10 @@ void deleteEntry(String path) {
|
| });
|
| }
|
|
|
| -/// "Cleans" [dir]. If that directory already exists, it will be deleted. Then a
|
| -/// new empty directory will be created.
|
| +/// "Cleans" [dir].
|
| +///
|
| +/// If that directory already exists, it is deleted. Then a new empty directory
|
| +/// is created.
|
| void cleanDir(String dir) {
|
| if (entryExists(dir)) deleteEntry(dir);
|
| ensureDir(dir);
|
| @@ -359,8 +380,9 @@ void renameDir(String from, String to) {
|
| });
|
| }
|
|
|
| -/// Creates a new symlink at path [symlink] that points to [target]. Returns a
|
| -/// [Future] which completes to the path to the symlink file.
|
| +/// Creates a new symlink at path [symlink] that points to [target].
|
| +///
|
| +/// Returns a [Future] which completes to the path to the symlink file.
|
| ///
|
| /// If [relative] is true, creates a symlink with a relative path from the
|
| /// symlink to the target. Otherwise, uses the [target] path unmodified.
|
| @@ -389,8 +411,10 @@ void createSymlink(String target, String symlink,
|
| }
|
|
|
| /// Creates a new symlink that creates an alias at [symlink] that points to the
|
| -/// `lib` directory of package [target]. If [target] does not have a `lib`
|
| -/// directory, this shows a warning if appropriate and then does nothing.
|
| +/// `lib` directory of package [target].
|
| +///
|
| +/// If [target] does not have a `lib` directory, this shows a warning if
|
| +/// appropriate and then does nothing.
|
| ///
|
| /// If [relative] is true, creates a symlink with a relative path from the
|
| /// symlink to the target. Otherwise, uses the [target] path unmodified.
|
| @@ -420,8 +444,9 @@ String assetPath(String target) {
|
| }
|
| }
|
|
|
| -/// Returns the path to the root of the Dart repository. This will throw a
|
| -/// [StateError] if it's called when running pub from the SDK.
|
| +/// Returns the path to the root of the Dart repository.
|
| +///
|
| +/// This throws a [StateError] if it's called when running pub from the SDK.
|
| String get repoRoot {
|
| if (runningFromSdk) {
|
| throw new StateError("Can't get the repo root from the SDK.");
|
| @@ -434,9 +459,10 @@ String get repoRoot {
|
| final Stream<String> stdinLines = streamToLines(
|
| new ByteStream(Chain.track(stdin)).toStringStream());
|
|
|
| -/// Displays a message and reads a yes/no confirmation from the user. Returns
|
| -/// a [Future] that completes to `true` if the user confirms or `false` if they
|
| -/// do not.
|
| +/// Displays a message and reads a yes/no confirmation from the user.
|
| +///
|
| +/// Returns a [Future] that completes to `true` if the user confirms or `false`
|
| +/// if they do not.
|
| ///
|
| /// This will automatically append " (y/n)?" to the message, so [message]
|
| /// should just be a fragment like, "Are you sure you want to proceed".
|
| @@ -451,8 +477,9 @@ Future<bool> confirm(String message) {
|
| .then((line) => new RegExp(r"^[yY]").hasMatch(line));
|
| }
|
|
|
| -/// Reads and discards all output from [stream]. Returns a [Future] that
|
| -/// completes when the stream is closed.
|
| +/// Reads and discards all output from [stream].
|
| +///
|
| +/// Returns a [Future] that completes when the stream is closed.
|
| Future drainStream(Stream stream) {
|
| return stream.fold(null, (x, y) {});
|
| }
|
| @@ -480,9 +507,10 @@ Pair<EventSink, Future> consumerToSink(StreamConsumer consumer) {
|
| }
|
|
|
| // TODO(nweiz): remove this when issue 7786 is fixed.
|
| -/// Pipes all data and errors from [stream] into [sink]. When [stream] is done,
|
| -/// the returned [Future] is completed and [sink] is closed if [closeSink] is
|
| -/// true.
|
| +/// Pipes all data and errors from [stream] into [sink].
|
| +///
|
| +/// When [stream] is done, the returned [Future] is completed and [sink] is
|
| +/// closed if [closeSink] is true.
|
| ///
|
| /// When an error occurs on [stream], that error is passed to [sink]. If
|
| /// [cancelOnError] is true, [Future] will be completed successfully and no
|
| @@ -506,6 +534,7 @@ Future store(Stream stream, EventSink sink,
|
| }
|
|
|
| /// Spawns and runs the process located at [executable], passing in [args].
|
| +///
|
| /// Returns a [Future] that will complete with the results of the process after
|
| /// it has ended.
|
| ///
|
| @@ -525,8 +554,10 @@ Future<PubProcessResult> runProcess(String executable, List<String> args,
|
| });
|
| }
|
|
|
| -/// Spawns the process located at [executable], passing in [args]. Returns a
|
| -/// [Future] that will complete with the [Process] once it's been started.
|
| +/// Spawns the process located at [executable], passing in [args].
|
| +///
|
| +/// Returns a [Future] that will complete with the [Process] once it's been
|
| +/// started.
|
| ///
|
| /// The spawned process will inherit its parent's environment variables. If
|
| /// [environment] is provided, that will be used to augment (not replace) the
|
| @@ -575,6 +606,7 @@ class PubProcess {
|
| Future<int> _exitCode;
|
|
|
| /// The sink used for passing data to the process's standard input stream.
|
| + ///
|
| /// Errors on this stream are surfaced through [stdinClosed], [stdout],
|
| /// [stderr], and [exitCode], which are all members of an [ErrorGroup].
|
| EventSink<List<int>> get stdin => _stdin;
|
| @@ -638,9 +670,10 @@ class PubProcess {
|
| _process.kill(signal);
|
| }
|
|
|
| -/// Calls [fn] with appropriately modified arguments. [fn] should have the same
|
| -/// signature as [Process.start], except that the returned value may have any
|
| -/// return type.
|
| +/// Calls [fn] with appropriately modified arguments.
|
| +///
|
| +/// [fn] should have the same signature as [Process.start], except that the
|
| +/// returned value may have any return type.
|
| _doProcess(Function fn, String executable, List<String> args,
|
| String workingDir, Map<String, String> environment) {
|
| // TODO(rnystrom): Should dart:io just handle this?
|
| @@ -701,10 +734,11 @@ Future timeout(Future input, int milliseconds, Uri url, String description) {
|
| return completer.future;
|
| }
|
|
|
| -/// 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. [fn] can also return `null`, in which case the temporary
|
| -/// directory is deleted immediately afterwards.
|
| +/// Creates a temporary directory and passes its path to [fn].
|
| +///
|
| +/// Once the [Future] returned by [fn] completes, the temporary directory and
|
| +/// all its contents are 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.
|
| @@ -725,8 +759,9 @@ Future<HttpServer> bindServer(String host, int port) {
|
| return HttpServer.bind(host, port);
|
| }
|
|
|
| -/// Extracts a `.tar.gz` file from [stream] to [destination]. Returns whether
|
| -/// or not the extraction was successful.
|
| +/// Extracts a `.tar.gz` file from [stream] to [destination].
|
| +///
|
| +/// Returns whether or not the extraction was successful.
|
| Future<bool> extractTarGz(Stream<List<int>> stream, String destination) {
|
| log.fine("Extracting .tar.gz stream to $destination.");
|
|
|
| @@ -807,10 +842,13 @@ Future<bool> _extractTarGzWindows(Stream<List<int>> stream,
|
| });
|
| }
|
|
|
| -/// Create a .tar.gz archive from a list of entries. Each entry can be a
|
| -/// [String], [Directory], or [File] object. The root of the archive is
|
| -/// considered to be [baseDir], which defaults to the current working directory.
|
| -/// Returns a [ByteStream] that will emit the contents of the archive.
|
| +/// Create a .tar.gz archive from a list of entries.
|
| +///
|
| +/// Each entry can be a [String], [Directory], or [File] object. The root of
|
| +/// the archive is considered to be [baseDir], which defaults to the current
|
| +/// working directory.
|
| +///
|
| +/// Returns a [ByteStream] that emits the contents of the archive.
|
| ByteStream createTarGz(List contents, {baseDir}) {
|
| return new ByteStream(futureStream(syncFuture(() {
|
| var buffer = new StringBuffer();
|
|
|