Compare commits
4
Commits
192b41e18b
...
11a5e57516
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
11a5e57516 | ||
|
|
cffccf2390 | ||
|
|
6fd4b64d92 | ||
|
|
e74c38cb3f |
@@ -0,0 +1,25 @@
|
|||||||
|
.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"
|
||||||
+11
-13
@@ -52,12 +52,6 @@ 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")
|
||||||
|
|
||||||
@@ -70,13 +64,6 @@ 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 {
|
||||||
@@ -88,6 +75,17 @@ 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)
|
||||||
|
|||||||
+5
-1
@@ -62,5 +62,9 @@ func readStdin(packages map[string]bool) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func normalizePackageName(name string) string {
|
func normalizePackageName(name string) string {
|
||||||
return strings.TrimSpace(name)
|
name = strings.TrimSpace(name)
|
||||||
|
if name == "" || strings.HasPrefix(name, "#") {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return name
|
||||||
}
|
}
|
||||||
|
|||||||
+46
-7
@@ -5,6 +5,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@@ -160,40 +161,78 @@ 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
tmpDir, err := os.MkdirTemp("", "declpac-aur-")
|
sudoUser := os.Getenv("SUDO_USER")
|
||||||
if err != nil {
|
if sudoUser == "" {
|
||||||
|
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("git", "clone", cloneURL, tmpDir)
|
cloneCmd := exec.Command("su", "-", sudoUser, "-c", "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: %w\n", err)
|
errMsg := fmt.Sprintf("failed to clone AUR repo: %v\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("makepkg", "-si", "--noconfirm")
|
makepkgCmd := exec.Command("su", "-", sudoUser, "-c", "cd "+tmpDir+" && makepkg -s --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: %w\n", err)
|
errMsg := fmt.Sprintf("makepkg failed to build AUR package: %v\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")
|
||||||
|
|||||||
Reference in New Issue
Block a user