From c0ab14096139c4e72a501bc6e82ab92d0e9e48f3 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Fri, 24 May 2013 23:46:22 +0200 Subject: [PATCH] hpkg format: Add attribute for declaring post install scripts --- headers/os/package/PackageInfo.h | 7 +++++ headers/os/package/PackageInfoAttributes.h | 2 ++ headers/os/package/hpkg/PackageAttributes.h | 2 ++ src/bin/package/command_list.cpp | 4 +++ src/kits/package/PackageInfo.cpp | 32 ++++++++++++++++++++- src/kits/package/PackageInfoParser.cpp | 4 +++ src/kits/package/hpkg/ReaderImplBase.cpp | 5 ++++ src/kits/package/hpkg/WriterImplBase.cpp | 7 +++++ 8 files changed, 62 insertions(+), 1 deletion(-) diff --git a/headers/os/package/PackageInfo.h b/headers/os/package/PackageInfo.h index 3cda4350b8..68d5e21067 100644 --- a/headers/os/package/PackageInfo.h +++ b/headers/os/package/PackageInfo.h @@ -90,6 +90,8 @@ public: const BObjectList& Users() const; const BStringList& Groups() const; + const BStringList& PostInstallScripts() const; + const BObjectList& ProvidesList() const; const BObjectList& RequiresList() const; @@ -145,6 +147,9 @@ public: void ClearGroups(); status_t AddGroup(const BString& group); + void ClearPostInstallScripts(); + status_t AddPostInstallScript(const BString& path); + void ClearProvidesList(); status_t AddProvides(const BPackageResolvable& provides); @@ -278,6 +283,8 @@ private: UserList fUsers; BStringList fGroups; + BStringList fPostInstallScripts; + ResolvableList fProvidesList; ResolvableExpressionList fRequiresList; diff --git a/headers/os/package/PackageInfoAttributes.h b/headers/os/package/PackageInfoAttributes.h index b54c995a2d..71e186b888 100644 --- a/headers/os/package/PackageInfoAttributes.h +++ b/headers/os/package/PackageInfoAttributes.h @@ -49,6 +49,8 @@ enum BPackageInfoAttributeID { // list of (Unix) users defined/needed B_PACKAGE_INFO_GROUPS, // list of (Unix) groups defined/needed + B_PACKAGE_INFO_POST_INSTALL_SCRIPTS, + // list of scripts to be executed post-install // B_PACKAGE_INFO_ENUM_COUNT, }; diff --git a/headers/os/package/hpkg/PackageAttributes.h b/headers/os/package/hpkg/PackageAttributes.h index ffa1dd4a51..022c93f75c 100644 --- a/headers/os/package/hpkg/PackageAttributes.h +++ b/headers/os/package/hpkg/PackageAttributes.h @@ -77,3 +77,5 @@ B_DEFINE_HPKG_ATTRIBUTE(48, STRING, "package:user.home", PACKAGE_USER_HOME) B_DEFINE_HPKG_ATTRIBUTE(49, STRING, "package:user.shell", PACKAGE_USER_SHELL) B_DEFINE_HPKG_ATTRIBUTE(50, STRING, "package:user.group", PACKAGE_USER_GROUP) B_DEFINE_HPKG_ATTRIBUTE(51, STRING, "package:group", PACKAGE_GROUP) +B_DEFINE_HPKG_ATTRIBUTE(52, STRING, "package:post-install-script", + PACKAGE_POST_INSTALL_SCRIPT) diff --git a/src/bin/package/command_list.cpp b/src/bin/package/command_list.cpp index 882f4c9be4..bc35f7a52b 100644 --- a/src/bin/package/command_list.cpp +++ b/src/bin/package/command_list.cpp @@ -326,6 +326,10 @@ struct PackageContentListHandler : VersionPolicy::PackageContentHandler { printf("\tgroup: %s\n", value.string); break; + case B_PACKAGE_INFO_POST_INSTALL_SCRIPTS: + printf("\tpost install script: %s\n", value.string); + break; + case B_PACKAGE_INFO_INSTALL_PATH: printf("\tinstall path: %s\n", value.string); break; diff --git a/src/kits/package/PackageInfo.cpp b/src/kits/package/PackageInfo.cpp index 5297f5f681..0e72db6a63 100644 --- a/src/kits/package/PackageInfo.cpp +++ b/src/kits/package/PackageInfo.cpp @@ -54,7 +54,8 @@ const char* const BPackageInfo::kElementNames[B_PACKAGE_INFO_ENUM_COUNT] = { "global-settings-files", "user-settings-files", "users", - "groups" + "groups", + "post-install-scripts" }; @@ -171,6 +172,7 @@ BPackageInfo::BPackageInfo() fUserSettingsFileInfos(4, true), fUsers(4, true), fGroups(4), + fPostInstallScripts(4), fProvidesList(20, true), fRequiresList(20, true), fSupplementsList(20, true), @@ -194,6 +196,7 @@ BPackageInfo::BPackageInfo(BMessage* archive, status_t* _error) fUserSettingsFileInfos(4, true), fUsers(4, true), fGroups(4), + fPostInstallScripts(4), fProvidesList(20, true), fRequiresList(20, true), fSupplementsList(20, true), @@ -225,6 +228,8 @@ BPackageInfo::BPackageInfo(BMessage* archive, status_t* _error) fUserSettingsFileInfos)) == B_OK && (error = _ExtractUsers(archive, "users", fUsers)) == B_OK && (error = _ExtractStringList(archive, "groups", fGroups)) == B_OK + && (error = _ExtractStringList(archive, "post-install-scripts", + fPostInstallScripts)) == B_OK && (error = _ExtractResolvables(archive, "provides", fProvidesList)) == B_OK && (error = _ExtractResolvableExpressions(archive, "requires", @@ -516,6 +521,13 @@ BPackageInfo::Groups() const } +const BStringList& +BPackageInfo::PostInstallScripts() const +{ + return fPostInstallScripts; +} + + const BObjectList& BPackageInfo::ProvidesList() const { @@ -779,6 +791,20 @@ BPackageInfo::AddGroup(const BString& group) } +void +BPackageInfo::ClearPostInstallScripts() +{ + fPostInstallScripts.MakeEmpty(); +} + + +status_t +BPackageInfo::AddPostInstallScript(const BString& path) +{ + return fPostInstallScripts.Add(path) ? B_OK : B_NO_MEMORY; +} + + void BPackageInfo::ClearProvidesList() { @@ -910,6 +936,7 @@ BPackageInfo::Clear() fUserSettingsFileInfos.MakeEmpty(); fUsers.MakeEmpty(); fGroups.MakeEmpty(); + fPostInstallScripts.MakeEmpty(); fRequiresList.MakeEmpty(); fProvidesList.MakeEmpty(); fSupplementsList.MakeEmpty(); @@ -947,6 +974,8 @@ BPackageInfo::Archive(BMessage* archive, bool deep) const "user-settings-files", fUserSettingsFileInfos)) != B_OK || (error = _AddUsers(archive, "users", fUsers)) != B_OK || (error = archive->AddStrings("groups", fGroups)) != B_OK + || (error = archive->AddStrings("post-install-scripts", + fPostInstallScripts)) != B_OK || (error = _AddResolvables(archive, "provides", fProvidesList)) != B_OK || (error = _AddResolvableExpressions(archive, "requires", fRequiresList)) != B_OK @@ -994,6 +1023,7 @@ BPackageInfo::GetConfigString(BString& _string) const .Write("user-settings-files", fUserSettingsFileInfos) .Write("users", fUsers) .Write("groups", fGroups) + .Write("post-install-scripts", fPostInstallScripts) .Write("provides", fProvidesList) .BeginRequires(fBasePackage) .Write("requires", fRequiresList) diff --git a/src/kits/package/PackageInfoParser.cpp b/src/kits/package/PackageInfoParser.cpp index 28219f52bf..1bce2a1ab5 100644 --- a/src/kits/package/PackageInfoParser.cpp +++ b/src/kits/package/PackageInfoParser.cpp @@ -934,6 +934,10 @@ BPackageInfo::Parser::_Parse(BPackageInfo* packageInfo) _ParseStringList(&packageInfo->fGroups); break; + case B_PACKAGE_INFO_POST_INSTALL_SCRIPTS: + _ParseStringList(&packageInfo->fPostInstallScripts); + break; + case B_PACKAGE_INFO_PROVIDES: _ParseResolvableList(&packageInfo->fProvidesList); break; diff --git a/src/kits/package/hpkg/ReaderImplBase.cpp b/src/kits/package/hpkg/ReaderImplBase.cpp index b626335e48..2c1557bdf2 100644 --- a/src/kits/package/hpkg/ReaderImplBase.cpp +++ b/src/kits/package/hpkg/ReaderImplBase.cpp @@ -647,6 +647,11 @@ ReaderImplBase::PackageAttributeHandler::HandleAttribute( fPackageInfoValue.SetTo(B_PACKAGE_INFO_GROUPS, value.string); break; + case B_HPKG_ATTRIBUTE_ID_PACKAGE_POST_INSTALL_SCRIPT: + fPackageInfoValue.SetTo(B_PACKAGE_INFO_POST_INSTALL_SCRIPTS, + value.string); + break; + default: if (context->ignoreUnknownAttributes) break; diff --git a/src/kits/package/hpkg/WriterImplBase.cpp b/src/kits/package/hpkg/WriterImplBase.cpp index ac42b1f69e..ef164aa9a1 100644 --- a/src/kits/package/hpkg/WriterImplBase.cpp +++ b/src/kits/package/hpkg/WriterImplBase.cpp @@ -457,6 +457,13 @@ WriterImplBase::RegisterPackageInfo(PackageAttributeList& attributeList, groups.StringAt(i), attributeList); } + // post install script list + const BStringList& postInstallScripts = packageInfo.PostInstallScripts(); + for (int32 i = 0; i < postInstallScripts.CountStrings(); i++) { + _AddStringAttribute(B_HPKG_ATTRIBUTE_ID_PACKAGE_POST_INSTALL_SCRIPT, + postInstallScripts.StringAt(i), attributeList); + } + // checksum (optional, only exists in repositories) _AddStringAttributeIfNotEmpty(B_HPKG_ATTRIBUTE_ID_PACKAGE_CHECKSUM, packageInfo.Checksum(), attributeList);