Compare commits

..

No commits in common. '11a5e575168a47124e0e96b270056c233aa272cd' and '192b41e18be75cfb2da475349ff16f8a80792d0e' have entirely different histories.

  1. 25
      Makefile
  2. 24
      cmd/declpac/main.go
  3. 6
      pkg/input/input.go
  4. 53
      pkg/pacman/pacman.go

25
Makefile

@ -1,25 +0,0 @@
.PHONY: fmt vet check githook
STAGED_GO := $(shell git diff --cached --name-only --diff-filter=ACM | grep '\.go$$')
STAGED_PKGS := $(shell echo "$(STAGED_GO)" | tr ' ' '\n' | xargs -I{} dirname {} | sort -u | sed 's|^|./|')
fmt:
@if [ -z "$(STAGED_GO)" ]; then exit 0; fi; \
unformatted=$$(gofmt -l $(STAGED_GO)); \
if [ -n "$$unformatted" ]; then \
echo "$$unformatted: unformatted staged file"; \
exit 1; \
fi
vet:
@if [ -z "$(STAGED_GO)" ]; then exit 0; fi; \
go vet $(STAGED_PKGS)
check: fmt vet
githook:
@mkdir -p .git/hooks
@echo '#!/bin/sh' > .git/hooks/pre-commit
@echo 'make check' >> .git/hooks/pre-commit
@chmod +x .git/hooks/pre-commit
@echo "Installed pre-commit hook: .git/hooks/pre-commit"

24
cmd/declpac/main.go

@ -52,6 +52,12 @@ func main() {
} }
func run(cfg *Config) error { func run(cfg *Config) error {
if err := state.OpenLog(); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
return err
}
defer state.Close()
start := time.Now() start := time.Now()
fmt.Fprintf(os.Stderr, "[debug] run: starting...\n") fmt.Fprintf(os.Stderr, "[debug] run: starting...\n")
@ -64,6 +70,13 @@ func run(cfg *Config) error {
merged := merge.Merge(packages) merged := merge.Merge(packages)
if !cfg.DryRun {
if err := validation.CheckDBFreshness(); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
return err
}
}
if cfg.DryRun { if cfg.DryRun {
result, err := pacman.DryRun(merged) result, err := pacman.DryRun(merged)
if err != nil { if err != nil {
@ -75,17 +88,6 @@ func run(cfg *Config) error {
return nil return nil
} }
if err := state.OpenLog(); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
return err
}
defer state.Close()
if err := validation.CheckDBFreshness(); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
return err
}
result, err := pacman.Sync(merged) result, err := pacman.Sync(merged)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err) fmt.Fprintf(os.Stderr, "error: %v\n", err)

6
pkg/input/input.go

@ -62,9 +62,5 @@ func readStdin(packages map[string]bool) error {
} }
func normalizePackageName(name string) string { func normalizePackageName(name string) string {
name = strings.TrimSpace(name) return strings.TrimSpace(name)
if name == "" || strings.HasPrefix(name, "#") {
return ""
}
return name
} }

53
pkg/pacman/pacman.go

