From 6d071486207decfc189ec5af6d7c04ed81cd4de4 Mon Sep 17 00:00:00 2001 From: chensihan Date: Wed, 22 Jan 2025 14:42:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=9B=BAgetincrefilehandle=20Signed-o?= =?UTF-8?q?ff-by:=20chensihan=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../native/backup_ext/include/ext_extension.h | 4 +- .../native/backup_ext/src/ext_extension.cpp | 33 ++-------- .../backup_ext/src/ext_extension_stub.cpp | 10 ++- .../backup_kit_inner/impl/i_extension.h | 2 +- .../backup_sa/include/module_ipc/service.h | 2 + .../include/module_ipc/svc_extension_proxy.h | 2 +- .../src/module_ipc/service_incremental.cpp | 65 +++++++++++++++++-- .../svc_extension_incremental_proxy.cpp | 11 ++-- .../module_ipc/svc_extension_proxy_mock.cpp | 4 +- .../backup_impl/include/ext_extension_mock.h | 4 +- .../backup_ext/ext_extension_stub_test.cpp | 7 +- .../module_ipc/svc_extension_proxy_test.cpp | 7 +- 12 files changed, 99 insertions(+), 52 deletions(-) diff --git a/frameworks/native/backup_ext/include/ext_extension.h b/frameworks/native/backup_ext/include/ext_extension.h index 12d08e820..a89500bf9 100644 --- a/frameworks/native/backup_ext/include/ext_extension.h +++ b/frameworks/native/backup_ext/include/ext_extension.h @@ -48,7 +48,7 @@ public: ErrCode PublishFile(const std::string &fileName) override; ErrCode HandleBackup(bool isClearData) override; ErrCode HandleRestore(bool isClearData) override; - ErrCode GetIncrementalFileHandle(const std::string &fileName) override; + std::tuple GetIncrementalFileHandle(const std::string &fileName) override; ErrCode PublishIncrementalFile(const std::string &fileName) override; ErrCode HandleIncrementalBackup(UniqueFd incrementalFd, UniqueFd manifestFd) override; ErrCode IncrementalOnBackup(bool isClearData) override; @@ -286,7 +286,7 @@ private: std::function ReportErrFileByProc(wptr obj, BackupRestoreScenario scenario); - ErrCode GetIncreFileHandleForNormalVersion(const std::string &fileName); + std::tuple GetIncreFileHandleForNormalVersion(const std::string &fileName); void RestoreOneBigFile(const std::string &path, const ExtManageInfo &item, const bool appendTargetPath); int DealIncreRestoreBigAndTarFile(); void ClearNoPermissionFiles(TarMap &pkgInfo, vector &noPermissionFiles); diff --git a/frameworks/native/backup_ext/src/ext_extension.cpp b/frameworks/native/backup_ext/src/ext_extension.cpp index 700dda53f..b2451168d 100644 --- a/frameworks/native/backup_ext/src/ext_extension.cpp +++ b/frameworks/native/backup_ext/src/ext_extension.cpp @@ -282,7 +282,7 @@ static string GetReportFileName(const string &fileName) return reportName; } -static ErrCode GetIncreFileHandleForSpecialVersion(const string &fileName) +static tuple GetIncreFileHandleForSpecialVersion(const string &fileName) { ErrCode errCode = ERR_OK; UniqueFd fd = GetFileHandleForSpecialCloneCloud(fileName); @@ -302,17 +302,7 @@ static ErrCode GetIncreFileHandleForSpecialVersion(const string &fileName) HILOGE("Failed to open report file = %{private}s, err = %{public}d", reportName.c_str(), errno); errCode = errno; } - - auto proxy = ServiceProxy::GetInstance(); - if (proxy == nullptr) { - HILOGE("Failed to get file handle for special version clone"); - return BError(BError::Codes::EXT_BROKEN_BACKUP_SA).GetCode(); - } - auto ret = proxy->AppIncrementalFileReady(fileName, move(fd), move(reportFd), errCode); - if (ret != ERR_OK) { - HILOGE("Failed to AppIncrementalFileReady %{public}d", ret); - } - return ERR_OK; + return {errCode, move(fd), move(reportFd)}; } static ErrCode GetIncrementalFileHandlePath(const string &fileName, const string &bundleName, std::string &tarName) @@ -337,13 +327,9 @@ static ErrCode GetIncrementalFileHandlePath(const string &fileName, const string return ERR_OK; } -ErrCode BackupExtExtension::GetIncreFileHandleForNormalVersion(const std::string &fileName) +tuple BackupExtExtension::GetIncreFileHandleForNormalVersion(const std::string &fileName) { HILOGI("extension: GetIncrementalFileHandle single to single Name:%{public}s", GetAnonyPath(fileName).c_str()); - auto proxy = ServiceProxy::GetInstance(); - if (proxy == nullptr) { - throw BError(BError::Codes::EXT_BROKEN_IPC, string("Failed to AGetInstance")); - } std::string tarName; int32_t errCode = ERR_OK; UniqueFd fd(-1); @@ -376,15 +362,10 @@ ErrCode BackupExtExtension::GetIncreFileHandleForNormalVersion(const std::string break; } } while (0); - HILOGI("extension: Will notify AppIncrementalFileReady"); - auto ret = proxy->AppIncrementalFileReady(fileName, move(fd), move(reportFd), errCode); - if (ret != ERR_OK) { - HILOGE("Failed to AppIncrementalFileReady %{public}d", ret); - } - return ERR_OK; + return {errCode, move(fd), move(reportFd)}; } -ErrCode BackupExtExtension::GetIncrementalFileHandle(const string &fileName) +tuple BackupExtExtension::GetIncrementalFileHandle(const string &fileName) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); try { @@ -404,7 +385,7 @@ ErrCode BackupExtExtension::GetIncrementalFileHandle(const string &fileName) if (ret != ERR_OK) { HILOGE("Failed to notify app incre done. err = %{public}d", ret); } - return BError(BError::Codes::EXT_INVAL_ARG).GetCode(); + return {BError(BError::Codes::EXT_INVAL_ARG).GetCode(), UniqueFd(-1), UniqueFd(-1)}; } if (extension_->SpecialVersionForCloneAndCloud()) { return GetIncreFileHandleForSpecialVersion(fileName); @@ -413,7 +394,7 @@ ErrCode BackupExtExtension::GetIncrementalFileHandle(const string &fileName) } catch (...) { HILOGE("Failed to get incremental file handle"); DoClear(); - return BError(BError::Codes::EXT_BROKEN_IPC).GetCode(); + return {BError(BError::Codes::EXT_BROKEN_IPC).GetCode(), UniqueFd(-1), UniqueFd(-1)}; } } diff --git a/frameworks/native/backup_ext/src/ext_extension_stub.cpp b/frameworks/native/backup_ext/src/ext_extension_stub.cpp index 9e7b43539..38f4ce2f3 100644 --- a/frameworks/native/backup_ext/src/ext_extension_stub.cpp +++ b/frameworks/native/backup_ext/src/ext_extension_stub.cpp @@ -155,8 +155,14 @@ ErrCode ExtExtensionStub::CmdGetIncrementalFileHandle(MessageParcel &data, Messa return BError(BError::Codes::EXT_INVAL_ARG, "Failed to receive fileName").GetCode(); } - ErrCode res = GetIncrementalFileHandle(fileName); - if (!reply.WriteInt32(res)) { + auto[errCode, fd, reportFd] = GetIncrementalFileHandle(fileName); + if (!reply.WriteInt32(errCode)) { + return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the file").GetCode(); + } + if (!reply.WriteFileDescriptor(fd)) { + return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the file").GetCode(); + } + if (!reply.WriteFileDescriptor(reportFd)) { return BError(BError::Codes::EXT_BROKEN_IPC, "Failed to send out the file").GetCode(); } return BError(BError::Codes::OK); diff --git a/interfaces/inner_api/native/backup_kit_inner/impl/i_extension.h b/interfaces/inner_api/native/backup_kit_inner/impl/i_extension.h index a20fb4cdd..7ce72f1a3 100644 --- a/interfaces/inner_api/native/backup_kit_inner/impl/i_extension.h +++ b/interfaces/inner_api/native/backup_kit_inner/impl/i_extension.h @@ -33,7 +33,7 @@ public: virtual ErrCode HandleBackup(bool isClearData) = 0; virtual ErrCode PublishFile(const std::string &fileName) = 0; virtual ErrCode HandleRestore(bool isClearData) = 0; - virtual ErrCode GetIncrementalFileHandle(const std::string &fileName) = 0; + virtual std::tuple GetIncrementalFileHandle(const std::string &fileName) = 0; virtual ErrCode PublishIncrementalFile(const std::string &fileName) = 0; virtual ErrCode HandleIncrementalBackup(UniqueFd incrementalFd, UniqueFd manifestFd) = 0; virtual ErrCode IncrementalOnBackup(bool isClearData) = 0; diff --git a/services/backup_sa/include/module_ipc/service.h b/services/backup_sa/include/module_ipc/service.h index a9f059b32..0eca9b01b 100644 --- a/services/backup_sa/include/module_ipc/service.h +++ b/services/backup_sa/include/module_ipc/service.h @@ -301,6 +301,8 @@ public: */ void RemoveExtensionMutex(const BundleName &bundleName); void StartRunningTimer(const std::string &bundleName); + ErrCode AppIncrementalFileReady(const std::string &bundleName, const std::string &fileName, UniqueFd fd, + UniqueFd manifestFd, int32_t errCode); public: explicit Service(int32_t saID, bool runOnCreate = false) : SystemAbility(saID, runOnCreate) { diff --git a/services/backup_sa/include/module_ipc/svc_extension_proxy.h b/services/backup_sa/include/module_ipc/svc_extension_proxy.h index 4e5b9932a..dd38f936a 100644 --- a/services/backup_sa/include/module_ipc/svc_extension_proxy.h +++ b/services/backup_sa/include/module_ipc/svc_extension_proxy.h @@ -28,7 +28,7 @@ public: ErrCode HandleBackup(bool isClearData) override; ErrCode PublishFile(const std::string &fileName) override; ErrCode HandleRestore(bool isClearData) override; - ErrCode GetIncrementalFileHandle(const std::string &fileName) override; + std::tuple GetIncrementalFileHandle(const std::string &fileName) override; ErrCode PublishIncrementalFile(const std::string &fileName) override; ErrCode HandleIncrementalBackup(UniqueFd incrementalFd, UniqueFd manifestFd) override; ErrCode IncrementalOnBackup(bool isClearData) override; diff --git a/services/backup_sa/src/module_ipc/service_incremental.cpp b/services/backup_sa/src/module_ipc/service_incremental.cpp index d3ddc141c..85c815efb 100644 --- a/services/backup_sa/src/module_ipc/service_incremental.cpp +++ b/services/backup_sa/src/module_ipc/service_incremental.cpp @@ -457,6 +457,57 @@ ErrCode Service::PublishSAIncrementalFile(const BFileInfo &fileInfo, UniqueFd fd return saConnection->CallRestoreSA(move(fd)); } +ErrCode Service::AppIncrementalFileReady(const std::string &bundleName, const std::string &fileName, UniqueFd fd, + UniqueFd manifestFd, int32_t errCode) +{ + HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); + try { + if (session_->GetScenario() == IServiceReverse::Scenario::RESTORE) { + session_->GetServiceReverseProxy()->IncrementalRestoreOnFileReady(bundleName, fileName, move(fd), + move(manifestFd), errCode); + FileReadyRadarReport(bundleName, fileName, errCode, IServiceReverse::Scenario::RESTORE); + return BError(BError::Codes::OK); + } + if (fileName == BConstants::EXT_BACKUP_MANAGE) { + fd = session_->OnBundleExtManageInfo(bundleName, move(fd)); + } + HILOGD("reverse: Will notify IncrementalBackupOnFileReady"); + session_->GetServiceReverseProxy()->IncrementalBackupOnFileReady(bundleName, fileName, move(fd), + move(manifestFd), errCode); + FileReadyRadarReport(bundleName, fileName, errCode, IServiceReverse::Scenario::BACKUP); + if (session_->OnBundleFileReady(bundleName, fileName)) { + auto backUpConnection = session_->GetExtConnection(bundleName); + auto proxy = backUpConnection->GetBackupExtProxy(); + if (!proxy) { + throw BError(BError::Codes::SA_INVAL_ARG, "Extension backup Proxy is empty"); + } + // 通知extension清空缓存 + proxy->HandleClear(); + // 清除Timer + session_->StopFwkTimer(bundleName); + session_->StopExtTimer(bundleName); + // 通知TOOL 备份完成 + HILOGI("reverse: Will notify IncrementalBackupOnBundleFinished"); + session_->GetServiceReverseProxy()->IncrementalBackupOnBundleFinished(BError(BError::Codes::OK), + bundleName); + BundleEndRadarReport(bundleName, BError(BError::Codes::OK), IServiceReverse::Scenario::BACKUP); + // 断开extension + backUpConnection->DisconnectBackupExtAbility(); + ClearSessionAndSchedInfo(bundleName); + } + OnAllBundlesFinished(BError(BError::Codes::OK)); + return BError(BError::Codes::OK); + } catch (const BError &e) { + return e.GetCode(); // 任意异常产生,终止监听该任务 + } catch (const exception &e) { + HILOGI("Catched an unexpected low-level exception %{public}s", e.what()); + return EPERM; + } catch (...) { + HILOGI("Unexpected exception"); + return EPERM; + } +} + ErrCode Service::AppIncrementalFileReady(const std::string &fileName, UniqueFd fd, UniqueFd manifestFd, int32_t errCode) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); @@ -575,12 +626,13 @@ ErrCode Service::GetIncrementalFileHandle(const std::string &bundleName, const s HILOGE("GetIncrementalFileHandle error, Extension backup Proxy is empty"); return BError(BError::Codes::SA_INVAL_ARG); } - ErrCode res = proxy->GetIncrementalFileHandle(fileName); - if (res != ERR_OK) { - HILOGE("Failed to extension file handle"); + auto[errCode, fd, reportFd] = proxy->GetIncrementalFileHandle(fileName); + auto err = AppIncrementalFileReady(bundleName, fileName, move(fd), move(reportFd), errCode); + if (err != ERR_OK) { + HILOGE("Failed to send file handle"); AppRadar::Info info (bundleName, "", ""); AppRadar::GetInstance().RecordRestoreFuncRes(info, "Service::GetIncrementalFileHandle", - GetUserIdDefault(), BizStageRestore::BIZ_STAGE_GET_FILE_HANDLE_FAIL, res); + GetUserIdDefault(), BizStageRestore::BIZ_STAGE_GET_FILE_HANDLE_FAIL, err); } } else { SvcRestoreDepsManager::GetInstance().UpdateToRestoreBundleMap(bundleName, fileName); @@ -626,9 +678,10 @@ bool Service::IncrementalBackup(const string &bundleName) BundleBeginRadarReport(bundleName, ret, IServiceReverse::Scenario::RESTORE); auto fileNameVec = session_->GetExtFileNameRequest(bundleName); for (auto &fileName : fileNameVec) { - ret = proxy->GetIncrementalFileHandle(fileName); + auto[errCode, fd, reportFd] = proxy->GetIncrementalFileHandle(fileName); + ret = AppIncrementalFileReady(bundleName, fileName, move(fd), move(reportFd), errCode); if (ret) { - HILOGE("Failed to extension file handle %{public}s", fileName.c_str()); + HILOGE("Failed to send file handle %{public}s", GetAnonyString(fileName).c_str()); } } return true; diff --git a/services/backup_sa/src/module_ipc/svc_extension_incremental_proxy.cpp b/services/backup_sa/src/module_ipc/svc_extension_incremental_proxy.cpp index 03dbb4fe3..c29b0e72b 100644 --- a/services/backup_sa/src/module_ipc/svc_extension_incremental_proxy.cpp +++ b/services/backup_sa/src/module_ipc/svc_extension_incremental_proxy.cpp @@ -25,7 +25,7 @@ namespace OHOS::FileManagement::Backup { using namespace std; -ErrCode SvcExtensionProxy::GetIncrementalFileHandle(const string &fileName) +std::tuple SvcExtensionProxy::GetIncrementalFileHandle(const string &fileName) { HITRACE_METER_NAME(HITRACE_TAG_FILEMANAGEMENT, __PRETTY_FUNCTION__); HILOGD("Start"); @@ -35,7 +35,7 @@ ErrCode SvcExtensionProxy::GetIncrementalFileHandle(const string &fileName) if (!data.WriteString(fileName)) { BError(BError::Codes::SDK_INVAL_ARG, "Failed to send the fileName"); - return ErrCode(EPERM); + return {ErrCode(EPERM), UniqueFd(-1), UniqueFd(-1)}; } MessageParcel reply; @@ -44,11 +44,14 @@ ErrCode SvcExtensionProxy::GetIncrementalFileHandle(const string &fileName) data, reply, option); if (ret != NO_ERROR) { HILOGE("Received error %{public}d when doing IPC", ret); - return ErrCode(ret); + return {ErrCode(ret), UniqueFd(-1), UniqueFd(-1)}; } HILOGD("Successful"); - return reply.ReadInt32(); + ErrCode err(reply.ReadInt32()); + UniqueFd fd(reply.ReadFileDescriptor()); + UniqueFd reportFd(reply.ReadFileDescriptor()); + return {err, move(fd), move(reportFd)}; } ErrCode SvcExtensionProxy::PublishIncrementalFile(const string &fileName) diff --git a/tests/mock/module_ipc/svc_extension_proxy_mock.cpp b/tests/mock/module_ipc/svc_extension_proxy_mock.cpp index bb000e090..a2534d899 100644 --- a/tests/mock/module_ipc/svc_extension_proxy_mock.cpp +++ b/tests/mock/module_ipc/svc_extension_proxy_mock.cpp @@ -48,9 +48,9 @@ ErrCode SvcExtensionProxy::GetBackupInfo(std::string &result) return 0; } -ErrCode SvcExtensionProxy::GetIncrementalFileHandle(const string &fileName) +std::tuple SvcExtensionProxy::GetIncrementalFileHandle(const string &fileName) { - return 0; + return {0, UniqueFd(-1), UniqueFd(-1)}; } ErrCode SvcExtensionProxy::PublishIncrementalFile(const string &fileName) diff --git a/tests/unittests/backup_api/backup_impl/include/ext_extension_mock.h b/tests/unittests/backup_api/backup_impl/include/ext_extension_mock.h index b5070b41f..3399bc312 100644 --- a/tests/unittests/backup_api/backup_impl/include/ext_extension_mock.h +++ b/tests/unittests/backup_api/backup_impl/include/ext_extension_mock.h @@ -104,9 +104,9 @@ public: return BError(BError::Codes::OK); }; - ErrCode GetIncrementalFileHandle(const std::string &fileName) override + std::tuple GetIncrementalFileHandle(const std::string &fileName) override { - return BError(BError::Codes::OK); + return {BError(BError::Codes::OK), UniqueFd(-1), UniqueFd(-1)}; }; ErrCode PublishIncrementalFile(const std::string &fileName) override diff --git a/tests/unittests/backup_ext/ext_extension_stub_test.cpp b/tests/unittests/backup_ext/ext_extension_stub_test.cpp index 8755506fc..99a8bd55c 100644 --- a/tests/unittests/backup_ext/ext_extension_stub_test.cpp +++ b/tests/unittests/backup_ext/ext_extension_stub_test.cpp @@ -31,7 +31,7 @@ public: MOCK_METHOD(ErrCode, HandleBackup, (bool isClearData)); MOCK_METHOD(ErrCode, PublishFile, (const std::string &fileName)); MOCK_METHOD(ErrCode, HandleRestore, (bool isClearData)); - MOCK_METHOD(ErrCode, GetIncrementalFileHandle, (const std::string &fileName)); + MOCK_METHOD((std::tuple), GetIncrementalFileHandle, (const std::string &fileName)); MOCK_METHOD(ErrCode, PublishIncrementalFile, (const std::string &fileName)); MOCK_METHOD(ErrCode, HandleIncrementalBackup, (UniqueFd incrementalFd, UniqueFd manifestFd)); MOCK_METHOD(ErrCode, IncrementalOnBackup, (bool isClearData)); @@ -311,14 +311,15 @@ HWTEST_F(ExtExtensionStubTest, SUB_backup_ext_ExtExtensionStub_CmdGetIncremental EXPECT_EQ(err, BError(BError::Codes::EXT_INVAL_ARG)); EXPECT_CALL(*messageParcelMock, ReadString(_)).WillOnce(Return(true)); - EXPECT_CALL(*stub, GetIncrementalFileHandle(_)).WillOnce(Return(0)); + EXPECT_CALL(*stub, GetIncrementalFileHandle(_)).WillOnce(Return(make_tuple(0, UniqueFd(-1), UniqueFd(-1)))); EXPECT_CALL(*messageParcelMock, WriteInt32(_)).WillOnce(Return(false)); err = stub->CmdGetIncrementalFileHandle(data, reply); EXPECT_EQ(err, BError(BError::Codes::EXT_BROKEN_IPC)); EXPECT_CALL(*messageParcelMock, ReadString(_)).WillOnce(Return(true)); - EXPECT_CALL(*stub, GetIncrementalFileHandle(_)).WillOnce(Return(0)); + EXPECT_CALL(*stub, GetIncrementalFileHandle(_)).WillOnce(Return(make_tuple(0, UniqueFd(-1), UniqueFd(-1)))); EXPECT_CALL(*messageParcelMock, WriteInt32(_)).WillOnce(Return(true)); + EXPECT_CALL(*messageParcelMock, WriteFileDescriptor(_)).WillOnce(Return(true)).WillOnce(Return(true)); err = stub->CmdGetIncrementalFileHandle(data, reply); EXPECT_EQ(err, BError(BError::Codes::OK)); } catch (...) { diff --git a/tests/unittests/backup_sa/module_ipc/svc_extension_proxy_test.cpp b/tests/unittests/backup_sa/module_ipc/svc_extension_proxy_test.cpp index aa55e0dc0..572c43f85 100644 --- a/tests/unittests/backup_sa/module_ipc/svc_extension_proxy_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/svc_extension_proxy_test.cpp @@ -368,20 +368,21 @@ HWTEST_F(SvcExtensionProxyTest, SUB_Ext_Extension_proxy_GetIncrementalFileHandle EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(false)); EXPECT_TRUE(proxy_ != nullptr); - ErrCode ret = proxy_->GetIncrementalFileHandle(fileName); + auto [ret, fd, reportFd] = proxy_->GetIncrementalFileHandle(fileName); EXPECT_EQ(ret, ErrCode(EPERM)); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(EPERM)); - ret = proxy_->GetIncrementalFileHandle(fileName); + tie(ret, fd, reportFd) = proxy_->GetIncrementalFileHandle(fileName); EXPECT_EQ(ret, ErrCode(EPERM)); EXPECT_CALL(*messageParcelMock_, WriteInterfaceToken(_)).WillOnce(Return(true)); EXPECT_CALL(*messageParcelMock_, WriteString(_)).WillOnce(Return(true)); EXPECT_CALL(*mock_, SendRequest(_, _, _, _)).WillOnce(Return(NO_ERROR)); EXPECT_CALL(*messageParcelMock_, ReadInt32()).WillOnce(Return(NO_ERROR)); - ret = proxy_->GetIncrementalFileHandle(fileName); + EXPECT_CALL(*messageParcelMock_, ReadFileDescriptor()).WillOnce(Return(-1)).WillOnce(Return(-1)); + tie(ret, fd, reportFd) = proxy_->GetIncrementalFileHandle(fileName); EXPECT_EQ(ret, ErrCode(BError::Codes::OK)); } catch (...) { EXPECT_TRUE(false); -- Gitee