Mon 13 Jan 2025

babel

TODO opam-repo maps [2/3]

  1. DONE https://github.com/mtelvers/pacman2opam/

    1. 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
      
  2. DONE https://github.com/jonludlam/brew-opam-repository/

  3. TODO https://github.com/mtelvers/rpm2opam/

PubGrub

  1. DONE Spec-ulation

    what is a version?

  2. 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

  3. exotic functionality

    https://github.com/pubgrub-rs/pubgrub/issues/39

    1. DONE optional dependencies

      1. TODO optional dependencies are the same as features, update the paper to reflect this

        also add dependencies added by feature to illustrated example

    2. multiple versions

      1. 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).

      2. DONE Figure out if these proxy packages pollute the error messages

        No, we can filter them out.

    3. DONE disjunctions

      Disjunctions use proxy packages as defined in multiple versions

    4. 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.

    5. DONE upgrades

      Solves are one-shot. We could make a version ordering to prefer the current version first.

    6. hyperres-pubgrub

      1. DONE fig3 resolution

      2. DONE fig4 diamond problem

      3. KILL fig5 upgrades

      4. DONE fig6 arch

      5. DONE fig7 algebra

        • use proxies for disjunctions (conflicts)
        • can’t express negations
      6. DONE fig8 multi-version

      7. DONE fig10 features

    7. TODO multi-version optional dependencies

    8. other functionality

      1. replacements

      2. pre-release

        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.

      3. lockfiles

        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]).

      4. public and private packages

  4. 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

  1. DONE can we use PubGrub to model exotic functionality

    yes

  2. 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.

    1. TODO create a cross-ecosystem PubGrub dependency provider

[1]
R. Gibb et al., “Solving Package Management via Hypergraph Dependency Resolution.”