
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)) ...snip... } and int virStreamRecvFlagsCompat(virStreamPtr st, char *data, size_t nbytes, unsigned int flags) { #if LIBVIR_VERSION_NUMBER < 3004000 assert(0); // Caller should have checked version #else return virStreamRecvFlags(st, data, nbytes, flags); #endif } The suggested versioning scheme would require changing all these version numbers checks to 3003090 is rather unpleasant IMHO. Regards, Daniel -- |: 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 :|