diff options
Diffstat (limited to 'package/package.go')
| -rw-r--r-- | package/package.go | 103 |
1 files changed, 55 insertions, 48 deletions
diff --git a/package/package.go b/package/package.go index 8681717..826b2ad 100644 --- a/package/package.go +++ b/package/package.go @@ -1,29 +1,30 @@ package pkg import ( - "fmt" "bufio" + "errors" + "fmt" "slices" "strings" - "errors" + // "slices" // "strconv" "os" "os/exec" "path/filepath" + paths "qulay/config" "qulay/database" "qulay/helpers" - "qulay/config" - + "codeberg.org/UzbekLinux/uzbekdb-go" ) var _name string = filepath.Base(os.Args[0]) type Package struct { - Name string - Repo string - Data []interface{} + Name string + Repo string + Data []interface{} } func randomTempDir(destDir string) string { @@ -58,31 +59,31 @@ func isNewFormat(path string) bool { } func GetPackages(destDir string) []Package { - var found []Package - entries, _ := os.ReadDir(filepath.Join(destDir, paths.ReposDir)) - for _, e := range entries { - if !e.IsDir() { - continue - } - data, err := os.ReadFile(filepath.Join(destDir, paths.ReposDir, e.Name(), "pkgs")) - if err != nil { - continue - } - pkgs, ok := uzbekdb.Loads(string(data), "map").(map[interface{}][]interface{}) - if !ok { - continue - } - for name, val := range pkgs { - found = append(found, Package{fmt.Sprintf("%v", name), e.Name(), val}) - } - } + var found []Package + entries, _ := os.ReadDir(filepath.Join(destDir, paths.ReposDir)) + for _, e := range entries { + if !e.IsDir() { + continue + } + data, err := os.ReadFile(filepath.Join(destDir, paths.ReposDir, e.Name(), "pkgs")) + if err != nil { + continue + } + pkgs, ok := uzbekdb.Loads(string(data), "map").(map[interface{}][]interface{}) + if !ok { + continue + } + for name, val := range pkgs { + found = append(found, Package{fmt.Sprintf("%v", name), e.Name(), val}) + } + } slices.SortFunc(found, func(a, b Package) int { - if n := strings.Compare(a.Repo, b.Repo); n != 0 { - return n - } - return strings.Compare(a.Name, b.Name) + if n := strings.Compare(a.Repo, b.Repo); n != 0 { + return n + } + return strings.Compare(a.Name, b.Name) }) - return found + return found } func FindPackages(name string, destDir string) []Package { @@ -90,14 +91,14 @@ func FindPackages(name string, destDir string) []Package { var packages = GetPackages(destDir) var splitName = false var repo string - + if strings.Contains(name, "/") { splitName = true parts := strings.SplitN(name, "/", 2) repo = parts[0] name = parts[1] } - + for _, e := range packages { if splitName { if e.Name == name && e.Repo == repo { @@ -119,7 +120,7 @@ func getPackage(name string, destDir string) (*Package, error) { parts := strings.SplitN(name, "/", 2) repo := parts[0] name = parts[1] - pkgs = FindPackages(repo + "/" + name, destDir) + pkgs = FindPackages(repo+"/"+name, destDir) if len(pkgs) == 0 { return nil, errors.New("no packages found with name " + name + " in " + repo + " repository") } else if len(pkgs) == 1 { @@ -150,7 +151,6 @@ func Install(name string, args []string, destDir string) error { // verbose := slices.Contains(args, ":v") reinstall := slices.Contains(args, ":r") disableDeps := slices.Contains(args, ":nd") - pkg, err := getPackage(name, destDir) if err != nil { return err @@ -162,16 +162,16 @@ func Install(name string, args []string, destDir string) error { if len(depends) != 0 { fmt.Println(helpers.ToString(len(depends)) + " depends for " + pkg.Repo + "/" + pkg.Name + ":") for i, n := range depends { - if n == pkg.Name || n == pkg.Repo + "/" + pkg.Name { + if n == pkg.Name || n == pkg.Repo+"/"+pkg.Name { return errors.New("broken depends in package " + n) } - + depPkgs := FindPackages(n, destDir) v := "not found" - if len(depPkgs) > 0 { + if len(depPkgs) > 0 { v = fmt.Sprintf("%v", depPkgs[0].Data[1]) } - + fmt.Printf("%v. %s - %v\n", i+1, n, v) } } @@ -183,8 +183,15 @@ func Install(name string, args []string, destDir string) error { } if !disableDeps { for _, dep := range depends { - if !database.IsInstalled(dep, destDir) || reinstall { - err := Install(dep, args, destDir) + depPkg, err := getPackage(dep, destDir) + if err != nil { + return err + } + + fullName := depPkg.Repo + "/" + depPkg.Name + + if !database.IsInstalled(fullName, destDir) || reinstall { + err := Install(fullName, args, destDir) if err != nil { return err } @@ -195,7 +202,7 @@ func Install(name string, args []string, destDir string) error { if !isNewFormat(pkgPath) { cmd := exec.Command("sh", "install.sh") cmd.Dir = pkgPath - cmd.Env = os.Environ() + cmd.Env = append(os.Environ(), "DESTDIR="+destDir) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err := cmd.Run() @@ -204,7 +211,7 @@ func Install(name string, args []string, destDir string) error { } } - err = database.RegPackage(pkg.Repo + "/" + pkg.Name, helpers.ToString(pkg.Data[1]), destDir) + err = database.RegPackage(pkg.Repo+"/"+pkg.Name, helpers.ToString(pkg.Data[1]), destDir) if err != nil { return errors.New("failed to register package in installed database: " + err.Error()) } @@ -217,10 +224,10 @@ func Remove(name string, args []string, destDir string) error { if err != nil { return err } - + if slices.Contains(args, ":a") { - if !helpers.Ask("remove " + pkg.Repo + "/" + pkg.Name + " with repo version " + helpers.ToString(pkg.Data[1]) + - " and local version " + database.GetPackageVersion(pkg.Repo + "/" + pkg.Name, destDir) + "?") { + if !helpers.Ask("remove " + pkg.Repo + "/" + pkg.Name + " with repo version " + helpers.ToString(pkg.Data[1]) + + " and local version " + database.GetPackageVersion(pkg.Repo+"/"+pkg.Name, destDir) + "?") { return errors.New("canceled by user") } } @@ -238,13 +245,13 @@ func Remove(name string, args []string, destDir string) error { return err } } - - err = database.UnRegPackage(pkg.Repo + "/" + pkg.Name, destDir) + + err = database.UnRegPackage(pkg.Repo+"/"+pkg.Name, destDir) if err != nil { return err } v := helpers.ToString(pkg.Data[1]) fmt.Println(":: " + pkg.Repo + "/" + pkg.Name + " (" + v + ") removed") - return nil + return nil } |