diff --git a/src/kits/package/RepositoryConfig.cpp b/src/kits/package/RepositoryConfig.cpp index b4d61d80a1..78ba6c452d 100644 --- a/src/kits/package/RepositoryConfig.cpp +++ b/src/kits/package/RepositoryConfig.cpp @@ -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) {