completions.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package main
  2. import (
  3. "bufio"
  4. "io"
  5. "net/http"
  6. "os"
  7. "path/filepath"
  8. "time"
  9. alpm "github.com/jguer/go-alpm"
  10. )
  11. //CreateAURList creates a new completion file
  12. func createAURList(out *os.File) (err error) {
  13. resp, err := http.Get(config.AURURL + "/packages.gz")
  14. if err != nil {
  15. return err
  16. }
  17. defer resp.Body.Close()
  18. scanner := bufio.NewScanner(resp.Body)
  19. scanner.Scan()
  20. for scanner.Scan() {
  21. out.WriteString(scanner.Text())
  22. out.WriteString("\tAUR\n")
  23. }
  24. return nil
  25. }
  26. //CreatePackageList appends Repo packages to completion cache
  27. func createRepoList(out *os.File) (err error) {
  28. dbList, err := alpmHandle.SyncDbs()
  29. if err != nil {
  30. return
  31. }
  32. _ = dbList.ForEach(func(db alpm.Db) error {
  33. _ = db.PkgCache().ForEach(func(pkg alpm.Package) error {
  34. out.WriteString(pkg.Name())
  35. out.WriteString("\t" + pkg.DB().Name() + "\n")
  36. return nil
  37. })
  38. return nil
  39. })
  40. return nil
  41. }
  42. func updateCompletion(force bool) error {
  43. path := filepath.Join(cacheHome, "completion.cache")
  44. info, err := os.Stat(path)
  45. if os.IsNotExist(err) || (config.CompletionInterval != -1 && time.Since(info.ModTime()).Hours() >= float64(config.CompletionInterval*24)) || force {
  46. os.MkdirAll(filepath.Dir(path), 0755)
  47. out, errf := os.Create(path)
  48. if errf != nil {
  49. return errf
  50. }
  51. if createAURList(out) != nil {
  52. defer os.Remove(path)
  53. }
  54. erra := createRepoList(out)
  55. out.Close()
  56. return erra
  57. }
  58. return nil
  59. }
  60. // Complete provides completion info for shells
  61. func complete(force bool) error {
  62. path := filepath.Join(cacheHome, "completion.cache")
  63. err := updateCompletion(force)
  64. if err != nil {
  65. return err
  66. }
  67. in, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0644)
  68. if err != nil {
  69. return err
  70. }
  71. defer in.Close()
  72. _, err = io.Copy(os.Stdout, in)
  73. return err
  74. }