diff --git CodeLite/clFilesCollector.cpp CodeLite/clFilesCollector.cpp index a57949053..d6b785f48 100644 --- CodeLite/clFilesCollector.cpp +++ CodeLite/clFilesCollector.cpp @@ -2,6 +2,7 @@ #include "file_logger.h" #include "fileutils.h" +//#include "globals.h" #include #include @@ -9,6 +10,11 @@ #include #include +static wxString CLRealPath(const wxString& str) +{ + return str; +} + clFilesScanner::clFilesScanner() {} clFilesScanner::~clFilesScanner() {} @@ -95,19 +101,19 @@ size_t clFilesScanner::Scan(const wxString& rootFolder, std::vector& f wxString fullpath; fullpath << dir.GetNameWithSep() << filename; 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(CLRealPath(fullpath))) #else - (excludeFolders.count(FileUtils::RealPath(fullpath)) + (excludeFolders.count(CLRealPath(fullpath)) #endif || IsRelPathContainedInSpec(rootFolder, fullpath, excludeFolders))); if(isDirectory && !isExcludeDir) { // Traverse into this folder - wxString realPath = FileUtils::RealPath(fullpath); + wxString realPath = CLRealPath(fullpath); if(Visited.insert(realPath).second) { Q.push(fullpath); } @@ -138,8 +144,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(CLRealPath(rootFolder)); + Visited.insert(CLRealPath(rootFolder)); size_t nCount = 0; while(!Q.empty()) { @@ -159,11 +165,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 = CLRealPath(fullpath); if(Visited.count(real_path) == 0) { Visited.insert(real_path); Q.push(fullpath); @@ -244,8 +250,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(CLRealPath(rootFolder)); + Visited.insert(CLRealPath(rootFolder)); while(!Q.empty()) { wxString dirpath = Q.front(); @@ -284,7 +290,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 = CLRealPath(fullpath); if(Visited.insert(real_path).second) { Q.push_back(fullpath); } diff --git LiteEditor/mainbook.cpp LiteEditor/mainbook.cpp index b54732a3b..2e47533d8 100644 --- LiteEditor/mainbook.cpp +++ LiteEditor/mainbook.cpp @@ -469,7 +469,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_forced(fullpath); #endif for(size_t i = 0; i < m_book->GetPageCount(); i++) { @@ -503,7 +503,7 @@ int MainBook::FindEditorIndexByFullPath(const wxString& fullpath) #if defined(__WXGTK__) // Try again, dereferencing the editor fpath - wxString editorDest = CLRealPath(unixStyleFile); + wxString editorDest = CLRealPath_forced(unixStyleFile); if(editorDest.Cmp(fullpath) == 0 || editorDest.Cmp(fileNameDest) == 0) { return i; } @@ -640,6 +640,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__ @@ -1831,7 +1838,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_forced(file_name); auto editor = FindEditor(real_path); if(editor) { push_callback(std::move(callback), real_path); @@ -1842,7 +1849,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); } @@ -1901,7 +1908,7 @@ void MainBook::OnIdle(wxIdleEvent& event) auto editor = GetActiveEditor(false); CHECK_PTR_RET(editor); - execute_callbacks_for_file(CLRealPath(editor->GetFileName().GetFullPath())); + execute_callbacks_for_file(CLRealPath_forced(editor->GetFileName().GetFullPath())); } void MainBook::OnEditorModified(clCommandEvent& event) diff --git Plugin/globals.cpp Plugin/globals.cpp index 7b24e91d5..ce1ca78ab 100644 --- Plugin/globals.cpp +++ Plugin/globals.cpp @@ -1095,7 +1095,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; @@ -1115,12 +1115,19 @@ wxFileName wxReadLink(const wxFileName& filename) #endif } -wxString CLRealPath(const wxString& filepath) // This is readlink on steroids: it also makes-absolute, and dereferences +wxString CLRealPath_forced(const wxString& filepath) // This is readlink on steroids: it also makes-absolute, and dereferences // any symlinked dirs in the path { return FileUtils::RealPath(filepath); } +wxString CLRealPath(const wxString& filepath) // This is readlink on steroids: it also makes-absolute, and dereferences + // any symlinked dirs in the path +{ + //return CLRealPath_forced(filepath); + return filepath; +} + int wxStringToInt(const wxString& str, int defval, int minval, int maxval) { long v; diff --git Plugin/globals.h Plugin/globals.h index 0ae8d1fd5..1e21da4b1 100644 --- Plugin/globals.h +++ Plugin/globals.h @@ -379,6 +379,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_forced(const wxString& filepath); /** * @brief convert string to integer using range validation and default value