From c5c2e906d346581960a0cbeae85de5a82218d5f9 Mon Sep 17 00:00:00 2001 From: Jguer Date: Sat, 5 Oct 2019 02:02:30 +0100 Subject: [PATCH 1/2] Move completion to submodule --- Makefile | 2 +- cmd.go | 5 +- completions.go | 91 ----------------------------------- install.go | 3 +- pkg/completion/completion.go | 93 ++++++++++++++++++++++++++++++++++++ 5 files changed, 99 insertions(+), 95 deletions(-) delete mode 100644 completions.go create mode 100644 pkg/completion/completion.go diff --git a/Makefile b/Makefile index 5b23318d..669f4f72 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ clean: .PHONY: test test: test-vendor - $(GO) vet . + $(GO) vet ./... @test -z "$$(gofmt -l *.go)" || (echo "Files need to be linted. Use make fmt" && false) $(GO) test -mod=vendor --race -covermode=atomic -v . ./pkg/... diff --git a/cmd.go b/cmd.go index 2dafe858..d6a798a9 100644 --- a/cmd.go +++ b/cmd.go @@ -7,6 +7,7 @@ import ( "os" alpm "github.com/Jguer/go-alpm" + "github.com/Jguer/yay/v9/pkg/completion" ) var cmdArgs = makeArguments() @@ -205,9 +206,9 @@ func handlePrint() (err error) { case cmdArgs.existsArg("w", "news"): err = printNewsFeed() case cmdArgs.existsDouble("c", "complete"): - complete(true) + err = completion.Show(alpmHandle, config.AURURL, config.BuildDir, config.CompletionInterval, true) case cmdArgs.existsArg("c", "complete"): - complete(false) + err = completion.Show(alpmHandle, config.AURURL, config.BuildDir, config.CompletionInterval, false) case cmdArgs.existsArg("s", "stats"): err = localStatistics() default: diff --git a/completions.go b/completions.go deleted file mode 100644 index 7dcc671b..00000000 --- a/completions.go +++ /dev/null @@ -1,91 +0,0 @@ -package main - -import ( - "bufio" - "io" - "net/http" - "os" - "path/filepath" - "time" - - alpm "github.com/Jguer/go-alpm" -) - -//CreateAURList creates a new completion file -func createAURList(out *os.File) (err error) { - resp, err := http.Get(config.AURURL + "/packages.gz") - if err != nil { - return err - } - defer resp.Body.Close() - - scanner := bufio.NewScanner(resp.Body) - - scanner.Scan() - for scanner.Scan() { - out.WriteString(scanner.Text()) - out.WriteString("\tAUR\n") - } - - return nil -} - -//CreatePackageList appends Repo packages to completion cache -func createRepoList(out *os.File) (err error) { - dbList, err := alpmHandle.SyncDBs() - if err != nil { - return - } - - _ = dbList.ForEach(func(db alpm.DB) error { - _ = db.PkgCache().ForEach(func(pkg alpm.Package) error { - out.WriteString(pkg.Name()) - out.WriteString("\t" + pkg.DB().Name() + "\n") - return nil - }) - return nil - }) - return nil -} - -func updateCompletion(force bool) error { - path := filepath.Join(cacheHome, "completion.cache") - info, err := os.Stat(path) - - if os.IsNotExist(err) || (config.CompletionInterval != -1 && time.Since(info.ModTime()).Hours() >= float64(config.CompletionInterval*24)) || force { - os.MkdirAll(filepath.Dir(path), 0755) - out, errf := os.Create(path) - if errf != nil { - return errf - } - - if createAURList(out) != nil { - defer os.Remove(path) - } - 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 - } - defer in.Close() - - _, err = io.Copy(os.Stdout, in) - return err -} diff --git a/install.go b/install.go index 45f42830..43b7be37 100644 --- a/install.go +++ b/install.go @@ -10,6 +10,7 @@ import ( "sync" alpm "github.com/Jguer/go-alpm" + "github.com/Jguer/yay/v9/pkg/completion" gosrc "github.com/Morganamilo/go-srcinfo" ) @@ -315,7 +316,7 @@ func install(parser *arguments) (err error) { } } - go updateCompletion(false) + go completion.Update(alpmHandle, config.AURURL, config.BuildDir, config.CompletionInterval, false) err = downloadPkgbuildsSources(do.Aur, incompatible) if err != nil { diff --git a/pkg/completion/completion.go b/pkg/completion/completion.go new file mode 100644 index 00000000..b0ecc39a --- /dev/null +++ b/pkg/completion/completion.go @@ -0,0 +1,93 @@ +package completion + +import ( + "bufio" + "io" + "net/http" + "os" + "path/filepath" + "time" + + alpm "github.com/Jguer/go-alpm" +) + +// Show provides completion info for shells +func Show(alpmHandle *alpm.Handle, aurURL string, cacheDir string, interval int, force bool) error { + path := filepath.Join(cacheDir, "completion.cache") + + err := Update(alpmHandle, aurURL, cacheDir, interval, force) + if err != nil { + return err + } + + in, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0644) + if err != nil { + return err + } + defer in.Close() + + _, err = io.Copy(os.Stdout, in) + return err +} + +// Update updates completion cache to be used by Complete +func Update(alpmHandle *alpm.Handle, aurURL string, cacheDir string, interval int, force bool) error { + path := filepath.Join(cacheDir, "completion.cache") + info, err := os.Stat(path) + + if os.IsNotExist(err) || (interval != -1 && time.Since(info.ModTime()).Hours() >= float64(interval*24)) || force { + os.MkdirAll(filepath.Dir(path), 0755) + out, errf := os.Create(path) + if errf != nil { + return errf + } + + if createAURList(aurURL, out) != nil { + defer os.Remove(path) + } + erra := createRepoList(alpmHandle, out) + + out.Close() + return erra + } + + return nil +} + +//CreateAURList creates a new completion file +func createAURList(aurURL string, out io.ReadWriteSeeker) error { + resp, err := http.Get(aurURL + "/packages.gz") + if err != nil { + return err + } + defer resp.Body.Close() + + scanner := bufio.NewScanner(resp.Body) + + scanner.Scan() + for scanner.Scan() { + _, err = io.WriteString(out, scanner.Text()+"\tAUR\n") + if err != nil { + return err + } + } + + return nil +} + +//CreatePackageList appends Repo packages to completion cache +func createRepoList(alpmHandle *alpm.Handle, out io.ReadWriteSeeker) error { + dbList, err := alpmHandle.SyncDBs() + if err != nil { + return err + } + + _ = dbList.ForEach(func(db alpm.DB) error { + _ = db.PkgCache().ForEach(func(pkg alpm.Package) error { + _, err = io.WriteString(out, pkg.Name()+"\t"+pkg.DB().Name()+"\n") + return err + }) + return nil + }) + return nil +} From 5fa355781720cf81c7a3f2e453310e64e37fcda0 Mon Sep 17 00:00:00 2001 From: Jguer Date: Sat, 5 Oct 2019 02:10:15 +0100 Subject: [PATCH 2/2] Store completions in yay's cache folder instead of build directory --- cmd.go | 4 ++-- install.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd.go b/cmd.go index d6a798a9..596b5854 100644 --- a/cmd.go +++ b/cmd.go @@ -206,9 +206,9 @@ func handlePrint() (err error) { case cmdArgs.existsArg("w", "news"): err = printNewsFeed() case cmdArgs.existsDouble("c", "complete"): - err = completion.Show(alpmHandle, config.AURURL, config.BuildDir, config.CompletionInterval, true) + err = completion.Show(alpmHandle, config.AURURL, cacheHome, config.CompletionInterval, true) case cmdArgs.existsArg("c", "complete"): - err = completion.Show(alpmHandle, config.AURURL, config.BuildDir, config.CompletionInterval, false) + err = completion.Show(alpmHandle, config.AURURL, cacheHome, config.CompletionInterval, false) case cmdArgs.existsArg("s", "stats"): err = localStatistics() default: diff --git a/install.go b/install.go index 43b7be37..d5e42be9 100644 --- a/install.go +++ b/install.go @@ -316,7 +316,7 @@ func install(parser *arguments) (err error) { } } - go completion.Update(alpmHandle, config.AURURL, config.BuildDir, config.CompletionInterval, false) + go completion.Update(alpmHandle, config.AURURL, cacheHome, config.CompletionInterval, false) err = downloadPkgbuildsSources(do.Aur, incompatible) if err != nil {