summaryrefslogtreecommitdiff
path: root/tools/aapt2/util/Files.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/aapt2/util/Files.cpp')
-rw-r--r--tools/aapt2/util/Files.cpp19
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);