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-07-10 17:41:08
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/apko (Old)
 and      /work/SRC/openSUSE:Factory/.apko.new.1991 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "apko"

Fri Jul 10 17:41:08 2026 rev:125 rq:1364825 version:1.2.24

Changes:
--------
--- /work/SRC/openSUSE:Factory/apko/apko.changes        2026-07-08 
17:41:50.048545322 +0200
+++ /work/SRC/openSUSE:Factory/.apko.new.1991/apko.changes      2026-07-10 
17:43:49.278359383 +0200
@@ -1,0 +2,6 @@
+Fri Jul 10 05:03:06 UTC 2026 - Johannes Kastl 
<[email protected]>
+
+- Update to version 1.2.24:
+  * lock: embed keyring content in the lock file (#2322)
+
+-------------------------------------------------------------------

Old:
----
  apko-1.2.23.obscpio

New:
----
  apko-1.2.24.obscpio

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

Other differences:
------------------
++++++ apko.spec ++++++
--- /var/tmp/diff_new_pack.hGvXpw/_old  2026-07-10 17:43:55.598575882 +0200
+++ /var/tmp/diff_new_pack.hGvXpw/_new  2026-07-10 17:43:55.606576156 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           apko
-Version:        1.2.23
+Version:        1.2.24
 Release:        0
 Summary:        Build OCI images from APK packages directly without Dockerfile
 License:        Apache-2.0

++++++ _service ++++++
--- /var/tmp/diff_new_pack.hGvXpw/_old  2026-07-10 17:43:55.654577801 +0200
+++ /var/tmp/diff_new_pack.hGvXpw/_new  2026-07-10 17:43:55.666578212 +0200
@@ -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.2.23</param>
+    <param name="revision">refs/tags/v1.2.24</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)</param>
     <param name="changesgenerate">enable</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.hGvXpw/_old  2026-07-10 17:43:55.694579171 +0200
+++ /var/tmp/diff_new_pack.hGvXpw/_new  2026-07-10 17:43:55.698579308 +0200
@@ -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">9d4b52d913063421165620da75b7926bbe211321</param></service></servicedata>
+              <param 
name="changesrevision">f2ad95570365329f3063fc617162455f32c1afda</param></service></servicedata>
 (No newline at EOF)
 

++++++ apko-1.2.23.obscpio -> apko-1.2.24.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apko-1.2.23/internal/cli/lock.go 
new/apko-1.2.24/internal/cli/lock.go
--- old/apko-1.2.23/internal/cli/lock.go        2026-07-07 16:15:27.000000000 
+0200
+++ new/apko-1.2.24/internal/cli/lock.go        2026-07-08 23:06:50.000000000 
+0200
@@ -166,15 +166,24 @@
                },
        }
 
+       explicitClient := &http.Client{}
        for _, keyring := range ic.Contents.Keyring {
+               b, err := loadKeyringBytes(ctx, explicitClient, keyring)
+               if err != nil {
+                       return fmt.Errorf("failed to load keyring %s: %w", 
keyring, err)
+               }
                lock.Contents.Keyrings = append(lock.Contents.Keyrings, 
pkglock.LockKeyring{
-                       Name: stripURLScheme(keyring),
-                       URL:  keyring,
+                       Name:    stripURLScheme(keyring),
+                       URL:     keyring,
+                       Content: string(b),
                })
        }
 
        // Discover and add auto-discovered keys from repositories
-       discoveredKeys := discoverKeysForLock(ctx, ic, archs)
+       discoveredKeys, err := discoverKeysForLock(ctx, ic, archs)
+       if err != nil {
+               return fmt.Errorf("failed to discover keys: %w", err)
+       }
        lock.Contents.Keyrings = append(lock.Contents.Keyrings, 
discoveredKeys...)
 
        // TODO: If the archs can't agree on package versions (e.g., arm builds 
are ahead of x86) then we should fail instead of producing inconsistent locks.
@@ -277,8 +286,19 @@
        )
 }
 
