Today we've released libgit2 v0.99. 🎉🎉🎉
libgit2 is a linkable library for working with git repositories in any application. It's used by IDEs, GUI clients for Git, hosting providers, scientific computing tools, and even scuba diving log software.
Whether you keep your code on GitHub, GitLab, Bitbucket, or nearly anywhere else, it's libgit2 that does the work every time you click the "merge pull request" button. So if you write software, you've probably used libgit2, even if you don't know it.
And -- finally -- we're getting close to releasing version 1.0.
When I started working on libgit2, eight years ago, I joined a group of developers from all over the world who were working on the project. And shortly after I did, we started planning for all the things that we'd need to do to get to libgit2 version 1.0.
I honestly don't remember a single one of those things.
But I do remember that the biggest thing that we needed to provide to users wasn't features or functionality, it was API consistency.
See, back in ye olde days, we had this idea that we could build the perfect Git library. It would have the perfect API. And once we got there, then we would never need to change it, and that would be our 1.0. And until that happened, we could just keep changing the API until it was perfect. It was, after all, just a prerelease. (Look, it's still version zero-point-something!) And once we got there, all the developers that use libgit2 would be super happy about our great API!
Well, reader, I probably don't have to tell you that people were not, in fact, super happy. It turns out that changing the API on people all the time is not really a recipe for satisfaction.
Hell, even I hated it. I used to be that guy who would bring in new versions of libgit2 into Visual Studio. And then I'd suffer through finding all the places that called
git_checkout and needed to be updated whenever we made some API change to "make things better". And then I'd curse myself and my friends who did that.
And as time went on, git became more popular. And more people wanted to build apps that talked to git repositories. And we had more users and more applications building on top of libgit2. And then breaking the API just became cruel.
So after the last release -- v0.28 -- we made a (long overdue) decision: we needed to release a v1.0, finally. And then we'd need to stop breaking the API in minor releases.
So we challenged ourselves to do the refactorings that we wanted to do to improve the API consistency while still keeping the API backward compatible. Sometimes this meant
#defines. Sometimes this meant making the old functions proxy to the new functions. And sometimes this just meant realizing that perfection is unattainable. (It got real deep, y'all.)
But we succeeded in our mission: we believe that v0.99 is completely API-compatible with v0.28. This is the first release that we can say that about. Which means that this is the pre-release for v1.0.
So, please, if you're a libgit2 user, give v0.99 a shot. We'll do a period of stabilization to ensure that there are no significant bugs, and then we'll release v1.0 🔜.
And once we do that, we'll start looking forward to v2.0, because that's when semver says that we can make breaking API changes again.