<- HOME - a blog about
xit RSS
██╗ ██╗██╗████████╗██╗ ██████╗ ██████╗
╚██╗██╔╝██║╚══██╔══╝██║ ██╔═══██╗██╔════╝
╚███╔╝ ██║ ██║ ██║ ██║ ██║██║ ███╗
██╔██╗ ██║ ██║ ██║ ██║ ██║██║ ██║
██╔╝ ██╗██║ ██║ ███████╗╚██████╔╝╚██████╔╝
╚═╝ ╚═╝╚═╝ ╚═╝ ╚══════╝ ╚═════╝ ╚═════╝
DEVLOG - OPTIONAL PATCHES, FORCE PUSH, SYMLINKS AND MORE -
March 13, 2025
I got my first couple bug reports...mama, we made it! In
#2 I forgot that in
xitdb, data made in a transaction
is temporarily mutable (an important perf optimization).
It's fun forgetting how my own database works. In
#4 I
forgot that when you merge, the base commit might not
actually contain the conflicting file. Oops.
Shortly after that, I made patch-based merging
optional.
It no longer generates patches during the clone, so cloning
repos with large histories won't outlast the heat death of
the universe. It still takes more time than git, because it
is decompressing and chunking each object...I'm working on
making it faster.
The next morning I woke up feeling particularly
masochistic, so I decided to work on the pack file code. I
noticed that some fetches were failing because the pack
file from the server contained a
REF_DELTA object, which
is an deltified object whose base object is not in the pack
and is expected to already be in the object store. I
fixed the pack object reader to read these objects
correctly, and then told my therapist all about it later
that day.
After recovering from that eldritch horror I implemented
--abort for merge and cherry-pick. This would normally be
easy because it's essentially just `git reset --hard`,
which xit already has in the form of `xit reset-dir`, but
it wasn't correctly cleaning up the merge state. Now it is,
and you can --abort all you want.
The next day I turned to `push`, because there was an issue
that I doubt people would enjoy: all pushes were force
pushes. This is because the server does not check if you're
about to obliterate any commits...that check is done
client-side by git! I
added the check to xit, along with
a -f flag to bypass it.
I had to get away from networking for a while so the next
day I turned to the TUI. I added an obvious optimization
that I should've added long ago:
buffered writing. The
TUI on windows was particularly slow but now it's actually
usable. I also made the TUI exit cleanly when
ctrl+c is
entered.
And that brings me to yesterday, when I added support for
symlinks. That was WAY more annoying than I thought it
would be. Fuck symlinks. Apparently windows agrees, because
it doesn't even let you make them without admin
privileges...so xit is forced to just make a normal file,
just like git does. Speaking of windows, I also added a
nice
fix to prevent windows users from accidentally
overwriting the file mode in a repo.
That was just one week of work! Oh...and this blog is no
longer wrapping every single character in span tags. That
really triggered a lot of web developers. This is what
happens when you put a Zig programmer in charge of HTML. I
hope you all learned a valuable lesson.