All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] use new opkg --add-ignore-recommends for BAD_RECOMMENDATIONS feature
@ 2019-02-07 15:57 Alejandro del Castillo
  2019-02-07 15:57 ` [PATCH 1/3] opkg: add --ignore-recommends flag Alejandro del Castillo
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Alejandro del Castillo @ 2019-02-07 15:57 UTC (permalink / raw)
  To: openembedded-core

- Add new opkg --add-ignore-recommends cli flag
- Fix libsolv segfaul triggered by --add-ignore-recommends
- Replace BAD_RECOMMENDATIONS backend in package_manager.py

Alejandro del Castillo (3):
  opkg: add --ignore-recommends flag
  libsolv: fix segfault when using SOLVER_DISFAVOR
  OpkgPM: use --add-ignore-recommends to process BAD_RECOMMENDATIONS

 meta/lib/oe/package_manager.py                |  41 +--
 meta/lib/oe/rootfs.py                         |   2 -
 ...pkg-add-add-ignore-recommends-option.patch | 259 ++++++++++++++++++
 meta/recipes-devtools/opkg/opkg_0.4.0.bb      |   1 +
 ...y-disfavor-recommends-if-there-are-a.patch |  33 +++
 .../recipes-extended/libsolv/libsolv_0.7.3.bb |   4 +-
 6 files changed, 298 insertions(+), 42 deletions(-)
 create mode 100644 meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
 create mode 100644 meta/recipes-extended/libsolv/libsolv/0001-solver_solve-only-disfavor-recommends-if-there-are-a.patch

-- 
2.20.1



^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/3] opkg: add --ignore-recommends flag
  2019-02-07 15:57 [PATCH 0/3] use new opkg --add-ignore-recommends for BAD_RECOMMENDATIONS feature Alejandro del Castillo
@ 2019-02-07 15:57 ` Alejandro del Castillo
  2019-02-07 17:36     ` Scott Rifenbark
  2019-02-07 15:57 ` [PATCH 2/3] libsolv: fix segfault when using SOLVER_DISFAVOR Alejandro del Castillo
  2019-02-07 15:57 ` [PATCH 3/3] OpkgPM: use --add-ignore-recommends to process BAD_RECOMMENDATIONS Alejandro del Castillo
  2 siblings, 1 reply; 10+ messages in thread
From: Alejandro del Castillo @ 2019-02-07 15:57 UTC (permalink / raw)
  To: openembedded-core

To be used for BAD_RECOMMENDATIONS feature.

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
---
 ...pkg-add-add-ignore-recommends-option.patch | 259 ++++++++++++++++++
 meta/recipes-devtools/opkg/opkg_0.4.0.bb      |   1 +
 2 files changed, 260 insertions(+)
 create mode 100644 meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch

diff --git a/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch b/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
new file mode 100644
index 0000000000..47d1b3c37e
--- /dev/null
+++ b/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
@@ -0,0 +1,259 @@
+From 64aa98646a17c299bf37af2975b98daf5d7d30b4 Mon Sep 17 00:00:00 2001
+From: Alejandro del Castillo <alejandro.delcastillo@ni.com>
+Date: Thu, 31 Jan 2019 18:16:08 -0600
+Subject: [PATCH] libopkg: add --add-ignore-recommends option
+
+Add option to ignore specific recommended packages. On the libsolv
+backed, this feature will only work on libsolv version > 0.7.2 [1].
+
+[1] https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openSUSE_libsolv_issues_254&d=DwIBaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=GObNHzFJpWpf_PripIrf-K2RhsktYdAUEieAJexXOKw&s=3G-meChUqClFggFPqsrAxIZBfLnRKIHm62Uuy1X6nQQ&e=
+
+Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
+
+Upstream-Status: Accepted
+---
+ libopkg/opkg_conf.c                           |  2 +
+ libopkg/opkg_conf.h                           |  1 +
+ .../solvers/internal/pkg_depends_internal.c   |  3 +-
+ libopkg/solvers/libsolv/opkg_solver_libsolv.c | 21 ++++++-
+ man/opkg.1.in                                 |  3 +
+ src/opkg.c                                    |  6 ++
+ tests/Makefile                                |  1 +
+ tests/core/43_add_ignore_recommends.py        | 62 +++++++++++++++++++
+ 8 files changed, 97 insertions(+), 2 deletions(-)
+ create mode 100755 tests/core/43_add_ignore_recommends.py
+
+diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c
+index 06880a1..f2330cd 100644
+--- a/libopkg/opkg_conf.c
++++ b/libopkg/opkg_conf.c
+@@ -597,6 +597,7 @@ int opkg_conf_init(void)
+     pkg_dest_list_init(&opkg_config->tmp_dest_list);
+     nv_pair_list_init(&opkg_config->arch_list);
+     str_list_init(&opkg_config->exclude_list);
++    str_list_init(&opkg_config->ignore_recommends_list);
+ 
+     return 0;
+ }
+@@ -938,6 +939,7 @@ void opkg_conf_deinit(void)
+     pkg_dest_list_deinit(&opkg_config->pkg_dest_list);
+     nv_pair_list_deinit(&opkg_config->arch_list);
+     str_list_deinit(&opkg_config->exclude_list);
++    str_list_deinit(&opkg_config->ignore_recommends_list);
+ 
+     if (opkg_config->verbosity >= DEBUG) {
+         hash_print_stats(&opkg_config->pkg_hash);
+diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h
+index eb56a29..316c500 100644
+--- a/libopkg/opkg_conf.h
++++ b/libopkg/opkg_conf.h
+@@ -61,6 +61,7 @@ typedef struct opkg_conf {
+     pkg_dest_list_t tmp_dest_list;
+     nv_pair_list_t arch_list;
+     str_list_t exclude_list;
++    str_list_t ignore_recommends_list;
+ 
+     int restrict_to_default_dest;
+     pkg_dest_t *default_dest;
+diff --git a/libopkg/solvers/internal/pkg_depends_internal.c b/libopkg/solvers/internal/pkg_depends_internal.c
+index cd56d84..5deee70 100644
+--- a/libopkg/solvers/internal/pkg_depends_internal.c
++++ b/libopkg/solvers/internal/pkg_depends_internal.c
+@@ -228,7 +228,8 @@ int pkg_hash_fetch_unsatisfied_dependencies(pkg_t *pkg,
+                             || compound_depend->type == SUGGEST)
+                         && (satisfying_pkg->state_want == SW_DEINSTALL
+                             || satisfying_pkg->state_want == SW_PURGE
+-                            || opkg_config->no_install_recommends);
++                            || opkg_config->no_install_recommends
++                            || str_list_contains(&opkg_config->ignore_recommends_list, satisfying_pkg->name));
+                 if (ignore) {
+                     opkg_msg(NOTICE,
+                              "%s: ignoring recommendation for "
+diff --git a/libopkg/solvers/libsolv/opkg_solver_libsolv.c b/libopkg/solvers/libsolv/opkg_solver_libsolv.c
+index 2b27e3a..403e07b 100644
+--- a/libopkg/solvers/libsolv/opkg_solver_libsolv.c
++++ b/libopkg/solvers/libsolv/opkg_solver_libsolv.c
+@@ -484,6 +484,7 @@ static void pkg2solvable(pkg_t *pkg, Solvable *solvable_out)
+ static void populate_installed_repo(libsolv_solver_t *libsolv_solver)
+ {
+     int i;
++    Id what;
+ 
+     pkg_vec_t *installed_pkgs = pkg_vec_alloc();
+ 
+@@ -507,6 +508,15 @@ static void populate_installed_repo(libsolv_solver_t *libsolv_solver)
+         /* set solvable attributes */
+         pkg2solvable(pkg, solvable);
+ 
++        /* if the package is in ignore-recommends-list, disfavor installation */
++        if (str_list_contains(&opkg_config->ignore_recommends_list, pkg->name)) {
++            opkg_message(NOTICE, "Disfavor package: %s\n",
++                         pkg->name);
++            what = pool_str2id(libsolv_solver->pool, pkg->name, 1);
++            queue_push2(&libsolv_solver->solver_jobs, SOLVER_SOLVABLE_NAME
++                        | SOLVER_DISFAVOR, what);
++        }
++
+         /* if the package is not autoinstalled, mark it as user installed */
+         if (!pkg->auto_installed)
+             queue_push2(&libsolv_solver->solver_jobs, SOLVER_SOLVABLE
+@@ -539,7 +549,7 @@ static void populate_available_repos(libsolv_solver_t *libsolv_solver)
+ {
+     int i;
+     Solvable *solvable;
+-    Id solvable_id;
++    Id solvable_id, what;
+ 
+     pkg_vec_t *available_pkgs = pkg_vec_alloc();
+ 
+@@ -608,6 +618,15 @@ static void populate_available_repos(libsolv_solver_t *libsolv_solver)
+         solvable = pool_id2solvable(libsolv_solver->pool, solvable_id);
+         pkg2solvable(pkg, solvable);
+ 
++        /* if the package is in ignore-recommends-list, disfavor installation */
++        if (str_list_contains(&opkg_config->ignore_recommends_list, pkg->name)) {
++            opkg_message(NOTICE, "Disfavor package: %s\n",
++                         pkg->name);
++            what = pool_str2id(libsolv_solver->pool, pkg->name, 1);
++            queue_push2(&libsolv_solver->solver_jobs, SOLVER_SOLVABLE_NAME
++                        | SOLVER_DISFAVOR, what);
++        }
++
+         /* if the --force-depends option is specified make dependencies weak */
+         if (opkg_config->force_depends)
+             queue_push2(&libsolv_solver->solver_jobs, SOLVER_SOLVABLE
+diff --git a/man/opkg.1.in b/man/opkg.1.in
+index 27fa9c1..f192c3b 100644
+--- a/man/opkg.1.in
++++ b/man/opkg.1.in
+@@ -162,6 +162,9 @@ priority \fIprio\fP. Lower priorities take precedence.
+ \fB\--add-exclude <\fIname\fP>\fR
+ Register package to be excluded from install
+ .TP
++\fB\--add-ignore-recommends <\fIname\fP>\fR
++Register package to be ignored as a recomendee
++.TP
+ \fB\--prefer-arch-to-version\fR
+ Use the architecture priority package rather than the higher version
+ one if more than one candidate is found.
+diff --git a/src/opkg.c b/src/opkg.c
+index 650e278..3c93a3b 100644
+--- a/src/opkg.c
++++ b/src/opkg.c
+@@ -51,6 +51,7 @@ enum {
+     ARGS_OPT_ADD_DEST,
+     ARGS_OPT_SIZE,
+     ARGS_OPT_ADD_EXCLUDE,
++    ARGS_OPT_ADD_IGNORE_RECOMMENDS,
+     ARGS_OPT_NOACTION,
+     ARGS_OPT_DOWNLOAD_ONLY,
+     ARGS_OPT_NODEPS,
+@@ -112,6 +113,7 @@ static struct option long_options[] = {
+     {"add-dest", 1, 0, ARGS_OPT_ADD_DEST},
+     {"size", 0, 0, ARGS_OPT_SIZE},
+     {"add-exclude", 1, 0, ARGS_OPT_ADD_EXCLUDE},
++    {"add-ignore-recommends", 1, 0, ARGS_OPT_ADD_IGNORE_RECOMMENDS},
+     {"test", 0, 0, ARGS_OPT_NOACTION},
+     {"tmp-dir", 1, 0, 't'},
+     {"tmp_dir", 1, 0, 't'},
+@@ -234,6 +236,9 @@ static int args_parse(int argc, char *argv[])
+         case ARGS_OPT_ADD_EXCLUDE:
+             str_list_append(&opkg_config->exclude_list, optarg);
+             break;
++        case ARGS_OPT_ADD_IGNORE_RECOMMENDS:
++            str_list_append(&opkg_config->ignore_recommends_list, optarg);
++            break;
+         case ARGS_OPT_SIZE:
+             opkg_config->size = 1;
+             break;
+@@ -343,6 +348,7 @@ static void usage()
+     printf("\t--add-dest <name>:<path>        Register destination with given path\n");
+     printf("\t--add-arch <arch>:<prio>        Register architecture with given priority\n");
+     printf("\t--add-exclude <name>            Register package to be excluded from install\n");
++    printf("\t--add-ignore-recommends <name>  Register package to be ignored as a recomendee\n");
+     printf("\t--prefer-arch-to-version        Use the architecture priority package rather\n");
+     printf("\t                                than the higher version one if more\n");
+     printf("\t                                than one candidate is found.\n");
+diff --git a/tests/Makefile b/tests/Makefile
+index 8e5be08..799816d 100644
+--- a/tests/Makefile
++++ b/tests/Makefile
+@@ -42,6 +42,7 @@ REGRESSION_TESTS := core/01_install.py \
+ 		    core/40_arch.py \
+ 		    core/41_info_fields.py \
+ 		    core/42_info_description.py \
++		    core/43_add_ignore_recommends.py \
+ 		    regress/issue26.py \
+ 		    regress/issue31.py \
+ 		    regress/issue32.py \
+diff --git a/tests/core/43_add_ignore_recommends.py b/tests/core/43_add_ignore_recommends.py
+new file mode 100755
+index 0000000..7da0096
+--- /dev/null
++++ b/tests/core/43_add_ignore_recommends.py
+@@ -0,0 +1,62 @@
++#! /usr/bin/env python3
++#
++# Create package 'a' (1.0) which Recommends 'c'.
++# Install 'a' with --add-ignore-recommends 'c'.
++# Check that only 'a' (1.0) is installed.
++# Create package 'b' which Depends on 'c'.
++# Install 'a' & 'b', with --add-ignore-recommends 'c'.
++# Verify that 'a','b' & 'c' are installed.
++# Uninstall 'b' & 'c'.
++# Create package 'a' (2.0), which Recommends 'c'.
++# Upgrade 'a' with --add-ignore-recommends 'c'
++# Verify that only 'a' (2.0) is installed
++#
++
++import os
++import opk, cfg, opkgcl
++
++opk.regress_init()
++o = opk.OpkGroup()
++
++o.add(Package='a', Recommends='c', Version='1.0')
++o.add(Package='b', Depends='c')
++o.add(Package='c')
++o.write_opk()
++o.write_list()
++
++opkgcl.update()
++
++opkgcl.install('a', '--add-ignore-recommends c')
++
++if not opkgcl.is_installed('a'):
++	opk.fail("Package 'a' installed but reports as not installed.")
++
++if opkgcl.is_installed('c'):
++	opk.xfail("[libsolv<0.7.3] Package 'c' should not have been installed since it was in --add-ignore-recommends.")
++
++opkgcl.remove('a')
++opkgcl.install('a b', '--add-ignore-recommends c')
++
++if not opkgcl.is_installed('a'):
++	opk.fail("Package 'a' installed but reports as not installed.")
++
++if not opkgcl.is_installed('b'):
++	opk.fail("Package 'b' installed but reports as not installed.")
++
++if not opkgcl.is_installed('c'):
++	opk.fail("Package 'c' should have been installed since 'b' depends on it.")
++
++opkgcl.remove('b c', '--force-depends')
++o.add(Package='a', Recommends='c', Version='2.0')
++o.write_opk()
++o.write_list()
++
++opkgcl.update()
++
++opkgcl.upgrade('a', '--add-ignore-recommends c')
++
++if not opkgcl.is_installed('a', '2.0'):
++	opk.fail("Package 'a (2.0)' installed but reports as not installed.")
++
++if opkgcl.is_installed('c'):
++	opk.fail("Package 'c' should not have been installed since it was in --add-ignore-recommends.")
+-- 
+2.20.1
+
diff --git a/meta/recipes-devtools/opkg/opkg_0.4.0.bb b/meta/recipes-devtools/opkg/opkg_0.4.0.bb
index 9b7cf3f596..a2329d3e71 100644
--- a/meta/recipes-devtools/opkg/opkg_0.4.0.bb
+++ b/meta/recipes-devtools/opkg/opkg_0.4.0.bb
@@ -14,6 +14,7 @@ PE = "1"
 SRC_URI = "http://downloads.yoctoproject.org/releases/${BPN}/${BPN}-${PV}.tar.gz \
            file://opkg.conf \
            file://0001-opkg_conf-create-opkg.lock-in-run-instead-of-var-run.patch \
+           file://0001-libopkg-add-add-ignore-recommends-option.patch \
 "
 
 SRC_URI[md5sum] = "ae51d95fee599bb4dce08453529158f5"
-- 
2.20.1



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/3] libsolv: fix segfault when using SOLVER_DISFAVOR
  2019-02-07 15:57 [PATCH 0/3] use new opkg --add-ignore-recommends for BAD_RECOMMENDATIONS feature Alejandro del Castillo
  2019-02-07 15:57 ` [PATCH 1/3] opkg: add --ignore-recommends flag Alejandro del Castillo
