|
1 | 1 | package main
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "encoding/json" |
| 5 | + "fmt" |
| 6 | + "net/http" |
4 | 7 | "os"
|
5 | 8 | "path/filepath"
|
| 9 | + "sort" |
6 | 10 | "strings"
|
7 | 11 |
|
8 | 12 | _ "embed"
|
9 | 13 |
|
10 | 14 | "github.com/Bananenpro/cli"
|
11 | 15 | "github.com/code-game-project/go-utils/cggenevents"
|
12 | 16 | "github.com/code-game-project/go-utils/exec"
|
| 17 | + "github.com/code-game-project/go-utils/external" |
13 | 18 | "github.com/code-game-project/go-utils/modules"
|
| 19 | + "github.com/code-game-project/go-utils/semver" |
14 | 20 | "github.com/code-game-project/go-utils/server"
|
15 | 21 | )
|
16 | 22 |
|
@@ -67,6 +73,10 @@ func CreateNewClient(projectName string) error {
|
67 | 73 | cli.BeginLoading("Installing csharp-client...")
|
68 | 74 | installLibArgs := []string{"add", "package", "CodeGame.Client"}
|
69 | 75 | if data.LibraryVersion != "latest" {
|
| 76 | + data.LibraryVersion, err = nugetVersion("CodeGame.Client", data.LibraryVersion) |
| 77 | + if err != nil { |
| 78 | + return err |
| 79 | + } |
70 | 80 | installLibArgs = append(installLibArgs, "--version", data.LibraryVersion)
|
71 | 81 | }
|
72 | 82 | _, err = exec.Execute(true, "dotnet", installLibArgs...)
|
@@ -169,3 +179,55 @@ func toPascal(text string) string {
|
169 | 179 | text = strings.ReplaceAll(text, " ", "")
|
170 | 180 | return text
|
171 | 181 | }
|
| 182 | + |
| 183 | +func nugetVersion(pkg, version string) (string, error) { |
| 184 | + res, err := http.Get(fmt.Sprintf("https://api.nuget.org/v3/registration5-gz-semver2/%s/index.json", strings.ToLower(pkg))) |
| 185 | + if err != nil || res.StatusCode != http.StatusOK || !external.HasContentType(res.Header, "application/json") { |
| 186 | + return "", fmt.Errorf("Couldn't access version information from 'https://api.nuget.org/v3/registration5-gz-semver2/%s/index.json'.", strings.ToLower(pkg)) |
| 187 | + } |
| 188 | + defer res.Body.Close() |
| 189 | + type response struct { |
| 190 | + Items []struct { |
| 191 | + Items []struct { |
| 192 | + Entry struct { |
| 193 | + Version string `json:"version"` |
| 194 | + } `json:"catalogEntry"` |
| 195 | + } `json:"items"` |
| 196 | + } `json:"items"` |
| 197 | + } |
| 198 | + var data response |
| 199 | + err = json.NewDecoder(res.Body).Decode(&data) |
| 200 | + if err != nil { |
| 201 | + return "", fmt.Errorf("Couldn't decode nuget version data: %s", err) |
| 202 | + } |
| 203 | + |
| 204 | + versions := make([]string, 0, len(data.Items[0].Items)) |
| 205 | + |
| 206 | + for _, item := range data.Items[0].Items { |
| 207 | + if strings.HasPrefix(item.Entry.Version, version) { |
| 208 | + versions = append(versions, item.Entry.Version) |
| 209 | + } |
| 210 | + } |
| 211 | + |
| 212 | + sort.Slice(versions, func(i, j int) bool { |
| 213 | + a := versions[i] |
| 214 | + b := versions[j] |
| 215 | + |
| 216 | + a1, a2, a3, err := semver.ParseVersion(a) |
| 217 | + if err != nil { |
| 218 | + return false |
| 219 | + } |
| 220 | + b1, b2, b3, err := semver.ParseVersion(b) |
| 221 | + if err != nil { |
| 222 | + return false |
| 223 | + } |
| 224 | + |
| 225 | + return a1 > b1 || (a1 == b1 && a2 > b2) || (a1 == b1 && a2 == b2 && a3 > b3) |
| 226 | + }) |
| 227 | + |
| 228 | + if len(versions) > 0 { |
| 229 | + return versions[0], nil |
| 230 | + } |
| 231 | + |
| 232 | + return "", fmt.Errorf("Couldn't fetch the correct library package version to use.") |
| 233 | +} |
0 commit comments