anchor.diff:   */
   Future<File> deleteFile(file) {
     return new File(_getPath(file)).delete();
  +}
  +
  +/// Writes [stream] to a new file at [path], which may be a [String] or a
  +/// [File]. Will replace any file already at that path. Completes when the file
  +/// is done being written.
  +Future<File> createFileFromStream(InputStream stream, path) {
  +  path = _getPath(path);
  +
  +  var completer = new Completer<File>();
  +  var file = new File(path);
  +  var outputStream = file.openOutputStream();
  +  stream.pipe(outputStream);
  +
  +  outputStream.onClosed = () {
  +    completer.complete(file);
  +  };
  +
  +  completeError(error) {
  +    if (!completer.isComplete) completer.completeException(error);
  +  }
  +
  +  stream.onError = completeError;
  +  outputStream.onError = completeError;
  +
  +  return completer.future;
   }
   
   /**
  
positive.code:   // Note: This line of code gets munged by create_sdk.py to be the correct
    // relative path to 7zip in the SDK.
    var pathTo7zip = '../../third_party/7zip/7za.exe';
  
    var command = scriptDir.append(pathTo7zip).canonicalize().toNativePath();
  
    // 7zip can't unarchive from gzip -> tar -> destination all in one step so
    // we spawn it twice and pipe them together.
    var completer = new Completer<bool>();
    var gzipProcess = Process.start(command, ['e', '-si', '-tgzip', '-so']);
  
    // TODO(rnystrom): Even though we are quoting the destination directory here,
    // 7zip still seems to barf if there is a space in the path. For now we'll
    // just avoid spaces.
    var tarProcess = Process.start(command,
        ['x', '-si', '-ttar', '-o"$destination"']);
  
    // 7zip writes to stderr even when things are going OK, so we'll capture it
    // here and only print it if the exit code is bad.
    var errorStream = new ListOutputStream();
  
    // Wait for the process to be fully started before writing to its
    // stdin stream.
    gzipProcess.onStart = () {
      stream.pipe(gzipProcess.stdin);
      gzipProcess.stderr.pipe(errorStream, close: false);
    };
  
    tarProcess.onStart = () {
      gzipProcess.stdout.pipe(tarProcess.stdin);
      tarProcess.stderr.pipe(errorStream, close: false);
  
      // TODO(rnystrom): For some mysterious reason, the extract hangs if you
      // don't do this. Look into why.
      tarProcess.stdout.pipe(new ListOutputStream());
    };
  
    tarProcess.onExit = (exitCode) {
      if (exitCode != 0) {
        printError(new String.fromCharCodes(errorStream.read()));
        completer.completeException('Could not extract archive to $destination.');
      } else {
        completer.complete(true);
      }
    };
  
    tarProcess.onError = completer.completeException;
    gzipProcess.onError = completer.completeException;
  
    return completer.future;
  }
  
  /**
  
negative.code: }
  
  Future<bool> _extractTarGzWindows(InputStream stream, String destination) {
    // TODO(rnystrom): In the repo's history, there is an older implementation of
    // this that does everything in memory by piping streams directly together
    // instead of writing out temp files. The code is simpler, but unfortunately,
    // 7zip seems to periodically fail when we invoke it from Dart and tell it to
    // read from stdin instead of a file. Consider resurrecting that version if
    // we can figure out why it fails.
  
    // Find 7zip.
    var scriptPath = new File(new Options().script).fullPathSync();
    var scriptDir = new Path.fromNative(scriptPath).directoryPath;
  