Pijul 0.11

Tuesday, November 20, 2018

I’d like to announce a new release of Pijul, version 0.11. This release fixes a large number of bugs, follows evolutions in the Rust ecosystem (Tokio), integrates better with existing software (SSH proxys and config files), and introduces an important feature of Pijul: /partial clones/.

Partial clones

This feature has been in the pipes for quite a while. One great possibility opened by patch commutation is the production of patches touching just one part of the repository, compatible with the rest of the work happening in other parts.

The way this is implemented in Pijul is by keeping track of the path touched by a patch (or more precisely, of the internal representation of that path, in order to be robust to file and directory moves), and by outputting only the paths touched by applied patches.

This also means that one can pull just the patches touching one path in the repository, output just that path, and produce patches that can be applied to the original repository.

If a patch also touches other paths than the ones we want, these extra paths are not output, and not considered by pijul record. They are still present in the internal representation of the repository, though.

This feature is used in commands pijul clone --path and pijul pull --path.


The new architecture of Tokio is great, but has required a significant amount of work in Thrussh, Pleingres, Pijul and the Nest to make it work in all four crates at the same time.

The event loop of the Nest is considerably simpler and more efficient, as there is now only one event loop run on a threadpool.

I might write another post later on with a few examples of how this is done, with examples of Pleingres and Thrussh.

SSH proxies, config files and keys

This has been one of the main difficulties of Thrussh and Pijul for a long time. I have reasons to believe this is now solved, and has been tested on a number of different key types. Pijul is now able to parse ~/.ssh/config and to use many of the “important” instructions in there. This does not include persistent connections, but does include SSH proxies, aliases, identity files and default users.

Moreover, a number of users have reported problems with their keys. I’d like to thank @loevenheim in particular for providing an important test case.

Other bugs

An impressive number of small bugs have been fixed in this release, by (in chronological order of their first patch since Pijul 0.10.2) @lthms, @FlorentBecker, @yory, @laumann, Lassi Haasio, @remexre, @balrogboogie, @onio. I’ve also fixed a number of them.

I’d like to comment on two less minor bugs:

  • One is related to libpijul::record::confirm_path, which was causing pijul record to be really slow for a relatively bad reason (filter instead of take_while on an iterator). I believe I was the one who introduced that bug, and @FlorentBecker fixed it.

  • One was in libpijul::graph::conflict_tree, the function that explores the internal representation, detects and outputs conflicts. That bug is purely algorithmic. That algorithm had been “working” for quite a long time, but relied on assumptions that turned out to be false for a long enough (and conflictual enough) history. The algorithm is now quite likely to be correct, meaning that (1) all conflicts are detected and solvable (this was already the case), and (2) the output depends exclusively on the patches, and doesn’t rely on any optimisation we might have performed on the internal representation (this was the problem). This patch is likely to solve a recurring problem in the Nest with patches and files that were displayed differently on the Nest and after cloning.