namespace tpk {
namespace filesystem {
+ci::Step::Status StepTpkPreparePackageDirectory::BackupDirectory(
+ const std::string& entry, const bf::path& backup_path) {
+ if (!bf::exists(context_->pkg_path.get() / entry))
+ return Status::OK;
+ if (!ci::MoveDir(context_->pkg_path.get() / entry, backup_path,
+ ci::FSFlag::FS_MERGE_OVERWRITE | ci::FSFlag::FS_COMMIT_COPY_FILE)) {
+ LOG(ERROR) << "Failed to backup file";
+ return Status::APP_DIR_ERROR;
+ }
+
+ backupPath_ = backup_path;
+ return Status::OK;
+}
+
ci::Step::Status StepTpkPreparePackageDirectory::PrepareDirectory(
const std::string& entry) {
// Due to the fact that boost fails to return correct parent_path() then path
ci::Step::Status StepTpkPreparePackageDirectory::ExtractEntries() {
LOG(DEBUG) << "Extracting entries from zip package...";
+ bf::path backup_path =
+ ci::GetBackupPathForPackagePath(context_->pkg_path.get());
+ if (context_->request_type.get() == ci::RequestType::MountUpdate &&
+ context_->recovery_info.get().recovery_file) {
+ context_->recovery_info.get().recovery_file->set_unpacked_dir(backup_path);
+ context_->recovery_info.get().recovery_file->WriteAndCommitFileContent();
+ }
+
for (auto& entry : tpk::GetExtractEntries()) {
LOG(DEBUG) << "Extracting: " << entry;
+ if (context_->request_type.get() == ci::RequestType::MountUpdate)
+ if (BackupDirectory(entry, backup_path) != Status::OK)
+ return Status::APP_DIR_ERROR;
auto status = PrepareDirectory(entry);
if (status != Status::OK)
return status;
return Status::OK;
}
+ci::Step::Status StepTpkPreparePackageDirectory::clean() {
+ if (!backupPath_.empty())
+ ci::RemoveAll(backupPath_);
+
+ return Status::OK;
+}
+
+ci::Step::Status StepTpkPreparePackageDirectory::undo() {
+ if (backupPath_.empty())
+ return Status::OK;
+
+ for (auto& entry : tpk::GetExtractEntries()) {
+ ci::RemoveAll(context_->pkg_path.get() / entry);
+ if (!bf::exists(backupPath_ / entry))
+ continue;
+ ci::MoveDir(backupPath_ / entry, context_->pkg_path.get() / entry,
+ ci::FSFlag::FS_MERGE_OVERWRITE | ci::FSFlag::FS_COMMIT_COPY_FILE);
+ }
+ ci::RemoveAll(backupPath_);
+ return Status::OK;
+}
+
+
} // namespace filesystem
} // namespace tpk
using Step::Step;
Status process() override;
- Status clean() override { return Status::OK; }
- Status undo() override { return Status::OK; }
+ Status clean() override;
+ Status undo() override;
Status precheck() override;
protected:
+ Status BackupDirectory(const std::string& entry,
+ const boost::filesystem::path& backup_path);
Status PrepareDirectory(const std::string& entry);
Status PrepareLinks();
Status ExtractEntries();
Status PrepareLink(const std::string& entry,
const boost::filesystem::path& mount_point);
+ private:
+ boost::filesystem::path backupPath_;
STEP_NAME(TpkPreparePackageDirectory)
};