summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/cmCTest.cxx44
-rw-r--r--Source/cmCTest.h3
2 files changed, 47 insertions, 0 deletions
diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx
index 5cea554..00860f6 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 bb53b10..2039350 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