Requests to pms

Changed it from using github to using pms
This commit is contained in:
RudideC
2024-05-20 19:36:27 +02:00
parent 2f0d129aea
commit d4f61d1a58
3 changed files with 133 additions and 27 deletions
+99 -13
View File
@@ -1,6 +1,7 @@
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
@@ -9,6 +10,12 @@ import (
"path/filepath"
)
type RepoResponse struct {
Message string `json:"message"`
Name string `json:"name"`
Repo string `json:"repo"`
}
type PackageVersion struct {
Author string `json:"author"`
Description string `json:"description"`
@@ -20,27 +27,26 @@ type PackageIndex struct {
}
func installPackage(packageName, packageVersion string) {
url := fmt.Sprintf("https://raw.githubusercontent.com/wyst-lang/index/master/%s/index.json", packageName)
resp, err := http.Get(url)
repoURL, err := getRepoURL(packageName)
if err != nil {
fmt.Printf("Error fetching package info: %v\n", err)
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
fmt.Printf("Error: %s\n", resp.Status)
fmt.Printf("Error getting repo URL: %v\n", err)
return
}
var pkgIndex PackageIndex
if err := json.NewDecoder(resp.Body).Decode(&pkgIndex); err != nil {
fmt.Printf("Error decoding package info: %v\n", err)
indexURL, err := findIndexURL(repoURL)
if err != nil {
fmt.Printf("Error finding index URL: %v\n", err)
return
}
pkgIndex, err := fetchPackageIndex(indexURL)
if err != nil {
fmt.Printf("Error fetching package index: %v\n", err)
return
}
if packageVersion == "" {
packageVersion = getLatestVersion(pkgIndex)
packageVersion = getLatestVersion(*pkgIndex)
}
pkgVersion, exists := pkgIndex.Versions[packageVersion]
@@ -52,6 +58,85 @@ func installPackage(packageName, packageVersion string) {
downloadAndSavePackage(pkgVersion.URL, packageName, packageVersion)
}
func getRepoURL(packageName string) (string, error) {
url := "http://localhost:3000"
requestBody, err := json.Marshal(map[string]string{
"name": packageName,
})
if err != nil {
return "", err
}
req, err := http.NewRequest("GET", url, bytes.NewBuffer(requestBody))
if err != nil {
return "", err
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("unexpected status code: %d %s", resp.StatusCode, http.StatusText(resp.StatusCode))
}
var repoResponse RepoResponse
if err := json.NewDecoder(resp.Body).Decode(&repoResponse); err != nil {
return "", err
}
if repoResponse.Message != "ok" {
return "", fmt.Errorf("unexpected message: %s", repoResponse.Message)
}
return repoResponse.Repo, nil
}
func findIndexURL(repoURL string) (string, error) {
possibleURLs := []string{
repoURL,
repoURL + "/index.json",
repoURL + "/versions.json",
}
for _, url := range possibleURLs {
resp, err := http.Get(url)
if err != nil {
continue
}
if resp.StatusCode == http.StatusOK {
resp.Body.Close()
return url, nil
}
resp.Body.Close()
}
return "", fmt.Errorf("no valid index URL found at %s", repoURL)
}
func fetchPackageIndex(url string) (*PackageIndex, error) {
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("error fetching package index: %s", resp.Status)
}
var pkgIndex PackageIndex
if err := json.NewDecoder(resp.Body).Decode(&pkgIndex); err != nil {
return nil, err
}
return &pkgIndex, nil
}
func getLatestVersion(pkgIndex PackageIndex) string {
var latest string
for version := range pkgIndex.Versions {
@@ -81,6 +166,7 @@ func downloadAndSavePackage(url, packageName, packageVersion string) {
return
}
// Infer filename from URL
filename := filepath.Base(url)
packageFile := filepath.Join(libDir, filename)
out, err := os.Create(packageFile)