PackageManager just because
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
1.9 KiB

  1. package Package
  2. import (
  3. "fmt"
  4. "os"
  5. "os/exec"
  6. "PackageManager/Archive"
  7. "PackageManager/Client/Database"
  8. "PackageManager/Variables"
  9. )
  10. func runInstallCmd(cmdStrs []string) error {
  11. var (
  12. cmd *exec.Cmd
  13. cmdStr string
  14. err error
  15. )
  16. if len(cmdStrs) == 0 {
  17. return nil
  18. }
  19. for _, cmdStr = range cmdStrs {
  20. cmd = exec.Command("/bin/sh", "-c", cmdStr)
  21. cmd.Dir = Variables.RootDir
  22. cmd.Stdin = os.Stdin
  23. cmd.Stdout = os.Stdout
  24. cmd.Stderr = os.Stderr
  25. err = cmd.Run()
  26. if err != nil {
  27. return err
  28. }
  29. }
  30. return nil
  31. }
  32. func CheckPackageDependancies(deps map[string]string) ([]int64, error) {
  33. var (
  34. name, version string
  35. depIds []int64
  36. id int64
  37. e error
  38. )
  39. for name, version = range deps {
  40. id, e = Database.IsPackageInstalled(name, version)
  41. if e != nil {
  42. return depIds, e
  43. }
  44. depIds = append(depIds, id)
  45. }
  46. return depIds, e
  47. }
  48. func InstallPackage(pkgs []string) error {
  49. var (
  50. manifest Manifest
  51. depIds []int64
  52. pkg string
  53. mStr string
  54. e error
  55. )
  56. for _, pkg = range pkgs {
  57. _, e = os.Stat(pkg)
  58. if os.IsNotExist(e) {
  59. return fmt.Errorf("invalid package %s", pkg)
  60. }
  61. }
  62. for _, pkg = range pkgs {
  63. fmt.Printf(
  64. "Installing %s...\n",
  65. pkg,
  66. )
  67. mStr, e = Archive.ExtractManifestFile(pkg)
  68. if e != nil {
  69. return e
  70. }
  71. manifest, e = ParseManifestFile(mStr)
  72. if e != nil {
  73. return e
  74. }
  75. if !Variables.IgnoreDepsCheck {
  76. depIds, e = CheckPackageDependancies(manifest.Dependancies)
  77. if e != nil {
  78. return e
  79. }
  80. }
  81. e = runInstallCmd(manifest.PreInstallCmds)
  82. if e != nil {
  83. return e
  84. }
  85. e = Archive.ExtractArchive(pkg, Variables.RootDir)
  86. if e != nil {
  87. return e
  88. }
  89. e = runInstallCmd(manifest.PostInstallCmds)
  90. if e != nil {
  91. return e
  92. }
  93. e = Database.InsertPackage(manifest.Name, manifest.Version, depIds)
  94. if e != nil {
  95. return e
  96. }
  97. fmt.Printf(
  98. "%s successfully installed\n",
  99. pkg,
  100. )
  101. }
  102. return nil
  103. }