Fix ManifestDirectInstall/Update on Hybrid pkg 38/217638/9
authorJunghyun Yeon <jungh.yeon@samsung.com>
Wed, 13 Nov 2019 05:33:39 +0000 (14:33 +0900)
committerJunghyun Yeon <jungh.yeon@samsung.com>
Thu, 14 Nov 2019 11:44:01 +0000 (20:44 +0900)
Previous implementation did not consider if modified manifest has deleted.
Merging WGT and TPK configs with "OVERWRITE" option
will remove WGT application data so fixing it by merge it and
to consider modified manifest's existance, CONCAT works as merge,
not direct concat to remove duplication.

Change-Id: I5ae4f085b0e33dde2a8408fa4a525806e9321b09
Signed-off-by: Junghyun Yeon <jungh.yeon@samsung.com>
src/hybrid/hybrid_installer.cc
src/hybrid/step/configuration/step_merge_tpk_config.cc
src/hybrid/step/configuration/step_merge_tpk_config.h

index d25264dbd6cb092bd85423247e937954b4f64da6..fc7824f3c69b7a4a5531831da5e5f52912b7e091 100644 (file)
@@ -151,8 +151,7 @@ void HybridInstaller::InstallSteps() {
   AddStep<wgt::pkgmgr::StepGenerateXml>();
   AddStep<hybrid::pkgmgr::StepMergeXml>();
   AddStep<tpk::pkgmgr::StepManifestAdjustment>();
-  AddStep<hybrid::configuration::StepMergeTpkConfig>(
-      hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT);
+  AddStep<hybrid::configuration::StepMergeTpkConfig>();
   AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
   AddStep<ci::security::StepPrivilegeCompatibility>(
       ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
@@ -211,8 +210,7 @@ void HybridInstaller::UpdateSteps() {
   AddStep<wgt::pkgmgr::StepGenerateXml>();
   AddStep<hybrid::pkgmgr::StepMergeXml>();
   AddStep<tpk::pkgmgr::StepManifestAdjustment>();
-  AddStep<hybrid::configuration::StepMergeTpkConfig>(
-      hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT);
+  AddStep<hybrid::configuration::StepMergeTpkConfig>();
   AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
   AddStep<ci::security::StepPrivilegeCompatibility>(
       ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
@@ -307,8 +305,7 @@ void HybridInstaller::DeltaSteps() {
   AddStep<wgt::pkgmgr::StepGenerateXml>();
   AddStep<hybrid::pkgmgr::StepMergeXml>();
   AddStep<tpk::pkgmgr::StepManifestAdjustment>();
-  AddStep<hybrid::configuration::StepMergeTpkConfig>(
-      hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT);
+  AddStep<hybrid::configuration::StepMergeTpkConfig>();
   AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
   AddStep<ci::security::StepPrivilegeCompatibility>(
       ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
@@ -382,8 +379,7 @@ void HybridInstaller::MountInstallSteps() {
   AddStep<wgt::pkgmgr::StepGenerateXml>();
   AddStep<hybrid::pkgmgr::StepMergeXml>();
   AddStep<tpk::pkgmgr::StepManifestAdjustment>();
-  AddStep<hybrid::configuration::StepMergeTpkConfig>(
-      hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT);
+  AddStep<hybrid::configuration::StepMergeTpkConfig>();
   AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
   AddStep<ci::security::StepPrivilegeCompatibility>(
       ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
@@ -441,8 +437,7 @@ void HybridInstaller::MountUpdateSteps() {
   AddStep<wgt::pkgmgr::StepGenerateXml>();
   AddStep<hybrid::pkgmgr::StepMergeXml>();
   AddStep<tpk::pkgmgr::StepManifestAdjustment>();
-  AddStep<hybrid::configuration::StepMergeTpkConfig>(
-      hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT);
+  AddStep<hybrid::configuration::StepMergeTpkConfig>();
   AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
   AddStep<ci::security::StepPrivilegeCompatibility>(
       ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
@@ -482,8 +477,7 @@ void HybridInstaller::ManifestDirectInstallSteps() {
   AddStep<wgt::pkgmgr::StepGenerateXml>();
   AddStep<hybrid::pkgmgr::StepMergeXml>();
   AddStep<tpk::pkgmgr::StepManifestAdjustment>();
-  AddStep<hybrid::configuration::StepMergeTpkConfig>(
-      hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE);
+  AddStep<hybrid::configuration::StepMergeTpkConfig>();
   AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
   AddStep<ci::security::StepPrivilegeCompatibility>(
       ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
@@ -526,8 +520,7 @@ void HybridInstaller::ManifestDirectUpdateSteps() {
   AddStep<wgt::pkgmgr::StepGenerateXml>();
   AddStep<hybrid::pkgmgr::StepMergeXml>();
   AddStep<tpk::pkgmgr::StepManifestAdjustment>();
-  AddStep<hybrid::configuration::StepMergeTpkConfig>(
-      hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE);
+  AddStep<hybrid::configuration::StepMergeTpkConfig>();
   AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
   AddStep<ci::security::StepPrivilegeCompatibility>(
       ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
@@ -553,8 +546,7 @@ void HybridInstaller::ManifestPartialInstallSteps() {
   AddStep<hybrid::configuration::StepStashTpkConfig>();
   AddStep<wgt::configuration::StepParse>(
       wgt::configuration::StepParse::ConfigLocation::INSTALLED, true);
-  AddStep<hybrid::configuration::StepMergeTpkConfig>(
-      hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE);
+  AddStep<hybrid::configuration::StepMergeTpkConfig>();
   AddStep<hybrid::configuration::StepSetMainapp>();
   AddStep<ci::configuration::StepParsePreload>();
   AddStep<ci::security::StepSignature>(false);
@@ -584,8 +576,7 @@ void HybridInstaller::ManifestPartialUpdateSteps() {
   AddStep<hybrid::configuration::StepStashTpkConfig>();
   AddStep<wgt::configuration::StepParse>(
       wgt::configuration::StepParse::ConfigLocation::INSTALLED, true);
-  AddStep<hybrid::configuration::StepMergeTpkConfig>(
-      hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE);
+  AddStep<hybrid::configuration::StepMergeTpkConfig>();
   AddStep<hybrid::configuration::StepSetMainapp>();
   AddStep<ci::configuration::StepParsePreload>();
   AddStep<ci::security::StepSignature>(false);
@@ -668,8 +659,7 @@ void HybridInstaller::ReadonlyUpdateInstallSteps() {
   AddStep<wgt::pkgmgr::StepGenerateXml>();
   AddStep<hybrid::pkgmgr::StepMergeXml>();
   AddStep<tpk::pkgmgr::StepManifestAdjustment>();
-  AddStep<hybrid::configuration::StepMergeTpkConfig>(
-      hybrid::configuration::StepMergeTpkConfig::MergeType::CONCAT);
+  AddStep<hybrid::configuration::StepMergeTpkConfig>();
   AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
   AddStep<ci::security::StepPrivilegeCompatibility>(
       ci::security::StepPrivilegeCompatibility::InternalPrivType::BOTH);
@@ -766,8 +756,7 @@ void HybridInstaller::RecoverDBSteps() {
       wgt::configuration::StepParse::ConfigLocation::INSTALLED, true);
   AddStep<ci::configuration::StepParsePreload>();
   AddStep<wgt::security::StepCheckSettingsLevel>();
-  AddStep<hybrid::configuration::StepMergeTpkConfig>(
-      hybrid::configuration::StepMergeTpkConfig::MergeType::OVERWRITE);
+  AddStep<hybrid::configuration::StepMergeTpkConfig>();
   AddStep<hybrid::configuration::StepMergeTpkPrivileges>();
   AddStep<ci::security::StepGetPrivilegeLevel>();
   AddStep<ci::security::StepPrivilegeCompatibility>(
index d63d00322dd264da456ec15240004128276f89e3..504f557c39b305482017c32cd0cff63353c23249 100644 (file)
@@ -4,31 +4,44 @@
 
 #include "hybrid/step/configuration/step_merge_tpk_config.h"
 
+#include <glib.h>
+#include <string.h>
+
 #include <pkgmgrinfo_basic.h>
 
+#include "common/utils/glist_range.h"
+
 #include "hybrid/hybrid_backend_data.h"
 
 namespace hybrid {
 namespace configuration {
 
-StepMergeTpkConfig::StepMergeTpkConfig(
-    common_installer::InstallerContext* context,
-    MergeType type) : Step(context), merge_type_(type) {
-}
-
 common_installer::Step::Status StepMergeTpkConfig::process() {
   HybridBackendData* data =
       static_cast<HybridBackendData*>(context_->backend_data.get());
   manifest_x* tpk_data = data->tpk_manifest_data.get();
   manifest_x* wgt_data = context_->manifest_data.get();
+  // FIXME:api-version of tpk app will have wgt's if modified manifest exists.
+  for (GList* tpk_list = tpk_data->application;
+      tpk_list != nullptr; tpk_list = g_list_next(tpk_list)) {
+    application_x* tpk_app = static_cast<application_x*>(tpk_list->data);
+    bool is_found = false;
+    for (GList* wgt_list = wgt_data->application;
+        wgt_list != nullptr; wgt_list = g_list_next(wgt_list)) {
+      application_x* wgt_app = static_cast<application_x*>(wgt_list->data);
+      if (!strcmp(tpk_app->appid, wgt_app->appid)) {
+        is_found = true;
+        break;
+      }
+    }
+    if (is_found)
+      continue;
+    wgt_data->application = g_list_append(
+        wgt_data->application, tpk_list->data);
+    tpk_data->application = g_list_delete_link(
+        tpk_data->application, tpk_list);
+  }
 
-  if (merge_type_ == MergeType::CONCAT)
-    wgt_data->application =
-        g_list_concat(wgt_data->application, tpk_data->application);
-  else
-    wgt_data->application = tpk_data->application;
-
-  tpk_data->application = nullptr;
   return Status::OK;
 }
 
index 6491d347d1b1a084e25f6e42696acdb8a14ca240..2171d59a96a0c992980877f1d1df306eeb7fe4bc 100644 (file)
@@ -18,14 +18,6 @@ namespace configuration {
  */
 class StepMergeTpkConfig : public common_installer::Step {
  public:
-  enum class MergeType {
-    CONCAT,      // Concatenate configurations
-    OVERWRITE    // Overwrite one with others
-  };
-
-  explicit StepMergeTpkConfig(common_installer::InstallerContext* context,
-      MergeType type);
-
   using Step::Step;
 
   Status process() override;
@@ -33,9 +25,6 @@ class StepMergeTpkConfig : public common_installer::Step {
   Status undo() override { return Status::OK; }
   Status precheck() override { return Status::OK; }
 
- private:
-  MergeType merge_type_;
-
   STEP_NAME(MergeTpkConfig)
 };