From a0d3035f71b8a1015d8a6cf5a604170e311106ed Mon Sep 17 00:00:00 2001 From: musabe24 Date: Mon, 17 Nov 2025 22:23:41 +0100 Subject: [PATCH] Update to v0.1.2 --- Makefile | 2 +- README.md | 92 ++++++++++++++++++++++++++---- cmd/ginie/main.go | 54 +++++++++++++++++- internal/repos/repos.go | 108 ++++++++++++++++++++++++++++++++++++ internal/version/version.go | 2 +- 5 files changed, 243 insertions(+), 15 deletions(-) create mode 100644 internal/repos/repos.go diff --git a/Makefile b/Makefile index a26d816..b4ad17a 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ BINARY=ginie -VERSION=0.1.0 +VERSION=0.1.2 build: go build -o $(BINARY) ./cmd/ginie diff --git a/README.md b/README.md index af420b8..e3fe8d0 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,91 @@ **Ginie – Git Native Installer Engine** -Ein leichtgewichtiges Paketmanagement-Tool, das GitHub-Releases installiert, -aktualisiert und verwaltet. +Ginie ist ein leichtgewichtiges Paketmanagement-Tool, das GitHub-Repositories verwaltet und später Releases installieren und aktualisieren kann. -### Features (geplant) +Aktuell implementierte Befehle: -- Installieren von GitHub-Releases -- Automatische Updates -- Deinstallieren -- Erweiterbare Repository-Definitionen +``` +ginie --version +``` -### Installation +Zeigt die installierte Version an. -**Debian / Ubuntu (.deb Paket)**: +``` +ginie add +``` -```sh +Fügt ein Repository zur lokalen Liste hinzu. +Beispiel: + +``` +ginie add https://github.com/rustdesk/rustdesk +``` + +``` +ginie list +``` + +Listet alle gespeicherten Repositories aus `~/.config/ginie/repos.json`. + +--- + +## Installation + +### Aus .deb Datei + +Nach dem Bauen oder Herunterladen: + +``` sudo dpkg -i ginie__amd64.deb +``` + +--- + +## Entwicklung + +### Projekt bauen + +``` +make build +``` + +### Direkt ausführen + +``` +make run +``` + +### Debian-Paket erzeugen + +``` +make deb +``` + +Das Paket wird automatisch im Projektverzeichnis erstellt. + +--- + +## Konfiguration + +Die registrierten Repositories werden gespeichert unter: + +``` +~/.config/ginie/repos.json +``` + +--- + +## Geplante Features + +* Installieren von GitHub-Releases +* Automatische Updates +* Entfernen von installierten Paketen +* Versionsverwaltung +* Unterstützung mehrerer Quellen + +--- + +## Lizenz + +MIT License diff --git a/cmd/ginie/main.go b/cmd/ginie/main.go index f59a050..97b0734 100644 --- a/cmd/ginie/main.go +++ b/cmd/ginie/main.go @@ -4,14 +4,62 @@ import ( "fmt" "os" + "gitea.home.musaberdem.de/musabe24/ginie/internal/repos" "gitea.home.musaberdem.de/musabe24/ginie/internal/version" ) func main() { - if len(os.Args) > 1 && (os.Args[1] == "--version" || os.Args[1] == "-v") { - fmt.Println("ginie version", version.Version) + if len(os.Args) < 2 { + fmt.Println("Ginie – Git Native Installer Engine") + fmt.Println("Usage: ginie [arguments]") return } - fmt.Println("Ginie – Git Native Installer Engine") + cmd := os.Args[1] + + switch cmd { + + case "--version", "-v": + fmt.Println("ginie version", version.Version) + return + + case "add": + if len(os.Args) < 3 { + fmt.Println("Usage: ginie add ") + return + } + url := os.Args[2] + + err := repos.AddRepo(url) + if err != nil { + fmt.Println("Fehler:", err) + return + } + + fmt.Println("Repo hinzugefügt:", url) + return + + case "list": + reposList, err := repos.ListRepos() + if err != nil { + fmt.Println("Fehler beim Laden:", err) + return + } + + if len(reposList) == 0 { + fmt.Println("Noch keine Repositories hinzugefügt. Nutze:") + fmt.Println(" ginie add ") + return + } + + fmt.Println("Registrierte Repositories:") + for _, r := range reposList { + fmt.Printf("- %s/%s (%s)\n", r.Owner, r.Name, r.URL) + } + return + + default: + fmt.Println("Unbekannter Befehl:", cmd) + return + } } diff --git a/internal/repos/repos.go b/internal/repos/repos.go new file mode 100644 index 0000000..60b00e5 --- /dev/null +++ b/internal/repos/repos.go @@ -0,0 +1,108 @@ +package repos + +import ( + "encoding/json" + "errors" + "os" + "path/filepath" + "strings" +) + +type Repo struct { + URL string `json:"url"` + Owner string `json:"owner"` + Name string `json:"name"` +} + +func configPath() (string, error) { + home, err := os.UserHomeDir() + if err != nil { + return "", err + } + + dir := filepath.Join(home, ".config", "ginie") + os.MkdirAll(dir, 0755) + + return filepath.Join(dir, "repos.json"), nil +} + +func LoadRepos() ([]Repo, error) { + path, err := configPath() + if err != nil { + return nil, err + } + + data, err := os.ReadFile(path) + if os.IsNotExist(err) { + return []Repo{}, nil + } + if err != nil { + return nil, err + } + + var repos []Repo + err = json.Unmarshal(data, &repos) + if err != nil { + return nil, err + } + + return repos, nil +} + +func SaveRepos(repos []Repo) error { + path, err := configPath() + if err != nil { + return err + } + + data, err := json.MarshalIndent(repos, "", " ") + if err != nil { + return err + } + + return os.WriteFile(path, data, 0644) +} + +func ParseGitHubURL(raw string) (Repo, error) { + if !strings.HasPrefix(raw, "https://github.com/") { + return Repo{}, errors.New("URL ist kein gültiger GitHub-Link") + } + + parts := strings.Split(strings.TrimPrefix(raw, "https://github.com/"), "/") + if len(parts) < 2 { + return Repo{}, errors.New("GitHub-Link hat nicht das Format: https://github.com//") + } + + return Repo{ + URL: raw, + Owner: parts[0], + Name: parts[1], + }, nil +} + +func AddRepo(url string) error { + repo, err := ParseGitHubURL(url) + if err != nil { + return err + } + + repos, err := LoadRepos() + if err != nil { + return err + } + + // prüfen ob bereits vorhanden + for _, r := range repos { + if r.URL == repo.URL { + return errors.New("Repo existiert bereits") + } + } + + repos = append(repos, repo) + + return SaveRepos(repos) +} + +func ListRepos() ([]Repo, error) { + return LoadRepos() +} diff --git a/internal/version/version.go b/internal/version/version.go index 6aed761..3f822d0 100644 --- a/internal/version/version.go +++ b/internal/version/version.go @@ -1,4 +1,4 @@ package version // Wird vom Build-Prozess überschrieben, falls gewünscht -var Version = "0.1.0" +var Version = "0.1.1"