From d4f61d1a58341482c3ebf989cc4b008a8d339d63 Mon Sep 17 00:00:00 2001 From: RudideC Date: Mon, 20 May 2024 19:36:27 +0200 Subject: [PATCH] Requests to pms Changed it from using github to using pms --- README.md | 23 ++++++++++ src/info.go | 25 +++++------ src/install.go | 112 +++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 133 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 47e0663..105c3cf 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,25 @@ # wyst-package-manager A package manager for the programming language Wyst + + +## Usage: + +### Installing packages (version is optional) +```console +wpm install [:version] +``` + +### Version +```console +wpm version +``` + +### Help +```console +wpm help +``` +### Obtaining information from a package +```console +wpm info +``` + diff --git a/src/info.go b/src/info.go index 41adf86..36eb20c 100644 --- a/src/info.go +++ b/src/info.go @@ -1,28 +1,25 @@ package main import ( - "encoding/json" "fmt" - "net/http" ) func showPackageInfo(packageName 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 } diff --git a/src/install.go b/src/install.go index 23d8b05..5146ee3 100644 --- a/src/install.go +++ b/src/install.go @@ -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)