@@ -2,10 +2,12 @@ namespace Buckaroo
22
33type AdhocPackageIdentifier = { Owner : string ; Project : string }
44
5+ type GitLabPackageIdentifier = { Groups : string list ; Project : string }
6+
57type PackageIdentifier =
68| GitHub of AdhocPackageIdentifier
79| BitBucket of AdhocPackageIdentifier
8- | GitLab of AdhocPackageIdentifier
10+ | GitLab of GitLabPackageIdentifier
911| Adhoc of AdhocPackageIdentifier
1012
1113module PackageIdentifier =
@@ -17,19 +19,13 @@ module PackageIdentifier =
1719 match id with
1820 | GitHub x -> " github.com/" + x.Owner + " /" + x.Project
1921 | BitBucket x -> " bitbucket.org/" + x.Owner + " /" + x.Project
20- | GitLab x -> " gitlab.com/" + x.Owner + " /" + x.Project
22+ | GitLab x -> " gitlab.com/" + ( x.Groups |> String.concat " / " ) + " /" + x.Project
2123 | Adhoc x -> x.Owner + " /" + x.Project
2224
2325 let showRich ( id : PackageIdentifier ) =
24- let host = highlight
25- let owner = highlight
26- let project = highlight
27-
28- match id with
29- | GitHub x -> ( host " github.com" ) + ( subtle " /" ) + ( owner x.Owner) + ( subtle " /" ) + ( project x.Project)
30- | BitBucket x -> ( host " bitbucket.org" ) + ( subtle " /" ) + x.Owner + ( subtle " /" ) + ( project x.Project)
31- | GitLab x -> ( host " gitlab.com" ) + ( subtle " /" ) + x.Owner + ( subtle " /" ) + ( project x.Project)
32- | Adhoc x -> ( owner x.Owner) + ( subtle " /" ) + ( project x.Project)
26+ id
27+ |> show
28+ |> identifier
3329
3430 let private gitHubIdentifierParser =
3531 CharParsers.regex @" [a-zA-Z.\d](?:[a-zA-Z_.\d]|-(?=[a-zA-Z_.\d])){0,38}"
@@ -46,7 +42,6 @@ module PackageIdentifier =
4642 | Success( result, _, _) -> Result.Ok result
4743 | Failure( error, _, _) -> Result.Error error
4844
49-
5045 let gitHubPackageIdentifierParser = parse {
5146 do ! CharParsers.skipString " github.com/" <|> CharParsers.skipString " github+"
5247 let! owner = gitHubIdentifierParser
@@ -74,11 +69,18 @@ module PackageIdentifier =
7469 | Failure( error, _, _) -> Result.Error error
7570
7671 let gitLabPackageIdentifierParser = parse {
77- do ! CharParsers.skipString " gitlab.com/" <|> CharParsers.skipString " gitlab+ "
78- let! owner = gitHubIdentifierParser
72+ do ! CharParsers.skipString " gitlab.com/"
73+ let! x = gitHubIdentifierParser
7974 do ! CharParsers.skipString " /"
80- let! project = gitHubIdentifierParser
81- return { Owner = owner.ToLower(); Project = project.ToLower() }
75+ let! xs = Primitives.sepBy1 gitHubIdentifierParser ( skipString " /" )
76+ let parts =
77+ [ x ] @ xs
78+ |> List.map ( fun x -> x.ToLower ())
79+
80+ return {
81+ Groups = parts |> List.truncate ( parts.Length - 1 )
82+ Project = parts |> List.last
83+ }
8284 }
8385
8486 let parseGitLabIdentifier ( x : string ) =
0 commit comments