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.

116 lines
1.8 KiB

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