diff options
Diffstat (limited to 'tools/aapt2/util/Files.cpp')
-rw-r--r-- | tools/aapt2/util/Files.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/tools/aapt2/util/Files.cpp b/tools/aapt2/util/Files.cpp index 5a8ff0926483..73105e16559b 100644 --- a/tools/aapt2/util/Files.cpp +++ b/tools/aapt2/util/Files.cpp @@ -102,12 +102,25 @@ FileType GetFileType(const std::string& path) { #endif bool mkdirs(const std::string& path) { - constexpr const mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP; + #ifdef _WIN32 + // Start after the drive path if present. Calling mkdir with only the drive will cause an error. + size_t current_pos = 1u; + if (path.size() >= 3 && path[1] == ':' && + (path[2] == '\\' || path[2] == '/')) { + current_pos = 3u; + } + #else // Start after the first character so that we don't consume the root '/'. // This is safe to do with unicode because '/' will never match with a continuation character. size_t current_pos = 1u; + #endif + constexpr const mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP; while ((current_pos = path.find(sDirSep, current_pos)) != std::string::npos) { std::string parent_path = path.substr(0, current_pos); + if (parent_path.empty()) { + continue; + } + int result = ::android::base::utf8::mkdir(parent_path.c_str(), mode); if (result < 0 && errno != EEXIST) { return false; @@ -149,6 +162,10 @@ StringPiece GetExtension(const StringPiece& path) { return {}; } +bool IsHidden(const android::StringPiece& path) { + return util::StartsWith(GetFilename(path), "."); +} + void AppendPath(std::string* base, StringPiece part) { CHECK(base != nullptr); const bool base_has_trailing_sep = (!base->empty() && *(base->end() - 1) == sDirSep); |