+// loadKeyringBytes returns the raw bytes of a keyring referenced by a URL or
+// a local file path. It is used to embed keyring content into the lock file so
+// downstream consumers don't need to re-fetch a URL that may 404 after key
+// rotation.
+func loadKeyringBytes(ctx context.Context, client *http.Client, keyring 
string) ([]byte, error) {
+       if strings.HasPrefix(keyring, "https://";) || strings.HasPrefix(keyring, 
"http://";) {
+               return apk.FetchKeyBytes(ctx, client, 
auth.DefaultAuthenticators, keyring)
+       }
+       return os.ReadFile(keyring)
+}
+
 // discoverKeysForLock discovers keys from repositories and returns them as 
LockKeyring entries
-func discoverKeysForLock(ctx context.Context, ic *types.ImageConfiguration, 
archs []types.Architecture) []pkglock.LockKeyring {
+func discoverKeysForLock(ctx context.Context, ic *types.ImageConfiguration, 
archs []types.Architecture) ([]pkglock.LockKeyring, error) {
        log := clog.FromContext(ctx)
 
        // Collect all unique repositories
@@ -308,8 +328,7 @@
                        if alpineReleases == nil {
                                releases, err := apk.FetchAlpineReleases(ctx, 
client)
                                if err != nil {
-                                       log.Warnf("Failed to fetch Alpine 
releases: %v", err)
-                                       continue
+                                       return nil, fmt.Errorf("failed to fetch 
alpine releases: %w", err)
                                }
                                alpineReleases = releases
                        }
@@ -329,11 +348,19 @@
                                        continue
                                }
 
-                               // Add discovered key URLs to the map
+                               // Fetch and embed each key's bytes.
                                for _, u := range urls {
+                                       if _, ok := discoveredKeyMap[u]; ok {
+                                               continue
+                                       }
+                                       b, err := apk.FetchKeyBytes(ctx, 
client, nil, u)
+                                       if err != nil {
+                                               return nil, fmt.Errorf("failed 
to fetch alpine key %s: %w", u, err)
+                                       }
                                        discoveredKeyMap[u] = 
pkglock.LockKeyring{
-                                               Name: stripURLScheme(u),
-                                               URL:  u,
+                                               Name:    stripURLScheme(u),
+                                               URL:     u,
+                                               Content: string(b),
                                        }
                                }
                        }
@@ -351,8 +378,9 @@
                        for _, key := range keys {
                                keyURL := repoBase + "/" + key.ID
                                discoveredKeyMap[keyURL] = pkglock.LockKeyring{
-                                       Name: stripURLScheme(keyURL),
-                                       URL:  keyURL,
+                                       Name:    stripURLScheme(keyURL),
+                                       URL:     keyURL,
+                                       Content: string(key.Bytes),
                                }
                        }
                }
@@ -365,5 +393,5 @@
        }
 
        log.Infof("Discovered %d auto-discovered keys", len(discoveredKeys))
-       return discoveredKeys
+       return discoveredKeys, nil
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/apko-1.2.23/internal/cli/testdata/apko-discover.lock.json 
new/apko-1.2.24/internal/cli/testdata/apko-discover.lock.json
--- old/apko-1.2.23/internal/cli/testdata/apko-discover.lock.json       
2026-07-07 16:15:27.000000000 +0200
+++ new/apko-1.2.24/internal/cli/testdata/apko-discover.lock.json       
2026-07-08 23:06:50.000000000 +0200
@@ -8,27 +8,33 @@
     "keyring": [
       {
         "name": "./testdata/melange.rsa.pub",
-        "url": "./testdata/melange.rsa.pub"
+        "url": "./testdata/melange.rsa.pub",
+        "content": "-----BEGIN PUBLIC 
KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuE9aHvpBoe7HNnWxhp2p\nx+HGjbPhzP0CyQYMNMcHjd76UcaPwWNTVqJI8JMT2u72mPsEXpC+J6KqjIggJoOa\nQYg87oYEdthoJZjyDaKzezNZKndzVQkg4RfQPiCPQkm4r9v6So0MCDa4rwRYnqrf\ns3Je9/wi8B/wG1sz7P4wOG23djxpORDsMI9CyZhnAKfNg/uqmF/sxEwOL4FaDZMg\n0oo7Kx3FjtqqKTV8uFbCDsTxV3CR0pm3WJdX9TNfjXLXfp2a6QDYk1JoYl++UUHK\n+7izMXro6xgY7OPT+F48/YNYxS/ciH90DmN7ysJnQ2otZHSqhOkJV4UrYCKBHY55\nXjpDe7+nmwXaqVyAlCS6pDqHeYUUpYTpnv4b9bbst9NtYPRY8W00Oc5Cs3KdHeV6\nLqvHAGwNTZziv91UTpi0hMf27I+MLaXx+jNWm5j40a+ZyswLAQSLI+u3LxfPlHda\nlhpaQw+CoM3ucX9rcnJaBgowXclDAAvRNIj7EJNW5sk+3SbpmKKDkrD7Cl0rMSrd\n1dixDZZPzA8UtwheNTmV+I+0r1kQMcNYcB8iUKsoWIpaur0CBCww02WTHpOMcMGw\n+rVr/wzPP3Iqo1+EVrzVI5kSnZ7VLRtO5VdMLw0PlIK4ShJ+X5OtVtWnJ9jIiLaI\nse0tr8lpqU40eV862X+jKz0CAwEAAQ==\n-----END
 PUBLIC KEY-----\n"
       },
       {
         "name": 
"alpinelinux.org/keys/alpine-devel%40lists.alpinelinux.org-6165ee59.rsa.pub",
-        "url": 
"https://alpinelinux.org/keys/alpine-devel%40lists.alpinelinux.org-6165ee59.rsa.pub";
+        "url": 
"https://alpinelinux.org/keys/alpine-devel%40lists.alpinelinux.org-6165ee59.rsa.pub";,
+        "content": "-----BEGIN PUBLIC 
KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAutQkua2CAig4VFSJ7v54\nALyu/J1WB3oni7qwCZD3veURw7HxpNAj9hR+S5N/pNeZgubQvJWyaPuQDm7PTs1+\ntFGiYNfAsiibX6Rv0wci3M+z2XEVAeR9Vzg6v4qoofDyoTbovn2LztaNEjTkB+oK\ntlvpNhg1zhou0jDVYFniEXvzjckxswHVb8cT0OMTKHALyLPrPOJzVtM9C1ew2Nnc\n3848xLiApMu3NBk0JqfcS3Bo5Y2b1FRVBvdt+2gFoKZix1MnZdAEZ8xQzL/a0YS5\nHd0wj5+EEKHfOd3A75uPa/WQmA+o0cBFfrzm69QDcSJSwGpzWrD1ScH3AK8nWvoj\nv7e9gukK/9yl1b4fQQ00vttwJPSgm9EnfPHLAtgXkRloI27H6/PuLoNvSAMQwuCD\nhQRlyGLPBETKkHeodfLoULjhDi1K2gKJTMhtbnUcAA7nEphkMhPWkBpgFdrH+5z4\nLxy+3ek0cqcI7K68EtrffU8jtUj9LFTUC8dERaIBs7NgQ/LfDbDfGh9g6qVj1hZl\nk9aaIPTm/xsi8v3u+0qaq7KzIBc9s59JOoA8TlpOaYdVgSQhHHLBaahOuAigH+VI\nisbC9vmqsThF2QdDtQt37keuqoda2E6sL7PUvIyVXDRfwX7uMDjlzTxHTymvq2Ck\nhtBqojBnThmjJQFgZXocHG8CAwEAAQ==\n-----END
 PUBLIC KEY-----\n"
       },
       {
         "name": 
"alpinelinux.org/keys/alpine-devel%40lists.alpinelinux.org-616ae350.rsa.pub",
-        "url": 
"https://alpinelinux.org/keys/alpine-devel%40lists.alpinelinux.org-616ae350.rsa.pub";
+        "url": 
"https://alpinelinux.org/keys/alpine-devel%40lists.alpinelinux.org-616ae350.rsa.pub";,
+        "content": "-----BEGIN PUBLIC 
KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyduVzi1mWm+lYo2Tqt/0\nXkCIWrDNP1QBMVPrE0/ZlU2bCGSoo2Z9FHQKz/mTyMRlhNqTfhJ5qU3U9XlyGOPJ\npiM+b91g26pnpXJ2Q2kOypSgOMOPA4cQ42PkHBEqhuzssfj9t7x47ppS94bboh46\nxLSDRff/NAbtwTpvhStV3URYkxFG++cKGGa5MPXBrxIp+iZf9GnuxVdST5PGiVGP\nODL/b69sPJQNbJHVquqUTOh5Ry8uuD2WZuXfKf7/C0jC/ie9m2+0CttNu9tMciGM\nEyKG1/Xhk5iIWO43m4SrrT2WkFlcZ1z2JSf9Pjm4C2+HovYpihwwdM/OdP8Xmsnr\nDzVB4YvQiW+IHBjStHVuyiZWc+JsgEPJzisNY0Wyc/kNyNtqVKpX6dRhMLanLmy+\nf53cCSI05KPQAcGj6tdL+D60uKDkt+FsDa0BTAobZ31OsFVid0vCXtsbplNhW1IF\nHwsGXBTVcfXg44RLyL8Lk/2dQxDHNHzAUslJXzPxaHBLmt++2COa2EI1iWlvtznk\nOk9WP8SOAIj+xdqoiHcC4j72BOVVgiITIJNHrbppZCq6qPR+fgXmXa+sDcGh30m6\n9Wpbr28kLMSHiENCWTdsFij+NQTd5S47H7XTROHnalYDuF1RpS+DpQidT5tUimaT\nJZDr++FjKrnnijbyNF8b98UCAwEAAQ==\n-----END
 PUBLIC KEY-----\n"
       },
       {
         "name": 
"apk.cgr.dev/chainguard/chainguard-4be246965c6e2749ccbaeba0582ed0f90c7cb94f4c0397e014b322b8652e3ba4.rsa.pub",
-        "url": 
"https://apk.cgr.dev/chainguard/chainguard-4be246965c6e2749ccbaeba0582ed0f90c7cb94f4c0397e014b322b8652e3ba4.rsa.pub";
+        "url": 
"https://apk.cgr.dev/chainguard/chainguard-4be246965c6e2749ccbaeba0582ed0f90c7cb94f4c0397e014b322b8652e3ba4.rsa.pub";,
+        "content": "-----BEGIN PUBLIC 
KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvasoSqEq9IKa4E+vcx7H\nijkwVuKbgG9vjds2+IJaQQoL/5EucLtYQ2dKSiizAnQmdb4EZIcj/M9DHFu8YlCW\nnTzrPinyj+pq8pRrAO3zj8GqZ5IjhC/pv2YdbwjRJHTijiT8miYiZflc2JyEuZb7\newuhEaB/VLcwaS8BIKG+QTjj7QDllhhqyiaeFJxs5ljSNl4EA6m+uSUCir7F+Jb5\nlM9n5b4SGB04p1w36a3eZMIT98jUqvWadxnGt+AeNDad3wT42d95xf4U303q+uwp\nwGqyIvltDR2OMfVqU5tvW7s3PytHuP25N+vUxjquwTj8GqQbaa/w5wl7+Mu8yZhT\nvlFVytrHTZSFqpPVbVgzprpb+HAu4tHohI9Z5G1NzKpKb4HmJe3QSOK1i7dPk8RU\nR2z2hPNfJ1fVn7rT6L3iyShqPxNLst9MT44StzEtrO6vL7mc4Fs0QD/nJJ/30Nyn\nTNsKywONj39cEnIyq6Df/RAfFWL1HbWNDl8w2xe2eqI3VSFGFIjoqNCUvy43jrZc\nzE/K7gqY3eKX6jNfKu1kCHU6YqXCf6S7p7PhcNYX+BaXT5rEuU2e0SDR1gT1gI8K\nNXELTNI4opfQ9JR7KhAwIOyQbUu/q22SDSNbrXp+9h85SGd7gfhqgzR9ivN03k4X\n7H5Er4P2M9cqgT66vN//8rECAwEAAQ==\n-----END
 PUBLIC KEY-----\n"
       },
       {
         "name": 
"apk.cgr.dev/chainguard/chainguard-7fb528a64a862d44bbea6069093f1fec29fa864ba7e9754828eeceed3f487239.rsa.pub",
-        "url": 
"https://apk.cgr.dev/chainguard/chainguard-7fb528a64a862d44bbea6069093f1fec29fa864ba7e9754828eeceed3f487239.rsa.pub";
+        "url": 
"https://apk.cgr.dev/chainguard/chainguard-7fb528a64a862d44bbea6069093f1fec29fa864ba7e9754828eeceed3f487239.rsa.pub";,
+        "content": "-----BEGIN PUBLIC 
KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnuH20LnWxNl54a7mjSb5\nPmJssMelKeFQUDfzWZSTwCfFpBHRFq4KLWcUByqtmKphXLRMLjy0xR4xux7oh8n2\nCLP1NBt6d5skqaqHNFW24BO0ThrXUbwZ6jCAI0s2xSBaEPMea4Ipn2hmqZLwox6C\nqLGbEsbtRrkKXHva4jqFCX8h8ThwdQuKCEfr/nSk5IV+fn1Uoo8WK89cMUxlj1NB\nB5rdeJCcVaNlZTt2/Zw917BY+tjodWovbIGtqvnflOa5R28R+Q6bBh9oCDvkR6IU\n38NyT7szld5QgD9ebl5sNOFwk4mJdCNdi1wK9kSrBM7D8YEsStmawezpfvhwV55S\nQJpjuo6zJab25RAzcZoj+YhpBSl91QNRaKK3x5RlqW93tBCtpDjfpNqEHgyzHjc1\n4N46SQBU1NamkYBStTwMluc56lwmmWdKfnZXU0vULxQjCyBBeNSpsz8joyO60htD\nG52ieJ+NIqCEX7ikabWGCUfvAtEXDDDmo17JTyNSarziEfBImEtTOt8P93V6nRr7\nDz1fWKQC1pv9eFn1aS2TK50hWEgKpB+lmTf/j8UGawAWHQFND1ndDqNaJnVP/DqR\n6dt7krjlrDVEGq4s3GJabYADKxh0vXt1J4gef07dfEtEa6Aj9hikVyv3bQMeqtMK\nk/o1spotQWzE9+rffQfaUl8CAwEAAQ==\n-----END
 PUBLIC KEY-----\n"
       },
       {
         "name": 
"apk.cgr.dev/chainguard/chainguard-e3fb44d055702ed0dddf0f2acb1a0a07fc6075967092b203c7aac7db801d65f4.rsa.pub",
-        "url": 
"https://apk.cgr.dev/chainguard/chainguard-e3fb44d055702ed0dddf0f2acb1a0a07fc6075967092b203c7aac7db801d65f4.rsa.pub";
+        "url": 
"https://apk.cgr.dev/chainguard/chainguard-e3fb44d055702ed0dddf0f2acb1a0a07fc6075967092b203c7aac7db801d65f4.rsa.pub";,
+        "content": "-----BEGIN PUBLIC 
KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAs+GdB46rERN+mqR3jdGH\nAhrLuu4xxzcyIHQFDXXhFY4Cvzox2AI1/1Kv1UCZetce0w9QMgq35qGEWe61dykC\nLoShLZ1Wgr4OGbZW1J73UGdmYzYOWWJMeXSQ3cFSAFLS23ox72HEZQG7QwDApkjl\nIp9cjt4xpSu/A+25b7t8ZtJAdZgKd+yY8MLnOqxIOqgO2kHUTR+1F8QGBAQUC7AW\nu+1UkcsJbYz3wT61ybuYREGXadEUmJmef5cfCQ66eZ2q0tioSVSWiK9SQGKZwl3w\nb7XInD6UJGQxoj/f2NFzvS9gxG7Dzql4mx9boPHNbEU9X8sdVtoCBIA52Lv9dCLO\nQCVPvm9e+/l5WXlYvoEsAcRdTGlexOQkdAs0R2RjH/teqnU2D7WgjLmtor2Nk52R\nASzESzCyXiSfDH7yBpSuKPNpI4TXXnKnxgAawlz9V7TLLP54qwPpgJ8pxGHz5GaN\n5tikOt95O3If4MMoRbfjbNH0VQ0bAnMeQlE+qbWbLlLWlK3yQq9tbmApG4vVvdpc\nWKe0NPuoxnUkw1n7JQs70RxsJf3SJoC59Fio1mkl3QIsTMl+75IPfwBy3tmdYKQS\nbV5Cb0nnjuB9esVVnEmXUuAS27TQlQJcu2kpV/Uccwv0+4Df3F61MWlTLvjfkXZm\n6uEiubGXOuhXv+QtsNwYGlECAwEAAQ==\n-----END
 PUBLIC KEY-----\n"
       }
     ],
     "build_repositories": [],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apko-1.2.23/internal/cli/testdata/apko.lock.json 
new/apko-1.2.24/internal/cli/testdata/apko.lock.json
--- old/apko-1.2.23/internal/cli/testdata/apko.lock.json        2026-07-07 
16:15:27.000000000 +0200
+++ new/apko-1.2.24/internal/cli/testdata/apko.lock.json        2026-07-08 
23:06:50.000000000 +0200
@@ -8,7 +8,8 @@
     "keyring": [
       {
         "name": "./testdata/melange.rsa.pub",
-        "url": "./testdata/melange.rsa.pub"
+        "url": "./testdata/melange.rsa.pub",
+        "content": "-----BEGIN PUBLIC 
KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuE9aHvpBoe7HNnWxhp2p\nx+HGjbPhzP0CyQYMNMcHjd76UcaPwWNTVqJI8JMT2u72mPsEXpC+J6KqjIggJoOa\nQYg87oYEdthoJZjyDaKzezNZKndzVQkg4RfQPiCPQkm4r9v6So0MCDa4rwRYnqrf\ns3Je9/wi8B/wG1sz7P4wOG23djxpORDsMI9CyZhnAKfNg/uqmF/sxEwOL4FaDZMg\n0oo7Kx3FjtqqKTV8uFbCDsTxV3CR0pm3WJdX9TNfjXLXfp2a6QDYk1JoYl++UUHK\n+7izMXro6xgY7OPT+F48/YNYxS/ciH90DmN7ysJnQ2otZHSqhOkJV4UrYCKBHY55\nXjpDe7+nmwXaqVyAlCS6pDqHeYUUpYTpnv4b9bbst9NtYPRY8W00Oc5Cs3KdHeV6\nLqvHAGwNTZziv91UTpi0hMf27I+MLaXx+jNWm5j40a+ZyswLAQSLI+u3LxfPlHda\nlhpaQw+CoM3ucX9rcnJaBgowXclDAAvRNIj7EJNW5sk+3SbpmKKDkrD7Cl0rMSrd\n1dixDZZPzA8UtwheNTmV+I+0r1kQMcNYcB8iUKsoWIpaur0CBCww02WTHpOMcMGw\n+rVr/wzPP3Iqo1+EVrzVI5kSnZ7VLRtO5VdMLw0PlIK4ShJ+X5OtVtWnJ9jIiLaI\nse0tr8lpqU40eV862X+jKz0CAwEAAQ==\n-----END
 PUBLIC KEY-----\n"
       }
     ],
     "build_repositories": [],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/apko-1.2.23/internal/cli/testdata/image_on_top.apko.lock.json 
new/apko-1.2.24/internal/cli/testdata/image_on_top.apko.lock.json
--- old/apko-1.2.23/internal/cli/testdata/image_on_top.apko.lock.json   
2026-07-07 16:15:27.000000000 +0200
+++ new/apko-1.2.24/internal/cli/testdata/image_on_top.apko.lock.json   
2026-07-08 23:06:50.000000000 +0200
@@ -8,7 +8,8 @@
     "keyring": [
       {
         "name": "./testdata/melange.rsa.pub",
-        "url": "./testdata/melange.rsa.pub"
+        "url": "./testdata/melange.rsa.pub",
+        "content": "-----BEGIN PUBLIC 
KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuE9aHvpBoe7HNnWxhp2p\nx+HGjbPhzP0CyQYMNMcHjd76UcaPwWNTVqJI8JMT2u72mPsEXpC+J6KqjIggJoOa\nQYg87oYEdthoJZjyDaKzezNZKndzVQkg4RfQPiCPQkm4r9v6So0MCDa4rwRYnqrf\ns3Je9/wi8B/wG1sz7P4wOG23djxpORDsMI9CyZhnAKfNg/uqmF/sxEwOL4FaDZMg\n0oo7Kx3FjtqqKTV8uFbCDsTxV3CR0pm3WJdX9TNfjXLXfp2a6QDYk1JoYl++UUHK\n+7izMXro6xgY7OPT+F48/YNYxS/ciH90DmN7ysJnQ2otZHSqhOkJV4UrYCKBHY55\nXjpDe7+nmwXaqVyAlCS6pDqHeYUUpYTpnv4b9bbst9NtYPRY8W00Oc5Cs3KdHeV6\nLqvHAGwNTZziv91UTpi0hMf27I+MLaXx+jNWm5j40a+ZyswLAQSLI+u3LxfPlHda\nlhpaQw+CoM3ucX9rcnJaBgowXclDAAvRNIj7EJNW5sk+3SbpmKKDkrD7Cl0rMSrd\n1dixDZZPzA8UtwheNTmV+I+0r1kQMcNYcB8iUKsoWIpaur0CBCww02WTHpOMcMGw\n+rVr/wzPP3Iqo1+EVrzVI5kSnZ7VLRtO5VdMLw0PlIK4ShJ+X5OtVtWnJ9jIiLaI\nse0tr8lpqU40eV862X+jKz0CAwEAAQ==\n-----END
 PUBLIC KEY-----\n"
       }
     ],
     "build_repositories": [],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apko-1.2.23/pkg/apk/apk/implementation.go 
new/apko-1.2.24/pkg/apk/apk/implementation.go
--- old/apko-1.2.23/pkg/apk/apk/implementation.go       2026-07-07 
16:15:27.000000000 +0200
+++ new/apko-1.2.24/pkg/apk/apk/implementation.go       2026-07-08 
23:06:50.000000000 +0200
@@ -983,6 +983,36 @@
        Bytes []byte
 }
 
