// ALR - Any Linux Repository // Copyright (C) 2025 Евгений Храмов // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . package manager import ( "bufio" "fmt" "os/exec" "strings" ) type CommonRPM struct{} func (c *CommonRPM) ListInstalled(opts *Opts) (map[string]string, error) { out := map[string]string{} cmd := exec.Command("rpm", "-qa", "--queryformat", "%{NAME}\u200b%|EPOCH?{%{EPOCH}:}:{}|%{VERSION}-%{RELEASE}\\n") stdout, err := cmd.StdoutPipe() if err != nil { return nil, err } err = cmd.Start() if err != nil { return nil, err } scanner := bufio.NewScanner(stdout) for scanner.Scan() { name, version, ok := strings.Cut(scanner.Text(), "\u200b") if !ok { continue } version = strings.TrimPrefix(version, "0:") out[name] = version } err = scanner.Err() if err != nil { return nil, err } return out, nil } func (a *CommonRPM) IsInstalled(pkg string) (bool, error) { cmd := exec.Command("rpm", "-q", "--whatprovides", pkg) output, err := cmd.CombinedOutput() if err != nil { if exitErr, ok := err.(*exec.ExitError); ok { if exitErr.ExitCode() == 1 { return false, nil } } return false, fmt.Errorf("rpm: isinstalled: %w, output: %s", err, output) } return true, nil }