mirror of
https://github.com/mudler/luet.git
synced 2025-08-11 12:12:19 +00:00
Enhance CLI output
This commit is contained in:
parent
f6a4b634c1
commit
91dfb8ce3a
@ -237,7 +237,7 @@ func (cs *LuetCompiler) stripIncludesFromRootfs(includes []string, rootfs string
|
|||||||
|
|
||||||
func (cs *LuetCompiler) compileWithImage(image, buildertaggedImage, packageImage string, concurrency int, keepPermissions, keepImg bool, p CompilationSpec, generateArtifact bool) (Artifact, error) {
|
func (cs *LuetCompiler) compileWithImage(image, buildertaggedImage, packageImage string, concurrency int, keepPermissions, keepImg bool, p CompilationSpec, generateArtifact bool) (Artifact, error) {
|
||||||
|
|
||||||
pkgTag := ":package: " + p.GetPackage().GetName()
|
pkgTag := ":package: " + p.GetPackage().HumanReadableString()
|
||||||
|
|
||||||
// Use packageImage as salt into the fp being used
|
// Use packageImage as salt into the fp being used
|
||||||
// so the hash is unique also in cases where
|
// so the hash is unique also in cases where
|
||||||
@ -296,7 +296,7 @@ func (cs *LuetCompiler) compileWithImage(image, buildertaggedImage, packageImage
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Info(pkgTag, "Generating :whale: definition for builder image from", image)
|
Info(pkgTag, ":whale: Generating 'builder' image definition from", image)
|
||||||
|
|
||||||
// First we create the builder image
|
// First we create the builder image
|
||||||
p.WriteBuildImageDefinition(filepath.Join(buildDir, p.GetPackage().GetFingerPrint()+"-builder.dockerfile"))
|
p.WriteBuildImageDefinition(filepath.Join(buildDir, p.GetPackage().GetFingerPrint()+"-builder.dockerfile"))
|
||||||
@ -433,7 +433,7 @@ func (cs *LuetCompiler) compileWithImage(image, buildertaggedImage, packageImage
|
|||||||
|
|
||||||
artifact.SetCompileSpec(p)
|
artifact.SetCompileSpec(p)
|
||||||
} else {
|
} else {
|
||||||
Info(pkgTag, "Generating delta")
|
Info(pkgTag, ":hammer: Generating delta")
|
||||||
diffs, err := cs.Backend.Changes(p.Rel(p.GetPackage().GetFingerPrint()+"-builder.image.tar"), p.Rel(p.GetPackage().GetFingerPrint()+".image.tar"))
|
diffs, err := cs.Backend.Changes(p.Rel(p.GetPackage().GetFingerPrint()+"-builder.image.tar"), p.Rel(p.GetPackage().GetFingerPrint()+".image.tar"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "Could not generate changes from layers")
|
return nil, errors.Wrap(err, "Could not generate changes from layers")
|
||||||
@ -589,8 +589,8 @@ func (cs *LuetCompiler) compile(concurrency int, keepPermissions bool, p Compila
|
|||||||
|
|
||||||
for _, assertion := range dependencies { //highly dependent on the order
|
for _, assertion := range dependencies { //highly dependent on the order
|
||||||
currentN++
|
currentN++
|
||||||
pkgTag := fmt.Sprintf(":package: %d/%d %s ⤑ %s", currentN, depsN, p.GetPackage().HumanReadableString(), assertion.Package.HumanReadableString())
|
pkgTag := fmt.Sprintf(":package: %d/%d %s ⤑ :hammer: build %s", currentN, depsN, p.GetPackage().HumanReadableString(), assertion.Package.HumanReadableString())
|
||||||
Info(pkgTag, " :zap: Building dependency")
|
Info(pkgTag, " starts")
|
||||||
compileSpec, err := cs.FromPackage(assertion.Package)
|
compileSpec, err := cs.FromPackage(assertion.Package)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "Error while generating compilespec for "+assertion.Package.GetName())
|
return nil, errors.Wrap(err, "Error while generating compilespec for "+assertion.Package.GetName())
|
||||||
@ -622,7 +622,7 @@ func (cs *LuetCompiler) compile(concurrency int, keepPermissions bool, p Compila
|
|||||||
// break // stop at first error
|
// break // stop at first error
|
||||||
}
|
}
|
||||||
departifacts = append(departifacts, artifact)
|
departifacts = append(departifacts, artifact)
|
||||||
Info(pkgTag, ":collision: Done")
|
Info(pkgTag, ":white_check_mark: Done")
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if len(dependencies) > 0 {
|
} else if len(dependencies) > 0 {
|
||||||
@ -630,7 +630,8 @@ func (cs *LuetCompiler) compile(concurrency int, keepPermissions bool, p Compila
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !cs.Options.OnlyDeps {
|
if !cs.Options.OnlyDeps {
|
||||||
Info(":package:", p.GetPackage().HumanReadableString(), ":cyclone: Building package target from:", lastHash)
|
Info(":rocket: All dependencies are satisfied, building package requested by the user", p.GetPackage().HumanReadableString())
|
||||||
|
Info(":package:", p.GetPackage().HumanReadableString(), " Using image: ", lastHash)
|
||||||
artifact, err := cs.compileWithImage(lastHash, "", targetPackageHash, concurrency, keepPermissions, cs.KeepImg, p, true)
|
artifact, err := cs.compileWithImage(lastHash, "", targetPackageHash, concurrency, keepPermissions, cs.KeepImg, p, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return artifact, err
|
return artifact, err
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
package helpers
|
package helpers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/pkg/errors"
|
||||||
"helm.sh/helm/v3/pkg/chart"
|
"helm.sh/helm/v3/pkg/chart"
|
||||||
"helm.sh/helm/v3/pkg/chartutil"
|
"helm.sh/helm/v3/pkg/chartutil"
|
||||||
"helm.sh/helm/v3/pkg/engine"
|
"helm.sh/helm/v3/pkg/engine"
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// RenderHelm renders the template string with helm
|
// RenderHelm renders the template string with helm
|
||||||
|
@ -47,7 +47,7 @@ func (f *LuetFinalizer) RunInstall(s *System) error {
|
|||||||
|
|
||||||
for _, c := range f.Install {
|
for _, c := range f.Install {
|
||||||
toRun := append(args, c)
|
toRun := append(args, c)
|
||||||
Info("Executing finalizer on ", s.Target, cmd, toRun)
|
Info(":shell: Executing finalizer on ", s.Target, cmd, toRun)
|
||||||
if s.Target == "/" {
|
if s.Target == "/" {
|
||||||
cmd := exec.Command(cmd, toRun...)
|
cmd := exec.Command(cmd, toRun...)
|
||||||
stdoutStderr, err := cmd.CombinedOutput()
|
stdoutStderr, err := cmd.CombinedOutput()
|
||||||
|
@ -69,8 +69,10 @@ func (l *LuetInstaller) Upgrade(s *System) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
Info(":thinking: Computing upgrade, please hang tight")
|
Info(":thinking: Computing upgrade, please hang tight... :zzz:")
|
||||||
|
if l.Options.UpgradeNewRevisions {
|
||||||
|
Info(":memo: note: will consider new build revisions while upgrading")
|
||||||
|
}
|
||||||
Spinner(32)
|
Spinner(32)
|
||||||
defer SpinnerStop()
|
defer SpinnerStop()
|
||||||
// First match packages against repositories by priority
|
// First match packages against repositories by priority
|
||||||
@ -97,7 +99,7 @@ func (l *LuetInstaller) Upgrade(s *System) error {
|
|||||||
SpinnerStop()
|
SpinnerStop()
|
||||||
|
|
||||||
if len(uninstall) > 0 {
|
if len(uninstall) > 0 {
|
||||||
Info("Packages marked for uninstall:")
|
Info(":recycle: Packages marked for uninstall:")
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, p := range uninstall {
|
for _, p := range uninstall {
|
||||||
@ -105,7 +107,7 @@ func (l *LuetInstaller) Upgrade(s *System) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(solution) > 0 {
|
if len(solution) > 0 {
|
||||||
Info("Packages marked for upgrade:")
|
Info(":zap: Packages marked for upgrade:")
|
||||||
}
|
}
|
||||||
|
|
||||||
toInstall := pkg.Packages{}
|
toInstall := pkg.Packages{}
|
||||||
@ -118,13 +120,13 @@ func (l *LuetInstaller) Upgrade(s *System) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if l.Options.UpgradeNewRevisions {
|
if l.Options.UpgradeNewRevisions {
|
||||||
Info("Checking packages with new revisions available")
|
Info(":mag: Checking packages with new revisions available")
|
||||||
for _, p := range s.Database.World() {
|
for _, p := range s.Database.World() {
|
||||||
matches := syncedRepos.PackageMatches(pkg.Packages{p})
|
matches := syncedRepos.PackageMatches(pkg.Packages{p})
|
||||||
if len(matches) == 0 {
|
if len(matches) == 0 {
|
||||||
// Package missing. the user should run luet upgrade --universe
|
// Package missing. the user should run luet upgrade --universe
|
||||||
Info("Installed packages seems to be missing from remote repositories.")
|
Info(":warning: Installed packages seems to be missing from remote repositories.")
|
||||||
Info("It is suggested to run 'luet upgrade --universe'")
|
Info(":warning: It is suggested to run 'luet upgrade --universe'")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for _, artefact := range matches[0].Repo.GetIndex() {
|
for _, artefact := range matches[0].Repo.GetIndex() {
|
||||||
@ -293,7 +295,7 @@ func (l *LuetInstaller) Reclaim(s *System) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
Info("Found package:", p.HumanReadableString())
|
Info(":mag: Found package:", p.HumanReadableString())
|
||||||
toMerge = append(toMerge, ArtifactMatch{Artifact: artefact, Package: p})
|
toMerge = append(toMerge, ArtifactMatch{Artifact: artefact, Package: p})
|
||||||
break FILES
|
break FILES
|
||||||
}
|
}
|
||||||
@ -314,7 +316,7 @@ func (l *LuetInstaller) Reclaim(s *System) error {
|
|||||||
return errors.Wrap(err, "Failed creating package")
|
return errors.Wrap(err, "Failed creating package")
|
||||||
}
|
}
|
||||||
s.Database.SetPackageFiles(&pkg.PackageFile{PackageFingerprint: pack.GetFingerPrint(), Files: match.Artifact.GetFiles()})
|
s.Database.SetPackageFiles(&pkg.PackageFile{PackageFingerprint: pack.GetFingerPrint(), Files: match.Artifact.GetFiles()})
|
||||||
Info("Reclaimed package:", pack.HumanReadableString())
|
Info(":zap: Reclaimed package:", pack.HumanReadableString())
|
||||||
}
|
}
|
||||||
Info("Done!")
|
Info("Done!")
|
||||||
|
|
||||||
@ -396,7 +398,7 @@ func (l *LuetInstaller) install(syncedRepos Repositories, cp pkg.Packages, s *Sy
|
|||||||
// Filter out already installed
|
// Filter out already installed
|
||||||
if _, err := s.Database.FindPackage(currentPack); err != nil {
|
if _, err := s.Database.FindPackage(currentPack); err != nil {
|
||||||
toInstall[currentPack.GetFingerPrint()] = ArtifactMatch{Package: currentPack, Artifact: artefact, Repository: matches[0].Repo}
|
toInstall[currentPack.GetFingerPrint()] = ArtifactMatch{Package: currentPack, Artifact: artefact, Repository: matches[0].Repo}
|
||||||
Info("\t:package:", currentPack.HumanReadableString(), "from repository", matches[0].Repo.GetName())
|
Info("\t:package:", currentPack.HumanReadableString(), ":cloud:", matches[0].Repo.GetName())
|
||||||
}
|
}
|
||||||
break A
|
break A
|
||||||
}
|
}
|
||||||
@ -467,12 +469,12 @@ func (l *LuetInstaller) install(syncedRepos Repositories, cp pkg.Packages, s *Sy
|
|||||||
return errors.Wrap(err, "Error getting package "+ass.Package.HumanReadableString())
|
return errors.Wrap(err, "Error getting package "+ass.Package.HumanReadableString())
|
||||||
}
|
}
|
||||||
if helpers.Exists(treePackage.Rel(tree.FinalizerFile)) {
|
if helpers.Exists(treePackage.Rel(tree.FinalizerFile)) {
|
||||||
Info("Executing finalizer for " + ass.Package.HumanReadableString())
|
|
||||||
finalizerRaw, err := ioutil.ReadFile(treePackage.Rel(tree.FinalizerFile))
|
finalizerRaw, err := ioutil.ReadFile(treePackage.Rel(tree.FinalizerFile))
|
||||||
if err != nil && !l.Options.Force {
|
if err != nil && !l.Options.Force {
|
||||||
return errors.Wrap(err, "Error reading file "+treePackage.Rel(tree.FinalizerFile))
|
return errors.Wrap(err, "Error reading file "+treePackage.Rel(tree.FinalizerFile))
|
||||||
}
|
}
|
||||||
if _, exists := executedFinalizer[ass.Package.GetFingerPrint()]; !exists {
|
if _, exists := executedFinalizer[ass.Package.GetFingerPrint()]; !exists {
|
||||||
|
Info("Executing finalizer for " + ass.Package.HumanReadableString())
|
||||||
finalizer, err := NewLuetFinalizerFromYaml(finalizerRaw)
|
finalizer, err := NewLuetFinalizerFromYaml(finalizerRaw)
|
||||||
if err != nil && !l.Options.Force {
|
if err != nil && !l.Options.Force {
|
||||||
return errors.Wrap(err, "Error reading finalizer "+treePackage.Rel(tree.FinalizerFile))
|
return errors.Wrap(err, "Error reading finalizer "+treePackage.Rel(tree.FinalizerFile))
|
||||||
@ -496,12 +498,12 @@ func (l *LuetInstaller) install(syncedRepos Repositories, cp pkg.Packages, s *Sy
|
|||||||
return errors.Wrap(err, "Error getting package "+c.Package.HumanReadableString())
|
return errors.Wrap(err, "Error getting package "+c.Package.HumanReadableString())
|
||||||
}
|
}
|
||||||
if helpers.Exists(treePackage.Rel(tree.FinalizerFile)) {
|
if helpers.Exists(treePackage.Rel(tree.FinalizerFile)) {
|
||||||
Info("Executing finalizer for " + c.Package.HumanReadableString())
|
|
||||||
finalizerRaw, err := ioutil.ReadFile(treePackage.Rel(tree.FinalizerFile))
|
finalizerRaw, err := ioutil.ReadFile(treePackage.Rel(tree.FinalizerFile))
|
||||||
if err != nil && !l.Options.Force {
|
if err != nil && !l.Options.Force {
|
||||||
return errors.Wrap(err, "Error reading file "+treePackage.Rel(tree.FinalizerFile))
|
return errors.Wrap(err, "Error reading file "+treePackage.Rel(tree.FinalizerFile))
|
||||||
}
|
}
|
||||||
if _, exists := executedFinalizer[c.Package.GetFingerPrint()]; !exists {
|
if _, exists := executedFinalizer[c.Package.GetFingerPrint()]; !exists {
|
||||||
|
Info(":shell: Executing finalizer for " + c.Package.HumanReadableString())
|
||||||
finalizer, err := NewLuetFinalizerFromYaml(finalizerRaw)
|
finalizer, err := NewLuetFinalizerFromYaml(finalizerRaw)
|
||||||
if err != nil && !l.Options.Force {
|
if err != nil && !l.Options.Force {
|
||||||
return errors.Wrap(err, "Error reading finalizer "+treePackage.Rel(tree.FinalizerFile))
|
return errors.Wrap(err, "Error reading finalizer "+treePackage.Rel(tree.FinalizerFile))
|
||||||
@ -630,7 +632,7 @@ func (l *LuetInstaller) uninstall(p pkg.Package, s *System) error {
|
|||||||
return errors.Wrap(err, "Failed removing package from database")
|
return errors.Wrap(err, "Failed removing package from database")
|
||||||
}
|
}
|
||||||
|
|
||||||
Info(p.GetFingerPrint(), "Removed")
|
Info(":recycle:", p.GetFingerPrint(), "Removed :heavy_check_mark:")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -638,7 +640,7 @@ func (l *LuetInstaller) Uninstall(p pkg.Package, s *System) error {
|
|||||||
Spinner(32)
|
Spinner(32)
|
||||||
defer SpinnerStop()
|
defer SpinnerStop()
|
||||||
|
|
||||||
Info("Uninstalling :package:", p.HumanReadableString(), "hang tight")
|
Info(":recycle: Uninstalling :package:", p.HumanReadableString(), "hang tight")
|
||||||
|
|
||||||
// compute uninstall from all world - remove packages in parallel - run uninstall finalizer (in order) TODO - mark the uninstallation in db
|
// compute uninstall from all world - remove packages in parallel - run uninstall finalizer (in order) TODO - mark the uninstallation in db
|
||||||
// Get installed definition
|
// Get installed definition
|
||||||
@ -661,7 +663,7 @@ func (l *LuetInstaller) Uninstall(p pkg.Package, s *System) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !l.Options.NoDeps {
|
if !l.Options.NoDeps {
|
||||||
Info("Finding :package:", p.HumanReadableString(), "dependency graph :deciduous_tree:")
|
Info(":mag: Finding :package:", p.HumanReadableString(), "dependency graph :deciduous_tree:")
|
||||||
solv := solver.NewResolver(solver.Options{Type: l.Options.SolverOptions.Implementation, Concurrency: l.Options.Concurrency}, installedtmp, installedtmp, pkg.NewInMemoryDatabase(false), l.Options.SolverOptions.Resolver())
|
solv := solver.NewResolver(solver.Options{Type: l.Options.SolverOptions.Implementation, Concurrency: l.Options.Concurrency}, installedtmp, installedtmp, pkg.NewInMemoryDatabase(false), l.Options.SolverOptions.Resolver())
|
||||||
var solution pkg.Packages
|
var solution pkg.Packages
|
||||||
var err error
|
var err error
|
||||||
@ -678,19 +680,19 @@ func (l *LuetInstaller) Uninstall(p pkg.Package, s *System) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, p := range solution {
|
for _, p := range solution {
|
||||||
Info("Uninstalling", p.HumanReadableString())
|
Info(":recycle: Uninstalling", p.HumanReadableString())
|
||||||
err := l.uninstall(p, s)
|
err := l.uninstall(p, s)
|
||||||
if err != nil && !l.Options.Force {
|
if err != nil && !l.Options.Force {
|
||||||
return errors.Wrap(err, "Uninstall failed")
|
return errors.Wrap(err, "Uninstall failed")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Info("Uninstalling", p.HumanReadableString(), "without deps")
|
Info(":recycle: Uninstalling", p.HumanReadableString(), "without deps")
|
||||||
err := l.uninstall(p, s)
|
err := l.uninstall(p, s)
|
||||||
if err != nil && !l.Options.Force {
|
if err != nil && !l.Options.Force {
|
||||||
return errors.Wrap(err, "Uninstall failed")
|
return errors.Wrap(err, "Uninstall failed")
|
||||||
}
|
}
|
||||||
Info(":package:", p.HumanReadableString(), "uninstalled")
|
Info(":recycle: :package:", p.HumanReadableString(), "uninstalled :heavy_check_mark:")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
|
@ -74,7 +74,8 @@ testFullInstall() {
|
|||||||
testInstallAgain() {
|
testInstallAgain() {
|
||||||
output=$(luet install --solver-type qlearning --config $tmpdir/luet.yaml test/d test/f test/e test/a)
|
output=$(luet install --solver-type qlearning --config $tmpdir/luet.yaml test/d test/f test/e test/a)
|
||||||
installst=$?
|
installst=$?
|
||||||
assertEquals 'install test successfully' "$installst" "0"
|
echo "$output"
|
||||||
|
assertEquals 'install test successfully' "0" "$installst"
|
||||||
assertNotContains 'contains warning' "$output" 'Filtering out'
|
assertNotContains 'contains warning' "$output" 'Filtering out'
|
||||||
assertTrue 'package D installed' "[ -e '$tmpdir/testrootfs/d' ]"
|
assertTrue 'package D installed' "[ -e '$tmpdir/testrootfs/d' ]"
|
||||||
assertTrue 'package F installed' "[ -e '$tmpdir/testrootfs/f' ]"
|
assertTrue 'package F installed' "[ -e '$tmpdir/testrootfs/f' ]"
|
||||||
|
Loading…
Reference in New Issue
Block a user