mirror of
https://github.com/mudler/luet.git
synced 2025-08-05 17:34:21 +00:00
Review install phase
This commit is contained in:
parent
a71e1a6f1d
commit
01e66ee0b4
@ -22,6 +22,7 @@ import (
|
|||||||
installer "github.com/mudler/luet/pkg/installer"
|
installer "github.com/mudler/luet/pkg/installer"
|
||||||
|
|
||||||
. "github.com/mudler/luet/pkg/config"
|
. "github.com/mudler/luet/pkg/config"
|
||||||
|
"github.com/mudler/luet/pkg/helpers"
|
||||||
. "github.com/mudler/luet/pkg/logger"
|
. "github.com/mudler/luet/pkg/logger"
|
||||||
pkg "github.com/mudler/luet/pkg/package"
|
pkg "github.com/mudler/luet/pkg/package"
|
||||||
|
|
||||||
@ -62,31 +63,22 @@ var installCmd = &cobra.Command{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// This shouldn't be necessary, but we need to unmarshal the repositories to a concrete struct, thus we need to port them back to the Repositories type
|
// This shouldn't be necessary, but we need to unmarshal the repositories to a concrete struct, thus we need to port them back to the Repositories type
|
||||||
synced := installer.Repositories{}
|
repos := installer.Repositories{}
|
||||||
for _, repo := range LuetCfg.SystemRepositories {
|
for _, repo := range LuetCfg.SystemRepositories {
|
||||||
if !repo.Enable {
|
if !repo.Enable {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
repo := installer.NewSystemRepository(&repo)
|
||||||
toSync := installer.NewSystemRepository(&repo)
|
repos = append(repos, repo)
|
||||||
s, err := toSync.Sync()
|
|
||||||
if err != nil {
|
|
||||||
Fatal("Error: " + err.Error())
|
|
||||||
}
|
|
||||||
synced = append(synced, s)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inst := installer.NewLuetInstaller(LuetCfg.GetGeneral().Concurrency)
|
inst := installer.NewLuetInstaller(LuetCfg.GetGeneral().Concurrency)
|
||||||
inst.Repositories(synced)
|
inst.Repositories(repos)
|
||||||
|
inst.SyncRepositories()
|
||||||
|
|
||||||
if LuetCfg.GetSystem().DatabaseEngine == "boltdb" {
|
if LuetCfg.GetSystem().DatabaseEngine == "boltdb" {
|
||||||
os.MkdirAll(
|
|
||||||
filepath.Join(LuetCfg.GetSystem().Rootfs, LuetCfg.GetSystem().DatabasePath),
|
|
||||||
os.ModePerm,
|
|
||||||
)
|
|
||||||
systemDB = pkg.NewBoltDatabase(
|
systemDB = pkg.NewBoltDatabase(
|
||||||
filepath.Join(LuetCfg.GetSystem().Rootfs,
|
filepath.Join(helpers.GetSystemRepoDatabaseDirPath(), "luet.db"))
|
||||||
filepath.Join(LuetCfg.GetSystem().DatabasePath, "luet.db")))
|
|
||||||
} else {
|
} else {
|
||||||
systemDB = pkg.NewInMemoryDatabase(true)
|
systemDB = pkg.NewInMemoryDatabase(true)
|
||||||
}
|
}
|
||||||
|
37
pkg/helpers/repository.go
Normal file
37
pkg/helpers/repository.go
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
// Copyright © 2019 Ettore Di Giacinto <mudler@gentoo.org>
|
||||||
|
// Daniele Rondina <geaaru@sabayonlinux.org>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation; either version 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
package helpers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/mudler/luet/pkg/config"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetRepoDatabaseDirPath(name string) string {
|
||||||
|
dbpath := filepath.Join(config.LuetCfg.GetSystem().Rootfs, config.LuetCfg.GetSystem().DatabasePath)
|
||||||
|
dbpath = filepath.Join(dbpath, "repos/"+name)
|
||||||
|
os.MkdirAll(dbpath, os.ModePerm)
|
||||||
|
return dbpath
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSystemRepoDatabaseDirPath() string {
|
||||||
|
dbpath := filepath.Join(config.LuetCfg.GetSystem().Rootfs, config.LuetCfg.GetSystem().DatabasePath)
|
||||||
|
os.MkdirAll(dbpath, os.ModePerm)
|
||||||
|
return dbpath
|
||||||
|
}
|
@ -69,6 +69,7 @@ func (c *HttpClient) DownloadArtifact(artifact compiler.Artifact) (compiler.Arti
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Debug("Copying file ", filepath.Join(temp, artifactName), "to", file.Name())
|
||||||
err = helpers.CopyFile(filepath.Join(temp, artifactName), file.Name())
|
err = helpers.CopyFile(filepath.Join(temp, artifactName), file.Name())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
|
@ -91,26 +91,15 @@ func NewLuetInstaller(concurrency int) Installer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (l *LuetInstaller) Upgrade(s *System) error {
|
func (l *LuetInstaller) Upgrade(s *System) error {
|
||||||
Spinner(32)
|
|
||||||
defer SpinnerStop()
|
|
||||||
syncedRepos := Repositories{}
|
|
||||||
for _, r := range l.PackageRepositories {
|
|
||||||
repo, err := r.Sync()
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrap(err, "Failed syncing repository: "+r.GetName())
|
|
||||||
}
|
|
||||||
syncedRepos = append(syncedRepos, repo)
|
|
||||||
}
|
|
||||||
|
|
||||||
// compute what to install and from where
|
// compute what to install and from where
|
||||||
sort.Sort(syncedRepos)
|
sort.Sort(l.PackageRepositories)
|
||||||
|
|
||||||
// First match packages against repositories by priority
|
// First match packages against repositories by priority
|
||||||
// matches := syncedRepos.PackageMatches(p)
|
// matches := syncedRepos.PackageMatches(p)
|
||||||
|
allRepos := pkg.NewInMemoryDatabase(false)
|
||||||
|
l.PackageRepositories.SyncDatabase(allRepos)
|
||||||
|
|
||||||
// compute a "big" world
|
// compute a "big" world
|
||||||
allRepos := pkg.NewInMemoryDatabase(false)
|
|
||||||
syncedRepos.SyncDatabase(allRepos)
|
|
||||||
solv := solver.NewSolver(s.Database, allRepos, pkg.NewInMemoryDatabase(false))
|
solv := solver.NewSolver(s.Database, allRepos, pkg.NewInMemoryDatabase(false))
|
||||||
uninstall, solution, err := solv.Upgrade()
|
uninstall, solution, err := solv.Upgrade()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -134,8 +123,27 @@ func (l *LuetInstaller) Upgrade(s *System) error {
|
|||||||
return l.Install(toInstall, s)
|
return l.Install(toInstall, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *LuetInstaller) Install(cp []pkg.Package, s *System) error {
|
func (l *LuetInstaller) SyncRepositories() error {
|
||||||
|
Spinner(32)
|
||||||
|
defer SpinnerStop()
|
||||||
|
syncedRepos := Repositories{}
|
||||||
|
for _, r := range l.PackageRepositories {
|
||||||
|
repo, err := r.Sync()
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "Failed syncing repository: "+r.GetName())
|
||||||
|
}
|
||||||
|
syncedRepos = append(syncedRepos, repo)
|
||||||
|
}
|
||||||
|
|
||||||
|
// compute what to install and from where
|
||||||
|
sort.Sort(syncedRepos)
|
||||||
|
|
||||||
|
l.PackageRepositories = syncedRepos
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *LuetInstaller) Install(cp []pkg.Package, s *System) error {
|
||||||
var p []pkg.Package
|
var p []pkg.Package
|
||||||
|
|
||||||
// Check if the package is installed first
|
// Check if the package is installed first
|
||||||
@ -156,29 +164,14 @@ func (l *LuetInstaller) Install(cp []pkg.Package, s *System) error {
|
|||||||
Warning("No package to install, bailing out with no errors")
|
Warning("No package to install, bailing out with no errors")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// First get metas from all repos (and decodes trees)
|
// First get metas from all repos (and decodes trees)
|
||||||
|
|
||||||
Spinner(32)
|
|
||||||
defer SpinnerStop()
|
|
||||||
syncedRepos := Repositories{}
|
|
||||||
for _, r := range l.PackageRepositories {
|
|
||||||
repo, err := r.Sync()
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrap(err, "Failed syncing repository: "+r.GetName())
|
|
||||||
}
|
|
||||||
syncedRepos = append(syncedRepos, repo)
|
|
||||||
}
|
|
||||||
|
|
||||||
// compute what to install and from where
|
|
||||||
sort.Sort(syncedRepos)
|
|
||||||
|
|
||||||
// First match packages against repositories by priority
|
// First match packages against repositories by priority
|
||||||
// matches := syncedRepos.PackageMatches(p)
|
// matches := syncedRepos.PackageMatches(p)
|
||||||
|
|
||||||
// compute a "big" world
|
// compute a "big" world
|
||||||
allRepos := pkg.NewInMemoryDatabase(false)
|
allRepos := pkg.NewInMemoryDatabase(false)
|
||||||
syncedRepos.SyncDatabase(allRepos)
|
l.PackageRepositories.SyncDatabase(allRepos)
|
||||||
|
|
||||||
solv := solver.NewSolver(s.Database, allRepos, pkg.NewInMemoryDatabase(false))
|
solv := solver.NewSolver(s.Database, allRepos, pkg.NewInMemoryDatabase(false))
|
||||||
solution, err := solv.Install(p)
|
solution, err := solv.Install(p)
|
||||||
@ -189,7 +182,7 @@ func (l *LuetInstaller) Install(cp []pkg.Package, s *System) error {
|
|||||||
toInstall := map[string]ArtifactMatch{}
|
toInstall := map[string]ArtifactMatch{}
|
||||||
for _, assertion := range solution {
|
for _, assertion := range solution {
|
||||||
if assertion.Value {
|
if assertion.Value {
|
||||||
matches := syncedRepos.PackageMatches([]pkg.Package{assertion.Package})
|
matches := l.PackageRepositories.PackageMatches([]pkg.Package{assertion.Package})
|
||||||
if len(matches) != 1 {
|
if len(matches) != 1 {
|
||||||
return errors.New("Failed matching solutions against repository - where are definitions coming from?!")
|
return errors.New("Failed matching solutions against repository - where are definitions coming from?!")
|
||||||
}
|
}
|
||||||
@ -284,8 +277,6 @@ func (l *LuetInstaller) Install(cp []pkg.Package, s *System) error {
|
|||||||
|
|
||||||
func (l *LuetInstaller) installPackage(a ArtifactMatch, s *System) error {
|
func (l *LuetInstaller) installPackage(a ArtifactMatch, s *System) error {
|
||||||
|
|
||||||
Info("Installing", a.Package.GetName())
|
|
||||||
|
|
||||||
artifact, err := a.Repository.Client().DownloadArtifact(a.Artifact)
|
artifact, err := a.Repository.Client().DownloadArtifact(a.Artifact)
|
||||||
defer os.Remove(artifact.GetPath())
|
defer os.Remove(artifact.GetPath())
|
||||||
|
|
||||||
@ -296,7 +287,7 @@ func (l *LuetInstaller) installPackage(a ArtifactMatch, s *System) error {
|
|||||||
|
|
||||||
files, err := artifact.FileList()
|
files, err := artifact.FileList()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "Could not get file list")
|
return errors.Wrap(err, "Could not open package archive")
|
||||||
}
|
}
|
||||||
|
|
||||||
err = artifact.Unpack(s.Target, true)
|
err = artifact.Unpack(s.Target, true)
|
||||||
|
@ -27,6 +27,7 @@ type Installer interface {
|
|||||||
Uninstall(pkg.Package, *System) error
|
Uninstall(pkg.Package, *System) error
|
||||||
Upgrade(s *System) error
|
Upgrade(s *System) error
|
||||||
Repositories([]Repository)
|
Repositories([]Repository)
|
||||||
|
SyncRepositories() error
|
||||||
}
|
}
|
||||||
|
|
||||||
type Client interface {
|
type Client interface {
|
||||||
|
@ -233,15 +233,8 @@ func (r *LuetSystemRepository) Sync() (Repository, error) {
|
|||||||
|
|
||||||
var repo Repository
|
var repo Repository
|
||||||
if config.LuetCfg.GetSystem().DatabaseEngine == "boltdb" {
|
if config.LuetCfg.GetSystem().DatabaseEngine == "boltdb" {
|
||||||
os.MkdirAll(
|
repo, err = NewLuetSystemRepositoryFromYaml(dat,
|
||||||
filepath.Join(config.LuetCfg.GetSystem().Rootfs, config.LuetCfg.GetSystem().DatabasePath),
|
pkg.NewBoltDatabase(filepath.Join(helpers.GetRepoDatabaseDirPath(r.Name), "luet.db")),
|
||||||
os.ModePerm,
|
|
||||||
)
|
|
||||||
repo, err = NewLuetSystemRepositoryFromYaml(
|
|
||||||
dat,
|
|
||||||
pkg.NewBoltDatabase(
|
|
||||||
filepath.Join(config.LuetCfg.GetSystem().Rootfs,
|
|
||||||
filepath.Join(config.LuetCfg.GetSystem().DatabasePath, "luet.db"))),
|
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
repo, err = NewLuetSystemRepositoryFromYaml(dat, pkg.NewInMemoryDatabase(false))
|
repo, err = NewLuetSystemRepositoryFromYaml(dat, pkg.NewInMemoryDatabase(false))
|
||||||
@ -277,13 +270,7 @@ func (r *LuetSystemRepository) Sync() (Repository, error) {
|
|||||||
|
|
||||||
var systemDB pkg.PackageDatabase = nil
|
var systemDB pkg.PackageDatabase = nil
|
||||||
if config.LuetCfg.GetSystem().DatabaseEngine == "boltdb" {
|
if config.LuetCfg.GetSystem().DatabaseEngine == "boltdb" {
|
||||||
os.MkdirAll(
|
systemDB = pkg.NewBoltDatabase(filepath.Join(helpers.GetSystemRepoDatabaseDirPath(), "luet.db"))
|
||||||
filepath.Join(config.LuetCfg.GetSystem().Rootfs, config.LuetCfg.GetSystem().DatabasePath),
|
|
||||||
os.ModePerm,
|
|
||||||
)
|
|
||||||
systemDB = pkg.NewBoltDatabase(
|
|
||||||
filepath.Join(config.LuetCfg.GetSystem().Rootfs,
|
|
||||||
filepath.Join(config.LuetCfg.GetSystem().DatabasePath, "luet.db")))
|
|
||||||
} else {
|
} else {
|
||||||
systemDB = pkg.NewInMemoryDatabase(false)
|
systemDB = pkg.NewInMemoryDatabase(false)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user