From ea2370d747acb52794a356daee645116797e5b83 Mon Sep 17 00:00:00 2001 From: z30054037 Date: Wed, 20 Dec 2023 14:59:59 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BC=98=E5=8C=96backup=5Fconfig=E7=9A=84?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: z30054037 Change-Id: I247ea980284a541c66fa97dccf5ab8fe69c05a6e --- frameworks/native/backup_ext/src/tar_file.cpp | 2 +- .../backup_utils/b_filesystem/b_dir_test.cpp | 33 +++++++---- utils/src/b_filesystem/b_dir.cpp | 58 +++++++++++++++---- .../b_json/b_json_entity_extension_config.cpp | 2 +- 4 files changed, 71 insertions(+), 24 deletions(-) diff --git a/frameworks/native/backup_ext/src/tar_file.cpp b/frameworks/native/backup_ext/src/tar_file.cpp index aa1ebee0d..3208db4ea 100644 --- a/frameworks/native/backup_ext/src/tar_file.cpp +++ b/frameworks/native/backup_ext/src/tar_file.cpp @@ -49,7 +49,7 @@ TarFile &TarFile::GetInstance() bool TarFile::Packet(const vector &srcFiles, const string &tarFileName, const string &pkPath, TarMap &tarMap) { - if (srcFiles.empty() || tarFileName.empty() || pkPath.empty()) { + if (tarFileName.empty() || pkPath.empty()) { HILOGE("Invalid parameter"); return false; } diff --git a/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp b/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp index 9b714ce2a..7f34ff9fd 100644 --- a/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp +++ b/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp @@ -269,20 +269,29 @@ HWTEST_F(BDirTest, b_dir_GetBigFiles_0300, testing::ext::TestSize.Level1) string cmdMkdir = string("mkdir -p ") + preparedDir + string("test/test1/test2"); system(cmdMkdir.c_str()); string touchFilePrefix = string("touch ") + preparedDir; - system(touchFilePrefix.append("a.txt").c_str()); - system(touchFilePrefix.append("b.txt").c_str()); - system(touchFilePrefix.append("c.txt").c_str()); + string fileName = touchFilePrefix + "a.txt"; + system(fileName.c_str()); + fileName = touchFilePrefix + "b.txt";; + system(fileName.c_str()); + fileName = touchFilePrefix + "c.txt";; + system(fileName.c_str()); touchFilePrefix = string("touch ") + preparedDir + string("test/"); - system(touchFilePrefix.append("a.txt").c_str()); - system(touchFilePrefix.append("b.txt").c_str()); - system(touchFilePrefix.append("c.txt").c_str()); - touchFilePrefix = string("touch ") + preparedDir + string("test/test1/test2"); - system(touchFilePrefix.append("a.txt").c_str()); - system(touchFilePrefix.append("b.txt").c_str()); - system(touchFilePrefix.append("c.txt").c_str()); - vector includes = {preparedDir + string("/*"), preparedDir + string("test")}; - vector excludes = {preparedDir + string("/test/test1/test2"), {}}; + fileName = touchFilePrefix + "a.txt"; + system(fileName.c_str()); + fileName = touchFilePrefix + "b.txt"; + system(fileName.c_str()); + fileName = touchFilePrefix + "c.txt"; + system(fileName.c_str()); + touchFilePrefix = string("touch ") + preparedDir + string("test/test1/test2/"); + fileName = touchFilePrefix + "a.txt"; + system(fileName.c_str()); + fileName = touchFilePrefix + "b.txt"; + system(fileName.c_str()); + fileName = touchFilePrefix + "c.txt"; + system(fileName.c_str()); + vector includes = {preparedDir + string("/*"), preparedDir + string("test/")}; + vector excludes = {preparedDir + string("/test/test1/test2/"), {}}; auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes); EXPECT_EQ(errCode, ERR_OK); } catch (...) { diff --git a/utils/src/b_filesystem/b_dir.cpp b/utils/src/b_filesystem/b_dir.cpp index 1154b0727..8fd816846 100644 --- a/utils/src/b_filesystem/b_dir.cpp +++ b/utils/src/b_filesystem/b_dir.cpp @@ -53,6 +53,29 @@ static bool IsEmptyDirectory(const string &path) return isEmpty; } +static tuple, vector> GetFile(const string &path, off_t size = -1) +{ + map files; + vector smallFiles; + // 如果是文件,也添加进来,需要过滤 / 根路径 + HILOGE("not directory path: %{private}s", path.c_str()); + struct stat sta = {}; + if (stat(path.data(), &sta) == -1) { + return {BError(errno).GetCode(), files, smallFiles}; + } + if (path == "/") { + return {BError(BError::Codes::OK).GetCode(), files, smallFiles}; + } + if (sta.st_size <= size) { + HILOGE("Find small file %{public}s", path.c_str()); + smallFiles.emplace_back(path); + } else { + HILOGE("Find big file %{public}s", path.c_str()); + files.try_emplace(path, sta); + } + return {BError(BError::Codes::OK).GetCode(), files, smallFiles}; +} + static tuple, vector> GetDirFilesDetail(const string &path, bool recursion, off_t size = -1) @@ -61,14 +84,17 @@ static tuple, vector> GetDirFilesDetai vector smallFiles; if (IsEmptyDirectory(path)) { - smallFiles.emplace_back(path); + string newPath = path; + if (path.at(path.size()-1) != '/') { + newPath += '/'; + } + smallFiles.emplace_back(newPath); return {ERR_OK, files, smallFiles}; } unique_ptr> dir = {opendir(path.c_str()), closedir}; if (!dir) { - HILOGE("Invalid directory path: %{private}s", path.c_str()); - return {BError(errno).GetCode(), files, smallFiles}; + return GetFile(path, size); } struct dirent *ptr = nullptr; @@ -132,7 +158,7 @@ tuple> BDir::GetDirFiles(const string &path) return {ERR_OK, files}; } -static set ExpandPathWildcard(const vector &vec) +static set ExpandPathWildcard(const vector &vec, bool onlyPath) { unique_ptr> gl {new glob_t, [](glob_t *ptr) { globfree(ptr); }}; *gl = {}; @@ -152,7 +178,7 @@ static set ExpandPathWildcard(const vector &vec) for (auto it = expandPath.begin(); it != expandPath.end(); ++it) { filteredPath.insert(*it); - if (*it->rbegin() != '/') { + if (onlyPath && *it->rbegin() != '/') { continue; } auto jt = it; @@ -168,7 +194,7 @@ static set ExpandPathWildcard(const vector &vec) tuple, vector> BDir::GetBigFiles(const vector &includes, const vector &excludes) { - set inc = ExpandPathWildcard(includes); + set inc = ExpandPathWildcard(includes, false); map incFiles; vector incSmallFiles; @@ -189,7 +215,11 @@ tuple, vector> BDir::GetBigFiles(const return false; } for (const string &item : s) { - if (!item.empty() && (fnmatch(item.data(), str.data(), FNM_LEADING_DIR) == 0)) { + string excludeItem = item; + if (excludeItem.at(item.size() - 1) == '/') { + excludeItem += "*"; + } + if (!item.empty() && fnmatch(excludeItem.data(), str.data(), FNM_LEADING_DIR) == 0) { HILOGI("file %{public}s matchs exclude condition", str.c_str()); return true; } @@ -197,6 +227,14 @@ tuple, vector> BDir::GetBigFiles(const return false; }; + vector resSmallFiles; + for (const auto &item : incSmallFiles) { + if (!isMatch(excludes, item)) { + HILOGI("smallfile %{public}s matchs include condition and unmatchs exclude condition", item.c_str()); + resSmallFiles.emplace_back(item); + } + } + map bigFiles; for (const auto &item : incFiles) { if (!isMatch(excludes, item.first)) { @@ -205,14 +243,14 @@ tuple, vector> BDir::GetBigFiles(const } } HILOGI("total number of big files is %{public}d", static_cast(bigFiles.size())); - HILOGI("total number of small files is %{public}d", static_cast(incSmallFiles.size())); - return {ERR_OK, move(bigFiles), move(incSmallFiles)}; + HILOGI("total number of small files is %{public}d", static_cast(resSmallFiles.size())); + return {ERR_OK, move(bigFiles), move(resSmallFiles)}; } vector BDir::GetDirs(const vector &paths) { vector wildcardPath(paths.begin(), paths.end()); - set inc = ExpandPathWildcard(wildcardPath); + set inc = ExpandPathWildcard(wildcardPath, true); vector dirs(inc.begin(), inc.end()); return dirs; } diff --git a/utils/src/b_json/b_json_entity_extension_config.cpp b/utils/src/b_json/b_json_entity_extension_config.cpp index 4c9a845e8..8e87fa302 100644 --- a/utils/src/b_json/b_json_entity_extension_config.cpp +++ b/utils/src/b_json/b_json_entity_extension_config.cpp @@ -47,7 +47,7 @@ vector BJsonEntityExtensionConfig::GetIncludes() const vector dirs; for (auto &&item : obj_["includes"]) { - if (!item.isString()) { + if (!item.isString() || item.empty()) { HILOGE("Each item of array 'includes' must be of the type string"); continue; } -- Gitee From 5c3dfd664bf71d1081030a6e227a2c6ec0fad2c5 Mon Sep 17 00:00:00 2001 From: z30054037 Date: Fri, 22 Dec 2023 11:20:29 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BC=98=E5=8C=96backup=5Fconfig=E7=9A=84?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: z30054037 Change-Id: Ie831fe7f630635a010e4eb55cc15a1a7177815fc --- tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp | 4 ++-- utils/src/b_filesystem/b_dir.cpp | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp b/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp index 7f34ff9fd..326d46f6d 100644 --- a/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp +++ b/tests/unittests/backup_utils/b_filesystem/b_dir_test.cpp @@ -290,8 +290,8 @@ HWTEST_F(BDirTest, b_dir_GetBigFiles_0300, testing::ext::TestSize.Level1) system(fileName.c_str()); fileName = touchFilePrefix + "c.txt"; system(fileName.c_str()); - vector includes = {preparedDir + string("/*"), preparedDir + string("test/")}; - vector excludes = {preparedDir + string("/test/test1/test2/"), {}}; + vector includes = {preparedDir + string("*"), preparedDir + string("test/")}; + vector excludes = {preparedDir + string("test/test1/test2/"), {}}; auto [errCode, mpNameToStat, smallFiles] = BDir::GetBigFiles(includes, excludes); EXPECT_EQ(errCode, ERR_OK); } catch (...) { diff --git a/utils/src/b_filesystem/b_dir.cpp b/utils/src/b_filesystem/b_dir.cpp index 8fd816846..4b4f64a60 100644 --- a/utils/src/b_filesystem/b_dir.cpp +++ b/utils/src/b_filesystem/b_dir.cpp @@ -82,21 +82,24 @@ static tuple, vector> GetDirFilesDetai { map files; vector smallFiles; - + HILOGE("GetDirFilesDetail path %{public}s", path.c_str()); if (IsEmptyDirectory(path)) { + HILOGE("GetDirFilesDetail2 path %{public}s", path.c_str()); string newPath = path; if (path.at(path.size()-1) != '/') { newPath += '/'; } + HILOGE("GetDirFilesDetail3 path %{public}s", newPath.c_str()); smallFiles.emplace_back(newPath); return {ERR_OK, files, smallFiles}; } unique_ptr> dir = {opendir(path.c_str()), closedir}; if (!dir) { + HILOGE("GetDirFilesDetail4 path %{public}s", path.c_str()); return GetFile(path, size); } - + HILOGE("GetDirFilesDetail5 path %{public}s", path.c_str()); struct dirent *ptr = nullptr; while (!!(ptr = readdir(dir.get()))) { // current dir OR parent dir @@ -130,7 +133,7 @@ static tuple, vector> GetDirFilesDetai files.try_emplace(fileName, sta); } } - + HILOGE("GetDirFilesDetail6 path %{public}s", path.c_str()); return {ERR_OK, files, smallFiles}; } -- Gitee