now InstallPackage function from packets package don't try to read a config.toml, it get the path to install by a param; added async dependency install process

This commit is contained in:
2025-09-21 22:52:03 -03:00
parent f34308367e
commit ff986ef943
3 changed files with 148 additions and 21 deletions

View File

@@ -14,6 +14,7 @@ import (
"packets/internal/utils" "packets/internal/utils"
packets "packets/pkg" packets "packets/pkg"
"path/filepath" "path/filepath"
"sync"
"github.com/pelletier/go-toml/v2" "github.com/pelletier/go-toml/v2"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@@ -162,9 +163,9 @@ var installCmd = &cobra.Command{
log.Fatal("index.db does not exist, try to use \"packets sync\"") log.Fatal("index.db does not exist, try to use \"packets sync\"")
} }
} }
f, err := os.OpenFile(consts.IndexDB, os.O_WRONLY, 0) f, err := os.OpenFile(consts.InstalledDB, os.O_WRONLY, 0)
if err != nil { if err != nil {
log.Fatalf("can't open [ %s ]. Are you running packets as root?\n", consts.IndexDB) log.Fatalf("can't open [ %s ]. Are you running packets as root?\n", consts.InstalledDB)
} }
f.Close() f.Close()
@@ -174,6 +175,11 @@ var installCmd = &cobra.Command{
} }
defer db.Close() defer db.Close()
cfg, err := configs.GetConfigTOML()
if err != nil {
log.Fatal(err)
}
for _, inputName := range args { for _, inputName := range args {
var exist bool var exist bool
@@ -192,20 +198,41 @@ var installCmd = &cobra.Command{
fmt.Printf(":: Package %s is already installed\n", inputName) fmt.Printf(":: Package %s is already installed\n", inputName)
continue continue
} }
fmt.Printf(":: Checking dependencies of (%s)\n", inputName)
dependencies, err := utils.GetDependencies(inputName)
if err != nil {
log.Fatal(err)
}
if len(dependencies) > 0 {
var wg sync.WaitGroup
var mu sync.Mutex
fmt.Printf(":: Packets will install %s and %d dependencies\nPackages to install:\n", inputName, len(dependencies))
fmt.Println(dependencies)
fmt.Println("Are you sure? (y/N)")
var a string
fmt.Scanf("%s", &a)
if a != "y" && a != "Y" {
os.Exit(1)
}
for _, depn := range dependencies {
wg.Add(1)
go AyncFullInstall(depn, cfg.Config.StorePackages, filepath.Join(cfg.Config.Data_d, inputName), &wg, &mu)
}
wg.Wait()
}
fmt.Printf(":: Downloading (%s) \n", inputName) fmt.Printf(":: Downloading (%s) \n", inputName)
p, err := packets.GetPackage(inputName) p, err := packets.GetPackage(inputName)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
cfg, err := configs.GetConfigTOML()
if err != nil {
log.Fatal(err)
}
reader := bytes.NewReader(p.PackageF) reader := bytes.NewReader(p.PackageF)
fmt.Printf(":: Installing (%s) \n", inputName) fmt.Printf(":: Installing (%s) \n", inputName)
packets.InstallPackage(reader) packets.InstallPackage(reader, filepath.Join(cfg.Config.Data_d, inputName))
if cfg.Config.StorePackages { if cfg.Config.StorePackages {
pkgPath, err := p.Write() pkgPath, err := p.Write()
@@ -259,6 +286,33 @@ var installCmd = &cobra.Command{
continue continue
} }
fmt.Printf(":: Checking dependencies of (%s)\n", pkgs[0].Name)
dependencies, err := utils.GetDependencies(pkgs[0].Name)
if err != nil {
log.Fatal(err)
}
if len(dependencies) > 0 {
var wg sync.WaitGroup
var mu sync.Mutex
fmt.Printf(":: Packets will install %s and %d dependencies\nPackages to install:\n", pkgs[0].Name, len(dependencies))
fmt.Println(dependencies)
fmt.Println("Are you sure? (y/N)")
var a string
fmt.Scanf("%s", &a)
if a != "y" && a != "Y" {
os.Exit(1)
}
for _, depn := range dependencies {
wg.Add(1)
go AyncFullInstall(depn, cfg.Config.StorePackages, filepath.Join(cfg.Config.Data_d, inputName), &wg, &mu)
}
wg.Wait()
}
fmt.Printf(":: Downloading %s \n", pkgs[0].Name) fmt.Printf(":: Downloading %s \n", pkgs[0].Name)
p, err := packets.GetPackage(pkgs[0].Name) p, err := packets.GetPackage(pkgs[0].Name)
if err != nil { if err != nil {
@@ -272,7 +326,7 @@ var installCmd = &cobra.Command{
reader := bytes.NewReader(p.PackageF) reader := bytes.NewReader(p.PackageF)
fmt.Printf(":: Installing %s \n", pkgs[0].Name) fmt.Printf(":: Installing %s \n", pkgs[0].Name)
packets.InstallPackage(reader) packets.InstallPackage(reader, filepath.Join(cfg.Config.Data_d, pkgs[0].Name))
if cfg.Config.StorePackages { if cfg.Config.StorePackages {
pkgPath, err := p.Write() pkgPath, err := p.Write()
@@ -315,6 +369,33 @@ var installCmd = &cobra.Command{
continue continue
} }
fmt.Printf(":: Checking dependencies of (%s)\n", pkgs[choice].Name)
dependencies, err := utils.GetDependencies(pkgs[choice].Name)
if err != nil {
log.Fatal(err)
}
if len(dependencies) > 0 {
var wg sync.WaitGroup
var mu sync.Mutex
fmt.Printf(":: Packets will install %s and %d dependencies\nPackages to install:\n", pkgs[choice].Name, len(dependencies))
fmt.Println(dependencies)
fmt.Println("Are you sure? (y/N)")
var a string
fmt.Scanf("%s", &a)
if a != "y" && a != "Y" {
os.Exit(1)
}
for _, depn := range dependencies {
wg.Add(1)
go AyncFullInstall(depn, cfg.Config.StorePackages, filepath.Join(cfg.Config.Data_d, pkgs[choice].Name), &wg, &mu)
}
wg.Wait()
}
fmt.Printf(":: Downloading %s \n", pkgs[choice].Name) fmt.Printf(":: Downloading %s \n", pkgs[choice].Name)
p, err := packets.GetPackage(pkgs[choice].Name) p, err := packets.GetPackage(pkgs[choice].Name)
if err != nil { if err != nil {
@@ -328,7 +409,7 @@ var installCmd = &cobra.Command{
reader := bytes.NewReader(p.PackageF) reader := bytes.NewReader(p.PackageF)
fmt.Printf(":: Installing (%s) \n", pkgs[choice].Name) fmt.Printf(":: Installing (%s) \n", pkgs[choice].Name)
packets.InstallPackage(reader) packets.InstallPackage(reader, filepath.Join(cfg.Config.Data_d, pkgs[choice].Name))
if cfg.Config.StorePackages { if cfg.Config.StorePackages {
pkgPath, err := p.Write() pkgPath, err := p.Write()
@@ -357,3 +438,41 @@ func main() {
rootCmd.AddCommand(syncCmd) rootCmd.AddCommand(syncCmd)
rootCmd.Execute() rootCmd.Execute()
} }
func AyncFullInstall(dep string, storePackages bool, installPath string, wg *sync.WaitGroup, mu *sync.Mutex) {
defer wg.Done()
fmt.Printf("Downloading %s \n", dep)
p, err := packets.GetPackage(dep)
if err != nil {
log.Println("--ERROR--\n", err)
return
}
reader := bytes.NewReader(p.PackageF)
fmt.Printf("Installing %s \n", dep)
packets.InstallPackage(reader, installPath)
if storePackages {
pkgPath, err := p.Write()
if err != nil {
log.Println("--ERROR--\n", err)
return
}
mu.Lock()
defer mu.Unlock()
err = p.AddToInstalledDB(1, pkgPath)
if err != nil {
log.Println("--ERROR--\n", err)
return
}
} else {
mu.Lock()
defer mu.Unlock()
err := p.AddToInstalledDB(0, "")
if err != nil {
log.Println("--ERROR--\n", err)
return
}
}
}

View File

@@ -12,6 +12,7 @@ import (
"packets/internal/consts" "packets/internal/consts"
errors_packets "packets/internal/errors" errors_packets "packets/internal/errors"
"path/filepath" "path/filepath"
"strings"
"github.com/klauspost/compress/zstd" "github.com/klauspost/compress/zstd"
"github.com/pelletier/go-toml/v2" "github.com/pelletier/go-toml/v2"
@@ -255,3 +256,19 @@ func CheckIfPackageInstalled(name string) (bool, error) {
return exists, nil return exists, nil
} }
func GetDependencies(name string) ([]string, error) {
db, err := sql.Open("sqlite", consts.InstalledDB)
if err != nil {
return []string{}, err
}
defer db.Close()
var dependenciesRaw string
if err := db.QueryRow("SELECT dependencies FROM packages WHERE name = ?", name).Scan(&dependenciesRaw); err != nil {
return []string{}, err
}
return strings.Fields(dependenciesRaw), nil
}

View File

@@ -8,10 +8,10 @@ import (
"fmt" "fmt"
"io" "io"
"os" "os"
"packets/configs"
"packets/internal/consts" "packets/internal/consts"
errors_packets "packets/internal/errors" errors_packets "packets/internal/errors"
"packets/internal/utils" "packets/internal/utils"
utils_lua "packets/internal/utils/lua" utils_lua "packets/internal/utils/lua"
"path" "path"
"path/filepath" "path/filepath"
@@ -23,22 +23,13 @@ import (
) )
// Install exctract and fully install from a package file ( tar.zst ) // Install exctract and fully install from a package file ( tar.zst )
func InstallPackage(file io.Reader) error { func InstallPackage(file io.Reader, destDir string) error {
manifest, err := utils.ReadManifest(file) manifest, err := utils.ReadManifest(file)
if err != nil { if err != nil {
return err return err
} }
name := manifest.Info.Name
configuration, err := configs.GetConfigTOML()
if err != nil {
return err
}
destDir := filepath.Join(configuration.Config.Data_d, name)
zstdReader, err := zstd.NewReader(file) zstdReader, err := zstd.NewReader(file)
if err != nil { if err != nil {
return err return err