Compare commits

...
10 Commits
Author SHA1 Message Date
selimaj-dev 533a2f0d46 cross compatibility 2024-05-24 21:44:59 +02:00
selimaj-dev 3645bfc1c4 change to wpm 2024-05-24 13:43:56 +02:00
Leo dev 231281858e Update install-windows.bat 2024-05-24 04:28:59 -07:00
selimaj-dev 69fffab610 installers 2024-05-24 12:18:22 +02:00
selimaj-dev 68685b53b0 changed to public server 2024-05-23 22:56:36 +02:00
selimaj-dev 3990c620a1 small changes 2024-05-22 21:47:52 +02:00
selimaj-dev 7851d90185 Merge branch 'master' of github.com:wyst-lang/wyst-package-manager 2024-05-22 21:27:42 +02:00
selimaj-dev a3b05d2fbe fixed password input 2024-05-22 21:27:06 +02:00
RudideC 0b65ca4309 Added a clear and fixed issues
Clear is a cross platform function that, as its name implies, clears the terminal/command prompt.
Fixed issue related to sending edit requests even if pms is unavailable
2024-05-22 21:22:20 +02:00
selimaj-dev 81f68b6421 password safety 2024-05-22 20:17:28 +02:00
8 changed files with 197 additions and 60 deletions
+6 -1
View File
@@ -1,3 +1,8 @@
module github.com/RudideC/wyst-package-manager module github.com/wyst-lang/wpm
go 1.22.0 go 1.22.0
require (
golang.org/x/sys v0.20.0 // indirect
golang.org/x/term v0.20.0 // direct
)
+4
View File
@@ -0,0 +1,4 @@
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
+4
View File
@@ -0,0 +1,4 @@
sudo cp -rf . ~/wpm
cd ~/wpm
go build -o bin/wpm src/*.go
sudo cp bin/wpm /usr/local/bin/
+16
View File
@@ -0,0 +1,16 @@
@echo off
cd %~dp0
where go >nul 2>&1
if %errorlevel% neq 0 (
echo please install go: https://go.dev/doc/install
start https://go.dev/doc/install
exit /b 1
) else (
@echo off
xcopy /s /e /i /h /y . "%USERPROFILE%\wpm"
cd /d "%USERPROFILE%\wpm\src"
go build -o ..\wpm.exe
copy ..\wpm.exe C:\Windows\System32
)
pause
+55 -18
View File
@@ -6,7 +6,8 @@ import (
"strings" "strings"
) )
const URL = "http://localhost:3000" // const URL = "http://localhost:3000"
const URL = "https://pms-xdib.onrender.com"
func showHelp() { func showHelp() {
fmt.Println("wpm - Wyst Package Manager") fmt.Println("wpm - Wyst Package Manager")
@@ -30,24 +31,42 @@ func parsePackageArg(arg string) (string, string) {
func createPackage(packageName string) { func createPackage(packageName string) {
var psw string var psw string
var pswV string
var repo string var repo string
var version string var version string
fmt.Printf("Enter the password for %s: ", packageName) fmt.Printf("Enter the password for %s: ", packageName)
fmt.Scanln(&psw) ReadPassword(&psw)
fmt.Printf("Verify the password for %s: ", packageName)
ReadPassword(&pswV)
if psw != pswV {
fmt.Printf("Passwords do not match\n\r")
return
}
fmt.Printf("Enter the repo for %s: ", packageName) fmt.Printf("Enter the repo for %s: ", packageName)
fmt.Scanln(&repo) fmt.Scanln(&repo)
fmt.Printf("Enter the latest version for %s: ", packageName) fmt.Printf("Enter the latest version for %s: ", packageName)
fmt.Scanln(&version) fmt.Scanln(&version)
fmt.Println()
jsonBody := []byte(fmt.Sprintf(`{"name": "%v", "psw": "%v", "repo": "%v", "latest": "%v"}`, packageName, psw, repo, version)) jsonBody := []byte(fmt.Sprintf(`{"name": "%v", "psw": "%v", "repo": "%v", "latest": "%v"}`, packageName, psw, repo, version))
_, err := sendRequest(http.MethodPost, URL, jsonBody) req, err := sendRequest(http.MethodPost, URL, jsonBody)
if err != nil { if err != nil {
fmt.Println(err)
return
}
err = getMessage(req)
if err != nil {
fmt.Printf("Error: %v\n\r", err)
return
} else {
fmt.Printf("Done\n\r")
} }
} }
func editPackage(packageName string) { func editPackage(packageName string) {
pkgidx, err := getPackage(packageName) pkgidx, err := getPackage(packageName)
if err != nil { if err != nil {
fmt.Println(err)
return
} }
var psw string var psw string
var repo string = pkgidx.Repo var repo string = pkgidx.Repo
@@ -55,19 +74,19 @@ func editPackage(packageName string) {
var newPsw string var newPsw string
var newPackageName string = packageName var newPackageName string = packageName
fmt.Printf("Enter the password for %s: ", packageName) fmt.Printf("\rEnter the password for %s: ", packageName)
fmt.Scanln(&psw) ReadPassword(&psw)
newPsw = psw newPsw = psw
for true { for true {
fmt.Printf("\033[2J") clear()
fmt.Println("Choose what you want to modify") fmt.Printf("Choose what you want to modify\n\r")
fmt.Printf(" 1 -> package name: %s\n", newPackageName) fmt.Printf(" 1 -> package name : %s\n\r", newPackageName)
fmt.Printf(" 2 -> password: %s\n", newPsw) fmt.Printf(" 2 -> password : %s\n\r", newPsw)
fmt.Printf(" 3 -> repo: %s\n", repo) fmt.Printf(" 3 -> repo : %s\n\r", repo)
fmt.Printf(" 4 -> latest version: %s\n", version) fmt.Printf(" 4 -> latest version: %s\n\r", version)
fmt.Println("Type in 'quit'/'q'/'exit' to discard your changes") fmt.Printf("Type in 'quit'/'q'/'exit' to discard your changes\n\r")
fmt.Println("Type in anything else to confirm your changes") fmt.Printf("Type in anything else to confirm your changes\n\r")
var option string var option string
fmt.Print("\n> ") fmt.Print("\n> ")
fmt.Scanln(&option) fmt.Scanln(&option)
@@ -77,7 +96,7 @@ func editPackage(packageName string) {
fmt.Scanln(&newPackageName) fmt.Scanln(&newPackageName)
case "2": case "2":
fmt.Printf("Enter the new password for %s: ", packageName) fmt.Printf("Enter the new password for %s: ", packageName)
fmt.Scanln(&newPsw) ReadPassword(&newPsw)
case "3": case "3":
fmt.Printf("Enter the repo for %s: ", packageName) fmt.Printf("Enter the repo for %s: ", packageName)
fmt.Scanln(&repo) fmt.Scanln(&repo)
@@ -95,8 +114,15 @@ func editPackage(packageName string) {
req, err := sendRequest(http.MethodPut, URL, jsonBody) req, err := sendRequest(http.MethodPut, URL, jsonBody)
if err != nil { if err != nil {
fmt.Printf("Error while editing %s: %v", packageName, err) fmt.Printf("Error while editing %s: %v", packageName, err)
return
}
err = getMessage(req)
if err != nil {
fmt.Printf("Error: %v\n\r", err)
return
} else {
fmt.Printf("Done\n\r")
} }
fmt.Printf(string(req.Body))
return return
} }
@@ -106,7 +132,18 @@ func editPackage(packageName string) {
func deletePackage(packageName string) { func deletePackage(packageName string) {
fmt.Printf("Enter the password for %s: ", packageName) fmt.Printf("Enter the password for %s: ", packageName)
var psw string var psw string
fmt.Scanln(&psw) ReadPassword(&psw)
jsonBody := []byte(fmt.Sprintf(`{"name": "%s", "psw": "%v"}`, packageName, psw)) jsonBody := []byte(fmt.Sprintf(`{"name": "%s", "psw": "%v"}`, packageName, psw))
sendRequest(http.MethodDelete, URL, jsonBody) req, err := sendRequest(http.MethodDelete, URL, jsonBody)
if err != nil {
fmt.Println(err)
return
}
err = getMessage(req)
if err != nil {
fmt.Printf("Error: %v\n\r", err)
return
} else {
fmt.Printf("Done\n\r")
}
} }
+17 -1
View File
@@ -26,6 +26,10 @@ type PackageIndex struct {
Message string `json:"message"` Message string `json:"message"`
} }
type Message struct {
Message string `json:"message"`
}
func sendRequest(method, url string, jsonBody []byte) (Request, error) { func sendRequest(method, url string, jsonBody []byte) (Request, error) {
bodyReader := bytes.NewReader(jsonBody) bodyReader := bytes.NewReader(jsonBody)
req, err := http.NewRequest(method, url, bodyReader) req, err := http.NewRequest(method, url, bodyReader)
@@ -48,7 +52,7 @@ func sendRequest(method, url string, jsonBody []byte) (Request, error) {
func getPackage(packageName string) (PackageIndex, error) { func getPackage(packageName string) (PackageIndex, error) {
var pkgidx PackageIndex var pkgidx PackageIndex
jsonBody := []byte(fmt.Sprintf(`{"name": "%s"}`, packageName)) jsonBody := []byte(fmt.Sprintf(`{"name": "%s"}`, packageName))
req, err := sendRequest(http.MethodGet, "http://localhost:3000", jsonBody) req, err := sendRequest(http.MethodGet, URL, jsonBody)
if err != nil { if err != nil {
fmt.Printf("Fetching error: %s\n", err) fmt.Printf("Fetching error: %s\n", err)
} }
@@ -62,3 +66,15 @@ func getPackage(packageName string) (PackageIndex, error) {
} }
return pkgidx, nil return pkgidx, nil
} }
func getMessage(req Request) error {
var msg Message
err := json.Unmarshal(req.Body, &msg)
if err != nil {
return fmt.Errorf("JsonError: %v", err)
}
if msg.Message != "ok" {
return fmt.Errorf(msg.Message)
}
return nil
}
-40
View File
@@ -1,40 +0,0 @@
package main
import (
"fmt"
"strings"
)
type ProgressBar struct {
total int
length int
last_suffix int
enabled bool
}
func (prb *ProgressBar) change(amount int, prefix, suffix string) {
if prb.enabled {
percent := float64(amount) / float64(prb.total)
filledLength := int(float64(prb.length) * percent)
fill := "█"
end := "█"
if amount == prb.total {
end = "█"
}
for len(suffix) < prb.last_suffix {
suffix += " "
}
bar := strings.Repeat(fill, filledLength) + end + strings.Repeat("-", (prb.length-filledLength))
fmt.Printf("\r%s [%s] %s", prefix, bar, suffix)
// if amount == prb.total {
// fmt.Println()
// }
prb.last_suffix = len(suffix) + 3
}
}
func (prb ProgressBar) clean() {
if prb.enabled {
fmt.Printf("\r" + strings.Repeat(" ", prb.last_suffix+prb.length+2) + "\r")
}
}
+95
View File
@@ -0,0 +1,95 @@
package main
import (
"fmt"
"os"
"os/exec"
"runtime"
"strings"
"golang.org/x/term"
)
type ProgressBar struct {
total int
length int
last_suffix int
enabled bool
}
func (prb *ProgressBar) change(amount int, prefix, suffix string) {
if prb.enabled {
percent := float64(amount) / float64(prb.total)
filledLength := int(float64(prb.length) * percent)
fill := "█"
end := "█"
if amount == prb.total {
end = "█"
}
for len(suffix) < prb.last_suffix {
suffix += " "
}
bar := strings.Repeat(fill, filledLength) + end + strings.Repeat("-", (prb.length-filledLength))
fmt.Printf("\r%s [%s] %s", prefix, bar, suffix)
// if amount == prb.total {
// fmt.Println()
// }
prb.last_suffix = len(suffix) + 3
}
}
func (prb ProgressBar) clean() {
if prb.enabled {
fmt.Printf("\r" + strings.Repeat(" ", prb.last_suffix+prb.length+2) + "\r")
}
}
func ReadPassword(buff *string) error {
safeChar := "*"
oldState, err := term.MakeRaw(int(os.Stdin.Fd()))
if err != nil {
return err
}
defer term.Restore(int(os.Stdin.Fd()), oldState)
for true {
b := make([]byte, 1)
_, err = os.Stdin.Read(b)
if err != nil {
return err
}
chr := string(b[0])
if chr == "\r" || chr == "\n" {
fmt.Printf("\n\r")
return nil
} else if chr == "\b" || b[0] == 127 {
if len(*buff) > 0 {
fmt.Print("\033[1D \033[1D")
*buff = string(*buff)[:len(*buff)-1]
}
} else if b[0] == 3 {
os.Exit(0)
} else {
*buff += chr
if safeChar == "off" {
fmt.Print(chr)
} else {
fmt.Print(safeChar)
}
}
}
return nil
}
func clear() {
switch runtime.GOOS {
case "windows":
cmd := exec.Command("cmd", "/c", "cls")
cmd.Stdout = os.Stdout
cmd.Run()
default: // Unix-like systems
cmd := exec.Command("clear")
cmd.Stdout = os.Stdout
cmd.Run()
}
}