1 From 53e0408ad2acd72c684eb7d69a4fe4f1da9aca8b Mon Sep 17 00:00:00 2001
2 From: mis <mis@pld-linux.org>
3 Date: Mon, 16 Mar 2020 14:24:26 +0100
4 Subject: [PATCH] fix: make "uniq package names" works again; closes #4
7 Makefile.am | 20 +++----
10 pkgset.c | 36 ++-----------
11 pkguniq.c | 56 ++++++++++++++++++++
12 tests/sh/09-repos | 130 ++++++++++++++++++++++++++++++++++++++++++++++
13 6 files changed, 209 insertions(+), 46 deletions(-)
14 create mode 100644 pkguniq.c
15 create mode 100755 tests/sh/09-repos
17 diff --git a/Makefile.am b/Makefile.am
18 index e896c4e..25ddf14 100644
21 @@ -24,13 +24,13 @@ libpoldek_la_SOURCES = \
24 poldek_term.c poldek_term.h \
28 - pkgmisc.c pkgmisc.h \
29 - depdirs.c depdirs.h \
30 - pkg.c pkgiter.c pkg.h \
31 + pkgmisc.c pkgmisc.h \
32 + depdirs.c depdirs.h \
33 + pkg.c pkgiter.c pkg.h \
38 fileindex.c fileindex.h \
39 capreqidx.c capreqidx.h \
40 @@ -38,10 +38,12 @@ libpoldek_la_SOURCES = \
43 pkgset-req.c pkgset-req.h \
45 - arg_packages.c arg_packages.h \
46 - conf.c conf.h conf_intern.h conf_sections.c \
50 + arg_packages.c arg_packages.h \
52 + conf_intern.h conf_sections.c \
57 diff --git a/lib_pkgset.c b/lib_pkgset.c
58 index 6fed521..96cbada 100644
61 @@ -43,7 +43,7 @@ int poldek__load_sources_internal(struct poldek_ctx *ctx, unsigned ps_setup_flag
65 - unsigned ps_flags = 0, ldflags = 0;
66 + unsigned ldflags = 0;
69 n_assert(ctx->ps == NULL);
70 @@ -95,7 +95,7 @@ int poldek__load_sources_internal(struct poldek_ctx *ctx, unsigned ps_setup_flag
71 ctx->pkgdirs = n_ref(ps->pkgdirs);
73 if (ts->getop(ts, POLDEK_OP_UNIQN))
74 - ps_flags |= PSET_UNIQ_PKGNAME;
75 + ps_setup_flags |= PSET_UNIQ_PKGNAME;
77 pkgset_setup(ps, ps_setup_flags);
79 @@ -144,9 +144,11 @@ tn_array *poldek_load_stubs(struct poldek_ctx *ctx)
80 n_array_push(stubpkgs, pkg);
83 + n_array_sort(stubpkgs);
84 + n_array_isort_ex(stubpkgs, (tn_fn_cmp)pkg_cmp_name_evr_arch_rev_srcpri);
86 - n_array_sort_ex(stubpkgs, (tn_fn_cmp)pkg_deepcmp_name_evr_rev);
87 - n_array_uniq_ex(stubpkgs, (tn_fn_cmp)pkg_cmp_uniq_name_evr_arch);
88 + struct poldek_ts *ts = ctx->ts;
89 + packages_uniq(stubpkgs, ts->getop(ts, POLDEK_OP_UNIQN) ? true : false);
93 diff --git a/pkgmisc.h b/pkgmisc.h
94 index 074ec34..9b387d1 100644
100 #include <trurl/narray.h>
102 +#include <stdbool.h>
104 # define EXPORT extern
106 @@ -36,6 +36,7 @@ EXPORT int packages_score_ignore(tn_array *pkgs, tn_array *patterns, int remove)
109 EXPORT int packages_dump(tn_array *pkgs, const char *path, int fqfn);
110 +EXPORT int packages_uniq(tn_array *pkgs, bool by_name);
114 diff --git a/pkgset.c b/pkgset.c
115 index 4ad7dfb..714355f 100644
122 +#include "pkgmisc.h"
125 #include "pkgset-req.h"
126 @@ -205,26 +206,6 @@ static int pkgset_index(struct pkgset *ps)
131 -int do_pkg_cmp_uniq_nevr(const struct pkg *p1, struct pkg *p2)
135 - if ((rc = pkg_cmp_uniq_name_evr(p1, p2)) == 0)
136 - pkg_score(p2, PKG_IGNORED_UNIQ);
141 -int do_pkg_cmp_uniq_n(const struct pkg *p1, struct pkg *p2)
145 - if ((rc = pkg_cmp_uniq_name(p1, p2)) == 0)
146 - pkg_score(p2, PKG_IGNORED_UNIQ);
150 int pkgset_setup_deps(struct pkgset *ps, unsigned flags)
152 int strict = ps->flags & PSET_VRFY_MERCY ? 0 : 1;
153 @@ -262,29 +243,20 @@ int pkgset_setup_deps(struct pkgset *ps, unsigned flags)
158 static int pkgset_setup_index(struct pkgset *ps, unsigned flags)
161 void *t = timethis_begin();
163 msgn(2, "Preparing package set...");
164 MEMINF("before setup");
168 - n = n_array_size(ps->pkgs);
169 n_array_sort(ps->pkgs);
171 n_array_isort_ex(ps->pkgs, (tn_fn_cmp)pkg_cmp_name_evr_arch_rev_srcpri);
172 + int n = packages_uniq(ps->pkgs, (flags & PSET_UNIQ_PKGNAME) ? true : false);
174 - if (flags & PSET_UNIQ_PKGNAME) {
175 - n_array_uniq_ex(ps->pkgs, (tn_fn_cmp)do_pkg_cmp_uniq_n);
177 - n_array_uniq_ex(ps->pkgs, (tn_fn_cmp)do_pkg_cmp_uniq_nevr);
180 - if (n != n_array_size(ps->pkgs)) {
181 - n -= n_array_size(ps->pkgs);
184 "Removed %d duplicate package from available set",
185 "Removed %d duplicate packages from available set", n), n);
186 diff --git a/pkguniq.c b/pkguniq.c
188 index 0000000..f600789
193 + Copyright (C) 2000 - 2008 Pawel A. Gajda <mis@pld-linux.org>
195 + This program is free software; you can redistribute it and/or modify
196 + it under the terms of the GNU General Public License, version 2 as
197 + published by the Free Software Foundation (see file COPYING for details).
199 + You should have received a copy of the GNU General Public License along
200 + with this program; if not, write to the Free Software Foundation, Inc.,
201 + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
204 +#ifdef HAVE_CONFIG_H
205 +# include "config.h"
208 +#include <stdbool.h>
209 +#include <trurl/narray.h>
215 +int do_pkg_cmp_uniq_name_evr(const struct pkg *p1, struct pkg *p2)
219 + if ((rc = pkg_cmp_uniq_name_evr(p1, p2)) == 0)
220 + pkg_score(p2, PKG_IGNORED_UNIQ);
226 +int do_pkg_cmp_uniq_name(const struct pkg *p1, struct pkg *p2)
230 + if ((rc = pkg_cmp_uniq_name(p1, p2)) == 0)
231 + pkg_score(p2, PKG_IGNORED_UNIQ);
236 +int packages_uniq(tn_array *pkgs, bool names)
238 + int n = n_array_size(pkgs);
241 + n_array_uniq_ex(pkgs, (tn_fn_cmp)do_pkg_cmp_uniq_name);
243 + n_array_uniq_ex(pkgs, (tn_fn_cmp)do_pkg_cmp_uniq_name_evr);
246 + return n - n_array_size(pkgs);
248 diff --git a/tests/sh/09-repos b/tests/sh/09-repos
250 index 0000000..a420bf9
252 +++ b/tests/sh/09-repos
258 +. ./sh/lib/repo-setup
259 +. ./sh/lib/solver-setup # for build_package
266 + [ -z "$ORIGREPO" ] && ORIGREPO=$REPO
267 + [ -z "$ORIGREPO" ] && fail "empty REPO env variable"
270 + REPO="$ORIGREPO/repo1"
271 + REPO2="$ORIGREPO/repo2"
273 + rm -rf $REPO $REPO2
275 + mkdir -p $REPO || fail "mkdir $REPO failed"
276 + mkdir -p $REPO2 || fail "mkdir $REPO2 failed"
281 + RAW_POLDEK="$POLDEK_NOCONF"
286 + build_package $REPO $@
290 + build_package $REPO2 $@
295 + $POLDEK_NOCONF -s $repo --mkidx --mt pndir || fail "mkidx $repo failed"
302 + is_verbose_mode && echo "$RAW_POLDEK -v -s $REPO -s $REPO2 $@ --cmd ls"
303 + is_verbose_mode && $RAW_POLDEK -v -s $REPO -s $REPO2 $@ --cmd ls
304 + n=$($RAW_POLDEK -q -s $REPO -s $REPO2 $@ --cmd ls | grep -P '^\w+-\d+-\d+\.\w+$' | wc -l)
306 + assertEquals "invalid number of packages found (expected $expected, got $n)" "$n" "$expected"
307 + [ "$n" == "$expected" ]
314 + is_verbose_mode && echo "$RAW_POLDEK -v -s $REPO -s $REPO2 --cmd ls"
315 + is_verbose_mode && $RAW_POLDEK -v -s $REPO -s $REPO2 --cmd ls
316 + n=$($RAW_POLDEK -q -s $REPO -s $REPO2 $@ --cmd ls | grep "^$expected" | wc -l)
318 + assertEquals "$expected package not found" "$n" "1"
322 +testUniquePackages()
324 + msgn "Preparing repository..."
333 + expect_count 3 -Ounique_package_names=y
334 + expect_package "a-2-1.noarch" -Ounique_package_names=y
337 +testUniquePackagesDifferentArch()
339 + msgn "Preparing repository..."
341 + for i in i686 x86_64; do
342 + build a 1-1 -a $i -f "/hello.$i"
343 + build a 2-2 -a $i -f "/hello.$i"
346 + for i in i686 x86_64; do
347 + build b -a $i -f "/hello.$i"
348 + build c -a $i -f "/hello.$i"
354 + expect_count 3 -Ounique_package_names=y
355 + expect_package "a-2-2" -Ounique_package_names=y
358 +testUniquePackagesDifferentRepos()
360 + msgn "Preparing repositories..."
376 + expect_count 3 -Ounique_package_names=y
377 + expect_package "a-2-2" -Ounique_package_names=y
378 + expect_package "b-2-2" -Ounique_package_names=y
379 + expect_package "c-1-1" -Ounique_package_names=y