Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package apko for openSUSE:Factory checked in at 2026-10-27 16:49:13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/apko (Old) and /work/SRC/openSUSE:Factory/.apko.new.2252680 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "apko" Tue Oct 27 16:49:13 2026 rev:144 rq:1392962 version:1.4.13 Changes: -------- --- /work/SRC/openSUSE:Factory/apko/apko.changes 2026-10-20 12:38:28.777920082 +0200 +++ /work/SRC/openSUSE:Factory/.apko.new.2252680/apko.changes 2026-10-27 16:49:44.267437397 +0100 @@ -1,0 +2,21 @@ +Tue Oct 27 06:31:22 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 1.4.13: + * build(deps): bump chainguard.dev/sdk from 0.1.398 to 0.1.404 + (#2596) + * build(deps): bump google.golang.org/api from 0.304.0 to 0.305.0 + (#2597) + * ldso-cache: match glibc ldconfig directory and entry ordering + (#2598) + * build(deps): bump step-security/harden-runner from 2.22.1 to + 2.22.2 (#2595) + * build(deps): bump chainguard.dev/sdk from 0.1.397 to 0.1.398 + (#2594) + * build(deps): bump google.golang.org/api from 0.302.0 to 0.304.0 + (#2588) + * build(deps): bump chainguard.dev/sdk from 0.1.373 to 0.1.397 + (#2591) + * build(deps): bump github.com/klauspost/pgzip from 1.2.7 to + 1.3.0 (#2592) + +------------------------------------------------------------------- Old: ---- apko-1.4.12.obscpio New: ---- apko-1.4.13.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ apko.spec ++++++ --- /var/tmp/diff_new_pack.YTmt0h/_old 2026-10-27 16:49:46.196518242 +0100 +++ /var/tmp/diff_new_pack.YTmt0h/_new 2026-10-27 16:49:46.199518368 +0100 @@ -17,7 +17,7 @@ Name: apko -Version: 1.4.12 +Version: 1.4.13 Release: 0 Summary: Build OCI images from APK packages directly without Dockerfile License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.YTmt0h/_old 2026-10-27 16:49:46.270521344 +0100 +++ /var/tmp/diff_new_pack.YTmt0h/_new 2026-10-27 16:49:46.274521511 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/chainguard-dev/apko.git</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">refs/tags/v1.4.12</param> + <param name="revision">refs/tags/v1.4.13</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.YTmt0h/_old 2026-10-27 16:49:46.327523732 +0100 +++ /var/tmp/diff_new_pack.YTmt0h/_new 2026-10-27 16:49:46.332523942 +0100 @@ -3,6 +3,6 @@ <param name="url">https://github.com/chainguard-dev/apko</param> <param name="changesrevision">861f83f69e6fa9114405a2f7bb5cf6585ad00421</param></service><service name="tar_scm"> <param name="url">https://github.com/chainguard-dev/apko.git</param> - <param name="changesrevision">0c659afba7f7842a3b18cdd5108675455339912b</param></service></servicedata> + <param name="changesrevision">217f25a71fd6f18f00fb1024f9b251dc7127bfd5</param></service></servicedata> (No newline at EOF) ++++++ apko-1.4.12.obscpio -> apko-1.4.13.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-1.4.12/go.mod new/apko-1.4.13/go.mod --- old/apko-1.4.12/go.mod 2026-10-16 16:50:56.000000000 +0200 +++ new/apko-1.4.13/go.mod 2026-10-24 00:02:54.000000000 +0200 @@ -3,7 +3,7 @@ go 1.27.0 require ( - chainguard.dev/sdk v0.1.373 + chainguard.dev/sdk v0.1.404 github.com/chainguard-dev/clog v1.8.1 github.com/charmbracelet/log v1.0.0 github.com/erofs/go-erofs v0.3.2-0.20260804074615-52cc42c5291c @@ -17,7 +17,7 @@ github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/invopop/jsonschema v0.14.0 github.com/klauspost/compress v1.20.3 - github.com/klauspost/pgzip v1.2.7 + github.com/klauspost/pgzip v1.3.0 github.com/package-url/packageurl-go v0.1.7 github.com/pavlo-v-chernykh/keystore-go/v4 v4.5.0 github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c @@ -35,7 +35,7 @@ golang.org/x/sys v0.49.0 golang.org/x/term v0.47.0 golang.org/x/time v0.16.0 - google.golang.org/api v0.302.0 + google.golang.org/api v0.305.0 gopkg.in/ini.v1 v1.67.3 gopkg.in/yaml.v3 v3.0.1 k8s.io/apimachinery v0.37.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-1.4.12/go.sum new/apko-1.4.13/go.sum --- old/apko-1.4.12/go.sum 2026-10-16 16:50:56.000000000 +0200 +++ new/apko-1.4.13/go.sum 2026-10-24 00:02:54.000000000 +0200 @@ -1,7 +1,7 @@ chainguard.dev/go-grpc-kit v0.20.0 h1:MDwZtTlUlMSMEPcoi9m8tnu4g+M88T1toUZ3Th/+0Gc= chainguard.dev/go-grpc-kit v0.20.0/go.mod h1:ocuwyRX9tqRRvJkS3/ZkDYGMnl+6FLC4bvF0cm6DGsk= -chainguard.dev/sdk v0.1.373 h1:RBZUvUYCdM7eCKJfsRg8se5o9Af8dBmCOE89SSo/TEE= -chainguard.dev/sdk v0.1.373/go.mod h1:EhyK8jxoiqdsFK7ZwdCXCy8R9zHs20Su6L9rk5ceilA= +chainguard.dev/sdk v0.1.404 h1:kUZOIcwuKgOiDbzLkS/hUNA+T7yDwTN/sX7d3FCZ6es= +chainguard.dev/sdk v0.1.404/go.mod h1:EhyK8jxoiqdsFK7ZwdCXCy8R9zHs20Su6L9rk5ceilA= cloud.google.com/go/auth v0.24.1-0.20261001053825-dbc26066f70a h1:jW1ZLFy9oa5ai8LOI40z6s+DL1cO/L1KSm9hVGnibn8= cloud.google.com/go/auth v0.24.1-0.20261001053825-dbc26066f70a/go.mod h1:1dmBXa9xfBvBr39ZnDUDkaaA91ccq9CcqENDgJA4d7c= cloud.google.com/go/auth/oauth2adapt v0.3.0 h1:FY8oSZpCYoUNv6QxVODuMjQz4IlSOVeiQtZ08vLPz88= @@ -153,8 +153,8 @@ github.com/kevinburke/ssh_config v1.6.0/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M= github.com/klauspost/compress v1.20.3 h1:zWNoFqq/lSuYQRim3dUXlXeA0IqwuZGicdG5ZTfY5j4= github.com/klauspost/compress v1.20.3/go.mod h1:LUdAzn7YLVvxLpc7y3V1m40wESHTgc1422pwwBSKYuI= -github.com/klauspost/pgzip v1.2.7 h1:02QB3Ttao6zOWDnSsv3bIvjN24bX0eGjWniQ8vuBfkA= -github.com/klauspost/pgzip v1.2.7/go.mod h1:g7E6NrOKHOzah4QwK6Ue1tNCJs8IDiNOfjiXTr85U2E= +github.com/klauspost/pgzip v1.3.0 h1:8t+KjjzD/0n/8vNlJGGZmTeK4njuwffOQvJm8tOSc8o= +github.com/klauspost/pgzip v1.3.0/go.mod h1:Xx7tAv5DH8ObLHUDQKXoE/nd8i/FYdNDTVMvi3SLTKI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -358,8 +358,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.302.0 h1:/eENsEv3+GE0QiEmXjdaLI84Mt76LNjGz4vp4E7sRVw= -google.golang.org/api v0.302.0/go.mod h1:dcjRWAy1QdjGb3Z67Qu0gdBWH2gL8Qoy/RI2ZVuvdeE= +google.golang.org/api v0.305.0 h1:2+f87RXv3l6Rom0t2GN0zOr2dV+LqOKnxSFVOUEurnc= +google.golang.org/api v0.305.0/go.mod h1:dcjRWAy1QdjGb3Z67Qu0gdBWH2gL8Qoy/RI2ZVuvdeE= google.golang.org/genproto v0.0.0-20260715232425-e75dac1f907d h1:C9v1o0/4quuhOAfmRXA2j+we0PqZIp8traLdeogF3Ms= google.golang.org/genproto v0.0.0-20260715232425-e75dac1f907d/go.mod h1:Wz2wFJntZFmLGo7pLDXZ3wYk5hyc0Mb+SkHhDDXT+lU= google.golang.org/genproto/googleapis/api v0.0.0-20260803160001-6ac0973c030d h1:FarXi840EJWSHYTN3ERkADbPWjl307+FGrA22KAVjjc= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-1.4.12/internal/ldso-cache/ldsocache.go new/apko-1.4.13/internal/ldso-cache/ldsocache.go --- old/apko-1.4.12/internal/ldso-cache/ldsocache.go 2026-10-16 16:50:56.000000000 +0200 +++ new/apko-1.4.13/internal/ldso-cache/ldsocache.go 2026-10-24 00:02:54.000000000 +0200 @@ -375,10 +375,17 @@ // The dynamic linker binary-searches /etc/ld.so.cache using // _dl_cache_libcmp, so entries must be ordered by that same comparison or // ld.so may fail to find a library that is present in the cache (reporting - // "cannot open shared object file"). glibc's ldconfig emits entries in - // descending order, so we negate the comparison. - slices.SortFunc(allEntries, func(entry, other LDSOCacheEntry) int { - return -dlCacheLibcmp(filepath.Base(entry.Name), filepath.Base(other.Name)) + // "cannot open shared object file"). This mirrors compare() in glibc's + // elf/cache.c: descending _dl_cache_libcmp order, then descending flags. + // + // ld.so uses the first matching entry, and ldconfig inserts entries that + // compare equal after the existing ones, so the first libdir to provide a + // library wins. A stable sort preserves that libdir order. + slices.SortStableFunc(allEntries, func(entry, other LDSOCacheEntry) int { + if c := dlCacheLibcmp(filepath.Base(other.Name), filepath.Base(entry.Name)); c != 0 { + return c + } + return cmp.Compare(other.Flags, entry.Flags) }) return allEntries, nil @@ -684,9 +691,13 @@ debugf("Warning: Could not parse config file %s\n", match) continue } - libpaths = append(libpaths, incpaths...) + for _, incpath := range incpaths { + if !slices.Contains(libpaths, incpath) { + libpaths = append(libpaths, incpath) + } + } } - return libpaths, nil + continue } libpath := line diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-1.4.12/internal/ldso-cache/ldsocache_test.go new/apko-1.4.13/internal/ldso-cache/ldsocache_test.go --- old/apko-1.4.12/internal/ldso-cache/ldsocache_test.go 2026-10-16 16:50:56.000000000 +0200 +++ new/apko-1.4.13/internal/ldso-cache/ldsocache_test.go 2026-10-24 00:02:54.000000000 +0200 @@ -129,6 +129,15 @@ require.Contains(t, dirs, "/b/libs") } +func Test_ParseLDSOConf_LinesAfterInclude(t *testing.T) { + fsys := os.DirFS("testdata") + dirs, err := ParseLDSOConf(fsys, "ld.so.conf.include-mixed") + require.NoError(t, err) + // Directories after an include must not be dropped, and duplicates keep + // their first position. + require.Equal(t, []string{"/before", "/a/libs", "/b/libs", "/after"}, dirs) +} + // Instead of real ELF binaries, our "libraries" are YAML files // that are used to populate an elfInfo structure. func mockGetElfInfo(r io.ReaderAt) (elfInfo, error) { @@ -222,3 +231,24 @@ "entries not in descending _dl_cache_libcmp order: %q before %q", a, b) } } + +func Test_LDSOCacheEntriesForDirs_DuplicatesKeepLibdirOrder(t *testing.T) { + getElfInfo = mockGetElfInfo + root := os.DirFS("testdata/libroot") + for _, libdirs := range [][]string{ + {"/lib", "/usr/lib"}, + {"/usr/lib", "/lib"}, + } { + entries, err := LDSOCacheEntriesForDirs(root, libdirs) + require.NoError(t, err) + // ld.so picks the first matching entry, so a library found in an + // earlier libdir must come before the same library in a later one. + for i := 1; i < len(entries); i++ { + if filepath.Base(entries[i-1].Name) != filepath.Base(entries[i].Name) { + continue + } + require.Equal(t, libdirs[0], filepath.Dir(entries[i-1].Name)) + require.Equal(t, libdirs[1], filepath.Dir(entries[i].Name)) + } + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-1.4.12/internal/ldso-cache/testdata/ld.so.conf.include-mixed new/apko-1.4.13/internal/ldso-cache/testdata/ld.so.conf.include-mixed --- old/apko-1.4.12/internal/ldso-cache/testdata/ld.so.conf.include-mixed 1970-01-01 01:00:00.000000000 +0100 +++ new/apko-1.4.13/internal/ldso-cache/testdata/ld.so.conf.include-mixed 2026-10-24 00:02:54.000000000 +0200 @@ -0,0 +1,4 @@ +/before +include ld.so.conf.d/*.conf +/after +/a/libs diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-1.4.12/pkg/build/build_implementation.go new/apko-1.4.13/pkg/build/build_implementation.go --- old/apko-1.4.12/pkg/build/build_implementation.go 2026-10-16 16:50:56.000000000 +0200 +++ new/apko-1.4.13/pkg/build/build_implementation.go 2026-10-24 00:02:54.000000000 +0200 @@ -27,6 +27,7 @@ "os" "path/filepath" "runtime" + "slices" "sync" "github.com/chainguard-dev/clog" @@ -346,10 +347,7 @@ if err != nil { return fmt.Errorf("parsing /etc/ld.so.conf: %w", err) } - libdirs := make([]string, 0, 1+len(dirs)) - libdirs = append(libdirs, "/lib") - libdirs = append(libdirs, dirs...) - cacheFile, err := ldsocache.BuildCacheFileForDirs(fsys, libdirs) + cacheFile, err := ldsocache.BuildCacheFileForDirs(fsys, ldsoLibDirs(fsys, dirs)) if err != nil { return fmt.Errorf("generating ldsocache: %w", err) } @@ -367,6 +365,29 @@ return nil } +// ldsoLibDirs returns the directories to scan for /etc/ld.so.cache in the same +// order as glibc's ldconfig: the ld.so.conf directories first, followed by the +// built-in system directories /lib and /usr/lib. Duplicates are dropped, keeping +// the first occurrence. On a usrmerged system /lib is a symlink to /usr/lib, so +// it is skipped entirely to avoid listing every library twice. +func ldsoLibDirs(fsys apkfs.FullFS, confDirs []string) []string { + _, err := fsys.Readlink("lib") + libIsSymlink := err == nil + + libdirs := make([]string, 0, len(confDirs)+2) + for _, dir := range append(slices.Clone(confDirs), "/lib", "/usr/lib") { + dir = filepath.Clean(dir) + if dir == "/lib" && libIsSymlink { + continue + } + if slices.Contains(libdirs, dir) { + continue + } + libdirs = append(libdirs, dir) + } + return libdirs +} + func (bc *Context) WriteEtcApkoConfig(_ context.Context) error { // Encode the image configuration and write it to /etc/apko.json f, err := bc.fs.Create("/etc/apko.json") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-1.4.12/pkg/build/ldsocache_test.go new/apko-1.4.13/pkg/build/ldsocache_test.go --- old/apko-1.4.12/pkg/build/ldsocache_test.go 2026-10-16 16:50:56.000000000 +0200 +++ new/apko-1.4.13/pkg/build/ldsocache_test.go 2026-10-24 00:02:54.000000000 +0200 @@ -2,6 +2,7 @@ import ( "context" + "slices" "testing" "chainguard.dev/apko/pkg/apk/apk" @@ -44,3 +45,47 @@ t.Errorf("%s has unexpected permissions: %v", cache, perm) } } + +func TestLdsoLibDirs(t *testing.T) { + for _, tc := range []struct { + name string + usrmerge bool + confDirs []string + want []string + }{{ + name: "split lib", + confDirs: []string{"/usr/local/lib"}, + want: []string{"/usr/local/lib", "/lib", "/usr/lib"}, + }, { + name: "usrmerge skips /lib", + usrmerge: true, + confDirs: []string{"/usr/local/lib"}, + want: []string{"/usr/local/lib", "/usr/lib"}, + }, { + name: "usrmerge skips /lib from ld.so.conf too", + usrmerge: true, + confDirs: []string{"/lib", "/opt/lib", "/usr/lib/"}, + want: []string{"/opt/lib", "/usr/lib"}, + }, { + name: "conf dirs keep precedence over system dirs", + confDirs: []string{"/usr/lib", "/opt/lib", "/opt/lib"}, + want: []string{"/usr/lib", "/opt/lib", "/lib"}, + }} { + t.Run(tc.name, func(t *testing.T) { + fsys := fs.NewMemFS() + if err := fsys.MkdirAll("usr/lib", 0755); err != nil { + t.Fatal(err) + } + if tc.usrmerge { + if err := fsys.Symlink("usr/lib", "lib"); err != nil { + t.Fatal(err) + } + } else if err := fsys.MkdirAll("lib", 0755); err != nil { + t.Fatal(err) + } + if got := ldsoLibDirs(fsys, tc.confDirs); !slices.Equal(got, tc.want) { + t.Errorf("ldsoLibDirs() = %v, want %v", got, tc.want) + } + }) + } +} ++++++ apko.obsinfo ++++++ --- /var/tmp/diff_new_pack.YTmt0h/_old 2026-10-27 16:49:47.159558602 +0100 +++ /var/tmp/diff_new_pack.YTmt0h/_new 2026-10-27 16:49:47.165558854 +0100 @@ -1,5 +1,5 @@ name: apko -version: 1.4.12 -mtime: 1792162256 -commit: 0c659afba7f7842a3b18cdd5108675455339912b +version: 1.4.13 +mtime: 1792792974 +commit: 217f25a71fd6f18f00fb1024f9b251dc7127bfd5 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/apko/vendor.tar.gz /work/SRC/openSUSE:Factory/.apko.new.2252680/vendor.tar.gz differ: char 135, line 2
