Packages: Local Repo Config Formats

The local storage of the various repositories' config
needs to cater for different generations of storage
formats and also needs to be able to swap out legacy
repository identifiers.

Change-Id: Ib4b3857254b7b703858eff6815e2d6c54d69da3c
Reviewed-on: https://review.haiku-os.org/c/haiku/+/1963
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
Andrew Lindesay
2020-05-22 10:04:51 +00:00
parent 582b7d1685
commit 9d8d114499
+76 -18
View File
@@ -1,5 +1,5 @@
/*
* Copyright 2011-2018, Haiku, Inc. All Rights Reserved.
* Copyright 2011-2020, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
@@ -25,16 +25,35 @@
#define STORAGE_VERSION 2
#define KEY_BASE_URL "baseurl"
#define KEY_BASE_URL_LEGACY "url"
// deprecated
#define KEY_URL "url"
#define KEY_BASE_URL_V1 "url"
#define KEY_IDENTIFIER_V1 "url"
#define KEY_BASE_URL_V2 "baseurl"
#define KEY_IDENTIFIER_V2 "identifier"
#define KEY_IDENTIFIER_V2_ALT "url"
// should not be used any more in favour of 'identifier'
#define KEY_PRIORITY "priority"
#define KEY_CONFIG_VERSION "cfgversion"
namespace BPackageKit {
// these are mappings of known legacy identifier URLs that are possibly
// still present in some installations. These are in pairs; the first
// being the legacy URL and the next being the replacement. This can
// be phased out over time.
static const char* kLegacyUrlMappings[] = {
"https://eu.hpkg.haiku-os.org/haikuports/master/x86_gcc2/current",
"https://hpkg.haiku-os.org/haikuports/master/x86_gcc2/current",
"https://eu.hpkg.haiku-os.org/haikuports/master/x86_64/current",
"https://hpkg.haiku-os.org/haikuports/master/x86_64/current",
NULL,
NULL
};
BRepositoryConfig::BRepositoryConfig()
:
fInitStatus(B_NO_INIT),
@@ -78,18 +97,27 @@ BRepositoryConfig::Store(const BEntry& entry) const
BString configString;
configString << KEY_CONFIG_VERSION << "=" << STORAGE_VERSION << "\n";
configString << "\n";
configString << "# This is the URL where the repository data can be "
configString << "# the url where the repository data can be "
"accessed.\n";
configString << KEY_BASE_URL << "=" << fBaseURL << "\n";
configString << KEY_BASE_URL_V2 << "=" << fBaseURL << "\n";
configString << "\n";
configString << "# This URL is an identifier for the repository that is "
"consistent across mirrors\n";
configString << "# an identifier for the repository that is "
"consistent across mirrors\n";
if (fIdentifier.IsEmpty())
configString << "# " << KEY_URL << "=???\n";
configString << "# " << KEY_IDENTIFIER_V2 << "=???\n";
else
configString << KEY_URL << "=" << fIdentifier << "\n";
configString << KEY_IDENTIFIER_V2 << "=" << fIdentifier << "\n";
configString << "\n";
configString << "# a deprecated copy of the ["
<< KEY_IDENTIFIER_V2 << "] key above for older os versions\n";
if (fIdentifier.IsEmpty())
configString << "# " << KEY_IDENTIFIER_V2_ALT << "=???\n";
else
configString << KEY_IDENTIFIER_V2_ALT << "=" << fIdentifier << "\n";
configString << "\n";
configString << KEY_PRIORITY << "=" << fPriority << "\n";
int32 size = configString.Length();
@@ -107,6 +135,17 @@ BRepositoryConfig::InitCheck() const
}
static const char*
repository_config_swap_legacy_identifier_v1(const char* identifier)
{
for (int32 i = 0; kLegacyUrlMappings[i] != NULL; i += 2) {
if (strcmp(identifier, kLegacyUrlMappings[i]) == 0)
return kLegacyUrlMappings[i + 1];
}
return identifier;
}
status_t
BRepositoryConfig::SetTo(const BEntry& entry)
{
@@ -123,26 +162,45 @@ BRepositoryConfig::SetTo(const BEntry& entry)
if (result != B_OK)
return result;
const char* identifier = NULL;
const char* version = driverSettings.GetParameterValue(KEY_CONFIG_VERSION);
const char *baseUrlKey = KEY_BASE_URL;
int versionNumber = version == NULL ? 1 : atoi(version);
const char *baseUrlKey;
const char *identifierKeys[3] = { NULL, NULL, NULL };
if (version == NULL || atoi(version) < 2)
baseUrlKey = KEY_BASE_URL_LEGACY;
else
identifier = driverSettings.GetParameterValue(KEY_URL);
switch (versionNumber) {
case 1:
baseUrlKey = KEY_BASE_URL_V1;
identifierKeys[0] = KEY_IDENTIFIER_V1;
break;
case 2:
baseUrlKey = KEY_BASE_URL_V2;
identifierKeys[0] = KEY_IDENTIFIER_V2;
identifierKeys[1] = KEY_IDENTIFIER_V2_ALT;
break;
default:
return B_BAD_DATA;
}
const char* baseUrl = driverSettings.GetParameterValue(baseUrlKey);
const char* priorityString = driverSettings.GetParameterValue(KEY_PRIORITY);
const char* identifier = NULL;
for (int32 i = 0; identifier == NULL && identifierKeys[i] != NULL; i++)
identifier = driverSettings.GetParameterValue(identifierKeys[i]);
if (baseUrl == NULL || *baseUrl == '\0')
return B_BAD_DATA;
if (identifier == NULL || *identifier == '\0')
return B_BAD_DATA;
if (versionNumber == 1)
identifier = repository_config_swap_legacy_identifier_v1(identifier);
fName = entry.Name();
fBaseURL = baseUrl;
fPriority = priorityString == NULL
? kUnsetPriority : atoi(priorityString);
fIdentifier = identifier == NULL ? "" : identifier;
fIdentifier = identifier;
BPath userSettingsPath;
if (find_directory(B_USER_SETTINGS_DIRECTORY, &userSettingsPath) == B_OK) {