1
0
Fork 0

fix dirname behavior (#9167)

This commit is contained in:
Jan 2019-06-03 15:26:38 +02:00 committed by GitHub
parent 67b751103d
commit e14b9aaaa1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 12 deletions

View File

@ -662,26 +662,28 @@ int TRI_RemoveDirectoryDeterministic(char const* filename) {
std::string TRI_Dirname(std::string const& path) {
size_t n = path.size();
size_t m = 0;
if (1 < n) {
if (path[n - 1] == TRI_DIR_SEPARATOR_CHAR) {
m = 1;
}
if (n == 0) {
// "" => "."
return std::string(".");
}
if (n == 0) {
return std::string(".");
} else if (n == 1 && path[0] == TRI_DIR_SEPARATOR_CHAR) {
if (n > 1 && path[n - 1] == TRI_DIR_SEPARATOR_CHAR) {
// .../ => ...
return path.substr(0, n - 1);
}
if (n == 1 && path[0] == TRI_DIR_SEPARATOR_CHAR) {
// "/" => "/"
return std::string(TRI_DIR_SEPARATOR_STR);
} else if (n - m == 1 && path[0] == '.') {
} else if (n == 1 && path[0] == '.') {
return std::string(".");
} else if (n - m == 2 && path[0] == '.' && path[1] == '.') {
} else if (n == 2 && path[0] == '.' && path[1] == '.') {
return std::string("..");
}
char const* p;
for (p = path.data() + (n - m - 1); path.data() < p; --p) {
for (p = path.data() + (n - 1); path.data() < p; --p) {
if (*p == TRI_DIR_SEPARATOR_CHAR) {
break;
}

View File

@ -397,3 +397,29 @@ TEST_F(CFilesTest, tst_getfilename) {
EXPECT_TRUE("haxxmann" == TRI_GetFilename("\\a\\haxxmann"));
EXPECT_TRUE("haxxmann" == TRI_GetFilename("\\a\\b\\haxxmann"));
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test TRI_Dirname
////////////////////////////////////////////////////////////////////////////////
TEST_F(CFilesTest, tst_dirname) {
#ifdef _WIN32
EXPECT_EQ("C:\\Users\\abc def\\foobar", TRI_Dirname("C:\\Users\\abc def\\foobar\\"));
EXPECT_EQ("C:\\Users\\abc def\\foobar", TRI_Dirname("C:\\Users\\abc def\\foobar\\baz"));
EXPECT_EQ("C:\\Users\\abc def\\foobar", TRI_Dirname("C:\\Users\\abc def\\foobar\\baz.text"));
EXPECT_EQ("C:\\Users\\abc def\\foobar", TRI_Dirname("C:\\Users\\abc def\\foobar\\VERSION-1.tmp"));
EXPECT_EQ("\\Users\\abc def\\foobar", TRI_Dirname("\\Users\\abc def\\foobar\\VERSION-1.tmp"));
#else
EXPECT_EQ("/tmp/abc/def hihi", TRI_Dirname("/tmp/abc/def hihi/"));
EXPECT_EQ("/tmp/abc/def hihi", TRI_Dirname("/tmp/abc/def hihi/abc"));
EXPECT_EQ("/tmp/abc/def hihi", TRI_Dirname("/tmp/abc/def hihi/abc.txt"));
EXPECT_EQ("/tmp", TRI_Dirname("/tmp/"));
EXPECT_EQ("/tmp", TRI_Dirname("/tmp/1"));
EXPECT_EQ("/", TRI_Dirname("/tmp"));
EXPECT_EQ("/", TRI_Dirname("/"));
EXPECT_EQ(".", TRI_Dirname("./"));
EXPECT_EQ(".", TRI_Dirname(""));
EXPECT_EQ(".", TRI_Dirname("."));
EXPECT_EQ("..", TRI_Dirname(".."));
#endif
}