diff --git a/cmd/ginie/main.go b/cmd/ginie/main.go index 497aec5..08d669f 100644 --- a/cmd/ginie/main.go +++ b/cmd/ginie/main.go @@ -93,6 +93,20 @@ func main() { } return + case "update": + if len(os.Args) < 3 { + fmt.Println("Usage: ginie update ") + return + } + target := os.Args[2] + + err := install.Update(target) + if err != nil { + fmt.Println("Fehler:", err) + return + } + return + default: fmt.Println("Unbekannter Befehl:", cmd) return diff --git a/internal/install/install.go b/internal/install/install.go index 087d052..9744805 100644 --- a/internal/install/install.go +++ b/internal/install/install.go @@ -194,3 +194,63 @@ func Install(pkg string) error { return errors.New("Asset-Typ wird noch nicht unterstützt") } + +func Update(pkg string) error { + name := pkg + + all, err := repos.LoadRepos() + if err != nil { + return err + } + + var repo repos.Repo + found := false + for _, r := range all { + if r.Name == name { + repo = r + found = true + break + } + } + + if !found { + return errors.New("Repo nicht gefunden. Nutze: ginie add ") + } + + if repo.InstalledVersion == "" { + return errors.New("Package noch nicht installiert. Nutze: ginie install " + name) + } + + api := fmt.Sprintf("https://api.github.com/repos/%s/%s/releases/latest", repo.Owner, repo.Name) + + resp, err := http.Get(api) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + return fmt.Errorf("GitHub API Fehler: %s", resp.Status) + } + + var release struct { + TagName string `json:"tag_name"` + } + + if err := json.NewDecoder(resp.Body).Decode(&release); err != nil { + return err + } + + if release.TagName == "" { + return errors.New("Keine Version im Release gefunden") + } + + if release.TagName == repo.InstalledVersion { + fmt.Printf("%s ist bereits auf Version %s\n", repo.Name, repo.InstalledVersion) + return nil + } + + fmt.Printf("Aktualisiere %s von %s auf %s\n", repo.Name, repo.InstalledVersion, release.TagName) + + return Install(fmt.Sprintf("%s:%s", repo.Name, release.TagName)) +}