diff options
| author | huker667 <huker@tuta.io> | 2026-05-05 23:25:59 +0300 |
|---|---|---|
| committer | huker667 <huker@tuta.io> | 2026-05-05 23:25:59 +0300 |
| commit | d64b4f39839e112d096b9809fdb35e873a1b40fd (patch) | |
| tree | 95e512ee5f9873d4618ba4349c9e172ebb31ad32 | |
| parent | c6fef39af5bec12ab47e24f4df33bd1a210ec823 (diff) | |
| download | qulay-d64b4f39839e112d096b9809fdb35e873a1b40fd.tar.gz qulay-d64b4f39839e112d096b9809fdb35e873a1b40fd.tar.bz2 qulay-d64b4f39839e112d096b9809fdb35e873a1b40fd.zip | |
fixed deps inst
| -rw-r--r-- | main.go | 58 | ||||
| -rw-r--r-- | package/package.go | 103 |
2 files changed, 91 insertions, 70 deletions
@@ -4,19 +4,19 @@ import ( "fmt" "os" "path/filepath" + paths "qulay/config" "qulay/database" - "qulay/config" - "qulay/package" "qulay/helpers" + pkg "qulay/package" "slices" "strings" ) var _name string = filepath.Base(os.Args[0]) -var _cmds = []string{"h", "+", "-", "g", "s", "p", "u", "r", "q", "v"} +var _cmds = []string{"h", "+", "-", "g", "s", "p", "u", "r", "q", "f", "v"} var _root_cmds = []string{"+", "-", "u", "i"} -const _version string = "0.6" +const _version string = "0.7" const _help string = `{_name}: command-line interface to the Qulay Package Manager Usage: {_name} h -> help menu @@ -28,13 +28,15 @@ Usage: {_name} u -> update all repositories {_name} r -> get all repositories URLs {_name} q -> get all installed packages + {_name} f -> get files path for destDir {_name} v -> get {_name} version Options: - :v -> verbose output - :a -> ask before doing - :nl -> disable recording in databases and logs - :nd -> do not download deps - :r -> reinstall already installed deps + :v -> verbose output + :a -> ask before doing + :nl -> disable recording in databases and logs + :nd -> do not download deps + :nrc -> disable uid 0 (root) checks + :r -> reinstall already installed deps Vars: DESTDIR -> path where the package will be installed/removed` @@ -66,12 +68,18 @@ func main() { destDir = "/" } + absDestDir, err := filepath.Abs(destDir) + if err != nil { + fmt.Fprintf(os.Stderr, "!! failed to get absolute path of destDir: %v\n", err) + os.Exit(1) + } + if len(args) == 0 || len(cmds) == 0 { printHelp() os.Exit(1) } - if os.Getuid() != 0 && slices.Contains(_root_cmds, cmds[0]) { + if os.Getuid() != 0 && slices.Contains(_root_cmds, cmds[0]) && !slices.Contains(opts, ":nrc") { fmt.Println("!! this command is root-only. run this with root privileges") os.Exit(1) } @@ -85,7 +93,7 @@ func main() { os.Exit(1) } for _, n := range oths { - err := pkg.Install(n, opts, destDir) + err := pkg.Install(n, opts, absDestDir) if err != nil { fmt.Println("!!", err) os.Exit(1) @@ -97,36 +105,35 @@ func main() { os.Exit(1) } for _, n := range oths { - err := pkg.Remove(n, opts, destDir) + err := pkg.Remove(n, opts, absDestDir) if err != nil { fmt.Println("!!", err) os.Exit(1) } } } else if cmds[0] == "u" { - database.DownloadRepos(database.GetReposUrls(destDir), destDir) + database.DownloadRepos(database.GetReposUrls(absDestDir), absDestDir) } else if cmds[0] == "g" { if len(oths) < 1 { fmt.Println("!! no package(s) received") os.Exit(1) } for _, name := range oths { - fmt.Println(database.GetPackageVersion(name, destDir)) + fmt.Println(database.GetPackageVersion(name, absDestDir)) } } else if cmds[0] == "r" { - for _, url := range database.GetReposUrls(destDir) { + for _, url := range database.GetReposUrls(absDestDir) { fmt.Println(url) } } else if cmds[0] == "q" { - for name, version := range database.ReadInstalled(destDir) { + for name, version := range database.ReadInstalled(absDestDir) { fmt.Println(name, "-", version[0]) } } else if cmds[0] == "s" { if len(oths) < 1 { - pkgs := pkg.GetPackages(destDir) - fmt.Println(pkgs) + pkgs := pkg.GetPackages(absDestDir) for _, p := range pkgs { - if database.IsInstalled(p.Repo + "/" + p.Name, destDir) { + if database.IsInstalled(p.Repo+"/"+p.Name, absDestDir) { fmt.Printf("[+] %s/%s - %v - %v\n", p.Repo, p.Name, p.Data[0], p.Data[1]) } else { fmt.Printf(" %s/%s - %v - %v\n", p.Repo, p.Name, p.Data[0], p.Data[1]) @@ -134,9 +141,9 @@ func main() { } } else { for _, n := range oths { - pkgs := pkg.FindPackages(n, destDir) + pkgs := pkg.FindPackages(n, absDestDir) for _, p := range pkgs { - if database.IsInstalled(p.Repo + "/" + p.Name, destDir) { + if database.IsInstalled(p.Repo+"/"+p.Name, absDestDir) { fmt.Printf("[+] %s/%s - %v - %v\n", p.Repo, p.Name, p.Data[0], p.Data[1]) } else { fmt.Printf(" %s/%s - %v - %v\n", p.Repo, p.Name, p.Data[0], p.Data[1]) @@ -152,7 +159,7 @@ func main() { } if len(oths) >= 1 { for _, n := range oths { - err := database.PurgeRepository(n, destDir) + err := database.PurgeRepository(n, absDestDir) if err != nil { fmt.Println("!!", err) os.Exit(1) @@ -161,6 +168,13 @@ func main() { } } } + } else if cmds[0] == "f" { + fmt.Printf("dest dir: %v\n", destDir) + fmt.Printf("abs dest dir: %v\n", absDestDir) + fmt.Printf("is abs: %v\n", filepath.IsAbs(destDir)) + fmt.Printf("repos urls file: %v\n", filepath.Join(absDestDir, paths.ReposUrlsFile)) + fmt.Printf("repos dir: %v\n", filepath.Join(absDestDir, paths.ReposDir)) + fmt.Printf("installed pkgs database: %v\n", filepath.Join(absDestDir, paths.InstalledFile)) } else if cmds[0] == "v" { fmt.Println(_version) } else { 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 } |