Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package melange for openSUSE:Factory checked 
in at 2025-12-11 18:40:15
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/melange (Old)
 and      /work/SRC/openSUSE:Factory/.melange.new.1939 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "melange"

Thu Dec 11 18:40:15 2025 rev:126 rq:1322138 version:0.36.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/melange/melange.changes  2025-12-09 
12:54:50.627258588 +0100
+++ /work/SRC/openSUSE:Factory/.melange.new.1939/melange.changes        
2025-12-11 18:43:06.045908445 +0100
@@ -1,0 +2,15 @@
+Thu Dec 11 07:52:11 UTC 2025 - Johannes Kastl 
<[email protected]>
+
+- Update to version 0.36.0:
+  * fix(bump & cache): Do not fail when main pipeline is not
+    present (#2263)
+  * build(deps): bump golang.org/x/sys from 0.38.0 to 0.39.0
+    (#2261)
+  * build(deps): bump the actions group with 3 updates (#2262)
+  * build(deps): bump golang.org/x/sync from 0.18.0 to 0.19.0
+    (#2260)
+  * build(deps): bump the gomod group with 3 updates (#2259)
+  * feat: add test resource configuration and CLI flags (#2244)
+  * git-checkout: Invoke `git fetch` with `--unshallow` (#2258)
+
+-------------------------------------------------------------------

Old:
----
  melange-0.35.1.obscpio

New:
----
  melange-0.36.0.obscpio

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

Other differences:
------------------
++++++ melange.spec ++++++
--- /var/tmp/diff_new_pack.kTxQi1/_old  2025-12-11 18:43:06.993948277 +0100
+++ /var/tmp/diff_new_pack.kTxQi1/_new  2025-12-11 18:43:06.993948277 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           melange
-Version:        0.35.1
+Version:        0.36.0
 Release:        0
 Summary:        Build APKs from source code
 License:        Apache-2.0

++++++ _service ++++++
--- /var/tmp/diff_new_pack.kTxQi1/_old  2025-12-11 18:43:07.041950294 +0100
+++ /var/tmp/diff_new_pack.kTxQi1/_new  2025-12-11 18:43:07.049950631 +0100
@@ -3,7 +3,7 @@
     <param name="url">https://github.com/chainguard-dev/melange</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="revision">v0.35.1</param>
+    <param name="revision">v0.36.0</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)</param>
     <param name="changesgenerate">enable</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.kTxQi1/_old  2025-12-11 18:43:07.077951807 +0100
+++ /var/tmp/diff_new_pack.kTxQi1/_new  2025-12-11 18:43:07.085952143 +0100
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://github.com/chainguard-dev/melange</param>
-              <param 
name="changesrevision">f28e457f74f15f5af9f9f1370e34943567633255</param></service></servicedata>
+              <param 
name="changesrevision">c32e57daa58da05d589ec801b6c5c4c3086a83f9</param></service></servicedata>
 (No newline at EOF)
 

++++++ melange-0.35.1.obscpio -> melange-0.36.0.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/docs/BUILD-FILE.md 
new/melange-0.36.0/docs/BUILD-FILE.md
--- old/melange-0.35.1/docs/BUILD-FILE.md       2025-12-05 21:15:25.000000000 
+0100
+++ new/melange-0.36.0/docs/BUILD-FILE.md       2025-12-09 09:15:58.000000000 
+0100
@@ -261,6 +261,104 @@
 TODO(vaikas): What does it mean to monitor, when new files are added/removed to
 those directories? Something else??
 
+### timeout
+Optional timeout duration for the build. Specifies the maximum amount of time 
the build is allowed to take before timing out. The value is specified in 
seconds as an integer.
+
+```yaml
+package:
+  timeout: 3600  # 1 hour in seconds
+```
+
+### resources
+Optional resource specifications for the build. Used by external schedulers 
(like elastic build) to provision appropriately-sized build pods/VMs. For local 
builds with the QEMU runner, these can be used as resource limits via CLI flags.
+
+**Resource Fields:**
+
+- `cpu`: CPU resource count as a quoted string (e.g., `"4"`, `"8"`, `"16"`)
+- `cpumodel`: Specific CPU model requirements (e.g., `"intel-xeon"`, 
`"amd-epyc"`)
+- `memory`: Memory size in Kubernetes format (e.g., `"8Gi"`, `"16Gi"`, 
`"128Mi"`)
+- `disk`: Disk space in Kubernetes format (e.g., `"50Gi"`, `"100Gi"`, `"1Ti"`)
+
+**Value Formats:**
+- CPU values are typically whole numbers as strings: `"1"`, `"2"`, `"4"`, 
`"8"`, etc.
+- Memory and disk use Kubernetes resource quantities: `Mi` (mebibytes), `Gi` 
(gibibytes), `Ti` (tebibytes)
+- All fields are optional and interpretation depends on the scheduler/runner
+
+**How resources are interpreted:**
+- **External schedulers**: Use these values to provision build pods/VMs
+- **QEMU runner** (via CLI flags like `--cpu`, `--memory`): Treats values as 
**maximum limits**
+  - CPU: Defaults to all available cores, capped at the specified value if 
lower
+  - Memory: Defaults to 85% of available memory, capped at the specified value 
if lower
+- **Docker/Bubblewrap runners**: Resource fields are not enforced
+
+```yaml
+package:
+  resources:
+    cpu: "8"
+    memory: "16Gi"
+    disk: "100Gi"
+```
+
+### test-resources
+Optional resource specifications for test execution. Used by external 
schedulers to provision test pods/VMs with different resource constraints than 
the build phase.
+
+**When to use test-resources:**
+- Tests require significantly different resources than builds
+- Integration tests need more CPU/memory than unit tests
+- Tests can run with fewer resources to optimize costs
+- External schedulers need separate test and build resource specifications
+
+**How test-resources are interpreted:**
+
+The `test-resources` field is primarily **informational** for external 
schedulers:
+
+**For external schedulers** (reading the YAML):
+- Use `test-resources` if specified, otherwise fall back to `resources`
+- This determines test pod/VM sizing
+
+**For local testing with `melange test`:**
+- The `test-resources` field in the YAML is **NOT automatically used** by 
melange
+- Resources must be explicitly specified via CLI flags: `--cpu`, `--memory`, 
`--disk`, `--cpumodel`, `--timeout`
+- Resource enforcement depends on the runner (same as `resources` field):
+  - **QEMU runner**: Enforces CPU and memory as **maximum limits** (caps at 
specified value)
+  - **Docker/Bubblewrap runners**: Do not enforce resource limits
+
+**Resource fields** are identical to `resources` (see above for formats and 
interpretation).
+
+Example where tests need less resources than build:
+```yaml
+package:
+  resources:
+    cpu: "8"
+    memory: "16Gi"
+    disk: "100Gi"
+  test-resources:
+    cpu: "4"
+    memory: "8Gi"
+    disk: "50Gi"
+```
+
+Example where tests need more resources than build:
+```yaml
+package:
+  resources:
+    cpu: "2"
+    memory: "4Gi"
+  test-resources:
+    cpu: "32"
+    memory: "128Gi"
+    disk: "500Gi"
+```
+
+Example with only test-resources specified:
+```yaml
+package:
+  test-resources:
+    cpu: "4"
+    memory: "8Gi"
+  # No build resources specified - scheduler uses defaults
+```
+
 # environment
 Environment defines the build environment, including what the dependencies are,
 including repositories, packages, etc.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/docs/md/melange_test.md 
new/melange-0.36.0/docs/md/melange_test.md
--- old/melange-0.35.1/docs/md/melange_test.md  2025-12-05 21:15:25.000000000 
+0100
+++ new/melange-0.36.0/docs/md/melange_test.md  2025-12-09 09:15:58.000000000 
+0100
@@ -32,13 +32,17 @@
       --arch strings                  architectures to build for (e.g., 
x86_64,ppc64le,arm64) -- default is all, unless specified in config
       --cache-dir string              directory used for cached inputs
       --cache-source string           directory or bucket used for preloading 
the cache
+      --cpu string                    default CPU resources to use for tests
+      --cpumodel string               default CPU model to use for tests
       --debug                         enables debug logging of test pipelines 
(sets -x for steps)
       --debug-runner                  when enabled, the builder pod will 
persist after the build succeeds or fails
+      --disk string                   disk size to use for tests
       --env-file string               file to use for preloaded environment 
variables
   -h, --help                          help for test
       --ignore-signatures             ignore repository signature verification
   -i, --interactive                   when enabled, attaches stdin with a tty 
to the pod on failure
   -k, --keyring-append strings        path to extra keys to include in the 
build environment keyring
+      --memory string                 default memory resources to use for tests
       --pipeline-dirs strings         directories used to extend defined 
built-in pipelines
   -r, --repository-append strings     path to extra repositories to include in 
the build environment
       --rm                            clean up intermediate artifacts (e.g. 
container images, temp dirs) (default true)
@@ -46,6 +50,7 @@
       --source-dir string             directory used for included sources
       --test-option strings           build options to enable
       --test-package-append strings   extra packages to install for each of 
the test environments
+      --timeout duration              default timeout for tests
       --workspace-dir string          directory used for the workspace at 
/home/build
 ```
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/examples/test-resources-example1.yaml 
new/melange-0.36.0/examples/test-resources-example1.yaml
--- old/melange-0.35.1/examples/test-resources-example1.yaml    1970-01-01 
01:00:00.000000000 +0100
+++ new/melange-0.36.0/examples/test-resources-example1.yaml    2025-12-09 
09:15:58.000000000 +0100
@@ -0,0 +1,67 @@
+package:
+  name: gcc-13
+  version: 13.2.0
+  epoch: 0
+  description: GNU Compiler Collection - requires significant resources to 
build
+  # Build resources - compilation is resource-intensive
+  resources:
+    cpu: "8"
+    memory: "16Gi"
+    disk: "100Gi"
+  # Test resources - unit tests need less
+  test-resources:
+    cpu: "4"
+    memory: "8Gi"
+    disk: "50Gi"
+environment:
+  contents:
+    repositories:
+      - https://packages.wolfi.dev/os
+    keyring:
+      - https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
+    packages:
+      - build-base
+      - busybox
+      - gmp-dev
+      - mpfr-dev
+      - mpc-dev
+pipeline:
+  - uses: fetch
+    with:
+      uri: 
https://ftp.gnu.org/gnu/gcc/gcc-${{package.version}}/gcc-${{package.version}}.tar.xz
+      expected-sha256: 
e275e76442a6067341a27f04c5c6b83d8613144004c0413528863dc6b5c743da
+  - runs: |
+      ./configure \
+        --prefix=/usr \
+        --enable-languages=c,c++,fortran \
+        --disable-multilib
+      make -j$(nproc)
+      make install DESTDIR="${{targets.destdir}}"
+test:
+  environment:
+    contents:
+      packages:
+        - build-base
+  pipeline:
+    - name: Test C compilation
+      runs: |
+        cat > hello.c << 'EOF'
+        #include <stdio.h>
+        int main() {
+            printf("Hello, World!\n");
+            return 0;
+        }
+        EOF
+        gcc hello.c -o hello
+        ./hello | grep "Hello, World"
+    - name: Test C++ compilation
+      runs: |
+        cat > hello.cpp << 'EOF'
+        #include <iostream>
+        int main() {
+            std::cout << "Hello, C++!" << std::endl;
+            return 0;
+        }
+        EOF
+        g++ hello.cpp -o hello-cpp
+        ./hello-cpp | grep "Hello, C++"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/examples/test-resources-example2.yaml 
new/melange-0.36.0/examples/test-resources-example2.yaml
--- old/melange-0.35.1/examples/test-resources-example2.yaml    1970-01-01 
01:00:00.000000000 +0100
+++ new/melange-0.36.0/examples/test-resources-example2.yaml    2025-12-09 
09:15:58.000000000 +0100
@@ -0,0 +1,97 @@
+package:
+  name: tensorflow-lite
+  version: 2.14.0
+  epoch: 0
+  description: TensorFlow Lite - tests require more resources than build
+  # Build is straightforward
+  resources:
+    cpu: "4"
+    memory: "8Gi"
+  # Integration tests with models need significant resources
+  test-resources:
+    cpu: "32"
+    memory: "128Gi"
+    disk: "500Gi"
+environment:
+  contents:
+    repositories:
+      - https://packages.wolfi.dev/os
+    keyring:
+      - https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
+    packages:
+      - build-base
+      - busybox
+      - cmake
+      - python-3
+pipeline:
+  - uses: fetch
+    with:
+      uri: 
https://github.com/tensorflow/tensorflow/archive/v${{package.version}}.tar.gz
+      expected-sha256: 
abcd1234567890abcdef1234567890abcdef1234567890abcdef1234567890ab
+  - runs: |
+      cd tensorflow/lite
+      cmake -B build \
+        -DCMAKE_INSTALL_PREFIX=/usr \
+        -DCMAKE_BUILD_TYPE=Release
+      cmake --build build -j$(nproc)
+      cmake --install build --prefix "${{targets.destdir}}/usr"
+test:
+  environment:
+    contents:
+      packages:
+        - python-3
+        - py3-numpy
+        - wget
+  pipeline:
+    - name: Download test models
+      runs: |
+        mkdir -p models
+        wget -O models/mobilenet_v1.tflite \
+          
https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_1.0_224_quant.tflite
+    - name: Run inference benchmark
+      runs: |
+        python3 << 'EOF'
+        import tensorflow as tf
+        import numpy as np
+        import time
+
+        # Load model
+        interpreter = 
tf.lite.Interpreter(model_path="models/mobilenet_v1.tflite")
+        interpreter.allocate_tensors()
+
+        # Get input/output details
+        input_details = interpreter.get_input_details()
+        output_details = interpreter.get_output_details()
+
+        # Run benchmark with multiple iterations
+        iterations = 1000
+        input_data = 
np.random.random_sample(input_details[0]['shape']).astype(np.float32)
+
+        start = time.time()
+        for i in range(iterations):
+            interpreter.set_tensor(input_details[0]['index'], input_data)
+            interpreter.invoke()
+            output_data = interpreter.get_tensor(output_details[0]['index'])
+
+        elapsed = time.time() - start
+        print(f"Completed {iterations} iterations in {elapsed:.2f}s")
+        print(f"Average inference time: {elapsed/iterations*1000:.2f}ms")
+        EOF
+    - name: Run stress test
+      runs: |
+        # Simulate heavy load testing with multiple parallel inferences
+        for i in {1..32}; do
+          python3 -c "
+        import tensorflow as tf
+        import numpy as np
+        interpreter = 
tf.lite.Interpreter(model_path='models/mobilenet_v1.tflite')
+        interpreter.allocate_tensors()
+        input_details = interpreter.get_input_details()
+        for _ in range(100):
+            interpreter.set_tensor(input_details[0]['index'],
+                                 
np.random.random_sample(input_details[0]['shape']).astype(np.float32))
+            interpreter.invoke()
+        " &
+        done
+        wait
+        echo "Stress test completed"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/examples/test-resources-example3.yaml 
new/melange-0.36.0/examples/test-resources-example3.yaml
--- old/melange-0.35.1/examples/test-resources-example3.yaml    1970-01-01 
01:00:00.000000000 +0100
+++ new/melange-0.36.0/examples/test-resources-example3.yaml    2025-12-09 
09:15:58.000000000 +0100
@@ -0,0 +1,74 @@
+package:
+  name: nginx-module-geoip
+  version: 1.24.0
+  epoch: 0
+  description: NGINX GeoIP module - simple build, needs resources for 
integration tests
+  # Only test resources specified
+  test-resources:
+    cpu: "4"
+    memory: "8Gi"
+environment:
+  contents:
+    repositories:
+      - https://packages.wolfi.dev/os
+    keyring:
+      - https://packages.wolfi.dev/os/wolfi-signing.rsa.pub
+    packages:
+      - build-base
+      - busybox
+      - nginx-dev
+      - geoip-dev
+pipeline:
+  - uses: fetch
+    with:
+      uri: 
https://github.com/leev/ngx_http_geoip2_module/archive/${{package.version}}.tar.gz
+      expected-sha256: 
1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
+  - runs: |
+      ./configure --add-dynamic-module=.
+      make modules
+      install -Dm755 objs/ngx_http_geoip2_module.so \
+        "${{targets.destdir}}/usr/lib/nginx/modules/ngx_http_geoip2_module.so"
+test:
+  environment:
+    contents:
+      packages:
+        - nginx
+        - geoip
+        - curl
+  pipeline:
+    - name: Download GeoIP database
+      runs: |
+        mkdir -p /usr/share/GeoIP
+        # In real scenario, would download actual GeoIP database
+        # For this example, create a minimal test database
+        echo "Creating test GeoIP database..."
+    - name: Test module loading
+      runs: |
+        cat > /tmp/nginx.conf << 'EOF'
+        load_module /usr/lib/nginx/modules/ngx_http_geoip2_module.so;
+        events {}
+        http {
+            server {
+                listen 8080;
+                location / {
+                    return 200 "Module loaded successfully\n";
+                }
+            }
+        }
+        EOF
+        nginx -t -c /tmp/nginx.conf
+    - name: Integration test with requests
+      runs: |
+        # Start nginx in background
+        nginx -c /tmp/nginx.conf &
+        NGINX_PID=$!
+        sleep 2
+
+        # Test endpoints
+        for i in {1..100}; do
+          curl -s http://localhost:8080/ | grep "Module loaded"
+        done
+
+        # Cleanup
+        kill $NGINX_PID
+        echo "Integration test completed successfully"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/go.mod new/melange-0.36.0/go.mod
--- old/melange-0.35.1/go.mod   2025-12-05 21:15:25.000000000 +0100
+++ new/melange-0.36.0/go.mod   2025-12-09 09:15:58.000000000 +0100
@@ -3,10 +3,10 @@
 go 1.24.6
 
 require (
-       chainguard.dev/apko v0.30.27
+       chainguard.dev/apko v0.30.29
        github.com/chainguard-dev/clog v1.7.0
        github.com/chainguard-dev/go-pkgconfig 
v0.0.0-20240404163941-6351b37b2a10
-       github.com/chainguard-dev/yam v0.2.42
+       github.com/chainguard-dev/yam v0.2.43
        github.com/charmbracelet/log v0.4.2
        github.com/docker/cli v29.1.2+incompatible
        github.com/docker/docker v28.5.2+incompatible
@@ -29,7 +29,7 @@
        github.com/pkg/errors v0.9.1
        github.com/psanford/memfs v0.0.0-20241019191636-4ef911798f9b
        github.com/spdx/tools-golang v0.5.5
-       github.com/spf13/cobra v1.10.1
+       github.com/spf13/cobra v1.10.2
        github.com/stretchr/testify v1.11.1
        github.com/ulikunitz/xz v0.5.15
        github.com/yookoala/realpath v1.0.0
@@ -40,8 +40,8 @@
        go.yaml.in/yaml/v2 v2.4.3
        golang.org/x/crypto v0.45.0
        golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b
-       golang.org/x/sync v0.18.0
-       golang.org/x/sys v0.38.0
+       golang.org/x/sync v0.19.0
+       golang.org/x/sys v0.39.0
        golang.org/x/term v0.37.0
        golang.org/x/text v0.31.0
        golang.org/x/time v0.14.0
@@ -60,6 +60,7 @@
        github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus 
v1.1.0 // indirect
        github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 // indirect
        go.opencensus.io v0.24.0 // indirect
+       go.yaml.in/yaml/v3 v3.0.4 // indirect
        golang.org/x/tools v0.39.0 // indirect
        k8s.io/klog/v2 v2.130.1 // indirect
 )
@@ -161,13 +162,13 @@
        go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 
// indirect
        go.opentelemetry.io/otel/metric v1.38.0 // indirect
        go.opentelemetry.io/otel/trace v1.38.0 // indirect
-       go.step.sm/crypto v0.74.0 // indirect
+       go.step.sm/crypto v0.75.0 // indirect
        golang.org/x/mod v0.30.0 // indirect
        golang.org/x/net v0.47.0 // indirect
        golang.org/x/oauth2 v0.33.0 // indirect
-       google.golang.org/api v0.256.0 // indirect
+       google.golang.org/api v0.257.0 // indirect
        google.golang.org/genproto/googleapis/api 
v0.0.0-20251022142026-3a174f9686a8 // indirect
-       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20251103181224-f26f9409b101 // indirect
+       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20251124214823-79d6a2a48846 // indirect
        google.golang.org/grpc v1.77.0 // indirect
        google.golang.org/protobuf v1.36.10
        gopkg.in/warnings.v0 v0.1.2 // indirect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/go.sum new/melange-0.36.0/go.sum
--- old/melange-0.35.1/go.sum   2025-12-05 21:15:25.000000000 +0100
+++ new/melange-0.36.0/go.sum   2025-12-09 09:15:58.000000000 +0100
@@ -1,5 +1,5 @@
-chainguard.dev/apko v0.30.27 h1:MIbezuYcRAyvHUv0y41LV62haE18V/z1wQmjk+xjpJM=
-chainguard.dev/apko v0.30.27/go.mod 
h1:xZnPoBLTslFeebuAV+us05NpWVjeXi2syQ1SzeZnkc8=
+chainguard.dev/apko v0.30.29 h1:/uQYBoLsq92KSuKWTLj9s/5Cs5a/b57zLNz1MUWja8s=
+chainguard.dev/apko v0.30.29/go.mod 
h1:4FN9ULTi71cdylQx9XACNsZANRzroDOjY2yXSLdDT6Q=
 chainguard.dev/go-grpc-kit v0.17.15 
h1:y+FBjta2lsC0XxlkG+W5P1VxYl0zG74GRvoYN2o+p7s=
 chainguard.dev/go-grpc-kit v0.17.15/go.mod 
h1:1wAVAX2CCamtFlfMs9PFzfgQQxX1/TQyF6cbWApbJ2U=
 chainguard.dev/sdk v0.1.44 h1:N65xDKBSgZ/y8M8F/BZUv2sjMHxDKTPV5RieTg6mqew=
@@ -45,8 +45,8 @@
 github.com/chainguard-dev/clog v1.7.0/go.mod 
h1:4+WFhRMsGH79etYXY3plYdp+tCz/KCkU8fAr0HoaPvs=
 github.com/chainguard-dev/go-pkgconfig v0.0.0-20240404163941-6351b37b2a10 
h1:XR2vgQC024I9/boh9r1ihVv8Z14+pbvWqXeYMCnZJpc=
 github.com/chainguard-dev/go-pkgconfig 
v0.0.0-20240404163941-6351b37b2a10/go.mod 
h1:1p6+MesLcjKeON5BRWa7I87mvAY0QmKjgginIM3w6BI=
-github.com/chainguard-dev/yam v0.2.42 
h1:HOJ0R3PoDAXQ6YYo9HnbKBD4Z8MwFaJbty/hAAuUn/k=
-github.com/chainguard-dev/yam v0.2.42/go.mod 
h1:dJCqG2IpMyRXd4W0zwTpsRhPGQcHSt3sN9Mmgyr3coE=
+github.com/chainguard-dev/yam v0.2.43 
h1:WRIYo9WbqOmls+CbmKWpt/vUQ0g4IiVjANrJj7hOAUI=
+github.com/chainguard-dev/yam v0.2.43/go.mod 
h1:Dwk2i+W3mifDxxM5nILZrvUs9GYZsIjVjEONgKMtBrI=
 github.com/charmbracelet/colorprofile v0.3.2 
h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI=
 github.com/charmbracelet/colorprofile v0.3.2/go.mod 
h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI=
 github.com/charmbracelet/lipgloss v1.1.0 
h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
@@ -314,8 +314,8 @@
 github.com/spf13/afero v1.2.0/go.mod 
h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA=
 github.com/spf13/afero v1.14.0/go.mod 
h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo=
-github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
-github.com/spf13/cobra v1.10.1/go.mod 
h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
+github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=
+github.com/spf13/cobra v1.10.2/go.mod 
h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=
 github.com/spf13/pflag v1.0.9/go.mod 
h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
 github.com/spf13/pflag v1.0.10/go.mod 
h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
@@ -381,8 +381,8 @@
 go.opentelemetry.io/otel/trace v1.38.0/go.mod 
h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
 go.opentelemetry.io/proto/otlp v1.7.1 
h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4=
 go.opentelemetry.io/proto/otlp v1.7.1/go.mod 
h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE=
-go.step.sm/crypto v0.74.0 h1:/APBEv45yYR4qQFg47HA8w1nesIGcxh44pGyQNw6JRA=
-go.step.sm/crypto v0.74.0/go.mod 
h1:UoXqCAJjjRgzPte0Llaqen7O9P7XjPmgjgTHQGkKCDk=
+go.step.sm/crypto v0.75.0 h1:UAHYD6q6ggYyzLlIKHv1MCUVjZIesXRZpGTlRC/HSHw=
+go.step.sm/crypto v0.75.0/go.mod 
h1:wwQ57+ajmDype9mrI/2hRyrvJd7yja5xVgWYqpUN3PE=
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 go.uber.org/goleak v1.3.0/go.mod 
h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
 go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
@@ -428,8 +428,8 @@
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/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.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
-golang.org/x/sync v0.18.0/go.mod 
h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
+golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
+golang.org/x/sync v0.19.0/go.mod 
h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
 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=
@@ -447,8 +447,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.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
-golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
+golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
+golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
 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=
@@ -481,8 +481,8 @@
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
 gonum.org/v1/gonum v0.16.0/go.mod 
h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
-google.golang.org/api v0.256.0 h1:u6Khm8+F9sxbCTYNoBHg6/Hwv0N/i+V94MvkOSor6oI=
-google.golang.org/api v0.256.0/go.mod 
h1:KIgPhksXADEKJlnEoRa9qAII4rXcy40vfI8HRqcU964=
+google.golang.org/api v0.257.0 h1:8Y0lzvHlZps53PEaw+G29SsQIkuKrumGWs9puiexNAA=
+google.golang.org/api v0.257.0/go.mod 
h1:4eJrr+vbVaZSqs7vovFd1Jb/A6ml6iw2e6FBYf3GAO4=
 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=
@@ -490,8 +490,8 @@
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod 
h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
 google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8 
h1:mepRgnBZa07I4TRuomDE4sTIYieg/osKmzIf4USdWS4=
 google.golang.org/genproto/googleapis/api 
v0.0.0-20251022142026-3a174f9686a8/go.mod 
h1:fDMmzKV90WSg1NbozdqrE64fkuTv6mlq2zxo9ad+3yo=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101 
h1:tRPGkdGHuewF4UisLzzHHr1spKw92qLM98nIzxbC0wY=
-google.golang.org/genproto/googleapis/rpc 
v0.0.0-20251103181224-f26f9409b101/go.mod 
h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846 
h1:Wgl1rcDNThT+Zn47YyCXOXyX/COgMTIdhJ717F0l4xk=
+google.golang.org/genproto/googleapis/rpc 
v0.0.0-20251124214823-79d6a2a48846/go.mod 
h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk=
 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=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/pkg/build/pipelines/git-checkout.yaml 
new/melange-0.36.0/pkg/build/pipelines/git-checkout.yaml
--- old/melange-0.35.1/pkg/build/pipelines/git-checkout.yaml    2025-12-05 
21:15:25.000000000 +0100
+++ new/melange-0.36.0/pkg/build/pipelines/git-checkout.yaml    2025-12-09 
09:15:58.000000000 +0100
@@ -121,7 +121,7 @@
             if [ -n "$branch" ]; then
                 case " $fetched_branches " in
                     *" $branch "*) ;;
-                    *) vr git fetch origin $branch:$branch || {
+                    *) vr git fetch --unshallow origin $branch:$branch || {
                         msg "failed to fetch branch $branch"
                         return 1
                         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/pkg/build/test.go 
new/melange-0.36.0/pkg/build/test.go
--- old/melange-0.35.1/pkg/build/test.go        2025-12-05 21:15:25.000000000 
+0100
+++ new/melange-0.36.0/pkg/build/test.go        2025-12-09 09:15:58.000000000 
+0100
@@ -23,6 +23,7 @@
        "path/filepath"
        "runtime"
        "slices"
+       "time"
 
        "chainguard.dev/apko/pkg/apk/apk"
        apkofs "chainguard.dev/apko/pkg/apk/fs"
@@ -65,6 +66,11 @@
        Interactive       bool
        Auth              map[string]options.Auth
        IgnoreSignatures  bool
+       DefaultCPU        string
+       DefaultCPUModel   string
+       DefaultDisk       string
+       DefaultMemory     string
+       DefaultTimeout    time.Duration
 }
 
 func NewTest(ctx context.Context, opts ...TestOption) (*Test, error) {
@@ -106,6 +112,11 @@
 
        parsedCfg, err := config.ParseConfiguration(ctx, t.ConfigFile,
                config.WithEnvFileForParsing(t.EnvFile),
+               config.WithDefaultCPU(t.DefaultCPU),
+               config.WithDefaultCPUModel(t.DefaultCPUModel),
+               config.WithDefaultDisk(t.DefaultDisk),
+               config.WithDefaultMemory(t.DefaultMemory),
+               config.WithDefaultTimeout(t.DefaultTimeout),
        )
        if err != nil {
                return nil, fmt.Errorf("failed to load configuration: %w", err)
@@ -447,6 +458,13 @@
                RunAs:        runAs(imgcfg.Accounts),
                RunAsGID:     runAsGID(imgcfg.Accounts),
        }
+
+       if t.Configuration.Package.Resources != nil {
+               cfg.CPU = t.Configuration.Package.Resources.CPU
+               cfg.CPUModel = t.Configuration.Package.Resources.CPUModel
+               cfg.Memory = t.Configuration.Package.Resources.Memory
+               cfg.Disk = t.Configuration.Package.Resources.Disk
+       }
        if t.Configuration.Capabilities.Add != nil {
                cfg.Capabilities.Add = t.Configuration.Capabilities.Add
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/pkg/build/test_options.go 
new/melange-0.36.0/pkg/build/test_options.go
--- old/melange-0.35.1/pkg/build/test_options.go        2025-12-05 
21:15:25.000000000 +0100
+++ new/melange-0.36.0/pkg/build/test_options.go        2025-12-09 
09:15:58.000000000 +0100
@@ -15,6 +15,8 @@
 package build
 
 import (
+       "time"
+
        apko_types "chainguard.dev/apko/pkg/build/types"
        "chainguard.dev/apko/pkg/options"
 
@@ -206,3 +208,38 @@
                return nil
        }
 }
+
+func WithTestCPU(cpu string) TestOption {
+       return func(t *Test) error {
+               t.DefaultCPU = cpu
+               return nil
+       }
+}
+
+func WithTestCPUModel(cpumodel string) TestOption {
+       return func(t *Test) error {
+               t.DefaultCPUModel = cpumodel
+               return nil
+       }
+}
+
+func WithTestDisk(disk string) TestOption {
+       return func(t *Test) error {
+               t.DefaultDisk = disk
+               return nil
+       }
+}
+
+func WithTestMemory(memory string) TestOption {
+       return func(t *Test) error {
+               t.DefaultMemory = memory
+               return nil
+       }
+}
+
+func WithTestTimeout(dur time.Duration) TestOption {
+       return func(t *Test) error {
+               t.DefaultTimeout = dur
+               return nil
+       }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/pkg/cli/test.go 
new/melange-0.36.0/pkg/cli/test.go
--- old/melange-0.35.1/pkg/cli/test.go  2025-12-05 21:15:25.000000000 +0100
+++ new/melange-0.36.0/pkg/cli/test.go  2025-12-09 09:15:58.000000000 +0100
@@ -20,6 +20,7 @@
        "fmt"
        "os"
        "strings"
+       "time"
 
        apko_types "chainguard.dev/apko/pkg/build/types"
        "github.com/chainguard-dev/clog"
@@ -51,6 +52,11 @@
        fs.StringSliceVar(&flags.ExtraTestPackages, "test-package-append", 
[]string{}, "extra packages to install for each of the test environments")
        fs.BoolVar(&flags.Remove, "rm", true, "clean up intermediate artifacts 
(e.g. container images, temp dirs)")
        fs.BoolVar(&flags.IgnoreSignatures, "ignore-signatures", false, "ignore 
repository signature verification")
+       fs.StringVar(&flags.CPU, "cpu", "", "default CPU resources to use for 
tests")
+       fs.StringVar(&flags.CPUModel, "cpumodel", "", "default CPU model to use 
for tests")
+       fs.StringVar(&flags.Disk, "disk", "", "disk size to use for tests")
+       fs.StringVar(&flags.Memory, "memory", "", "default memory resources to 
use for tests")
+       fs.DurationVar(&flags.Timeout, "timeout", 0, "default timeout for 
tests")
 }
 
 // TestFlags holds all parsed test command flags
@@ -73,6 +79,11 @@
        ExtraTestPackages []string
        Remove            bool
        IgnoreSignatures  bool
+       CPU               string
+       CPUModel          string
+       Memory            string
+       Disk              string
+       Timeout           time.Duration
 }
 
 // ParseTestFlags parses test flags from the provided args and returns a 
TestFlags struct
@@ -112,6 +123,11 @@
                build.WithTestInteractive(flags.Interactive),
                build.WithTestRemove(flags.Remove),
                build.WithTestIgnoreSignatures(flags.IgnoreSignatures),
+               build.WithTestCPU(flags.CPU),
+               build.WithTestCPUModel(flags.CPUModel),
+               build.WithTestMemory(flags.Memory),
+               build.WithTestDisk(flags.Disk),
+               build.WithTestTimeout(flags.Timeout),
        }
 
        if len(args) > 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/pkg/config/config.go 
new/melange-0.36.0/pkg/config/config.go
--- old/melange-0.35.1/pkg/config/config.go     2025-12-05 21:15:25.000000000 
+0100
+++ new/melange-0.36.0/pkg/config/config.go     2025-12-09 09:15:58.000000000 
+0100
@@ -138,6 +138,11 @@
        Timeout time.Duration `json:"timeout,omitempty" 
yaml:"timeout,omitempty"`
        // Optional: Resources to allocate to the build.
        Resources *Resources `json:"resources,omitempty" 
yaml:"resources,omitempty"`
+       // Optional: Resources to allocate for test execution.
+       // Used by external schedulers (like elastic build) to provision
+       // appropriately-sized test pods/VMs. If not specified, falls back
+       // to Resources.
+       TestResources *Resources `json:"test-resources,omitempty" 
yaml:"test-resources,omitempty"`
 }
 
 // CPE stores values used to produce a CPE to describe the package, suitable 
for
@@ -1358,6 +1363,7 @@
                CPE:                in.CPE,
                Timeout:            in.Timeout,
                Resources:          in.Resources,
+               TestResources:      in.TestResources,
                SetCap:             in.SetCap,
        }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/pkg/config/config_test.go 
new/melange-0.36.0/pkg/config/config_test.go
--- old/melange-0.35.1/pkg/config/config_test.go        2025-12-05 
21:15:25.000000000 +0100
+++ new/melange-0.36.0/pkg/config/config_test.go        2025-12-09 
09:15:58.000000000 +0100
@@ -1387,3 +1387,264 @@
                })
        }
 }
+
+func TestTestResources(t *testing.T) {
+       ctx := slogtest.Context(t)
+
+       tests := []struct {
+               name                string
+               yaml                string
+               expectResources     *Resources
+               expectTestResources *Resources
+               expectParseError    bool
+       }{
+               {
+                       name: "both resources and test-resources specified",
+                       yaml: `
+package:
+  name: test-pkg
+  version: 1.0.0
+  epoch: 0
+  resources:
+    cpu: "8"
+    memory: 16Gi
+    disk: 100Gi
+  test-resources:
+    cpu: "4"
+    memory: 8Gi
+    disk: 50Gi
+`,
+                       expectResources: &Resources{
+                               CPU:    "8",
+                               Memory: "16Gi",
+                               Disk:   "100Gi",
+                       },
+                       expectTestResources: &Resources{
+                               CPU:    "4",
+                               Memory: "8Gi",
+                               Disk:   "50Gi",
+                       },
+                       expectParseError: false,
+               },
+               {
+                       name: "only test-resources specified",
+                       yaml: `
+package:
+  name: test-pkg
+  version: 1.0.0
+  epoch: 0
+  test-resources:
+    cpu: "4"
+    memory: 8Gi
+`,
+                       expectResources: &Resources{
+                               CPU:    "",
+                               Memory: "",
+                       },
+                       expectTestResources: &Resources{
+                               CPU:    "4",
+                               Memory: "8Gi",
+                       },
+                       expectParseError: false,
+               },
+               {
+                       name: "only resources specified (backward compatible)",
+                       yaml: `
+package:
+  name: test-pkg
+  version: 1.0.0
+  epoch: 0
+  resources:
+    cpu: "4"
+    memory: 8Gi
+`,
+                       expectResources: &Resources{
+                               CPU:    "4",
+                               Memory: "8Gi",
+                       },
+                       expectTestResources: nil,
+                       expectParseError:    false,
+               },
+               {
+                       name: "neither resources nor test-resources specified",
+                       yaml: `
+package:
+  name: test-pkg
+  version: 1.0.0
+  epoch: 0
+`,
+                       expectResources: &Resources{
+                               CPU:    "",
+                               Memory: "",
+                       },
+                       expectTestResources: nil,
+                       expectParseError:    false,
+               },
+               {
+                       name: "test-resources needs more resources than build",
+                       yaml: `
+package:
+  name: ml-pkg
+  version: 2.0.0
+  epoch: 0
+  resources:
+    cpu: "2"
+    memory: 4Gi
+  test-resources:
+    cpu: "32"
+    memory: 128Gi
+    disk: 500Gi
+`,
+                       expectResources: &Resources{
+                               CPU:    "2",
+                               Memory: "4Gi",
+                       },
+                       expectTestResources: &Resources{
+                               CPU:    "32",
+                               Memory: "128Gi",
+                               Disk:   "500Gi",
+                       },
+                       expectParseError: false,
+               },
+               {
+                       name: "cpumodel in test-resources",
+                       yaml: `
+package:
+  name: test-pkg
+  version: 1.0.0
+  epoch: 0
+  test-resources:
+    cpu: "4"
+    cpumodel: "intel-xeon"
+    memory: 8Gi
+`,
+                       expectResources: &Resources{
+                               CPU:    "",
+                               Memory: "",
+                       },
+                       expectTestResources: &Resources{
+                               CPU:      "4",
+                               CPUModel: "intel-xeon",
+                               Memory:   "8Gi",
+                       },
+                       expectParseError: false,
+               },
+       }
+
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       fp := filepath.Join(t.TempDir(), 
"melange-test-resources-"+tt.name)
+                       if err := os.WriteFile(fp, []byte(tt.yaml), 0o644); err 
!= nil {
+                               t.Fatal(err)
+                       }
+
+                       cfg, err := ParseConfiguration(ctx, fp)
+                       if tt.expectParseError {
+                               require.Error(t, err)
+                               return
+                       }
+
+                       require.NoError(t, err)
+
+                       if tt.expectResources != nil {
+                               require.NotNil(t, cfg.Package.Resources)
+                               require.Equal(t, tt.expectResources.CPU, 
cfg.Package.Resources.CPU)
+                               require.Equal(t, tt.expectResources.Memory, 
cfg.Package.Resources.Memory)
+                               require.Equal(t, tt.expectResources.Disk, 
cfg.Package.Resources.Disk)
+                               require.Equal(t, tt.expectResources.CPUModel, 
cfg.Package.Resources.CPUModel)
+                       } else {
+                               require.Nil(t, cfg.Package.Resources)
+                       }
+
+                       if tt.expectTestResources != nil {
+                               require.NotNil(t, cfg.Package.TestResources)
+                               require.Equal(t, tt.expectTestResources.CPU, 
cfg.Package.TestResources.CPU)
+                               require.Equal(t, tt.expectTestResources.Memory, 
cfg.Package.TestResources.Memory)
+                               require.Equal(t, tt.expectTestResources.Disk, 
cfg.Package.TestResources.Disk)
+                               require.Equal(t, 
tt.expectTestResources.CPUModel, cfg.Package.TestResources.CPUModel)
+                       } else {
+                               require.Nil(t, cfg.Package.TestResources)
+                       }
+               })
+       }
+}
+
+func TestTestResourcesEdgeCases(t *testing.T) {
+       ctx := slogtest.Context(t)
+
+       tests := []struct {
+               name             string
+               yaml             string
+               expectParseError bool
+               checkFunc        func(*testing.T, *Configuration)
+       }{
+               {
+                       name: "empty test-resources object",
+                       yaml: `
+package:
+  name: test-pkg
+  version: 1.0.0
+  epoch: 0
+  test-resources: {}
+`,
+                       expectParseError: false,
+                       checkFunc: func(t *testing.T, cfg *Configuration) {
+                               require.NotNil(t, cfg.Package.TestResources)
+                               require.Empty(t, cfg.Package.TestResources.CPU)
+                               require.Empty(t, 
cfg.Package.TestResources.Memory)
+                       },
+               },
+               {
+                       name: "malformed yaml - invalid indentation",
+                       yaml: `
+package:
+  name: test-pkg
+version: 1.0.0
+  epoch: 0
+`,
+                       expectParseError: true,
+               },
+               {
+                       name: "test-resources with all fields specified",
+                       yaml: `
+package:
+  name: test-pkg
+  version: 1.0.0
+  epoch: 0
+  test-resources:
+    cpu: "16"
+    cpumodel: "intel-xeon-platinum"
+    memory: "256Gi"
+    disk: "2Ti"
+`,
+                       expectParseError: false,
+                       checkFunc: func(t *testing.T, cfg *Configuration) {
+                               require.NotNil(t, cfg.Package.TestResources)
+                               require.Equal(t, "16", 
cfg.Package.TestResources.CPU)
+                               require.Equal(t, "intel-xeon-platinum", 
cfg.Package.TestResources.CPUModel)
+                               require.Equal(t, "256Gi", 
cfg.Package.TestResources.Memory)
+                               require.Equal(t, "2Ti", 
cfg.Package.TestResources.Disk)
+                       },
+               },
+       }
+
+       for _, tt := range tests {
+               t.Run(tt.name, func(t *testing.T) {
+                       fp := filepath.Join(t.TempDir(), 
"melange-test-resources-edge-"+tt.name)
+                       if err := os.WriteFile(fp, []byte(tt.yaml), 0o644); err 
!= nil {
+                               t.Fatal(err)
+                       }
+
+                       cfg, err := ParseConfiguration(ctx, fp)
+                       if tt.expectParseError {
+                               require.Error(t, err)
+                               return
+                       }
+
+                       require.NoError(t, err)
+                       if tt.checkFunc != nil {
+                               tt.checkFunc(t, cfg)
+                       }
+               })
+       }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/pkg/config/schema.cue 
new/melange-0.36.0/pkg/config/schema.cue
--- old/melange-0.35.1/pkg/config/schema.cue    2025-12-05 21:15:25.000000000 
+0100
+++ new/melange-0.36.0/pkg/config/schema.cue    2025-12-09 09:15:58.000000000 
+0100
@@ -329,7 +329,15 @@
        timeout?: int
 
        // Optional: Resources to allocate to the build.
+       // Used by external schedulers (like elastic build) to provision
+       // appropriately-sized build pods/VMs.
        resources?: #Resources
+
+       // Optional: Resources to allocate for test execution.
+       // Used by external schedulers (like elastic build) to provision
+       // appropriately-sized test pods/VMs. If not specified, external
+       // schedulers should fall back to the resources configuration.
+       "test-resources"?: #Resources
 })
 
 #PackageOption: close({
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/pkg/config/schema.json 
new/melange-0.36.0/pkg/config/schema.json
--- old/melange-0.35.1/pkg/config/schema.json   2025-12-05 21:15:25.000000000 
+0100
+++ new/melange-0.36.0/pkg/config/schema.json   2025-12-09 09:15:58.000000000 
+0100
@@ -669,6 +669,10 @@
         "resources": {
           "$ref": "#/$defs/Resources",
           "description": "Optional: Resources to allocate to the build."
+        },
+        "test-resources": {
+          "$ref": "#/$defs/Resources",
+          "description": "Optional: Resources to allocate for test 
execution.\nUsed by external schedulers (like elastic build) to 
provision\nappropriately-sized test pods/VMs. If not specified, falls back\nto 
Resources."
         }
       },
       "additionalProperties": false,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/pkg/renovate/bump/bump.go 
new/melange-0.36.0/pkg/renovate/bump/bump.go
--- old/melange-0.35.1/pkg/renovate/bump/bump.go        2025-12-05 
21:15:25.000000000 +0100
+++ new/melange-0.36.0/pkg/renovate/bump/bump.go        2025-12-09 
09:15:58.000000000 +0100
@@ -120,6 +120,12 @@
                // Find our main pipeline YAML node.
                pipelineNode, err := 
renovate.NodeFromMapping(rc.Configuration.Root().Content[0], "pipeline")
                if err != nil {
+                       // The main pipeline doesn't exist. This is valid for 
empty virtual and metapackages so
+                       // we will just return early instead of throwing an 
error
+                       if strings.Contains(err.Error(), "not found in 
mapping") {
+                               log.Infof("no main pipeline found, will not 
update expected commits or checksums")
+                               return nil
+                       }
                        return err
                }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/melange-0.35.1/pkg/renovate/cache/cache.go 
new/melange-0.36.0/pkg/renovate/cache/cache.go
--- old/melange-0.35.1/pkg/renovate/cache/cache.go      2025-12-05 
21:15:25.000000000 +0100
+++ new/melange-0.36.0/pkg/renovate/cache/cache.go      2025-12-09 
09:15:58.000000000 +0100
@@ -99,6 +99,12 @@
                // Find our main pipeline YAML node.
                pipelineNode, err := 
renovate.NodeFromMapping(rc.Configuration.Root().Content[0], "pipeline")
                if err != nil {
+                       // The main pipeline doesn't exist. This is valid for 
empty virtual and metapackages so
+                       // we will just return early instead of throwing an 
error
+                       if strings.Contains(err.Error(), "not found in 
mapping") {
+                               log.Infof("no main pipeline found, will not 
cache any artifacts")
+                               return nil
+                       }
                        return err
                }
 

++++++ melange.obsinfo ++++++
--- /var/tmp/diff_new_pack.kTxQi1/_old  2025-12-11 18:43:07.977989622 +0100
+++ /var/tmp/diff_new_pack.kTxQi1/_new  2025-12-11 18:43:07.993990295 +0100
@@ -1,5 +1,5 @@
 name: melange
-version: 0.35.1
-mtime: 1764965725
-commit: f28e457f74f15f5af9f9f1370e34943567633255
+version: 0.36.0
+mtime: 1765268158
+commit: c32e57daa58da05d589ec801b6c5c4c3086a83f9
 

++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/melange/vendor.tar.gz 
/work/SRC/openSUSE:Factory/.melange.new.1939/vendor.tar.gz differ: char 14, 
line 1

Reply via email to