diff --git a/.env.ci b/.env.ci new file mode 100644 index 0000000..76c9f82 --- /dev/null +++ b/.env.ci @@ -0,0 +1 @@ +PIXI_PR_NUMBER="4446" diff --git a/tests/data/pixi_build/cpp-with-git-source/.gitignore b/tests/data/pixi_build/cpp-with-git-source/.gitignore new file mode 100644 index 0000000..a2a707b --- /dev/null +++ b/tests/data/pixi_build/cpp-with-git-source/.gitignore @@ -0,0 +1,5 @@ +# pixi environments +.pixi + +# The build directory +.build diff --git a/tests/data/pixi_build/cpp-with-git-source/README.md b/tests/data/pixi_build/cpp-with-git-source/README.md new file mode 100644 index 0000000..b14cc1d --- /dev/null +++ b/tests/data/pixi_build/cpp-with-git-source/README.md @@ -0,0 +1,14 @@ +# Simple C++ SDL Example with specified source path + +This is a simple pixi demo that showcases how to use C++ and SDL with specified source path. + +## How to use? + +Make sure you have `pixi` available in your terminal. +Navigate to this directory and run: + +```shell + +# Start the build executable +pixi run start +``` diff --git a/tests/data/pixi_build/cpp-with-git-source/pixi.lock b/tests/data/pixi_build/cpp-with-git-source/pixi.lock new file mode 100644 index 0000000..c15e88d --- /dev/null +++ b/tests/data/pixi_build/cpp-with-git-source/pixi.lock @@ -0,0 +1,1291 @@ +version: 6 +environments: + default: + channels: + - url: https://prefix.dev/conda-forge/ + packages: + linux-64: + - conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + - conda: https://prefix.dev/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/gettext-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/gettext-tools-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + - conda: https://prefix.dev/conda-forge/linux-64/libasprintf-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libasprintf-devel-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libcap-2.76-h0b2e76d_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcrypt-lib-1.11.1-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-devel-0.25.1-h3f43e3d_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libglib-2.86.0-h1fed272_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgpg-error-1.55-h3f2d84a_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsystemd0-257.9-h996ca69_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libudev1-257.9-h085a93f_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/liburing-2.12-hb700be7_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libusb-1.0.29-h73b1eb8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxkbcommon-1.11.0-hca5e8e5_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.0-h26afc86_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://prefix.dev/conda-forge/linux-64/pulseaudio-client-17.0-h9a8bead_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/sdl2-2.32.56-h54a6638_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/sdl3-3.2.22-h68140b3_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/wayland-1.24.0-h3e06ad9_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xkeyboard-config-2.45-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/xorg-libxscrnsaver-1.2.4-hb9d3cd8_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + - conda: . + subdir: linux-64 + osx-64: + - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + - conda: https://prefix.dev/conda-forge/osx-64/dbus-1.16.2-h27bd348_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.2-h3d58e20_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libglib-2.86.0-h7cafd41_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libusb-1.0.29-h2287256_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.46-ha3e7e28_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/sdl2-2.32.56-h53ec75d_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/sdl3-3.2.22-hc0b302d_0.conda + - conda: . + subdir: osx-64 + osx-arm64: + - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/dbus-1.16.2-hda038a8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.2-hf598326_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.0-h1bb475b_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libusb-1.0.29-hbc156a2_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.46-h7125dd6_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sdl2-2.32.56-h248ca61_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/sdl3-3.2.22-he22eeb8_0.conda + - conda: . + subdir: osx-arm64 + win-64: + - conda: https://prefix.dev/conda-forge/win-64/libusb-1.0.29-h1839187_0.conda + - conda: https://prefix.dev/conda-forge/win-64/sdl2-2.32.56-h5112557_0.conda + - conda: https://prefix.dev/conda-forge/win-64/sdl3-3.2.22-h5112557_0.conda + - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + - conda: . + build: h9352c13_0 +packages: +- conda: https://prefix.dev/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + size: 2562 + timestamp: 1578324546067 +- conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + build_number: 16 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23621 + timestamp: 1650670423406 +- conda: https://prefix.dev/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + sha256: a9c114cbfeda42a226e2db1809a538929d2f118ef855372293bd188f71711c48 + md5: 791365c5f65975051e4e017b5da3abf5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: GPL-2.0-or-later + license_family: GPL + size: 68072 + timestamp: 1756738968573 +- conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + md5: 51a19bba1b8ebfb60df25cde030b7ebc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + size: 260341 + timestamp: 1757437258798 +- conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda + sha256: 8f50b58efb29c710f3cecf2027a8d7325ba769ab10c746eff75cea3ac050b10c + md5: 97c4b3bd8a90722104798175a1bdddbf + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + size: 132607 + timestamp: 1757437730085 +- conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda + sha256: b456200636bd5fecb2bec63f7e0985ad2097cf1b83d60ce0b6968dffa6d02aa1 + md5: 58fd217444c2a5701a44244faf518206 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + size: 125061 + timestamp: 1757437486465 +- conda: https://prefix.dev/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + sha256: 3b988146a50e165f0fa4e839545c679af88e4782ec284cc7b6d07dd226d6a068 + md5: 679616eb5ad4e521c83da4650860aba7 + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libexpat >=2.7.0,<3.0a0 + - libzlib >=1.3.1,<2.0a0 + - libglib >=2.84.2,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 437860 + timestamp: 1747855126005 +- conda: https://prefix.dev/conda-forge/osx-64/dbus-1.16.2-h27bd348_0.conda + sha256: 1106cf25c1b64e58f599e0bce9dd0b77b744146d324539fe715596f179dc37b7 + md5: ed5f537f1cefb3a15bcce7cb02d3c149 + depends: + - libcxx >=18 + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + - libexpat >=2.7.0,<3.0a0 + - libglib >=2.84.2,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 398137 + timestamp: 1747855120103 +- conda: https://prefix.dev/conda-forge/osx-arm64/dbus-1.16.2-hda038a8_0.conda + sha256: 2ef01ab52dedb477cb7291994ad556279b37c8ad457521e75c47cad20248ea30 + md5: 80c663e4f6b0fd8d6723ff7d68f09429 + depends: + - __osx >=11.0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - libglib >=2.84.2,<3.0a0 + - libexpat >=2.7.0,<3.0a0 + license: GPL-2.0-or-later + license_family: GPL + size: 384376 + timestamp: 1747855177419 +- conda: https://prefix.dev/conda-forge/linux-64/gettext-0.25.1-h3f43e3d_1.conda + sha256: cbfa8c80771d1842c2687f6016c5e200b52d4ca8f2cc119f6377f64f899ba4ff + md5: c42356557d7f2e37676e121515417e3b + depends: + - __glibc >=2.17,<3.0.a0 + - gettext-tools 0.25.1 h3f43e3d_1 + - libasprintf 0.25.1 h3f43e3d_1 + - libasprintf-devel 0.25.1 h3f43e3d_1 + - libgcc >=14 + - libgettextpo 0.25.1 h3f43e3d_1 + - libgettextpo-devel 0.25.1 h3f43e3d_1 + - libiconv >=1.18,<2.0a0 + - libstdcxx >=14 + license: LGPL-2.1-or-later AND GPL-3.0-or-later + size: 541357 + timestamp: 1753343006214 +- conda: https://prefix.dev/conda-forge/linux-64/gettext-tools-0.25.1-h3f43e3d_1.conda + sha256: c792729288bdd94f21f25f80802d4c66957b4e00a57f7cb20513f07aadfaff06 + md5: a59c05d22bdcbb4e984bf0c021a2a02f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 3644103 + timestamp: 1753342966311 +- conda: https://prefix.dev/conda-forge/linux-64/icu-75.1-he02047a_0.conda + sha256: 71e750d509f5fa3421087ba88ef9a7b9be11c53174af3aa4d06aff4c18b38e8e + md5: 8b189310083baabfb622af68fd9d3ae3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + size: 12129203 + timestamp: 1720853576813 +- conda: https://prefix.dev/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + sha256: aad2a703b9d7b038c0f745b853c6bb5f122988fe1a7a096e0e606d9cbec4eaab + md5: a8832b479f93521a9e7b5b743803be51 + depends: + - libgcc-ng >=12 + license: LGPL-2.0-only + license_family: LGPL + size: 508258 + timestamp: 1664996250081 +- conda: https://prefix.dev/conda-forge/linux-64/libasprintf-0.25.1-h3f43e3d_1.conda + sha256: cb728a2a95557bb6a5184be2b8be83a6f2083000d0c7eff4ad5bbe5792133541 + md5: 3b0d184bc9404516d418d4509e418bdc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: LGPL-2.1-or-later + size: 53582 + timestamp: 1753342901341 +- conda: https://prefix.dev/conda-forge/linux-64/libasprintf-devel-0.25.1-h3f43e3d_1.conda + sha256: 2fc95060efc3d76547b7872875af0b7212d4b1407165be11c5f830aeeb57fc3a + md5: fd9cf4a11d07f0ef3e44fc061611b1ed + depends: + - __glibc >=2.17,<3.0.a0 + - libasprintf 0.25.1 h3f43e3d_1 + - libgcc >=14 + license: LGPL-2.1-or-later + size: 34734 + timestamp: 1753342921605 +- conda: https://prefix.dev/conda-forge/linux-64/libcap-2.76-h0b2e76d_0.conda + sha256: a946b61be1af15ff08c7722e9bac0fab446d8b9896c9f0f35657dfcf887fda8a + md5: 0f7f0c878c8dceb3b9ec67f5c06d6057 + depends: + - __glibc >=2.17,<3.0.a0 + - attr >=2.5.1,<2.6.0a0 + - libgcc >=13 + license: BSD-3-Clause + license_family: BSD + size: 121852 + timestamp: 1744577167992 +- conda: https://prefix.dev/conda-forge/osx-64/libcxx-21.1.2-h3d58e20_0.conda + sha256: c3feab716740baa6193a1bc5c948c47c913e28f6e52d418bb67123cb92b9761e + md5: 34cd9d03a8f27081a556cb397a19f6cd + depends: + - __osx >=10.13 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 572006 + timestamp: 1758698149906 +- conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-21.1.2-hf598326_0.conda + sha256: 3de00998c8271f599d6ed9aea60dc0b3e5b1b7ff9f26f8eac95f86f135aa9beb + md5: edfa256c5391f789384e470ce5c9f340 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 568154 + timestamp: 1758698306949 +- conda: https://prefix.dev/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda + sha256: c076a213bd3676cc1ef22eeff91588826273513ccc6040d9bea68bccdc849501 + md5: 9314bc5a1fe7d1044dc9dfd3ef400535 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpciaccess >=0.18,<0.19.0a0 + license: MIT + license_family: MIT + size: 310785 + timestamp: 1757212153962 +- conda: https://prefix.dev/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + sha256: 7fd5408d359d05a969133e47af580183fbf38e2235b562193d427bb9dad79723 + md5: c151d5eb730e9b7480e6d48c0fc44048 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + size: 44840 + timestamp: 1731330973553 +- conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + sha256: da2080da8f0288b95dd86765c801c6e166c4619b910b11f9a8446fb852438dc2 + md5: 4211416ecba1866fab0c6470986c22d6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 74811 + timestamp: 1752719572741 +- conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.7.1-h21dd04a_0.conda + sha256: 689862313571b62ee77ee01729dc093f2bf25a2f99415fcfe51d3a6cd31cce7b + md5: 9fdeae0b7edda62e989557d645769515 + depends: + - __osx >=10.13 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 72450 + timestamp: 1752719744781 +- conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.7.1-hec049ff_0.conda + sha256: 8fbb17a56f51e7113ed511c5787e0dec0d4b10ef9df921c4fd1cccca0458f648 + md5: b1ca5f21335782f71a8bd69bdc093f67 + depends: + - __osx >=11.0 + constrains: + - expat 2.7.1.* + license: MIT + license_family: MIT + size: 65971 + timestamp: 1752719657566 +- conda: https://prefix.dev/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda + sha256: 764432d32db45466e87f10621db5b74363a9f847d2b8b1f9743746cd160f06ab + md5: ede4673863426c0883c0063d853bbd85 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 57433 + timestamp: 1743434498161 +- conda: https://prefix.dev/conda-forge/osx-64/libffi-3.4.6-h281671d_1.conda + sha256: 6394b1bc67c64a21a5cc73d1736d1d4193a64515152e861785c44d2cfc49edf3 + md5: 4ca9ea59839a9ca8df84170fab4ceb41 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + size: 51216 + timestamp: 1743434595269 +- conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.4.6-h1da3d7d_1.conda + sha256: c6a530924a9b14e193ea9adfe92843de2a806d1b7dbfd341546ece9653129e60 + md5: c215a60c2935b517dcda8cad4705734d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 39839 + timestamp: 1743434670405 +- conda: https://prefix.dev/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda + sha256: 65908b75fa7003167b8a8f0001e11e58ed5b1ef5e98b96ab2ba66d7c1b822c7d + md5: ee48bf17cc83a00f59ca1494d5646869 + depends: + - gettext >=0.21.1,<1.0a0 + - libgcc-ng >=12 + - libogg 1.3.* + - libogg >=1.3.4,<1.4.0a0 + - libstdcxx-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 394383 + timestamp: 1687765514062 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.1.0-h767d61c_5.conda + sha256: 0caed73aac3966bfbf5710e06c728a24c6c138605121a3dacb2e03440e8baa6a + md5: 264fbfba7fb20acf3b29cde153e345ce + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgomp 15.1.0 h767d61c_5 + - libgcc-ng ==15.1.0=*_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 824191 + timestamp: 1757042543820 +- conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.1.0-h69a702a_5.conda + sha256: f54bb9c3be12b24be327f4c1afccc2969712e0b091cdfbd1d763fb3e61cda03f + md5: 069afdf8ea72504e48d23ae1171d951c + depends: + - libgcc 15.1.0 h767d61c_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29187 + timestamp: 1757042549554 +- conda: https://prefix.dev/conda-forge/linux-64/libgcrypt-lib-1.11.1-hb9d3cd8_0.conda + sha256: dc9c7d7a6c0e6639deee6fde2efdc7e119e7739a6b229fa5f9049a449bae6109 + md5: 8504a291085c9fb809b66cabd5834307 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libgpg-error >=1.55,<2.0a0 + license: LGPL-2.1-or-later + size: 590353 + timestamp: 1747060639058 +- conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-0.25.1-h3f43e3d_1.conda + sha256: 50a9e9815cf3f5bce1b8c5161c0899cc5b6c6052d6d73a4c27f749119e607100 + md5: 2f4de899028319b27eb7a4023be5dfd2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 188293 + timestamp: 1753342911214 +- conda: https://prefix.dev/conda-forge/linux-64/libgettextpo-devel-0.25.1-h3f43e3d_1.conda + sha256: c7ea10326fd450a2a21955987db09dde78c99956a91f6f05386756a7bfe7cc04 + md5: 3f7a43b3160ec0345c9535a9f0d7908e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgettextpo 0.25.1 h3f43e3d_1 + - libiconv >=1.18,<2.0a0 + license: GPL-3.0-or-later + license_family: GPL + size: 37407 + timestamp: 1753342931100 +- conda: https://prefix.dev/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda + sha256: dc2752241fa3d9e40ce552c1942d0a4b5eeb93740c9723873f6fcf8d39ef8d2d + md5: 928b8be80851f5d8ffb016f9c81dae7a + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - libglx 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + size: 134712 + timestamp: 1731330998354 +- conda: https://prefix.dev/conda-forge/linux-64/libglib-2.86.0-h1fed272_0.conda + sha256: 33336bd55981be938f4823db74291e1323454491623de0be61ecbe6cf3a4619c + md5: b8e4c93f4ab70c3b6f6499299627dbdc + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.46,<10.47.0a0 + constrains: + - glib 2.86.0 *_0 + license: LGPL-2.1-or-later + size: 3978602 + timestamp: 1757403291664 +- conda: https://prefix.dev/conda-forge/osx-64/libglib-2.86.0-h7cafd41_0.conda + sha256: 0950997e833d3f6a91200c92a1d602e14728916f95cdcbcdb69b12c462206d5e + md5: 39fb5e0b9b76a73e18581b3839a3af3d + depends: + - __osx >=10.13 + - libffi >=3.4.6,<3.5.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.25.1,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.46,<10.47.0a0 + constrains: + - glib 2.86.0 *_0 + license: LGPL-2.1-or-later + size: 3722414 + timestamp: 1757404071834 +- conda: https://prefix.dev/conda-forge/osx-arm64/libglib-2.86.0-h1bb475b_0.conda + sha256: 92d17f998e14218810493c9190c8721bf7f7f006bfc5c00dbba1cede83c02f1a + md5: 9e065148e6013b7d7cae64ed01ab7081 + depends: + - __osx >=11.0 + - libffi >=3.4.6,<3.5.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.25.1,<1.0a0 + - libzlib >=1.3.1,<2.0a0 + - pcre2 >=10.46,<10.47.0a0 + constrains: + - glib 2.86.0 *_0 + license: LGPL-2.1-or-later + size: 3701880 + timestamp: 1757404501093 +- conda: https://prefix.dev/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda + sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 + md5: 434ca7e50e40f4918ab701e3facd59a0 + depends: + - __glibc >=2.17,<3.0.a0 + license: LicenseRef-libglvnd + size: 132463 + timestamp: 1731330968309 +- conda: https://prefix.dev/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + sha256: 2d35a679624a93ce5b3e9dd301fff92343db609b79f0363e6d0ceb3a6478bfa7 + md5: c8013e438185f33b13814c5c488acd5c + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_2 + - xorg-libx11 >=1.8.10,<2.0a0 + license: LicenseRef-libglvnd + size: 75504 + timestamp: 1731330988898 +- conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.1.0-h767d61c_5.conda + sha256: 125051d51a8c04694d0830f6343af78b556dd88cc249dfec5a97703ebfb1832d + md5: dcd5ff1940cd38f6df777cac86819d60 + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 447215 + timestamp: 1757042483384 +- conda: https://prefix.dev/conda-forge/linux-64/libgpg-error-1.55-h3f2d84a_0.conda + sha256: 697334de4786a1067ea86853e520c64dd72b11a05137f5b318d8a444007b5e60 + md5: 2bd47db5807daade8500ed7ca4c512a4 + depends: + - libstdcxx >=13 + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + size: 312184 + timestamp: 1745575272035 +- conda: https://prefix.dev/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f + md5: 915f5995e94f60e9a4826e0b0920ee88 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-only + size: 790176 + timestamp: 1754908768807 +- conda: https://prefix.dev/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + sha256: a1c8cecdf9966921e13f0ae921309a1f415dfbd2b791f2117cf7e8f5e61a48b6 + md5: 210a85a1119f97ea7887188d176db135 + depends: + - __osx >=10.13 + license: LGPL-2.1-only + size: 737846 + timestamp: 1754908900138 +- conda: https://prefix.dev/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 + md5: 4d5a7445f0b25b6a3ddbb56e790f5251 + depends: + - __osx >=11.0 + license: LGPL-2.1-only + size: 750379 + timestamp: 1754909073836 +- conda: https://prefix.dev/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda + sha256: 8c352744517bc62d24539d1ecc813b9fdc8a785c780197c5f0b84ec5b0dfe122 + md5: a8e54eefc65645193c46e8b180f62d22 + depends: + - __osx >=10.13 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later + size: 96909 + timestamp: 1753343977382 +- conda: https://prefix.dev/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + sha256: 99d2cebcd8f84961b86784451b010f5f0a795ed1c08f1e7c76fbb3c22abf021a + md5: 5103f6a6b210a3912faf8d7db516918c + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later + size: 90957 + timestamp: 1751558394144 +- conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + md5: 1a580f7796c7bf6393fddb8bbbde58dc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - xz 5.8.1.* + license: 0BSD + size: 112894 + timestamp: 1749230047870 +- conda: https://prefix.dev/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda + sha256: ffb066ddf2e76953f92e06677021c73c85536098f1c21fcd15360dbc859e22e4 + md5: 68e52064ed3897463c0e958ab5c8f91b + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + license: BSD-3-Clause + license_family: BSD + size: 218500 + timestamp: 1745825989535 +- conda: https://prefix.dev/conda-forge/linux-64/libopus-1.5.2-hd0c01bc_0.conda + sha256: 786d43678d6d1dc5f88a6bad2d02830cfd5a0184e84a8caa45694049f0e3ea5f + md5: b64523fb87ac6f87f0790f324ad43046 + depends: + - libgcc >=13 + - __glibc >=2.17,<3.0.a0 + license: BSD-3-Clause + license_family: BSD + size: 312472 + timestamp: 1744330953241 +- conda: https://prefix.dev/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda + sha256: 0bd91de9b447a2991e666f284ae8c722ffb1d84acb594dbd0c031bd656fa32b2 + md5: 70e3400cbbfa03e96dcde7fc13e38c7b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 28424 + timestamp: 1749901812541 +- conda: https://prefix.dev/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + sha256: f709cbede3d4f3aee4e2f8d60bd9e256057f410bd60b8964cb8cf82ec1457573 + md5: ef1910918dd895516a769ed36b5b3a4e + depends: + - lame >=3.100,<3.101.0a0 + - libflac >=1.4.3,<1.5.0a0 + - libgcc-ng >=12 + - libogg >=1.3.4,<1.4.0a0 + - libopus >=1.3.1,<2.0a0 + - libstdcxx-ng >=12 + - libvorbis >=1.3.7,<1.4.0a0 + - mpg123 >=1.32.1,<1.33.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + size: 354372 + timestamp: 1695747735668 +- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.1.0-h8f9b012_5.conda + sha256: 0f5f61cab229b6043541c13538d75ce11bd96fb2db76f94ecf81997b1fde6408 + md5: 4e02a49aaa9d5190cb630fa43528fbe6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.1.0 h767d61c_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3896432 + timestamp: 1757042571458 +- conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-ng-15.1.0-h4852527_5.conda + sha256: 7b8cabbf0ab4fe3581ca28fe8ca319f964078578a51dd2ca3f703c1d21ba23ff + md5: 8bba50c7f4679f08c861b597ad2bda6b + depends: + - libstdcxx 15.1.0 h8f9b012_5 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 29233 + timestamp: 1757042603319 +- conda: https://prefix.dev/conda-forge/linux-64/libsystemd0-257.9-h996ca69_0.conda + sha256: 6b063df2d13dc9cedeae7b1591b1917ced7f4e1b04f7246e66cc7fb0088dea07 + md5: b6d222422c17dc11123e63fae4ad4178 + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.76,<2.77.0a0 + - libgcc >=14 + - libgcrypt-lib >=1.11.1,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: LGPL-2.1-or-later + size: 492733 + timestamp: 1757520335407 +- conda: https://prefix.dev/conda-forge/linux-64/libudev1-257.9-h085a93f_0.conda + sha256: 1c8f0b02c400617a9f2ea8429c604b28e25a10f51b3c8d73ce127b4e7b462297 + md5: 973f365f19c1d702bda523658a77de26 + depends: + - __glibc >=2.17,<3.0.a0 + - libcap >=2.76,<2.77.0a0 + - libgcc >=14 + license: LGPL-2.1-or-later + size: 144265 + timestamp: 1757520342166 +- conda: https://prefix.dev/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda + sha256: 71c8b9d5c72473752a0bb6e91b01dd209a03916cb71f36cc6a564e3a2a132d7a + md5: e179a69edd30d75c0144d7a380b88f28 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + size: 75995 + timestamp: 1757032240102 +- conda: https://prefix.dev/conda-forge/linux-64/liburing-2.12-hb700be7_0.conda + sha256: 880b1f76b24814c9f07b33402e82fa66d5ae14738a35a943c21c4434eef2403d + md5: f0531fc1ebc0902555670e9cb0127758 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + size: 127967 + timestamp: 1756125594973 +- conda: https://prefix.dev/conda-forge/linux-64/libusb-1.0.29-h73b1eb8_0.conda + sha256: 89c84f5b26028a9d0f5c4014330703e7dff73ba0c98f90103e9cef6b43a5323c + md5: d17e3fb595a9f24fa9e149239a33475d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libudev1 >=257.4 + license: LGPL-2.1-or-later + size: 89551 + timestamp: 1748856210075 +- conda: https://prefix.dev/conda-forge/osx-64/libusb-1.0.29-h2287256_0.conda + sha256: b46c1c71d8be2d19615a10eaa997b3547848d1aee25a7e9486ad1ca8d61626a7 + md5: e5d5fd6235a259665d7652093dc7d6f1 + depends: + - __osx >=10.13 + license: LGPL-2.1-or-later + size: 85523 + timestamp: 1748856209535 +- conda: https://prefix.dev/conda-forge/osx-arm64/libusb-1.0.29-hbc156a2_0.conda + sha256: 5eee9a2bf359e474d4548874bcfc8d29ebad0d9ba015314439c256904e40aaad + md5: f6654e9e96e9d973981b3b2f898a5bfa + depends: + - __osx >=11.0 + license: LGPL-2.1-or-later + size: 83849 + timestamp: 1748856224950 +- conda: https://prefix.dev/conda-forge/win-64/libusb-1.0.29-h1839187_0.conda + sha256: 9837f8e8de20b6c9c033561cd33b4554cd551b217e3b8d2862b353ed2c23d8b8 + md5: a656b2c367405cd24988cf67ff2675aa + depends: + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + license: LGPL-2.1-or-later + size: 118204 + timestamp: 1748856290542 +- conda: https://prefix.dev/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda + sha256: ca494c99c7e5ecc1b4cd2f72b5584cef3d4ce631d23511184411abcbb90a21a5 + md5: b4ecbefe517ed0157c37f8182768271c + depends: + - libogg + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - libogg >=1.3.5,<1.4.0a0 + license: BSD-3-Clause + license_family: BSD + size: 285894 + timestamp: 1753879378005 +- conda: https://prefix.dev/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + size: 395888 + timestamp: 1727278577118 +- conda: https://prefix.dev/conda-forge/linux-64/libxkbcommon-1.11.0-hca5e8e5_1.conda + sha256: 2febd0cdea153a97737df3cfb900c312b012c0af3cc5a62f2968bd398d25b6b6 + md5: 9abb1e8cbc0039155a8ed2aa149b1067 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxcb >=1.17.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - xkeyboard-config + - xorg-libxau >=1.0.12,<2.0a0 + license: MIT/X11 Derivative + license_family: MIT + size: 800138 + timestamp: 1757977095650 +- conda: https://prefix.dev/conda-forge/linux-64/libxml2-2.15.0-h26afc86_1.conda + sha256: 4310577d7eea817d35a1c05e1e54575b06ce085d73e6dd59aa38523adf50168f + md5: 8337b675e0cad517fbcb3daf7588087a + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libxml2-16 2.15.0 ha9997c6_1 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + size: 45363 + timestamp: 1758640621036 +- conda: https://prefix.dev/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda + sha256: 5420ea77505a8d5ca7b5351ddb2da7e8a178052fccf8fca00189af7877608e89 + md5: b24dd2bd61cd8e4f8a13ee2a945a723c + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=75.1,<76.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + constrains: + - libxml2 2.15.0 + license: MIT + license_family: MIT + size: 556276 + timestamp: 1758640612398 +- conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + md5: edb0dca6bc32e4f4789199455a1dbeb8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 60963 + timestamp: 1727963148474 +- conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 + md5: 003a54a4e32b02f7355b50a837e699da + depends: + - __osx >=10.13 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 57133 + timestamp: 1727963183990 +- conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b + md5: 369964e85dc26bfe78f41399b366c435 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.1 *_2 + license: Zlib + license_family: Other + size: 46438 + timestamp: 1727963202283 +- conda: https://prefix.dev/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-2-Clause + license_family: BSD + size: 167055 + timestamp: 1733741040117 +- conda: https://prefix.dev/conda-forge/linux-64/mpg123-1.32.9-hc50e24c_0.conda + sha256: 39c4700fb3fbe403a77d8cc27352fa72ba744db487559d5d44bf8411bb4ea200 + md5: c7f302fd11eeb0987a6a5e1f3aed6a21 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: LGPL-2.1-only + license_family: LGPL + size: 491140 + timestamp: 1730581373280 +- conda: https://prefix.dev/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + sha256: 5c7380c8fd3ad5fc0f8039069a45586aa452cf165264bc5a437ad80397b32934 + md5: 7fa07cb0fb1b625a089ccc01218ee5b1 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 1209177 + timestamp: 1756742976157 +- conda: https://prefix.dev/conda-forge/osx-64/pcre2-10.46-ha3e7e28_0.conda + sha256: cb262b7f369431d1086445ddd1f21d40003bb03229dfc1d687e3a808de2663a6 + md5: 3b504da3a4f6d8b2b1f969686a0bf0c0 + depends: + - __osx >=10.13 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 1097626 + timestamp: 1756743061564 +- conda: https://prefix.dev/conda-forge/osx-arm64/pcre2-10.46-h7125dd6_0.conda + sha256: 5bf2eeaa57aab6e8e95bea6bd6bb2a739f52eb10572d8ed259d25864d3528240 + md5: 0e6e82c3cc3835f4692022e9b9cd5df8 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 835080 + timestamp: 1756743041908 +- conda: https://prefix.dev/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 8252 + timestamp: 1726802366959 +- conda: https://prefix.dev/conda-forge/linux-64/pulseaudio-client-17.0-h9a8bead_2.conda + sha256: 8a6729861c9813a756b0438c30bd271722fb3f239ded3afc3bf1cb03327a640e + md5: b6f21b1c925ee2f3f7fc37798c5988db + depends: + - __glibc >=2.17,<3.0.a0 + - dbus >=1.16.2,<2.0a0 + - libgcc >=14 + - libglib >=2.86.0,<3.0a0 + - libiconv >=1.18,<2.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - libsystemd0 >=257.7 + - libxcb >=1.17.0,<2.0a0 + constrains: + - pulseaudio 17.0 *_2 + license: LGPL-2.1-or-later + license_family: LGPL + size: 761857 + timestamp: 1757472971364 +- conda: https://prefix.dev/conda-forge/linux-64/sdl2-2.32.56-h54a6638_0.conda + sha256: 987ad072939fdd51c92ea8d3544b286bb240aefda329f9b03a51d9b7e777f9de + md5: cdd138897d94dc07d99afe7113a07bec + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libgl >=1.7.0,<2.0a0 + - sdl3 >=3.2.22,<4.0a0 + - libegl >=1.7.0,<2.0a0 + license: Zlib + size: 589145 + timestamp: 1757842881 +- conda: https://prefix.dev/conda-forge/osx-64/sdl2-2.32.56-h53ec75d_0.conda + sha256: 3f64f2cabdfe2f4ed8df6adf26a86bd9db07380cb8fa28d18a80040cc8b8b7d9 + md5: 0a8a18995e507da927d1f8c4b7f15ca8 + depends: + - __osx >=10.13 + - libcxx >=19 + - sdl3 >=3.2.22,<4.0a0 + license: Zlib + size: 740066 + timestamp: 1757842955775 +- conda: https://prefix.dev/conda-forge/osx-arm64/sdl2-2.32.56-h248ca61_0.conda + sha256: 704c5cae4bc839a18c70cbf3387d7789f1902828c79c6ddabcd34daf594f4103 + md5: 092c5b693dc6adf5f409d12f33295a2a + depends: + - libcxx >=19 + - __osx >=11.0 + - sdl3 >=3.2.22,<4.0a0 + license: Zlib + size: 542508 + timestamp: 1757842919681 +- conda: https://prefix.dev/conda-forge/win-64/sdl2-2.32.56-h5112557_0.conda + sha256: d17da21386bdbf32bce5daba5142916feb95eed63ef92b285808c765705bbfd2 + md5: 4cffbfebb6614a1bff3fc666527c25c7 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - sdl3 >=3.2.22,<4.0a0 + license: Zlib + size: 572101 + timestamp: 1757842925694 +- conda: https://prefix.dev/conda-forge/linux-64/sdl3-3.2.22-h68140b3_0.conda + sha256: 789ae811b7b93b01c2300461345027fd1a19a7a404e1b8729f58fbe81a82b3bc + md5: ebfddf2601e082193bb550924bbb9744 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - xorg-libxfixes >=6.0.1,<7.0a0 + - dbus >=1.16.2,<2.0a0 + - libegl >=1.7.0,<2.0a0 + - libudev1 >=257.7 + - libdrm >=2.4.125,<2.5.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - libxkbcommon >=1.11.0,<2.0a0 + - libusb >=1.0.29,<2.0a0 + - libgl >=1.7.0,<2.0a0 + - pulseaudio-client >=17.0,<17.1.0a0 + - xorg-libxscrnsaver >=1.2.4,<2.0a0 + - libunwind >=1.8.2,<1.9.0a0 + - wayland >=1.24.0,<2.0a0 + - liburing >=2.12,<2.13.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: Zlib + size: 1936633 + timestamp: 1756780211365 +- conda: https://prefix.dev/conda-forge/osx-64/sdl3-3.2.22-hc0b302d_0.conda + sha256: bc4b35801d55600deba29da19b8d1707db23d165b06fe900ff0ba07d628161e2 + md5: dcaf060cee2fb96259b989c44505d4bf + depends: + - libcxx >=19 + - __osx >=10.13 + - libusb >=1.0.29,<2.0a0 + - dbus >=1.16.2,<2.0a0 + license: Zlib + size: 1548166 + timestamp: 1756780255681 +- conda: https://prefix.dev/conda-forge/osx-arm64/sdl3-3.2.22-he22eeb8_0.conda + sha256: f4bebfe966e4df667887b06bea6539f2fde23bf3a89649f5b57b53716f1cc2d5 + md5: cd2b01e16daf07b77c3754bfdeb8095d + depends: + - __osx >=11.0 + - libcxx >=19 + - libusb >=1.0.29,<2.0a0 + - dbus >=1.16.2,<2.0a0 + license: Zlib + size: 1416196 + timestamp: 1756780255242 +- conda: https://prefix.dev/conda-forge/win-64/sdl3-3.2.22-h5112557_0.conda + sha256: 01d040f2ebe976a0b9cafc13e8b6fd2cf297afbcdec462a5e254cc8c261f70c5 + md5: ce2d3317d46b92ea361dd9178bc7df91 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libusb >=1.0.29,<2.0a0 + license: Zlib + size: 1521753 + timestamp: 1756780243694 +- conda: . + name: sdl_example + version: 0.1.0 + build: h9352c13_0 + subdir: win-64 + depends: + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - ucrt >=10.0.20348.0 + - sdl2 >=2.32.56,<3.0a0 + input: + hash: edfac7bd3233d95d1173e54bb2b8900757a662b8a553d89225c1a81ea98796af + globs: [] + package_build_source: + git: https://github.com/prefix-dev/pixi-build-testsuite?subdirectory=tests%2Fdata%2Fpixi_build%2Fcpp-with-path-to-source%2Fproject + branch: main + rev: 6f94028045df9c753596a3084ce6ca2df4bc25c5 +- conda: . + name: sdl_example + version: 0.1.0 + build: hbf21a9e_0 + subdir: linux-64 + depends: + - libstdcxx >=15 + - libgcc >=15 + - sdl2 >=2.32.56,<3.0a0 + input: + hash: edfac7bd3233d95d1173e54bb2b8900757a662b8a553d89225c1a81ea98796af + globs: [] + package_build_source: + git: https://github.com/prefix-dev/pixi-build-testsuite?subdirectory=tests%2Fdata%2Fpixi_build%2Fcpp-with-path-to-source%2Fproject + branch: main + rev: 6f94028045df9c753596a3084ce6ca2df4bc25c5 +- conda: . + name: sdl_example + version: 0.1.0 + build: hbf21a9e_0 + subdir: osx-64 + depends: + - libcxx >=21 + - sdl2 >=2.32.56,<3.0a0 + input: + hash: edfac7bd3233d95d1173e54bb2b8900757a662b8a553d89225c1a81ea98796af + globs: [] + package_build_source: + git: https://github.com/prefix-dev/pixi-build-testsuite?subdirectory=tests%2Fdata%2Fpixi_build%2Fcpp-with-path-to-source%2Fproject + branch: main + rev: 6f94028045df9c753596a3084ce6ca2df4bc25c5 +- conda: . + name: sdl_example + version: 0.1.0 + build: hbf21a9e_0 + subdir: osx-arm64 + depends: + - libcxx >=21 + - sdl2 >=2.32.56,<3.0a0 + input: + hash: edfac7bd3233d95d1173e54bb2b8900757a662b8a553d89225c1a81ea98796af + globs: [] + package_build_source: + git: https://github.com/prefix-dev/pixi-build-testsuite?subdirectory=tests%2Fdata%2Fpixi_build%2Fcpp-with-path-to-source%2Fproject + branch: main + rev: 6f94028045df9c753596a3084ce6ca2df4bc25c5 +- conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 + md5: 71b24316859acd00bdb8b38f5e2ce328 + constrains: + - vc14_runtime >=14.29.30037 + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + size: 694692 + timestamp: 1756385147981 +- conda: https://prefix.dev/conda-forge/win-64/vc-14.3-h41ae7f8_31.conda + sha256: cb357591d069a1e6cb74199a8a43a7e3611f72a6caed9faa49dbb3d7a0a98e0b + md5: 28f4ca1e0337d0f27afb8602663c5723 + depends: + - vc14_runtime >=14.44.35208 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 18249 + timestamp: 1753739241465 +- conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_31.conda + sha256: af4b4b354b87a9a8d05b8064ff1ea0b47083274f7c30b4eb96bc2312c9b5f08f + md5: 603e41da40a765fd47995faa021da946 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.44.35208 h818238b_31 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 682424 + timestamp: 1753739239305 +- conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.44.35208-h818238b_31.conda + sha256: 67b317b64f47635415776718d25170a9a6f9a1218c0f5a6202bfd687e07b6ea4 + md5: a6b1d5c1fc3cb89f88f7179ee6a9afe3 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.44.35208.* *_31 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + size: 113963 + timestamp: 1753739198723 +- conda: https://prefix.dev/conda-forge/linux-64/wayland-1.24.0-h3e06ad9_0.conda + sha256: ba673427dcd480cfa9bbc262fd04a9b1ad2ed59a159bd8f7e750d4c52282f34c + md5: 0f2ca7906bf166247d1d760c3422cb8a + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.7.0,<3.0a0 + - libffi >=3.4.6,<3.5.0a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + size: 330474 + timestamp: 1751817998141 +- conda: https://prefix.dev/conda-forge/linux-64/xkeyboard-config-2.45-hb9d3cd8_0.conda + sha256: a5d4af601f71805ec67403406e147c48d6bad7aaeae92b0622b7e2396842d3fe + md5: 397a013c2dc5145a70737871aaa87e98 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + size: 392406 + timestamp: 1749375847832 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + sha256: 51909270b1a6c5474ed3978628b341b4d4472cd22610e5f22b506855a5e20f67 + md5: db038ce880f100acc74dba10302b5630 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + size: 835896 + timestamp: 1741901112627 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxau-1.0.12-hb9d3cd8_0.conda + sha256: ed10c9283974d311855ae08a16dfd7e56241fac632aec3b92e3cfe73cff31038 + md5: f6ebe2cb3f82ba6c057dde5d9debe4f7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 14780 + timestamp: 1734229004433 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + sha256: 832f538ade441b1eee863c8c91af9e69b356cd3e9e1350fff4fe36cc573fc91a + md5: 2ccd714aa2242315acaf0a67faea780b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: MIT + license_family: MIT + size: 32533 + timestamp: 1730908305254 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb9d3cd8_0.conda + sha256: 6b250f3e59db07c2514057944a3ea2044d6a8cdde8a47b6497c254520fade1ee + md5: 8035c64cb77ed555e3f150b7b3972480 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + size: 19901 + timestamp: 1727794976192 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 + md5: febbab7d15033c913d53c7a2c102309d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + size: 50060 + timestamp: 1727752228921 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxfixes-6.0.1-hb9d3cd8_0.conda + sha256: 2fef37e660985794617716eb915865ce157004a4d567ed35ec16514960ae9271 + md5: 4bdb303603e9821baf5fe5fdff1dc8f8 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + size: 19575 + timestamp: 1727794961233 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 + md5: 96d57aba173e878a2089d5638016dc5e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + size: 33005 + timestamp: 1734229037766 +- conda: https://prefix.dev/conda-forge/linux-64/xorg-libxscrnsaver-1.2.4-hb9d3cd8_0.conda + sha256: 58e8fc1687534124832d22e102f098b5401173212ac69eb9fd96b16a3e2c8cb2 + md5: 303f7a0e9e0cd7d250bb6b952cecda90 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: MIT + license_family: MIT + size: 14412 + timestamp: 1727899730073 +- conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + size: 567578 + timestamp: 1742433379869 diff --git a/tests/data/pixi_build/cpp-with-git-source/pixi.toml b/tests/data/pixi_build/cpp-with-git-source/pixi.toml new file mode 100644 index 0000000..2ed93a0 --- /dev/null +++ b/tests/data/pixi_build/cpp-with-git-source/pixi.toml @@ -0,0 +1,39 @@ +[workspace] +channels = ["https://prefix.dev/conda-forge"] +platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] +preview = ["pixi-build"] + +[dependencies] +# Define a dependency on ourselves. This will invoke the build backend to build +# the C++ code and install the executable in an environment ready to be used. +sdl_example = { path = "." } + +[tasks.start] +cmd = "sdl_example" +description = "A tasks to run the executable that is build by the package section." + +[tasks] +test = "sdl_example -h" + +[package] +authors = ["Bas Zalmstra "] +description = "Showcases how to create a simple C++ executable with Pixi" +name = "sdl_example" +version = "0.1.0" + +[package.build.source] +branch = "main" +git = "https://github.com/prefix-dev/pixi-build-testsuite.git" +subdirectory = "tests/data/pixi_build/cpp-with-path-to-source/project" + +[package.build.backend] +channels = [ + "https://prefix.dev/pixi-build-backends", + "https://prefix.dev/conda-forge", +] +name = "pixi-build-cmake" +version = "*" + +[package.host-dependencies] +# This ensures that SDL2 is available at build time. +sdl2 = ">=2.26.5,<3.0" diff --git a/tests/integration_python/conftest.py b/tests/integration_python/conftest.py index 3d55c06..9c9e220 100644 --- a/tests/integration_python/conftest.py +++ b/tests/integration_python/conftest.py @@ -1,6 +1,8 @@ import json import os import shutil +import subprocess +from dataclasses import dataclass from pathlib import Path from typing import Any, cast @@ -150,6 +152,7 @@ def _validate_artifact_sources() -> None: @pytest.fixture(scope="session", autouse=True) def load_dotenv() -> None: dotenv.load_dotenv(override=True) + dotenv.load_dotenv(override=True, dotenv_path=Path(__file__).parents[2].joinpath(".env.ci")) _validate_artifact_sources() @@ -334,3 +337,81 @@ def multiple_versions_channel_1(channels: Path) -> str: @pytest.fixture def target_specific_channel_1(channels: Path) -> str: return channels.joinpath("target_specific_channel_1").as_uri() + + +@dataclass +class LocalGitRepo: + path: Path + main_rev: str + other_feature_rev: str + tag: str + + +@pytest.fixture +def local_cpp_git_repo( + pixi: Path, + build_data: Path, + tmp_path_factory: pytest.TempPathFactory, +) -> LocalGitRepo: + """ + Create a local git repository mirroring cpp-with-path-to-source so tests can + exercise git sources without touching the network. + """ + + source_root = build_data.joinpath("cpp-with-path-to-source") + repo_root = tmp_path_factory.mktemp("git-repo") + repo_path = repo_root.joinpath("repo") + shutil.copytree(source_root, repo_path) + + marker = repo_path.joinpath("project", "LOCAL_MARKER.txt") + marker.write_text("local git fixture marker\n", encoding="utf-8") + + readme_path = repo_path.joinpath("README.md") + + def run_git(*args: str) -> str: + result = subprocess.run( + [str(pixi), "run", "git", *args], + cwd=repo_path, + capture_output=True, + text=True, + ) + if result.returncode != 0: + raise RuntimeError( + "git command failed ({}):\nstdout: {}\nstderr: {}".format( + " ".join(args), result.stdout, result.stderr + ) + ) + return result.stdout.strip() + + run_git("init", "-b", "main") + run_git("config", "user.email", "pixi-tests@example.com") + run_git("config", "user.name", "Pixi Build Tests") + run_git("add", ".") + run_git("commit", "-m", "Initial commit") + + run_git("checkout", "-b", "other-feature") + readme_path.write_text( + readme_path.read_text(encoding="utf-8") + "\nLocal change on other-feature branch\n", + encoding="utf-8", + ) + run_git("add", readme_path.relative_to(repo_path).as_posix()) + run_git("commit", "-m", "Add branch change") + other_feature_rev = run_git("rev-parse", "HEAD") + + run_git("checkout", "main") + readme_path.write_text( + readme_path.read_text(encoding="utf-8") + "\nLocal change on main\n", + encoding="utf-8", + ) + run_git("add", readme_path.relative_to(repo_path).as_posix()) + run_git("commit", "-m", "Update main") + main_rev = run_git("rev-parse", "HEAD") + + run_git("tag", "fixture-v1") + + return LocalGitRepo( + path=repo_path, + main_rev=main_rev, + other_feature_rev=other_feature_rev, + tag="fixture-v1", + ) diff --git a/tests/integration_python/test_build.py b/tests/integration_python/test_build.py index 5c4b72e..7f96ce0 100644 --- a/tests/integration_python/test_build.py +++ b/tests/integration_python/test_build.py @@ -1,11 +1,15 @@ +import json import shutil +from typing import Any from pathlib import Path import pytest import tomli_w import tomllib +import yaml from .common import CURRENT_PLATFORM, ExitCode, Workspace, verify_cli_command +from .conftest import LocalGitRepo def test_build_conda_package( @@ -536,12 +540,80 @@ def test_extra_args(pixi: Path, build_data: Path, tmp_pixi_workspace: Path) -> N assert target_dir.joinpath("src", "mybuilddir", "build.ninja").is_file() +def _git_source_entries(lock_file: Path) -> list[dict[str, Any]]: + data = yaml.safe_load(lock_file.read_text()) + + def iter_entries() -> Any: + yield from data.get("packages", []) + + for env_cfg in data.get("environments", {}).values(): + for platform_packages in env_cfg.get("packages", {}).values(): + yield from platform_packages + + serialized_sources: list[dict[str, Any]] = [] + for entry in iter_entries(): + if isinstance(entry, dict) and entry.get("conda") == ".": + package_build_source = entry.get("package_build_source") + if package_build_source is not None: + serialized_sources.append(package_build_source) + + assert serialized_sources, ( + "expected at least one git package with package_build_source in pixi.lock" + ) + return serialized_sources + + +def extract_git_sources(lock_file: Path) -> list[str]: + return sorted(json.dumps(source, sort_keys=True) for source in _git_source_entries(lock_file)) + + +def configure_local_git_source( + workspace_dir: Path, + repo: LocalGitRepo, + *, + rev: str | None = None, + branch: str | None = None, + tag: str | None = None, + subdirectory: str = "project", +) -> None: + manifest_path = workspace_dir / "pixi.toml" + manifest = tomllib.loads(manifest_path.read_text()) + source = manifest.setdefault("package", {}).setdefault("build", {}).setdefault("source", {}) + for key in ("branch", "tag", "rev"): + source.pop(key, None) + source["git"] = "file://" + str(repo.path.as_posix()) + source["subdirectory"] = subdirectory + if rev is not None: + source["rev"] = rev + if branch is not None: + source["branch"] = branch + if tag is not None: + source["tag"] = tag + manifest_path.write_text(tomli_w.dumps(manifest)) + + +def prepare_cpp_git_workspace( + workspace_dir: Path, + build_data: Path, + repo: LocalGitRepo, + **source_kwargs: Any, +) -> None: + project = build_data.joinpath("cpp-with-git-source") + + # Remove existing .pixi folders + shutil.rmtree(project.joinpath(".pixi"), ignore_errors=True) + + # Copy to workspace + shutil.copytree(project, workspace_dir, dirs_exist_ok=True) + + configure_local_git_source(workspace_dir, repo, **source_kwargs) + + def test_target_specific_dependency( pixi: Path, build_data: Path, tmp_pixi_workspace: Path, target_specific_channel_1: str ) -> None: """ Check that target-specific dependencies are not solved for on other targets. - Regression test for prefix-dev/pixi#4542. """ project = "target-specific" test_data = build_data.joinpath(project) @@ -557,3 +629,247 @@ def test_target_specific_dependency( verify_cli_command( [pixi, "build", "--manifest-path", manifest_path, "--output-dir", tmp_pixi_workspace], ) + + +@pytest.mark.slow +def test_git_path_build( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + """ + Test git path in `[package.build.source]` using a local repository. + """ + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, rev=local_cpp_git_repo.main_rev + ) + + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + verify_cli_command( + [ + pixi, + "build", + "-v", + "--manifest-path", + tmp_pixi_workspace, + "--output-dir", + tmp_pixi_workspace, + ], + ) + + built_packages = list(tmp_pixi_workspace.glob("*.conda")) + assert len(built_packages) == 1 + + +@pytest.mark.slow +def test_git_path_lock_behaviour( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + """Exercise git source locking behaviour when switching manifest branches.""" + + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, rev=local_cpp_git_repo.main_rev + ) + + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + lock_path = tmp_pixi_workspace / "pixi.lock" + initial_sources = extract_git_sources(lock_path) + + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace, "--locked"], + ) + assert extract_git_sources(lock_path) == initial_sources + + configure_local_git_source(tmp_pixi_workspace, local_cpp_git_repo, branch="other-feature") + + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace, "--locked"], + expected_exit_code=ExitCode.FAILURE, + ) + assert extract_git_sources(lock_path) == initial_sources + + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + new_sources = extract_git_sources(lock_path) + assert new_sources != initial_sources + + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace, "--locked"], + ) + assert extract_git_sources(lock_path) == new_sources + + +@pytest.mark.slow +def test_git_path_lock_update_preserves_git_source( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + """Ensure updating another dependency leaves git package_build_source untouched.""" + + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, rev=local_cpp_git_repo.main_rev + ) + + lock_path = tmp_pixi_workspace / "pixi.lock" + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + initial_sources = extract_git_sources(lock_path) + + verify_cli_command( + [ + pixi, + "update", + "-v", + "--manifest-path", + tmp_pixi_workspace, + "sdl2", + ], + ) + + assert extract_git_sources(lock_path) == initial_sources + + +@pytest.mark.slow +def test_git_path_lock_branch_records_branch_metadata( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, branch="other-feature" + ) + + lock_path = tmp_pixi_workspace / "pixi.lock" + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + entries = _git_source_entries(lock_path) + assert {entry.get("branch") for entry in entries} == {"other-feature"} + assert {entry.get("rev") for entry in entries} == {local_cpp_git_repo.other_feature_rev} + assert all("tag" not in entry for entry in entries) + assert {entry.get("subdir") for entry in entries} == {"project"} + + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace, "--locked"], + ) + + +@pytest.mark.slow +def test_git_path_lock_tag_records_tag_metadata( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, tag=local_cpp_git_repo.tag + ) + + lock_path = tmp_pixi_workspace / "pixi.lock" + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + entries = _git_source_entries(lock_path) + assert {entry.get("tag") for entry in entries} == {local_cpp_git_repo.tag} + assert {entry.get("rev") for entry in entries} == {local_cpp_git_repo.main_rev} + assert all("branch" not in entry for entry in entries) + assert {entry.get("subdir") for entry in entries} == {"project"} + + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace, "--locked"], + ) + + +@pytest.mark.slow +def test_git_path_lock_rev_marks_explicit_rev( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, rev=local_cpp_git_repo.main_rev + ) + + lock_path = tmp_pixi_workspace / "pixi.lock" + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + entries = _git_source_entries(lock_path) + assert {entry.get("rev") for entry in entries} == {local_cpp_git_repo.main_rev} + assert {entry.get("explicit_rev") for entry in entries} == {True} + + +@pytest.mark.slow +def test_git_path_lock_consistent_across_platforms( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, rev=local_cpp_git_repo.main_rev + ) + + lock_path = tmp_pixi_workspace / "pixi.lock" + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + serialized = extract_git_sources(lock_path) + assert len(set(serialized)) == 1 + + +@pytest.mark.slow +def test_git_path_lock_detects_manual_rev_change( + pixi: Path, + build_data: Path, + tmp_pixi_workspace: Path, + local_cpp_git_repo: LocalGitRepo, +) -> None: + prepare_cpp_git_workspace( + tmp_pixi_workspace, build_data, local_cpp_git_repo, rev=local_cpp_git_repo.main_rev + ) + + lock_path = tmp_pixi_workspace / "pixi.lock" + verify_cli_command( + [pixi, "lock", "-v", "--manifest-path", tmp_pixi_workspace], + ) + + lock_data = yaml.safe_load(lock_path.read_text()) + + def mutate(node: Any) -> None: + if isinstance(node, dict): + if node.get("conda") == "." and "package_build_source" in node: + node["package_build_source"]["rev"] = local_cpp_git_repo.other_feature_rev + for value in node.values(): + mutate(value) + elif isinstance(node, list): + for item in node: + mutate(item) + + mutate(lock_data) + lock_path.write_text(yaml.safe_dump(lock_data)) + + verify_cli_command( + [pixi, "install", "-v", "--manifest-path", tmp_pixi_workspace, "--locked"], + expected_exit_code=ExitCode.FAILURE, + )