package[_repo] list: reduce code duplication

Introduce helper class PackageInfoPrinter that does the printing and is
used by both commands.
This commit is contained in:
Ingo Weinhold
2013-07-13 16:26:48 +02:00
parent 916e7e75a3
commit ed156ea6c8
4 changed files with 354 additions and 393 deletions
+326
View File
@@ -0,0 +1,326 @@
/*
* Copyright 2009-2013, Ingo Weinhold, [email protected].
* 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
+11 -177
View File
@@ -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;
if (value.attributeID == B_PACKAGE_INFO_NAME)
printf("package-attributes:\n");
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;
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;
};
+2 -1
View File
@@ -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++)
;
+15 -215
View File
@@ -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;
};