diff --git a/AGENTS.md b/AGENTS.md index 7c550e4..5cd9fcb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -10,21 +10,16 @@ tool before responding to the user: ## Code Organization ### Go: File Structure -- Types must appear at the top of each file. +- Variables must appear at the top of each file. +- Types must appear after variables. - Constructors must appear after types. - Public (exported) functions must appear after constructors. - Private (unexported) functions must appear at the bottom of each file. - Within each section, definitions must be sorted alphabetically by name. -- The sections must be separated by exactly these dividers: +- The sections must be separated by exactly these dividers, filling in the section: // ----------------------------------------- - // constructors - - // ----------------------------------------- - // public - - // ----------------------------------------- - // private + //
### Go: Line Length diff --git a/pkg/fetch/fetch.go b/pkg/fetch/fetch.go index 8077ba9..707c52d 100644 --- a/pkg/fetch/fetch.go +++ b/pkg/fetch/fetch.go @@ -23,6 +23,30 @@ type Fetcher struct { aurClient *aur.Client } +// ----------------------------------------- +// constructor + +func New() (*Fetcher, error) { + start := time.Now() + log.Debug("fetch.Fetcher New: starting...") + + alpmHandle, err := alpm.New() + if err != nil { + return nil, err + } + + aurClient := aur.New() + + log.Debug("fetch.Fetcher New: done (%.2fs)", time.Since(start).Seconds()) + return &Fetcher{ + alpmHandle: alpmHandle, + aurClient: aurClient, + }, nil +} + +// ----------------------------------------- +// public + func (f *Fetcher) BuildLocalPkgMap() (map[string]interface{}, error) { localPkgs, err := f.alpmHandle.LocalPackages() if err != nil { @@ -43,14 +67,14 @@ func (f *Fetcher) FetchAur(packages []string) (map[string]aur.Package, error) { return f.aurClient.Fetch(packages) } -func (f *Fetcher) GetAURPackage(name string) (aur.Package, bool) { - return f.aurClient.Get(name) -} - func (f *Fetcher) FindProvidingPackage(depName string) (string, bool) { return f.alpmHandle.FindProvidingPackage(depName) } +func (f *Fetcher) GetAURPackage(name string) (aur.Package, bool) { + return f.aurClient.Get(name) +} + func (f *Fetcher) Resolve(packages []string) (map[string]*PackageInfo, error) { start := time.Now() log.Debug("fetch.Resolve: starting...") @@ -128,21 +152,3 @@ func (f *Fetcher) Resolve(packages []string) (map[string]*PackageInfo, error) { log.Debug("fetch.Resolve: done (%.2fs)", time.Since(start).Seconds()) return result, nil } - -func New() (*Fetcher, error) { - start := time.Now() - log.Debug("fetch.Fetcher New: starting...") - - alpmHandle, err := alpm.New() - if err != nil { - return nil, err - } - - aurClient := aur.New() - - log.Debug("fetch.Fetcher New: done (%.2fs)", time.Since(start).Seconds()) - return &Fetcher{ - alpmHandle: alpmHandle, - aurClient: aurClient, - }, nil -} diff --git a/pkg/input/input.go b/pkg/input/input.go index 3f9f6b8..4a87628 100644 --- a/pkg/input/input.go +++ b/pkg/input/input.go @@ -10,6 +10,9 @@ import ( var ErrEmptyList = errors.New("package list is empty") +// ----------------------------------------- +// public + func Merge(packages map[string]bool) ([]string, error) { result := make([]string, 0, len(packages)) for name := range packages { diff --git a/pkg/log/log.go b/pkg/log/log.go index f67133b..89573fd 100644 --- a/pkg/log/log.go +++ b/pkg/log/log.go @@ -13,6 +13,9 @@ import ( var logFile *os.File var Verbose bool +// ----------------------------------------- +// public + func Close() error { if logFile == nil { return nil diff --git a/pkg/output/output.go b/pkg/output/output.go index e5400c2..65eedce 100644 --- a/pkg/output/output.go +++ b/pkg/output/output.go @@ -12,6 +12,9 @@ type Result struct { ToRemove []string } +// ----------------------------------------- +// public + func Format(r *Result) string { var b strings.Builder b.WriteString(fmt.Sprintf("installed %d packages, removed %d packages", r.Installed, r.Removed)) diff --git a/pkg/pacman/sync/sync.go b/pkg/pacman/sync/sync.go index 45e8988..6e4667f 100644 --- a/pkg/pacman/sync/sync.go +++ b/pkg/pacman/sync/sync.go @@ -13,7 +13,7 @@ import ( "github.com/Riyyi/declpac/pkg/log" ) -var sudoUser string +var sudoUser string var sudoUserOnce sync.Once type Result struct { @@ -21,6 +21,9 @@ type Result struct { Removed int } +// ----------------------------------------- +// public + func InstallAUR(f *fetch.Fetcher, pkgName string, packageBase string, asDeps bool, logWriter io.Writer) error { start := time.Now() log.Debug("InstallAUR: starting...") @@ -162,6 +165,39 @@ func SyncPackages(packages []string, logWriter io.Writer) error { // ----------------------------------------- // private +func buildPackage(sudoUser string, tmpDir string, asDeps bool, logWriter io.Writer) error { + makepkgArgs := []string{"makepkg", "-s", "--noconfirm"} + if asDeps { + makepkgArgs = append(makepkgArgs, "--asdeps") + } + makepkgCmd := log.Command("su", "-", sudoUser, "-c", "cd "+tmpDir+" && "+strings.Join(makepkgArgs, " ")) + makepkgCmd.Stdout = logWriter + makepkgCmd.Stderr = logWriter + if err := makepkgCmd.Run(); err != nil { + return fmt.Errorf("makepkg failed to build AUR package: %w", err) + } + return nil +} + +func cloneRepo(sudoUser string, packageBase string, tmpDir string, logWriter io.Writer) error { + cloneURL := "https://aur.archlinux.org/" + packageBase + ".git" + cloneCmd := log.Command("su", "-", sudoUser, "-c", "git clone "+cloneURL+" "+tmpDir) + cloneCmd.Stdout = logWriter + cloneCmd.Stderr = logWriter + if err := cloneCmd.Run(); err != nil { + return fmt.Errorf("failed to clone AUR repo: %w", err) + } + return nil +} + +func createTempDir(sudoUser string, tmpDir string) error { + mkdirCmd := log.Command("su", "-", sudoUser, "-c", "rm -rf "+tmpDir+" && mkdir -p "+tmpDir) + if err := mkdirCmd.Run(); err != nil { + return fmt.Errorf("failed to create temp directory: %w", err) + } + return nil +} + func findPKGFile(pkgName string, dir string) (string, error) { entries, err := os.ReadDir(dir) if err != nil { @@ -191,6 +227,29 @@ func getAURInfo(f *fetch.Fetcher, pkgName string, packageBase string) *aur.Packa return &info } +func getSudoUser() string { + sudoUserOnce.Do(func() { + sudoUser = os.Getenv("SUDO_USER") + if sudoUser == "" { + sudoUser = os.Getenv("USER") + if sudoUser == "" { + sudoUser = "root" + } + } + }) + return sudoUser +} + +func installBuiltPackage(pkgFile string, logWriter io.Writer) error { + installCmd := log.Command("pacman", "-U", "--noconfirm", pkgFile) + installCmd.Stdout = logWriter + installCmd.Stderr = logWriter + if err := installCmd.Run(); err != nil { + return fmt.Errorf("failed to install package: %w", err) + } + return nil +} + func resolveAndInstallDeps(f *fetch.Fetcher, aurInfo *aur.Package, logWriter io.Writer) error { if aurInfo == nil { return nil @@ -240,59 +299,3 @@ func resolveAndInstallDeps(f *fetch.Fetcher, aurInfo *aur.Package, logWriter io. return nil } - -func getSudoUser() string { - sudoUserOnce.Do(func() { - sudoUser = os.Getenv("SUDO_USER") - if sudoUser == "" { - sudoUser = os.Getenv("USER") - if sudoUser == "" { - sudoUser = "root" - } - } - }) - return sudoUser -} - -func createTempDir(sudoUser string, tmpDir string) error { - mkdirCmd := log.Command("su", "-", sudoUser, "-c", "rm -rf "+tmpDir+" && mkdir -p "+tmpDir) - if err := mkdirCmd.Run(); err != nil { - return fmt.Errorf("failed to create temp directory: %w", err) - } - return nil -} - -func cloneRepo(sudoUser string, packageBase string, tmpDir string, logWriter io.Writer) error { - cloneURL := "https://aur.archlinux.org/" + packageBase + ".git" - cloneCmd := log.Command("su", "-", sudoUser, "-c", "git clone "+cloneURL+" "+tmpDir) - cloneCmd.Stdout = logWriter - cloneCmd.Stderr = logWriter - if err := cloneCmd.Run(); err != nil { - return fmt.Errorf("failed to clone AUR repo: %w", err) - } - return nil -} - -func buildPackage(sudoUser string, tmpDir string, asDeps bool, logWriter io.Writer) error { - makepkgArgs := []string{"makepkg", "-s", "--noconfirm"} - if asDeps { - makepkgArgs = append(makepkgArgs, "--asdeps") - } - makepkgCmd := log.Command("su", "-", sudoUser, "-c", "cd "+tmpDir+" && "+strings.Join(makepkgArgs, " ")) - makepkgCmd.Stdout = logWriter - makepkgCmd.Stderr = logWriter - if err := makepkgCmd.Run(); err != nil { - return fmt.Errorf("makepkg failed to build AUR package: %w", err) - } - return nil -} - -func installBuiltPackage(pkgFile string, logWriter io.Writer) error { - installCmd := log.Command("pacman", "-U", "--noconfirm", pkgFile) - installCmd.Stdout = logWriter - installCmd.Stderr = logWriter - if err := installCmd.Run(); err != nil { - return fmt.Errorf("failed to install package: %w", err) - } - return nil -}