diff --git a/CodeLite/CMakeLists.txt b/CodeLite/CMakeLists.txt index 36e2d34921..ff8e6f4cc5 100644 --- a/CodeLite/CMakeLists.txt +++ b/CodeLite/CMakeLists.txt @@ -33,7 +33,8 @@ include_directories( "${CL_SRC_ROOT}/CodeLite/ssh" "${CL_SRC_ROOT}/PCH" "${CL_SRC_ROOT}/Interfaces" - "${CL_SRC_ROOT}/CodeLite/ssh") + "${CL_SRC_ROOT}/Plugin" +) set(ADDITIONAL_LIBRARIES "") diff --git a/CodeLite/clFilesCollector.cpp b/CodeLite/clFilesCollector.cpp index 9ac9685450..1bc2950171 100644 --- a/CodeLite/clFilesCollector.cpp +++ b/CodeLite/clFilesCollector.cpp @@ -2,6 +2,7 @@ #include "file_logger.h" #include "fileutils.h" +#include "globals.h" #include #include @@ -10,6 +11,8 @@ #include #include +static wxString my_CLRealPath(const wxString& filepath) { return filepath; } + clFilesScanner::clFilesScanner() {} clFilesScanner::~clFilesScanner() {} @@ -110,19 +113,19 @@ size_t clFilesScanner::Scan(const wxString& rootFolder, std::vector& f filename.MakeLower(); #endif bool isDirectory = wxFileName::DirExists(fullpath); - // Use FileUtils::RealPath() here to cope with symlinks on Linux + // Use CLRealPath() here to cope with symlinks on Linux bool isExcludeDir = isDirectory && ( #if defined(__FreeBSD__) - ((FileUtils::IsSymlink(fullpath) && excludeFolders.count(FileUtils::RealPath(fullpath))) + ((FileUtils::IsSymlink(fullpath) && excludeFolders.count(my_CLRealPath(fullpath))) #else - (excludeFolders.count(FileUtils::RealPath(fullpath)) + (excludeFolders.count(my_CLRealPath(fullpath)) #endif || IsRelPathContainedInSpec(rootFolder, fullpath, excludeFolders))); if (isDirectory && !isExcludeDir) { // Traverse into this folder - wxString realPath = FileUtils::RealPath(fullpath); + wxString realPath = my_CLRealPath(fullpath); if (Visited.insert(realPath).second) { Q.push(fullpath); } @@ -153,8 +156,8 @@ size_t clFilesScanner::Scan(const wxString& rootFolder, const wxString& filespec std::queue Q; std::unordered_set Visited; - Q.push(FileUtils::RealPath(rootFolder)); - Visited.insert(FileUtils::RealPath(rootFolder)); + Q.push(my_CLRealPath(rootFolder)); + Visited.insert(my_CLRealPath(rootFolder)); size_t nCount = 0; while (!Q.empty()) { @@ -174,11 +177,11 @@ size_t clFilesScanner::Scan(const wxString& rootFolder, const wxString& filespec fullpath << dir.GetNameWithSep() << filename; bool isDirectory = wxFileName::DirExists(fullpath); bool isFile = !isDirectory; - // Use FileUtils::RealPath() here to cope with symlinks on Linux + // Use CLRealPath() here to cope with symlinks on Linux if (isDirectory /* a folder */ && !FileUtils::WildMatch(excludeFoldersSpecArr, filename) /* does not match the exclude folder spec */) { // Traverse into this folder - wxString real_path = FileUtils::RealPath(fullpath); + wxString real_path = my_CLRealPath(fullpath); if (Visited.count(real_path) == 0) { Visited.insert(real_path); Q.push(fullpath); @@ -259,8 +262,8 @@ void clFilesScanner::ScanWithCallbacks(const wxString& rootFolder, std::function std::vector Q; std::unordered_set Visited; - Q.push_back(FileUtils::RealPath(rootFolder)); - Visited.insert(FileUtils::RealPath(rootFolder)); + Q.push_back(my_CLRealPath(rootFolder)); + Visited.insert(my_CLRealPath(rootFolder)); while (!Q.empty()) { wxString dirpath = Q.front(); @@ -299,7 +302,7 @@ void clFilesScanner::ScanWithCallbacks(const wxString& rootFolder, std::function if (on_folder_cb && on_folder_cb(fullpath)) { // Traverse into this folder - wxString real_path = FileUtils::RealPath(fullpath); + wxString real_path = my_CLRealPath(fullpath); if (Visited.insert(real_path).second) { Q.push_back(fullpath); } diff --git a/LiteEditor/mainbook.cpp b/LiteEditor/mainbook.cpp index 6463ffd34b..db935b2848 100644 --- a/LiteEditor/mainbook.cpp +++ b/LiteEditor/mainbook.cpp @@ -429,7 +429,7 @@ int MainBook::FindEditorIndexByFullPath(const wxString& fullpath) { #ifdef __WXGTK__ // On gtk either fileName or the editor filepath (or both) may be (or their paths contain) symlinks - wxString fileNameDest = CLRealPath(fullpath); + wxString fileNameDest = CLRealPath(fullpath, true); #endif for (size_t i = 0; i < m_book->GetPageCount(); ++i) { @@ -463,7 +463,7 @@ int MainBook::FindEditorIndexByFullPath(const wxString& fullpath) #if defined(__WXGTK__) // Try again, dereferencing the editor fpath - wxString editorDest = CLRealPath(unixStyleFile); + wxString editorDest = CLRealPath(unixStyleFile, true); if (editorDest.Cmp(fullpath) == 0 || editorDest.Cmp(fileNameDest) == 0) { return i; } @@ -592,6 +592,13 @@ clEditor* MainBook::OpenFile(const wxString& file_name, const wxString& projectN int bmp /*= wxNullBitmap*/, const wxString& tooltip /* wxEmptyString */) { wxFileName fileName(CLRealPath(file_name)); + + if (fileName.IsRelative()) { + if (clWorkspaceManager::Get().IsWorkspaceOpened()) { + wxFileName wsPath = clWorkspaceManager::Get().GetWorkspace()->GetDir(); + fileName.MakeAbsolute(wsPath.GetFullPath()); + } + } fileName.MakeAbsolute(); #ifdef __WXMSW__ @@ -1743,7 +1750,7 @@ WelcomePage* MainBook::GetWelcomePage(bool createIfMissing) clEditor* MainBook::OpenFileAsync(const wxString& file_name, std::function&& callback) { - wxString real_path = CLRealPath(file_name); + wxString real_path = CLRealPath(file_name, true); auto editor = FindEditor(real_path); if (editor) { push_callback(std::move(callback), real_path); @@ -1754,7 +1761,7 @@ clEditor* MainBook::OpenFileAsync(const wxString& file_name, std::functionSetSelection(index); } } else { - editor = OpenFile(real_path); + editor = OpenFile(file_name); if (editor) { push_callback(std::move(callback), real_path); } @@ -1819,11 +1826,12 @@ void MainBook::OnIdle(wxIdleEvent& event) auto editor = GetActiveEditor(); CHECK_PTR_RET(editor); - execute_callbacks_for_file(CLRealPath(editor->GetFileName().GetFullPath())); + execute_callbacks_for_file(CLRealPath(editor->GetFileName().GetFullPath(), true)); } void MainBook::OnEditorModified(clCommandEvent& event) { event.Skip(); } void MainBook::OnEditorSaved(clCommandEvent& event) { event.Skip(); } -void MainBook::OnSessionLoaded(clCommandEvent& event) { event.Skip(); } \ No newline at end of file +void MainBook::OnSessionLoaded(clCommandEvent& event) { event.Skip(); } + diff --git a/Plugin/globals.cpp b/Plugin/globals.cpp index 316f51da94..3bdaa5c5b6 100644 --- a/Plugin/globals.cpp +++ b/Plugin/globals.cpp @@ -916,7 +916,7 @@ wxFileName wxReadLink(const wxFileName& filename) if (wxIsFileSymlink(filename)) { #if defined(__WXGTK__) // Use 'realpath' on Linux, otherwise this breaks on relative symlinks, and (untested) on symlinks-to-symlinks - return wxFileName(CLRealPath(filename.GetFullPath())); + return wxFileName(FileUtils::RealPath(filename.GetFullPath())); #else // OSX wxFileName realFileName; @@ -936,10 +936,14 @@ wxFileName wxReadLink(const wxFileName& filename) #endif } -wxString CLRealPath(const wxString& filepath) // This is readlink on steroids: it also makes-absolute, and dereferences +wxString CLRealPath(const wxString& filepath, bool force) // This is readlink on steroids: it also makes-absolute, and dereferences // any symlinked dirs in the path { - return FileUtils::RealPath(filepath); + if (force) { + return FileUtils::RealPath(filepath); + } else { + return filepath; + } } int wxStringToInt(const wxString& str, int defval, int minval, int maxval) diff --git a/Plugin/globals.h b/Plugin/globals.h index e90f4345b9..c48f4b26c6 100644 --- a/Plugin/globals.h +++ b/Plugin/globals.h @@ -336,7 +336,7 @@ WXDLLIMPEXP_SDK wxFileName wxReadLink(const wxFileName& filename); /** * @brief makes-absolute filepath, and dereferences it and any symlinked dirs in the path */ -WXDLLIMPEXP_SDK wxString CLRealPath(const wxString& filepath); +WXDLLIMPEXP_SDK wxString CLRealPath(const wxString& filepath, bool force=false); /** * @brief convert string to integer using range validation and default value