Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package apko for openSUSE:Factory checked in 
at 2025-07-24 18:47:23
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/apko (Old)
 and      /work/SRC/openSUSE:Factory/.apko.new.13279 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "apko"

Thu Jul 24 18:47:23 2025 rev:60 rq:1295487 version:0.29.9

Changes:
--------
--- /work/SRC/openSUSE:Factory/apko/apko.changes        2025-07-17 
17:21:09.741740868 +0200
+++ /work/SRC/openSUSE:Factory/.apko.new.13279/apko.changes     2025-07-24 
18:49:50.196454889 +0200
@@ -1,0 +2,22 @@
+Thu Jul 24 08:20:01 UTC 2025 - Johannes Kastl 
<opensuse_buildserv...@ojkastl.de>
+
+- Update to version 0.29.9:
+  * Ensure parent dirs exist for partial idb (#1776)
+  * build(deps): bump chainguard-dev/actions from 1.4.5 to 1.4.6
+    (#1775)
+  * build(deps): bump github/codeql-action from 3.29.2 to 3.29.3
+    (#1774)
+
+-------------------------------------------------------------------
+Thu Jul 24 08:06:25 UTC 2025 - Johannes Kastl 
<opensuse_buildserv...@ojkastl.de>
+
+- Update to version 0.29.8:
+  * build(deps): bump sigstore/cosign-installer from 3.9.1 to 3.9.2
+    (#1771)
+  * Close response from index HEAD request (#1770)
+  * build(deps): bump sigs.k8s.io/release-utils from 0.11.1 to
+    0.12.0 (#1766)
+  * build(deps): bump chainguard.dev/sdk from 0.1.36 to 0.1.37
+    (#1767)
+
+-------------------------------------------------------------------

Old:
----
  apko-0.29.7.obscpio

New:
----
  apko-0.29.9.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ apko.spec ++++++
--- /var/tmp/diff_new_pack.sBdsZu/_old  2025-07-24 18:49:52.236539380 +0200
+++ /var/tmp/diff_new_pack.sBdsZu/_new  2025-07-24 18:49:52.240539545 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           apko
-Version:        0.29.7
+Version:        0.29.9
 Release:        0
 Summary:        Build OCI images from APK packages directly without Dockerfile
 License:        Apache-2.0

++++++ _service ++++++
--- /var/tmp/diff_new_pack.sBdsZu/_old  2025-07-24 18:49:52.284541368 +0200
+++ /var/tmp/diff_new_pack.sBdsZu/_new  2025-07-24 18:49:52.284541368 +0200
@@ -3,7 +3,7 @@
     <param name="url">https://github.com/chainguard-dev/apko</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="revision">v0.29.7</param>
+    <param name="revision">v0.29.9</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)</param>
     <param name="changesgenerate">enable</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.sBdsZu/_old  2025-07-24 18:49:52.308542362 +0200
+++ /var/tmp/diff_new_pack.sBdsZu/_new  2025-07-24 18:49:52.316542694 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://github.com/chainguard-dev/apko</param>
-              <param 
name="changesrevision">28bb8ff0e706fea7812008bb8c7e2305710aacba</param></service></servicedata>
+              <param 
name="changesrevision">249040d757402713b515281a333ea5042050c471</param></service></servicedata>
 (No newline at EOF)
 

++++++ apko-0.29.7.obscpio -> apko-0.29.9.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apko-0.29.7/.golangci.yml 
new/apko-0.29.9/.golangci.yml
--- old/apko-0.29.7/.golangci.yml       2025-07-17 01:34:24.000000000 +0200
+++ new/apko-0.29.9/.golangci.yml       2025-07-21 20:08:10.000000000 +0200
@@ -4,6 +4,7 @@
 linters:
   enable:
     - asciicheck
+    - bodyclose
     - errorlint
     - forbidigo
     - gocritic
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apko-0.29.7/go.mod new/apko-0.29.9/go.mod
--- old/apko-0.29.7/go.mod      2025-07-17 01:34:24.000000000 +0200
+++ new/apko-0.29.9/go.mod      2025-07-21 20:08:10.000000000 +0200
@@ -3,7 +3,7 @@
 go 1.24.5
 
 require (
-       chainguard.dev/sdk v0.1.36
+       chainguard.dev/sdk v0.1.37
        github.com/chainguard-dev/clog v1.7.0
        github.com/charmbracelet/log v0.4.2
        github.com/go-git/go-git/v5 v5.16.2
@@ -33,7 +33,7 @@
        gopkg.in/ini.v1 v1.67.0
        gopkg.in/yaml.v3 v3.0.1
        k8s.io/apimachinery v0.33.3
-       sigs.k8s.io/release-utils v0.11.1
+       sigs.k8s.io/release-utils v0.12.0
 )
 
 require (
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apko-0.29.7/go.sum new/apko-0.29.9/go.sum
--- old/apko-0.29.7/go.sum      2025-07-17 01:34:24.000000000 +0200
+++ new/apko-0.29.9/go.sum      2025-07-21 20:08:10.000000000 +0200
@@ -1,7 +1,7 @@
 chainguard.dev/go-grpc-kit v0.17.11 
h1:m4ZL2yg6sSrdPA593qVh9KHTZ+XOmLwqv3Jt5vT0FuU=
 chainguard.dev/go-grpc-kit v0.17.11/go.mod 
h1:aYlrvAscMZBtVIA7bykUWfbjhL2fDoUCECHvopC2xWY=
-chainguard.dev/sdk v0.1.36 h1:YzxE7ZccR32spQ3i8boN6eDEYlvhV17r8fdpI9vdOgE=
-chainguard.dev/sdk v0.1.36/go.mod 
h1:4HOnG9fVNC9ruzkJLMWWUNM1iVxxBL+bKqj0STERbcs=
+chainguard.dev/sdk v0.1.37 h1:4hZ2enarpA/FZ1JMXE3EOlpzd18LmdWZ7UScwdSlrSs=
+chainguard.dev/sdk v0.1.37/go.mod 
h1:4HOnG9fVNC9ruzkJLMWWUNM1iVxxBL+bKqj0STERbcs=
 cloud.google.com/go v0.26.0/go.mod 
h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go/auth v0.16.2 
h1:QvBAGFPLrDeoiNjyfVunhQ10HKNYuOwZ5noee0M5df4=
 cloud.google.com/go/auth v0.16.2/go.mod 
h1:sRBas2Y1fB1vZTdurouM0AzuYQBMZinrUYL8EufhtEA=
@@ -348,8 +348,8 @@
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod 
h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
-golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
+golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -429,8 +429,8 @@
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod 
h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/tools v0.1.12/go.mod 
h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.6.0/go.mod 
h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
-golang.org/x/tools v0.34.0/go.mod 
h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
+golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
+golang.org/x/tools v0.35.0/go.mod 
h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -479,5 +479,5 @@
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA=
 k8s.io/apimachinery v0.33.3/go.mod 
h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-sigs.k8s.io/release-utils v0.11.1 
h1:hzvXGpHgHJfLOJB6TRuu14bzWc3XEglHmXHJqwClSZE=
-sigs.k8s.io/release-utils v0.11.1/go.mod 
h1:ybR2V/uQAOGxYfzYtBenSYeXWkBGNP2qnEiX77ACtpc=
+sigs.k8s.io/release-utils v0.12.0 
h1:+Z8cEUAaxItrMcTOJ0jtUg3Fm1uNgPNol+VIL6XtQqQ=
+sigs.k8s.io/release-utils v0.12.0/go.mod 
h1:TveYRPK4Mq6qXA0PJiUMEOlWvvIQG0Mh5APQmHD5JpA=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apko-0.29.7/internal/cli/publish_test.go 
new/apko-0.29.9/internal/cli/publish_test.go
--- old/apko-0.29.7/internal/cli/publish_test.go        2025-07-17 
01:34:24.000000000 +0200
+++ new/apko-0.29.9/internal/cli/publish_test.go        2025-07-21 
20:08:10.000000000 +0200
@@ -167,7 +167,7 @@
 
        // This test will fail if we ever make a change in apko that changes 
the image.
        // Sometimes, this is intentional, and we need to change this and bump 
the version.
-       want := 
"sha256:88a8065a9ccb964f27ca842a3e297e152997ddae2997fe68ae7535653c1ebc46"
+       want := 
"sha256:66dc21761826860d1152e8a6defa7919ad3f65af5d56fd75164c4c36ba85c648"
        require.Equal(t, want, digest.String())
 
        im, err := idx.IndexManifest()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apko-0.29.7/pkg/apk/apk/index.go 
new/apko-0.29.9/pkg/apk/apk/index.go
--- old/apko-0.29.7/pkg/apk/apk/index.go        2025-07-17 01:34:24.000000000 
+0200
+++ new/apko-0.29.9/pkg/apk/apk/index.go        2025-07-21 20:08:10.000000000 
+0200
@@ -135,6 +135,7 @@
                if err != nil {
                        return nil, err
                }
+               defer resp.Body.Close()
 
                if resp.StatusCode != http.StatusOK {
                        return nil, fmt.Errorf("unexpected status code %d", 
resp.StatusCode)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apko-0.29.7/pkg/build/layers.go 
new/apko-0.29.9/pkg/build/layers.go
--- old/apko-0.29.7/pkg/build/layers.go 2025-07-17 01:34:24.000000000 +0200
+++ new/apko-0.29.9/pkg/build/layers.go 2025-07-21 20:08:10.000000000 +0200
@@ -284,10 +284,6 @@
 
        top := newLayerWriter(f)
 
-       // We want to match the file info from the top layer's idb file below,
-       // so when we run into it, just stash it for later.
-       var idb tar.Header
-
        // In a tar file, it is customary to include directories before files 
in those directories.
        // In order to know which directories we need to include, we maintain a 
directory stack for each layer.
        // We compare those stacks to the full FS that we're walking whenever 
we create a new tar entry.
@@ -371,7 +367,6 @@
                        if err != nil {
                                return nil, fmt.Errorf("opening %s: %w", 
f.path, err)
                        }
-
                        if _, err := io.CopyBuffer(w.w, data, buf); err != nil {
                                return nil, fmt.Errorf("copying %s: %w", 
f.path, err)
                        }
@@ -383,35 +378,46 @@
                }
 
                if f.header.Name == "usr/lib/apk/db/installed" {
-                       idb = *f.header
-               }
-       }
-
-       // Once we're done walking the FS, we need to finalize each layer...
-       layers := make([]v1.Layer, 0, len(groups)+1)
-       for i, g := range groups {
-               w := groupToWriter[g]
+                       // Add a partial installed db to each layer to satisfy 
scanners.
+                       for _, g := range groups {
+                               w := groupToWriter[g]
+
+                               // Make sure we have all parent directories to 
appease AWS Lambda.
+                               for _, todo := range w.alignStacks(stack) {
+                                       todo.header.ModTime = f.header.ModTime
+
+                                       if err := w.w.WriteHeader(todo.header); 
err != nil {
+                                               return nil, fmt.Errorf("writing 
header %s: %w", todo.header.Name, err)
+                                       }
+                               }
 
-               // Add a partial installed db to satisfy scanners.
-               {
-                       var buf bytes.Buffer
-                       for _, pkg := range g.pkgs {
-                               if _, err := buf.Write(pkgToDiff[pkg]); err != 
nil {
-                                       return nil, err
+                               // Accumulate all the idb entries for this 
layer.
+                               var buf bytes.Buffer
+                               for _, pkg := range g.pkgs {
+                                       if _, err := buf.Write(pkgToDiff[pkg]); 
err != nil {
+                                               return nil, err
+                                       }
                                }
-                       }
 
-                       // Only the size should be different across layers.
-                       idb.Size = int64(buf.Len())
+                               // Only the size should be different across 
layers.
+                               idb := *f.header
+                               idb.Size = int64(buf.Len())
 
-                       if err := w.w.WriteHeader(&idb); err != nil {
-                               return nil, err
-                       }
+                               if err := w.w.WriteHeader(&idb); err != nil {
+                                       return nil, err
+                               }
 
-                       if _, err := io.Copy(w.w, &buf); err != nil {
-                               return nil, err
+                               if _, err := io.Copy(w.w, &buf); err != nil {
+                                       return nil, err
+                               }
                        }
                }
+       }
+
+       // Once we're done walking the FS, we need to finalize each layer...
+       layers := make([]v1.Layer, 0, len(groups)+1)
+       for i, g := range groups {
+               w := groupToWriter[g]
 
                l, err := w.finalize()
                if err != nil {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apko-0.29.7/pkg/build/layers_test.go 
new/apko-0.29.9/pkg/build/layers_test.go
--- old/apko-0.29.7/pkg/build/layers_test.go    2025-07-17 01:34:24.000000000 
+0200
+++ new/apko-0.29.9/pkg/build/layers_test.go    2025-07-21 20:08:10.000000000 
+0200
@@ -15,11 +15,16 @@
 package build
 
 import (
+       "archive/tar"
+       "context"
        "fmt"
+       "io"
+       "os"
        "slices"
        "testing"
 
        "chainguard.dev/apko/pkg/apk/apk"
+       apkfs "chainguard.dev/apko/pkg/apk/fs"
 )
 
 func size(pkgs ...*apk.Package) uint64 {
@@ -224,3 +229,122 @@
 
        return nil
 }
+
+func TestSplitLayersDirectoryCreation(t *testing.T) {
+       // Create a minimal filesystem with an installed DB file
+       fsys := apkfs.NewMemFS()
+
+       // Create the parent directories first
+       if err := fsys.MkdirAll("usr/lib/apk/db", 0755); err != nil {
+               t.Fatalf("failed to create parent directories: %v", err)
+       }
+
+       // Create the installed DB file with some content
+       idbContent := []byte("test db content")
+       if err := fsys.WriteFile("usr/lib/apk/db/installed", idbContent, 0644); 
err != nil {
+               t.Fatalf("failed to create installed DB file: %v", err)
+       }
+
+       // Create test packages for multiple layers
+       pkg1 := &apk.Package{
+               Name:          "pkg1",
+               Origin:        "pkg1",
+               Version:       "1.0.0",
+               InstalledSize: 1000,
+       }
+       pkg2 := &apk.Package{
+               Name:          "pkg2",
+               Origin:        "pkg2",
+               Version:       "1.0.0",
+               InstalledSize: 2000,
+       }
+
+       // Create package groups (this will result in multiple layers)
+       groups := []*group{
+               {pkgs: []*apk.Package{pkg1}, size: 1000, tiebreaker: "pkg1"},
+               {pkgs: []*apk.Package{pkg2}, size: 2000, tiebreaker: "pkg2"},
+       }
+
+       // Create package diffs (minimal content for each package)
+       pkgToDiff := map[*apk.Package][]byte{
+               pkg1: []byte("pkg1 info\n"),
+               pkg2: []byte("pkg2 info\n"),
+       }
+
+       // Create temp directory for layer files
+       tmpDir, err := os.MkdirTemp("", "layer-test-*")
+       if err != nil {
+               t.Fatalf("failed to create temp dir: %v", err)
+       }
+       defer os.RemoveAll(tmpDir)
+
+       // Call splitLayers to create the layers
+       ctx := context.Background()
+       layers, err := splitLayers(ctx, fsys, groups, pkgToDiff, tmpDir)
+       if err != nil {
+               t.Fatalf("splitLayers failed: %v", err)
+       }
+
+       // We expect 3 layers: one for each package group + top layer
+       if len(layers) != 3 {
+               t.Fatalf("expected 3 layers, got %d", len(layers))
+       }
+
+       wantDirs := map[string]struct{}{
+               "usr":            {},
+               "usr/lib":        {},
+               "usr/lib/apk":    {},
+               "usr/lib/apk/db": {},
+       }
+
+       foundDirs := map[string]struct{}{}
+
+       // Check each of the first 2 layers (package layers) for directory and 
file
+       for i := range 2 {
+               layer := layers[i]
+
+               // Get layer content as tar reader
+               rc, err := layer.Uncompressed()
+               if err != nil {
+                       t.Fatalf("failed to get layer %d content: %v", i, err)
+               }
+
+               tr := tar.NewReader(rc)
+
+               for {
+                       header, err := tr.Next()
+                       if err == io.EOF {
+                               break
+                       }
+                       if err != nil {
+                               t.Fatalf("failed to read tar entry in layer %d: 
%v", i, err)
+                       }
+
+                       // Check for the parent directory
+                       if _, ok := wantDirs[header.Name]; ok && 
header.Typeflag == tar.TypeDir {
+                               foundDirs[header.Name] = struct{}{}
+                       }
+
+                       // Check for the installed DB file
+                       if header.Name == "usr/lib/apk/db/installed" && 
header.Typeflag == tar.TypeReg {
+                               // Verify the file has content
+                               content, err := io.ReadAll(tr)
+                               if err != nil {
+                                       t.Fatalf("failed to read installed DB 
content in layer %d: %v", i, err)
+                               }
+                               if len(content) == 0 {
+                                       t.Errorf("installed DB file in layer %d 
is empty", i)
+                               }
+                       }
+               }
+
+               rc.Close()
+
+               // Verify both directory and file were found
+               for dir := range wantDirs {
+                       if _, ok := foundDirs[dir]; !ok {
+                               t.Errorf("layer %d missing parent directory %q 
- this indicates the directory creation fix is not working", i, dir)
+                       }
+               }
+       }
+}

++++++ apko.obsinfo ++++++
--- /var/tmp/diff_new_pack.sBdsZu/_old  2025-07-24 18:49:52.764561248 +0200
+++ /var/tmp/diff_new_pack.sBdsZu/_new  2025-07-24 18:49:52.768561414 +0200
@@ -1,5 +1,5 @@
 name: apko
-version: 0.29.7
-mtime: 1752708864
-commit: 28bb8ff0e706fea7812008bb8c7e2305710aacba
+version: 0.29.9
+mtime: 1753121290
+commit: 249040d757402713b515281a333ea5042050c471
 

++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/apko/vendor.tar.gz 
/work/SRC/openSUSE:Factory/.apko.new.13279/vendor.tar.gz differ: char 19, line 1

Reply via email to