+// FetchKeyBytes downloads a keyring from the given URL and returns its raw 
bytes.
+// It applies the provided authenticator (which may be nil for anonymous 
fetches).
+func FetchKeyBytes(ctx context.Context, client *http.Client, a 
auth.Authenticator, keyURL string) ([]byte, error) {
+       ctx, span := otel.Tracer("go-apk").Start(ctx, "FetchKeyBytes")
+       defer span.End()
+
+       req, err := http.NewRequestWithContext(ctx, http.MethodGet, keyURL, nil)
+       if err != nil {
+               return nil, err
+       }
+       if a != nil {
+               if err := a.AddAuth(ctx, req); err != nil {
+                       return nil, err
+               }
+       }
+       res, err := client.Do(req)
+       if err != nil {
+               return nil, fmt.Errorf("failed to fetch key %s: %w", keyURL, 
err)
+       }
+       defer res.Body.Close()
+       if res.StatusCode != http.StatusOK {
+               return nil, fmt.Errorf("failed to fetch key %s: %s", keyURL, 
res.Status)
+       }
+       b, err := io.ReadAll(res.Body)
+       if err != nil {
+               return nil, fmt.Errorf("failed to read key %s: %w", keyURL, err)
+       }
+       return b, nil
+}
+
 // DiscoverKeys fetches the public keys for the repositories in the APK 