@ 2019-02-07 15:57 ` Alejandro del Castillo
  2019-02-07 15:57 ` [PATCH 3/3] OpkgPM: use --add-ignore-recommends to process BAD_RECOMMENDATIONS Alejandro del Castillo
  2 siblings, 0 replies; 10+ messages in thread
From: Alejandro del Castillo @ 2019-02-07 15:57 UTC (permalink / raw)
  To: openembedded-core

Opkg --add-ignore-recommends use the flag SOLVER_DISFAVOR. If a package
is set to be ignored as a recommendee, but there are not other
recommends on the package graph, libsolv segfaults.

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
---
 ...y-disfavor-recommends-if-there-are-a.patch | 33 +++++++++++++++++++
 .../recipes-extended/libsolv/libsolv_0.7.3.bb |  4 ++-
 2 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 meta/recipes-extended/libsolv/libsolv/0001-solver_solve-only-disfavor-recommends-if-there-are-a.patch

diff --git a/meta/recipes-extended/libsolv/libsolv/0001-solver_solve-only-disfavor-recommends-if-there-are-a.patch b/meta/recipes-extended/libsolv/libsolv/0001-solver_solve-only-disfavor-recommends-if-there-are-a.patch
new file mode 100644
index 0000000000..139613a0ad
--- /dev/null
+++ b/meta/recipes-extended/libsolv/libsolv/0001-solver_solve-only-disfavor-recommends-if-there-are-a.patch
@@ -0,0 +1,33 @@
+From 19d7cc87adba92d31d5fafdf7db00920d24a96a6 Mon Sep 17 00:00:00 2001
+From: Alejandro del Castillo <alejandro.delcastillo@ni.com>
+Date: Wed, 6 Feb 2019 13:24:04 -0600
+Subject: [PATCH] solver_solve: only disfavor recommends if there are any
+
+In a repo that have pkg 'a' and 'b' available, and 'b' is disfavored,
+but 'a' doesn't recommend 'b', libsolv segfaults on
+solver_addrecommendsrules, since solv->recommendsruleq is null. Only
+call solver_addrecommendsrules if there are recommends rules.
+
+Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
+
+Upstream-Status: Accepted
+---
+ src/solver.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/solver.c b/src/solver.c
+index a80090d19..ad78327a8 100644
+--- a/src/solver.c
++++ b/src/solver.c
+@@ -3920,7 +3920,7 @@ solver_solve(Solver *solv, Queue *job)
+   else
+     solv->yumobsrules = solv->yumobsrules_end = solv->nrules;
+ 
+-  if (solv->havedisfavored && solv->strongrecommends)
++  if (solv->havedisfavored && solv->strongrecommends && solv->recommendsruleq)
+     solver_addrecommendsrules(solv);
+   else
+     solv->recommendsrules = solv->recommendsrules_end = solv->nrules;
+-- 
+2.20.1
+
diff --git a/meta/recipes-extended/libsolv/libsolv_0.7.3.bb b/meta/recipes-extended/libsolv/libsolv_0.7.3.bb
index 44757ac54f..3fe6f2c20a 100644
--- a/meta/recipes-extended/libsolv/libsolv_0.7.3.bb
+++ b/meta/recipes-extended/libsolv/libsolv_0.7.3.bb
@@ -7,7 +7,9 @@ LIC_FILES_CHKSUM = "file://LICENSE.BSD;md5=62272bd11c97396d4aaf1c41bc11f7d8"
 
 DEPENDS = "expat zlib"
 
-SRC_URI = "git://github.com/openSUSE/libsolv.git"
+SRC_URI = "git://github.com/openSUSE/libsolv.git \
+           file://0001-solver_solve-only-disfavor-recommends-if-there-are-a.patch \
+"
 
 SRCREV = "dc7d0f1c3113f2c8217563166906bef3eb5d1ee1"
 UPSTREAM_CHECK_GITTAGREGEX = "(?P<pver>\d+(\.\d+)+)"
-- 
2.20.1



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/3] OpkgPM: use --add-ignore-recommends to process BAD_RECOMMENDATIONS
  2019-02-07 15:57 [PATCH 0/3] use new opkg --add-ignore-recommends for BAD_RECOMMENDATIONS feature Alejandro del Castillo
  2019-02-07 15:57 ` [PATCH 1/3] opkg: add --ignore-recommends flag Alejandro del Castillo
  2019-02-07 15:57 ` [PATCH 2/3] libsolv: fix segfault when using SOLVER_DISFAVOR Alejandro del Castillo
@ 2019-02-07 15:57 ` Alejandro del Castillo
  2 siblings, 0 replies; 10+ messages in thread
From: Alejandro del Castillo @ 2019-02-07 15:57 UTC (permalink / raw)
  To: openembedded-core

Currently, BAD_RECOMMENDATIONS on the opkg backed relies on editing the
opkg status file (it sets BAD_RECOMMENDATIONS pkg want state to
deinstalled and pinned). This is brittle, and not consistent across the
different solver backends. Use new --add-ignore-recommends flag instead.

Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
---
 meta/lib/oe/package_manager.py | 41 ++--------------------------------
 meta/lib/oe/rootfs.py          |  2 --
 2 files changed, 2 insertions(+), 41 deletions(-)

diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py
index f26f597d03..7e7d7db083 100644
--- a/meta/lib/oe/package_manager.py
+++ b/meta/lib/oe/package_manager.py
@@ -1339,6 +1339,8 @@ class OpkgPM(OpkgDpkgPM):
         cmd = "%s %s" % (self.opkg_cmd, self.opkg_args)
         for exclude in (self.d.getVar("PACKAGE_EXCLUDE") or "").split():
             cmd += " --add-exclude %s" % exclude
+        for bad_recommendation in (self.d.getVar("BAD_RECOMMENDATIONS") or "").split():
+            cmd += " --add-ignore-recommends %s" % bad_recommendation
         cmd += " install "
         cmd += " ".join(pkgs)
 
@@ -1407,45 +1409,6 @@ class OpkgPM(OpkgDpkgPM):
     def list_installed(self):
         return OpkgPkgsList(self.d, self.target_rootfs, self.config_file).list_pkgs()
 
-    def handle_bad_recommendations(self):
-        bad_recommendations = self.d.getVar("BAD_RECOMMENDATIONS") or ""
-        if bad_recommendations.strip() == "":
-            return
-
-        status_file = os.path.join(self.opkg_dir, "status")
-
-        # If status file existed, it means the bad recommendations has already
-        # been handled
-        if os.path.exists(status_file):
-            return
-
-        cmd = "%s %s info " % (self.opkg_cmd, self.opkg_args)
-
-        with open(status_file, "w+") as status:
-            for pkg in bad_recommendations.split():
-                pkg_info = cmd + pkg
-
-                try:
-                    output = subprocess.check_output(pkg_info.split(), stderr=subprocess.STDOUT).strip().decode("utf-8")
-                except subprocess.CalledProcessError as e:
-                    bb.fatal("Cannot get package info. Command '%s' "
-                             "returned %d:\n%s" % (pkg_info, e.returncode, e.output.decode("utf-8")))
-
-                if output == "":
-                    bb.note("Ignored bad recommendation: '%s' is "
-                            "not a package" % pkg)
-                    continue
-
-                for line in output.split('\n'):
-                    if line.startswith("Status:"):
-                        status.write("Status: deinstall hold not-installed\n")
-                    else:
-                        status.write(line + "\n")
-
-                # Append a blank line after each package entry to ensure that it
-                # is separated from the following entry
-                status.write("\n")
-
     def dummy_install(self, pkgs):
         """
         The following function dummy installs pkgs and returns the log of output.
diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py
index 551dcfc75f..cf5cd996a2 100644
--- a/meta/lib/oe/rootfs.py
+++ b/meta/lib/oe/rootfs.py
@@ -891,8 +891,6 @@ class OpkgRootfs(DpkgOpkgRootfs):
 
         self.pm.update()
 
-        self.pm.handle_bad_recommendations()
-
         if self.progress_reporter:
             self.progress_reporter.next_stage()
 
-- 
2.20.1



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [OE-core] [PATCH 1/3] opkg: add --ignore-recommends flag
  2019-02-07 15:57 ` [PATCH 1/3] opkg: add --ignore-recommends flag Alejandro del Castillo
@ 2019-02-07 17:36     ` Scott Rifenbark
  0 siblings, 0 replies; 10+ messages in thread
From: Scott Rifenbark @ 2019-02-07 17:36 UTC (permalink / raw)
  To: Alejandro del Castillo; +Cc: Yocto discussion list, openembedded-core

[-- Attachment #1: Type: text/plain, Size: 13735 bytes --]

This change looks like it impacts documentation (i.e.
https://yoctoproject.org/docs/2.7/ref-manual/ref-manual.html#var-BAD_RECOMMENDATIONS).
When will this change go into effect?

Scott

On Thu, Feb 7, 2019 at 7:58 AM Alejandro del Castillo <
alejandro.delcastillo@ni.com> wrote:

> To be used for BAD_RECOMMENDATIONS feature.
>
> Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
> ---
>  ...pkg-add-add-ignore-recommends-option.patch | 259 ++++++++++++++++++
>  meta/recipes-devtools/opkg/opkg_0.4.0.bb      |   1 +
>  2 files changed, 260 insertions(+)
>  create mode 100644
> meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
>
> diff --git
> a/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> b/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> new file mode 100644
> index 0000000000..47d1b3c37e
> --- /dev/null
> +++
> b/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> @@ -0,0 +1,259 @@
> +From 64aa98646a17c299bf37af2975b98daf5d7d30b4 Mon Sep 17 00:00:00 2001
> +From: Alejandro del Castillo <alejandro.delcastillo@ni.com>
> +Date: Thu, 31 Jan 2019 18:16:08 -0600
> +Subject: [PATCH] libopkg: add --add-ignore-recommends option
> +
> +Add option to ignore specific recommended packages. On the libsolv
> +backed, this feature will only work on libsolv version > 0.7.2 [1].
> +
> +[1]
> https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openSUSE_libsolv_issues_254&d=DwIBaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=GObNHzFJpWpf_PripIrf-K2RhsktYdAUEieAJexXOKw&s=3G-meChUqClFggFPqsrAxIZBfLnRKIHm62Uuy1X6nQQ&e=
> +
> +Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
> +
> +Upstream-Status: Accepted
> +---
> + libopkg/opkg_conf.c                           |  2 +
> + libopkg/opkg_conf.h                           |  1 +
> + .../solvers/internal/pkg_depends_internal.c   |  3 +-
> + libopkg/solvers/libsolv/opkg_solver_libsolv.c | 21 ++++++-
> + man/opkg.1.in                                 |  3 +
> + src/opkg.c                                    |  6 ++
> + tests/Makefile                                |  1 +
> + tests/core/43_add_ignore_recommends.py        | 62 +++++++++++++++++++
> + 8 files changed, 97 insertions(+), 2 deletions(-)
> + create mode 100755 tests/core/43_add_ignore_recommends.py
> +
> +diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c
> +index 06880a1..f2330cd 100644
> +--- a/libopkg/opkg_conf.c
> ++++ b/libopkg/opkg_conf.c
> +@@ -597,6 +597,7 @@ int opkg_conf_init(void)
> +     pkg_dest_list_init(&opkg_config->tmp_dest_list);
> +     nv_pair_list_init(&opkg_config->arch_list);
> +     str_list_init(&opkg_config->exclude_list);
> ++    str_list_init(&opkg_config->ignore_recommends_list);
> +
> +     return 0;
> + }
> +@@ -938,6 +939,7 @@ void opkg_conf_deinit(void)
> +     pkg_dest_list_deinit(&opkg_config->pkg_dest_list);
> +     nv_pair_list_deinit(&opkg_config->arch_list);
> +     str_list_deinit(&opkg_config->exclude_list);
> ++    str_list_deinit(&opkg_config->ignore_recommends_list);
> +
> +     if (opkg_config->verbosity >= DEBUG) {
> +         hash_print_stats(&opkg_config->pkg_hash);
> +diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h
> +index eb56a29..316c500 100644
> +--- a/libopkg/opkg_conf.h
> ++++ b/libopkg/opkg_conf.h
> +@@ -61,6 +61,7 @@ typedef struct opkg_conf {
> +     pkg_dest_list_t tmp_dest_list;
> +     nv_pair_list_t arch_list;
> +     str_list_t exclude_list;
> ++    str_list_t ignore_recommends_list;
> +
> +     int restrict_to_default_dest;
> +     pkg_dest_t *default_dest;
> +diff --git a/libopkg/solvers/internal/pkg_depends_internal.c
> b/libopkg/solvers/internal/pkg_depends_internal.c
> +index cd56d84..5deee70 100644
> +--- a/libopkg/solvers/internal/pkg_depends_internal.c
> ++++ b/libopkg/solvers/internal/pkg_depends_internal.c
> +@@ -228,7 +228,8 @@ int pkg_hash_fetch_unsatisfied_dependencies(pkg_t
> *pkg,
> +                             || compound_depend->type == SUGGEST)
> +                         && (satisfying_pkg->state_want == SW_DEINSTALL
> +                             || satisfying_pkg->state_want == SW_PURGE
> +-                            || opkg_config->no_install_recommends);
> ++                            || opkg_config->no_install_recommends
> ++                            ||
> str_list_contains(&opkg_config->ignore_recommends_list,
> satisfying_pkg->name));
> +                 if (ignore) {
> +                     opkg_msg(NOTICE,
> +                              "%s: ignoring recommendation for "
> +diff --git a/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> b/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> +index 2b27e3a..403e07b 100644
> +--- a/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> ++++ b/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> +@@ -484,6 +484,7 @@ static void pkg2solvable(pkg_t *pkg, Solvable
> *solvable_out)
> + static void populate_installed_repo(libsolv_solver_t *libsolv_solver)
> + {
> +     int i;
> ++    Id what;
> +
> +     pkg_vec_t *installed_pkgs = pkg_vec_alloc();
> +
> +@@ -507,6 +508,15 @@ static void populate_installed_repo(libsolv_solver_t
> *libsolv_solver)
> +         /* set solvable attributes */
> +         pkg2solvable(pkg, solvable);
> +
> ++        /* if the package is in ignore-recommends-list, disfavor
> installation */
> ++        if (str_list_contains(&opkg_config->ignore_recommends_list,
> pkg->name)) {
> ++            opkg_message(NOTICE, "Disfavor package: %s\n",
> ++                         pkg->name);
> ++            what = pool_str2id(libsolv_solver->pool, pkg->name, 1);
> ++            queue_push2(&libsolv_solver->solver_jobs,
> SOLVER_SOLVABLE_NAME
> ++                        | SOLVER_DISFAVOR, what);
> ++        }
> ++
> +         /* if the package is not autoinstalled, mark it as user
> installed */
> +         if (!pkg->auto_installed)
> +             queue_push2(&libsolv_solver->solver_jobs, SOLVER_SOLVABLE
> +@@ -539,7 +549,7 @@ static void populate_available_repos(libsolv_solver_t
> *libsolv_solver)
> + {
> +     int i;
> +     Solvable *solvable;
> +-    Id solvable_id;
> ++    Id solvable_id, what;
> +
> +     pkg_vec_t *available_pkgs = pkg_vec_alloc();
> +
> +@@ -608,6 +618,15 @@ static void
> populate_available_repos(libsolv_solver_t *libsolv_solver)
> +         solvable = pool_id2solvable(libsolv_solver->pool, solvable_id);
> +         pkg2solvable(pkg, solvable);
> +
> ++        /* if the package is in ignore-recommends-list, disfavor
> installation */
> ++        if (str_list_contains(&opkg_config->ignore_recommends_list,
> pkg->name)) {
> ++            opkg_message(NOTICE, "Disfavor package: %s\n",
> ++                         pkg->name);
> ++            what = pool_str2id(libsolv_solver->pool, pkg->name, 1);
> ++            queue_push2(&libsolv_solver->solver_jobs,
> SOLVER_SOLVABLE_NAME
> ++                        | SOLVER_DISFAVOR, what);
> ++        }
> ++
> +         /* if the --force-depends option is specified make dependencies
> weak */
> +         if (opkg_config->force_depends)
> +             queue_push2(&libsolv_solver->solver_jobs, SOLVER_SOLVABLE
> +diff --git a/man/opkg.1.in b/man/opkg.1.in
> +index 27fa9c1..f192c3b 100644
> +--- a/man/opkg.1.in
> ++++ b/man/opkg.1.in
> +@@ -162,6 +162,9 @@ priority \fIprio\fP. Lower priorities take precedence.
> + \fB\--add-exclude <\fIname\fP>\fR
> + Register package to be excluded from install
> + .TP
> ++\fB\--add-ignore-recommends <\fIname\fP>\fR
> ++Register package to be ignored as a recomendee
> ++.TP
> + \fB\--prefer-arch-to-version\fR
> + Use the architecture priority package rather than the higher version
> + one if more than one candidate is found.
> +diff --git a/src/opkg.c b/src/opkg.c
> +index 650e278..3c93a3b 100644
> +--- a/src/opkg.c
> ++++ b/src/opkg.c
> +@@ -51,6 +51,7 @@ enum {
> +     ARGS_OPT_ADD_DEST,
> +     ARGS_OPT_SIZE,
> +     ARGS_OPT_ADD_EXCLUDE,
> ++    ARGS_OPT_ADD_IGNORE_RECOMMENDS,
> +     ARGS_OPT_NOACTION,
> +     ARGS_OPT_DOWNLOAD_ONLY,
> +     ARGS_OPT_NODEPS,
> +@@ -112,6 +113,7 @@ static struct option long_options[] = {
> +     {"add-dest", 1, 0, ARGS_OPT_ADD_DEST},
> +     {"size", 0, 0, ARGS_OPT_SIZE},
> +     {"add-exclude", 1, 0, ARGS_OPT_ADD_EXCLUDE},
> ++    {"add-ignore-recommends", 1, 0, ARGS_OPT_ADD_IGNORE_RECOMMENDS},
> +     {"test", 0, 0, ARGS_OPT_NOACTION},
> +     {"tmp-dir", 1, 0, 't'},
> +     {"tmp_dir", 1, 0, 't'},
> +@@ -234,6 +236,9 @@ static int args_parse(int argc, char *argv[])
> +         case ARGS_OPT_ADD_EXCLUDE:
> +             str_list_append(&opkg_config->exclude_list, optarg);
> +             break;
> ++        case ARGS_OPT_ADD_IGNORE_RECOMMENDS:
> ++            str_list_append(&opkg_config->ignore_recommends_list,
> optarg);
> ++            break;
> +         case ARGS_OPT_SIZE:
> +             opkg_config->size = 1;
> +             break;
> +@@ -343,6 +348,7 @@ static void usage()
> +     printf("\t--add-dest <name>:<path>        Register destination with
> given path\n");
> +     printf("\t--add-arch <arch>:<prio>        Register architecture with
> given priority\n");
> +     printf("\t--add-exclude <name>            Register package to be
> excluded from install\n");
> ++    printf("\t--add-ignore-recommends <name>  Register package to be
> ignored as a recomendee\n");
> +     printf("\t--prefer-arch-to-version        Use the architecture
> priority package rather\n");
> +     printf("\t                                than the higher version
> one if more\n");
> +     printf("\t                                than one candidate is
> found.\n");
> +diff --git a/tests/Makefile b/tests/Makefile
> +index 8e5be08..799816d 100644
> +--- a/tests/Makefile
> ++++ b/tests/Makefile
> +@@ -42,6 +42,7 @@ REGRESSION_TESTS := core/01_install.py \
> +                   core/40_arch.py \
> +                   core/41_info_fields.py \
> +                   core/42_info_description.py \
> ++                  core/43_add_ignore_recommends.py \
> +                   regress/issue26.py \
> +                   regress/issue31.py \
> +                   regress/issue32.py \
> +diff --git a/tests/core/43_add_ignore_recommends.py
> b/tests/core/43_add_ignore_recommends.py
> +new file mode 100755
> +index 0000000..7da0096
> +--- /dev/null
> ++++ b/tests/core/43_add_ignore_recommends.py
> +@@ -0,0 +1,62 @@
> ++#! /usr/bin/env python3
> ++#
> ++# Create package 'a' (1.0) which Recommends 'c'.
> ++# Install 'a' with --add-ignore-recommends 'c'.
> ++# Check that only 'a' (1.0) is installed.
> ++# Create package 'b' which Depends on 'c'.
> ++# Install 'a' & 'b', with --add-ignore-recommends 'c'.
> ++# Verify that 'a','b' & 'c' are installed.
> ++# Uninstall 'b' & 'c'.
> ++# Create package 'a' (2.0), which Recommends 'c'.
> ++# Upgrade 'a' with --add-ignore-recommends 'c'
> ++# Verify that only 'a' (2.0) is installed
> ++#
> ++
> ++import os
> ++import opk, cfg, opkgcl
> ++
> ++opk.regress_init()
> ++o = opk.OpkGroup()
> ++
> ++o.add(Package='a', Recommends='c', Version='1.0')
> ++o.add(Package='b', Depends='c')
> ++o.add(Package='c')
> ++o.write_opk()
> ++o.write_list()
> ++
> ++opkgcl.update()
> ++
> ++opkgcl.install('a', '--add-ignore-recommends c')
> ++
> ++if not opkgcl.is_installed('a'):
> ++      opk.fail("Package 'a' installed but reports as not installed.")
> ++
> ++if opkgcl.is_installed('c'):
> ++      opk.xfail("[libsolv<0.7.3] Package 'c' should not have been
> installed since it was in --add-ignore-recommends.")
> ++
> ++opkgcl.remove('a')
> ++opkgcl.install('a b', '--add-ignore-recommends c')
> ++
> ++if not opkgcl.is_installed('a'):
> ++      opk.fail("Package 'a' installed but reports as not installed.")
> ++
> ++if not opkgcl.is_installed('b'):
> ++      opk.fail("Package 'b' installed but reports as not installed.")
> ++
> ++if not opkgcl.is_installed('c'):
> ++      opk.fail("Package 'c' should have been installed since 'b' depends
> on it.")
> ++
> ++opkgcl.remove('b c', '--force-depends')
> ++o.add(Package='a', Recommends='c', Version='2.0')
> ++o.write_opk()
> ++o.write_list()
> ++
> ++opkgcl.update()
> ++
> ++opkgcl.upgrade('a', '--add-ignore-recommends c')
> ++
> ++if not opkgcl.is_installed('a', '2.0'):
> ++      opk.fail("Package 'a (2.0)' installed but reports as not
> installed.")
> ++
> ++if opkgcl.is_installed('c'):
> ++      opk.fail("Package 'c' should not have been installed since it was
> in --add-ignore-recommends.")
> +--
> +2.20.1
> +
> diff --git a/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> b/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> index 9b7cf3f596..a2329d3e71 100644
> --- a/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> +++ b/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> @@ -14,6 +14,7 @@ PE = "1"
>  SRC_URI = "
> http://downloads.yoctoproject.org/releases/${BPN}/${BPN}-${PV}.tar.gz \
>             file://opkg.conf \
>
> file://0001-opkg_conf-create-opkg.lock-in-run-instead-of-var-run.patch \
> +           file://0001-libopkg-add-add-ignore-recommends-option.patch \
>  "
>
>  SRC_URI[md5sum] = "ae51d95fee599bb4dce08453529158f5"
> --
> 2.20.1
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core
>

[-- Attachment #2: Type: text/html, Size: 17958 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] opkg: add --ignore-recommends flag
@ 2019-02-07 17:36     ` Scott Rifenbark
  0 siblings, 0 replies; 10+ messages in thread
