zignew and zigswitch (Bash scripts)

Created: 2023-03-04

If you’ve been using Zig for a while in its pre-1.0 state, then you have probably downloaded a new binary build of Zig quite a few times from: https://ziglang.org/download/

My usual process to upgrade was always something like:

$ wget https://ziglang.org/builds/zig-linux-x86-<very long build version>.tar.xz
$ tar xf zig-linux-x86-<very long build version>.tar.xz
$ ln -s zig-linux-x86-<very long build version> zig

(I have the symlink zig above in my $PATH, so I can immediately run the new executable.)

I eventually developed an extremely crude shell script that automated at least a little bit of that.

But the other thing that kept happening is that I would need to run different release versions of Zig in addition to the dev build. (Some Zig software authors wisely pick a release version for their applications. So you need to use those release versions to build that application.)

So now I’ve got two scripts:

zignew extracts a new Zig build tarball and updates my symlink.

zigswitch uses fuzzy matching (so cool!) to let me pick from a menu of installed Zig versions and updates the symlink.

The fuzzy matcher, zf, is https://github.com/natecraddock/zf

Here’s my scripts. I’m not making these a repo or anything (they’re already part of my personal $HOME/bin repo) because they will probably require some tailoring for anyone else to use. But maybe they’ll inspire someone else to do something similar:

zignew

Running it:

$ wget https://ziglang.org/builds/zig-linux-x86_64-0.11.0-dev.1842+6be5946ed.tar.xz
$ zignew
Unpacking /home/dave/zig-linux-x86_64-0.11.0-dev.1842+6be5946ed.tar.xz...
Deleting the archive file '/home/dave/zig-linux-x86_64-0.11.0-dev.1842+6be5946ed.tar.xz'...
Replacing zig symlink to point to new version

Zig version is now: 0.11.0-dev.1842+6be5946ed

The source:

#!/usr/bin/bash

# Extract new Zig version tarball.
# Then switch zig versions via symlink.
#
# This script assumes the following:
#
#   1. Zig releases are in user $HOME dir and named zig-*
#   2. $HOME/zig is in $PATH so zig executable can be found
#   3. The new Zig tarball is also in $HOME

# Find zig archives (and there must be exactly one!)
zigzip=$(find $HOME -maxdepth 1 -name zig*.tar.xz)

# there is probably a better way to do this...
zipcount=0
for z in $zigzip
do
	zipcount=$(($zipcount + 1))
done

if [[ $zipcount -lt 1 ]]
then
	echo "Sorry, didn't find any zig archives in $HOME"
	exit 1
fi

if [[ $zipcount -gt 1 ]]
then
	echo "Sorry, found MORE than one zig archive in $HOME:"
	echo $zigzip
	exit 1
fi

echo "Unpacking $zigzip..."

tar -xf "$zigzip"

if [[ $? -ne 0 ]]
then
	echo "Sorry, looks like that failed."
	exit 1
fi

echo "Deleting the archive file '$zigzip'..."
rm "$zigzip"

# decompressed archive should be same name minus the .tar.xz
echo "Replacing zig symlink to point to new version"
rm -f $HOME/zig
new_zig_dir="${zigzip%.tar.xz}"
ln -s "$new_zig_dir" "$HOME/zig"

printf "\nZig version is now: "
zig version

zigswitch

Running it:


$ zigswitch
>
/home/dave/zig-0.10.0
/home/dave/zig-linux-x86_64-0.11.0-dev.1842+6be5946ed
/home/dave/zig-0.11.0-dev
/home/dave/zig-0.10.1

# I select the zig-0.10.0 version from the menu above...

Replacing zig symlink to point to /home/dave/zig-0.10.0

Zig version is now: 0.10.0

The source:

#!/usr/bin/bash

# Switch zig versions via symlink. This script assumes two things:
#
#   1. Zig releases are in user $HOME dir and named zig-*
#   2. $HOME/zig is in $PATH so zig executable can be found

# zf is a fuzzy finder
# https://github.com/natecraddock/zf
switchversion=$(find $HOME -type d -maxdepth 1 -name 'zig-*' | zf)

echo "Replacing zig symlink to point to $switchversion"
rm -f $HOME/zig
ln -s "$switchversion" "$HOME/zig"

printf "\nZig version is now: "
zig version