database using chainguard-style discovery.
 func DiscoverKeys(ctx context.Context, client *http.Client, auth 
auth.Authenticator, repository string) ([]Key, error) {
        ctx, span := otel.Tracer("go-apk").Start(ctx, "DiscoverKeys")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/apko-1.2.23/pkg/lock/lock.go 
new/apko-1.2.24/pkg/lock/lock.go
--- old/apko-1.2.23/pkg/lock/lock.go    2026-07-07 16:15:27.000000000 +0200
+++ new/apko-1.2.24/pkg/lock/lock.go    2026-07-08 23:06:50.000000000 +0200
@@ -59,6 +59,8 @@
 type LockKeyring struct {
        Name string `json:"name"`
        URL  string `json:"url"`
+       // Content is the raw keyring content (typically a PEM-encoded public 
key).
+       Content string `json:"content,omitempty"`
 }
 
 func FromFile(lockFile string) (Lock, error) {

++++++ apko.obsinfo ++++++
--- /var/tmp/diff_new_pack.hGvXpw/_old  2026-07-10 17:43:56.662612331 +0200
+++ /var/tmp/diff_new_pack.hGvXpw/_new  2026-07-10 17:43:56.678612879 +0200
@@ -1,5 +1,5 @@
 name: apko
-version: 1.2.23
-mtime: 1783433727
-commit: 9d4b52d913063421165620da75b7926bbe211321
+version: 1.2.24
+mtime: 1783544810
+commit: f2ad95570365329f3063fc617162455f32c1afda
 

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

Reply via email to