Przeglądaj źródła

Rework completion

Bash seperates on whitespace, so the fish completion file
actually works for bash and zsh. So remove the concept of shells
entirley and just use the singular aur_sh.cache file.

If for some reason output without the repository data is needed, the
user could always just pipe it into awk like so
`yay -Pc | awk '{print $1}'`. Or perhaps a --quiet option could be added
where yay will strip the output itself.

The completion cache now updates when installing AUR packages. This is
done as a goroutine with no wait groups. This ensures the program will
never hang if there is a problem.

The completion is stil updated during -Pc but as long as an AUR package
has been installed recently it should not need to update.

The cache will now also wait 7 days instead of 2 before refreshing.
A refresh can be forced using -Pcc.
morganamilo 6 lat temu
rodzic
commit
9c882614a3
3 zmienionych plików z 26 dodań i 37 usunięć
  1. 3 6
      cmd.go
  2. 21 31
      completions.go
  3. 2 0
      install.go

+ 3 - 6
cmd.go

@@ -361,13 +361,10 @@ func handlePrint() (err error) {
 		err = printUpdateList(cmdArgs)
 	case cmdArgs.existsArg("w", "news"):
 		err = printNewsFeed()
+	case cmdArgs.existsDouble("c", "complete"):
+		complete(true)
 	case cmdArgs.existsArg("c", "complete"):
-		switch {
-		case cmdArgs.existsArg("f", "fish"):
-			complete("fish")
-		default:
-			complete("sh")
-		}
+		complete(false)
 	case cmdArgs.existsArg("s", "stats"):
 		err = localStatistics()
 	default:

+ 21 - 31
completions.go

@@ -2,7 +2,6 @@ package main
 
 import (
 	"bufio"
-	"fmt"
 	"io"
 	"net/http"
 	"os"
@@ -13,7 +12,7 @@ import (
 )
 
 //CreateAURList creates a new completion file
-func createAURList(out *os.File, shell string) (err error) {
+func createAURList(out *os.File) (err error) {
 	resp, err := http.Get("https://aur.archlinux.org/packages.gz")
 	if err != nil {
 		return err
@@ -24,22 +23,15 @@ func createAURList(out *os.File, shell string) (err error) {
 
 	scanner.Scan()
 	for scanner.Scan() {
-		fmt.Print(scanner.Text())
 		out.WriteString(scanner.Text())
-		if shell == "fish" {
-			fmt.Print("\tAUR\n")
-			out.WriteString("\tAUR\n")
-		} else {
-			fmt.Print("\n")
-			out.WriteString("\n")
-		}
+		out.WriteString("\tAUR\n")
 	}
 
 	return nil
 }
 
 //CreatePackageList appends Repo packages to completion cache
-func createRepoList(out *os.File, shell string) (err error) {
+func createRepoList(out *os.File) (err error) {
 	dbList, err := alpmHandle.SyncDbs()
 	if err != nil {
 		return
@@ -47,15 +39,8 @@ func createRepoList(out *os.File, shell string) (err error) {
 
 	_ = dbList.ForEach(func(db alpm.Db) error {
 		_ = db.PkgCache().ForEach(func(pkg alpm.Package) error {
-			fmt.Print(pkg.Name())
 			out.WriteString(pkg.Name())
-			if shell == "fish" {
-				fmt.Print("\t" + pkg.DB().Name() + "\n")
-				out.WriteString("\t" + pkg.DB().Name() + "\n")
-			} else {
-				fmt.Print("\n")
-				out.WriteString("\n")
-			}
+			out.WriteString("\t" + pkg.DB().Name() + "\n")
 			return nil
 		})
 		return nil
@@ -63,33 +48,38 @@ func createRepoList(out *os.File, shell string) (err error) {
 	return nil
 }
 
-// Complete provides completion info for shells
-func complete(shell string) error {
-	var path string
-
-	if shell == "fish" {
-		path = filepath.Join(cacheHome, "aur_fish"+".cache")
-	} else {
-		path = filepath.Join(cacheHome, "aur_sh"+".cache")
-	}
+func updateCompletion(force bool) error {
+	path := filepath.Join(cacheHome, "completion.cache")
 	info, err := os.Stat(path)
 
-	if os.IsNotExist(err) || time.Since(info.ModTime()).Hours() > 48 {
+	if os.IsNotExist(err) || time.Since(info.ModTime()).Hours() >= 7*24 || force {
 		os.MkdirAll(filepath.Dir(path), 0755)
 		out, errf := os.Create(path)
 		if errf != nil {
 			return errf
 		}
 
-		if createAURList(out, shell) != nil {
+		if createAURList(out) != nil {
 			defer os.Remove(path)
 		}
-		erra := createRepoList(out, shell)
+		erra := createRepoList(out)
 
 		out.Close()
 		return erra
 	}
 
+	return nil
+}
+
+// Complete provides completion info for shells
+func complete(force bool) error {
+	path := filepath.Join(cacheHome, "completion.cache")
+
+	err := updateCompletion(force)
+	if err != nil {
+		return err
+	}
+
 	in, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0644)
 	if err != nil {
 		return err

+ 2 - 0
install.go

@@ -312,6 +312,8 @@ func install(parser *arguments) error {
 		}
 	}
 
+	go updateCompletion(false)
+
 	err = downloadPkgBuildsSources(do.Aur, do.Bases, incompatible)
 	if err != nil {
 		return err