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-05-08 18:22:29 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/apko (Old) and /work/SRC/openSUSE:Factory/.apko.new.30101 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "apko" Thu May 8 18:22:29 2025 rev:49 rq:1275352 version:0.27.3 Changes: -------- --- /work/SRC/openSUSE:Factory/apko/apko.changes 2025-05-06 16:42:13.330181609 +0200 +++ /work/SRC/openSUSE:Factory/.apko.new.30101/apko.changes 2025-05-08 18:25:02.748643577 +0200 @@ -1,0 +2,21 @@ +Wed May 07 18:52:31 UTC 2025 - Johannes Kastl <opensuse_buildserv...@ojkastl.de> + +- Update to version 0.27.3: + * Fix build_repositories for layered images (#1663) + * README: fix url typo (#1661) + * build(deps): bump golang.org/x/sys from 0.32.0 to 0.33.0 + (#1655) + * build(deps): bump google.golang.org/api from 0.229.0 to 0.231.0 + (#1647) + * build(deps): bump golang.org/x/oauth2 from 0.29.0 to 0.30.0 + (#1656) + * build(deps): bump github.com/go-git/go-git/v5 from 5.14.0 to + 5.16.0 (#1626) + * build(deps): bump sigstore/cosign-installer from 3.8.1 to 3.8.2 + (#1639) + * build(deps): bump github/codeql-action from 3.28.14 to 3.28.17 + (#1652) + * build(deps): bump golang.org/x/sync from 0.13.0 to 0.14.0 + (#1657) + +------------------------------------------------------------------- Old: ---- apko-0.27.2.obscpio New: ---- apko-0.27.3.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ apko.spec ++++++ --- /var/tmp/diff_new_pack.Whdgi8/_old 2025-05-08 18:25:03.608679452 +0200 +++ /var/tmp/diff_new_pack.Whdgi8/_new 2025-05-08 18:25:03.608679452 +0200 @@ -17,7 +17,7 @@ Name: apko -Version: 0.27.2 +Version: 0.27.3 Release: 0 Summary: Build OCI images from APK packages directly without Dockerfile License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.Whdgi8/_old 2025-05-08 18:25:03.668681955 +0200 +++ /var/tmp/diff_new_pack.Whdgi8/_new 2025-05-08 18:25:03.672682122 +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.27.2</param> + <param name="revision">v0.27.3</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.Whdgi8/_old 2025-05-08 18:25:03.692682956 +0200 +++ /var/tmp/diff_new_pack.Whdgi8/_new 2025-05-08 18:25:03.696683123 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/chainguard-dev/apko</param> - <param name="changesrevision">e85ed818320f793afaff25b3e1b691f5b966be39</param></service></servicedata> + <param name="changesrevision">69318398424b487291ee519e29fe1c1c29e54288</param></service></servicedata> (No newline at EOF) ++++++ apko-0.27.2.obscpio -> apko-0.27.3.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-0.27.2/README.md new/apko-0.27.3/README.md --- old/apko-0.27.2/README.md 2025-05-05 18:56:34.000000000 +0200 +++ new/apko-0.27.3/README.md 2025-05-07 20:06:32.000000000 +0200 @@ -130,7 +130,7 @@ Tutorials and guides for apko can be found at the [Chainguard Academy](https://edu.chainguard.dev/open-source/apko/). For support, please find us on the [Kubernetes Slack](https://kubernetes.slack.com/) in the #apko -channel or [open an issue](https://github.com/chainguard-dev/apko/issue). +channel or [open an issue](https://github.com/chainguard-dev/apko/issues). ## Related Work and Resources diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-0.27.2/go.mod new/apko-0.27.3/go.mod --- old/apko-0.27.2/go.mod 2025-05-05 18:56:34.000000000 +0200 +++ new/apko-0.27.3/go.mod 2025-05-07 20:06:32.000000000 +0200 @@ -6,7 +6,7 @@ chainguard.dev/sdk v0.1.31 github.com/chainguard-dev/clog v1.7.0 github.com/charmbracelet/log v0.4.1 - github.com/go-git/go-git/v5 v5.14.0 + github.com/go-git/go-git/v5 v5.16.0 github.com/google/go-cmp v0.7.0 github.com/google/go-containerregistry v0.20.3 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 @@ -25,11 +25,11 @@ go.opentelemetry.io/otel v1.35.0 go.opentelemetry.io/otel/trace v1.35.0 go.step.sm/crypto v0.60.0 - golang.org/x/oauth2 v0.29.0 - golang.org/x/sync v0.13.0 - golang.org/x/sys v0.32.0 + golang.org/x/oauth2 v0.30.0 + golang.org/x/sync v0.14.0 + golang.org/x/sys v0.33.0 golang.org/x/time v0.11.0 - google.golang.org/api v0.229.0 + google.golang.org/api v0.231.0 gopkg.in/ini.v1 v1.67.0 gopkg.in/yaml.v3 v3.0.1 k8s.io/apimachinery v0.32.3 @@ -38,13 +38,13 @@ require ( chainguard.dev/go-grpc-kit v0.17.7 // indirect - cloud.google.com/go/auth v0.16.0 // indirect + cloud.google.com/go/auth v0.16.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.6.0 // indirect dario.cat/mergo v1.0.1 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/ProtonMail/go-crypto v1.1.5 // indirect + github.com/ProtonMail/go-crypto v1.1.6 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -52,7 +52,7 @@ github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charmbracelet/lipgloss v1.0.0 // indirect github.com/charmbracelet/x/ansi v0.4.2 // indirect - github.com/cloudflare/circl v1.6.0 // indirect + github.com/cloudflare/circl v1.6.1 // indirect github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect github.com/containerd/stargz-snapshotter/estargz v0.16.3 // indirect github.com/cyphar/filepath-securejoin v0.4.1 // indirect @@ -122,8 +122,8 @@ golang.org/x/net v0.39.0 // indirect golang.org/x/text v0.24.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e // indirect - google.golang.org/grpc v1.71.1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197 // indirect + google.golang.org/grpc v1.72.0 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gotest.tools/v3 v3.5.1 // indirect diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-0.27.2/go.sum new/apko-0.27.3/go.sum --- old/apko-0.27.2/go.sum 2025-05-05 18:56:34.000000000 +0200 +++ new/apko-0.27.3/go.sum 2025-05-07 20:06:32.000000000 +0200 @@ -3,8 +3,8 @@ chainguard.dev/sdk v0.1.31 h1:Blvpa0Ji/tC1VVV8/l8UyQe022LoRxZLfgasyFE1EhQ= chainguard.dev/sdk v0.1.31/go.mod h1:/zqikqbDCBAAlhIDuBl8V4bR9nmB1qLEIn2w9FxzNwI= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go/auth v0.16.0 h1:Pd8P1s9WkcrBE2n/PhAwKsdrR35V3Sg2II9B+ndM3CU= -cloud.google.com/go/auth v0.16.0/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= +cloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU= +cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= @@ -19,8 +19,8 @@ github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/ProtonMail/go-crypto v1.1.5 h1:eoAQfK2dwL+tFSFpr7TbOaPNUbPiJj4fLYwwGE1FQO4= -github.com/ProtonMail/go-crypto v1.1.5/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= +github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw= +github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= @@ -49,8 +49,8 @@ github.com/charmbracelet/x/ansi v0.4.2 h1:0JM6Aj/g/KC154/gOP4vfxun0ff6itogDYk41kof+qk= github.com/charmbracelet/x/ansi v0.4.2/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.6.0 h1:cr5JKic4HI+LkINy2lg3W2jF8sHCVTBncJr5gIIq7qk= -github.com/cloudflare/circl v1.6.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= +github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ= github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= @@ -101,8 +101,8 @@ github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.14.0 h1:/MD3lCrGjCen5WfEAzKg00MJJffKhC8gzS80ycmCi60= -github.com/go-git/go-git/v5 v5.14.0/go.mod h1:Z5Xhoia5PcWA3NF8vRLURn9E5FRhSl7dGj9ItW3Wk5k= +github.com/go-git/go-git/v5 v5.16.0 h1:k3kuOEpkc0DeY7xlL6NaaNg39xdgQbtH5mwCafHO9AQ= +github.com/go-git/go-git/v5 v5.16.0/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= github.com/go-jose/go-jose/v3 v3.0.4 h1:Wp5HA7bLQcKnf6YYao/4kpRpVMp/yf6+pJKV8WFSaNY= github.com/go-jose/go-jose/v3 v3.0.4/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -346,8 +346,8 @@ golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98= -golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -355,8 +355,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= -golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -375,8 +375,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -413,8 +413,8 @@ 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= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.229.0 h1:p98ymMtqeJ5i3lIBMj5MpR9kzIIgzpHHh8vQ+vgAzx8= -google.golang.org/api v0.229.0/go.mod h1:wyDfmq5g1wYJWn29O22FDWN48P7Xcz0xz+LBpptYvB0= +google.golang.org/api v0.231.0 h1:LbUD5FUl0C4qwia2bjXhCMH65yz1MLPzA/0OYEsYY7Q= +google.golang.org/api v0.231.0/go.mod h1:H52180fPI/QQlUc0F4xWfGZILdv09GCWKt2bcsn164A= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -422,16 +422,16 @@ google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e h1:ztQaXfzEXTmCBvbtWYRhJxW+0iJcz2qXfd38/e9l7bA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197 h1:29cjnHVylHwTzH66WfFZqgSQgnxzvWE+jvBwpZCLRxY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= -google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= +google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-0.27.2/internal/cli/publish_test.go new/apko-0.27.3/internal/cli/publish_test.go --- old/apko-0.27.2/internal/cli/publish_test.go 2025-05-05 18:56:34.000000000 +0200 +++ new/apko-0.27.3/internal/cli/publish_test.go 2025-05-07 20:06:32.000000000 +0200 @@ -17,20 +17,25 @@ import ( "context" "fmt" + "io" + "io/fs" "net/http" "net/http/httptest" "net/url" "os" "path/filepath" + "strings" "testing" "github.com/google/go-containerregistry/pkg/name" "github.com/google/go-containerregistry/pkg/registry" + "github.com/google/go-containerregistry/pkg/v1/mutate" "github.com/google/go-containerregistry/pkg/v1/remote" "github.com/google/go-containerregistry/pkg/v1/validate" "github.com/stretchr/testify/require" "chainguard.dev/apko/internal/cli" + "chainguard.dev/apko/internal/tarfs" "chainguard.dev/apko/pkg/build" "chainguard.dev/apko/pkg/build/types" "chainguard.dev/apko/pkg/sbom" @@ -162,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:316b607c2d30e686d9170edcefa9bc07aae922e4c20c06cc85bd6e4c0ed85f25" + want := "sha256:d5fe88a41005bc378fc42d3066d4762b2c082e528cd2856e27f4e005031bfd35" require.Equal(t, want, digest.String()) im, err := idx.IndexManifest() @@ -176,5 +181,20 @@ require.NoError(t, err) require.Equal(t, 2, len(cm.Layers)) + + tr := mutate.Extract(child) + tmp, err := os.CreateTemp(t.TempDir(), "") + require.NoError(t, err) + size, err := io.Copy(tmp, tr) + require.NoError(t, err) + fsys, err := tarfs.New(tmp, size) + require.NoError(t, err) + + b, err := fs.ReadFile(fsys, "etc/apk/repositories") + require.NoError(t, err) + + if strings.Contains(string(b), "./packages") { + t.Errorf("etc/apk/repositories contains build_repositories entry %q", "./packages") + } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-0.27.2/internal/cli/testdata/layering.yaml new/apko-0.27.3/internal/cli/testdata/layering.yaml --- old/apko-0.27.2/internal/cli/testdata/layering.yaml 2025-05-05 18:56:34.000000000 +0200 +++ new/apko-0.27.3/internal/cli/testdata/layering.yaml 2025-05-07 20:06:32.000000000 +0200 @@ -1,6 +1,8 @@ contents: keyring: - ./testdata/melange.rsa.pub + build_repositories: + - ./packages repositories: - ./testdata/packages packages: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-0.27.2/internal/tarfs/tarfs.go new/apko-0.27.3/internal/tarfs/tarfs.go --- old/apko-0.27.2/internal/tarfs/tarfs.go 1970-01-01 01:00:00.000000000 +0100 +++ new/apko-0.27.3/internal/tarfs/tarfs.go 2025-05-07 20:06:32.000000000 +0200 @@ -0,0 +1,276 @@ +// Copyright 2023 Chainguard, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tarfs + +import ( + "archive/tar" + "bufio" + "cmp" + "errors" + "fmt" + "io" + "io/fs" + "path" + "slices" + "sync" + "time" +) + +var readerPool = sync.Pool{ + New: func() interface{} { + return bufio.NewReaderSize(nil, 1<<20) + }, +} + +func pooledBufioReader(r io.Reader) *bufio.Reader { + br := readerPool.Get().(*bufio.Reader) + br.Reset(r) + return br +} + +type Entry struct { + Header tar.Header + Offset int64 + + dir string + fi fs.FileInfo +} + +func (e Entry) Name() string { + return e.fi.Name() +} + +func (e Entry) Size() int64 { + return e.Header.Size +} + +func (e Entry) Type() fs.FileMode { + return e.fi.Mode() +} + +func (e Entry) Info() (fs.FileInfo, error) { + return e.fi, nil +} + +func (e Entry) IsDir() bool { + return e.fi.IsDir() +} + +type File struct { + fsys *FS + sr *io.SectionReader + Entry *Entry +} + +func (f *File) Stat() (fs.FileInfo, error) { + return f.Entry.fi, nil +} + +func (f *File) Read(p []byte) (int, error) { + return f.sr.Read(p) +} + +func (f *File) Seek(offset int64, whence int) (int64, error) { + return f.sr.Seek(offset, whence) +} + +func (f *File) ReadAt(p []byte, off int64) (int, error) { + return f.sr.ReadAt(p, off) +} + +func (f *File) Close() error { + return nil +} + +type FS struct { + ra io.ReaderAt + files []*Entry + index map[string]int + dirs map[string][]fs.DirEntry +} + +func (fsys *FS) Readlink(name string) (string, error) { + i, ok := fsys.index[name] + if !ok { + return "", fs.ErrNotExist + } + + e := fsys.files[i] + + switch e.Header.Typeflag { + case tar.TypeSymlink, tar.TypeLink: + return e.Header.Linkname, nil + } + + return "", fmt.Errorf("Readlink(%q): file is not a link", name) +} + +const maxHops = 64 + +// open follows symlinks up to [maxHops] times. +func (fsys *FS) open(name string, hops int) (fs.File, error) { + if hops > maxHops { + return nil, fmt.Errorf("Open(%q): chased too many (%d) symlinks", name, maxHops) + } + + i, ok := fsys.index[name] + if !ok { + return nil, fs.ErrNotExist + } + + e := fsys.files[i] + + switch e.Header.Typeflag { + case tar.TypeSymlink, tar.TypeLink: + link := e.Header.Linkname + if path.IsAbs(link) { + return fsys.open(link, hops+1) + } + + return fsys.open(path.Join(e.dir, link), hops+1) + } + + f := &File{ + fsys: fsys, + Entry: e, + } + + f.sr = io.NewSectionReader(fsys.ra, e.Offset, e.Header.Size) + + return f, nil +} + +// Open implements fs.FS. +func (fsys *FS) Open(name string) (fs.File, error) { + return fsys.open(name, 0) +} + +func (fsys *FS) Entries() []*Entry { + return fsys.files +} + +type root struct{} + +func (r root) Name() string { return "." } +func (r root) Size() int64 { return 0 } +func (r root) Mode() fs.FileMode { return fs.ModeDir } +func (r root) ModTime() time.Time { return time.Unix(0, 0) } +func (r root) IsDir() bool { return true } +func (r root) Sys() any { return nil } + +func (fsys *FS) Stat(name string) (fs.FileInfo, error) { + if i, ok := fsys.index[name]; ok { + return fsys.files[i].fi, nil + } + + // fs.WalkDir expects "." to return a root entry to bootstrap the walk. + // If we didn't find it above, synthesize one. + if name == "." { + return root{}, nil + } + + return nil, fs.ErrNotExist +} + +func (fsys *FS) ReadDir(name string) ([]fs.DirEntry, error) { + dirs, ok := fsys.dirs[name] + if !ok { + return []fs.DirEntry{}, nil + } + + return dirs, nil +} + +type countReader struct { + r io.Reader + n int64 +} + +func (cr *countReader) Read(p []byte) (int, error) { + n, err := cr.r.Read(p) + cr.n += int64(n) + return n, err +} + +func New(ra io.ReaderAt, size int64) (*FS, error) { + fsys := &FS{ + ra: ra, + files: []*Entry{}, + index: map[string]int{}, + dirs: map[string][]fs.DirEntry{}, + } + + // Number of entries in a given directory, so we know how large of a slice to allocate. + dirCount := map[string]int{} + + // TODO: Consider caching this across builds. + r := io.NewSectionReader(ra, 0, size) + + br := pooledBufioReader(r) + defer readerPool.Put(br) + + cr := &countReader{br, 0} + tr := tar.NewReader(cr) + for { + hdr, err := tr.Next() + if errors.Is(err, io.EOF) { + break + } + if err != nil { + return nil, err + } + dir := path.Dir(hdr.Name) + fsys.index[hdr.Name] = len(fsys.files) + fsys.files = append(fsys.files, &Entry{ + Header: *hdr, + Offset: cr.n, + dir: dir, + fi: hdr.FileInfo(), + }) + + dirCount[dir]++ + } + + // Pre-generate the results of ReadDir so we don't allocate a ton if fs.WalkDir calls us. + // TODO: Consider doing this lazily in a sync.Once the first time we see a ReadDir. + for dir, count := range dirCount { + fsys.dirs[dir] = make([]fs.DirEntry, 0, count) + } + + for _, f := range fsys.files { + fsys.dirs[f.dir] = append(fsys.dirs[f.dir], f) + } + + for _, files := range fsys.dirs { + slices.SortFunc(files, func(a, b fs.DirEntry) int { + return cmp.Compare(a.Name(), b.Name()) + }) + } + + return fsys, nil +} + +func (fsys *FS) Close() error { + if fsys == nil { + return nil + } + + closer, ok := fsys.ra.(io.Closer) + if !ok { + return nil + } + + return closer.Close() +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-0.27.2/pkg/apk/apk/implementation.go new/apko-0.27.3/pkg/apk/apk/implementation.go --- old/apko-0.27.2/pkg/apk/apk/implementation.go 2025-05-05 18:56:34.000000000 +0200 +++ new/apko-0.27.3/pkg/apk/apk/implementation.go 2025-05-07 20:06:32.000000000 +0200 @@ -51,10 +51,10 @@ "golang.org/x/sys/unix" "gopkg.in/ini.v1" + "chainguard.dev/apko/internal/tarfs" "chainguard.dev/apko/pkg/apk/auth" "chainguard.dev/apko/pkg/apk/expandapk" apkfs "chainguard.dev/apko/pkg/apk/fs" - "chainguard.dev/apko/pkg/apk/internal/tarfs" "chainguard.dev/apko/pkg/paths" "github.com/chainguard-dev/clog" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-0.27.2/pkg/apk/apk/install.go new/apko-0.27.3/pkg/apk/apk/install.go --- old/apko-0.27.2/pkg/apk/apk/install.go 2025-05-05 18:56:34.000000000 +0200 +++ new/apko-0.27.3/pkg/apk/apk/install.go 2025-05-07 20:06:32.000000000 +0200 @@ -29,7 +29,7 @@ "go.opentelemetry.io/otel" - "chainguard.dev/apko/pkg/apk/internal/tarfs" + "chainguard.dev/apko/internal/tarfs" ) // writeOneFile writes one file from the APK given the tar header and tar reader. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-0.27.2/pkg/apk/expandapk/expandapk.go new/apko-0.27.3/pkg/apk/expandapk/expandapk.go --- old/apko-0.27.2/pkg/apk/expandapk/expandapk.go 2025-05-05 18:56:34.000000000 +0200 +++ new/apko-0.27.3/pkg/apk/expandapk/expandapk.go 2025-05-07 20:06:32.000000000 +0200 @@ -22,7 +22,7 @@ "strings" "sync" - "chainguard.dev/apko/pkg/apk/internal/tarfs" + "chainguard.dev/apko/internal/tarfs" "github.com/klauspost/compress/gzip" "go.opentelemetry.io/otel" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-0.27.2/pkg/apk/internal/tarfs/tarfs.go new/apko-0.27.3/pkg/apk/internal/tarfs/tarfs.go --- old/apko-0.27.2/pkg/apk/internal/tarfs/tarfs.go 2025-05-05 18:56:34.000000000 +0200 +++ new/apko-0.27.3/pkg/apk/internal/tarfs/tarfs.go 1970-01-01 01:00:00.000000000 +0100 @@ -1,276 +0,0 @@ -// Copyright 2023 Chainguard, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package tarfs - -import ( - "archive/tar" - "bufio" - "cmp" - "errors" - "fmt" - "io" - "io/fs" - "path" - "slices" - "sync" - "time" -) - -var readerPool = sync.Pool{ - New: func() interface{} { - return bufio.NewReaderSize(nil, 1<<20) - }, -} - -func pooledBufioReader(r io.Reader) *bufio.Reader { - br := readerPool.Get().(*bufio.Reader) - br.Reset(r) - return br -} - -type Entry struct { - Header tar.Header - Offset int64 - - dir string - fi fs.FileInfo -} - -func (e Entry) Name() string { - return e.fi.Name() -} - -func (e Entry) Size() int64 { - return e.Header.Size -} - -func (e Entry) Type() fs.FileMode { - return e.fi.Mode() -} - -func (e Entry) Info() (fs.FileInfo, error) { - return e.fi, nil -} - -func (e Entry) IsDir() bool { - return e.fi.IsDir() -} - -type File struct { - fsys *FS - sr *io.SectionReader - Entry *Entry -} - -func (f *File) Stat() (fs.FileInfo, error) { - return f.Entry.fi, nil -} - -func (f *File) Read(p []byte) (int, error) { - return f.sr.Read(p) -} - -func (f *File) Seek(offset int64, whence int) (int64, error) { - return f.sr.Seek(offset, whence) -} - -func (f *File) ReadAt(p []byte, off int64) (int, error) { - return f.sr.ReadAt(p, off) -} - -func (f *File) Close() error { - return nil -} - -type FS struct { - ra io.ReaderAt - files []*Entry - index map[string]int - dirs map[string][]fs.DirEntry -} - -func (fsys *FS) Readlink(name string) (string, error) { - i, ok := fsys.index[name] - if !ok { - return "", fs.ErrNotExist - } - - e := fsys.files[i] - - switch e.Header.Typeflag { - case tar.TypeSymlink, tar.TypeLink: - return e.Header.Linkname, nil - } - - return "", fmt.Errorf("Readlink(%q): file is not a link", name) -} - -const maxHops = 64 - -// open follows symlinks up to [maxHops] times. -func (fsys *FS) open(name string, hops int) (fs.File, error) { - if hops > maxHops { - return nil, fmt.Errorf("Open(%q): chased too many (%d) symlinks", name, maxHops) - } - - i, ok := fsys.index[name] - if !ok { - return nil, fs.ErrNotExist - } - - e := fsys.files[i] - - switch e.Header.Typeflag { - case tar.TypeSymlink, tar.TypeLink: - link := e.Header.Linkname - if path.IsAbs(link) { - return fsys.open(link, hops+1) - } - - return fsys.open(path.Join(e.dir, link), hops+1) - } - - f := &File{ - fsys: fsys, - Entry: e, - } - - f.sr = io.NewSectionReader(fsys.ra, e.Offset, e.Header.Size) - - return f, nil -} - -// Open implements fs.FS. -func (fsys *FS) Open(name string) (fs.File, error) { - return fsys.open(name, 0) -} - -func (fsys *FS) Entries() []*Entry { - return fsys.files -} - -type root struct{} - -func (r root) Name() string { return "." } -func (r root) Size() int64 { return 0 } -func (r root) Mode() fs.FileMode { return fs.ModeDir } -func (r root) ModTime() time.Time { return time.Unix(0, 0) } -func (r root) IsDir() bool { return true } -func (r root) Sys() any { return nil } - -func (fsys *FS) Stat(name string) (fs.FileInfo, error) { - if i, ok := fsys.index[name]; ok { - return fsys.files[i].fi, nil - } - - // fs.WalkDir expects "." to return a root entry to bootstrap the walk. - // If we didn't find it above, synthesize one. - if name == "." { - return root{}, nil - } - - return nil, fs.ErrNotExist -} - -func (fsys *FS) ReadDir(name string) ([]fs.DirEntry, error) { - dirs, ok := fsys.dirs[name] - if !ok { - return []fs.DirEntry{}, nil - } - - return dirs, nil -} - -type countReader struct { - r io.Reader - n int64 -} - -func (cr *countReader) Read(p []byte) (int, error) { - n, err := cr.r.Read(p) - cr.n += int64(n) - return n, err -} - -func New(ra io.ReaderAt, size int64) (*FS, error) { - fsys := &FS{ - ra: ra, - files: []*Entry{}, - index: map[string]int{}, - dirs: map[string][]fs.DirEntry{}, - } - - // Number of entries in a given directory, so we know how large of a slice to allocate. - dirCount := map[string]int{} - - // TODO: Consider caching this across builds. - r := io.NewSectionReader(ra, 0, size) - - br := pooledBufioReader(r) - defer readerPool.Put(br) - - cr := &countReader{br, 0} - tr := tar.NewReader(cr) - for { - hdr, err := tr.Next() - if errors.Is(err, io.EOF) { - break - } - if err != nil { - return nil, err - } - dir := path.Dir(hdr.Name) - fsys.index[hdr.Name] = len(fsys.files) - fsys.files = append(fsys.files, &Entry{ - Header: *hdr, - Offset: cr.n, - dir: dir, - fi: hdr.FileInfo(), - }) - - dirCount[dir]++ - } - - // Pre-generate the results of ReadDir so we don't allocate a ton if fs.WalkDir calls us. - // TODO: Consider doing this lazily in a sync.Once the first time we see a ReadDir. - for dir, count := range dirCount { - fsys.dirs[dir] = make([]fs.DirEntry, 0, count) - } - - for _, f := range fsys.files { - fsys.dirs[f.dir] = append(fsys.dirs[f.dir], f) - } - - for _, files := range fsys.dirs { - slices.SortFunc(files, func(a, b fs.DirEntry) int { - return cmp.Compare(a.Name(), b.Name()) - }) - } - - return fsys, nil -} - -func (fsys *FS) Close() error { - if fsys == nil { - return nil - } - - closer, ok := fsys.ra.(io.Closer) - if !ok { - return nil - } - - return closer.Close() -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/apko-0.27.2/pkg/build/layers.go new/apko-0.27.3/pkg/build/layers.go --- old/apko-0.27.2/pkg/build/layers.go 2025-05-05 18:56:34.000000000 +0200 +++ new/apko-0.27.3/pkg/build/layers.go 2025-05-07 20:06:32.000000000 +0200 @@ -49,6 +49,18 @@ return nil, fmt.Errorf("building filesystem: %w", err) } + // We don't pass around repositories cleanly between apko and the library + // formerly known as go-apk. Instead, we write stuff to bc.fs directly + // and the library formerly known as go-apk reads from bc.fs to know + // which repositories it can fetch packages from. We need to call this + // to overwrite etc/apk/repositories with _only_ runtime repositories + // and not runtime + build repositories. + // + // TODO: Clean this up when time permits. + if err := bc.postBuildSetApk(ctx); err != nil { + return nil, err + } + // Use our layering strategy to partition packages into a set of Budget groups. groups, err := groupByOriginAndSize(pkgs, bc.ic.Layering.Budget) if err != nil { ++++++ apko.obsinfo ++++++ --- /var/tmp/diff_new_pack.Whdgi8/_old 2025-05-08 18:25:04.072698808 +0200 +++ /var/tmp/diff_new_pack.Whdgi8/_new 2025-05-08 18:25:04.076698975 +0200 @@ -1,5 +1,5 @@ name: apko -version: 0.27.2 -mtime: 1746464194 -commit: e85ed818320f793afaff25b3e1b691f5b966be39 +version: 0.27.3 +mtime: 1746641192 +commit: 69318398424b487291ee519e29fe1c1c29e54288 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/apko/vendor.tar.gz /work/SRC/openSUSE:Factory/.apko.new.30101/vendor.tar.gz differ: char 13, line 1