§babel
§TODO opam-repo maps [2/3]
DONE https://github.com/mtelvers/pacman2opam/
it seems like firefox doesn’t install
_build/default/bin/main.exe --repo /dev/shm/packages pacman-firefox [ERROR] No solution Can't find all required versions. Selected: pacman-acl.2.3.2-1 pacman-adobe-source-code-pro-fonts.2.042u+1.062i+1.026vf-2 pacman-adwaita-cursors.47.0-1 pacman-adwaita-icon-theme.47.0-1 pacman-adwaita-icon-theme-legacy.46.2-3 pacman-alsa-lib.1.2.13-1 pacman-alsa-topology-conf.1.2.5.1-4 pacman-alsa-ucm-conf.1.2.13-2 pacman-aom.3.11.0-1 pacman-at-spi2-core.2.54.1-1 pacman-attr.2.5.2-1 pacman-audit.4.0.2-3 pacman-avahi.1_0.8+r194+g3f79789-3 pacman-bash.5.2.037-1 pacman-brotli.1.1.0-3 pacman-bzip2.1.0.8-6 pacman-ca-certificates.20240618-1 pacman-ca-certificates-mozilla.3.107-1 pacman-ca-certificates-utils.20240618-1 pacman-cairo.1.18.2-2 pacman-cantarell-fonts.1_0.303.1-2 pacman-coreutils.9.5-2 pacman-cryptsetup.2.7.5-2 pacman-curl.8.11.1-3 pacman-dav1d.1.5.0-1 pacman-dbus.1.16.0-1 pacman-dbus-broker.36-4 pacman-dbus-broker-units.36-4 pacman-dbus-units.36-4 pacman-dconf.0.40.0-3 pacman-default-cursors.3-1 pacman-desktop-file-utils.0.28-1 pacman-device-mapper.2.03.29-1 pacman-duktape.2.7.0-7 pacman-e2fsprogs.1.47.2-1 pacman-expat.2.6.4-1 pacman-ffmpeg.2_7.1-5 pacman-fftw.3.3.10-7 pacman-file.5.46-3 pacman-filesystem.2024.11.21-1 pacman-findutils.4.10.0-2 pacman-firefox.134.0.1-1 pacman-flac.1.4.3-2 pacman-fontconfig.2_2.15.0-2 pacman-freetype2.2.13.3-1 pacman-fribidi.1.0.16-1 pacman-gcc-libs.14.2.1+r134+gab884fffe3fc-2 pacman-gdbm.1.24-1 pacman-gdk-pixbuf2.2.42.12-2 pacman-giflib.5.2.2-1 pacman-glib-networking.1_2.80.1-1 pacman-glib2.2.82.4-2 pacman-glibc.2.40+r16+gaa533d58ff-2 pacman-glslang.15.0.0-2 pacman-gmp.6.3.0-2 pacman-gnutls.3.8.8-1 pacman-gperftools.2.16-1 pacman-graphite.1_1.3.14-4 pacman-grep.3.11-1 pacman-gsettings-desktop-schemas.47.1-1 pacman-gsettings-system-schemas.47.1-1 pacman-gsm.1.0.22-2 pacman-gtk-update-icon-cache.1_4.16.12-1 pacman-gtk3.1_3.24.43-4 pacman-gzip.1.13-4 pacman-harfbuzz.10.2.0-1 pacman-hicolor-icon-theme.0.18-1 pacman-hidapi.0.14.0-3 pacman-highway.1.2.0-1 pacman-hwdata.0.391-1 pacman-iana-etc.20241206-1 pacman-icu.75.1-2 pacman-iso-codes.4.17.0-1 pacman-jack.1 pacman-jbigkit.2.1-8 pacman-json-c.0.18-1 pacman-json-glib.1.10.6-1 pacman-kbd.2.7.1-1 pacman-keyutils.1.6.3-3 pacman-kmod.33-3 pacman-krb5.1.21.3-1 pacman-l-smash.2.14.5-4 pacman-lame.3.100-5 pacman-lcms2.2.16-1 pacman-libacl_so.1-64 pacman-libasound_so.2-64 pacman-libass.0.17.3-1 pacman-libass_so.9-64 pacman-libasyncns.1_0.8+r3+g68cd5af-3 pacman-libattr_so.1-64 pacman-libaudit_so.1-64 pacman-libavc1394.0.5.4-6 pacman-libblkid_so.1-64 pacman-libbluray.1.3.4-2 pacman-libbluray_so.2-64 pacman-libbpf.1.5.0-1 pacman-libbrotlidec_so.1-64 pacman-libbs2b.3.1.0-9 pacman-libbs2b_so.0-64 pacman-libbz2_so.1.0-64 pacman-libcap.2.71-1 pacman-libcap-ng.0.8.5-3 pacman-libcap-ng_so.0-64 pacman-libcap_so.2-64 pacman-libcloudproviders.0.3.6-1 pacman-libcolord.1.4.7-2 pacman-libcom_err_so.2-64 pacman-libcrypt_so.2-64 pacman-libcrypto_so.3-64 pacman-libcryptsetup_so.12-64 pacman-libcups.2_2.4.11-2 pacman-libcurl_so.4-64 pacman-libdaemon.0.14-6 pacman-libdatrie.0.2.13-4 pacman-libdav1d_so.7-64 pacman-libdbus-1_so.3-64 pacman-libdevmapper_so.1.02-64 pacman-libdovi.3.3.1-1 pacman-libdovi_so.3-64 pacman-libdrm.2.4.124-1 pacman-libdvdnav.6.1.1-2 pacman-libdvdread.6.1.3-2 pacman-libedit.20240808_3.1-1 pacman-libegl.1 pacman-libelf.0.192-2 pacman-libepoxy.1.5.10-3 pacman-libevent.2.1.12-4 pacman-libexpat_so.1-64 pacman-libFLAC_so.12-64 pacman-libffi.3.4.6-1 pacman-libffi_so.8-64 pacman-libfftw3_so.3-64 pacman-libfreetype_so.6-64 pacman-libgcrypt.1.11.0-2 pacman-libgdbm_so.6-64 pacman-libgio-2_0_so.0-64 pacman-libgl.1 pacman-libglib-2_0_so.0-64 pacman-libglvnd.1.7.0-1 pacman-libgobject-2_0_so.0-64 pacman-libgpg-error.1.51-1 pacman-libgraphite2_so.3-64 pacman-libgssapi_krb5_so.2-64 pacman-libharfbuzz_so.0-64 pacman-libice.1.1.2-1 pacman-libidn2.2.3.7-1 pacman-libidn2_so.0-64 pacman-libiec61883.1.2.0-8 pacman-libjack_so.0-64 pacman-libjpeg-turbo.3.1.0-1 pacman-libjpeg_so.8-64 pacman-libjson-c_so.5-64 pacman-libjxl.0.11.1-1 pacman-libjxl_so.0.11-64 pacman-libkeyutils_so.1-64 pacman-libkrb5_so.3-64 pacman-liblcms2_so.2-64 pacman-libldap.2.6.9-1 pacman-liblsmash_so.2-64 pacman-liblzma_so.5-64 pacman-libmagic_so.1-64 pacman-libmodplug.0.8.9.0-6 pacman-libmount_so.1-64 pacman-libmp3lame_so.0-64 pacman-libmpg123_so.0-64 pacman-libncursesw_so.6-64 pacman-libnghttp2.1.64.0-1 pacman-libnghttp2_so.14-64 pacman-libnghttp3.1.7.0-1 pacman-libnghttp3_so.9-64 pacman-libnsl.2.0.1-1 pacman-libogg.1.3.5-2 pacman-libogg_so.0-64 pacman-libopenmpt.0.7.12-1 pacman-libopenmpt_so.0-64 pacman-libopus_so.0-64 pacman-libp11-kit.0.25.5-1 pacman-libp11-kit_so.0-64 pacman-libpam_misc_so.0-64 pacman-libpam_so.0-64 pacman-libpciaccess.0.18.1-2 pacman-libpgm.5.3.128-3 pacman-libplacebo.7.349.0-3 pacman-libplacebo_so.349-64 pacman-libpng.1.6.45-1 pacman-libproxy.0.5.9-1 pacman-libpsl.0.21.5-2 pacman-libpsl_so.5-64 pacman-libpulse.17.0+r43+g3e2bb8a1e-1 pacman-librav1e_so.0.7-64 pacman-libraw1394.2.1.2-4 pacman-libreadline_so.8-64 pacman-librsvg.2_2.59.2-1 pacman-librsvg-2_so.2-64 pacman-librubberband_so.3-64 pacman-libsamplerate.0.2.2-3 pacman-libsamplerate_so.0-64 pacman-libsasl.2.1.28-5 pacman-libseccomp.2.5.5-4 pacman-libseccomp_so.2-64 pacman-libshaderc_shared_so.1-64 pacman-libsm.1.2.5-1 pacman-libsndfile.1.2.2-2 pacman-libsndfile_so.1-64 pacman-libsodium.1.0.20-1 pacman-libsoup3.3.6.3-1 pacman-libsoxr.0.1.3-4 pacman-libspeexdsp_so.1-64 pacman-libss_so.2-64 pacman-libssh.0.11.1-1 pacman-libssh2.1.11.1-1 pacman-libssh2_so.1-64 pacman-libssl_so.3-64 pacman-libstemmer.2.2.0-2 pacman-libsysprof-capture.47.2-1 pacman-libsystemd_so.0-64 pacman-libtasn1.4.19.0-2 pacman-libthai.0.1.29-3 pacman-libtheora.1.1.1-6 pacman-libtiff.4.7.0-1 pacman-libtirpc.1.3.6-1 pacman-libudev_so.1-64 pacman-libunibreak.6.1-1 pacman-libunistring.1.3-1 pacman-libunistring_so.5-64 pacman-libunwind.1.8.1-3 pacman-libusb.1.0.27-1 pacman-libuuid_so.1-64 pacman-libva.2.22.0-1 pacman-libva-drm_so.2-64 pacman-libva-x11_so.2-64 pacman-libva_so.2-64 pacman-libvdpau.1.5-3 pacman-libverto.0.3.2-5 pacman-libverto-module-base.1 pacman-libverto_so.1-64 pacman-libvidstab_so.1.2-64 pacman-libvorbis.1.3.7-3 pacman-libvorbis_so.0-64 pacman-libvorbisenc_so.2-64 pacman-libvpx.1.15.0-1 pacman-libvpx_so.9-64 pacman-libvulkan_so.1-64 pacman-libwebp.1.5.0-1 pacman-libx11.1.8.10-1 pacman-libx264_so.164-64 pacman-libx265_so.212-64 pacman-libxau.1.0.12-1 pacman-libxcb.1.17.0-1 pacman-libxcomposite.0.4.6-2 pacman-libxcrypt.4.4.37-1 pacman-libxcursor.1.2.3-1 pacman-libxdamage.1.1.6-2 pacman-libxdmcp.1.1.5-1 pacman-libxext.1.3.6-1 pacman-libxfixes.6.0.1-2 pacman-libxft.2.3.8-2 pacman-libxi.1.8.2-1 pacman-libxinerama.1.1.5-2 pacman-libxkbcommon.1.7.0-2 pacman-libxml2.2.13.5-2 pacman-libxrandr.1.5.4-1 pacman-libxrender.0.9.12-1 pacman-libxshmfence.1.3.3-1 pacman-libxss.1.2.4-2 pacman-libxt.1.3.1-1 pacman-libxtst.1.2.5-1 pacman-libxv.1.0.13-1 pacman-libxvidcore_so.4-64 pacman-libxxf86vm.1.1.6-1 pacman-libz_so.1-64 pacman-libzimg_so.2-64 pacman-libzmq_so.5-64 pacman-libzstd_so.1-64 pacman-linux-api-headers.6.10-1 pacman-llvm-libs.19.1.6-3 pacman-lm_sensors.1_3.6.0.r41.g31d1f125-3 pacman-lmdb.0.9.33-1 pacman-lz4.1_1.10.0-2 pacman-lzo.2.10-5 pacman-mime-types.1 pacman-mpdecimal.4.0.0-2 pacman-mpg123.1.32.10-1 pacman-ncurses.6.5-3 pacman-nettle.3.10.1-1 pacman-nspr.4.36-1 pacman-nss.3.107-1 pacman-ocl-icd.2.3.2-2 pacman-onevpl.1 pacman-opencore-amr.0.1.6-2 pacman-opengl-driver.1 pacman-openjpeg2.2.5.3-1 pacman-openssl.3.4.0-1 pacman-opus.1.5.2-1 pacman-p11-kit.0.25.5-1 pacman-pam.1.7.0-1 pacman-pambase.20230918-2 pacman-pango.1_1.54.0-1 pacman-pcre2.10.44-1 pacman-pixman.0.44.2-1 pacman-popt.1.19-2 pacman-portaudio.1_19.7.0-3 pacman-python.3.13.1-1 pacman-rav1e.0.7.1-1 pacman-readline.8.2.013-1 pacman-rubberband.4.0.0-1 pacman-sdl2.2.30.11-1 pacman-sed.4.9-3 pacman-sh.1 pacman-shaderc.2024.3-2 pacman-shadow.4.16.0-1 pacman-shared-mime-info.2.4-1 pacman-snappy.1.2.1-2 pacman-speex.1.2.1-2 pacman-speexdsp.1.2.1-2 pacman-spirv-tools.2024.4.rc1-1 pacman-sqlite.3.47.2-1 pacman-srt.1.5.4-1 pacman-svt-av1.2.3.0-1 pacman-systemd.257.2-2 pacman-systemd-libs.257.2-2 pacman-tinysparql.3.8.2-2 pacman-ttf-font.1 pacman-ttf-input.20220502-6 pacman-tzdata.2024b-2 pacman-util-linux.2.40.4-1 pacman-util-linux-libs.2.40.4-1 pacman-v4l-utils.1.28.1-2 pacman-vapoursynth.R70-2 pacman-vid_stab.1.1.1-2 pacman-vmaf.3.0.0-1 pacman-vulkan-icd-loader.1.4.303-1 pacman-wayland.1.23.1-1 pacman-x264.3_0.164.r3108.31e19f9-2 pacman-x265.4.0-1 pacman-xcb-proto.1.17.0-3 pacman-xkeyboard-config.2.43-1 pacman-xorg-xprop.1.2.8-1 pacman-xorgproto.2024.1-2 pacman-xvidcore.1.3.7-3 pacman-xxhash.0.8.3-1 pacman-xz.5.6.3-1 pacman-zeromq.4.3.5-2 pacman-zimg.3.0.5-1 pacman-zlib.1_1.3.1-2 pacman-zstd.1.5.6-1 pacman-firefox pacman-firefox - pacman-libvpl -> (problem) Rejected candidates: pacman-libvpl.2.14.0-1: Requires pacman-onevpl conflict with all versions - pacman-mailcap -> (problem) Rejected candidates: pacman-mailcap.2.1.54-2: Requires pacman-mime-types conflict with all versions - pacman-mesa -> pacman-mesa.1_24.3.3-2 pacman-opengl-driver 1 requires = 1_24.3.3-2 - pacman-pipewire-jack -> (problem) Rejected candidates: pacman-pipewire-jack.1_1.2.7-1: Requires pacman-jack conflict with all versions
§PubGrub
DONE Spec-ulation
what is a version?
state of the project
hasn’t had a release in 4 years, but the maintainer’s employer is kind of supporting them and uv using it https://github.com/pubgrub-rs/pubgrub/issues/128#issuecomment-1566377638
exotic functionality
https://github.com/pubgrub-rs/pubgrub/issues/39
-
- https://github.com/pubgrub-rs/advanced_dependency_providers/blob/main/optional-deps/src/optional_deps.rs
- https://rust-lang.zulipchat.com/#narrow/channel/260232-t-cargo.2FPubGrub/topic/feature.20resolution
- https://rust-lang.zulipchat.com/#narrow/channel/260232-t-cargo.2FPubGrub/topic/So.20what.20to.20do.20next.3F/near/212812259
TODO optional dependencies are the same as features, update the paper to reflect this
also add dependencies added by feature to illustrated example
-
I’m trying to decide whether their solution or my solution is more elegant:
I like their ‘bucket’ approach instead of my conflict relationships approach. In their approach conflicts between different versions of the same package are implicit. To support multi-versions you store different versions under different names. For rust, this is elegant: you just move the major version number into the package name. This is similar to [[*$$\[https://www.youtube.com/watch?v=oyLBGkS5ICk$$Spec − ulation\]][Spec-ulation]] approach of putting breaking functionality under a new namespace.
I think their ‘proxies’ solution to depending on multiple different package names is less elegant. I wonder if there’s a good reason not to allow different package names in a dependency? I suppose restricting to solve for a single one without the conflicts between versions is no longer possible. We get around this by keeping track of the resolved graph in the SAT problem, but this adds complexity. So maybe their approach is better.
I also think we jump through hoops in order to extract the resolved graph from the SAT problem, but we can actually just reassemble this from the set of package solutions (and if there’s multiple possible interpretations, which is possible in the multi-version scenario, then each interpretation is equally valid).
DONE Figure out if these proxy packages pollute the error messages
No, we can filter them out.
DONE disjunctions
Disjunctions use proxy packages as defined in multiple versions
DONE conflicts
Conflicts are implicit between packages with the same name. Is this a problem for opam? We could also the API to include them https://github.com/pubgrub-rs/pubgrub/issues/122.
DONE upgrades
Solves are one-shot. We could make a version ordering to prefer the current version first.
-
DONE fig3 resolution
DONE fig4 diamond problem
KILL fig5 upgrades
DONE fig6 arch
DONE fig7 algebra
- use proxies for disjunctions (conflicts)
- can’t express negations
DONE fig8 multi-version
DONE fig10 features
TODO multi-version optional dependencies
other functionality
-
We could need to implement version’s for each ecosystem, e.g. for Debian and Opam: https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-version.
-
Uv has lockfiles which take platforms as parameters https://github.com/astral-sh/uv/blob/54bb5a38a41cbb7e3b02c457c37287996c43a65e/docs/concepts/projects/layout.md#the-lockfile It would be interesting to see if we could encode parameters like platforms as packages (section 5.1.5 [1]).
-
DONE read Online/offline continuous integration
While Nix is reproducible, it comes at a large cost in computation and disk space. This adherence to absolute reproducibility also makes it difficult to operate offline. Babel could restrict solving to the local cache when offline using a PubGrub OfflineDependencyProvider.
§what is the novelty of babel?
- cross-ecosystem solves
- deduplicating packages
- fast solving with understandable error messages
§research questions
DONE can we use PubGrub to model exotic functionality
yes
TODO can we create a common format for cross-ecosystem dependencies including boolean algebra
Or maybe we should just write ecosystem-specific parsers to the solver. Next: get PubGrub to run on opam-giga-repository.
TODO create a cross-ecosystem PubGrub dependency provider