mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-10 00:08:07 +02:00
Merge pull request #10091 from bobvanderlinden/default-package-name
Fix extraction of name for defaultPackage URLs
This commit is contained in:
commit
5b0d78ec73
2 changed files with 7 additions and 8 deletions
|
@ -5,13 +5,12 @@
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
static const std::string attributeNamePattern("[a-zA-Z0-9_-]+");
|
static const std::string attributeNamePattern("[a-zA-Z0-9_-]+");
|
||||||
static const std::regex lastAttributeRegex("(?:" + attributeNamePattern + "\\.)*(?!default)(" + attributeNamePattern +")(\\^.*)?");
|
static const std::regex lastAttributeRegex("^((?:" + attributeNamePattern + "\\.)*)(" + attributeNamePattern +")(\\^.*)?$");
|
||||||
static const std::string pathSegmentPattern("[a-zA-Z0-9_-]+");
|
static const std::string pathSegmentPattern("[a-zA-Z0-9_-]+");
|
||||||
static const std::regex lastPathSegmentRegex(".*/(" + pathSegmentPattern +")");
|
static const std::regex lastPathSegmentRegex(".*/(" + pathSegmentPattern +")");
|
||||||
static const std::regex secondPathSegmentRegex("(?:" + pathSegmentPattern + ")/(" + pathSegmentPattern +")(?:/.*)?");
|
static const std::regex secondPathSegmentRegex("(?:" + pathSegmentPattern + ")/(" + pathSegmentPattern +")(?:/.*)?");
|
||||||
static const std::regex gitProviderRegex("github|gitlab|sourcehut");
|
static const std::regex gitProviderRegex("github|gitlab|sourcehut");
|
||||||
static const std::regex gitSchemeRegex("git($|\\+.*)");
|
static const std::regex gitSchemeRegex("git($|\\+.*)");
|
||||||
static const std::regex defaultOutputRegex(".*\\.default($|\\^.*)");
|
|
||||||
|
|
||||||
std::optional<std::string> getNameFromURL(const ParsedURL & url)
|
std::optional<std::string> getNameFromURL(const ParsedURL & url)
|
||||||
{
|
{
|
||||||
|
@ -22,8 +21,11 @@ std::optional<std::string> getNameFromURL(const ParsedURL & url)
|
||||||
return url.query.at("dir");
|
return url.query.at("dir");
|
||||||
|
|
||||||
/* If the fragment isn't a "default" and contains two attribute elements, use the last one */
|
/* If the fragment isn't a "default" and contains two attribute elements, use the last one */
|
||||||
if (std::regex_match(url.fragment, match, lastAttributeRegex))
|
if (std::regex_match(url.fragment, match, lastAttributeRegex)
|
||||||
return match.str(1);
|
&& match.str(1) != "defaultPackage."
|
||||||
|
&& match.str(2) != "default") {
|
||||||
|
return match.str(2);
|
||||||
|
}
|
||||||
|
|
||||||
/* If this is a github/gitlab/sourcehut flake, use the repo name */
|
/* If this is a github/gitlab/sourcehut flake, use the repo name */
|
||||||
if (std::regex_match(url.scheme, gitProviderRegex) && std::regex_match(url.path, match, secondPathSegmentRegex))
|
if (std::regex_match(url.scheme, gitProviderRegex) && std::regex_match(url.path, match, secondPathSegmentRegex))
|
||||||
|
@ -33,10 +35,6 @@ std::optional<std::string> getNameFromURL(const ParsedURL & url)
|
||||||
if (std::regex_match(url.scheme, gitSchemeRegex) && std::regex_match(url.path, match, lastPathSegmentRegex))
|
if (std::regex_match(url.scheme, gitSchemeRegex) && std::regex_match(url.path, match, lastPathSegmentRegex))
|
||||||
return match.str(1);
|
return match.str(1);
|
||||||
|
|
||||||
/* If everything failed but there is a non-default fragment, use it in full */
|
|
||||||
if (!url.fragment.empty() && !std::regex_match(url.fragment, defaultOutputRegex))
|
|
||||||
return url.fragment;
|
|
||||||
|
|
||||||
/* If there is no fragment, take the last element of the path */
|
/* If there is no fragment, take the last element of the path */
|
||||||
if (std::regex_match(url.path, match, lastPathSegmentRegex))
|
if (std::regex_match(url.path, match, lastPathSegmentRegex))
|
||||||
return match.str(1);
|
return match.str(1);
|
||||||
|
|
|
@ -14,6 +14,7 @@ namespace nix {
|
||||||
ASSERT_EQ(getNameFromURL(parseURL("path:./repos/myflake#nonStandardAttr.mylaptop")), "mylaptop");
|
ASSERT_EQ(getNameFromURL(parseURL("path:./repos/myflake#nonStandardAttr.mylaptop")), "mylaptop");
|
||||||
ASSERT_EQ(getNameFromURL(parseURL("path:./nixpkgs#packages.x86_64-linux.complex^bin,man")), "complex");
|
ASSERT_EQ(getNameFromURL(parseURL("path:./nixpkgs#packages.x86_64-linux.complex^bin,man")), "complex");
|
||||||
ASSERT_EQ(getNameFromURL(parseURL("path:./myproj#packages.x86_64-linux.default^*")), "myproj");
|
ASSERT_EQ(getNameFromURL(parseURL("path:./myproj#packages.x86_64-linux.default^*")), "myproj");
|
||||||
|
ASSERT_EQ(getNameFromURL(parseURL("path:./myproj#defaultPackage.x86_64-linux")), "myproj");
|
||||||
|
|
||||||
ASSERT_EQ(getNameFromURL(parseURL("github:NixOS/nixpkgs#packages.x86_64-linux.hello")), "hello");
|
ASSERT_EQ(getNameFromURL(parseURL("github:NixOS/nixpkgs#packages.x86_64-linux.hello")), "hello");
|
||||||
ASSERT_EQ(getNameFromURL(parseURL("github:NixOS/nixpkgs#hello")), "hello");
|
ASSERT_EQ(getNameFromURL(parseURL("github:NixOS/nixpkgs#hello")), "hello");
|
||||||
|
|
Loading…
Reference in a new issue