cache-apt-pkgs-action/internal/pkgs/apt.go
awalsh128 07366a6d1e - Added CLAUDE.md guidance with preferences.
- Refactored README.md
- Added workflows for version export and management.
- Removed src directory, following Go best practices
- Added COMMANDS.md documentation

Saving the AI semi-slop for now with broken states to get a snapshot.
Too lazy to setup another chained repo.
2025-08-29 17:30:25 -07:00

80 lines
2.5 KiB
Go

// Package pkgs provides package management functionality using APT.
package pkgs
import (
"fmt"
"awalsh128.com/cache-apt-pkgs-action/internal/logging"
"github.com/awalsh128/syspkg"
"github.com/awalsh128/syspkg/manager"
)
// Apt wraps the APT package manager functionality.
// It provides a simplified interface for installing and querying packages
// using apt-fast for better performance.
type Apt struct {
// manager is the underlying package manager implementation
manager syspkg.PackageManager
}
// NewApt creates a new APT manager instance configured to use apt-fast.
// Returns an error if the APT package manager is not available or cannot be initialized.
func NewApt() (*Apt, error) {
registry, err := syspkg.New(syspkg.IncludeOptions{AptFast: true})
if err != nil {
return nil, fmt.Errorf("error initializing SysPkg: %v", err)
}
// Get APT package manager (if available)
aptManager, err := registry.GetPackageManager("apt-fast")
if err != nil {
return nil, fmt.Errorf("APT package manager not available: %v", err)
}
return &Apt{
manager: aptManager,
}, nil
}
// Install installs a set of packages using apt-fast.
// It returns the list of actually installed packages (which may be different from
// the input if some packages were already installed) and any error encountered.
// The installation is performed with --assume-yes and verbose logging enabled.
func (a *Apt) Install(pkgs Packages) (Packages, error) {
installedPkgs, err := a.manager.Install(
pkgs.StringArray(),
&manager.Options{AssumeYes: true, Debug: true, Verbose: true},
)
if err != nil {
return nil, err
}
logging.Info("Completed installing packages.")
logging.Debug("Installed packages: %v.", installedPkgs)
logging.Info("Skipping packages that are already installed.")
return NewPackagesFromSyspkg(installedPkgs), nil
}
// ListInstalledFiles returns a list of all files installed by a package.
// This includes configuration files, binaries, libraries, and any other
// files managed by the package system.
func (a *Apt) ListInstalledFiles(pkg *Package) ([]string, error) {
files, err := a.manager.ListInstalledFiles(pkg.String())
if err != nil {
return nil, fmt.Errorf(
"error listing installed files for package %s: %v",
pkg.String(),
err,
)
}
return files, nil
}
func (a *Apt) Validate(pkg *Package) (manager.PackageInfo, error) {
packageInfo, err := a.manager.GetPackageInfo(pkg.String(), &manager.Options{AssumeYes: true})
if err != nil {
return manager.PackageInfo{}, fmt.Errorf("error getting package info: %v", err)
}
return packageInfo, nil
}