// Returns the resulting file or in case of extraction the destination // directory (for logging). static Try<string> fetchBypassingCache( const CommandInfo::URI& uri, const string& sandboxDirectory, const Option<string>& frameworksHome) { LOG(INFO) << "Fetching directly into the sandbox directory"; // TODO(mrbrowning): Factor out duplicated processing of "output_file" field // here and in fetchFromCache into a separate helper function. if (uri.has_output_file()) { string dirname = Path(uri.output_file()).dirname(); if (dirname != ".") { Try<Nothing> result = os::mkdir(path::join(sandboxDirectory, dirname), true); if (result.isError()) { return Error( "Unable to create subdirectory " + dirname + " in sandbox"); } } } Try<string> outputFile = uri.has_output_file() ? uri.output_file() : Fetcher::basename(uri.value()); if (outputFile.isError()) { return Error(outputFile.error()); } string path = path::join(sandboxDirectory, outputFile.get()); Try<string> downloaded = download(uri.value(), path, frameworksHome); if (downloaded.isError()) { return Error(downloaded.error()); } if (uri.executable()) { return chmodExecutable(downloaded.get()); } else if (uri.extract()) { Try<bool> extracted = extract(path, sandboxDirectory); if (extracted.isError()) { return Error(extracted.error()); } else if (!extracted.get()) { LOG(WARNING) << "Copying instead of extracting resource from URI with " << "'extract' flag, because it does not seem to be an " << "archive: " << uri.value(); } } return downloaded; }