added 3 changesets to branch 'refs/remotes/HaikuPM-github/package-management' old head: 7fa369956e1b30f61679ae5552b5f018a9e76578 new head: 06b4ebe51c4eb83f00f912cf88fe13a41e5d9a6d overview: https://github.com/haiku/HaikuPM/compare/7fa3699...06b4ebe ---------------------------------------------------------------------------- b7c89d4: packagefs: Use '~' as pre-release separator "[...]" turns out to be not so good an idea after all. In the shell it would require escaping. 9d81dc7: BPackage{Info,Version}: Switch to '~' as pre-release separator Also allow '.' in the pre-release string (as in "alpha4.1") and in package and resolvable names. 06b4ebe: package-infos in tree: use '~' as pre-release separator [ Ingo Weinhold <ingo_weinhold@xxxxxx> ] ---------------------------------------------------------------------------- 8 files changed, 73 insertions(+), 78 deletions(-) .../kernel/file_systems/packagefs/Version.cpp | 2 +- src/data/package_infos/haiku | 4 +- src/data/package_infos/haiku_devel | 6 +- src/data/package_infos/haiku_userguide | 4 +- src/data/package_infos/haiku_welcome | 4 +- src/data/package_infos/makefile_engine | 4 +- src/kits/package/PackageInfo.cpp | 125 +++++++++---------- src/kits/package/PackageVersion.cpp | 2 +- ############################################################################ Commit: b7c89d42a67fa5b8d9087f0ab2948e286b335cf7 Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Thu Apr 18 15:44:28 2013 UTC packagefs: Use '~' as pre-release separator "[...]" turns out to be not so good an idea after all. In the shell it would require escaping. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/packagefs/Version.cpp b/src/add-ons/kernel/file_systems/packagefs/Version.cpp index 3ea5660..849453f 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Version.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/Version.cpp @@ -199,7 +199,7 @@ Version::ToString(char* buffer, size_t bufferSize) const if (fPreRelease != NULL) { size_t offset = std::min(bufferSize, size); - size += snprintf(buffer + offset, bufferSize - offset, "[%s]", + size += snprintf(buffer + offset, bufferSize - offset, "~%s", fPreRelease); } ############################################################################ Commit: 9d81dc7655a984ce6dd0d79878215fe4d5748da6 Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Thu Apr 18 15:48:25 2013 UTC BPackage{Info,Version}: Switch to '~' as pre-release separator Also allow '.' in the pre-release string (as in "alpha4.1") and in package and resolvable names. ---------------------------------------------------------------------------- diff --git a/src/kits/package/PackageInfo.cpp b/src/kits/package/PackageInfo.cpp index 57ac1d2..967cfc6 100644 --- a/src/kits/package/PackageInfo.cpp +++ b/src/kits/package/PackageInfo.cpp @@ -109,11 +109,17 @@ private: void _Parse(BPackageInfo* packageInfo); static bool _IsAlphaNumUnderscore(const BString& string, - int32* _errorPos = NULL); + const char* additionalChars, + int32* _errorPos); static bool _IsAlphaNumUnderscore(const char* string, - int32* _errorPos = NULL); + const char* additionalChars, + int32* _errorPos); static bool _IsAlphaNumUnderscore(const char* start, - const char* end, int32* _errorPos = NULL); + const char* end, + const char* additionalChars, + int32* _errorPos); + static bool _IsValidResolvableName(const char* string, + int32* _errorPos); private: ParseErrorListener* fListener; @@ -344,8 +350,8 @@ BPackageInfo::Parser::_NextToken() { const char* start = fPos; while (isalnum(*fPos) || *fPos == '.' || *fPos == '-' - || *fPos == '_' || *fPos == ':' || *fPos == '+' || *fPos == '[' - || *fPos == ']') { + || *fPos == '_' || *fPos == ':' || *fPos == '+' + || *fPos == '~') { fPos++; } if (fPos == start) @@ -442,26 +448,21 @@ BPackageInfo::Parser::_ParseVersionValue(Token& word, BPackageVersion* value, // get the pre-release string BString preRelease; - if (word.text.Length() > 0 && word.text[word.text.Length() - 1] == ']') { - int32 openingBracket = word.text.FindLast('['); - if (openingBracket < 0) { - throw ParseError("unmatched ']' in version string", - word.pos + word.text.Length() - 1); - } - - word.text.CopyInto(preRelease, openingBracket + 1, - word.text.Length() - openingBracket - 2); - word.text.Truncate(openingBracket); + int32 tildePos = word.text.FindLast('~'); + if (tildePos >= 0) { + word.text.CopyInto(preRelease, tildePos + 1, + word.text.Length() - tildePos - 1); + word.text.Truncate(tildePos); if (preRelease.IsEmpty()) { throw ParseError("invalid empty pre-release string", - word.pos + openingBracket + 1); + word.pos + tildePos + 1); } int32 errorPos; - if (!_IsAlphaNumUnderscore(preRelease, &errorPos)) { + if (!_IsAlphaNumUnderscore(preRelease, ".", &errorPos)) { throw ParseError("invalid character in pre-release string", - word.pos + openingBracket + 1 + errorPos); + word.pos + tildePos + 1 + errorPos); } } @@ -486,21 +487,21 @@ BPackageInfo::Parser::_ParseVersionValue(Token& word, BPackageVersion* value, word.text.CopyInto(micro, secondDotPos + 1, word.text.Length()); int32 errorPos; - if (!_IsAlphaNumUnderscore(micro, &errorPos)) { + if (!_IsAlphaNumUnderscore(micro, "", &errorPos)) { throw ParseError("invalid character in micro version string", word.pos + secondDotPos + 1 + errorPos); } } int32 errorPos; - if (!_IsAlphaNumUnderscore(minor, &errorPos)) { + if (!_IsAlphaNumUnderscore(minor, "", &errorPos)) { throw ParseError("invalid character in minor version string", word.pos + firstDotPos + 1 + errorPos); } } int32 errorPos; - if (!_IsAlphaNumUnderscore(major, &errorPos)) { + if (!_IsAlphaNumUnderscore(major, "", &errorPos)) { throw ParseError("invalid character in major version string", word.pos + errorPos); } @@ -660,24 +661,10 @@ BPackageInfo::Parser::_ParseResolvableList( } } - if (colonPos >= 0) { - int32 errorPos; - if (!_IsAlphaNumUnderscore(token.text.String(), - token.text.String() + colonPos, &errorPos)) { - throw ParseError("invalid character in resolvable name", - token.pos + errorPos); - } - if (!_IsAlphaNumUnderscore(token.text.String() + colonPos + 1, - &errorPos)) { - throw ParseError("invalid character in resolvable name", - token.pos + colonPos + 1 + errorPos); - } - } else { - int32 errorPos; - if (!_IsAlphaNumUnderscore(token.text, &errorPos)) { - throw ParseError("invalid character in resolvable name", - token.pos + errorPos); - } + int32 errorPos; + if (!_IsValidResolvableName(token.text, &errorPos)) { + throw ParseError("invalid character in resolvable name", + token.pos + errorPos); } // parse version @@ -737,25 +724,10 @@ BPackageInfo::Parser::_ParseResolvableExprList( token.pos); } - int32 colonPos = token.text.FindFirst(':'); - if (colonPos >= 0) { - int32 errorPos; - if (!_IsAlphaNumUnderscore(token.text.String(), - token.text.String() + colonPos, &errorPos)) { - throw ParseError("invalid character in resolvable name", - token.pos + errorPos); - } - if (!_IsAlphaNumUnderscore(token.text.String() + colonPos + 1, - &errorPos)) { - throw ParseError("invalid character in resolvable name", - token.pos + colonPos + 1 + errorPos); - } - } else { - int32 errorPos; - if (!_IsAlphaNumUnderscore(token.text, &errorPos)) { - throw ParseError("invalid character in resolvable name", - token.pos + errorPos); - } + int32 errorPos; + if (!_IsValidResolvableName(token.text, &errorPos)) { + throw ParseError("invalid character in resolvable name", + token.pos + errorPos); } BPackageVersion version; @@ -830,7 +802,7 @@ BPackageInfo::Parser::_Parse(BPackageInfo* packageInfo) _ParseStringValue(&name, &namePos); int32 errorPos; - if (!_IsAlphaNumUnderscore(name, &errorPos)) { + if (!_IsAlphaNumUnderscore(name, ".", &errorPos)) { throw ParseError("invalid character in package name", namePos + errorPos); } @@ -933,27 +905,28 @@ BPackageInfo::Parser::_Parse(BPackageInfo* packageInfo) /*static*/ inline bool BPackageInfo::Parser::_IsAlphaNumUnderscore(const BString& string, - int32* _errorPos) + const char* additionalChars, int32* _errorPos) { return _IsAlphaNumUnderscore(string.String(), - string.String() + string.Length(), _errorPos); + string.String() + string.Length(), additionalChars, _errorPos); } /*static*/ inline bool BPackageInfo::Parser::_IsAlphaNumUnderscore(const char* string, - int32* _errorPos) + const char* additionalChars, int32* _errorPos) { - return _IsAlphaNumUnderscore(string, string + strlen(string), _errorPos); + return _IsAlphaNumUnderscore(string, string + strlen(string), + additionalChars, _errorPos); } /*static*/ bool BPackageInfo::Parser::_IsAlphaNumUnderscore(const char* start, const char* end, - int32* _errorPos) + const char* additionalChars, int32* _errorPos) { for (const char* c = start; c < end; c++) { - if (!isalnum(*c) && *c != '_') { + if (!isalnum(*c) && *c != '_' && strchr(additionalChars, *c) == NULL) { if (_errorPos != NULL) *_errorPos = c - start; return false; @@ -964,6 +937,28 @@ BPackageInfo::Parser::_IsAlphaNumUnderscore(const char* start, const char* end, } +/*static*/ bool +BPackageInfo::Parser::_IsValidResolvableName(const char* string, + int32* _errorPos) +{ + int32 errorPos; + if (const char* colon = strchr(string, ':')) { + if (_IsAlphaNumUnderscore(string, colon, ".", &errorPos)) { + if (_IsAlphaNumUnderscore(colon + 1, ".", &errorPos)) + return true; + errorPos += colon + 1 - string; + } + } else { + if (_IsAlphaNumUnderscore(string, ".", &errorPos)) + return true; + } + + if (_errorPos != NULL) + *_errorPos = errorPos; + return false; +} + + const char* BPackageInfo::kElementNames[B_PACKAGE_INFO_ENUM_COUNT] = { "name", "summary", diff --git a/src/kits/package/PackageVersion.cpp b/src/kits/package/PackageVersion.cpp index 0a0a947..157aec8 100644 --- a/src/kits/package/PackageVersion.cpp +++ b/src/kits/package/PackageVersion.cpp @@ -136,7 +136,7 @@ BPackageVersion::ToString() const } if (!fPreRelease.IsEmpty()) - string << '[' << fPreRelease << ']'; + string << '~' << fPreRelease; if (fRevision > 0) string << '-' << fRevision; ############################################################################ Commit: 06b4ebe51c4eb83f00f912cf88fe13a41e5d9a6d Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Thu Apr 18 15:50:06 2013 UTC package-infos in tree: use '~' as pre-release separator ---------------------------------------------------------------------------- diff --git a/src/data/package_infos/haiku b/src/data/package_infos/haiku index d9e60fd..c7fb256 100644 --- a/src/data/package_infos/haiku +++ b/src/data/package_infos/haiku @@ -1,5 +1,5 @@ name haiku -version R1[alpha3_pm]-1 +version R1~alpha3_pm-1 architecture x86_gcc2 summary "The Haiku base system" @@ -16,7 +16,7 @@ licenses { } provides { - haiku=R1[alpha3_pm]-1 compat>=R1[alpha1] + haiku=R1~alpha3_pm-1 compat>=R1~alpha1 coreutils=8.4 compat>=0.0 diffutils=2.8.1 compat>=0.0 findutils=4.2.33 compat>=0.0 diff --git a/src/data/package_infos/haiku_devel b/src/data/package_infos/haiku_devel index f9a734b..b4ff007 100644 --- a/src/data/package_infos/haiku_devel +++ b/src/data/package_infos/haiku_devel @@ -1,5 +1,5 @@ name haiku_devel -version R1[alpha3_pm]-1 +version R1~alpha3_pm-1 architecture x86_gcc2 summary "The Haiku base system development files" @@ -14,9 +14,9 @@ copyrights "2001-2011 Haiku, Inc. et al" licenses "MIT" provides { - haiku_devel=R1[alpha3_pm]-1 + haiku_devel=R1~alpha3_pm-1 } requires { - haiku == R1[alpha3_pm]-1 + haiku == R1~alpha3_pm-1 } diff --git a/src/data/package_infos/haiku_userguide b/src/data/package_infos/haiku_userguide index 2b0dd50..4d8c231 100644 --- a/src/data/package_infos/haiku_userguide +++ b/src/data/package_infos/haiku_userguide @@ -1,5 +1,5 @@ name haiku_userguide -version R1[alpha3_pm]-1 +version R1~alpha3_pm-1 architecture any summary "The Haiku user documentation" description "The Haiku user documentation." @@ -11,7 +11,7 @@ copyrights "2001-2011 Haiku, Inc. et al" licenses MIT provides { - haiku_userguide=R1[alpha3_pm]-1 + haiku_userguide=R1~alpha3_pm-1 } requires { diff --git a/src/data/package_infos/haiku_welcome b/src/data/package_infos/haiku_welcome index cdbc2a3..a076a9e 100644 --- a/src/data/package_infos/haiku_welcome +++ b/src/data/package_infos/haiku_welcome @@ -1,5 +1,5 @@ name haiku_welcome -version R1[alpha3_pm]-1 +version R1~alpha3_pm-1 architecture any summary "The Haiku welcome documentation" description "The Haiku welcome documentation for new users." @@ -11,7 +11,7 @@ copyrights "2001-2011 Haiku, Inc. et al" licenses "MIT" provides { - haiku_welcome=R1[alpha3_pm]-1 + haiku_welcome=R1~alpha3_pm-1 } requires { diff --git a/src/data/package_infos/makefile_engine b/src/data/package_infos/makefile_engine index 5f6238d..39314a0 100644 --- a/src/data/package_infos/makefile_engine +++ b/src/data/package_infos/makefile_engine @@ -1,5 +1,5 @@ name makefile_engine -version R1[alpha3_pm]-1 +version R1~alpha3_pm-1 architecture any summary "The makefile engine" description "A simple generic makefile engine and makefile template." @@ -11,7 +11,7 @@ copyrights "? Be Inc. 2001-2011 Haiku, Inc." licenses MIT provides { - makefile_engine=R1[alpha3_pm]-1 + makefile_engine=R1~alpha3_pm-1 } requires {