bool copySourceFile(const FilePath& sourceDir, const FilePath& destDir, int level, const FilePath& sourceFilePath) { // compute the target path std::string relativePath = sourceFilePath.relativePath(sourceDir); FilePath targetPath = destDir.complete(relativePath); // if the copy item is a directory just create it if (sourceFilePath.isDirectory()) { Error error = targetPath.ensureDirectory(); if (error) LOG_ERROR(error); } // otherwise copy it else { Error error = sourceFilePath.copy(targetPath); if (error) LOG_ERROR(error); } return true; }
Error getScriptRunCommand(const json::JsonRpcRequest& request, json::JsonRpcResponse* pResponse) { // params std::string interpreter, path; Error error = json::readParams(request.params, &interpreter, &path); if (error) return error ; FilePath filePath = module_context::resolveAliasedPath(path); // use as minimal a path as possible FilePath currentPath = module_context::safeCurrentPath(); if (filePath.isWithin(currentPath)) { path = filePath.relativePath(currentPath); if (interpreter.empty()) { #ifndef _WINDOWS if (path.find_first_of('/') == std::string::npos) path = "./" + path; } #endif } else { path = filePath.absolutePath(); } // quote if necessary if (path.find_first_of(' ') != std::string::npos) path = "\\\"" + path + "\\\""; // if there's no interpreter then we may need to do a chmod #ifndef _WINDOWS if (interpreter.empty()) { error = r::exec::RFunction( "system", "chmod +x " + string_utils::utf8ToSystem(path)).call(); if (error) return error; } #endif // now build and return the command std::string command; if (interpreter.empty()) command = path; else command = interpreter + " " + path; command = "system(\"" + command + "\")"; pResponse->setResult(command); return Success(); }
std::string FilePath::createAliasedPath(const FilePath& path, const FilePath& userHomePath) { // Special case for "~" if (path == userHomePath) return kHomePathLeafAlias; // if the path is contained within the home path then alias it std::string homeRelativePath = path.relativePath(userHomePath); if (!homeRelativePath.empty()) { std::string aliasedPath = kHomePathAlias + homeRelativePath; return aliasedPath; } else // no aliasing { return path.absolutePath(); } }
SEXP rs_viewer(SEXP urlSEXP, SEXP heightSEXP) { try { // get the height parameter (0 if null) int height = 0; if (!r::sexp::isNull(heightSEXP)) height = r::sexp::asInteger(heightSEXP); // transform the url to a localhost:<port>/session one if it's // a path to a file within the R session temporary directory std::string url = r::sexp::safeAsString(urlSEXP); if (!boost::algorithm::starts_with(url, "http")) { // get the path to the tempdir and the file FilePath tempDir = module_context::tempDir(); FilePath filePath = module_context::resolveAliasedPath(url); // canoncialize paths for comparison Error error = core::system::realPath(tempDir, &tempDir); if (error) LOG_ERROR(error); error = core::system::realPath(filePath, &filePath); if (error) LOG_ERROR(error); // if it's in the temp dir and we're running R >= 2.14 then // we can serve it via the help server, otherwise we need // to show it in an external browser if (filePath.isWithin(tempDir) && r::util::hasRequiredVersion("2.14")) { // calculate the relative path std::string path = filePath.relativePath(tempDir); // add to history and treat as a widget if appropriate if (isHTMLWidgetPath(filePath)) { // add it to our history viewerHistory().add(module_context::ViewerHistoryEntry(path)); // view it viewerNavigate(viewerHistory().current().url(), height, true, true); } else { viewerNavigate(module_context::sessionTempDirUrl(path), height, false, true); } } else { module_context::showFile(filePath); } } else { // in desktop mode make sure we have the right version of httpuv if (options().programMode() == kSessionProgramModeDesktop) { if (!module_context::isPackageVersionInstalled("httpuv", "1.2")) { module_context::consoleWriteError("\nWARNING: To run " "applications within the RStudio Viewer pane you need to " "install the latest version of the httpuv package from " "CRAN (version 1.2 or higher is required).\n\n"); } } // navigate the viewer viewerNavigate(url, height, false, true); } } CATCH_UNEXPECTED_EXCEPTION return R_NilValue; }