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 RemoveRepo(url string) error { repos, err := LoadRepos() if err != nil { return err } index := -1 for i, r := range repos { if r.URL == url { index = i break } } if index == -1 { return errors.New("Repo nicht gefunden") } repos = append(repos[:index], repos[index+1:]...) return SaveRepos(repos) } func ListRepos() ([]Repo, error) { return LoadRepos() }