Add "base package" package attribute
This commit is contained in:
@@ -64,6 +64,7 @@ public:
|
|||||||
const BString& Description() const;
|
const BString& Description() const;
|
||||||
const BString& Vendor() const;
|
const BString& Vendor() const;
|
||||||
const BString& Packager() const;
|
const BString& Packager() const;
|
||||||
|
const BString& BasePackage() const;
|
||||||
const BString& Checksum() const;
|
const BString& Checksum() const;
|
||||||
const BString& InstallPath() const;
|
const BString& InstallPath() const;
|
||||||
|
|
||||||
@@ -96,6 +97,7 @@ public:
|
|||||||
void SetDescription(const BString& description);
|
void SetDescription(const BString& description);
|
||||||
void SetVendor(const BString& vendor);
|
void SetVendor(const BString& vendor);
|
||||||
void SetPackager(const BString& packager);
|
void SetPackager(const BString& packager);
|
||||||
|
void SetBasePackage(const BString& basePackage);
|
||||||
void SetChecksum(const BString& checksum);
|
void SetChecksum(const BString& checksum);
|
||||||
void SetInstallPath(const BString& installPath);
|
void SetInstallPath(const BString& installPath);
|
||||||
|
|
||||||
@@ -205,6 +207,7 @@ private:
|
|||||||
BString fDescription;
|
BString fDescription;
|
||||||
BString fVendor;
|
BString fVendor;
|
||||||
BString fPackager;
|
BString fPackager;
|
||||||
|
BString fBasePackage;
|
||||||
|
|
||||||
uint32 fFlags;
|
uint32 fFlags;
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ enum BPackageInfoAttributeID {
|
|||||||
B_PACKAGE_INFO_CHECKSUM, // sha256-checksum
|
B_PACKAGE_INFO_CHECKSUM, // sha256-checksum
|
||||||
B_PACKAGE_INFO_INSTALL_PATH, // package install path; only for package
|
B_PACKAGE_INFO_INSTALL_PATH, // package install path; only for package
|
||||||
// building
|
// building
|
||||||
|
B_PACKAGE_INFO_BASE_PACKAGE, // name of the base package for this package
|
||||||
//
|
//
|
||||||
B_PACKAGE_INFO_ENUM_COUNT,
|
B_PACKAGE_INFO_ENUM_COUNT,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -128,6 +128,7 @@ enum BHPKGAttributeID {
|
|||||||
B_HPKG_ATTRIBUTE_ID_PACKAGE_URL = 41,
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_URL = 41,
|
||||||
B_HPKG_ATTRIBUTE_ID_PACKAGE_SOURCE_URL = 42,
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_SOURCE_URL = 42,
|
||||||
B_HPKG_ATTRIBUTE_ID_PACKAGE_INSTALL_PATH = 43,
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_INSTALL_PATH = 43,
|
||||||
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_BASE_PACKAGE = 44,
|
||||||
//
|
//
|
||||||
B_HPKG_ATTRIBUTE_ID_ENUM_COUNT,
|
B_HPKG_ATTRIBUTE_ID_ENUM_COUNT,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -159,6 +159,10 @@ struct PackageContentListHandler : VersionPolicy::PackageContentHandler {
|
|||||||
printf("\tpackager: %s\n", value.string);
|
printf("\tpackager: %s\n", value.string);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case B_PACKAGE_INFO_BASE_PACKAGE:
|
||||||
|
printf("\tbase package: %s\n", value.string);
|
||||||
|
break;
|
||||||
|
|
||||||
case B_PACKAGE_INFO_FLAGS:
|
case B_PACKAGE_INFO_FLAGS:
|
||||||
if (value.unsignedInt == 0)
|
if (value.unsignedInt == 0)
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -106,7 +106,8 @@ private:
|
|||||||
BObjectList<BPackageResolvable>* value);
|
BObjectList<BPackageResolvable>* value);
|
||||||
void _ParseResolvableExprList(
|
void _ParseResolvableExprList(
|
||||||
BObjectList<BPackageResolvableExpression>*
|
BObjectList<BPackageResolvableExpression>*
|
||||||
value);
|
value,
|
||||||
|
BString* _basePackage = NULL);
|
||||||
|
|
||||||
void _Parse(BPackageInfo* packageInfo);
|
void _Parse(BPackageInfo* packageInfo);
|
||||||
|
|
||||||
@@ -681,17 +682,20 @@ BPackageInfo::Parser::_ParseResolvableList(
|
|||||||
|
|
||||||
void
|
void
|
||||||
BPackageInfo::Parser::_ParseResolvableExprList(
|
BPackageInfo::Parser::_ParseResolvableExprList(
|
||||||
BObjectList<BPackageResolvableExpression>* value)
|
BObjectList<BPackageResolvableExpression>* value, BString* _basePackage)
|
||||||
{
|
{
|
||||||
struct ResolvableExpressionParser : public ListElementParser {
|
struct ResolvableExpressionParser : public ListElementParser {
|
||||||
Parser& parser;
|
Parser& parser;
|
||||||
BObjectList<BPackageResolvableExpression>* value;
|
BObjectList<BPackageResolvableExpression>* value;
|
||||||
|
BString* basePackage;
|
||||||
|
|
||||||
ResolvableExpressionParser(Parser& parser_,
|
ResolvableExpressionParser(Parser& parser,
|
||||||
BObjectList<BPackageResolvableExpression>* value_)
|
BObjectList<BPackageResolvableExpression>* value,
|
||||||
|
BString* basePackage)
|
||||||
:
|
:
|
||||||
parser(parser_),
|
parser(parser),
|
||||||
value(value_)
|
value(value),
|
||||||
|
basePackage(basePackage)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -709,17 +713,31 @@ BPackageInfo::Parser::_ParseResolvableExprList(
|
|||||||
}
|
}
|
||||||
|
|
||||||
BPackageVersion version;
|
BPackageVersion version;
|
||||||
Token op = parser._NextToken();
|
Token op = parser._NextToken();
|
||||||
if (op.type == TOKEN_OPERATOR_LESS
|
if (op.type == TOKEN_OPERATOR_LESS
|
||||||
|| op.type == TOKEN_OPERATOR_LESS_EQUAL
|
|| op.type == TOKEN_OPERATOR_LESS_EQUAL
|
||||||
|| op.type == TOKEN_OPERATOR_EQUAL
|
|| op.type == TOKEN_OPERATOR_EQUAL
|
||||||
|| op.type == TOKEN_OPERATOR_NOT_EQUAL
|
|| op.type == TOKEN_OPERATOR_NOT_EQUAL
|
||||||
|| op.type == TOKEN_OPERATOR_GREATER_EQUAL
|
|| op.type == TOKEN_OPERATOR_GREATER_EQUAL
|
||||||
|| op.type == TOKEN_OPERATOR_GREATER) {
|
|| op.type == TOKEN_OPERATOR_GREATER) {
|
||||||
parser._ParseVersionValue(&version, true);
|
parser._ParseVersionValue(&version, true);
|
||||||
|
|
||||||
|
if (basePackage != NULL) {
|
||||||
|
Token base = parser._NextToken();
|
||||||
|
if (base.type == TOKEN_WORD && base.text == "base") {
|
||||||
|
if (!basePackage->IsEmpty()) {
|
||||||
|
throw ParseError(
|
||||||
|
"multiple packages marked as base package",
|
||||||
|
token.pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
*basePackage = token.text;
|
||||||
|
} else
|
||||||
|
parser._RewindTo(base);
|
||||||
|
}
|
||||||
} else if (op.type == TOKEN_ITEM_SEPARATOR
|
} else if (op.type == TOKEN_ITEM_SEPARATOR
|
||||||
|| op.type == TOKEN_CLOSE_BRACE) {
|
|| op.type == TOKEN_CLOSE_BRACE) {
|
||||||
parser._RewindTo(op);
|
parser._RewindTo(op);
|
||||||
} else {
|
} else {
|
||||||
throw ParseError(
|
throw ParseError(
|
||||||
"expected '<', '<=', '==', '!=', '>=', '>', comma or '}'",
|
"expected '<', '<=', '==', '!=', '>=', '>', comma or '}'",
|
||||||
@@ -730,9 +748,9 @@ BPackageInfo::Parser::_ParseResolvableExprList(
|
|||||||
= (BPackageResolvableOperator)(op.type - TOKEN_OPERATOR_LESS);
|
= (BPackageResolvableOperator)(op.type - TOKEN_OPERATOR_LESS);
|
||||||
|
|
||||||
value->AddItem(new BPackageResolvableExpression(token.text,
|
value->AddItem(new BPackageResolvableExpression(token.text,
|
||||||
resolvableOperator, version));
|
resolvableOperator, version));
|
||||||
}
|
}
|
||||||
} resolvableExpressionParser(*this, value);
|
} resolvableExpressionParser(*this, value, _basePackage);
|
||||||
|
|
||||||
_ParseList(resolvableExpressionParser, false);
|
_ParseList(resolvableExpressionParser, false);
|
||||||
}
|
}
|
||||||
@@ -811,6 +829,10 @@ BPackageInfo::Parser::_Parse(BPackageInfo* packageInfo)
|
|||||||
_ParseStringValue(&packageInfo->fPackager);
|
_ParseStringValue(&packageInfo->fPackager);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case B_PACKAGE_INFO_BASE_PACKAGE:
|
||||||
|
_ParseStringValue(&packageInfo->fBasePackage);
|
||||||
|
break;
|
||||||
|
|
||||||
case B_PACKAGE_INFO_ARCHITECTURE:
|
case B_PACKAGE_INFO_ARCHITECTURE:
|
||||||
_ParseArchitectureValue(&packageInfo->fArchitecture);
|
_ParseArchitectureValue(&packageInfo->fArchitecture);
|
||||||
break;
|
break;
|
||||||
@@ -840,7 +862,9 @@ BPackageInfo::Parser::_Parse(BPackageInfo* packageInfo)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case B_PACKAGE_INFO_REQUIRES:
|
case B_PACKAGE_INFO_REQUIRES:
|
||||||
_ParseResolvableExprList(&packageInfo->fRequiresList);
|
packageInfo->fBasePackage.Truncate(0);
|
||||||
|
_ParseResolvableExprList(&packageInfo->fRequiresList,
|
||||||
|
&packageInfo->fBasePackage);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case B_PACKAGE_INFO_SUPPLEMENTS:
|
case B_PACKAGE_INFO_SUPPLEMENTS:
|
||||||
@@ -981,7 +1005,8 @@ struct BPackageInfo::StringBuilder {
|
|||||||
StringBuilder()
|
StringBuilder()
|
||||||
:
|
:
|
||||||
fData(),
|
fData(),
|
||||||
fError(B_OK)
|
fError(B_OK),
|
||||||
|
fBasePackage()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1034,6 +1059,18 @@ struct BPackageInfo::StringBuilder {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StringBuilder& BeginRequires(const BString& basePackage)
|
||||||
|
{
|
||||||
|
fBasePackage = basePackage;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder& EndRequires()
|
||||||
|
{
|
||||||
|
fBasePackage.Truncate(0);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _WriteValue(const char* value)
|
void _WriteValue(const char* value)
|
||||||
{
|
{
|
||||||
@@ -1075,9 +1112,17 @@ private:
|
|||||||
template<typename Value>
|
template<typename Value>
|
||||||
void _WriteValue(const BObjectList<Value>& value)
|
void _WriteValue(const BObjectList<Value>& value)
|
||||||
{
|
{
|
||||||
|
// Note: The fBasePackage solution is disgusting, but any attempt of
|
||||||
|
// encapsulating the stringification via templates seems to result in
|
||||||
|
// an Internal Compiler Error with gcc 2.
|
||||||
|
|
||||||
int32 count = value.CountItems();
|
int32 count = value.CountItems();
|
||||||
if (count == 1) {
|
if (count == 1) {
|
||||||
_Write(value.ItemAt(0)->ToString());
|
_Write(value.ItemAt(0)->ToString());
|
||||||
|
if (!fBasePackage.IsEmpty()
|
||||||
|
&& value.ItemAt(0)->Name() == fBasePackage) {
|
||||||
|
_Write(" base");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
_Write("{\n", 2);
|
_Write("{\n", 2);
|
||||||
|
|
||||||
@@ -1085,6 +1130,10 @@ private:
|
|||||||
for (int32 i = 0; i < count; i++) {
|
for (int32 i = 0; i < count; i++) {
|
||||||
_Write('\t');
|
_Write('\t');
|
||||||
_Write(value.ItemAt(i)->ToString());
|
_Write(value.ItemAt(i)->ToString());
|
||||||
|
if (!fBasePackage.IsEmpty()
|
||||||
|
&& value.ItemAt(i)->Name() == fBasePackage) {
|
||||||
|
_Write(" base");
|
||||||
|
}
|
||||||
_Write('\n');
|
_Write('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1196,6 +1245,7 @@ private:
|
|||||||
private:
|
private:
|
||||||
BMallocIO fData;
|
BMallocIO fData;
|
||||||
status_t fError;
|
status_t fError;
|
||||||
|
BString fBasePackage;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -1324,6 +1374,7 @@ BPackageInfo::BPackageInfo(BMessage* archive, status_t* _error)
|
|||||||
&& (error = archive->FindString("description", &fDescription)) == B_OK
|
&& (error = archive->FindString("description", &fDescription)) == B_OK
|
||||||
&& (error = archive->FindString("vendor", &fVendor)) == B_OK
|
&& (error = archive->FindString("vendor", &fVendor)) == B_OK
|
||||||
&& (error = archive->FindString("packager", &fPackager)) == B_OK
|
&& (error = archive->FindString("packager", &fPackager)) == B_OK
|
||||||
|
&& (error = archive->FindString("basePackage", &fBasePackage)) == B_OK
|
||||||
&& (error = archive->FindUInt32("flags", &fFlags)) == B_OK
|
&& (error = archive->FindUInt32("flags", &fFlags)) == B_OK
|
||||||
&& (error = archive->FindInt32("architecture", &architecture)) == B_OK
|
&& (error = archive->FindInt32("architecture", &architecture)) == B_OK
|
||||||
&& (error = _ExtractVersion(archive, "version", 0, fVersion)) == B_OK
|
&& (error = _ExtractVersion(archive, "version", 0, fVersion)) == B_OK
|
||||||
@@ -1483,6 +1534,13 @@ BPackageInfo::Packager() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const BString&
|
||||||
|
BPackageInfo::BasePackage() const
|
||||||
|
{
|
||||||
|
return fBasePackage;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const BString&
|
const BString&
|
||||||
BPackageInfo::Checksum() const
|
BPackageInfo::Checksum() const
|
||||||
{
|
{
|
||||||
@@ -1635,6 +1693,13 @@ BPackageInfo::SetPackager(const BString& packager)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
BPackageInfo::SetBasePackage(const BString& basePackage)
|
||||||
|
{
|
||||||
|
fBasePackage = basePackage;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
BPackageInfo::SetChecksum(const BString& checksum)
|
BPackageInfo::SetChecksum(const BString& checksum)
|
||||||
{
|
{
|
||||||
@@ -1843,6 +1908,7 @@ BPackageInfo::Clear()
|
|||||||
fDescription.Truncate(0);
|
fDescription.Truncate(0);
|
||||||
fVendor.Truncate(0);
|
fVendor.Truncate(0);
|
||||||
fPackager.Truncate(0);
|
fPackager.Truncate(0);
|
||||||
|
fBasePackage.Truncate(0);
|
||||||
fChecksum.Truncate(0);
|
fChecksum.Truncate(0);
|
||||||
fInstallPath.Truncate(0);
|
fInstallPath.Truncate(0);
|
||||||
fFlags = 0;
|
fFlags = 0;
|
||||||
@@ -1873,6 +1939,7 @@ BPackageInfo::Archive(BMessage* archive, bool deep) const
|
|||||||
|| (error = archive->AddString("description", fDescription)) != B_OK
|
|| (error = archive->AddString("description", fDescription)) != B_OK
|
||||||
|| (error = archive->AddString("vendor", fVendor)) != B_OK
|
|| (error = archive->AddString("vendor", fVendor)) != B_OK
|
||||||
|| (error = archive->AddString("packager", fPackager)) != B_OK
|
|| (error = archive->AddString("packager", fPackager)) != B_OK
|
||||||
|
|| (error = archive->AddString("basePackage", fBasePackage)) != B_OK
|
||||||
|| (error = archive->AddUInt32("flags", fFlags)) != B_OK
|
|| (error = archive->AddUInt32("flags", fFlags)) != B_OK
|
||||||
|| (error = archive->AddInt32("architecture", fArchitecture)) != B_OK
|
|| (error = archive->AddInt32("architecture", fArchitecture)) != B_OK
|
||||||
|| (error = _AddVersion(archive, "version", fVersion)) != B_OK
|
|| (error = _AddVersion(archive, "version", fVersion)) != B_OK
|
||||||
@@ -1926,7 +1993,9 @@ BPackageInfo::GetConfigString(BString& _string) const
|
|||||||
.Write("urls", fURLList)
|
.Write("urls", fURLList)
|
||||||
.Write("source-urls", fSourceURLList)
|
.Write("source-urls", fSourceURLList)
|
||||||
.Write("provides", fProvidesList)
|
.Write("provides", fProvidesList)
|
||||||
.Write("requires", fRequiresList)
|
.BeginRequires(fBasePackage)
|
||||||
|
.Write("requires", fRequiresList)
|
||||||
|
.EndRequires()
|
||||||
.Write("supplements", fSupplementsList)
|
.Write("supplements", fSupplementsList)
|
||||||
.Write("conflicts", fConflictsList)
|
.Write("conflicts", fConflictsList)
|
||||||
.Write("freshens", fFreshensList)
|
.Write("freshens", fFreshensList)
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ static const char* kAttributeNames[B_HPKG_ATTRIBUTE_ID_ENUM_COUNT + 1] = {
|
|||||||
"package:url",
|
"package:url",
|
||||||
"package:source-url",
|
"package:source-url",
|
||||||
"package:install-path",
|
"package:install-path",
|
||||||
|
"package:base-package",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -335,6 +335,10 @@ ReaderImplBase::PackageAttributeHandler::HandleAttribute(
|
|||||||
fPackageInfoValue.SetTo(B_PACKAGE_INFO_PACKAGER, value.string);
|
fPackageInfoValue.SetTo(B_PACKAGE_INFO_PACKAGER, value.string);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case B_HPKG_ATTRIBUTE_ID_PACKAGE_BASE_PACKAGE:
|
||||||
|
fPackageInfoValue.SetTo(B_PACKAGE_INFO_BASE_PACKAGE, value.string);
|
||||||
|
break;
|
||||||
|
|
||||||
case B_HPKG_ATTRIBUTE_ID_PACKAGE_FLAGS:
|
case B_HPKG_ATTRIBUTE_ID_PACKAGE_FLAGS:
|
||||||
fPackageInfoValue.SetTo(B_PACKAGE_INFO_FLAGS,
|
fPackageInfoValue.SetTo(B_PACKAGE_INFO_FLAGS,
|
||||||
(uint32)value.unsignedInt);
|
(uint32)value.unsignedInt);
|
||||||
|
|||||||
@@ -399,6 +399,17 @@ WriterImplBase::RegisterPackageInfo(PackageAttributeList& attributeList,
|
|||||||
packager->string = fPackageStringCache.Get(packageInfo.Packager().String());
|
packager->string = fPackageStringCache.Get(packageInfo.Packager().String());
|
||||||
attributeList.Add(packager);
|
attributeList.Add(packager);
|
||||||
|
|
||||||
|
// base package
|
||||||
|
if (!packageInfo.BasePackage().IsEmpty()) {
|
||||||
|
PackageAttribute* basePackage = new PackageAttribute(
|
||||||
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_BASE_PACKAGE,
|
||||||
|
B_HPKG_ATTRIBUTE_TYPE_STRING,
|
||||||
|
B_HPKG_ATTRIBUTE_ENCODING_STRING_TABLE);
|
||||||
|
basePackage->string
|
||||||
|
= fPackageStringCache.Get(packageInfo.BasePackage());
|
||||||
|
attributeList.Add(basePackage);
|
||||||
|
}
|
||||||
|
|
||||||
// flags
|
// flags
|
||||||
PackageAttribute* flags = new PackageAttribute(
|
PackageAttribute* flags = new PackageAttribute(
|
||||||
B_HPKG_ATTRIBUTE_ID_PACKAGE_FLAGS, B_HPKG_ATTRIBUTE_TYPE_UINT,
|
B_HPKG_ATTRIBUTE_ID_PACKAGE_FLAGS, B_HPKG_ATTRIBUTE_TYPE_UINT,
|
||||||
|
|||||||
Reference in New Issue
Block a user