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 d25264d..fc7824f 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 d63d003..504f557 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 6491d34..2171d59 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)
 };