rsync is a wonderfully useful utility for copying files
both locally and between machines.
It makes a reasonable effort to copy only files that have changed,
which can save a tremendous amount of time in many scenarios.
However, I’ve always been a bit daunted by its plethora of command-line options,
and would always resort to its man page for every invocation.
Thus, it would never stick in my set of tools I would commonly use.
After doing some work where rsync really was the only tool for the job,
I decided to finally make a little cheatsheet on how to use rsync.
I write a lot of shell scripts.
Many are one-offs or specific to a project,
but every so often,
I’ll have a script that transcends to become a part of my toolbelt.
For example, nix-op-key is a script I wrote to generate new Nix signing keys
and place them in 1Password.
It’s not a task that requires a dedicated program,
it just needs to glue two existing programs together:
nix key generate-secret and op (the 1Password CLI).
These sorts of scripts are great,
but if you want to share them with someone else
(or even just use it on a different computer),
how do you do it?
Scripts like these depend on specific programs (or maybe even specific versions) being installed
and Bash does not have a package manager like pip or the go tool.
As it turns out, Nix is such a package manager.
And with flakes, there’s built-in support for installing and running scripts
with well-specified dependencies
in a single command.
For example, you can run my nix-op-key script I mentioned earlier
(pinned to a specific version)
with:
COMMIT=25e9bd52e977cca415df84ea91028efd92d3da92
nix run "github:zombiezen/dotfiles?dir=nix&rev=$COMMIT#nix-op-key" -- --help
Furthermore, you can install the script using the nix profile install command:
(If you try this out yourself, you can uninstall the script with
nix profile remove '.*.nix-op-key').
In this blog post, I’ll show you how you can package your own shell scripts with Nix
to make them more reliable
and easier to share.
This article assumes familiarity with Unix command line and Bash shell scripting.
I’m using Nix 2.17.1.
All of the source code in this post is released under the Unlicense
and is available on GitHub.
I’m proud to announce that my CGo-less SQLite Go package,
zombiezen.com/go/sqlite,
has finally reached version 1.0.
This has been the culmination of almost three years of work:
I started on this project in March of 2021 as a fork of
David Crawshaw’s crawshaw.io/sqlite
to build on top of Jan Mercl’s amazing modernc.org/sqlite.
I’ve built a number of features on top of this package such as:
A simple schema migration framework
A basic REPL
User-defined functions, including windows and aggregates
Custom virtual tables
Utilities for running embedded SQL scripts
A go fix-like tool for migrating existing code using crawshaw.io/sqlite
With the 1.0 release, I’m proud to call the API stable so that Go applications
can continue to build on it for their storage needs.
If you’re using zombiezen.com/go/sqlite for something interesting,
let me know about it,
and consider supporting me on GitHub.
Check out the demo on GitHub!
(Installation is a little DIY if you’re not using Nix,
but there are instructions in the README on how to build.)
Read on if you’re interested in how it works.