From fe28d36222e1eddf0686a3d9ea98baf59de17cf1 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 30 Apr 2014 17:02:42 +0200 Subject: [PATCH] package daemon: Don't apply system package changes immediately When a system package is going to be deactivated, activate/deactivate the packages of the whole transaction only to the latest state. Afterward latest state and active state will differ. --- .../package/CommitTransactionHandler.cpp | 23 +++++++++++++++++++ .../package/CommitTransactionHandler.h | 2 ++ 2 files changed, 25 insertions(+) diff --git a/src/servers/package/CommitTransactionHandler.cpp b/src/servers/package/CommitTransactionHandler.cpp index 87c7eaabb2..8e738b55a0 100644 --- a/src/servers/package/CommitTransactionHandler.cpp +++ b/src/servers/package/CommitTransactionHandler.cpp @@ -368,6 +368,11 @@ CommitTransactionHandler::_RemovePackagesToDeactivate() for (PackageSet::const_iterator it = fPackagesToDeactivate.begin(); it != fPackagesToDeactivate.end(); ++it) { Package* package = *it; + + // When deactivating (or updating) a system package, don't do that live. + if (_IsSystemPackage(package)) + fVolumeStateIsActive = false; + if (fPackagesAlreadyRemoved.find(package) != fPackagesAlreadyRemoved.end()) { fRemovedPackages.insert(package); @@ -1508,6 +1513,24 @@ CommitTransactionHandler::_FillInActivationChangeItem( } +bool +CommitTransactionHandler::_IsSystemPackage(Package* package) +{ + // package name should be "haiku[_]" + const BString& name = package->Info().Name(); + if (!name.StartsWith("haiku")) + return false; + if (name.Length() == 5) + return true; + if (name[5] != '_') + return false; + + BPackageArchitecture architecture; + return BPackageInfo::GetArchitectureByName(name.String() + 6, architecture) + == B_OK; +} + + /*static*/ BString CommitTransactionHandler::_GetPath(const FSUtils::Entry& entry, const BString& fallback) diff --git a/src/servers/package/CommitTransactionHandler.h b/src/servers/package/CommitTransactionHandler.h index 1b8f72274f..ce30f921fb 100644 --- a/src/servers/package/CommitTransactionHandler.h +++ b/src/servers/package/CommitTransactionHandler.h @@ -127,6 +127,8 @@ private: PackageFSActivationChangeType type, Package* package, char*& nameBuffer); + bool _IsSystemPackage(Package* package); + static BString _GetPath(const FSUtils::Entry& entry, const BString& fallback);