Browse Source

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 years ago
parent
commit
9c882614a3
3 changed files with 26 additions and 37 deletions
  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)
 		err = printUpdateList(cmdArgs)
 	case cmdArgs.existsArg("w", "news"):
 	case cmdArgs.existsArg("w", "news"):
 		err = printNewsFeed()
 		err = printNewsFeed()
+	case cmdArgs.existsDouble("c", "complete"):
+		complete(true)
 	case cmdArgs.existsArg("c", "complete"):
 	case cmdArgs.existsArg("c", "complete"):
-		switch {
-		case cmdArgs.existsArg("f", "fish"):
-			complete("fish")
-		default:
-			complete("sh")
-		}
+		complete(false)
 	case cmdArgs.existsArg("s", "stats"):
 	case cmdArgs.existsArg("s", "stats"):
 		err = localStatistics()
 		err = localStatistics()
 	default:
 	default:

+ 21 - 31
completions.go

@@ -2,7 +2,6 @@ package main
 
 
 import (
 import (
 	"bufio"
 	"bufio"
-	"fmt"
 	"io"
 	"io"
 	"net/http"
 	"net/http"
 	"os"
 	"os"
@@ -13,7 +12,7 @@ import (
 )
 )
 
 
 //CreateAURList creates a new completion file
 //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")
 	resp, err := http.Get("https://aur.archlinux.org/packages.gz")
 	if err != nil {
 	if err != nil {
 		return err
 		return err
@@ -24,22 +23,15 @@ func createAURList(out *os.File, shell string) (err error) {
 
 
 	scanner.Scan()
 	scanner.Scan()
 	for scanner.Scan() {
 	for scanner.Scan() {
-		fmt.Print(scanner.Text())
 		out.WriteString(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
 	return nil
 }
 }
 
 
 //CreatePackageList appends Repo packages to completion cache
 //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()
 	dbList, err := alpmHandle.SyncDbs()
 	if err != nil {
 	if err != nil {
 		return
 		return
@@ -47,15 +39,8 @@ func createRepoList(out *os.File, shell string) (err error) {
 
 
 	_ = dbList.ForEach(func(db alpm.Db) error {
 	_ = dbList.ForEach(func(db alpm.Db) error {
 		_ = db.PkgCache().ForEach(func(pkg alpm.Package) error {
 		_ = db.PkgCache().ForEach(func(pkg alpm.Package) error {
-			fmt.Print(pkg.Name())
 			out.WriteString(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
 		})
 		})
 		return nil
 		return nil
@@ -63,33 +48,38 @@ func createRepoList(out *os.File, shell string) (err error) {
 	return nil
 	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)
 	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)
 		os.MkdirAll(filepath.Dir(path), 0755)
 		out, errf := os.Create(path)
 		out, errf := os.Create(path)
 		if errf != nil {
 		if errf != nil {
 			return errf
 			return errf
 		}
 		}
 
 
-		if createAURList(out, shell) != nil {
+		if createAURList(out) != nil {
 			defer os.Remove(path)
 			defer os.Remove(path)
 		}
 		}
-		erra := createRepoList(out, shell)
+		erra := createRepoList(out)
 
 
 		out.Close()
 		out.Close()
 		return erra
 		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)
 	in, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0644)
 	if err != nil {
 	if err != nil {
 		return err
 		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)
 	err = downloadPkgBuildsSources(do.Aur, do.Bases, incompatible)
 	if err != nil {
 	if err != nil {
 		return err
 		return err