@ -5,7 +5,6 @@ import (
"io" "io"
"os" "os"
"os/exec" "os/exec"
"path/filepath"
"regexp" "regexp"
"strings" "strings"
"time" "time"
@ -161,78 +160,40 @@ func InstallAUR(f *fetch.Fetcher, pkgName string) error {
return fmt.Errorf("AUR package not found in cache: %s", pkgName) return fmt.Errorf("AUR package not found in cache: %s", pkgName)
} }
sudoUser := os.Getenv("SUDO_USER") tmpDir, err := os.MkdirTemp("", "declpac-aur-")
if sudoUser == "" { if err != nil {
sudoUser = os.Getenv("USER")
if sudoUser == "" {
sudoUser = "root"
}
}
tmpDir := "/tmp/declpac-aur-" + pkgName
mkdirCmd := exec.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 fmt.Errorf("failed to create temp directory: %w", err)
} }
defer os.RemoveAll(tmpDir) defer os.RemoveAll(tmpDir)
cloneURL := "https://aur.archlinux.org/" + aurInfo.PackageBase + ".git" cloneURL := "https://aur.archlinux.org/" + aurInfo.PackageBase + ".git"
state.Write([]byte("Cloning " + cloneURL + "\n")) state.Write([]byte("Cloning " + cloneURL + "\n"))
cloneCmd := exec.Command("su", "-", sudoUser, "-c", "git clone "+cloneURL+" "+tmpDir) cloneCmd := exec.Command("git", "clone", cloneURL, tmpDir)
cloneCmd.Stdout = io.MultiWriter(os.Stdout, state.GetLogWriter()) cloneCmd.Stdout = io.MultiWriter(os.Stdout, state.GetLogWriter())
cloneCmd.Stderr = io.MultiWriter(os.Stderr, state.GetLogWriter()) cloneCmd.Stderr = io.MultiWriter(os.Stderr, state.GetLogWriter())
if err := cloneCmd.Run(); err != nil { if err := cloneCmd.Run(); err != nil {
errMsg := fmt.Sprintf("failed to clone AUR repo: %v\n", err) errMsg := fmt.Sprintf("failed to clone AUR repo: %w\n", err)
state.Write([]byte("error: " + errMsg)) state.Write([]byte("error: " + errMsg))
return fmt.Errorf("failed to clone AUR repo: %w", err) return fmt.Errorf("failed to clone AUR repo: %w", err)
} }
fmt.Fprintf(os.Stderr, "[debug] InstallAUR: cloned (%.2fs)\n", time.Since(start).Seconds()) fmt.Fprintf(os.Stderr, "[debug] InstallAUR: cloned (%.2fs)\n", time.Since(start).Seconds())
state.Write([]byte("Building package...\n")) state.Write([]byte("Building package...\n"))
makepkgCmd := exec.Command("su", "-", sudoUser, "-c", "cd "+tmpDir+" && makepkg -s --noconfirm") makepkgCmd := exec.Command("makepkg", "-si", "--noconfirm")
makepkgCmd.Stdout = io.MultiWriter(os.Stdout, state.GetLogWriter()) makepkgCmd.Stdout = io.MultiWriter(os.Stdout, state.GetLogWriter())
makepkgCmd.Stderr = io.MultiWriter(os.Stderr, state.GetLogWriter()) makepkgCmd.Stderr = io.MultiWriter(os.Stderr, state.GetLogWriter())
makepkgCmd.Dir = tmpDir
if err := makepkgCmd.Run(); err != nil { if err := makepkgCmd.Run(); err != nil {
errMsg := fmt.Sprintf("makepkg failed to build AUR package: %v\n", err) errMsg := fmt.Sprintf("makepkg failed to build AUR package: %w\n", err)
state.Write([]byte("error: " + errMsg)) state.Write([]byte("error: " + errMsg))
return fmt.Errorf("makepkg failed to build AUR package: %w", err) return fmt.Errorf("makepkg failed to build AUR package: %w", err)
} }
fmt.Fprintf(os.Stderr, "[debug] InstallAUR: built (%.2fs)\n", time.Since(start).Seconds()) fmt.Fprintf(os.Stderr, "[debug] InstallAUR: built (%.2fs)\n", time.Since(start).Seconds())
pkgFile, err := findPKGFile(tmpDir)
if err != nil {
return fmt.Errorf("failed to find built package: %w", err)
}
state.Write([]byte("Installing package...\n"))
installCmd := exec.Command("pacman", "-U", "--noconfirm", pkgFile)
installCmd.Stdout = io.MultiWriter(os.Stdout, state.GetLogWriter())
installCmd.Stderr = io.MultiWriter(os.Stderr, state.GetLogWriter())
if err := installCmd.Run(); err != nil {
errMsg := fmt.Sprintf("failed to install package: %v\n", err)
state.Write([]byte("error: " + errMsg))
return fmt.Errorf("failed to install package: %w", err)
}
fmt.Fprintf(os.Stderr, "[debug] InstallAUR: built (%.2fs)\n", time.Since(start).Seconds())
fmt.Fprintf(os.Stderr, "[debug] InstallAUR: done (%.2fs)\n", time.Since(start).Seconds()) fmt.Fprintf(os.Stderr, "[debug] InstallAUR: done (%.2fs)\n", time.Since(start).Seconds())
return nil return nil
} }
func findPKGFile(dir string) (string, error) {
entries, err := os.ReadDir(dir)
if err != nil {
return "", err
}
for _, entry := range entries {
name := entry.Name()
if strings.HasSuffix(name, ".pkg.tar.zst") || strings.HasSuffix(name, ".pkg.tar.gz") {
return filepath.Join(dir, name), nil
}
}
return "", fmt.Errorf("no package file found in %s", dir)
}
func getInstalledCount() (int, error) { func getInstalledCount() (int, error) {
start := time.Now() start := time.Now()
fmt.Fprintf(os.Stderr, "[debug] getInstalledCount: starting...\n") fmt.Fprintf(os.Stderr, "[debug] getInstalledCount: starting...\n")

Loading…
Cancel
Save