[libvirt] [RFC] Version numbers outside of releases

Daniel P. Berrange berrange at redhat.com
Thu Jun 1 11:21:01 UTC 2017

On Thu, Jun 01, 2017 at 01:13:05PM +0200, Andrea Bolognani wrote:
> Our current practice when it comes to bumping the version
> number for libvirt is to do so immediately after a release,
> eg. right after 3.4.0 is released later today someone will
> push a commit that changes configure.ac to use 3.5.0 instead.
> As a consequence, builds made from master will always carry
> the release number of the *upcoming* release, so from a
> versioning point of view there is no way to tell eg. 3.4.0-rc2
> or even the final 3.4.0 release apart from a random build made
> at a random time from master during 3.4.0's development cycle.
> In particular, when creating RPMs from a git clone, you'll end
> up having to use either 'dnf install' or 'dnf reinstall'
> depending on whether or not you already installed any build
> during the current development cycle.

This is really a bug in the RPM spec file used to build from
pre-released code.

The recommended Fedora RPM practice for version numbers in
packages from GIT snapshots, is that the release field
start with a "0", and have a date stamp (and possibly git
short hash) appended.  The first RPM following the formal
release would have a release starting with a "1". This
way, every build from git you do is always newer, and the
final release RPM is newer still.

> I suggest we change our habits slightly:
>   * right after X.Y.0 has been released, bump the version
>     number to X.Y.90;
>   * bump the version number to X.Y.91 for rc1, X.Y.92 for
>     rc2 and so on;
>   * only bump the version number to X.Y+1.0 as the release is
>     being prepared, then go back to the first step and move
>     on with development.
> This would make sure each step in the development cycle gets
> its own version number, and as a pleasant side effect you'll
> always be able to install newer builds using 'dnf install'.
> Comments welcome! :)

This is not that attractive from POV the language bindings.

eg in the Go code, I need to make usage of the new APIs
conditional at compile time. For example for the new APIs
added in 3.4.0 I have code like

  func (v *Stream) RecvFlags(p []byte, flags StreamRecvFlagsValues) (int, error) {
        if C.LIBVIR_VERSION_NUMBER < 3004000 {
                return 0, GetNotImplementedError("virStreamRecvFlags")

        n := C.virStreamRecvFlagsCompat(v.ptr, (*C.char)(unsafe.Pointer(&p[0])), C.size_t(len(p)), C.uint(flags))



  int virStreamRecvFlagsCompat(virStreamPtr st,
                               char *data,
                               size_t nbytes,
                               unsigned int flags)
      assert(0); // Caller should have checked version
      return virStreamRecvFlags(st, data, nbytes, flags);

The suggested versioning scheme would require changing all these version
numbers checks to 3003090 is rather unpleasant IMHO.

|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

More information about the libvir-list mailing list