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:
		@@ -14,6 +14,7 @@ import (
 | 
			
		||||
	"packets/internal/utils"
 | 
			
		||||
	packets "packets/pkg"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"github.com/pelletier/go-toml/v2"
 | 
			
		||||
	"github.com/spf13/cobra"
 | 
			
		||||
@@ -162,9 +163,9 @@ var installCmd = &cobra.Command{
 | 
			
		||||
				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 {
 | 
			
		||||
			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()
 | 
			
		||||
 | 
			
		||||
@@ -174,6 +175,11 @@ var installCmd = &cobra.Command{
 | 
			
		||||
		}
 | 
			
		||||
		defer db.Close()
 | 
			
		||||
 | 
			
		||||
		cfg, err := configs.GetConfigTOML()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for _, inputName := range args {
 | 
			
		||||
 | 
			
		||||
			var exist bool
 | 
			
		||||
@@ -192,20 +198,41 @@ var installCmd = &cobra.Command{
 | 
			
		||||
					fmt.Printf(":: Package %s is already installed\n", inputName)
 | 
			
		||||
					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)
 | 
			
		||||
				p, err := packets.GetPackage(inputName)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					log.Fatal(err)
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				cfg, err := configs.GetConfigTOML()
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					log.Fatal(err)
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				reader := bytes.NewReader(p.PackageF)
 | 
			
		||||
				fmt.Printf(":: Installing (%s) \n", inputName)
 | 
			
		||||
				packets.InstallPackage(reader)
 | 
			
		||||
				packets.InstallPackage(reader, filepath.Join(cfg.Config.Data_d, inputName))
 | 
			
		||||
 | 
			
		||||
				if cfg.Config.StorePackages {
 | 
			
		||||
					pkgPath, err := p.Write()
 | 
			
		||||
@@ -259,6 +286,33 @@ var installCmd = &cobra.Command{
 | 
			
		||||
					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)
 | 
			
		||||
				p, err := packets.GetPackage(pkgs[0].Name)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
@@ -272,7 +326,7 @@ var installCmd = &cobra.Command{
 | 
			
		||||
 | 
			
		||||
				reader := bytes.NewReader(p.PackageF)
 | 
			
		||||
				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 {
 | 
			
		||||
					pkgPath, err := p.Write()
 | 
			
		||||
@@ -315,6 +369,33 @@ var installCmd = &cobra.Command{
 | 
			
		||||
					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)
 | 
			
		||||
				p, err := packets.GetPackage(pkgs[choice].Name)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
@@ -328,7 +409,7 @@ var installCmd = &cobra.Command{
 | 
			
		||||
 | 
			
		||||
				reader := bytes.NewReader(p.PackageF)
 | 
			
		||||
				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 {
 | 
			
		||||
					pkgPath, err := p.Write()
 | 
			
		||||
@@ -357,3 +438,41 @@ func main() {
 | 
			
		||||
	rootCmd.AddCommand(syncCmd)
 | 
			
		||||
	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
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@ import (
 | 
			
		||||
	"packets/internal/consts"
 | 
			
		||||
	errors_packets "packets/internal/errors"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/klauspost/compress/zstd"
 | 
			
		||||
	"github.com/pelletier/go-toml/v2"
 | 
			
		||||
@@ -255,3 +256,19 @@ func CheckIfPackageInstalled(name string) (bool, error) {
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								pkg/main.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								pkg/main.go
									
									
									
									
									
								
							@@ -8,10 +8,10 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"packets/configs"
 | 
			
		||||
	"packets/internal/consts"
 | 
			
		||||
	errors_packets "packets/internal/errors"
 | 
			
		||||
	"packets/internal/utils"
 | 
			
		||||
 | 
			
		||||
	utils_lua "packets/internal/utils/lua"
 | 
			
		||||
	"path"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
@@ -23,22 +23,13 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		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)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user