Repository: nvaccess/nvda

Issue:
NVDA binaries should contain programmatic version information
Currently all NVDAHelper dlls, executables and vBufBackend dlls contain neither human readable version strings, nor do they contain programmatic version information. The main NVDA executables do contain some human readable version strings, but like the dlls, no programmatic version information.
Programmatic version information is useful for other software to accurately identify a particular dll or executable, including which version.
Some 3rd parties have shown interest in seeing this information, and some Microsoft error report / debugging tools require it.
All of our NVDA-specific dlls and executables should contain human readable version strings (fileVersion, productVersion, LegalCopyright, fileDescription), and also programmatic version information (FileVersion and ProductVersion).
Theproposed  programmatic version is year, major, minor, build.
Snapshots and prereleases will use the upcoming release version, but by definition will have a lower build number.
The build number should come from AppVeyor.
An example release version for 2016.3 might be something like:
2016.3.0.13427
Existing human readable version strings should stay the same. E.g. 2016.3, or master-13427,a8fb8fcf8b49...



Discussion:

Resolving patch:
diff --git a/source/setup.py b/source/setup.py
--- a/source/setup.py
+++ b/source/setup.py
@@ -171,7 +171,7 @@ def getRecursiveDataFiles(dest,source,excludes=()):
 			"dest_base":"nvda_noUIAccess",
 			"uac_info": ("asInvoker", False),
 			"icon_resources":[(1,"images/nvda.ico")],
-			"version":"0.0.0.0",
+			"version":"%s.%s.%s.%s"%(version_year,version_major,version_minor,version_build),
 			"description":"NVDA application",
 			"product_version":version,
 			"copyright":copyright,
@@ -181,7 +181,7 @@ def getRecursiveDataFiles(dest,source,excludes=()):
 		{
 			"script": "nvda_slave.pyw",
 			"icon_resources": [(1,"images/nvda.ico")],
-			"version": "0.0.0.0",
+			"version":"%s.%s.%s.%s"%(version_year,version_major,version_minor,version_build),
 			"description": name,
 			"product_version": version,
 			"copyright": copyright,
@@ -192,7 +192,7 @@ def getRecursiveDataFiles(dest,source,excludes=()):
 			# uiAccess will be enabled at runtime if appropriate.
 			"uac_info": ("asInvoker", False),
 			"icon_resources": [(1,"images/nvda.ico")],
-			"version": "0.0.0.0",
+			"version":"%s.%s.%s.%s"%(version_year,version_major,version_minor,version_build),
 			"description": "NVDA Ease of Access proxy",
 			"product_version": version,
 			"copyright": copyright,
@@ -202,7 +202,7 @@ def getRecursiveDataFiles(dest,source,excludes=()):
 	service=[{
 		"modules": ["nvda_service"],
 		"icon_resources": [(1, "images/nvda.ico")],
-		"version": "0.0.0.0",
+		"version":"%s.%s.%s.%s"%(version_year,version_major,version_minor,version_build),
 		"description": "NVDA service",
 		"product_version": version,
 		"copyright": copyright,
diff --git a/source/versionInfo.py b/source/versionInfo.py
--- a/source/versionInfo.py
+++ b/source/versionInfo.py
@@ -31,11 +31,15 @@ def _updateVersionFromVCS():
 # Otherwise, py2exe will break.
 name="NVDA"
 longName=_("NonVisual Desktop Access")
-version="2016.4dev"
+version_year=2016
+version_major=4
+version_minor=0
+version_build=0
+version="%s.%s.%sdev"%(version_year,version_major,version_minor)
 publisher="unknown"
 updateVersionType=None
 try:
-	from _buildVersion import version, publisher, updateVersionType
+	from _buildVersion import version, publisher, updateVersionType, version_build
 except ImportError:
 	_updateVersionFromVCS()
 description=_("A free and open source screen reader for Microsoft Windows")


Test patch: