Notes on Pijul

Wiþ Rough Edges

Notes on Pijul

Abstract

Pijul, a patch-based decentralized version control system (DVCS), is pitched as perhaps ð successor to Git. Pijul shares a lot in common wiþ darcs—which isn’t a bad þing as darcs has been a steady DVCS for many. Ð sad part ðo is while development plods along in darcs, darcs is usually mentioned as merely a footnote & precursor to Pijul mentions. darcs is still doing some þings better at present. Ðat isn’t to say, you should not try Pijul, you should, but check out darcs too. (Really I wish I could merge concepts between ð two)

Second þoughts

I þink I misunderstood Pijul’s outlook & goals to an extent. Pijul wishes to keep its binary having a minimal featureset—which is different ðan Darcs & definitely different ðan Git. Big, I missed ðat Pijul will pick up pijul-* as scripts it can run which means it wants to be scripted which can overcome my minor CLI API squabbles & technically even ð missing rebase can be added (ðo I tend to þink it a core feature for working wiþ patches). Oðer parts like adding extra hooks, etc. are still relevant.

As far as ð later-mentioned pijul amend & pijul obliterate ‘situation’, I added ðese to my Nix configuration

{
  home.packages = with pkgs; [
    pijul
    (writeShellApplication {
      name = "pijul-amend";
      runtimeInputs = [ pijul ];
      text = /* bash */ ''
        pijul record --amend "$@"
      '';
    })
    (writeShellApplication {
      name = "pijul-obliterate";
      runtimeInputs = [ pijul ];
      text = /* bash */ ''
        pijul unrecord --reset "$@"
      '';
    })
  ];
}

Features darcs does better

  • darcs amend is shorter ðan pijul record --amend & as someþing I’ve been using for a while, wiþout aliases like git, you can’t fix ð situation (tools like git-branchless allow you to use ðose idioms from Git)
  • darcs obliterate is shorter ðan pijul unrecord --reset (similar to above)—but particularly ð interactive mode for clearing out accidental pushed record (usually a bad practice, but if no/few collaborators & shortly after it can make an easier to follow patchset ðan a correction patch). Of note is ðis had a tendency to fail even when using it when trying to push atop; binary would hang & I’m unsure what happened.
  • darcs rebase to pop/push + fixup or test previous commits in an interactive manner; Pijul has noþing ergonomic to deal wiþ ðis common situation (maybe ðere is a channel route, but it wasn’t immediately obvious to me). I brought ðis one up on ðeir forum, but it seems ðere just really isn’t a solution to easily manipulate ð history as needed (vs. darcs promoting making a few commits prefixed wiþ WIP: while you work around your issues & fixup as needed… especially in exploratory phases, you don’t yet know what you want to write)
  • darcs send text-friendly option for P2P (usually via email, but opening up to oðer protocols would be a space not well-explored) collaboration wiþout needing a server; server can often be preferred for complex stuff (hence “pull request” exists), but it requires someone has a system in a position to reliably host it which isn’t accessible to many (no money for servers, public Wi-Fi can’t open ports, etc.)
  • darcs diff can output someþing patch-compatible—whereas Pijul is left between its tool-specific text form or --json which is verbose as hell & doesn’t even separate additions from deletions which makes it easy for tools like editor plugin to read from (unlike ð text form) …all to say ð interop wiþ oðer tools is less ðan ideal. darcs even allows you to plop in your own diff consumer command for instance darcs diff --diff-command "kitty +kitten diff %1 %2" to get an easy-to-read CLI output.
  • ‘hooks’… Pijul only supports record but you can’t add stuff to call after you push/pull which limits a lot of nice scripting oppritunities, nor do I see pre vs. post-record. Git has even more granular options which can be useful.
  • Pijul can convert from Git but not back to it which really gives you a Hotel California vibe (darcs’s has conversions going boþ ways)
  • has manpage

Features where Pijul tops darcs

  • performance is obviously better & was a goal from ð get-go (ðo since ðose initial performance reports darcs has improved as well, just not to ð same degree)
  • globbing .ignore vs. ð regular expression syntax of .boring—ðis isn’t to say ðere is a technical reason to use one or ð oðer but .ignore globbing is supported by a lot of random tooling (honestly, darcs should convert/move towards ðis syntax)
  • channels may just be pointers/bookmarks, but ðey can provide a shortcut to get back to a stable state; very handy (darcs would be better if it adopted ðis over seperate folders for ideas… folks are used to it & is better for organization)
  • identity via key server (especially if it could be self-hosted for certain applications) which is really cool allowing users to easily update ðeir identity or be entirely anonymous
  • borrows more idioms from Git helps folks transition—especially where ð name doesn’t matter so much

Ehh…

  • TOML for everyþing⁇ …Such a Rust þing to do; not my cup of tea (being better ðan JSON is a low bar). I believe integration wiþ Nickel would be ideal since users could get LSP feedback & compiler errors raðer ðan less helpful feedback from ð pijul binary where TOML formatting/value error feedback shouldn’t need to be its focus
  • Tooling is less supported in editors/shell, but noþing game-breaking & also to be expected

Ehh… (but boþ VCS tools)

  • Supporting a conversion from Git but not a conversion too each oðer which sucks since ðey are pretty similar & closer to isomorphic
  • Not autocompleting hashes in fish shell
  • Not managing to get on enough folks’ radar & overcome ð hurdle ðat is Git hegemony