From 33b099e078ef14c9f10a993624bfd06240017cc4 Mon Sep 17 00:00:00 2001 From: Kevin Channon Date: Sun, 9 Jun 2024 19:12:55 +0100 Subject: [PATCH 1/3] Allow user-defined URI schemes, and overwriting of default URI schemes (#564) --- cmake/CPM.cmake | 288 ++++++++++++++++--- test/unit/parse_add_package_single_arg.cmake | 77 ++++- 2 files changed, 312 insertions(+), 53 deletions(-) diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index b273c3bb..34d95aa1 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -150,6 +150,48 @@ set(CPM_DRY_RUN OFF CACHE INTERNAL "Don't download or configure dependencies (for testing)" ) +set(CPM_URI_SCHEMES + "gh!GITHUB_REPOSITORY!GIT_REPOSITORY!https://github.com!.git" + "gl!GITLAB_REPOSITORY!GIT_REPOSITORY!https://gitlab.com!.git" + "bb!BITBUCKET_REPOSITORY!GIT_REPOSITORY!https://bitbucket.org!.git" + CACHE INTERNAL "" +) + +function( + cpm_uri_scheme_from_string + schemeStr + alias + longName + uriType + uriRoot + uriSuffix +) + if("${schemeStr}" MATCHES + "^([a-zA-Z][a-zA-Z0-9]*)!([a-zA-Z_][a-zA-Z0-9_]*)!([a-zA-Z_][a-zA-Z0-9_]*)!(.+)!(.*)$" + ) + string(TOLOWER "${CMAKE_MATCH_1}" thisScheme) + set(${alias} + "${thisScheme}" + PARENT_SCOPE + ) + set(${longName} + "${CMAKE_MATCH_2}" + PARENT_SCOPE + ) + set(${uriType} + "${CMAKE_MATCH_3}" + PARENT_SCOPE + ) + set(${uriRoot} + "${CMAKE_MATCH_4}" + PARENT_SCOPE + ) + set(${uriSuffix} + "${CMAKE_MATCH_5}" + PARENT_SCOPE + ) + endif() +endfunction() if(DEFINED ENV{CPM_SOURCE_CACHE}) set(CPM_SOURCE_CACHE_DEFAULT $ENV{CPM_SOURCE_CACHE}) @@ -334,46 +376,152 @@ function(cpm_check_if_package_already_added CPM_ARGS_NAME CPM_ARGS_VERSION) endif() endfunction() +function(cpm_infer_packageType uri packageType) + if("${uri}" MATCHES ".git([@#$]?)") + set(${packageType} + "git" + PARENT_SCOPE + ) + else() + set(${packageType} + "archive" + PARENT_SCOPE + ) + endif() +endfunction() + +# Look through the CPM_URI_SCHEMES (default and user-defined) to find one that matches the supplied +# scheme value. If a match is found, uriRoot will be populated and foundCustomScheme set to TRUE. If +# a match is NOT found, foundCustomScheme set to FALSE. +function( + cpm_expand_via_scheme + scheme + uriFragment + applySuffix + expanded + repoType + pkgType + success +) + set(${success} + FALSE + PARENT_SCOPE + ) + + foreach(mapping ${CPM_URI_SCHEMES}) + if("${mapping}" MATCHES + "^([a-zA-Z][a-zA-Z0-9]*)!([a-zA-Z_][a-zA-Z0-9_]*)!([a-zA-Z_][a-zA-Z0-9_]*)!(.+)!(.*)$" + ) + string(TOLOWER "${CMAKE_MATCH_1}" thisScheme) + if(scheme STREQUAL ${thisScheme}) + set(longName "${CMAKE_MATCH_2}") + set(uriRoot "${CMAKE_MATCH_4}") + set(suffix "${CMAKE_MATCH_5}") + if(applySuffix) + string(REGEX REPLACE "^([^#@]+)" "\\1${suffix}" uriFragment "${uriFragment}") + endif() + + set(expandedValue "${longName};${uriRoot}/${uriFragment}") + set(${expanded} + ${expandedValue} + PARENT_SCOPE + ) + + set(${repoType} + ${CMAKE_MATCH_3} + PARENT_SCOPE + ) + cpm_infer_packagetype(${uriFragment} inferredPackageType) + set(${pkgType} + ${inferredPackageType} + PARENT_SCOPE + ) + set(${success} + "TRUE" + PARENT_SCOPE + ) + break() + endif() + endif() + endforeach() +endfunction() + +function(cpm_is_valid_scheme scheme result) + set(${success} + FALSE + PARENT_SCOPE + ) + + foreach(mapping ${CPM_URI_SCHEMES}) + if("${mapping}" MATCHES "^([a-zA-Z][a-zA-Z0-9]*)!(.+)!(.*)$") + string(TOLOWER "${CMAKE_MATCH_1}" testScheme) + if(scheme STREQUAL ${testScheme}) + set(${result} + TRUE + PARENT_SCOPE + ) + break() + endif() + endif() + endforeach() +endfunction() + +function(cpm_extract_scheme mapping scheme uriFragment success) + set(${success} + FALSE + PARENT_SCOPE + ) + + if("${mapping}" MATCHES "^([a-zA-Z][a-zA-Z0-9]*):(.+)$") + string(TOLOWER "${CMAKE_MATCH_1}" foundScheme) + cpm_is_valid_scheme(${foundScheme} isValidScheme) + if(${isValidScheme}) + set(${scheme} + ${foundScheme} + PARENT_SCOPE + ) + set(${uriFragment} + "${CMAKE_MATCH_2}" + PARENT_SCOPE + ) + set(${success} + TRUE + PARENT_SCOPE + ) + else() + + endif() + endif() +endfunction() + # Parse the argument of CPMAddPackage in case a single one was provided and convert it to a list of # arguments which can then be parsed idiomatically. For example gh:foo/bar@1.2.3 will be converted # to: GITHUB_REPOSITORY;foo/bar;VERSION;1.2.3 function(cpm_parse_add_package_single_arg arg outArgs) - # Look for a scheme - if("${arg}" MATCHES "^([a-zA-Z]+):(.+)$") - string(TOLOWER "${CMAKE_MATCH_1}" scheme) - set(uri "${CMAKE_MATCH_2}") - - # Check for CPM-specific schemes - if(scheme STREQUAL "gh") - set(out "GITHUB_REPOSITORY;${uri}") - set(packageType "git") - elseif(scheme STREQUAL "gl") - set(out "GITLAB_REPOSITORY;${uri}") - set(packageType "git") - elseif(scheme STREQUAL "bb") - set(out "BITBUCKET_REPOSITORY;${uri}") - set(packageType "git") - # A CPM-specific scheme was not found. Looks like this is a generic URL so try to determine - # type - elseif(arg MATCHES ".git/?(@|#|$)") - set(out "GIT_REPOSITORY;${arg}") - set(packageType "git") + # Look for a scheme. The uriFragment may also be returned with version and tag/hash info on the + # end of it. + cpm_extract_scheme(${arg} scheme uriFragment isScheme) + if(isScheme) + cpm_expand_via_scheme( + ${scheme} + ${uriFragment} + TRUE + outputVar + repoType + packageType + successfulExpansion + ) + if(successfulExpansion) + set(out "${outputVar}") else() - # Fall back to a URL - set(out "URL;${arg}") - set(packageType "archive") - - # We could also check for SVN since FetchContent supports it, but SVN is so rare these days. - # We just won't bother with the additional complexity it will induce in this function. SVN is - # done by multi-arg + message(FATAL_ERROR "${CPM_INDENT} Failed to expand scheme from '${arg}'") endif() else() - if(arg MATCHES ".git/?(@|#|$)") + cpm_infer_packagetype(${arg} packageType) + if("${packageType}" STREQUAL "git") set(out "GIT_REPOSITORY;${arg}") - set(packageType "git") else() - # Give up - message(FATAL_ERROR "${CPM_INDENT} Can't determine package type of '${arg}'") + set(out "URL;${arg}") endif() endif() @@ -586,9 +734,6 @@ function(CPMAddPackage) VERSION GIT_TAG DOWNLOAD_ONLY - GITHUB_REPOSITORY - GITLAB_REPOSITORY - BITBUCKET_REPOSITORY GIT_REPOSITORY SOURCE_DIR FIND_PACKAGE_ARGUMENTS @@ -600,12 +745,16 @@ function(CPMAddPackage) CUSTOM_CACHE_KEY ) + foreach(scheme ${CPM_URI_SCHEMES}) + cpm_uri_scheme_from_string(${scheme} alias longName uriType uriRoot uriSuffix) + list(APPEND oneValueArgs ${longName}) + endforeach() + set(multiValueArgs URL OPTIONS DOWNLOAD_COMMAND PATCHES) cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") # Set default values for arguments - if(NOT DEFINED CPM_ARGS_VERSION) if(DEFINED CPM_ARGS_GIT_TAG) cpm_get_version_from_git_tag("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION) @@ -618,13 +767,28 @@ function(CPMAddPackage) set(DOWNLOAD_ONLY NO) endif() - if(DEFINED CPM_ARGS_GITHUB_REPOSITORY) - set(CPM_ARGS_GIT_REPOSITORY "https://github.com/${CPM_ARGS_GITHUB_REPOSITORY}.git") - elseif(DEFINED CPM_ARGS_GITLAB_REPOSITORY) - set(CPM_ARGS_GIT_REPOSITORY "https://gitlab.com/${CPM_ARGS_GITLAB_REPOSITORY}.git") - elseif(DEFINED CPM_ARGS_BITBUCKET_REPOSITORY) - set(CPM_ARGS_GIT_REPOSITORY "https://bitbucket.org/${CPM_ARGS_BITBUCKET_REPOSITORY}.git") - endif() + foreach(schemeStr ${CPM_URI_SCHEMES}) + unset(cpmRepoType) + cpm_uri_scheme_from_string(${schemeStr} alias longName uriType uriRoot uriSuffix) + if(DEFINED CPM_ARGS_${longName}) + string(CONCAT cpmRepoType CPM_ARGS_ ${longName}) + cpm_expand_via_scheme( + ${alias} + ${${cpmRepoType}} + FALSE + completeUri + repoType + pkgType + successfulExpansion + ) + if(NOT successfulExpansion) + message(FATAL_ERROR "${CPM_INDENT} Failed to generate repository URL from '${cpmRepoType}'") + endif() + string(CONCAT uriTypeArg CPM_ARGS_ ${uriType}) + string(REPLACE ${longName} "" completeUri ${completeUri}) + set(${uriTypeArg} ${completeUri}) + endif() + endforeach() if(DEFINED CPM_ARGS_GIT_REPOSITORY) list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_REPOSITORY ${CPM_ARGS_GIT_REPOSITORY}) @@ -1223,3 +1387,43 @@ function(cpm_prettify_package_arguments OUT_VAR IS_IN_COMMENT) ) endfunction() + +function(CPMDefineUriScheme) + set(oneValueArgs ALIAS LONG_NAME URI_TYPE URI_ROOT URI_SUFFIX) + cmake_parse_arguments(CPM_SCHEME "" "${oneValueArgs}" "" ${ARGN}) + + if(NOT DEFINED CPM_SCHEME_ALIAS) + message(FATAL_ERROR "${CPM_INDENT} CPMDefineUriScheme requires ALIAS argument") + endif() + if(NOT DEFINED CPM_SCHEME_LONG_NAME) + message(FATAL_ERROR "${CPM_INDENT} CPMDefineUriScheme requires LONG_NAME argument") + endif() + if(NOT DEFINED CPM_SCHEME_URI_ROOT) + message(FATAL_ERROR "${CPM_INDENT} CPMDefineUriScheme requires URI_ROOT argument") + endif() + if(NOT DEFINED CPM_SCHEME_URI_TYPE) + message(FATAL_ERROR "${CPM_INDENT} CPMDefineUriScheme requires URI_TYPE argument") + endif() + if(NOT DEFINED CPM_SCHEME_URI_SUFFIX) + if(${CPM_SCHEME_URI_TYPE} STREQUAL "GIT_REPOSITORY") + set(CPM_SCHEME_URI_SUFFIX ".git") + else() + set(CPM_SCHEME_URI_SUFFIX "") + endif() + endif() + + set(newScheme + "${CPM_SCHEME_ALIAS}!${CPM_SCHEME_LONG_NAME}!${CPM_SCHEME_URI_TYPE}!${CPM_SCHEME_URI_ROOT}!${CPM_SCHEME_URI_SUFFIX}" + ) + + list(TRANSFORM CPM_URI_SCHEMES REPLACE "^${CPM_SCHEME_ALIAS}!" "${newScheme}") + list(FIND CPM_URI_SCHEMES "${newScheme}" index) + if(index EQUAL -1) + list(APPEND CPM_URI_SCHEMES "${newScheme}") + endif() + + set(CPM_URI_SCHEMES + ${CPM_URI_SCHEMES} + CACHE INTERNAL "" + ) +endfunction() diff --git a/test/unit/parse_add_package_single_arg.cmake b/test/unit/parse_add_package_single_arg.cmake index d774d0fc..aa46a38c 100644 --- a/test/unit/parse_add_package_single_arg.cmake +++ b/test/unit/parse_add_package_single_arg.cmake @@ -4,37 +4,42 @@ include(${CPM_PATH}/CPM.cmake) include(${CPM_PATH}/testing.cmake) cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake" args) -assert_equal("GITHUB_REPOSITORY;cpm-cmake/CPM.cmake" "${args}") +assert_equal("GITHUB_REPOSITORY;https://github.com/cpm-cmake/CPM.cmake.git" "${args}") cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake@1.2.3" args) -assert_equal("GITHUB_REPOSITORY;cpm-cmake/CPM.cmake;VERSION;1.2.3" "${args}") +assert_equal("GITHUB_REPOSITORY;https://github.com/cpm-cmake/CPM.cmake.git;VERSION;1.2.3" "${args}") cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake#master" args) -assert_equal("GITHUB_REPOSITORY;cpm-cmake/CPM.cmake;GIT_TAG;master" "${args}") +assert_equal( + "GITHUB_REPOSITORY;https://github.com/cpm-cmake/CPM.cmake.git;GIT_TAG;master" "${args}" +) cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake@0.20.3#asdf" args) -assert_equal("GITHUB_REPOSITORY;cpm-cmake/CPM.cmake;VERSION;0.20.3;GIT_TAG;asdf" "${args}") +assert_equal( + "GITHUB_REPOSITORY;https://github.com/cpm-cmake/CPM.cmake.git;VERSION;0.20.3;GIT_TAG;asdf" + "${args}" +) cpm_parse_add_package_single_arg("gh:a/b#c@d" args) -assert_equal("GITHUB_REPOSITORY;a/b;GIT_TAG;c;VERSION;d" "${args}") +assert_equal("GITHUB_REPOSITORY;https://github.com/a/b.git;GIT_TAG;c;VERSION;d" "${args}") cpm_parse_add_package_single_arg("gh:foo#c@d" args) -assert_equal("GITHUB_REPOSITORY;foo;GIT_TAG;c;VERSION;d" "${args}") +assert_equal("GITHUB_REPOSITORY;https://github.com/foo.git;GIT_TAG;c;VERSION;d" "${args}") cpm_parse_add_package_single_arg("gh:Foo@5" args) -assert_equal("GITHUB_REPOSITORY;Foo;VERSION;5" "${args}") +assert_equal("GITHUB_REPOSITORY;https://github.com/Foo.git;VERSION;5" "${args}") cpm_parse_add_package_single_arg("gl:foo/bar" args) -assert_equal("GITLAB_REPOSITORY;foo/bar" "${args}") +assert_equal("GITLAB_REPOSITORY;https://gitlab.com/foo/bar.git" "${args}") cpm_parse_add_package_single_arg("gl:foo/Bar" args) -assert_equal("GITLAB_REPOSITORY;foo/Bar" "${args}") +assert_equal("GITLAB_REPOSITORY;https://gitlab.com/foo/Bar.git" "${args}") cpm_parse_add_package_single_arg("bb:foo/bar" args) -assert_equal("BITBUCKET_REPOSITORY;foo/bar" "${args}") +assert_equal("BITBUCKET_REPOSITORY;https://bitbucket.org/foo/bar.git" "${args}") cpm_parse_add_package_single_arg("bb:foo/Bar" args) -assert_equal("BITBUCKET_REPOSITORY;foo/Bar" "${args}") +assert_equal("BITBUCKET_REPOSITORY;https://bitbucket.org/foo/Bar.git" "${args}") cpm_parse_add_package_single_arg("https://github.com/cpm-cmake/CPM.cmake.git@0.30.5" args) assert_equal("GIT_REPOSITORY;https://github.com/cpm-cmake/CPM.cmake.git;VERSION;0.30.5" "${args}") @@ -45,6 +50,56 @@ assert_equal("GIT_REPOSITORY;git@host.xz:user/pkg.git;VERSION;0.1.2" "${args}") cpm_parse_add_package_single_arg("git@host.xz:user/pkg.git@0.1.2#rc" args) assert_equal("GIT_REPOSITORY;git@host.xz:user/pkg.git;VERSION;0.1.2;GIT_TAG;rc" "${args}") +cpmdefineurischeme( + ALIAS + "ir" + LONG_NAME + "INTERNAL_REPOS" + URI_TYPE + "GIT_REPOSITORY" + URI_ROOT + "git@company.internal.gitserver" +) + +cpmdefineurischeme( + ALIAS + "ir2" + LONG_NAME + "INTERNAL_REPOS2" + URI_TYPE + "GIT_REPOSITORY" + URI_ROOT + "https://company.internal.oldGitserver" + URI_SUFFIX + ".gitz" +) + +cpmdefineurischeme( + ALIAS + "af" + LONG_NAME + "ARTIFACTORY_PKG" + URI_TYPE + "URL" + URI_ROOT + "https://my.company.artifatory/pkgs" +) + +cpm_parse_add_package_single_arg("ir:somegroup/somerepo@0.20.3#asdf" args) +assert_equal( + "INTERNAL_REPOS;git@company.internal.gitserver/somegroup/somerepo.git;VERSION;0.20.3;GIT_TAG;asdf" + "${args}" +) + +cpm_parse_add_package_single_arg("ir2:somegroup/somerepo@0.20.3#asdf" args) +assert_equal( + "INTERNAL_REPOS2;https://company.internal.oldGitserver/somegroup/somerepo.gitz;VERSION;0.20.3;GIT_TAG;asdf" + "${args}" +) + +cpm_parse_add_package_single_arg("af:somegroup/someitem.zip" args) +assert_equal("ARTIFACTORY_PKG;https://my.company.artifatory/pkgs/somegroup/someitem.zip" "${args}") + cpm_parse_add_package_single_arg( "ssh://user@host.xz:123/path/to/pkg.git#fragment@1.2.3#branch" args ) From 2cfef096ee77e97770fa90be304a4100e6b058fe Mon Sep 17 00:00:00 2001 From: Kevin Channon Date: Mon, 10 Jun 2024 08:35:56 +0100 Subject: [PATCH 2/3] Make more consistent usage of cpm_uri_scheme_from_string to simplify some logic; Make updated cpm_parse_add_package_single_arg have behaviour more consistent with the pre-user-definable-uri-schemes version (#564) --- cmake/CPM.cmake | 123 ++++++++++--------- test/unit/parse_add_package_single_arg.cmake | 28 ++--- 2 files changed, 81 insertions(+), 70 deletions(-) diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index 34d95aa1..557ee8a4 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -151,24 +151,30 @@ set(CPM_DRY_RUN CACHE INTERNAL "Don't download or configure dependencies (for testing)" ) set(CPM_URI_SCHEMES - "gh!GITHUB_REPOSITORY!GIT_REPOSITORY!https://github.com!.git" - "gl!GITLAB_REPOSITORY!GIT_REPOSITORY!https://gitlab.com!.git" - "bb!BITBUCKET_REPOSITORY!GIT_REPOSITORY!https://bitbucket.org!.git" + "gh|GITHUB_REPOSITORY|GIT_REPOSITORY|https://github.com|.git" + "gl|GITLAB_REPOSITORY|GIT_REPOSITORY|https://gitlab.com|.git" + "bb|BITBUCKET_REPOSITORY|GIT_REPOSITORY|https://bitbucket.org|.git" + CACHE INTERNAL "" +) +set(CPM_URI_SCHEME_PATTERN + "^([a-z][a-z0-9]*)\\|([A-Z_][A-Z0-9_]*)\\|(GIT_REPOSITORY|URL)\\|(.+)\\|(.*)$" CACHE INTERNAL "" ) function( cpm_uri_scheme_from_string + + # INPUTS schemeStr + + # OUTPUTS alias longName uriType uriRoot uriSuffix ) - if("${schemeStr}" MATCHES - "^([a-zA-Z][a-zA-Z0-9]*)!([a-zA-Z_][a-zA-Z0-9_]*)!([a-zA-Z_][a-zA-Z0-9_]*)!(.+)!(.*)$" - ) + if("${schemeStr}" MATCHES "${CPM_URI_SCHEME_PATTERN}") string(TOLOWER "${CMAKE_MATCH_1}" thisScheme) set(${alias} "${thisScheme}" @@ -190,6 +196,8 @@ function( "${CMAKE_MATCH_5}" PARENT_SCOPE ) + else() + message(STATUS "Not a URI scheme: ${schemeStr}") endif() endfunction() @@ -376,17 +384,31 @@ function(cpm_check_if_package_already_added CPM_ARGS_NAME CPM_ARGS_VERSION) endif() endfunction() -function(cpm_infer_packageType uri packageType) - if("${uri}" MATCHES ".git([@#$]?)") +function(cpm_infer_package_type uri uriType uriSuffix packageType) + if("${uriType}" STREQUAL "GIT_REPOSITORY") set(${packageType} - "git" - PARENT_SCOPE + "git" + PARENT_SCOPE ) else() - set(${packageType} - "archive" - PARENT_SCOPE - ) + if("${uri}" MATCHES ".git([@#$]?)") + set(${packageType} + "git" + PARENT_SCOPE + ) + else() + if("${uriSuffix}" MATCHES ".git([@#$]?)") + set(${packageType} + "git" + PARENT_SCOPE + ) + else() + set(${packageType} + "archive" + PARENT_SCOPE + ) + endif() + endif() endif() endfunction() @@ -397,7 +419,6 @@ function( cpm_expand_via_scheme scheme uriFragment - applySuffix expanded repoType pkgType @@ -409,51 +430,40 @@ function( ) foreach(mapping ${CPM_URI_SCHEMES}) - if("${mapping}" MATCHES - "^([a-zA-Z][a-zA-Z0-9]*)!([a-zA-Z_][a-zA-Z0-9_]*)!([a-zA-Z_][a-zA-Z0-9_]*)!(.+)!(.*)$" - ) - string(TOLOWER "${CMAKE_MATCH_1}" thisScheme) - if(scheme STREQUAL ${thisScheme}) - set(longName "${CMAKE_MATCH_2}") - set(uriRoot "${CMAKE_MATCH_4}") - set(suffix "${CMAKE_MATCH_5}") - if(applySuffix) - string(REGEX REPLACE "^([^#@]+)" "\\1${suffix}" uriFragment "${uriFragment}") - endif() - - set(expandedValue "${longName};${uriRoot}/${uriFragment}") - set(${expanded} - ${expandedValue} - PARENT_SCOPE - ) + cpm_uri_scheme_from_string(${mapping} alias longName uriType uriRoot uriSuffix) + if(scheme STREQUAL ${alias}) + set(expandedValue "${longName};${uriFragment}") + set(${expanded} + ${expandedValue} + PARENT_SCOPE + ) - set(${repoType} - ${CMAKE_MATCH_3} - PARENT_SCOPE - ) - cpm_infer_packagetype(${uriFragment} inferredPackageType) - set(${pkgType} - ${inferredPackageType} - PARENT_SCOPE - ) - set(${success} - "TRUE" - PARENT_SCOPE - ) - break() - endif() + set(${repoType} + ${CMAKE_MATCH_3} + PARENT_SCOPE + ) + cpm_infer_package_type("${uriFragment}" "${uriType}" "${uriSuffix}" inferredPackageType) + set(${pkgType} + ${inferredPackageType} + PARENT_SCOPE + ) + set(${success} + "TRUE" + PARENT_SCOPE + ) + break() endif() endforeach() endfunction() function(cpm_is_valid_scheme scheme result) - set(${success} + set(${result} FALSE PARENT_SCOPE ) foreach(mapping ${CPM_URI_SCHEMES}) - if("${mapping}" MATCHES "^([a-zA-Z][a-zA-Z0-9]*)!(.+)!(.*)$") + if("${mapping}" MATCHES "${CPM_URI_SCHEME_PATTERN}") string(TOLOWER "${CMAKE_MATCH_1}" testScheme) if(scheme STREQUAL ${testScheme}) set(${result} @@ -462,6 +472,8 @@ function(cpm_is_valid_scheme scheme result) ) break() endif() + else() + cpm_message(STATUS "${CPM_INDENT} ${mapping} is not a valid mapping") endif() endforeach() endfunction() @@ -505,7 +517,6 @@ function(cpm_parse_add_package_single_arg arg outArgs) cpm_expand_via_scheme( ${scheme} ${uriFragment} - TRUE outputVar repoType packageType @@ -517,7 +528,7 @@ function(cpm_parse_add_package_single_arg arg outArgs) message(FATAL_ERROR "${CPM_INDENT} Failed to expand scheme from '${arg}'") endif() else() - cpm_infer_packagetype(${arg} packageType) + cpm_infer_package_type("${arg}" "" "" packageType) if("${packageType}" STREQUAL "git") set(out "GIT_REPOSITORY;${arg}") else() @@ -746,7 +757,7 @@ function(CPMAddPackage) ) foreach(scheme ${CPM_URI_SCHEMES}) - cpm_uri_scheme_from_string(${scheme} alias longName uriType uriRoot uriSuffix) + cpm_uri_scheme_from_string(${scheme} alias longName uriType uriRoot uriSuffix isScheme) list(APPEND oneValueArgs ${longName}) endforeach() @@ -775,7 +786,6 @@ function(CPMAddPackage) cpm_expand_via_scheme( ${alias} ${${cpmRepoType}} - FALSE completeUri repoType pkgType @@ -784,9 +794,10 @@ function(CPMAddPackage) if(NOT successfulExpansion) message(FATAL_ERROR "${CPM_INDENT} Failed to generate repository URL from '${cpmRepoType}'") endif() + string(CONCAT uriTypeArg CPM_ARGS_ ${uriType}) string(REPLACE ${longName} "" completeUri ${completeUri}) - set(${uriTypeArg} ${completeUri}) + set(${uriTypeArg} ${uriRoot}/${completeUri}${uriSuffix}) endif() endforeach() @@ -1413,10 +1424,10 @@ function(CPMDefineUriScheme) endif() set(newScheme - "${CPM_SCHEME_ALIAS}!${CPM_SCHEME_LONG_NAME}!${CPM_SCHEME_URI_TYPE}!${CPM_SCHEME_URI_ROOT}!${CPM_SCHEME_URI_SUFFIX}" + "${CPM_SCHEME_ALIAS}|${CPM_SCHEME_LONG_NAME}|${CPM_SCHEME_URI_TYPE}|${CPM_SCHEME_URI_ROOT}|${CPM_SCHEME_URI_SUFFIX}" ) - list(TRANSFORM CPM_URI_SCHEMES REPLACE "^${CPM_SCHEME_ALIAS}!" "${newScheme}") + list(TRANSFORM CPM_URI_SCHEMES REPLACE "^${CPM_SCHEME_ALIAS}" "${newScheme}") list(FIND CPM_URI_SCHEMES "${newScheme}" index) if(index EQUAL -1) list(APPEND CPM_URI_SCHEMES "${newScheme}") diff --git a/test/unit/parse_add_package_single_arg.cmake b/test/unit/parse_add_package_single_arg.cmake index aa46a38c..68bbb580 100644 --- a/test/unit/parse_add_package_single_arg.cmake +++ b/test/unit/parse_add_package_single_arg.cmake @@ -4,42 +4,42 @@ include(${CPM_PATH}/CPM.cmake) include(${CPM_PATH}/testing.cmake) cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake" args) -assert_equal("GITHUB_REPOSITORY;https://github.com/cpm-cmake/CPM.cmake.git" "${args}") +assert_equal("GITHUB_REPOSITORY;cpm-cmake/CPM.cmake" "${args}") cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake@1.2.3" args) -assert_equal("GITHUB_REPOSITORY;https://github.com/cpm-cmake/CPM.cmake.git;VERSION;1.2.3" "${args}") +assert_equal("GITHUB_REPOSITORY;cpm-cmake/CPM.cmake;VERSION;1.2.3" "${args}") cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake#master" args) assert_equal( - "GITHUB_REPOSITORY;https://github.com/cpm-cmake/CPM.cmake.git;GIT_TAG;master" "${args}" + "GITHUB_REPOSITORY;cpm-cmake/CPM.cmake;GIT_TAG;master" "${args}" ) cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake@0.20.3#asdf" args) assert_equal( - "GITHUB_REPOSITORY;https://github.com/cpm-cmake/CPM.cmake.git;VERSION;0.20.3;GIT_TAG;asdf" + "GITHUB_REPOSITORY;cpm-cmake/CPM.cmake;VERSION;0.20.3;GIT_TAG;asdf" "${args}" ) cpm_parse_add_package_single_arg("gh:a/b#c@d" args) -assert_equal("GITHUB_REPOSITORY;https://github.com/a/b.git;GIT_TAG;c;VERSION;d" "${args}") +assert_equal("GITHUB_REPOSITORY;a/b;GIT_TAG;c;VERSION;d" "${args}") cpm_parse_add_package_single_arg("gh:foo#c@d" args) -assert_equal("GITHUB_REPOSITORY;https://github.com/foo.git;GIT_TAG;c;VERSION;d" "${args}") +assert_equal("GITHUB_REPOSITORY;foo;GIT_TAG;c;VERSION;d" "${args}") cpm_parse_add_package_single_arg("gh:Foo@5" args) -assert_equal("GITHUB_REPOSITORY;https://github.com/Foo.git;VERSION;5" "${args}") +assert_equal("GITHUB_REPOSITORY;Foo;VERSION;5" "${args}") cpm_parse_add_package_single_arg("gl:foo/bar" args) -assert_equal("GITLAB_REPOSITORY;https://gitlab.com/foo/bar.git" "${args}") +assert_equal("GITLAB_REPOSITORY;foo/bar" "${args}") cpm_parse_add_package_single_arg("gl:foo/Bar" args) -assert_equal("GITLAB_REPOSITORY;https://gitlab.com/foo/Bar.git" "${args}") +assert_equal("GITLAB_REPOSITORY;foo/Bar" "${args}") cpm_parse_add_package_single_arg("bb:foo/bar" args) -assert_equal("BITBUCKET_REPOSITORY;https://bitbucket.org/foo/bar.git" "${args}") +assert_equal("BITBUCKET_REPOSITORY;foo/bar" "${args}") cpm_parse_add_package_single_arg("bb:foo/Bar" args) -assert_equal("BITBUCKET_REPOSITORY;https://bitbucket.org/foo/Bar.git" "${args}") +assert_equal("BITBUCKET_REPOSITORY;foo/Bar" "${args}") cpm_parse_add_package_single_arg("https://github.com/cpm-cmake/CPM.cmake.git@0.30.5" args) assert_equal("GIT_REPOSITORY;https://github.com/cpm-cmake/CPM.cmake.git;VERSION;0.30.5" "${args}") @@ -87,18 +87,18 @@ cpmdefineurischeme( cpm_parse_add_package_single_arg("ir:somegroup/somerepo@0.20.3#asdf" args) assert_equal( - "INTERNAL_REPOS;git@company.internal.gitserver/somegroup/somerepo.git;VERSION;0.20.3;GIT_TAG;asdf" + "INTERNAL_REPOS;somegroup/somerepo;VERSION;0.20.3;GIT_TAG;asdf" "${args}" ) cpm_parse_add_package_single_arg("ir2:somegroup/somerepo@0.20.3#asdf" args) assert_equal( - "INTERNAL_REPOS2;https://company.internal.oldGitserver/somegroup/somerepo.gitz;VERSION;0.20.3;GIT_TAG;asdf" + "INTERNAL_REPOS2;somegroup/somerepo;VERSION;0.20.3;GIT_TAG;asdf" "${args}" ) cpm_parse_add_package_single_arg("af:somegroup/someitem.zip" args) -assert_equal("ARTIFACTORY_PKG;https://my.company.artifatory/pkgs/somegroup/someitem.zip" "${args}") +assert_equal("ARTIFACTORY_PKG;somegroup/someitem.zip" "${args}") cpm_parse_add_package_single_arg( "ssh://user@host.xz:123/path/to/pkg.git#fragment@1.2.3#branch" args From 4d89e91c260afd0abc220774dcca9f3306615996 Mon Sep 17 00:00:00 2001 From: Kevin Channon Date: Mon, 10 Jun 2024 08:40:11 +0100 Subject: [PATCH 3/3] Apply formatting rules (#564) --- cmake/CPM.cmake | 34 +++++++++----------- test/unit/parse_add_package_single_arg.cmake | 19 +++-------- 2 files changed, 19 insertions(+), 34 deletions(-) diff --git a/cmake/CPM.cmake b/cmake/CPM.cmake index 557ee8a4..b2eb294f 100644 --- a/cmake/CPM.cmake +++ b/cmake/CPM.cmake @@ -163,10 +163,8 @@ set(CPM_URI_SCHEME_PATTERN function( cpm_uri_scheme_from_string - # INPUTS schemeStr - # OUTPUTS alias longName @@ -387,8 +385,8 @@ endfunction() function(cpm_infer_package_type uri uriType uriSuffix packageType) if("${uriType}" STREQUAL "GIT_REPOSITORY") set(${packageType} - "git" - PARENT_SCOPE + "git" + PARENT_SCOPE ) else() if("${uri}" MATCHES ".git([@#$]?)") @@ -399,8 +397,8 @@ function(cpm_infer_package_type uri uriType uriSuffix packageType) else() if("${uriSuffix}" MATCHES ".git([@#$]?)") set(${packageType} - "git" - PARENT_SCOPE + "git" + PARENT_SCOPE ) else() set(${packageType} @@ -515,12 +513,7 @@ function(cpm_parse_add_package_single_arg arg outArgs) cpm_extract_scheme(${arg} scheme uriFragment isScheme) if(isScheme) cpm_expand_via_scheme( - ${scheme} - ${uriFragment} - outputVar - repoType - packageType - successfulExpansion + ${scheme} ${uriFragment} outputVar repoType packageType successfulExpansion ) if(successfulExpansion) set(out "${outputVar}") @@ -757,7 +750,15 @@ function(CPMAddPackage) ) foreach(scheme ${CPM_URI_SCHEMES}) - cpm_uri_scheme_from_string(${scheme} alias longName uriType uriRoot uriSuffix isScheme) + cpm_uri_scheme_from_string( + ${scheme} + alias + longName + uriType + uriRoot + uriSuffix + isScheme + ) list(APPEND oneValueArgs ${longName}) endforeach() @@ -784,12 +785,7 @@ function(CPMAddPackage) if(DEFINED CPM_ARGS_${longName}) string(CONCAT cpmRepoType CPM_ARGS_ ${longName}) cpm_expand_via_scheme( - ${alias} - ${${cpmRepoType}} - completeUri - repoType - pkgType - successfulExpansion + ${alias} ${${cpmRepoType}} completeUri repoType pkgType successfulExpansion ) if(NOT successfulExpansion) message(FATAL_ERROR "${CPM_INDENT} Failed to generate repository URL from '${cpmRepoType}'") diff --git a/test/unit/parse_add_package_single_arg.cmake b/test/unit/parse_add_package_single_arg.cmake index 68bbb580..020a4a5a 100644 --- a/test/unit/parse_add_package_single_arg.cmake +++ b/test/unit/parse_add_package_single_arg.cmake @@ -10,15 +10,10 @@ cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake@1.2.3" args) assert_equal("GITHUB_REPOSITORY;cpm-cmake/CPM.cmake;VERSION;1.2.3" "${args}") cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake#master" args) -assert_equal( - "GITHUB_REPOSITORY;cpm-cmake/CPM.cmake;GIT_TAG;master" "${args}" -) +assert_equal("GITHUB_REPOSITORY;cpm-cmake/CPM.cmake;GIT_TAG;master" "${args}") cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake@0.20.3#asdf" args) -assert_equal( - "GITHUB_REPOSITORY;cpm-cmake/CPM.cmake;VERSION;0.20.3;GIT_TAG;asdf" - "${args}" -) +assert_equal("GITHUB_REPOSITORY;cpm-cmake/CPM.cmake;VERSION;0.20.3;GIT_TAG;asdf" "${args}") cpm_parse_add_package_single_arg("gh:a/b#c@d" args) assert_equal("GITHUB_REPOSITORY;a/b;GIT_TAG;c;VERSION;d" "${args}") @@ -86,16 +81,10 @@ cpmdefineurischeme( ) cpm_parse_add_package_single_arg("ir:somegroup/somerepo@0.20.3#asdf" args) -assert_equal( - "INTERNAL_REPOS;somegroup/somerepo;VERSION;0.20.3;GIT_TAG;asdf" - "${args}" -) +assert_equal("INTERNAL_REPOS;somegroup/somerepo;VERSION;0.20.3;GIT_TAG;asdf" "${args}") cpm_parse_add_package_single_arg("ir2:somegroup/somerepo@0.20.3#asdf" args) -assert_equal( - "INTERNAL_REPOS2;somegroup/somerepo;VERSION;0.20.3;GIT_TAG;asdf" - "${args}" -) +assert_equal("INTERNAL_REPOS2;somegroup/somerepo;VERSION;0.20.3;GIT_TAG;asdf" "${args}") cpm_parse_add_package_single_arg("af:somegroup/someitem.zip" args) assert_equal("ARTIFACTORY_PKG;somegroup/someitem.zip" "${args}")