added 4 changesets to branch 'refs/remotes/HaikuPM-github/package-management' old head: 916e7e75a3308431155d900cf847693ea3d3ef58 new head: 03d70b4e58f04e54ed9d76a072a0b66750f7037c overview: https://github.com/haiku/HaikuPM/compare/916e7e7...03d70b4 ---------------------------------------------------------------------------- ed156ea: package[_repo] list: reduce code duplication Introduce helper class PackageInfoPrinter that does the printing and is used by both commands. 4e6141b: package list: add option '-i' to list only the meta info 4ce282c: package list: also support package info files 03d70b4: Add package architecture constant for x86-64 [ Ingo Weinhold <ingo_weinhold@xxxxxx> ] ---------------------------------------------------------------------------- 7 files changed, 493 insertions(+), 409 deletions(-) headers/os/package/PackageArchitecture.h | 1 + src/bin/package/PackageInfoPrinter.h | 393 +++++++++++++++++++++++++++ src/bin/package/command_list.cpp | 273 ++++++------------- src/bin/package/package.cpp | 1 + src/bin/package_repo/Jamfile | 3 +- src/bin/package_repo/command_list.cpp | 230 +--------------- src/kits/package/PackageInfo.cpp | 1 + ############################################################################ Commit: ed156ea6c830aad9386342372bfcaf743a853663 Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Sat Jul 13 14:24:03 2013 UTC package[_repo] list: reduce code duplication Introduce helper class PackageInfoPrinter that does the printing and is used by both commands. ---------------------------------------------------------------------------- diff --git a/src/bin/package/PackageInfoPrinter.h b/src/bin/package/PackageInfoPrinter.h new file mode 100644 index 0000000..7bc6f39 --- /dev/null +++ b/src/bin/package/PackageInfoPrinter.h @@ -0,0 +1,326 @@ +/* + * Copyright 2009-2013, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Distributed under the terms of the MIT License. + */ +#ifndef PACKAGE_INFO_PRINTER_H +#define PACKAGE_INFO_PRINTER_H + + +#include <stdio.h> + +#include <package/hpkg/PackageInfoAttributeValue.h> +#include <package/PackageInfo.h> + + +using namespace BPackageKit; +using BPackageKit::BHPKG::BGlobalWritableFileInfoData; +using BPackageKit::BHPKG::BPackageInfoAttributeValue; +using BPackageKit::BHPKG::BUserData; +using BPackageKit::BHPKG::BUserSettingsFileInfoData; + + +class PackageInfoPrinter { +public: + bool PrintAttribute(const BPackageInfoAttributeValue& value) + { + switch (value.attributeID) { + case B_PACKAGE_INFO_NAME: + PrintName(value.string); + break; + + case B_PACKAGE_INFO_SUMMARY: + PrintSummary(value.string); + break; + + case B_PACKAGE_INFO_DESCRIPTION: + PrintDescription(value.string); + break; + + case B_PACKAGE_INFO_VENDOR: + PrintVendor(value.string); + break; + + case B_PACKAGE_INFO_PACKAGER: + PrintPackager(value.string); + break; + + case B_PACKAGE_INFO_BASE_PACKAGE: + PrintBasePackage(value.string); + break; + + case B_PACKAGE_INFO_FLAGS: + PrintFlags(value.unsignedInt); + break; + + case B_PACKAGE_INFO_ARCHITECTURE: + PrintArchitecture(value.unsignedInt); + break; + + case B_PACKAGE_INFO_VERSION: + PrintVersion(value.version); + break; + + case B_PACKAGE_INFO_COPYRIGHTS: + PrintCopyright(value.string); + break; + + case B_PACKAGE_INFO_LICENSES: + PrintLicense(value.string); + break; + + case B_PACKAGE_INFO_URLS: + PrintUrl(value.string); + break; + + case B_PACKAGE_INFO_SOURCE_URLS: + PrintSourceUrl(value.string); + break; + + case B_PACKAGE_INFO_PROVIDES: + PrintProvides(value.resolvable); + break; + + case B_PACKAGE_INFO_REQUIRES: + PrintRequires(value.resolvableExpression); + break; + + case B_PACKAGE_INFO_SUPPLEMENTS: + PrintSupplements(value.resolvableExpression); + break; + + case B_PACKAGE_INFO_CONFLICTS: + PrintConflicts(value.resolvableExpression); + break; + + case B_PACKAGE_INFO_FRESHENS: + PrintFreshens(value.resolvableExpression); + break; + + case B_PACKAGE_INFO_REPLACES: + PrintReplaces(value.string); + break; + + case B_PACKAGE_INFO_GLOBAL_WRITABLE_FILES: + PrintGlobalWritableFile(value.globalWritableFileInfo); + break; + + case B_PACKAGE_INFO_USER_SETTINGS_FILES: + PrintUserSettingsFile(value.userSettingsFileInfo); + break; + + case B_PACKAGE_INFO_USERS: + PrintUser(value.user); + break; + + case B_PACKAGE_INFO_GROUPS: + PrintGroup(value.string); + break; + + case B_PACKAGE_INFO_POST_INSTALL_SCRIPTS: + PrintPostInstallScript(value.string); + break; + + case B_PACKAGE_INFO_INSTALL_PATH: + PrintInstallPath(value.string); + break; + + default: + return false; + } + + return true; + } + + void PrintName(const char* name) const + { + printf("\tname: %s\n", name); + } + + void PrintSummary(const char* summary) const + { + printf("\tsummary: %s\n", summary); + } + + void PrintDescription(const char* description) const + { + printf("\tdescription: %s\n", description); + } + + void PrintVendor(const char* vendor) const + { + printf("\tvendor: %s\n", vendor); + } + + void PrintPackager(const char* packager) const + { + printf("\tpackager: %s\n", packager); + } + + void PrintBasePackage(const char* basePackage) const + { + printf("\tbase package: %s\n", basePackage); + } + + void PrintFlags(uint32 flags) const + { + if (flags == 0) + return; + + printf("\tflags:\n"); + if ((flags & B_PACKAGE_FLAG_APPROVE_LICENSE) != 0) + printf("\t\tapprove_license\n"); + if ((flags & B_PACKAGE_FLAG_SYSTEM_PACKAGE) != 0) + printf("\t\tsystem_package\n"); + } + + void PrintArchitecture(uint32 architecture) const + { + printf("\tarchitecture: %s\n", + architecture < B_PACKAGE_ARCHITECTURE_ENUM_COUNT + ? BPackageInfo::kArchitectureNames[architecture] + : "<invalid>"); + } + + void PrintVersion(const BPackageVersionData& version) const + { + printf("\tversion: "); + _PrintPackageVersion(version); + printf("\n"); + } + + void PrintCopyright(const char* copyright) const + { + printf("\tcopyright: %s\n", copyright); + } + + void PrintLicense(const char* license) const + { + printf("\tlicense: %s\n", license); + } + + void PrintUrl(const char* url) const + { + printf("\tURL: %s\n", url); + } + + void PrintSourceUrl(const char* sourceUrl) const + { + printf("\tsource URL: %s\n", sourceUrl); + } + + void PrintProvides(const BPackageResolvableData& provides) const + { + printf("\tprovides: %s", provides.name); + if (provides.haveVersion) { + printf(" = "); + _PrintPackageVersion(provides.version); + } + if (provides.haveCompatibleVersion) { + printf(" (compatible >= "); + _PrintPackageVersion(provides.compatibleVersion); + printf(")"); + } + printf("\n"); + } + + void PrintRequires(const BPackageResolvableExpressionData& requires) const + { + _PrintResolvableExpression("requires", requires); + } + + void PrintSupplements(const BPackageResolvableExpressionData& supplements) + const + { + _PrintResolvableExpression("supplements", supplements); + } + + void PrintConflicts(const BPackageResolvableExpressionData& conflicts) const + { + _PrintResolvableExpression("conflicts", conflicts); + } + + void PrintFreshens(const BPackageResolvableExpressionData& freshens) const + { + _PrintResolvableExpression("freshens", freshens); + } + + void PrintReplaces(const char* replaces) const + { + printf("\treplaces: %s\n", replaces); + } + + void PrintGlobalWritableFile(const BGlobalWritableFileInfoData& info) const + { + printf("\tglobal writable file: %s", info.path); + if (info.isDirectory) + printf( " directory"); + if (info.updateType < B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT) { + printf(" %s\n", + BPackageInfo::kWritableFileUpdateTypes[info.updateType]); + } else + printf("\n"); + } + + void PrintUserSettingsFile(const BUserSettingsFileInfoData& info) const + { + printf("\tuser settings file: %s", info.path); + if (info.isDirectory) + printf( " directory\n"); + else if (info.templatePath != NULL) + printf(" template %s\n", info.templatePath); + else + printf("\n"); + } + + void PrintUser(const BUserData& user) const + { + printf("\tuser: %s\n", user.name); + if (user.realName != NULL) + printf("\t\treal name: %s\n", user.realName); + if (user.home != NULL) + printf("\t\thome: %s\n", user.home); + if (user.shell != NULL) + printf("\t\tshell: %s\n", user.shell); + for (size_t i = 0; i < user.groupCount; i++) + printf("\t\tgroup: %s\n", user.groups[i]); + } + + void PrintGroup(const char* group) const + { + printf("\tgroup: %s\n", group); + } + + void PrintPostInstallScript(const char* script) const + { + printf("\tpost install script: %s\n", script); + } + + void PrintInstallPath(const char* path) const + { + printf("\tinstall path: %s\n", path); + } + +private: + static void _PrintPackageVersion(const BPackageVersionData& version) + { + printf("%s", BPackageVersion(version).ToString().String()); + } + + void _PrintResolvableExpression(const char* fieldName, + const BPackageResolvableExpressionData& expression) const + { + printf("\t%s: %s", fieldName, expression.name); + if (expression.haveOpAndVersion) { + printf(" %s ", + expression.op < B_PACKAGE_RESOLVABLE_OP_ENUM_COUNT + ? BPackageResolvableExpression::kOperatorNames[ + expression.op] + : "<invalid operator>"); + _PrintPackageVersion(expression.version); + } + printf("\n"); + } +}; + + +#endif // PACKAGE_INFO_PRINTER_H diff --git a/src/bin/package/command_list.cpp b/src/bin/package/command_list.cpp index dee0452..fc84b07 100644 --- a/src/bin/package/command_list.cpp +++ b/src/bin/package/command_list.cpp @@ -26,6 +26,7 @@ #include <package/PackageInfo.h> #include "package.h" +#include "PackageInfoPrinter.h" using namespace BPackageKit; @@ -81,6 +82,7 @@ template<typename VersionPolicy> struct PackageContentListHandler : VersionPolicy::PackageContentHandler { PackageContentListHandler(bool listAttributes) : + fPrinter(), fLevel(0), fListAttribute(listAttributes) { @@ -167,182 +169,13 @@ struct PackageContentListHandler : VersionPolicy::PackageContentHandler { virtual status_t HandlePackageAttribute( const BPackageInfoAttributeValue& value) { - switch (value.attributeID) { - case B_PACKAGE_INFO_NAME: - printf("package-attributes:\n"); - printf("\tname: %s\n", value.string); - break; - - case B_PACKAGE_INFO_SUMMARY: - printf("\tsummary: %s\n", value.string); - break; - - case B_PACKAGE_INFO_DESCRIPTION: - printf("\tdescription: %s\n", value.string); - break; - - case B_PACKAGE_INFO_VENDOR: - printf("\tvendor: %s\n", value.string); - break; - - case B_PACKAGE_INFO_PACKAGER: - printf("\tpackager: %s\n", value.string); - break; - - case B_PACKAGE_INFO_BASE_PACKAGE: - printf("\tbase package: %s\n", value.string); - break; - - case B_PACKAGE_INFO_FLAGS: - if (value.unsignedInt == 0) - break; - printf("\tflags:\n"); - if ((value.unsignedInt & B_PACKAGE_FLAG_APPROVE_LICENSE) != 0) - printf("\t\tapprove_license\n"); - if ((value.unsignedInt & B_PACKAGE_FLAG_SYSTEM_PACKAGE) != 0) - printf("\t\tsystem_package\n"); - break; - - case B_PACKAGE_INFO_ARCHITECTURE: - printf("\tarchitecture: %s\n", - BPackageInfo::kArchitectureNames[value.unsignedInt]); - break; - - case B_PACKAGE_INFO_VERSION: - printf("\tversion: "); - _PrintPackageVersion(value.version); - printf("\n"); - break; - - case B_PACKAGE_INFO_COPYRIGHTS: - printf("\tcopyright: %s\n", value.string); - break; - - case B_PACKAGE_INFO_LICENSES: - printf("\tlicense: %s\n", value.string); - break; - - case B_PACKAGE_INFO_URLS: - printf("\tURL: %s\n", value.string); - break; - - case B_PACKAGE_INFO_SOURCE_URLS: - printf("\tsource URL: %s\n", value.string); - break; + if (value.attributeID == B_PACKAGE_INFO_NAME) + printf("package-attributes:\n"); - case B_PACKAGE_INFO_PROVIDES: - printf("\tprovides: %s", value.resolvable.name); - if (value.resolvable.haveVersion) { - printf(" = "); - _PrintPackageVersion(value.resolvable.version); - } - if (value.resolvable.haveCompatibleVersion) { - printf(" (compatible >= "); - _PrintPackageVersion(value.resolvable.compatibleVersion); - printf(")"); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_REQUIRES: - printf("\trequires: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_SUPPLEMENTS: - printf("\tsupplements: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_CONFLICTS: - printf("\tconflicts: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_FRESHENS: - printf("\tfreshens: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_REPLACES: - printf("\treplaces: %s\n", value.string); - break; - - case B_PACKAGE_INFO_GLOBAL_WRITABLE_FILES: - printf("\tglobal writable file: %s", - value.globalWritableFileInfo.path); - if (value.globalWritableFileInfo.isDirectory) - printf( " directory"); - if (value.globalWritableFileInfo.updateType - < B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT) { - printf(" %s\n", - BPackageInfo::kWritableFileUpdateTypes[ - value.globalWritableFileInfo.updateType]); - } else - printf("\n"); - break; - - case B_PACKAGE_INFO_USER_SETTINGS_FILES: - printf("\tuser settings file: %s", - value.userSettingsFileInfo.path); - if (value.globalWritableFileInfo.isDirectory) { - printf( " directory\n"); - } else if (value.userSettingsFileInfo.templatePath != NULL) { - printf(" template %s\n", - value.userSettingsFileInfo.templatePath); - } else - printf("\n"); - break; - - case B_PACKAGE_INFO_USERS: - printf("\tuser: %s\n", value.user.name); - if (value.user.realName != NULL) - printf("\t\treal name: %s\n", value.user.realName); - if (value.user.home != NULL) - printf("\t\thome: %s\n", value.user.home); - if (value.user.shell != NULL) - printf("\t\tshell: %s\n", value.user.shell); - for (size_t i = 0; i < value.user.groupCount; i++) - printf("\t\tgroup: %s\n", value.user.groups[i]); - break; - - case B_PACKAGE_INFO_GROUPS: - 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; - - default: - printf( - "*** Invalid package attribute section: unexpected " - "package attribute id %d encountered\n", value.attributeID); - return B_BAD_DATA; + if (!fPrinter.PrintAttribute(value)) { + printf("*** Invalid package attribute section: unexpected " + "package attribute id %d encountered\n", value.attributeID); + return B_BAD_DATA; } return B_OK; @@ -373,8 +206,9 @@ private: } private: - int fLevel; - bool fListAttribute; + PackageInfoPrinter fPrinter; + int fLevel; + bool fListAttribute; }; diff --git a/src/bin/package_repo/Jamfile b/src/bin/package_repo/Jamfile index fe07930..7122a15 100644 --- a/src/bin/package_repo/Jamfile +++ b/src/bin/package_repo/Jamfile @@ -2,6 +2,8 @@ SubDir HAIKU_TOP src bin package_repo ; UsePrivateHeaders kernel shared ; +UseHeaders [ FDirName $(HAIKU_TOP) src bin package ] ; + DEFINES += B_ENABLE_INCOMPLETE_POSIX_AT_SUPPORT ; # TODO: Remove when it is complete! @@ -13,4 +15,3 @@ BinCommand package_repo : package be $(TARGET_LIBSUPC++) ; - diff --git a/src/bin/package_repo/command_list.cpp b/src/bin/package_repo/command_list.cpp index 3b95f3e..48570c5 100644 --- a/src/bin/package_repo/command_list.cpp +++ b/src/bin/package_repo/command_list.cpp @@ -19,6 +19,7 @@ #include <package/RepositoryInfo.h> #include "package_repo.h" +#include "PackageInfoPrinter.h" using namespace BPackageKit::BHPKG; @@ -27,6 +28,7 @@ using namespace BPackageKit; struct RepositoryContentListHandler : BRepositoryContentHandler { RepositoryContentListHandler(bool verbose) : + fPrinter(), fLevel(0), fVerbose(verbose) { @@ -40,221 +42,18 @@ struct RepositoryContentListHandler : BRepositoryContentHandler { virtual status_t HandlePackageAttribute( const BPackageInfoAttributeValue& value) { - switch (value.attributeID) { - case B_PACKAGE_INFO_NAME: - if (fVerbose) { - printf("package-attributes:\n"); - printf("\tname: %s\n", value.string); - } else - printf("package: %s", value.string); - break; - - case B_PACKAGE_INFO_SUMMARY: - if (fVerbose) - printf("\tsummary: %s\n", value.string); - break; - - case B_PACKAGE_INFO_DESCRIPTION: - if (fVerbose) - printf("\tdescription: %s\n", value.string); - break; - - case B_PACKAGE_INFO_VENDOR: - if (fVerbose) - printf("\tvendor: %s\n", value.string); - break; - - case B_PACKAGE_INFO_PACKAGER: - if (fVerbose) - printf("\tpackager: %s\n", value.string); - break; - - case B_PACKAGE_INFO_BASE_PACKAGE: - if (fVerbose) - printf("\tbase package: %s\n", value.string); - break; - - case B_PACKAGE_INFO_FLAGS: - if (value.unsignedInt == 0 || !fVerbose) - break; - printf("\tflags:\n"); - if ((value.unsignedInt & B_PACKAGE_FLAG_APPROVE_LICENSE) != 0) - printf("\t\tapprove_license\n"); - if ((value.unsignedInt & B_PACKAGE_FLAG_SYSTEM_PACKAGE) != 0) - printf("\t\tsystem_package\n"); - break; - - case B_PACKAGE_INFO_ARCHITECTURE: - if (fVerbose) { - printf("\tarchitecture: %s\n", - BPackageInfo::kArchitectureNames[value.unsignedInt]); - } - break; - - case B_PACKAGE_INFO_VERSION: - if (!fVerbose) - printf("("); - _PrintPackageVersion(value.version); - if (!fVerbose) - printf(")\n"); - break; - - case B_PACKAGE_INFO_COPYRIGHTS: - if (fVerbose) - printf("\tcopyright: %s\n", value.string); - break; - - case B_PACKAGE_INFO_LICENSES: - if (fVerbose) - printf("\tlicense: %s\n", value.string); - break; - - case B_PACKAGE_INFO_URLS: - if (fVerbose) - printf("\tURL: %s\n", value.string); - break; - - case B_PACKAGE_INFO_SOURCE_URLS: - if (fVerbose) - printf("\tsource URL: %s\n", value.string); - break; - - case B_PACKAGE_INFO_PROVIDES: - if (!fVerbose) - break; - printf("\tprovides: %s", value.resolvable.name); - if (value.resolvable.haveVersion) { - printf(" = "); - _PrintPackageVersion(value.resolvable.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_REQUIRES: - if (!fVerbose) - break; - printf("\trequires: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_SUPPLEMENTS: - if (!fVerbose) - break; - printf("\tsupplements: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_CONFLICTS: - if (!fVerbose) - break; - printf("\tconflicts: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_FRESHENS: - if (!fVerbose) - break; - printf("\tfreshens: %s", value.resolvableExpression.name); - if (value.resolvableExpression.haveOpAndVersion) { - printf(" %s ", BPackageResolvableExpression::kOperatorNames[ - value.resolvableExpression.op]); - _PrintPackageVersion(value.resolvableExpression.version); - } - printf("\n"); - break; - - case B_PACKAGE_INFO_REPLACES: - if (!fVerbose) - break; - printf("\treplaces: %s\n", value.string); - break; - - case B_PACKAGE_INFO_CHECKSUM: - printf("\tchecksum: %s\n", value.string); - break; - - case B_PACKAGE_INFO_GLOBAL_WRITABLE_FILES: - if (!fVerbose) - break; - printf("\tglobal writable file: %s", - value.globalWritableFileInfo.path); - if (value.globalWritableFileInfo.isDirectory) - printf( " directory"); - if (value.globalWritableFileInfo.updateType - < B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT) { - printf(" %s\n", - BPackageInfo::kWritableFileUpdateTypes[ - value.globalWritableFileInfo.updateType]); - } else - printf("\n"); - break; - - case B_PACKAGE_INFO_USER_SETTINGS_FILES: - if (!fVerbose) - break; - printf("\tuser settings file: %s", - value.userSettingsFileInfo.path); - if (value.globalWritableFileInfo.isDirectory) { - printf( " directory\n"); - } else if (value.userSettingsFileInfo.templatePath != NULL) { - printf(" template %s\n", - value.userSettingsFileInfo.templatePath); - } else - printf("\n"); - break; - - case B_PACKAGE_INFO_USERS: - if (!fVerbose) - break; - printf("\tuser: %s\n", value.user.name); - if (value.user.realName != NULL) - printf("\t\treal name: %s\n", value.user.realName); - if (value.user.home != NULL) - printf("\t\thome: %s\n", value.user.home); - if (value.user.shell != NULL) - printf("\t\tshell: %s\n", value.user.shell); - for (size_t i = 0; i < value.user.groupCount; i++) - printf("\t\tgroup: %s\n", value.user.groups[i]); - break; - - case B_PACKAGE_INFO_GROUPS: - if (!fVerbose) - break; - printf("\tgroup: %s\n", value.string); - break; - - case B_PACKAGE_INFO_POST_INSTALL_SCRIPTS: - if (!fVerbose) - break; - printf("\tpost install script: %s\n", value.string); - break; - - case B_PACKAGE_INFO_INSTALL_PATH: - if (!fVerbose) - break; - printf("\tinstall path: %s\n", value.string); - break; - - default: - printf( - "*** Invalid package attribute section: unexpected " + if (value.attributeID == B_PACKAGE_INFO_NAME) { + if (fVerbose) { + printf("package-attributes:\n"); + fPrinter.PrintName(value.string); + } else + printf("package: %s", value.string); + } else { + if (fVerbose && !fPrinter.PrintAttribute(value)) { + printf("*** Invalid package attribute section: unexpected " "package attribute id %d encountered\n", value.attributeID); return B_BAD_DATA; + } } return B_OK; @@ -296,8 +95,9 @@ private: } private: - int fLevel; - bool fVerbose; + PackageInfoPrinter fPrinter; + int fLevel; + bool fVerbose; }; ############################################################################ Commit: 4e6141b823043abc3e48acb48e45e43b8fa680fe Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Sat Jul 13 14:25:15 2013 UTC package list: add option '-i' to list only the meta info ---------------------------------------------------------------------------- diff --git a/src/bin/package/command_list.cpp b/src/bin/package/command_list.cpp index fc84b07..1862316 100644 --- a/src/bin/package/command_list.cpp +++ b/src/bin/package/command_list.cpp @@ -78,18 +78,29 @@ struct VersionPolicyV2 { }; +enum ListMode { + LIST_ALL, + LIST_PATHS_ONLY, + LIST_META_INFO_ONLY +}; + + template<typename VersionPolicy> struct PackageContentListHandler : VersionPolicy::PackageContentHandler { - PackageContentListHandler(bool listAttributes) + PackageContentListHandler(bool listEntries, bool listAttributes) : fPrinter(), fLevel(0), - fListAttribute(listAttributes) + fListEntries(listEntries), + fListAttribute(listEntries && listAttributes) { } virtual status_t HandleEntry(typename VersionPolicy::PackageEntry* entry) { + if (!fListEntries) + return B_OK; + fLevel++; int indentation = (fLevel - 1) * 2; @@ -162,6 +173,9 @@ struct PackageContentListHandler : VersionPolicy::PackageContentHandler { virtual status_t HandleEntryDone( typename VersionPolicy::PackageEntry* entry) { + if (!fListEntries) + return B_OK; + fLevel--; return B_OK; } @@ -208,6 +222,7 @@ private: private: PackageInfoPrinter fPrinter; int fLevel; + bool fListEntries; bool fListAttribute; }; @@ -258,7 +273,7 @@ private: template<typename VersionPolicy> static void -do_list(const char* packageFileName, bool listAttributes, bool filePathsOnly, +do_list(const char* packageFileName, bool listAttributes, ListMode listMode, bool ignoreVersionError) { // open package @@ -272,13 +287,23 @@ do_list(const char* packageFileName, bool listAttributes, bool filePathsOnly, } // list - if (filePathsOnly) { - PackageContentListPathsHandler<VersionPolicy> handler; - error = packageReader.ParseContent(&handler); - } else { - PackageContentListHandler<VersionPolicy> handler(listAttributes); - error = packageReader.ParseContent(&handler); + switch (listMode) { + case LIST_PATHS_ONLY: + { + PackageContentListPathsHandler<VersionPolicy> handler; + error = packageReader.ParseContent(&handler); + break; + } + + case LIST_ALL: + case LIST_META_INFO_ONLY: + { + PackageContentListHandler<VersionPolicy> handler( + listMode != LIST_META_INFO_ONLY, listAttributes); + error = packageReader.ParseContent(&handler); + } } + if (error != B_OK) exit(1); @@ -289,8 +314,8 @@ do_list(const char* packageFileName, bool listAttributes, bool filePathsOnly, int command_list(int argc, const char* const* argv) { + ListMode listMode = LIST_ALL; bool listAttributes = false; - bool filePathsOnly = false; while (true) { static struct option sLongOptions[] = { @@ -299,7 +324,7 @@ command_list(int argc, const char* const* argv) }; opterr = 0; // don't print errors - int c = getopt_long(argc, (char**)argv, "+hap", sLongOptions, NULL); + int c = getopt_long(argc, (char**)argv, "+ahip", sLongOptions, NULL); if (c == -1) break; @@ -308,12 +333,16 @@ command_list(int argc, const char* const* argv) listAttributes = true; break; + case 'i': + listMode = LIST_META_INFO_ONLY; + break; + case 'h': print_usage_and_exit(false); break; case 'p': - filePathsOnly = true; + listMode = LIST_PATHS_ONLY; break; default: @@ -331,10 +360,8 @@ command_list(int argc, const char* const* argv) BHPKG::BStandardErrorOutput errorOutput; // current package file format version - do_list<VersionPolicyV2>(packageFileName, listAttributes, filePathsOnly, - true); - do_list<VersionPolicyV1>(packageFileName, listAttributes, filePathsOnly, - false); + do_list<VersionPolicyV2>(packageFileName, listAttributes, listMode, true); + do_list<VersionPolicyV1>(packageFileName, listAttributes, listMode, false); return 0; } diff --git a/src/bin/package/package.cpp b/src/bin/package/package.cpp index 240517b..180169c 100644 --- a/src/bin/package/package.cpp +++ b/src/bin/package/package.cpp @@ -80,6 +80,7 @@ static const char* kUsage = " Lists the contents of package file <package>.\n" "\n" " -a - Also list the file attributes.\n" + " -i - Only print the meta information, not the files.\n" " -p - Only print a list of file paths.\n" "\n" "Common Options:\n" ############################################################################ Commit: 4ce282c7cc1e57d73459881ecb6c913c1f25a65d Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Sat Jul 13 15:03:44 2013 UTC package list: also support package info files ---------------------------------------------------------------------------- diff --git a/src/bin/package/PackageInfoPrinter.h b/src/bin/package/PackageInfoPrinter.h index 7bc6f39..5358657 100644 --- a/src/bin/package/PackageInfoPrinter.h +++ b/src/bin/package/PackageInfoPrinter.h @@ -21,6 +21,89 @@ using BPackageKit::BHPKG::BUserSettingsFileInfoData; class PackageInfoPrinter { public: + void PrintPackageInfo(const BPackageInfo& info) + { + PrintName(info.Name()); + PrintSummary(info.Summary()); + PrintDescription(info.Description()); + PrintVendor(info.Vendor()); + PrintPackager(info.Packager()); + + if (!info.BasePackage().IsEmpty()) + PrintBasePackage(info.BasePackage()); + + PrintFlags(info.Flags()); + PrintArchitecture((uint32)info.Architecture()); + PrintVersion(info.Version()); + + int32 count = info.CopyrightList().CountStrings(); + for (int32 i = 0; i < count; i++) + PrintCopyright(info.CopyrightList().StringAt(i)); + + count = info.LicenseList().CountStrings(); + for (int32 i = 0; i < count; i++) + PrintLicense(info.LicenseList().StringAt(i)); + + count = info.URLList().CountStrings(); + for (int32 i = 0; i < count; i++) + PrintUrl(info.URLList().StringAt(i)); + + count = info.SourceURLList().CountStrings(); + for (int32 i = 0; i < count; i++) + PrintSourceUrl(info.SourceURLList().StringAt(i)); + + count = info.ProvidesList().CountItems(); + for (int32 i = 0; i < count; i++) + PrintProvides(*info.ProvidesList().ItemAt(i)); + + count = info.RequiresList().CountItems(); + for (int32 i = 0; i < count; i++) + PrintRequires(*info.RequiresList().ItemAt(i)); + + count = info.SupplementsList().CountItems(); + for (int32 i = 0; i < count; i++) + PrintSupplements(*info.SupplementsList().ItemAt(i)); + + count = info.ConflictsList().CountItems(); + for (int32 i = 0; i < count; i++) + PrintConflicts(*info.ConflictsList().ItemAt(i)); + + count = info.FreshensList().CountItems(); + for (int32 i = 0; i < count; i++) + PrintFreshens(*info.FreshensList().ItemAt(i)); + + count = info.ReplacesList().CountStrings(); + for (int32 i = 0; i < count; i++) + PrintReplaces(info.ReplacesList().StringAt(i)); + + count = info.GlobalWritableFileInfos().CountItems(); + for (int32 i = 0; i < count; i++) + PrintGlobalWritableFile(*info.GlobalWritableFileInfos().ItemAt(i)); + + count = info.UserSettingsFileInfos().CountItems(); + for (int32 i = 0; i < count; i++) + PrintUserSettingsFile(*info.UserSettingsFileInfos().ItemAt(i)); + + count = info.Users().CountItems(); + for (int32 i = 0; i < count; i++) + PrintUser(*info.Users().ItemAt(i)); + + count = info.Groups().CountStrings(); + for (int32 i = 0; i < count; i++) + PrintGroup(info.Groups().StringAt(i)); + + count = info.PostInstallScripts().CountStrings(); + for (int32 i = 0; i < count; i++) + PrintPostInstallScript(info.PostInstallScripts().StringAt(i)); + + count = info.PostInstallScripts().CountStrings(); + for (int32 i = 0; i < count; i++) + PrintPostInstallScript(info.PostInstallScripts().StringAt(i)); + + if (!info.InstallPath().IsEmpty()) + PrintInstallPath(info.InstallPath()); + } + bool PrintAttribute(const BPackageInfoAttributeValue& value) { switch (value.attributeID) { @@ -181,11 +264,9 @@ public: : "<invalid>"); } - void PrintVersion(const BPackageVersionData& version) const + void PrintVersion(const BPackageVersion& version) const { - printf("\tversion: "); - _PrintPackageVersion(version); - printf("\n"); + printf("\tversion: %s\n", version.ToString().String()); } void PrintCopyright(const char* copyright) const @@ -208,38 +289,36 @@ public: printf("\tsource URL: %s\n", sourceUrl); } - void PrintProvides(const BPackageResolvableData& provides) const + void PrintProvides(const BPackageResolvable& provides) const { - printf("\tprovides: %s", provides.name); - if (provides.haveVersion) { - printf(" = "); - _PrintPackageVersion(provides.version); - } - if (provides.haveCompatibleVersion) { - printf(" (compatible >= "); - _PrintPackageVersion(provides.compatibleVersion); - printf(")"); + printf("\tprovides: %s", provides.Name().String()); + if (provides.Version().InitCheck() == B_OK) + printf(" = %s", provides.Version().ToString().String()); + + if (provides.CompatibleVersion().InitCheck() == B_OK) { + printf(" (compatible >= %s)", + provides.CompatibleVersion().ToString().String()); } printf("\n"); } - void PrintRequires(const BPackageResolvableExpressionData& requires) const + void PrintRequires(const BPackageResolvableExpression& requires) const { _PrintResolvableExpression("requires", requires); } - void PrintSupplements(const BPackageResolvableExpressionData& supplements) + void PrintSupplements(const BPackageResolvableExpression& supplements) const { _PrintResolvableExpression("supplements", supplements); } - void PrintConflicts(const BPackageResolvableExpressionData& conflicts) const + void PrintConflicts(const BPackageResolvableExpression& conflicts) const { _PrintResolvableExpression("conflicts", conflicts); } - void PrintFreshens(const BPackageResolvableExpressionData& freshens) const + void PrintFreshens(const BPackageResolvableExpression& freshens) const { _PrintResolvableExpression("freshens", freshens); } @@ -249,40 +328,42 @@ public: printf("\treplaces: %s\n", replaces); } - void PrintGlobalWritableFile(const BGlobalWritableFileInfoData& info) const + void PrintGlobalWritableFile(const BGlobalWritableFileInfo& info) const { - printf("\tglobal writable file: %s", info.path); - if (info.isDirectory) + printf("\tglobal writable file: %s", info.Path().String()); + if (info.IsDirectory()) printf( " directory"); - if (info.updateType < B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT) { + if (info.UpdateType() < B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT) { printf(" %s\n", - BPackageInfo::kWritableFileUpdateTypes[info.updateType]); + BPackageInfo::kWritableFileUpdateTypes[info.UpdateType()]); } else printf("\n"); } - void PrintUserSettingsFile(const BUserSettingsFileInfoData& info) const + void PrintUserSettingsFile(const BUserSettingsFileInfo& info) const { - printf("\tuser settings file: %s", info.path); - if (info.isDirectory) + printf("\tuser settings file: %s", info.Path().String()); + if (info.IsDirectory()) printf( " directory\n"); - else if (info.templatePath != NULL) - printf(" template %s\n", info.templatePath); + else if (!info.TemplatePath().IsEmpty()) + printf(" template %s\n", info.TemplatePath().String()); else printf("\n"); } - void PrintUser(const BUserData& user) const + void PrintUser(const BUser& user) const { - printf("\tuser: %s\n", user.name); - if (user.realName != NULL) - printf("\t\treal name: %s\n", user.realName); - if (user.home != NULL) - printf("\t\thome: %s\n", user.home); - if (user.shell != NULL) - printf("\t\tshell: %s\n", user.shell); - for (size_t i = 0; i < user.groupCount; i++) - printf("\t\tgroup: %s\n", user.groups[i]); + printf("\tuser: %s\n", user.Name().String()); + if (!user.RealName().IsEmpty()) + printf("\t\treal name: %s\n", user.RealName().String()); + if (!user.Home().IsEmpty()) + printf("\t\thome: %s\n", user.Home().String()); + if (!user.Shell().IsEmpty()) + printf("\t\tshell: %s\n", user.Shell().String()); + + int32 groupCount = user.Groups().CountStrings(); + for (int32 i = 0; i < groupCount; i++) + printf("\t\tgroup: %s\n", user.Groups().StringAt(i).String()); } void PrintGroup(const char* group) const @@ -301,24 +382,10 @@ public: } private: - static void _PrintPackageVersion(const BPackageVersionData& version) - { - printf("%s", BPackageVersion(version).ToString().String()); - } - void _PrintResolvableExpression(const char* fieldName, - const BPackageResolvableExpressionData& expression) const + const BPackageResolvableExpression& expression) const { - printf("\t%s: %s", fieldName, expression.name); - if (expression.haveOpAndVersion) { - printf(" %s ", - expression.op < B_PACKAGE_RESOLVABLE_OP_ENUM_COUNT - ? BPackageResolvableExpression::kOperatorNames[ - expression.op] - : "<invalid operator>"); - _PrintPackageVersion(expression.version); - } - printf("\n"); + printf("\t%s: %s\n", fieldName, expression.ToString().String()); } }; diff --git a/src/bin/package/command_list.cpp b/src/bin/package/command_list.cpp index 1862316..9670fa5 100644 --- a/src/bin/package/command_list.cpp +++ b/src/bin/package/command_list.cpp @@ -12,6 +12,7 @@ #include <string.h> #include <time.h> +#include <Entry.h> #include <package/hpkg/PackageContentHandler.h> #include <package/hpkg/PackageEntry.h> #include <package/hpkg/PackageEntryAttribute.h> @@ -357,6 +358,31 @@ command_list(int argc, const char* const* argv) const char* packageFileName = argv[optind++]; + // If the file doesn't look like a package file, try to load it as a + // package info file. + if (!BString(packageFileName).EndsWith(".hpkg")) { + struct ErrorListener : BPackageInfo::ParseErrorListener { + virtual void OnError(const BString& msg, int line, int col) + { + fprintf(stderr, "%s:%d:%d: %s\n", fPath, line, col, + msg.String()); + } + + const char* fPath; + } errorListener; + errorListener.fPath = packageFileName; + + BPackageInfo info; + if (info.ReadFromConfigFile(BEntry(packageFileName), &errorListener) + != B_OK) { + return 1; + } + + printf("package-attributes:\n"); + PackageInfoPrinter().PrintPackageInfo(info); + return 0; + } + BHPKG::BStandardErrorOutput errorOutput; // current package file format version ############################################################################ Commit: 03d70b4e58f04e54ed9d76a072a0b66750f7037c Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Sat Jul 13 19:17:02 2013 UTC Add package architecture constant for x86-64 ---------------------------------------------------------------------------- diff --git a/headers/os/package/PackageArchitecture.h b/headers/os/package/PackageArchitecture.h index 2527e1b..da2739f 100644 --- a/headers/os/package/PackageArchitecture.h +++ b/headers/os/package/PackageArchitecture.h @@ -14,6 +14,7 @@ enum BPackageArchitecture { B_PACKAGE_ARCHITECTURE_X86 = 1, B_PACKAGE_ARCHITECTURE_X86_GCC2 = 2, B_PACKAGE_ARCHITECTURE_SOURCE = 3, + B_PACKAGE_ARCHITECTURE_X86_64 = 4, // B_PACKAGE_ARCHITECTURE_ENUM_COUNT, }; diff --git a/src/kits/package/PackageInfo.cpp b/src/kits/package/PackageInfo.cpp index 7de8cf2..de50705 100644 --- a/src/kits/package/PackageInfo.cpp +++ b/src/kits/package/PackageInfo.cpp @@ -65,6 +65,7 @@ BPackageInfo::kArchitectureNames[B_PACKAGE_ARCHITECTURE_ENUM_COUNT] = { "x86", "x86_gcc2", "source", + "x86_64", };