diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx index 5cea5542c..00860f62b 100644 --- a/Source/cmCTest.cxx +++ b/Source/cmCTest.cxx @@ -2123,6 +2123,50 @@ void cmCTest::PopulateCustomVector(cmMakefile* mf, const char* def, tm_VectorOfS } } +std::string cmCTest::GetShortPathToFile(const char* fname) +{ + const std::string& sourceDir = GetDartConfiguration("SourceDirectory"); + const std::string& buildDir = GetDartConfiguration("BuildDirectory"); + + // Find relative paths to both directories + std::string srcRelpath = cmSystemTools::RelativePath(sourceDir.c_str(), fname); + std::string bldRelpath = cmSystemTools::RelativePath(buildDir.c_str(), fname); + + // If any contains "." it is not parent directory + bool inSrc = srcRelpath.find("..") == srcRelpath.npos; + bool inBld = bldRelpath.find("..") == bldRelpath.npos; + // TODO: Handle files with .. in their name + + std::string* res = 0; + + if ( inSrc && inBld ) + { + // If both have relative path with no dots, pick the shorter one + if ( srcRelpath.size() < bldRelpath.size() ) + { + res = &srcRelpath; + } + else + { + res = &bldRelpath; + } + } + else if ( inSrc ) + { + res = &srcRelpath; + } + else if ( inBld ) + { + res = &bldRelpath; + } + if ( !res ) + { + return fname; + } + cmSystemTools::ConvertToUnixSlashes(*res); + return "./" + *res; +} + std::string cmCTest::GetDartConfiguration(const char *name) { return m_DartConfiguration[name]; diff --git a/Source/cmCTest.h b/Source/cmCTest.h index bb53b10d2..2039350f1 100644 --- a/Source/cmCTest.h +++ b/Source/cmCTest.h @@ -183,6 +183,9 @@ public: //! Get the path to CTest const char* GetCTestExecutable() { return m_CTestSelf.c_str(); } + //! Get the short path to the file. This means if the file is in binary or + //source directory, it will become /.../relative/path/to/file + std::string GetShortPathToFile(const char* fname); private: // these are helper classes