The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/distrobuilder/pull/263

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Optionally allow setting `flags` (for the `install` and `remove` actions) in package sets.

This can be used in situations where it is desirable to use `--no-install-recommends` when installing certain packages, as shown below.

-------

Example usage:
```
    - packages:
      - lightdm
      action: install
      flags:
        - --no-install-recommends
```

From feb14627cc45616ba85a74be227bf4dfaf5554cc Mon Sep 17 00:00:00 2001
From: Eddy G <git...@eddyg.promessage.com>
Date: Mon, 18 Nov 2019 14:52:44 -0500
Subject: [PATCH] Add support "flags" in package sets

Allow setting "flags" (for "install" and "remove" actions) in
package sets. This can be used in situations where it is desirable
to use `--no-install-recommends` when installing certain packages,
for example.

Signed-off-by: Eddy Gurney <git...@eddyg.promessage.com>
---
 distrobuilder/chroot.go  | 11 ++++++++---
 doc/examples/scheme.yaml |  6 ++++++
 doc/packages.md          |  7 ++++++-
 managers/manager.go      |  6 ++++--
 shared/definition.go     |  1 +
 5 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/distrobuilder/chroot.go b/distrobuilder/chroot.go
index 15ee624..0602469 100644
--- a/distrobuilder/chroot.go
+++ b/distrobuilder/chroot.go
@@ -2,6 +2,7 @@ package main
 
 import (
        "fmt"
+       "strings"
 
        "github.com/lxc/distrobuilder/managers"
        "github.com/lxc/distrobuilder/shared"
@@ -80,9 +81,9 @@ func managePackages(def *shared.Definition, manager 
*managers.Manager) error {
 
        for _, set := range optimizePackageSets(validSets) {
                if set.Action == "install" {
-                       err = manager.Install(set.Packages)
+                       err = manager.Install(set.Packages, set.Flags)
                } else if set.Action == "remove" {
-                       err = manager.Remove(set.Packages)
+                       err = manager.Remove(set.Packages, set.Flags)
                }
                if err != nil {
                        return err
@@ -111,24 +112,28 @@ func optimizePackageSets(sets 
[]shared.DefinitionPackagesSet) []shared.Definitio
 
        action := sets[0].Action
        packages := sets[0].Packages
+       flags := sets[0].Flags
 
        for i := 1; i < len(sets); i++ {
-               if sets[i].Action == sets[i-1].Action {
+               if sets[i].Action == sets[i-1].Action && 
strings.Join(sets[i].Flags, " ") == strings.Join(sets[i-1].Flags, " ") {
                        packages = append(packages, sets[i].Packages...)
                } else {
                        newSets = append(newSets, shared.DefinitionPackagesSet{
                                Action:   action,
                                Packages: packages,
+                               Flags:    flags,
                        })
 
                        action = sets[i].Action
                        packages = sets[i].Packages
+                       flags = sets[i].Flags
                }
        }
 
        newSets = append(newSets, shared.DefinitionPackagesSet{
                Action:   action,
                Packages: packages,
+               Flags:    flags,
        })
 
        return newSets
diff --git a/doc/examples/scheme.yaml b/doc/examples/scheme.yaml
index 20947f9..64274bc 100644
--- a/doc/examples/scheme.yaml
+++ b/doc/examples/scheme.yaml
@@ -157,6 +157,12 @@ packages:
       variants:
         - default
 
+    - packages:
+        - lightdm
+      action: install
+      flags:
+        - --no-install-recommends
+
     - packages:
         - grub
       action: remove
diff --git a/doc/packages.md b/doc/packages.md
index ae2ac32..8ea86b0 100644
--- a/doc/packages.md
+++ b/doc/packages.md
@@ -15,6 +15,7 @@ packages:
           architectures: <array> # filter
           releases: <array> # filter
           variants: <array> # filter
+          flags: <array> # install/remove flags for just this set
         - ...
     repositories:
         - name: <string>
@@ -75,7 +76,11 @@ This depends on the package manager though and is not 
supported by all.
 
 A set contains a list of `packages`, an `action`, and optional filters.
 Here, `packages` is a list of packages which are to be installed or removed.
-The value of `action` must be either `install` or `remove`.
+The value of `action` must be either `install` or `remove`. If `flags` is
+specified for a package set, they are appended to the command specific
+flags, along with any global flags, when calling the `install` or `remove`
+command.  For example, you can define a package set that should be installed
+with `--no-install-recommends`.
 
 `repositories` contains a list of additional repositories which are to be 
added.
 The `type` field is only needed if the package manager supports more than one 
repository manager.
diff --git a/managers/manager.go b/managers/manager.go
index 86ea8fd..09945aa 100644
--- a/managers/manager.go
+++ b/managers/manager.go
@@ -86,24 +86,26 @@ func GetCustom(def shared.DefinitionPackagesCustomManager) 
*Manager {
 }
 
 // Install installs packages to the rootfs.
-func (m Manager) Install(pkgs []string) error {
+func (m Manager) Install(pkgs, flags []string) error {
        if len(m.flags.install) == 0 || pkgs == nil || len(pkgs) == 0 {
                return nil
        }
 
        args := append(m.flags.global, m.flags.install...)
+       args = append(args, flags...)
        args = append(args, pkgs...)
 
        return shared.RunCommand(m.commands.install, args...)
 }
 
 // Remove removes packages from the rootfs.
-func (m Manager) Remove(pkgs []string) error {
+func (m Manager) Remove(pkgs, flags []string) error {
        if len(m.flags.remove) == 0 || pkgs == nil || len(pkgs) == 0 {
                return nil
        }
 
        args := append(m.flags.global, m.flags.remove...)
+       args = append(args, flags...)
        args = append(args, pkgs...)
 
        return shared.RunCommand(m.commands.remove, args...)
diff --git a/shared/definition.go b/shared/definition.go
index 6fa8b3a..6db514a 100644
--- a/shared/definition.go
+++ b/shared/definition.go
@@ -48,6 +48,7 @@ type DefinitionPackagesSet struct {
        Packages         []string `yaml:"packages"`
        Action           string   `yaml:"action"`
        Early            bool     `yaml:"early,omitempty"`
+       Flags            []string `yaml:"flags,omitempty"`
 }
 
 // A DefinitionPackagesRepository contains data of a specific repository
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to