From: Scott Rifenbark @ 2019-02-07 17:36 UTC (permalink / raw)
  To: Alejandro del Castillo; +Cc: Yocto discussion list, openembedded-core

[-- Attachment #1: Type: text/plain, Size: 13735 bytes --]

This change looks like it impacts documentation (i.e.
https://yoctoproject.org/docs/2.7/ref-manual/ref-manual.html#var-BAD_RECOMMENDATIONS).
When will this change go into effect?

Scott

On Thu, Feb 7, 2019 at 7:58 AM Alejandro del Castillo <
alejandro.delcastillo@ni.com> wrote:

> To be used for BAD_RECOMMENDATIONS feature.
>
> Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
> ---
>  ...pkg-add-add-ignore-recommends-option.patch | 259 ++++++++++++++++++
>  meta/recipes-devtools/opkg/opkg_0.4.0.bb      |   1 +
>  2 files changed, 260 insertions(+)
>  create mode 100644
> meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
>
> diff --git
> a/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> b/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> new file mode 100644
> index 0000000000..47d1b3c37e
> --- /dev/null
> +++
> b/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> @@ -0,0 +1,259 @@
> +From 64aa98646a17c299bf37af2975b98daf5d7d30b4 Mon Sep 17 00:00:00 2001
> +From: Alejandro del Castillo <alejandro.delcastillo@ni.com>
> +Date: Thu, 31 Jan 2019 18:16:08 -0600
> +Subject: [PATCH] libopkg: add --add-ignore-recommends option
> +
> +Add option to ignore specific recommended packages. On the libsolv
> +backed, this feature will only work on libsolv version > 0.7.2 [1].
> +
> +[1]
> https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openSUSE_libsolv_issues_254&d=DwIBaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=GObNHzFJpWpf_PripIrf-K2RhsktYdAUEieAJexXOKw&s=3G-meChUqClFggFPqsrAxIZBfLnRKIHm62Uuy1X6nQQ&e=
> +
> +Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com>
> +
> +Upstream-Status: Accepted
> +---
> + libopkg/opkg_conf.c                           |  2 +
> + libopkg/opkg_conf.h                           |  1 +
> + .../solvers/internal/pkg_depends_internal.c   |  3 +-
> + libopkg/solvers/libsolv/opkg_solver_libsolv.c | 21 ++++++-
> + man/opkg.1.in                                 |  3 +
> + src/opkg.c                                    |  6 ++
> + tests/Makefile                                |  1 +
> + tests/core/43_add_ignore_recommends.py        | 62 +++++++++++++++++++
> + 8 files changed, 97 insertions(+), 2 deletions(-)
> + create mode 100755 tests/core/43_add_ignore_recommends.py
> +
> +diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c
> +index 06880a1..f2330cd 100644
> +--- a/libopkg/opkg_conf.c
> ++++ b/libopkg/opkg_conf.c
> +@@ -597,6 +597,7 @@ int opkg_conf_init(void)
> +     pkg_dest_list_init(&opkg_config->tmp_dest_list);
> +     nv_pair_list_init(&opkg_config->arch_list);
> +     str_list_init(&opkg_config->exclude_list);
> ++    str_list_init(&opkg_config->ignore_recommends_list);
> +
> +     return 0;
> + }
> +@@ -938,6 +939,7 @@ void opkg_conf_deinit(void)
> +     pkg_dest_list_deinit(&opkg_config->pkg_dest_list);
> +     nv_pair_list_deinit(&opkg_config->arch_list);
> +     str_list_deinit(&opkg_config->exclude_list);
> ++    str_list_deinit(&opkg_config->ignore_recommends_list);
> +
> +     if (opkg_config->verbosity >= DEBUG) {
> +         hash_print_stats(&opkg_config->pkg_hash);
> +diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h
> +index eb56a29..316c500 100644
> +--- a/libopkg/opkg_conf.h
> ++++ b/libopkg/opkg_conf.h
> +@@ -61,6 +61,7 @@ typedef struct opkg_conf {
> +     pkg_dest_list_t tmp_dest_list;
> +     nv_pair_list_t arch_list;
> +     str_list_t exclude_list;
> ++    str_list_t ignore_recommends_list;
> +
> +     int restrict_to_default_dest;
> +     pkg_dest_t *default_dest;
> +diff --git a/libopkg/solvers/internal/pkg_depends_internal.c
> b/libopkg/solvers/internal/pkg_depends_internal.c
> +index cd56d84..5deee70 100644
> +--- a/libopkg/solvers/internal/pkg_depends_internal.c
> ++++ b/libopkg/solvers/internal/pkg_depends_internal.c
> +@@ -228,7 +228,8 @@ int pkg_hash_fetch_unsatisfied_dependencies(pkg_t
> *pkg,
> +                             || compound_depend->type == SUGGEST)
> +                         && (satisfying_pkg->state_want == SW_DEINSTALL
> +                             || satisfying_pkg->state_want == SW_PURGE
> +-                            || opkg_config->no_install_recommends);
> ++                            || opkg_config->no_install_recommends
> ++                            ||
> str_list_contains(&opkg_config->ignore_recommends_list,
> satisfying_pkg->name));
> +                 if (ignore) {
> +                     opkg_msg(NOTICE,
> +                              "%s: ignoring recommendation for "
> +diff --git a/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> b/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> +index 2b27e3a..403e07b 100644
> +--- a/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> ++++ b/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> +@@ -484,6 +484,7 @@ static void pkg2solvable(pkg_t *pkg, Solvable
> *solvable_out)
> + static void populate_installed_repo(libsolv_solver_t *libsolv_solver)
> + {
> +     int i;
> ++    Id what;
> +
> +     pkg_vec_t *installed_pkgs = pkg_vec_alloc();
> +
> +@@ -507,6 +508,15 @@ static void populate_installed_repo(libsolv_solver_t
> *libsolv_solver)
> +         /* set solvable attributes */
> +         pkg2solvable(pkg, solvable);
> +
> ++        /* if the package is in ignore-recommends-list, disfavor
> installation */
> ++        if (str_list_contains(&opkg_config->ignore_recommends_list,
> pkg->name)) {
> ++            opkg_message(NOTICE, "Disfavor package: %s\n",
> ++                         pkg->name);
> ++            what = pool_str2id(libsolv_solver->pool, pkg->name, 1);
> ++            queue_push2(&libsolv_solver->solver_jobs,
> SOLVER_SOLVABLE_NAME
> ++                        | SOLVER_DISFAVOR, what);
> ++        }
> ++
> +         /* if the package is not autoinstalled, mark it as user
> installed */
> +         if (!pkg->auto_installed)
> +             queue_push2(&libsolv_solver->solver_jobs, SOLVER_SOLVABLE
> +@@ -539,7 +549,7 @@ static void populate_available_repos(libsolv_solver_t
> *libsolv_solver)
> + {
> +     int i;
> +     Solvable *solvable;
> +-    Id solvable_id;
> ++    Id solvable_id, what;
> +
> +     pkg_vec_t *available_pkgs = pkg_vec_alloc();
> +
> +@@ -608,6 +618,15 @@ static void
> populate_available_repos(libsolv_solver_t *libsolv_solver)
> +         solvable = pool_id2solvable(libsolv_solver->pool, solvable_id);
> +         pkg2solvable(pkg, solvable);
> +
> ++        /* if the package is in ignore-recommends-list, disfavor
> installation */
> ++        if (str_list_contains(&opkg_config->ignore_recommends_list,
> pkg->name)) {
> ++            opkg_message(NOTICE, "Disfavor package: %s\n",
> ++                         pkg->name);
> ++            what = pool_str2id(libsolv_solver->pool, pkg->name, 1);
> ++            queue_push2(&libsolv_solver->solver_jobs,
> SOLVER_SOLVABLE_NAME
> ++                        | SOLVER_DISFAVOR, what);
> ++        }
> ++
> +         /* if the --force-depends option is specified make dependencies
> weak */
> +         if (opkg_config->force_depends)
> +             queue_push2(&libsolv_solver->solver_jobs, SOLVER_SOLVABLE
> +diff --git a/man/opkg.1.in b/man/opkg.1.in
> +index 27fa9c1..f192c3b 100644
> +--- a/man/opkg.1.in
> ++++ b/man/opkg.1.in
> +@@ -162,6 +162,9 @@ priority \fIprio\fP. Lower priorities take precedence.
> + \fB\--add-exclude <\fIname\fP>\fR
> + Register package to be excluded from install
> + .TP
> ++\fB\--add-ignore-recommends <\fIname\fP>\fR
> ++Register package to be ignored as a recomendee
> ++.TP
> + \fB\--prefer-arch-to-version\fR
> + Use the architecture priority package rather than the higher version
> + one if more than one candidate is found.
> +diff --git a/src/opkg.c b/src/opkg.c
> +index 650e278..3c93a3b 100644
> +--- a/src/opkg.c
> ++++ b/src/opkg.c
> +@@ -51,6 +51,7 @@ enum {
> +     ARGS_OPT_ADD_DEST,
> +     ARGS_OPT_SIZE,
> +     ARGS_OPT_ADD_EXCLUDE,
> ++    ARGS_OPT_ADD_IGNORE_RECOMMENDS,
> +     ARGS_OPT_NOACTION,
> +     ARGS_OPT_DOWNLOAD_ONLY,
> +     ARGS_OPT_NODEPS,
> +@@ -112,6 +113,7 @@ static struct option long_options[] = {
> +     {"add-dest", 1, 0, ARGS_OPT_ADD_DEST},
> +     {"size", 0, 0, ARGS_OPT_SIZE},
> +     {"add-exclude", 1, 0, ARGS_OPT_ADD_EXCLUDE},
> ++    {"add-ignore-recommends", 1, 0, ARGS_OPT_ADD_IGNORE_RECOMMENDS},
> +     {"test", 0, 0, ARGS_OPT_NOACTION},
> +     {"tmp-dir", 1, 0, 't'},
> +     {"tmp_dir", 1, 0, 't'},
> +@@ -234,6 +236,9 @@ static int args_parse(int argc, char *argv[])
> +         case ARGS_OPT_ADD_EXCLUDE:
> +             str_list_append(&opkg_config->exclude_list, optarg);
> +             break;
> ++        case ARGS_OPT_ADD_IGNORE_RECOMMENDS:
> ++            str_list_append(&opkg_config->ignore_recommends_list,
> optarg);
> ++            break;
> +         case ARGS_OPT_SIZE:
> +             opkg_config->size = 1;
> +             break;
> +@@ -343,6 +348,7 @@ static void usage()
> +     printf("\t--add-dest <name>:<path>        Register destination with
> given path\n");
> +     printf("\t--add-arch <arch>:<prio>        Register architecture with
> given priority\n");
> +     printf("\t--add-exclude <name>            Register package to be
> excluded from install\n");
> ++    printf("\t--add-ignore-recommends <name>  Register package to be
> ignored as a recomendee\n");
> +     printf("\t--prefer-arch-to-version        Use the architecture
> priority package rather\n");
> +     printf("\t                                than the higher version
> one if more\n");
> +     printf("\t                                than one candidate is
> found.\n");
> +diff --git a/tests/Makefile b/tests/Makefile
> +index 8e5be08..799816d 100644
> +--- a/tests/Makefile
> ++++ b/tests/Makefile
> +@@ -42,6 +42,7 @@ REGRESSION_TESTS := core/01_install.py \
> +                   core/40_arch.py \
> +                   core/41_info_fields.py \
> +                   core/42_info_description.py \
> ++                  core/43_add_ignore_recommends.py \
> +                   regress/issue26.py \
> +                   regress/issue31.py \
> +                   regress/issue32.py \
> +diff --git a/tests/core/43_add_ignore_recommends.py
> b/tests/core/43_add_ignore_recommends.py
> +new file mode 100755
> +index 0000000..7da0096
> +--- /dev/null
> ++++ b/tests/core/43_add_ignore_recommends.py
> +@@ -0,0 +1,62 @@
> ++#! /usr/bin/env python3
> ++#
> ++# Create package 'a' (1.0) which Recommends 'c'.
> ++# Install 'a' with --add-ignore-recommends 'c'.
> ++# Check that only 'a' (1.0) is installed.
> ++# Create package 'b' which Depends on 'c'.
> ++# Install 'a' & 'b', with --add-ignore-recommends 'c'.
> ++# Verify that 'a','b' & 'c' are installed.
> ++# Uninstall 'b' & 'c'.
> ++# Create package 'a' (2.0), which Recommends 'c'.
> ++# Upgrade 'a' with --add-ignore-recommends 'c'
> ++# Verify that only 'a' (2.0) is installed
> ++#
> ++
> ++import os
> ++import opk, cfg, opkgcl
> ++
> ++opk.regress_init()
> ++o = opk.OpkGroup()
> ++
> ++o.add(Package='a', Recommends='c', Version='1.0')
> ++o.add(Package='b', Depends='c')
> ++o.add(Package='c')
> ++o.write_opk()
> ++o.write_list()
> ++
> ++opkgcl.update()
> ++
> ++opkgcl.install('a', '--add-ignore-recommends c')
> ++
> ++if not opkgcl.is_installed('a'):
> ++      opk.fail("Package 'a' installed but reports as not installed.")
> ++
> ++if opkgcl.is_installed('c'):
> ++      opk.xfail("[libsolv<0.7.3] Package 'c' should not have been
> installed since it was in --add-ignore-recommends.")
> ++
> ++opkgcl.remove('a')
> ++opkgcl.install('a b', '--add-ignore-recommends c')
> ++
> ++if not opkgcl.is_installed('a'):
> ++      opk.fail("Package 'a' installed but reports as not installed.")
> ++
> ++if not opkgcl.is_installed('b'):
> ++      opk.fail("Package 'b' installed but reports as not installed.")
> ++
> ++if not opkgcl.is_installed('c'):
> ++      opk.fail("Package 'c' should have been installed since 'b' depends
> on it.")
> ++
> ++opkgcl.remove('b c', '--force-depends')
> ++o.add(Package='a', Recommends='c', Version='2.0')
> ++o.write_opk()
> ++o.write_list()
> ++
> ++opkgcl.update()
> ++
> ++opkgcl.upgrade('a', '--add-ignore-recommends c')
> ++
> ++if not opkgcl.is_installed('a', '2.0'):
> ++      opk.fail("Package 'a (2.0)' installed but reports as not
> installed.")
> ++
> ++if opkgcl.is_installed('c'):
> ++      opk.fail("Package 'c' should not have been installed since it was
> in --add-ignore-recommends.")
> +--
> +2.20.1
> +
> diff --git a/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> b/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> index 9b7cf3f596..a2329d3e71 100644
> --- a/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> +++ b/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> @@ -14,6 +14,7 @@ PE = "1"
>  SRC_URI = "
> http://downloads.yoctoproject.org/releases/${BPN}/${BPN}-${PV}.tar.gz \
>             file://opkg.conf \
>
> file://0001-opkg_conf-create-opkg.lock-in-run-instead-of-var-run.patch \
> +           file://0001-libopkg-add-add-ignore-recommends-option.patch \
>  "
>
>  SRC_URI[md5sum] = "ae51d95fee599bb4dce08453529158f5"
> --
> 2.20.1
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core
>

[-- Attachment #2: Type: text/html, Size: 17958 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [OE-core] [PATCH 1/3] opkg: add --ignore-recommends flag
  2019-02-07 17:36     ` Scott Rifenbark
@ 2019-02-07 17:44       ` Alejandro Del Castillo
  -1 siblings, 0 replies; 10+ messages in thread
From: Alejandro Del Castillo @ 2019-02-07 17:44 UTC (permalink / raw)
  To: Scott Rifenbark; +Cc: Yocto discussion list, openembedded-core



On 2/7/19 11:36 AM, Scott Rifenbark wrote:
> This change looks like it impacts documentation (i.e. 
> https://yoctoproject.org/docs/2.7/ref-manual/ref-manual.html#var-BAD_RECOMMENDATIONS.  
> When will this change go into effect? 

I believe it doesn't. It is refactoring the opkg implementation to 
leverage a new opkg feature (--add-ignore-recommends), which is a more 
robust implementation. Should be transparent to users.

> On Thu, Feb 7, 2019 at 7:58 AM Alejandro del Castillo 
> <alejandro.delcastillo@ni.com <mailto:alejandro.delcastillo@ni.com>> wrote:
> 
>     To be used for BAD_RECOMMENDATIONS feature.
> 
>     Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com
>     <mailto:alejandro.delcastillo@ni.com>>
>     ---
>       ...pkg-add-add-ignore-recommends-option.patch | 259 ++++++++++++++++++
>       meta/recipes-devtools/opkg/opkg_0.4.0.bb
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=> 
>          |   1 +
>       2 files changed, 260 insertions(+)
>       create mode 100644
>     meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> 
>     diff --git
>     a/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
>     b/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
>     new file mode 100644
>     index 0000000000..47d1b3c37e
>     --- /dev/null
>     +++
>     b/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
>     @@ -0,0 +1,259 @@
>     +From 64aa98646a17c299bf37af2975b98daf5d7d30b4 Mon Sep 17 00:00:00 2001
>     +From: Alejandro del Castillo <alejandro.delcastillo@ni.com
>     <mailto:alejandro.delcastillo@ni.com>>
>     +Date: Thu, 31 Jan 2019 18:16:08 -0600
>     +Subject: [PATCH] libopkg: add --add-ignore-recommends option
>     +
>     +Add option to ignore specific recommended packages. On the libsolv
>     +backed, this feature will only work on libsolv version > 0.7.2 [1].
>     +
>     +[1]
>     https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openSUSE_libsolv_issues_254&d=DwIBaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=GObNHzFJpWpf_PripIrf-K2RhsktYdAUEieAJexXOKw&s=3G-meChUqClFggFPqsrAxIZBfLnRKIHm62Uuy1X6nQQ&e=
>     +
>     +Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com
>     <mailto:alejandro.delcastillo@ni.com>>
>     +
>     +Upstream-Status: Accepted
>     +---
>     + libopkg/opkg_conf.c                           |  2 +
>     + libopkg/opkg_conf.h                           |  1 +
>     + .../solvers/internal/pkg_depends_internal.c   |  3 +-
>     + libopkg/solvers/libsolv/opkg_solver_libsolv.c | 21 ++++++-
>     + man/opkg.1.in
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=> 
>                                     |  3 +
>     + src/opkg.c                                    |  6 ++
>     + tests/Makefile                                |  1 +
>     + tests/core/43_add_ignore_recommends.py        | 62 +++++++++++++++++++
>     + 8 files changed, 97 insertions(+), 2 deletions(-)
>     + create mode 100755 tests/core/43_add_ignore_recommends.py
>     +
>     +diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c
>     +index 06880a1..f2330cd 100644
>     +--- a/libopkg/opkg_conf.c
>     ++++ b/libopkg/opkg_conf.c
>     +@@ -597,6 +597,7 @@ int opkg_conf_init(void)
>     +     pkg_dest_list_init(&opkg_config->tmp_dest_list);
>     +     nv_pair_list_init(&opkg_config->arch_list);
>     +     str_list_init(&opkg_config->exclude_list);
>     ++    str_list_init(&opkg_config->ignore_recommends_list);
>     +
>     +     return 0;
>     + }
>     +@@ -938,6 +939,7 @@ void opkg_conf_deinit(void)
>     +     pkg_dest_list_deinit(&opkg_config->pkg_dest_list);
>     +     nv_pair_list_deinit(&opkg_config->arch_list);
>     +     str_list_deinit(&opkg_config->exclude_list);
>     ++    str_list_deinit(&opkg_config->ignore_recommends_list);
>     +
>     +     if (opkg_config->verbosity >= DEBUG) {
>     +         hash_print_stats(&opkg_config->pkg_hash);
>     +diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h
>     +index eb56a29..316c500 100644
>     +--- a/libopkg/opkg_conf.h
>     ++++ b/libopkg/opkg_conf.h
>     +@@ -61,6 +61,7 @@ typedef struct opkg_conf {
>     +     pkg_dest_list_t tmp_dest_list;
>     +     nv_pair_list_t arch_list;
>     +     str_list_t exclude_list;
>     ++    str_list_t ignore_recommends_list;
>     +
>     +     int restrict_to_default_dest;
>     +     pkg_dest_t *default_dest;
>     +diff --git a/libopkg/solvers/internal/pkg_depends_internal.c
>     b/libopkg/solvers/internal/pkg_depends_internal.c
>     +index cd56d84..5deee70 100644
>     +--- a/libopkg/solvers/internal/pkg_depends_internal.c
>     ++++ b/libopkg/solvers/internal/pkg_depends_internal.c
>     +@@ -228,7 +228,8 @@ int
>     pkg_hash_fetch_unsatisfied_dependencies(pkg_t *pkg,
>     +                             || compound_depend->type == SUGGEST)
>     +                         && (satisfying_pkg->state_want == SW_DEINSTALL
>     +                             || satisfying_pkg->state_want == SW_PURGE
>     +-                            || opkg_config->no_install_recommends);
>     ++                            || opkg_config->no_install_recommends
>     ++                            ||
>     str_list_contains(&opkg_config->ignore_recommends_list,
>     satisfying_pkg->name));
>     +                 if (ignore) {
>     +                     opkg_msg(NOTICE,
>     +                              "%s: ignoring recommendation for "
>     +diff --git a/libopkg/solvers/libsolv/opkg_solver_libsolv.c
>     b/libopkg/solvers/libsolv/opkg_solver_libsolv.c
>     +index 2b27e3a..403e07b 100644
>     +--- a/libopkg/solvers/libsolv/opkg_solver_libsolv.c
>     ++++ b/libopkg/solvers/libsolv/opkg_solver_libsolv.c
>     +@@ -484,6 +484,7 @@ static void pkg2solvable(pkg_t *pkg, Solvable
>     *solvable_out)
>     + static void populate_installed_repo(libsolv_solver_t *libsolv_solver)
>     + {
>     +     int i;
>     ++    Id what;
>     +
>     +     pkg_vec_t *installed_pkgs = pkg_vec_alloc();
>     +
>     +@@ -507,6 +508,15 @@ static void
>     populate_installed_repo(libsolv_solver_t *libsolv_solver)
>     +         /* set solvable attributes */
>     +         pkg2solvable(pkg, solvable);
>     +
>     ++        /* if the package is in ignore-recommends-list, disfavor
>     installation */
>     ++        if
>     (str_list_contains(&opkg_config->ignore_recommends_list, pkg->name)) {
>     ++            opkg_message(NOTICE, "Disfavor package: %s\n",
>     ++                         pkg->name);
>     ++            what = pool_str2id(libsolv_solver->pool, pkg->name, 1);
>     ++            queue_push2(&libsolv_solver->solver_jobs,
>     SOLVER_SOLVABLE_NAME
>     ++                        | SOLVER_DISFAVOR, what);
>     ++        }
>     ++
>     +         /* if the package is not autoinstalled, mark it as user
>     installed */
>     +         if (!pkg->auto_installed)
>     +             queue_push2(&libsolv_solver->solver_jobs, SOLVER_SOLVABLE
>     +@@ -539,7 +549,7 @@ static void
>     populate_available_repos(libsolv_solver_t *libsolv_solver)
>     + {
>     +     int i;
>     +     Solvable *solvable;
>     +-    Id solvable_id;
>     ++    Id solvable_id, what;
>     +
>     +     pkg_vec_t *available_pkgs = pkg_vec_alloc();
>     +
>     +@@ -608,6 +618,15 @@ static void
>     populate_available_repos(libsolv_solver_t *libsolv_solver)
>     +         solvable = pool_id2solvable(libsolv_solver->pool,
>     solvable_id);
>     +         pkg2solvable(pkg, solvable);
>     +
>     ++        /* if the package is in ignore-recommends-list, disfavor
>     installation */
>     ++        if
>     (str_list_contains(&opkg_config->ignore_recommends_list, pkg->name)) {
>     ++            opkg_message(NOTICE, "Disfavor package: %s\n",
>     ++                         pkg->name);
>     ++            what = pool_str2id(libsolv_solver->pool, pkg->name, 1);
>     ++            queue_push2(&libsolv_solver->solver_jobs,
>     SOLVER_SOLVABLE_NAME
>     ++                        | SOLVER_DISFAVOR, what);
>     ++        }
>     ++
>     +         /* if the --force-depends option is specified make
>     dependencies weak */
>     +         if (opkg_config->force_depends)
>     +             queue_push2(&libsolv_solver->solver_jobs, SOLVER_SOLVABLE
>     +diff --git a/man/opkg.1.in
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=>
>     b/man/opkg.1.in
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=>
>     +index 27fa9c1..f192c3b 100644
>     +--- a/man/opkg.1.in
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=>
>     ++++ b/man/opkg.1.in
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=>
>     +@@ -162,6 +162,9 @@ priority \fIprio\fP. Lower priorities take
>     precedence.
>     + \fB\--add-exclude <\fIname\fP>\fR
>     + Register package to be excluded from install
>     + .TP
>     ++\fB\--add-ignore-recommends <\fIname\fP>\fR
>     ++Register package to be ignored as a recomendee
>     ++.TP
>     + \fB\--prefer-arch-to-version\fR
>     + Use the architecture priority package rather than the higher version
>     + one if more than one candidate is found.
>     +diff --git a/src/opkg.c b/src/opkg.c
>     +index 650e278..3c93a3b 100644
>     +--- a/src/opkg.c
>     ++++ b/src/opkg.c
>     +@@ -51,6 +51,7 @@ enum {
>     +     ARGS_OPT_ADD_DEST,
>     +     ARGS_OPT_SIZE,
>     +     ARGS_OPT_ADD_EXCLUDE,
>     ++    ARGS_OPT_ADD_IGNORE_RECOMMENDS,
>     +     ARGS_OPT_NOACTION,
>     +     ARGS_OPT_DOWNLOAD_ONLY,
>     +     ARGS_OPT_NODEPS,
>     +@@ -112,6 +113,7 @@ static struct option long_options[] = {
>     +     {"add-dest", 1, 0, ARGS_OPT_ADD_DEST},
>     +     {"size", 0, 0, ARGS_OPT_SIZE},
>     +     {"add-exclude", 1, 0, ARGS_OPT_ADD_EXCLUDE},
>     ++    {"add-ignore-recommends", 1, 0, ARGS_OPT_ADD_IGNORE_RECOMMENDS},
>     +     {"test", 0, 0, ARGS_OPT_NOACTION},
>     +     {"tmp-dir", 1, 0, 't'},
>     +     {"tmp_dir", 1, 0, 't'},
>     +@@ -234,6 +236,9 @@ static int args_parse(int argc, char *argv[])
>     +         case ARGS_OPT_ADD_EXCLUDE:
>     +             str_list_append(&opkg_config->exclude_list, optarg);
>     +             break;
>     ++        case ARGS_OPT_ADD_IGNORE_RECOMMENDS:
>     ++            str_list_append(&opkg_config->ignore_recommends_list,
>     optarg);
>     ++            break;
>     +         case ARGS_OPT_SIZE:
>     +             opkg_config->size = 1;
>     +             break;
>     +@@ -343,6 +348,7 @@ static void usage()
>     +     printf("\t--add-dest <name>:<path>        Register destination
>     with given path\n");
>     +     printf("\t--add-arch <arch>:<prio>        Register
>     architecture with given priority\n");
>     +     printf("\t--add-exclude <name>            Register package to
>     be excluded from install\n");
>     ++    printf("\t--add-ignore-recommends <name>  Register package to
>     be ignored as a recomendee\n");
>     +     printf("\t--prefer-arch-to-version        Use the architecture
>     priority package rather\n");
>     +     printf("\t                                than the higher
>     version one if more\n");
>     +     printf("\t                                than one candidate
>     is found.\n");
>     +diff --git a/tests/Makefile b/tests/Makefile
>     +index 8e5be08..799816d 100644
>     +--- a/tests/Makefile
>     ++++ b/tests/Makefile
>     +@@ -42,6 +42,7 @@ REGRESSION_TESTS := core/01_install.py \
>     +                   core/40_arch.py \
>     +                   core/41_info_fields.py \
>     +                   core/42_info_description.py \
>     ++                  core/43_add_ignore_recommends.py \
>     +                   regress/issue26.py \
>     +                   regress/issue31.py \
>     +                   regress/issue32.py \
>     +diff --git a/tests/core/43_add_ignore_recommends.py
>     b/tests/core/43_add_ignore_recommends.py
>     +new file mode 100755
>     +index 0000000..7da0096
>     +--- /dev/null
>     ++++ b/tests/core/43_add_ignore_recommends.py
>     +@@ -0,0 +1,62 @@
>     ++#! /usr/bin/env python3
>     ++#
>     ++# Create package 'a' (1.0) which Recommends 'c'.
>     ++# Install 'a' with --add-ignore-recommends 'c'.
>     ++# Check that only 'a' (1.0) is installed.
>     ++# Create package 'b' which Depends on 'c'.
>     ++# Install 'a' & 'b', with --add-ignore-recommends 'c'.
>     ++# Verify that 'a','b' & 'c' are installed.
>     ++# Uninstall 'b' & 'c'.
>     ++# Create package 'a' (2.0), which Recommends 'c'.
>     ++# Upgrade 'a' with --add-ignore-recommends 'c'
>     ++# Verify that only 'a' (2.0) is installed
>     ++#
>     ++
>     ++import os
>     ++import opk, cfg, opkgcl
>     ++
>     ++opk.regress_init()
>     ++o = opk.OpkGroup()
>     ++
>     ++o.add(Package='a', Recommends='c', Version='1.0')
>     ++o.add(Package='b', Depends='c')
>     ++o.add(Package='c')
>     ++o.write_opk()
>     ++o.write_list()
>     ++
>     ++opkgcl.update()
>     ++
>     ++opkgcl.install('a', '--add-ignore-recommends c')
>     ++
>     ++if not opkgcl.is_installed('a'):
>     ++      opk.fail("Package 'a' installed but reports as not installed.")
>     ++
>     ++if opkgcl.is_installed('c'):
>     ++      opk.xfail("[libsolv<0.7.3] Package 'c' should not have been
>     installed since it was in --add-ignore-recommends.")
>     ++
>     ++opkgcl.remove('a')
>     ++opkgcl.install('a b', '--add-ignore-recommends c')
>     ++
>     ++if not opkgcl.is_installed('a'):
>     ++      opk.fail("Package 'a' installed but reports as not installed.")
>     ++
>     ++if not opkgcl.is_installed('b'):
>     ++      opk.fail("Package 'b' installed but reports as not installed.")
>     ++
>     ++if not opkgcl.is_installed('c'):
>     ++      opk.fail("Package 'c' should have been installed since 'b'
>     depends on it.")
>     ++
>     ++opkgcl.remove('b c', '--force-depends')
>     ++o.add(Package='a', Recommends='c', Version='2.0')
>     ++o.write_opk()
>     ++o.write_list()
>     ++
>     ++opkgcl.update()
>     ++
>     ++opkgcl.upgrade('a', '--add-ignore-recommends c')
>     ++
>     ++if not opkgcl.is_installed('a', '2.0'):
>     ++      opk.fail("Package 'a (2.0)' installed but reports as not
>     installed.")
>     ++
>     ++if opkgcl.is_installed('c'):
>     ++      opk.fail("Package 'c' should not have been installed since
>     it was in --add-ignore-recommends.")
>     +--
>     +2.20.1
>     +
>     diff --git a/meta/recipes-devtools/opkg/opkg_0.4.0.bb
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=>
>     b/meta/recipes-devtools/opkg/opkg_0.4.0.bb
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=>
>     index 9b7cf3f596..a2329d3e71 100644
>     --- a/meta/recipes-devtools/opkg/opkg_0.4.0.bb
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=>
>     +++ b/meta/recipes-devtools/opkg/opkg_0.4.0.bb
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=>
>     @@ -14,6 +14,7 @@ PE = "1"
>       SRC_URI =
>     "http://downloads.yoctoproject.org/releases/${BPN}/${BPN}-${PV}.tar.gz
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__downloads.yoctoproject.org_releases_-24-257BBPN-257D_-24-257BBPN-257D-2D-24-257BPV-257D.tar.gz&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=YLvorPjD5Y4WlqpYdjRMCkzwnh_cz-C6op19u5O23b8&e=>
>     \
>                  file://opkg.conf \
>                 
>     file://0001-opkg_conf-create-opkg.lock-in-run-instead-of-var-run.patch \
>     +           file://0001-libopkg-add-add-ignore-recommends-option.patch \
>       "
> 
>       SRC_URI[md5sum] = "ae51d95fee599bb4dce08453529158f5"
>     -- 
>     2.20.1
> 
>     -- 
>     _______________________________________________
>     Openembedded-core mailing list
>     Openembedded-core@lists.openembedded.org
>     <mailto:Openembedded-core@lists.openembedded.org>
>     http://lists.openembedded.org/mailman/listinfo/openembedded-core
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.openembedded.org_mailman_listinfo_openembedded-2Dcore&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=UHPegBWeyh1LTyIdp2oai1-Ecy-s_l8In1Kk14OFS6Q&e=>
> 

-- 
Cheers,

Alejandro

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] opkg: add --ignore-recommends flag
@ 2019-02-07 17:44       ` Alejandro Del Castillo
  0 siblings, 0 replies; 10+ messages in thread
From: Alejandro Del Castillo @ 2019-02-07 17:44 UTC (permalink / raw)
  To: Scott Rifenbark; +Cc: Yocto discussion list, openembedded-core



On 2/7/19 11:36 AM, Scott Rifenbark wrote:
> This change looks like it impacts documentation (i.e. 
> https://yoctoproject.org/docs/2.7/ref-manual/ref-manual.html#var-BAD_RECOMMENDATIONS.  
> When will this change go into effect? 

I believe it doesn't. It is refactoring the opkg implementation to 
leverage a new opkg feature (--add-ignore-recommends), which is a more 
robust implementation. Should be transparent to users.

> On Thu, Feb 7, 2019 at 7:58 AM Alejandro del Castillo 
> <alejandro.delcastillo@ni.com <mailto:alejandro.delcastillo@ni.com>> wrote:
> 
>     To be used for BAD_RECOMMENDATIONS feature.
> 
>     Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com
>     <mailto:alejandro.delcastillo@ni.com>>
>     ---
>       ...pkg-add-add-ignore-recommends-option.patch | 259 ++++++++++++++++++
>       meta/recipes-devtools/opkg/opkg_0.4.0.bb
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=> 
>          |   1 +
>       2 files changed, 260 insertions(+)
>       create mode 100644
>     meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> 
>     diff --git
>     a/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
>     b/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
>     new file mode 100644
>     index 0000000000..47d1b3c37e
>     --- /dev/null
>     +++
>     b/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
>     @@ -0,0 +1,259 @@
>     +From 64aa98646a17c299bf37af2975b98daf5d7d30b4 Mon Sep 17 00:00:00 2001
>     +From: Alejandro del Castillo <alejandro.delcastillo@ni.com
>     <mailto:alejandro.delcastillo@ni.com>>
>     +Date: Thu, 31 Jan 2019 18:16:08 -0600
>     +Subject: [PATCH] libopkg: add --add-ignore-recommends option
>     +
>     +Add option to ignore specific recommended packages. On the libsolv
>     +backed, this feature will only work on libsolv version > 0.7.2 [1].
>     +
>     +[1]
>     https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openSUSE_libsolv_issues_254&d=DwIBaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=GObNHzFJpWpf_PripIrf-K2RhsktYdAUEieAJexXOKw&s=3G-meChUqClFggFPqsrAxIZBfLnRKIHm62Uuy1X6nQQ&e=
>     +
>     +Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com
>     <mailto:alejandro.delcastillo@ni.com>>
>     +
>     +Upstream-Status: Accepted
>     +---
>     + libopkg/opkg_conf.c                           |  2 +
>     + libopkg/opkg_conf.h                           |  1 +
>     + .../solvers/internal/pkg_depends_internal.c   |  3 +-
>     + libopkg/solvers/libsolv/opkg_solver_libsolv.c | 21 ++++++-
>     + man/opkg.1.in
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=> 
>                                     |  3 +
>     + src/opkg.c                                    |  6 ++
>     + tests/Makefile                                |  1 +
>     + tests/core/43_add_ignore_recommends.py        | 62 +++++++++++++++++++
>     + 8 files changed, 97 insertions(+), 2 deletions(-)
>     + create mode 100755 tests/core/43_add_ignore_recommends.py
>     +
>     +diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c
>     +index 06880a1..f2330cd 100644
>     +--- a/libopkg/opkg_conf.c
>     ++++ b/libopkg/opkg_conf.c
>     +@@ -597,6 +597,7 @@ int opkg_conf_init(void)
>     +     pkg_dest_list_init(&opkg_config->tmp_dest_list);
>     +     nv_pair_list_init(&opkg_config->arch_list);
>     +     str_list_init(&opkg_config->exclude_list);
>     ++    str_list_init(&opkg_config->ignore_recommends_list);
>     +
>     +     return 0;
>     + }
>     +@@ -938,6 +939,7 @@ void opkg_conf_deinit(void)
>     +     pkg_dest_list_deinit(&opkg_config->pkg_dest_list);
>     +     nv_pair_list_deinit(&opkg_config->arch_list);
>     +     str_list_deinit(&opkg_config->exclude_list);
>     ++    str_list_deinit(&opkg_config->ignore_recommends_list);
>     +
>     +     if (opkg_config->verbosity >= DEBUG) {
>     +         hash_print_stats(&opkg_config->pkg_hash);
>     +diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h
>     +index eb56a29..316c500 100644
>     +--- a/libopkg/opkg_conf.h
>     ++++ b/libopkg/opkg_conf.h
>     +@@ -61,6 +61,7 @@ typedef struct opkg_conf {
>     +     pkg_dest_list_t tmp_dest_list;
>     +     nv_pair_list_t arch_list;
>     +     str_list_t exclude_list;
>     ++    str_list_t ignore_recommends_list;
>     +
>     +     int restrict_to_default_dest;
>     +     pkg_dest_t *default_dest;
>     +diff --git a/libopkg/solvers/internal/pkg_depends_internal.c
>     b/libopkg/solvers/internal/pkg_depends_internal.c
>     +index cd56d84..5deee70 100644
>     +--- a/libopkg/solvers/internal/pkg_depends_internal.c
>     ++++ b/libopkg/solvers/internal/pkg_depends_internal.c
>     +@@ -228,7 +228,8 @@ int
>     pkg_hash_fetch_unsatisfied_dependencies(pkg_t *pkg,
>     +                             || compound_depend->type == SUGGEST)
>     +                         && (satisfying_pkg->state_want == SW_DEINSTALL
>     +                             || satisfying_pkg->state_want == SW_PURGE
>     +-                            || opkg_config->no_install_recommends);
>     ++                            || opkg_config->no_install_recommends
>     ++                            ||
>     str_list_contains(&opkg_config->ignore_recommends_list,
>     satisfying_pkg->name));
>     +                 if (ignore) {
>     +                     opkg_msg(NOTICE,
>     +                              "%s: ignoring recommendation for "
>     +diff --git a/libopkg/solvers/libsolv/opkg_solver_libsolv.c
>     b/libopkg/solvers/libsolv/opkg_solver_libsolv.c
>     +index 2b27e3a..403e07b 100644
>     +--- a/libopkg/solvers/libsolv/opkg_solver_libsolv.c
>     ++++ b/libopkg/solvers/libsolv/opkg_solver_libsolv.c
>     +@@ -484,6 +484,7 @@ static void pkg2solvable(pkg_t *pkg, Solvable
>     *solvable_out)
>     + static void populate_installed_repo(libsolv_solver_t *libsolv_solver)
>     + {
>     +     int i;
>     ++    Id what;
>     +
>     +     pkg_vec_t *installed_pkgs = pkg_vec_alloc();
>     +
>     +@@ -507,6 +508,15 @@ static void
>     populate_installed_repo(libsolv_solver_t *libsolv_solver)
>     +         /* set solvable attributes */
>     +         pkg2solvable(pkg, solvable);
>     +
>     ++        /* if the package is in ignore-recommends-list, disfavor
>     installation */
>     ++        if
>     (str_list_contains(&opkg_config->ignore_recommends_list, pkg->name)) {
>     ++            opkg_message(NOTICE, "Disfavor package: %s\n",
>     ++                         pkg->name);
>     ++            what = pool_str2id(libsolv_solver->pool, pkg->name, 1);
>     ++            queue_push2(&libsolv_solver->solver_jobs,
>     SOLVER_SOLVABLE_NAME
>     ++                        | SOLVER_DISFAVOR, what);
>     ++        }
>     ++
>     +         /* if the package is not autoinstalled, mark it as user
>     installed */
>     +         if (!pkg->auto_installed)
>     +             queue_push2(&libsolv_solver->solver_jobs, SOLVER_SOLVABLE
>     +@@ -539,7 +549,7 @@ static void
>     populate_available_repos(libsolv_solver_t *libsolv_solver)
>     + {
>     +     int i;
>     +     Solvable *solvable;
>     +-    Id solvable_id;
>     ++    Id solvable_id, what;
>     +
>     +     pkg_vec_t *available_pkgs = pkg_vec_alloc();
>     +
>     +@@ -608,6 +618,15 @@ static void
>     populate_available_repos(libsolv_solver_t *libsolv_solver)
>     +         solvable = pool_id2solvable(libsolv_solver->pool,
>     solvable_id);
>     +         pkg2solvable(pkg, solvable);
>     +
>     ++        /* if the package is in ignore-recommends-list, disfavor
>     installation */
>     ++        if
>     (str_list_contains(&opkg_config->ignore_recommends_list, pkg->name)) {
>     ++            opkg_message(NOTICE, "Disfavor package: %s\n",
>     ++                         pkg->name);
>     ++            what = pool_str2id(libsolv_solver->pool, pkg->name, 1);
>     ++            queue_push2(&libsolv_solver->solver_jobs,
>     SOLVER_SOLVABLE_NAME
>     ++                        | SOLVER_DISFAVOR, what);
>     ++        }
>     ++
>     +         /* if the --force-depends option is specified make
>     dependencies weak */
>     +         if (opkg_config->force_depends)
>     +             queue_push2(&libsolv_solver->solver_jobs, SOLVER_SOLVABLE
>     +diff --git a/man/opkg.1.in
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=>
>     b/man/opkg.1.in
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=>
>     +index 27fa9c1..f192c3b 100644
>     +--- a/man/opkg.1.in
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=>
>     ++++ b/man/opkg.1.in
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=>
>     +@@ -162,6 +162,9 @@ priority \fIprio\fP. Lower priorities take
>     precedence.
>     + \fB\--add-exclude <\fIname\fP>\fR
>     + Register package to be excluded from install
>     + .TP
>     ++\fB\--add-ignore-recommends <\fIname\fP>\fR
>     ++Register package to be ignored as a recomendee
>     ++.TP
>     + \fB\--prefer-arch-to-version\fR
>     + Use the architecture priority package rather than the higher version
>     + one if more than one candidate is found.
>     +diff --git a/src/opkg.c b/src/opkg.c
>     +index 650e278..3c93a3b 100644
>     +--- a/src/opkg.c
>     ++++ b/src/opkg.c
>     +@@ -51,6 +51,7 @@ enum {
>     +     ARGS_OPT_ADD_DEST,
>     +     ARGS_OPT_SIZE,
>     +     ARGS_OPT_ADD_EXCLUDE,
>     ++    ARGS_OPT_ADD_IGNORE_RECOMMENDS,
>     +     ARGS_OPT_NOACTION,
>     +     ARGS_OPT_DOWNLOAD_ONLY,
>     +     ARGS_OPT_NODEPS,
>     +@@ -112,6 +113,7 @@ static struct option long_options[] = {
>     +     {"add-dest", 1, 0, ARGS_OPT_ADD_DEST},
>     +     {"size", 0, 0, ARGS_OPT_SIZE},
>     +     {"add-exclude", 1, 0, ARGS_OPT_ADD_EXCLUDE},
>     ++    {"add-ignore-recommends", 1, 0, ARGS_OPT_ADD_IGNORE_RECOMMENDS},
>     +     {"test", 0, 0, ARGS_OPT_NOACTION},
>     +     {"tmp-dir", 1, 0, 't'},
>     +     {"tmp_dir", 1, 0, 't'},
>     +@@ -234,6 +236,9 @@ static int args_parse(int argc, char *argv[])
>     +         case ARGS_OPT_ADD_EXCLUDE:
>     +             str_list_append(&opkg_config->exclude_list, optarg);
>     +             break;
>     ++        case ARGS_OPT_ADD_IGNORE_RECOMMENDS:
>     ++            str_list_append(&opkg_config->ignore_recommends_list,
>     optarg);
>     ++            break;
>     +         case ARGS_OPT_SIZE:
>     +             opkg_config->size = 1;
>     +             break;
>     +@@ -343,6 +348,7 @@ static void usage()
>     +     printf("\t--add-dest <name>:<path>        Register destination
>     with given path\n");
>     +     printf("\t--add-arch <arch>:<prio>        Register
>     architecture with given priority\n");
>     +     printf("\t--add-exclude <name>            Register package to
>     be excluded from install\n");
>     ++    printf("\t--add-ignore-recommends <name>  Register package to
>     be ignored as a recomendee\n");
>     +     printf("\t--prefer-arch-to-version        Use the architecture
>     priority package rather\n");
>     +     printf("\t                                than the higher
>     version one if more\n");
>     +     printf("\t                                than one candidate
>     is found.\n");
>     +diff --git a/tests/Makefile b/tests/Makefile
>     +index 8e5be08..799816d 100644
>     +--- a/tests/Makefile
>     ++++ b/tests/Makefile
>     +@@ -42,6 +42,7 @@ REGRESSION_TESTS := core/01_install.py \
>     +                   core/40_arch.py \
>     +                   core/41_info_fields.py \
>     +                   core/42_info_description.py \
>     ++                  core/43_add_ignore_recommends.py \
>     +                   regress/issue26.py \
>     +                   regress/issue31.py \
>     +                   regress/issue32.py \
>     +diff --git a/tests/core/43_add_ignore_recommends.py
>     b/tests/core/43_add_ignore_recommends.py
>     +new file mode 100755
>     +index 0000000..7da0096
>     +--- /dev/null
>     ++++ b/tests/core/43_add_ignore_recommends.py
>     +@@ -0,0 +1,62 @@
>     ++#! /usr/bin/env python3
>     ++#
>     ++# Create package 'a' (1.0) which Recommends 'c'.
>     ++# Install 'a' with --add-ignore-recommends 'c'.
>     ++# Check that only 'a' (1.0) is installed.
>     ++# Create package 'b' which Depends on 'c'.
>     ++# Install 'a' & 'b', with --add-ignore-recommends 'c'.
>     ++# Verify that 'a','b' & 'c' are installed.
>     ++# Uninstall 'b' & 'c'.
>     ++# Create package 'a' (2.0), which Recommends 'c'.
>     ++# Upgrade 'a' with --add-ignore-recommends 'c'
>     ++# Verify that only 'a' (2.0) is installed
>     ++#
>     ++
>     ++import os
>     ++import opk, cfg, opkgcl
>     ++
>     ++opk.regress_init()
>     ++o = opk.OpkGroup()
>     ++
>     ++o.add(Package='a', Recommends='c', Version='1.0')
>     ++o.add(Package='b', Depends='c')
>     ++o.add(Package='c')
>     ++o.write_opk()
>     ++o.write_list()
>     ++
>     ++opkgcl.update()
>     ++
>     ++opkgcl.install('a', '--add-ignore-recommends c')
>     ++
>     ++if not opkgcl.is_installed('a'):
>     ++      opk.fail("Package 'a' installed but reports as not installed.")
>     ++
>     ++if opkgcl.is_installed('c'):
>     ++      opk.xfail("[libsolv<0.7.3] Package 'c' should not have been
>     installed since it was in --add-ignore-recommends.")
>     ++
>     ++opkgcl.remove('a')
>     ++opkgcl.install('a b', '--add-ignore-recommends c')
>     ++
>     ++if not opkgcl.is_installed('a'):
>     ++      opk.fail("Package 'a' installed but reports as not installed.")
>     ++
>     ++if not opkgcl.is_installed('b'):
>     ++      opk.fail("Package 'b' installed but reports as not installed.")
>     ++
>     ++if not opkgcl.is_installed('c'):
>     ++      opk.fail("Package 'c' should have been installed since 'b'
>     depends on it.")
>     ++
>     ++opkgcl.remove('b c', '--force-depends')
>     ++o.add(Package='a', Recommends='c', Version='2.0')
>     ++o.write_opk()
>     ++o.write_list()
>     ++
>     ++opkgcl.update()
>     ++
>     ++opkgcl.upgrade('a', '--add-ignore-recommends c')
>     ++
>     ++if not opkgcl.is_installed('a', '2.0'):
>     ++      opk.fail("Package 'a (2.0)' installed but reports as not
>     installed.")
>     ++
>     ++if opkgcl.is_installed('c'):
>     ++      opk.fail("Package 'c' should not have been installed since
>     it was in --add-ignore-recommends.")
>     +--
>     +2.20.1
>     +
>     diff --git a/meta/recipes-devtools/opkg/opkg_0.4.0.bb
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=>
>     b/meta/recipes-devtools/opkg/opkg_0.4.0.bb
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=>
>     index 9b7cf3f596..a2329d3e71 100644
>     --- a/meta/recipes-devtools/opkg/opkg_0.4.0.bb
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=>
>     +++ b/meta/recipes-devtools/opkg/opkg_0.4.0.bb
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=>
>     @@ -14,6 +14,7 @@ PE = "1"
>       SRC_URI =
>     "http://downloads.yoctoproject.org/releases/${BPN}/${BPN}-${PV}.tar.gz
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__downloads.yoctoproject.org_releases_-24-257BBPN-257D_-24-257BBPN-257D-2D-24-257BPV-257D.tar.gz&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=YLvorPjD5Y4WlqpYdjRMCkzwnh_cz-C6op19u5O23b8&e=>
>     \
>                  file://opkg.conf \
>                 
>     file://0001-opkg_conf-create-opkg.lock-in-run-instead-of-var-run.patch \
>     +           file://0001-libopkg-add-add-ignore-recommends-option.patch \
>       "
> 
>       SRC_URI[md5sum] = "ae51d95fee599bb4dce08453529158f5"
>     -- 
>     2.20.1
> 
>     -- 
>     _______________________________________________
>     Openembedded-core mailing list
>     Openembedded-core@lists.openembedded.org
>     <mailto:Openembedded-core@lists.openembedded.org>
>     http://lists.openembedded.org/mailman/listinfo/openembedded-core
>     <https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.openembedded.org_mailman_listinfo_openembedded-2Dcore&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=UHPegBWeyh1LTyIdp2oai1-Ecy-s_l8In1Kk14OFS6Q&e=>
> 

-- 
Cheers,

Alejandro

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [OE-core] [PATCH 1/3] opkg: add --ignore-recommends flag
  2019-02-07 17:44       ` Alejandro Del Castillo
@ 2019-02-07 20:33         ` Scott Rifenbark
  -1 siblings, 0 replies; 10+ messages in thread
From: Scott Rifenbark @ 2019-02-07 20:33 UTC (permalink / raw)
  To: Alejandro Del Castillo; +Cc: Yocto discussion list, openembedded-core

[-- Attachment #1: Type: text/plain, Size: 20031 bytes --]

On Thu, Feb 7, 2019 at 9:44 AM Alejandro Del Castillo <
alejandro.delcastillo@ni.com> wrote:

>
>
> On 2/7/19 11:36 AM, Scott Rifenbark wrote:
> > This change looks like it impacts documentation (i.e.
> >
> https://yoctoproject.org/docs/2.7/ref-manual/ref-manual.html#var-BAD_RECOMMENDATIONS.
>
> > When will this change go into effect?
>
> I believe it doesn't. It is refactoring the opkg implementation to
> leverage a new opkg feature (--add-ignore-recommends), which is a more
> robust implementation. Should be transparent to users.
>

Thank you for the clarification... I thought it might be a user option.


> > On Thu, Feb 7, 2019 at 7:58 AM Alejandro del Castillo
> > <alejandro.delcastillo@ni.com <mailto:alejandro.delcastillo@ni.com>>
> wrote:
> >
> >     To be used for BAD_RECOMMENDATIONS feature.
> >
> >     Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com
> >     <mailto:alejandro.delcastillo@ni.com>>
> >     ---
> >       ...pkg-add-add-ignore-recommends-option.patch | 259
> ++++++++++++++++++
> >       meta/recipes-devtools/opkg/opkg_0.4.0.bb
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=>
>
> >          |   1 +
> >       2 files changed, 260 insertions(+)
> >       create mode 100644
> >
>  meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> >
> >     diff --git
> >
>  a/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> >
>  b/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> >     new file mode 100644
> >     index 0000000000..47d1b3c37e
> >     --- /dev/null
> >     +++
> >
>  b/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> >     @@ -0,0 +1,259 @@
> >     +From 64aa98646a17c299bf37af2975b98daf5d7d30b4 Mon Sep 17 00:00:00
> 2001
> >     +From: Alejandro del Castillo <alejandro.delcastillo@ni.com
> >     <mailto:alejandro.delcastillo@ni.com>>
> >     +Date: Thu, 31 Jan 2019 18:16:08 -0600
> >     +Subject: [PATCH] libopkg: add --add-ignore-recommends option
> >     +
> >     +Add option to ignore specific recommended packages. On the libsolv
> >     +backed, this feature will only work on libsolv version > 0.7.2 [1].
> >     +
> >     +[1]
> >
> https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openSUSE_libsolv_issues_254&d=DwIBaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=GObNHzFJpWpf_PripIrf-K2RhsktYdAUEieAJexXOKw&s=3G-meChUqClFggFPqsrAxIZBfLnRKIHm62Uuy1X6nQQ&e=
> >     +
> >     +Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com
> >     <mailto:alejandro.delcastillo@ni.com>>
> >     +
> >     +Upstream-Status: Accepted
> >     +---
> >     + libopkg/opkg_conf.c                           |  2 +
> >     + libopkg/opkg_conf.h                           |  1 +
> >     + .../solvers/internal/pkg_depends_internal.c   |  3 +-
> >     + libopkg/solvers/libsolv/opkg_solver_libsolv.c | 21 ++++++-
> >     + man/opkg.1.in
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=>
>
> >                                     |  3 +
> >     + src/opkg.c                                    |  6 ++
> >     + tests/Makefile                                |  1 +
> >     + tests/core/43_add_ignore_recommends.py        | 62
> +++++++++++++++++++
> >     + 8 files changed, 97 insertions(+), 2 deletions(-)
> >     + create mode 100755 tests/core/43_add_ignore_recommends.py
> >     +
> >     +diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c
> >     +index 06880a1..f2330cd 100644
> >     +--- a/libopkg/opkg_conf.c
> >     ++++ b/libopkg/opkg_conf.c
> >     +@@ -597,6 +597,7 @@ int opkg_conf_init(void)
> >     +     pkg_dest_list_init(&opkg_config->tmp_dest_list);
> >     +     nv_pair_list_init(&opkg_config->arch_list);
> >     +     str_list_init(&opkg_config->exclude_list);
> >     ++    str_list_init(&opkg_config->ignore_recommends_list);
> >     +
> >     +     return 0;
> >     + }
> >     +@@ -938,6 +939,7 @@ void opkg_conf_deinit(void)
> >     +     pkg_dest_list_deinit(&opkg_config->pkg_dest_list);
> >     +     nv_pair_list_deinit(&opkg_config->arch_list);
> >     +     str_list_deinit(&opkg_config->exclude_list);
> >     ++    str_list_deinit(&opkg_config->ignore_recommends_list);
> >     +
> >     +     if (opkg_config->verbosity >= DEBUG) {
> >     +         hash_print_stats(&opkg_config->pkg_hash);
> >     +diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h
> >     +index eb56a29..316c500 100644
> >     +--- a/libopkg/opkg_conf.h
> >     ++++ b/libopkg/opkg_conf.h
> >     +@@ -61,6 +61,7 @@ typedef struct opkg_conf {
> >     +     pkg_dest_list_t tmp_dest_list;
> >     +     nv_pair_list_t arch_list;
> >     +     str_list_t exclude_list;
> >     ++    str_list_t ignore_recommends_list;
> >     +
> >     +     int restrict_to_default_dest;
> >     +     pkg_dest_t *default_dest;
> >     +diff --git a/libopkg/solvers/internal/pkg_depends_internal.c
> >     b/libopkg/solvers/internal/pkg_depends_internal.c
> >     +index cd56d84..5deee70 100644
> >     +--- a/libopkg/solvers/internal/pkg_depends_internal.c
> >     ++++ b/libopkg/solvers/internal/pkg_depends_internal.c
> >     +@@ -228,7 +228,8 @@ int
> >     pkg_hash_fetch_unsatisfied_dependencies(pkg_t *pkg,
> >     +                             || compound_depend->type == SUGGEST)
> >     +                         && (satisfying_pkg->state_want ==
> SW_DEINSTALL
> >     +                             || satisfying_pkg->state_want ==
> SW_PURGE
> >     +-                            || opkg_config->no_install_recommends);
> >     ++                            || opkg_config->no_install_recommends
> >     ++                            ||
> >     str_list_contains(&opkg_config->ignore_recommends_list,
> >     satisfying_pkg->name));
> >     +                 if (ignore) {
> >     +                     opkg_msg(NOTICE,
> >     +                              "%s: ignoring recommendation for "
> >     +diff --git a/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> >     b/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> >     +index 2b27e3a..403e07b 100644
> >     +--- a/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> >     ++++ b/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> >     +@@ -484,6 +484,7 @@ static void pkg2solvable(pkg_t *pkg, Solvable
> >     *solvable_out)
> >     + static void populate_installed_repo(libsolv_solver_t
> *libsolv_solver)
> >     + {
> >     +     int i;
> >     ++    Id what;
> >     +
> >     +     pkg_vec_t *installed_pkgs = pkg_vec_alloc();
> >     +
> >     +@@ -507,6 +508,15 @@ static void
> >     populate_installed_repo(libsolv_solver_t *libsolv_solver)
> >     +         /* set solvable attributes */
> >     +         pkg2solvable(pkg, solvable);
> >     +
> >     ++        /* if the package is in ignore-recommends-list, disfavor
> >     installation */
> >     ++        if
> >     (str_list_contains(&opkg_config->ignore_recommends_list, pkg->name))
> {
> >     ++            opkg_message(NOTICE, "Disfavor package: %s\n",
> >     ++                         pkg->name);
> >     ++            what = pool_str2id(libsolv_solver->pool, pkg->name, 1);
> >     ++            queue_push2(&libsolv_solver->solver_jobs,
> >     SOLVER_SOLVABLE_NAME
> >     ++                        | SOLVER_DISFAVOR, what);
> >     ++        }
> >     ++
> >     +         /* if the package is not autoinstalled, mark it as user
> >     installed */
> >     +         if (!pkg->auto_installed)
> >     +             queue_push2(&libsolv_solver->solver_jobs,
> SOLVER_SOLVABLE
> >     +@@ -539,7 +549,7 @@ static void
> >     populate_available_repos(libsolv_solver_t *libsolv_solver)
> >     + {
> >     +     int i;
> >     +     Solvable *solvable;
> >     +-    Id solvable_id;
> >     ++    Id solvable_id, what;
> >     +
> >     +     pkg_vec_t *available_pkgs = pkg_vec_alloc();
> >     +
> >     +@@ -608,6 +618,15 @@ static void
> >     populate_available_repos(libsolv_solver_t *libsolv_solver)
> >     +         solvable = pool_id2solvable(libsolv_solver->pool,
> >     solvable_id);
> >     +         pkg2solvable(pkg, solvable);
> >     +
> >     ++        /* if the package is in ignore-recommends-list, disfavor
> >     installation */
> >     ++        if
> >     (str_list_contains(&opkg_config->ignore_recommends_list, pkg->name))
> {
> >     ++            opkg_message(NOTICE, "Disfavor package: %s\n",
> >     ++                         pkg->name);
> >     ++            what = pool_str2id(libsolv_solver->pool, pkg->name, 1);
> >     ++            queue_push2(&libsolv_solver->solver_jobs,
> >     SOLVER_SOLVABLE_NAME
> >     ++                        | SOLVER_DISFAVOR, what);
> >     ++        }
> >     ++
> >     +         /* if the --force-depends option is specified make
> >     dependencies weak */
> >     +         if (opkg_config->force_depends)
> >     +             queue_push2(&libsolv_solver->solver_jobs,
> SOLVER_SOLVABLE
> >     +diff --git a/man/opkg.1.in
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=
> >
> >     b/man/opkg.1.in
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=
> >
> >     +index 27fa9c1..f192c3b 100644
> >     +--- a/man/opkg.1.in
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=
> >
> >     ++++ b/man/opkg.1.in
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=
> >
> >     +@@ -162,6 +162,9 @@ priority \fIprio\fP. Lower priorities take
> >     precedence.
> >     + \fB\--add-exclude <\fIname\fP>\fR
> >     + Register package to be excluded from install
> >     + .TP
> >     ++\fB\--add-ignore-recommends <\fIname\fP>\fR
> >     ++Register package to be ignored as a recomendee
> >     ++.TP
> >     + \fB\--prefer-arch-to-version\fR
> >     + Use the architecture priority package rather than the higher
> version
> >     + one if more than one candidate is found.
> >     +diff --git a/src/opkg.c b/src/opkg.c
> >     +index 650e278..3c93a3b 100644
> >     +--- a/src/opkg.c
> >     ++++ b/src/opkg.c
> >     +@@ -51,6 +51,7 @@ enum {
> >     +     ARGS_OPT_ADD_DEST,
> >     +     ARGS_OPT_SIZE,
> >     +     ARGS_OPT_ADD_EXCLUDE,
> >     ++    ARGS_OPT_ADD_IGNORE_RECOMMENDS,
> >     +     ARGS_OPT_NOACTION,
> >     +     ARGS_OPT_DOWNLOAD_ONLY,
> >     +     ARGS_OPT_NODEPS,
> >     +@@ -112,6 +113,7 @@ static struct option long_options[] = {
> >     +     {"add-dest", 1, 0, ARGS_OPT_ADD_DEST},
> >     +     {"size", 0, 0, ARGS_OPT_SIZE},
> >     +     {"add-exclude", 1, 0, ARGS_OPT_ADD_EXCLUDE},
> >     ++    {"add-ignore-recommends", 1, 0,
> ARGS_OPT_ADD_IGNORE_RECOMMENDS},
> >     +     {"test", 0, 0, ARGS_OPT_NOACTION},
> >     +     {"tmp-dir", 1, 0, 't'},
> >     +     {"tmp_dir", 1, 0, 't'},
> >     +@@ -234,6 +236,9 @@ static int args_parse(int argc, char *argv[])
> >     +         case ARGS_OPT_ADD_EXCLUDE:
> >     +             str_list_append(&opkg_config->exclude_list, optarg);
> >     +             break;
> >     ++        case ARGS_OPT_ADD_IGNORE_RECOMMENDS:
> >     ++            str_list_append(&opkg_config->ignore_recommends_list,
> >     optarg);
> >     ++            break;
> >     +         case ARGS_OPT_SIZE:
> >     +             opkg_config->size = 1;
> >     +             break;
> >     +@@ -343,6 +348,7 @@ static void usage()
> >     +     printf("\t--add-dest <name>:<path>        Register destination
> >     with given path\n");
> >     +     printf("\t--add-arch <arch>:<prio>        Register
> >     architecture with given priority\n");
> >     +     printf("\t--add-exclude <name>            Register package to
> >     be excluded from install\n");
> >     ++    printf("\t--add-ignore-recommends <name>  Register package to
> >     be ignored as a recomendee\n");
> >     +     printf("\t--prefer-arch-to-version        Use the architecture
> >     priority package rather\n");
> >     +     printf("\t                                than the higher
> >     version one if more\n");
> >     +     printf("\t                                than one candidate
> >     is found.\n");
> >     +diff --git a/tests/Makefile b/tests/Makefile
> >     +index 8e5be08..799816d 100644
> >     +--- a/tests/Makefile
> >     ++++ b/tests/Makefile
> >     +@@ -42,6 +42,7 @@ REGRESSION_TESTS := core/01_install.py \
> >     +                   core/40_arch.py \
> >     +                   core/41_info_fields.py \
> >     +                   core/42_info_description.py \
> >     ++                  core/43_add_ignore_recommends.py \
> >     +                   regress/issue26.py \
> >     +                   regress/issue31.py \
> >     +                   regress/issue32.py \
> >     +diff --git a/tests/core/43_add_ignore_recommends.py
> >     b/tests/core/43_add_ignore_recommends.py
> >     +new file mode 100755
> >     +index 0000000..7da0096
> >     +--- /dev/null
> >     ++++ b/tests/core/43_add_ignore_recommends.py
> >     +@@ -0,0 +1,62 @@
> >     ++#! /usr/bin/env python3
> >     ++#
> >     ++# Create package 'a' (1.0) which Recommends 'c'.
> >     ++# Install 'a' with --add-ignore-recommends 'c'.
> >     ++# Check that only 'a' (1.0) is installed.
> >     ++# Create package 'b' which Depends on 'c'.
> >     ++# Install 'a' & 'b', with --add-ignore-recommends 'c'.
> >     ++# Verify that 'a','b' & 'c' are installed.
> >     ++# Uninstall 'b' & 'c'.
> >     ++# Create package 'a' (2.0), which Recommends 'c'.
> >     ++# Upgrade 'a' with --add-ignore-recommends 'c'
> >     ++# Verify that only 'a' (2.0) is installed
> >     ++#
> >     ++
> >     ++import os
> >     ++import opk, cfg, opkgcl
> >     ++
> >     ++opk.regress_init()
> >     ++o = opk.OpkGroup()
> >     ++
> >     ++o.add(Package='a', Recommends='c', Version='1.0')
> >     ++o.add(Package='b', Depends='c')
> >     ++o.add(Package='c')
> >     ++o.write_opk()
> >     ++o.write_list()
> >     ++
> >     ++opkgcl.update()
> >     ++
> >     ++opkgcl.install('a', '--add-ignore-recommends c')
> >     ++
> >     ++if not opkgcl.is_installed('a'):
> >     ++      opk.fail("Package 'a' installed but reports as not
> installed.")
> >     ++
> >     ++if opkgcl.is_installed('c'):
> >     ++      opk.xfail("[libsolv<0.7.3] Package 'c' should not have been
> >     installed since it was in --add-ignore-recommends.")
> >     ++
> >     ++opkgcl.remove('a')
> >     ++opkgcl.install('a b', '--add-ignore-recommends c')
> >     ++
> >     ++if not opkgcl.is_installed('a'):
> >     ++      opk.fail("Package 'a' installed but reports as not
> installed.")
> >     ++
> >     ++if not opkgcl.is_installed('b'):
> >     ++      opk.fail("Package 'b' installed but reports as not
> installed.")
> >     ++
> >     ++if not opkgcl.is_installed('c'):
> >     ++      opk.fail("Package 'c' should have been installed since 'b'
> >     depends on it.")
> >     ++
> >     ++opkgcl.remove('b c', '--force-depends')
> >     ++o.add(Package='a', Recommends='c', Version='2.0')
> >     ++o.write_opk()
> >     ++o.write_list()
> >     ++
> >     ++opkgcl.update()
> >     ++
> >     ++opkgcl.upgrade('a', '--add-ignore-recommends c')
> >     ++
> >     ++if not opkgcl.is_installed('a', '2.0'):
> >     ++      opk.fail("Package 'a (2.0)' installed but reports as not
> >     installed.")
> >     ++
> >     ++if opkgcl.is_installed('c'):
> >     ++      opk.fail("Package 'c' should not have been installed since
> >     it was in --add-ignore-recommends.")
> >     +--
> >     +2.20.1
> >     +
> >     diff --git a/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=
> >
> >     b/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=
> >
> >     index 9b7cf3f596..a2329d3e71 100644
> >     --- a/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=
> >
> >     +++ b/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=
> >
> >     @@ -14,6 +14,7 @@ PE = "1"
> >       SRC_URI =
> >     "
> http://downloads.yoctoproject.org/releases/${BPN}/${BPN}-${PV}.tar.gz
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__downloads.yoctoproject.org_releases_-24-257BBPN-257D_-24-257BBPN-257D-2D-24-257BPV-257D.tar.gz&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=YLvorPjD5Y4WlqpYdjRMCkzwnh_cz-C6op19u5O23b8&e=
> >
> >     \
> >                  file://opkg.conf \
> >
> >
>  file://0001-opkg_conf-create-opkg.lock-in-run-instead-of-var-run.patch \
> >     +
>  file://0001-libopkg-add-add-ignore-recommends-option.patch \
> >       "
> >
> >       SRC_URI[md5sum] = "ae51d95fee599bb4dce08453529158f5"
> >     --
> >     2.20.1
> >
> >     --
> >     _______________________________________________
> >     Openembedded-core mailing list
> >     Openembedded-core@lists.openembedded.org
> >     <mailto:Openembedded-core@lists.openembedded.org>
> >     http://lists.openembedded.org/mailman/listinfo/openembedded-core
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.openembedded.org_mailman_listinfo_openembedded-2Dcore&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=UHPegBWeyh1LTyIdp2oai1-Ecy-s_l8In1Kk14OFS6Q&e=
> >
> >
>
> --
> Cheers,
>
> Alejandro
>

[-- Attachment #2: Type: text/html, Size: 31623 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/3] opkg: add --ignore-recommends flag
@ 2019-02-07 20:33         ` Scott Rifenbark
  0 siblings, 0 replies; 10+ messages in thread
From: Scott Rifenbark @ 2019-02-07 20:33 UTC (permalink / raw)
  To: Alejandro Del Castillo; +Cc: Yocto discussion list, openembedded-core

[-- Attachment #1: Type: text/plain, Size: 20031 bytes --]

On Thu, Feb 7, 2019 at 9:44 AM Alejandro Del Castillo <
alejandro.delcastillo@ni.com> wrote:

>
>
> On 2/7/19 11:36 AM, Scott Rifenbark wrote:
> > This change looks like it impacts documentation (i.e.
> >
> https://yoctoproject.org/docs/2.7/ref-manual/ref-manual.html#var-BAD_RECOMMENDATIONS.
>
> > When will this change go into effect?
>
> I believe it doesn't. It is refactoring the opkg implementation to
> leverage a new opkg feature (--add-ignore-recommends), which is a more
> robust implementation. Should be transparent to users.
>

Thank you for the clarification... I thought it might be a user option.


> > On Thu, Feb 7, 2019 at 7:58 AM Alejandro del Castillo
> > <alejandro.delcastillo@ni.com <mailto:alejandro.delcastillo@ni.com>>
> wrote:
> >
> >     To be used for BAD_RECOMMENDATIONS feature.
> >
> >     Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com
> >     <mailto:alejandro.delcastillo@ni.com>>
> >     ---
> >       ...pkg-add-add-ignore-recommends-option.patch | 259
> ++++++++++++++++++
> >       meta/recipes-devtools/opkg/opkg_0.4.0.bb
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=>
>
> >          |   1 +
> >       2 files changed, 260 insertions(+)
> >       create mode 100644
> >
>  meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> >
> >     diff --git
> >
>  a/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> >
>  b/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> >     new file mode 100644
> >     index 0000000000..47d1b3c37e
> >     --- /dev/null
> >     +++
> >
>  b/meta/recipes-devtools/opkg/opkg/0001-libopkg-add-add-ignore-recommends-option.patch
> >     @@ -0,0 +1,259 @@
> >     +From 64aa98646a17c299bf37af2975b98daf5d7d30b4 Mon Sep 17 00:00:00
> 2001
> >     +From: Alejandro del Castillo <alejandro.delcastillo@ni.com
> >     <mailto:alejandro.delcastillo@ni.com>>
> >     +Date: Thu, 31 Jan 2019 18:16:08 -0600
> >     +Subject: [PATCH] libopkg: add --add-ignore-recommends option
> >     +
> >     +Add option to ignore specific recommended packages. On the libsolv
> >     +backed, this feature will only work on libsolv version > 0.7.2 [1].
> >     +
> >     +[1]
> >
> https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_openSUSE_libsolv_issues_254&d=DwIBaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=GObNHzFJpWpf_PripIrf-K2RhsktYdAUEieAJexXOKw&s=3G-meChUqClFggFPqsrAxIZBfLnRKIHm62Uuy1X6nQQ&e=
> >     +
> >     +Signed-off-by: Alejandro del Castillo <alejandro.delcastillo@ni.com
> >     <mailto:alejandro.delcastillo@ni.com>>
> >     +
> >     +Upstream-Status: Accepted
> >     +---
> >     + libopkg/opkg_conf.c                           |  2 +
> >     + libopkg/opkg_conf.h                           |  1 +
> >     + .../solvers/internal/pkg_depends_internal.c   |  3 +-
> >     + libopkg/solvers/libsolv/opkg_solver_libsolv.c | 21 ++++++-
> >     + man/opkg.1.in
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=>
>
> >                                     |  3 +
> >     + src/opkg.c                                    |  6 ++
> >     + tests/Makefile                                |  1 +
> >     + tests/core/43_add_ignore_recommends.py        | 62
> +++++++++++++++++++
> >     + 8 files changed, 97 insertions(+), 2 deletions(-)
> >     + create mode 100755 tests/core/43_add_ignore_recommends.py
> >     +
> >     +diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c
> >     +index 06880a1..f2330cd 100644
> >     +--- a/libopkg/opkg_conf.c
> >     ++++ b/libopkg/opkg_conf.c
> >     +@@ -597,6 +597,7 @@ int opkg_conf_init(void)
> >     +     pkg_dest_list_init(&opkg_config->tmp_dest_list);
> >     +     nv_pair_list_init(&opkg_config->arch_list);
> >     +     str_list_init(&opkg_config->exclude_list);
> >     ++    str_list_init(&opkg_config->ignore_recommends_list);
> >     +
> >     +     return 0;
> >     + }
> >     +@@ -938,6 +939,7 @@ void opkg_conf_deinit(void)
> >     +     pkg_dest_list_deinit(&opkg_config->pkg_dest_list);
> >     +     nv_pair_list_deinit(&opkg_config->arch_list);
> >     +     str_list_deinit(&opkg_config->exclude_list);
> >     ++    str_list_deinit(&opkg_config->ignore_recommends_list);
> >     +
> >     +     if (opkg_config->verbosity >= DEBUG) {
> >     +         hash_print_stats(&opkg_config->pkg_hash);
> >     +diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h
> >     +index eb56a29..316c500 100644
> >     +--- a/libopkg/opkg_conf.h
> >     ++++ b/libopkg/opkg_conf.h
> >     +@@ -61,6 +61,7 @@ typedef struct opkg_conf {
> >     +     pkg_dest_list_t tmp_dest_list;
> >     +     nv_pair_list_t arch_list;
> >     +     str_list_t exclude_list;
> >     ++    str_list_t ignore_recommends_list;
> >     +
> >     +     int restrict_to_default_dest;
> >     +     pkg_dest_t *default_dest;
> >     +diff --git a/libopkg/solvers/internal/pkg_depends_internal.c
> >     b/libopkg/solvers/internal/pkg_depends_internal.c
> >     +index cd56d84..5deee70 100644
> >     +--- a/libopkg/solvers/internal/pkg_depends_internal.c
> >     ++++ b/libopkg/solvers/internal/pkg_depends_internal.c
> >     +@@ -228,7 +228,8 @@ int
> >     pkg_hash_fetch_unsatisfied_dependencies(pkg_t *pkg,
> >     +                             || compound_depend->type == SUGGEST)
> >     +                         && (satisfying_pkg->state_want ==
> SW_DEINSTALL
> >     +                             || satisfying_pkg->state_want ==
> SW_PURGE
> >     +-                            || opkg_config->no_install_recommends);
> >     ++                            || opkg_config->no_install_recommends
> >     ++                            ||
> >     str_list_contains(&opkg_config->ignore_recommends_list,
> >     satisfying_pkg->name));
> >     +                 if (ignore) {
> >     +                     opkg_msg(NOTICE,
> >     +                              "%s: ignoring recommendation for "
> >     +diff --git a/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> >     b/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> >     +index 2b27e3a..403e07b 100644
> >     +--- a/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> >     ++++ b/libopkg/solvers/libsolv/opkg_solver_libsolv.c
> >     +@@ -484,6 +484,7 @@ static void pkg2solvable(pkg_t *pkg, Solvable
> >     *solvable_out)
> >     + static void populate_installed_repo(libsolv_solver_t
> *libsolv_solver)
> >     + {
> >     +     int i;
> >     ++    Id what;
> >     +
> >     +     pkg_vec_t *installed_pkgs = pkg_vec_alloc();
> >     +
> >     +@@ -507,6 +508,15 @@ static void
> >     populate_installed_repo(libsolv_solver_t *libsolv_solver)
> >     +         /* set solvable attributes */
> >     +         pkg2solvable(pkg, solvable);
> >     +
> >     ++        /* if the package is in ignore-recommends-list, disfavor
> >     installation */
> >     ++        if
> >     (str_list_contains(&opkg_config->ignore_recommends_list, pkg->name))
> {
> >     ++            opkg_message(NOTICE, "Disfavor package: %s\n",
> >     ++                         pkg->name);
> >     ++            what = pool_str2id(libsolv_solver->pool, pkg->name, 1);
> >     ++            queue_push2(&libsolv_solver->solver_jobs,
> >     SOLVER_SOLVABLE_NAME
> >     ++                        | SOLVER_DISFAVOR, what);
> >     ++        }
> >     ++
> >     +         /* if the package is not autoinstalled, mark it as user
> >     installed */
> >     +         if (!pkg->auto_installed)
> >     +             queue_push2(&libsolv_solver->solver_jobs,
> SOLVER_SOLVABLE
> >     +@@ -539,7 +549,7 @@ static void
> >     populate_available_repos(libsolv_solver_t *libsolv_solver)
> >     + {
> >     +     int i;
> >     +     Solvable *solvable;
> >     +-    Id solvable_id;
> >     ++    Id solvable_id, what;
> >     +
> >     +     pkg_vec_t *available_pkgs = pkg_vec_alloc();
> >     +
> >     +@@ -608,6 +618,15 @@ static void
> >     populate_available_repos(libsolv_solver_t *libsolv_solver)
> >     +         solvable = pool_id2solvable(libsolv_solver->pool,
> >     solvable_id);
> >     +         pkg2solvable(pkg, solvable);
> >     +
> >     ++        /* if the package is in ignore-recommends-list, disfavor
> >     installation */
> >     ++        if
> >     (str_list_contains(&opkg_config->ignore_recommends_list, pkg->name))
> {
> >     ++            opkg_message(NOTICE, "Disfavor package: %s\n",
> >     ++                         pkg->name);
> >     ++            what = pool_str2id(libsolv_solver->pool, pkg->name, 1);
> >     ++            queue_push2(&libsolv_solver->solver_jobs,
> >     SOLVER_SOLVABLE_NAME
> >     ++                        | SOLVER_DISFAVOR, what);
> >     ++        }
> >     ++
> >     +         /* if the --force-depends option is specified make
> >     dependencies weak */
> >     +         if (opkg_config->force_depends)
> >     +             queue_push2(&libsolv_solver->solver_jobs,
> SOLVER_SOLVABLE
> >     +diff --git a/man/opkg.1.in
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=
> >
> >     b/man/opkg.1.in
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=
> >
> >     +index 27fa9c1..f192c3b 100644
> >     +--- a/man/opkg.1.in
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=
> >
> >     ++++ b/man/opkg.1.in
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg.1.in&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=8yIWRVT6JV0YnkHzVgeo8pAkiFPM4xz8y9APvxobmhY&e=
> >
> >     +@@ -162,6 +162,9 @@ priority \fIprio\fP. Lower priorities take
> >     precedence.
> >     + \fB\--add-exclude <\fIname\fP>\fR
> >     + Register package to be excluded from install
> >     + .TP
> >     ++\fB\--add-ignore-recommends <\fIname\fP>\fR
> >     ++Register package to be ignored as a recomendee
> >     ++.TP
> >     + \fB\--prefer-arch-to-version\fR
> >     + Use the architecture priority package rather than the higher
> version
> >     + one if more than one candidate is found.
> >     +diff --git a/src/opkg.c b/src/opkg.c
> >     +index 650e278..3c93a3b 100644
> >     +--- a/src/opkg.c
> >     ++++ b/src/opkg.c
> >     +@@ -51,6 +51,7 @@ enum {
> >     +     ARGS_OPT_ADD_DEST,
> >     +     ARGS_OPT_SIZE,
> >     +     ARGS_OPT_ADD_EXCLUDE,
> >     ++    ARGS_OPT_ADD_IGNORE_RECOMMENDS,
> >     +     ARGS_OPT_NOACTION,
> >     +     ARGS_OPT_DOWNLOAD_ONLY,
> >     +     ARGS_OPT_NODEPS,
> >     +@@ -112,6 +113,7 @@ static struct option long_options[] = {
> >     +     {"add-dest", 1, 0, ARGS_OPT_ADD_DEST},
> >     +     {"size", 0, 0, ARGS_OPT_SIZE},
> >     +     {"add-exclude", 1, 0, ARGS_OPT_ADD_EXCLUDE},
> >     ++    {"add-ignore-recommends", 1, 0,
> ARGS_OPT_ADD_IGNORE_RECOMMENDS},
> >     +     {"test", 0, 0, ARGS_OPT_NOACTION},
> >     +     {"tmp-dir", 1, 0, 't'},
> >     +     {"tmp_dir", 1, 0, 't'},
> >     +@@ -234,6 +236,9 @@ static int args_parse(int argc, char *argv[])
> >     +         case ARGS_OPT_ADD_EXCLUDE:
> >     +             str_list_append(&opkg_config->exclude_list, optarg);
> >     +             break;
> >     ++        case ARGS_OPT_ADD_IGNORE_RECOMMENDS:
> >     ++            str_list_append(&opkg_config->ignore_recommends_list,
> >     optarg);
> >     ++            break;
> >     +         case ARGS_OPT_SIZE:
> >     +             opkg_config->size = 1;
> >     +             break;
> >     +@@ -343,6 +348,7 @@ static void usage()
> >     +     printf("\t--add-dest <name>:<path>        Register destination
> >     with given path\n");
> >     +     printf("\t--add-arch <arch>:<prio>        Register
> >     architecture with given priority\n");
> >     +     printf("\t--add-exclude <name>            Register package to
> >     be excluded from install\n");
> >     ++    printf("\t--add-ignore-recommends <name>  Register package to
> >     be ignored as a recomendee\n");
> >     +     printf("\t--prefer-arch-to-version        Use the architecture
> >     priority package rather\n");
> >     +     printf("\t                                than the higher
> >     version one if more\n");
> >     +     printf("\t                                than one candidate
> >     is found.\n");
> >     +diff --git a/tests/Makefile b/tests/Makefile
> >     +index 8e5be08..799816d 100644
> >     +--- a/tests/Makefile
> >     ++++ b/tests/Makefile
> >     +@@ -42,6 +42,7 @@ REGRESSION_TESTS := core/01_install.py \
> >     +                   core/40_arch.py \
> >     +                   core/41_info_fields.py \
> >     +                   core/42_info_description.py \
> >     ++                  core/43_add_ignore_recommends.py \
> >     +                   regress/issue26.py \
> >     +                   regress/issue31.py \
> >     +                   regress/issue32.py \
> >     +diff --git a/tests/core/43_add_ignore_recommends.py
> >     b/tests/core/43_add_ignore_recommends.py
> >     +new file mode 100755
> >     +index 0000000..7da0096
> >     +--- /dev/null
> >     ++++ b/tests/core/43_add_ignore_recommends.py
> >     +@@ -0,0 +1,62 @@
> >     ++#! /usr/bin/env python3
> >     ++#
> >     ++# Create package 'a' (1.0) which Recommends 'c'.
> >     ++# Install 'a' with --add-ignore-recommends 'c'.
> >     ++# Check that only 'a' (1.0) is installed.
> >     ++# Create package 'b' which Depends on 'c'.
> >     ++# Install 'a' & 'b', with --add-ignore-recommends 'c'.
> >     ++# Verify that 'a','b' & 'c' are installed.
> >     ++# Uninstall 'b' & 'c'.
> >     ++# Create package 'a' (2.0), which Recommends 'c'.
> >     ++# Upgrade 'a' with --add-ignore-recommends 'c'
> >     ++# Verify that only 'a' (2.0) is installed
> >     ++#
> >     ++
> >     ++import os
> >     ++import opk, cfg, opkgcl
> >     ++
> >     ++opk.regress_init()
> >     ++o = opk.OpkGroup()
> >     ++
> >     ++o.add(Package='a', Recommends='c', Version='1.0')
> >     ++o.add(Package='b', Depends='c')
> >     ++o.add(Package='c')
> >     ++o.write_opk()
> >     ++o.write_list()
> >     ++
> >     ++opkgcl.update()
> >     ++
> >     ++opkgcl.install('a', '--add-ignore-recommends c')
> >     ++
> >     ++if not opkgcl.is_installed('a'):
> >     ++      opk.fail("Package 'a' installed but reports as not
> installed.")
> >     ++
> >     ++if opkgcl.is_installed('c'):
> >     ++      opk.xfail("[libsolv<0.7.3] Package 'c' should not have been
> >     installed since it was in --add-ignore-recommends.")
> >     ++
> >     ++opkgcl.remove('a')
> >     ++opkgcl.install('a b', '--add-ignore-recommends c')
> >     ++
> >     ++if not opkgcl.is_installed('a'):
> >     ++      opk.fail("Package 'a' installed but reports as not
> installed.")
> >     ++
> >     ++if not opkgcl.is_installed('b'):
> >     ++      opk.fail("Package 'b' installed but reports as not
> installed.")
> >     ++
> >     ++if not opkgcl.is_installed('c'):
> >     ++      opk.fail("Package 'c' should have been installed since 'b'
> >     depends on it.")
> >     ++
> >     ++opkgcl.remove('b c', '--force-depends')
> >     ++o.add(Package='a', Recommends='c', Version='2.0')
> >     ++o.write_opk()
> >     ++o.write_list()
> >     ++
> >     ++opkgcl.update()
> >     ++
> >     ++opkgcl.upgrade('a', '--add-ignore-recommends c')
> >     ++
> >     ++if not opkgcl.is_installed('a', '2.0'):
> >     ++      opk.fail("Package 'a (2.0)' installed but reports as not
> >     installed.")
> >     ++
> >     ++if opkgcl.is_installed('c'):
> >     ++      opk.fail("Package 'c' should not have been installed since
> >     it was in --add-ignore-recommends.")
> >     +--
> >     +2.20.1
> >     +
> >     diff --git a/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=
> >
> >     b/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=
> >
> >     index 9b7cf3f596..a2329d3e71 100644
> >     --- a/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=
> >
> >     +++ b/meta/recipes-devtools/opkg/opkg_0.4.0.bb
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__opkg-5F0.4.0.bb&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=JvgzuAyAoVrkeSZAdWZUuIsFWQ8okApbCk1iiF13CDc&e=
> >
> >     @@ -14,6 +14,7 @@ PE = "1"
> >       SRC_URI =
> >     "
> http://downloads.yoctoproject.org/releases/${BPN}/${BPN}-${PV}.tar.gz
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__downloads.yoctoproject.org_releases_-24-257BBPN-257D_-24-257BBPN-257D-2D-24-257BPV-257D.tar.gz&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=YLvorPjD5Y4WlqpYdjRMCkzwnh_cz-C6op19u5O23b8&e=
> >
> >     \
> >                  file://opkg.conf \
> >
> >
>  file://0001-opkg_conf-create-opkg.lock-in-run-instead-of-var-run.patch \
> >     +
>  file://0001-libopkg-add-add-ignore-recommends-option.patch \
> >       "
> >
> >       SRC_URI[md5sum] = "ae51d95fee599bb4dce08453529158f5"
> >     --
> >     2.20.1
> >
> >     --
> >     _______________________________________________
> >     Openembedded-core mailing list
> >     Openembedded-core@lists.openembedded.org
> >     <mailto:Openembedded-core@lists.openembedded.org>
> >     http://lists.openembedded.org/mailman/listinfo/openembedded-core
> >     <
> https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.openembedded.org_mailman_listinfo_openembedded-2Dcore&d=DwMFaQ&c=I_0YwoKy7z5LMTVdyO6YCiE2uzI1jjZZuIPelcSjixA&r=wNcrL2akRn6jfxhHaKavUrJB_C9JAMXtynjLd8ZzgXQ&m=8hd_9vew95YIf_VIv2QHNu2EFnc3G2WZ5KA2Upnv5j8&s=UHPegBWeyh1LTyIdp2oai1-Ecy-s_l8In1Kk14OFS6Q&e=
> >
> >
>
> --
> Cheers,
>
> Alejandro
>

[-- Attachment #2: Type: text/html, Size: 31623 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2019-02-07 20:33 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-07 15:57 [PATCH 0/3] use new opkg --add-ignore-recommends for BAD_RECOMMENDATIONS feature Alejandro del Castillo
2019-02-07 15:57 ` [PATCH 1/3] opkg: add --ignore-recommends flag Alejandro del Castillo
2019-02-07 17:36   ` [OE-core] " Scott Rifenbark
2019-02-07 17:36     ` Scott Rifenbark
2019-02-07 17:44     ` [OE-core] " Alejandro Del Castillo
2019-02-07 17:44       ` Alejandro Del Castillo
2019-02-07 20:33       ` [OE-core] " Scott Rifenbark
2019-02-07 20:33         ` Scott Rifenbark
2019-02-07 15:57 ` [PATCH 2/3] libsolv: fix segfault when using SOLVER_DISFAVOR Alejandro del Castillo
2019-02-07 15:57 ` [PATCH 3/3] OpkgPM: use --add-ignore-recommends to process BAD_RECOMMENDATIONS Alejandro del Castillo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.