Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libsolv for openSUSE:Factory checked in at 2025-06-06 22:35:20 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libsolv (Old) and /work/SRC/openSUSE:Factory/.libsolv.new.19631 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libsolv" Fri Jun 6 22:35:20 2025 rev:99 rq:1282808 version:0.7.33 Changes: -------- --- /work/SRC/openSUSE:Factory/libsolv/libsolv.changes 2025-04-04 17:29:20.908616916 +0200 +++ /work/SRC/openSUSE:Factory/.libsolv.new.19631/libsolv.changes 2025-06-06 22:35:28.813981553 +0200 @@ -1,0 +2,9 @@ +Tue Jun 3 13:25:39 CEST 2025 - m...@suse.de + +- improve transaction ordering by allowing more uninst->uninst + edges [bsc#1243457] +- implement color filtering when adding update targets +- support orderwithrequires dependencies in susedata.xml +- bump version to 0.7.33 + +------------------------------------------------------------------- Old: ---- libsolv-0.7.32.tar.bz2 New: ---- libsolv-0.7.33.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libsolv.spec ++++++ --- /var/tmp/diff_new_pack.Q1RjFz/_old 2025-06-06 22:35:30.086034008 +0200 +++ /var/tmp/diff_new_pack.Q1RjFz/_new 2025-06-06 22:35:30.102034667 +0200 @@ -72,7 +72,7 @@ %bcond_with zypp Name: libsolv -Version: 0.7.32 +Version: 0.7.33 Release: 0 Summary: Package dependency solver using a satisfiability algorithm License: BSD-3-Clause ++++++ libsolv-0.7.32.tar.bz2 -> libsolv-0.7.33.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/NEWS new/libsolv-0.7.33/NEWS --- old/libsolv-0.7.32/NEWS 2025-04-03 13:20:08.000000000 +0200 +++ new/libsolv-0.7.33/NEWS 2025-06-03 13:50:07.000000000 +0200 @@ -1,6 +1,14 @@ This file contains the major changes between libsolv versions: +Version 0.7.33 +- selected bug fixes: + * improve transaction ordering by allowing more uninst->uninst + edges + * implement color filtering when adding update targets +- new features: + * support orderwithrequires dependencies in susedata.xml + Version 0.7.32 - build both static and dynamic libraries on new suse distros - require cmake >= 3.5 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/VERSION.cmake new/libsolv-0.7.33/VERSION.cmake --- old/libsolv-0.7.32/VERSION.cmake 2025-04-03 13:20:08.000000000 +0200 +++ new/libsolv-0.7.33/VERSION.cmake 2025-06-03 13:50:07.000000000 +0200 @@ -49,5 +49,5 @@ SET(LIBSOLV_MAJOR "0") SET(LIBSOLV_MINOR "7") -SET(LIBSOLV_PATCH "32") +SET(LIBSOLV_PATCH "33") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/doc/CMakeLists.txt new/libsolv-0.7.33/doc/CMakeLists.txt --- old/libsolv-0.7.32/doc/CMakeLists.txt 2023-07-19 11:52:42.000000000 +0200 +++ new/libsolv-0.7.33/doc/CMakeLists.txt 2025-04-15 13:20:08.000000000 +0200 @@ -42,6 +42,10 @@ SET (libsolv_MANPAGES1 ${libsolv_MANPAGES1} appdata2solv.1) ENDIF (ENABLE_APPDATA) +IF (ENABLE_APK) +SET (libsolv_MANPAGES1 ${libsolv_MANPAGES1} apk2solv.1) +ENDIF (ENABLE_APK) + # prepend gen directory STRING(REGEX REPLACE "([^;]+)" "gen/\\1" libsolv_MANPAGES1 "${libsolv_MANPAGES1}") STRING(REGEX REPLACE "([^;]+)" "gen/\\1" libsolv_MANPAGES3 "${libsolv_MANPAGES3}") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/doc/Makefile.gen new/libsolv-0.7.33/doc/Makefile.gen --- old/libsolv-0.7.32/doc/Makefile.gen 2023-07-19 11:52:42.000000000 +0200 +++ new/libsolv-0.7.33/doc/Makefile.gen 2025-04-15 13:20:08.000000000 +0200 @@ -7,7 +7,7 @@ man1: mergesolv.1 dumpsolv.1 installcheck.1 testsolv.1 rpmdb2solv.1 rpms2solv.1 \ rpmmd2solv.1 repomdxml2solv.1 updateinfoxml2solv.1 deltainfoxml2solv.1 \ - helix2solv.1 susetags2solv.1 comps2solv.1 deb2solv.1 mdk2solv.1 \ + helix2solv.1 susetags2solv.1 comps2solv.1 deb2solv.1 mdk2solv.1 apk2solv.1 \ archpkgs2solv.1 archrepo2solv.1 appdata2solv.1 repo2solv.1 solv.1 html: libsolv.html libsolv-bindings.html libsolv-constantids.html libsolv-history.html libsolv-pool.html diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/doc/apk2solv.txt new/libsolv-0.7.33/doc/apk2solv.txt --- old/libsolv-0.7.32/doc/apk2solv.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/libsolv-0.7.33/doc/apk2solv.txt 2025-04-15 13:20:08.000000000 +0200 @@ -0,0 +1,52 @@ +apk2solv(1) +============ +:man manual: LIBSOLV +:man source: libsolv + + +Name +---- +apk2solv - convert one or more apk package files into a solv file + +Synopsis +-------- +*apk2solv* ['OPTIONS'] 'PKG1.apk' ... + +Description +----------- +The apk2solv tool converts the meta data from one or more +Apk packages into the solv file written to standard output. + +*-m* 'MANIFESTFILE':: +Read the rpm file names from the specified 'MANIFESTFILE'. You can +use *-* to read the manifest from standard input. + +*-0*:: +Use a null byte as line terminator for manifest files instead of +a newline. This is useful if the file names can contain newlines. +See also the *-print0* option in *find*. + +*-C*:: +Add the apk checksum to the meta data. + +*-r*:: +Enable repository metadata mode. The specified file is not an +apk package, but a file containing repository metadata (e.g. +'APKINDEX.tar.gz'). + +*-l*:: +Enable local database mode. The specified file is not an +apk package, but a database file containing information about +the installed packages (e.g. '/lib/apk/db/installed'). + +See Also +-------- +apk(8) + +Author +------ +Michael Schroeder <m...@suse.de> + +//// +vim: syntax=asciidoc +//// diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/doc/gen/apk2solv.1 new/libsolv-0.7.33/doc/gen/apk2solv.1 --- old/libsolv-0.7.32/doc/gen/apk2solv.1 1970-01-01 01:00:00.000000000 +0100 +++ new/libsolv-0.7.33/doc/gen/apk2solv.1 2025-04-15 13:20:08.000000000 +0200 @@ -0,0 +1,76 @@ +'\" t +.\" Title: apk2solv +.\" Author: [see the "Author" section] +.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> +.\" Date: 04/15/2025 +.\" Manual: LIBSOLV +.\" Source: libsolv +.\" Language: English +.\" +.TH "APK2SOLV" "1" "04/15/2025" "libsolv" "LIBSOLV" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +apk2solv \- convert one or more apk package files into a solv file +.SH "SYNOPSIS" +.sp +\fBapk2solv\fR [\fIOPTIONS\fR] \fIPKG1\&.apk\fR \&... +.SH "DESCRIPTION" +.sp +The apk2solv tool converts the meta data from one or more Apk packages into the solv file written to standard output\&. +.PP +\fB\-m\fR \fIMANIFESTFILE\fR +.RS 4 +Read the rpm file names from the specified +\fIMANIFESTFILE\fR\&. You can use +\fB\-\fR +to read the manifest from standard input\&. +.RE +.PP +\fB\-0\fR +.RS 4 +Use a null byte as line terminator for manifest files instead of a newline\&. This is useful if the file names can contain newlines\&. See also the +\fB\-print0\fR +option in +\fBfind\fR\&. +.RE +.PP +\fB\-C\fR +.RS 4 +Add the apk checksum to the meta data\&. +.RE +.PP +\fB\-r\fR +.RS 4 +Enable repository metadata mode\&. The specified file is not an apk package, but a file containing repository metadata (e\&.g\&. +\fIAPKINDEX\&.tar\&.gz\fR)\&. +.RE +.PP +\fB\-l\fR +.RS 4 +Enable local database mode\&. The specified file is not an apk package, but a database file containing information about the installed packages (e\&.g\&. +\fI/lib/apk/db/installed\fR)\&. +.RE +.SH "SEE ALSO" +.sp +apk(8) +.SH "AUTHOR" +.sp +Michael Schroeder <mls@suse\&.de> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/ext/repo_repomdxml.c new/libsolv-0.7.33/ext/repo_repomdxml.c --- old/libsolv-0.7.32/ext/repo_repomdxml.c 2023-07-19 11:52:42.000000000 +0200 +++ new/libsolv-0.7.33/ext/repo_repomdxml.c 2025-06-03 13:40:07.000000000 +0200 @@ -77,6 +77,9 @@ <kewwords> <k>...</k> </keywords> + <tags> + <updates cpeid="cpe://o:opensuse_project:opensuse:11">openSUSE 11.0</updates> + </tags> </suseinfo> */ @@ -147,7 +150,7 @@ struct solv_xmlparser xmlp; - int timestamp; + unsigned int timestamp; /* handles for collection structures */ /* repo updates */ @@ -252,7 +255,7 @@ switch (state) { case STATE_REPOMD: - if (pd->timestamp > 0) + if (pd->timestamp) repodata_set_num(pd->data, SOLVID_META, REPOSITORY_TIMESTAMP, pd->timestamp); break; case STATE_DATA: @@ -278,7 +281,7 @@ * of all resources to save it as the time * the metadata was generated */ - int timestamp = atoi(content); + unsigned int timestamp = strtoull(content, 0, 10); if (timestamp) repodata_set_num(pd->data, pd->rdhandle, REPOSITORY_REPOMD_TIMESTAMP, timestamp); if (timestamp > pd->timestamp) @@ -287,8 +290,8 @@ } case STATE_EXPIRE: { - int expire = atoi(content); - if (expire > 0) + unsigned int expire = strtoull(content, 0, 10); + if (expire) repodata_set_num(pd->data, SOLVID_META, REPOSITORY_EXPIRE, expire); break; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/ext/repo_rpmdb.c new/libsolv-0.7.33/ext/repo_rpmdb.c --- old/libsolv-0.7.32/ext/repo_rpmdb.c 2024-09-16 15:50:06.000000000 +0200 +++ new/libsolv-0.7.33/ext/repo_rpmdb.c 2025-04-10 15:50:07.000000000 +0200 @@ -1090,44 +1090,43 @@ } static void -set_description_author(Repodata *data, Id handle, char *str) +set_description_author(Repodata *data, Id handle, const char *str) { - char *aut, *p; + const char *aut; for (aut = str; (aut = strchr(aut, '\n')) != 0; aut++) if (!strncmp(aut, "\nAuthors:\n--------\n", 19)) break; if (aut) { /* oh my, found SUSE special author section */ - int l = aut - str; - str = solv_strdup(str); - aut = str + l; - str[l] = 0; - while (l > 0 && str[l - 1] == '\n') - str[--l] = 0; + size_t l = aut - str; + char *p, *ap, *s = solv_strdup(str); + p = s + l + 19; /* author block starts here */ + s[l] = 0; + while (l > 0 && s[l - 1] == '\n') + s[--l] = 0; if (l) - setutf8string(data, handle, SOLVABLE_DESCRIPTION, str); - p = aut + 19; - aut = str; /* copy over */ + setutf8string(data, handle, SOLVABLE_DESCRIPTION, s); while (*p == ' ' || *p == '\n') p++; + ap = s; /* copy over */ while (*p) { if (*p == '\n') { - *aut++ = *p++; + *ap++ = *p++; while (*p == ' ') p++; continue; } - *aut++ = *p++; + *ap++ = *p++; } - while (aut != str && aut[-1] == '\n') - aut--; - *aut = 0; - if (*str) - setutf8string(data, handle, SOLVABLE_AUTHORS, str); - free(str); + while (ap != s && ap[-1] == '\n') + ap--; + *ap = 0; + if (*s) + setutf8string(data, handle, SOLVABLE_AUTHORS, s); + free(s); } else if (*str) setutf8string(data, handle, SOLVABLE_DESCRIPTION, str); @@ -1198,7 +1197,7 @@ if (data) { Id handle; - char *str; + const char *str; unsigned int u32; unsigned long long u64; @@ -1231,6 +1230,14 @@ chksum = headbinary(rpmhead, TAG_SIGMD5, &chksumsize); if (chksum && chksumsize == 16) repodata_set_bin_checksum(data, handle, SOLVABLE_PKGID, REPOKEY_TYPE_MD5, chksum); + else + { + unsigned char md5[16]; + str = headstring(rpmhead, TAG_SHA256HEADER); + /* truncate sh256 to md5 */ + if (str && strlen(str) == 64 && solv_hex2bin(&str, md5, 16) == 16) + repodata_set_bin_checksum(data, handle, SOLVABLE_PKGID, REPOKEY_TYPE_MD5, md5); + } } if ((flags & RPM_ADD_WITH_HDRID) != 0) { @@ -2022,8 +2029,8 @@ { if (!headfromfp(&state, rpm, fp, lead + 96, sigcnt, sigdsize, sigpad, chksumh, leadsigchksumh)) { - solv_chksum_free(leadsigchksumh, 0); - solv_chksum_free(chksumh, 0); + solv_chksum_free(leadsigchksumh, 0); + solv_chksum_free(chksumh, 0); fclose(fp); return 0; } @@ -2037,6 +2044,12 @@ pkgidtype = REPOKEY_TYPE_MD5; memcpy(pkgid, chksum, 16); } + else + { + const char *str = headstring(state.rpmhead, TAG_SHA256HEADER); + if (str && strlen(str) == 64 && solv_hex2bin(&str, pkgid, 16) == 16) + pkgidtype = REPOKEY_TYPE_MD5; + } } if ((flags & RPM_ADD_WITH_HDRID) != 0) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/ext/repo_rpmmd.c new/libsolv-0.7.33/ext/repo_rpmmd.c --- old/libsolv-0.7.32/ext/repo_rpmmd.c 2024-03-27 11:00:05.000000000 +0100 +++ new/libsolv-0.7.33/ext/repo_rpmmd.c 2025-06-03 13:40:07.000000000 +0200 @@ -94,6 +94,7 @@ STATE_SUGGESTS, STATE_ENHANCES, STATE_FRESHENS, + STATE_ORDERWITHREQUIRES, STATE_SOURCERPM, STATE_HEADERRANGE, STATE_BUILDHOST, @@ -107,6 +108,7 @@ STATE_SUGGESTSENTRY, STATE_ENHANCESENTRY, STATE_FRESHENSENTRY, + STATE_ORDERWITHREQUIRESENTRY, STATE_FILE, @@ -195,6 +197,7 @@ { STATE_SOLVABLE, "rpm:suggests", STATE_SUGGESTS, 0 }, { STATE_SOLVABLE, "rpm:enhances", STATE_ENHANCES, 0 }, { STATE_SOLVABLE, "rpm:freshens", STATE_FRESHENS, 0 }, + { STATE_SOLVABLE, "rpm:orderwithrequires", STATE_ORDERWITHREQUIRES, 0 }, { STATE_SOLVABLE, "rpm:sourcerpm", STATE_SOURCERPM, 1 }, { STATE_SOLVABLE, "rpm:header-range", STATE_HEADERRANGE, 0 }, { STATE_SOLVABLE, "rpm:buildhost", STATE_BUILDHOST, 1 }, @@ -214,6 +217,7 @@ { STATE_SUGGESTS, "rpm:entry", STATE_SUGGESTSENTRY, 0 }, { STATE_ENHANCES, "rpm:entry", STATE_ENHANCESENTRY, 0 }, { STATE_FRESHENS, "rpm:entry", STATE_FRESHENSENTRY, 0 }, + { STATE_ORDERWITHREQUIRES, "rpm:entry", STATE_ORDERWITHREQUIRESENTRY, 0 }, { STATE_INCLUDES, "item", STATE_INCLUDESENTRY, 0 }, { STATE_EXTENDS, "item", STATE_EXTENDSENTRY, 0 }, @@ -229,6 +233,7 @@ char *kind; Solvable *solvable; Offset freshens; + Offset orderwithrequires; struct solv_xmlparser xmlp; struct joindata jd; @@ -670,6 +675,8 @@ one. */ pd->extending = 0; + pd->freshens = 0; + pd->orderwithrequires = 0; if ((pkgid = solv_xmlparser_find_attr("pkgid", atts)) != NULL) { unsigned char chk[256]; @@ -704,7 +711,6 @@ handle = repo_add_solvable(pd->repo); if (!pd->first) pd->first = handle; - pd->freshens = 0; } pd->handle = handle; pd->solvable = pool_id2solvable(pool, handle); @@ -779,6 +785,12 @@ case STATE_FRESHENSENTRY: pd->freshens = adddep(pool, pd, pd->freshens, atts, 0); break; + case STATE_ORDERWITHREQUIRES: + pd->orderwithrequires = 0; + break; + case STATE_ORDERWITHREQUIRESENTRY: + pd->orderwithrequires = adddep(pool, pd, pd->orderwithrequires, atts, 0); + break; case STATE_EULA: case STATE_SUMMARY: case STATE_CATEGORY: @@ -826,10 +838,10 @@ break; case STATE_TIME: { - unsigned int t; + unsigned int ti; str = solv_xmlparser_find_attr("build", atts); - if (str && (t = atoi(str)) != 0) - repodata_set_num(pd->data, handle, SOLVABLE_BUILDTIME, t); + if (str && (ti = strtoull(str, 0, 10)) != 0) + repodata_set_num(pd->data, handle, SOLVABLE_BUILDTIME, ti); break; } case STATE_SIZE: @@ -842,7 +854,7 @@ { unsigned int end; str = solv_xmlparser_find_attr("end", atts); - if (str && (end = atoi(str)) != 0) + if (str && (end = strtoull(str, 0, 10)) != 0) repodata_set_num(pd->data, handle, SOLVABLE_HEADEREND, end); break; } @@ -931,6 +943,12 @@ switch (state) { case STATE_SOLVABLE: + if (pd->orderwithrequires) + { + while (repo->idarraydata[pd->orderwithrequires]) + repodata_add_idarray(pd->data, s - pool->solvables, SOLVABLE_ORDERWITHREQUIRES, repo->idarraydata[pd->orderwithrequires++]); + pd->orderwithrequires = 0; + } if (pd->extending) { pd->solvable = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/ext/repo_susetags.c new/libsolv-0.7.33/ext/repo_susetags.c --- old/libsolv-0.7.32/ext/repo_susetags.c 2024-03-27 11:00:05.000000000 +0100 +++ new/libsolv-0.7.33/ext/repo_susetags.c 2025-06-03 13:40:07.000000000 +0200 @@ -925,9 +925,9 @@ continue; case CTAG('=', 'T', 'i', 'm'): { - unsigned int t = atoi(line + 6); - if (t) - repodata_set_num(data, handle, SOLVABLE_BUILDTIME, t); + unsigned int ti = strtoull(line + 6, 0, 10); + if (ti) + repodata_set_num(data, handle, SOLVABLE_BUILDTIME, ti); } continue; case CTAG('=', 'K', 'w', 'd'): @@ -1052,7 +1052,7 @@ if (split(line + 6, sp, 3) == 2) { /* we ignore the start value */ - unsigned int end = (unsigned int)atoi(sp[1]); + unsigned int end = strtoull(sp[1], 0, 10); if (end) repodata_set_num(data, handle, SOLVABLE_HEADEREND, end); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/ext/repo_testcase.c new/libsolv-0.7.33/ext/repo_testcase.c --- old/libsolv-0.7.32/ext/repo_testcase.c 2024-09-16 15:50:06.000000000 +0200 +++ new/libsolv-0.7.33/ext/repo_testcase.c 2025-06-03 13:40:07.000000000 +0200 @@ -545,7 +545,7 @@ Repodata *data; Solvable *s; char *sp[5]; - unsigned int t; + unsigned int ti; int intag; char *filelist = 0; int afilelist = 0; @@ -640,14 +640,14 @@ s->vendor = pool_str2id(pool, line + 6, 1); break; case 'T' << 16 | 'i' << 8 | 'm': - t = atoi(line + 6); - if (t) - repodata_set_num(data, s - pool->solvables, SOLVABLE_BUILDTIME, t); + ti = strtoull(line + 6, 0, 10); + if (ti) + repodata_set_num(data, s - pool->solvables, SOLVABLE_BUILDTIME, ti); break; case 'I' << 16 | 't' << 8 | 'm': - t = atoi(line + 6); - if (t) - repodata_set_num(data, s - pool->solvables, SOLVABLE_INSTALLTIME, t); + ti = strtoull(line + 6, 0, 10); + if (ti) + repodata_set_num(data, s - pool->solvables, SOLVABLE_INSTALLTIME, ti); break; case 'R' << 16 | 'e' << 8 | 'q': s->requires = adddep(repo, s->requires, line + 6, -SOLVABLE_PREREQMARKER); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/ext/solv_xfopen.h new/libsolv-0.7.33/ext/solv_xfopen.h --- old/libsolv-0.7.32/ext/solv_xfopen.h 2024-11-28 14:00:06.000000000 +0100 +++ new/libsolv-0.7.33/ext/solv_xfopen.h 2025-04-14 15:20:07.000000000 +0200 @@ -8,6 +8,15 @@ #ifndef SOLV_XFOPEN_H #define SOLV_XFOPEN_H +#include <stddef.h> + +#ifdef _WIN32 + #include <BaseTsd.h> + typedef SSIZE_T ssize_t; +#else + #include <unistd.h> +#endif + extern FILE *solv_xfopen(const char *fn, const char *mode); extern FILE *solv_xfopen_fd(const char *fn, int fd, const char *mode); extern FILE *solv_xfopen_buf(const char *fn, char **bufp, size_t *buflp, const char *mode); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/package/libsolv.changes new/libsolv-0.7.33/package/libsolv.changes --- old/libsolv-0.7.32/package/libsolv.changes 2025-04-03 13:20:08.000000000 +0200 +++ new/libsolv-0.7.33/package/libsolv.changes 2025-06-03 13:50:07.000000000 +0200 @@ -1,4 +1,13 @@ ------------------------------------------------------------------- +Tue Jun 3 13:25:39 CEST 2025 - m...@suse.de + +- improve transaction ordering by allowing more uninst->uninst + edges [bsc#1243457] +- implement color filtering when adding update targets +- support orderwithrequires dependencies in susedata.xml +- bump version to 0.7.33 + +------------------------------------------------------------------- Thu Apr 3 13:07:20 CEST 2025 - m...@suse.de - build both static and dynamic libraries on new suse distros diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/src/chksum.c new/libsolv-0.7.33/src/chksum.c --- old/libsolv-0.7.32/src/chksum.c 2023-07-19 11:52:42.000000000 +0200 +++ new/libsolv-0.7.33/src/chksum.c 2025-05-14 14:10:07.000000000 +0200 @@ -9,6 +9,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <strings.h> #include <unistd.h> #include "pool.h" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/src/decision.c new/libsolv-0.7.33/src/decision.c --- old/libsolv-0.7.32/src/decision.c 2024-04-10 12:40:06.000000000 +0200 +++ new/libsolv-0.7.33/src/decision.c 2025-05-16 10:20:07.000000000 +0200 @@ -607,7 +607,7 @@ info = solv->decisionq_why.elements[ii]; if (info > 0) reason = SOLVER_REASON_UNIT_RULE; - else if (info <= 0) + else { info = -info; reason = solv->decisionmap[vv]; @@ -737,7 +737,10 @@ Pool *pool = solv->pool; Map dm; if ((flags & SOLVER_DECISIONLIST_TYPEMASK) != SOLVER_DECISIONLIST_SOLVABLE) - return solver_get_proof(solv, id, flags, decisionlistq); + { + solver_get_proof(solv, id, flags, decisionlistq); + return; + } map_init(&dm, pool->nsolvables); MAPSET(&dm, id); getdecisionlist(solv, &dm, flags, decisionlistq); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/src/order.c new/libsolv-0.7.33/src/order.c --- old/libsolv-0.7.32/src/order.c 2024-09-16 15:50:06.000000000 +0200 +++ new/libsolv-0.7.33/src/order.c 2025-06-02 11:40:06.000000000 +0200 @@ -407,10 +407,11 @@ if (s->repo != installed) continue; /* no inst->uninst edges, please! */ - /* uninst -> uninst edge. Those make trouble. Only add if we must */ - if (trans->transaction_installed[p - installed->start] && !havescripts(pool, p, &ignoreinst)) + /* uninst -> uninst edge. Those can make trouble, as uninst elements are often bound to + * inst elements which use the opposite order. */ + if (trans->transaction_installed[p2 - installed->start] && trans->transaction_installed[p - installed->start] && !havescripts(pool, p, &ignoreinst)) { - /* p is obsoleted by another package and has no scripts */ + /* both p and p2 are bound to inst elements and p has no scripts */ /* we assume that the obsoleter is good enough to replace p */ continue; } @@ -1472,9 +1473,10 @@ p = trans->steps.elements[i]; s = pool->solvables + p; if (s->repo != pool->installed) + { lastins = p; - if (s->repo != pool->installed) MAPSET(&ins, p); + } if (havescripts(pool, p, 0)) { MAPZERO(&seen); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/src/pool.c new/libsolv-0.7.33/src/pool.c --- old/libsolv-0.7.32/src/pool.c 2024-11-28 14:00:06.000000000 +0100 +++ new/libsolv-0.7.33/src/pool.c 2025-05-16 10:20:07.000000000 +0200 @@ -594,8 +594,7 @@ } else if (!pool->addedfileprovides && pool->disttype == DISTTYPE_RPM) { - if (!pool->addedfileprovides) - POOL_DEBUG(SOLV_DEBUG_STATS, "WARNING: pool_addfileprovides was not called, this may result in slow operation\n"); + POOL_DEBUG(SOLV_DEBUG_STATS, "WARNING: pool_addfileprovides was not called, this may result in slow operation\n"); /* lazyly add file provides */ for (i = 1; i < num; i++) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/src/rules.c new/libsolv-0.7.33/src/rules.c --- old/libsolv-0.7.32/src/rules.c 2024-01-26 11:20:06.000000000 +0100 +++ new/libsolv-0.7.33/src/rules.c 2025-05-16 10:20:07.000000000 +0200 @@ -3206,7 +3206,7 @@ { if (rid <= 0) return SOLVER_RULE_UNKNOWN; - if (rid > 0 && rid < solv->pkgrules_end) + if (rid < solv->pkgrules_end) return SOLVER_RULE_PKG; if (rid >= solv->jobrules && rid < solv->jobrules_end) return SOLVER_RULE_JOB; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/src/solver.c new/libsolv-0.7.33/src/solver.c --- old/libsolv-0.7.32/src/solver.c 2024-11-12 10:50:06.000000000 +0100 +++ new/libsolv-0.7.33/src/solver.c 2025-04-14 14:20:08.000000000 +0200 @@ -1148,8 +1148,11 @@ FOR_PROVIDES(p2, pp2, s->name) { s2 = pool->solvables + p2; - if (s2->repo == installed && s2->name == s->name && !(noupdate && MAPTST(noupdate, p2 - installed->start))) - return 1; + if (s2->name != s->name || s2->repo != installed || (noupdate && MAPTST(noupdate, p2 - installed->start))) + continue; + if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, s2)) + continue; + return 1; } if (!s->obsoletes) return 0; @@ -1159,7 +1162,7 @@ FOR_PROVIDES(p2, pp2, obs) { s2 = pool->solvables + p2; - if (s2->repo != pool->installed || (noupdate && MAPTST(noupdate, p2 - installed->start))) + if (s2->repo != installed || (noupdate && MAPTST(noupdate, p2 - installed->start))) continue; if (!pool->obsoleteusesprovides && !pool_match_nevr(pool, s2, obs)) continue; @@ -3354,8 +3357,11 @@ FOR_PROVIDES(pi, pip, s->name) { Solvable *si = pool->solvables + pi; - if (si->repo == installed && si->name == s->name && pi != p) - queue_push2(solv->update_targets, pi, p); + if (si->repo != installed || si->name != s->name || pi == p) + continue; + if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, si)) + continue; + queue_push2(solv->update_targets, pi, p); } return; } @@ -3366,6 +3372,8 @@ Solvable *si = pool->solvables + pi; if (si->repo != installed || si->name != s->name) continue; + if (pool->implicitobsoleteusescolors && !pool_colormatch(pool, s, si)) + continue; if (how & SOLVER_FORCEBEST) { if (!solv->bestupdatemap.size) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/test/testcases/targeted/targeted_color.t new/libsolv-0.7.33/test/testcases/targeted/targeted_color.t --- old/libsolv-0.7.32/test/testcases/targeted/targeted_color.t 1970-01-01 01:00:00.000000000 +0100 +++ new/libsolv-0.7.33/test/testcases/targeted/targeted_color.t 2025-04-15 13:00:09.000000000 +0200 @@ -0,0 +1,56 @@ +# testcase for issue 583 +# targeted update with forcebest and implicitobsoleteusescolor +repo @System 0 testtags <inline> +#>=Ver: 3.0 +#>=Pkg: a 1 1 x86_64 +#>=Prv: a = 1-1 +#>=Con: c < 1-1 +#> +#>=Pkg: c 1 1 x86_64 +#>=Req: c-dep = 1-1 +#>=Prv: c = 1-1 +#> +#>=Pkg: c-dep 1 1 x86_64 +#>=Prv: c-dep = 1-1 +#> +#>=Pkg: d 1 1 x86_64 +#>=Req: c = 1-1 +#>=Req: multiarch = 1-1 +#>=Prv: d = 1-1 +#> +#>=Pkg: multiarch 1 1 x86_64 +#>=Prv: multiarch = 1-1 + +repo available 0 testtags <inline> +#>=Ver: 3.0 +#>=Pkg: a 2 2 x86_64 +#>=Prv: a = 2-2 +#>=Con: c < 2-2 +#> +#>=Pkg: c 2 2 x86_64 +#>=Req: c-dep = 2-2 +#>=Prv: c = 2-2 +#> +#>=Pkg: c-dep 2 2 x86_64 +#>=Prv: c-dep = 2-2 +#> +#>=Pkg: d 2 2 x86_64 +#>=Req: multiarch >= 2-2 +#>=Prv: d = 2-2 +#> +#>=Pkg: multiarch 2 2 x86_64 +#>=Prv: multiarch = 2-2 +#> +#>=Pkg: multiarch 2 2 i686 +#>=Prv: multiarch = 2-2 + +system x86_64 rpm @System +poolflags implicitobsoleteusescolors +solverflags bestobeypolicy +job update oneof a-2-2.x86_64@available multiarch-1-1.x86_64@@System multiarch-2-2.i686@available [forcebest,targeted,setevr,setarch] +result transaction,problems <inline> +#>upgrade a-1-1.x86_64@@System a-2-2.x86_64@available +#>upgrade multiarch-1-1.x86_64@@System multiarch-2-2.x86_64@available +#>upgrade c-dep-1-1.x86_64@@System c-dep-2-2.x86_64@available +#>upgrade c-1-1.x86_64@@System c-2-2.x86_64@available +#>upgrade d-1-1.x86_64@@System d-2-2.x86_64@available diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/tools/repo2solv.c new/libsolv-0.7.33/tools/repo2solv.c --- old/libsolv-0.7.32/tools/repo2solv.c 2024-07-08 12:40:07.000000000 +0200 +++ new/libsolv-0.7.33/tools/repo2solv.c 2025-05-14 14:10:07.000000000 +0200 @@ -5,6 +5,7 @@ * for further information */ +#include <getopt.h> #include <sys/types.h> #include <stdio.h> #include <stdlib.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libsolv-0.7.32/tools/rpms2solv.c new/libsolv-0.7.33/tools/rpms2solv.c --- old/libsolv-0.7.32/tools/rpms2solv.c 2023-07-19 11:52:42.000000000 +0200 +++ new/libsolv-0.7.33/tools/rpms2solv.c 2025-04-10 15:50:07.000000000 +0200 @@ -70,9 +70,9 @@ #ifdef SUSE int add_auto = 0; #endif - int filtered_filelist = 0; + int flags = 0; - while ((c = getopt(argc, argv, "0XkKm:F")) >= 0) + while ((c = getopt(argc, argv, "0XkKm:Fi")) >= 0) { switch(c) { @@ -83,7 +83,7 @@ manifest0 = 1; break; case 'F': - filtered_filelist = 1; + flags |= RPM_ADD_FILTERED_FILELIST; break; #ifdef ENABLE_PUBKEY case 'k': @@ -98,6 +98,9 @@ add_auto = 1; #endif break; + case 'i': + flags |= RPM_ADD_WITH_PKGID; + break; default: exit(1); } @@ -169,7 +172,7 @@ continue; } #endif - if (repo_add_rpm(repo, rpms[i], REPO_REUSE_REPODATA|REPO_NO_INTERNALIZE|(filtered_filelist ? RPM_ADD_FILTERED_FILELIST : 0)) == 0) + if (repo_add_rpm(repo, rpms[i], REPO_REUSE_REPODATA|REPO_NO_INTERNALIZE|flags) == 0) { fprintf(stderr, "rpms2solv: %s\n", pool_errstr(pool)); res = 1;