python CI/updateVersion.py %NEW_VERSION%
pyinstaller testApp.py --version-file "CI/version.py"
-
-
Save JarekParal/24e15de33971674a8c0f9955f6ad15e0 to your computer and use it in GitHub Desktop.
import sys | |
import re | |
FILE_WITH_VERSION_INFORMATIONS = "CI\\version" | |
if len(sys.argv) != 2: | |
print("""Problem with argument.\n | |
Expected exactly one argument with new version number - e.g. '1.23.0.0'""") | |
exit(1) | |
new_version = sys.argv[1] | |
if re.match(r"[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+", new_version) == None: | |
print("Wrong format of argument:", new_version, | |
"\nRequired format: 1.23.0.0") | |
exit(1) | |
new_version_commas = new_version.replace('.', ', ') | |
# Read data from template file | |
fin = open(FILE_WITH_VERSION_INFORMATIONS + "_template.py", "rt") | |
data = fin.read() | |
data = data.replace('filevers=(78, 0, 3904, 108)', | |
'filevers=(' + new_version_commas + ')') | |
data = data.replace('prodvers=(78, 0, 3904, 108)', | |
'prodvers=(' + new_version_commas + ')') | |
data = data.replace("u'FileVersion', u'78, 0, 3904, 108'", | |
"u'FileVersion', u'" + new_version + "'") | |
data = data.replace("u'ProductVersion', u'78, 0, 3904, 108'", | |
"u'ProductVersion', u'" + new_version + "'") | |
fin.close() | |
# Write the data to new output file | |
fin = open(FILE_WITH_VERSION_INFORMATIONS + ".py", "wt") | |
fin.write(data) | |
fin.close() | |
print(sys.argv[0], "- version updated to:", new_version) |
# Version info from Google Chrome | |
# Get this info with util `pyi-grab_version` | |
# UTF-8 | |
# | |
# For more details about fixed file info 'ffi' see: | |
# http://msdn.microsoft.com/en-us/library/ms646997.aspx | |
VSVersionInfo( | |
ffi=FixedFileInfo( | |
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4) | |
# Set not needed items to zero 0. | |
filevers=(78, 0, 3904, 108), | |
prodvers=(78, 0, 3904, 108), | |
# Contains a bitmask that specifies the valid bits 'flags'r | |
mask=0x17, | |
# Contains a bitmask that specifies the Boolean attributes of the file. | |
flags=0x0, | |
# The operating system for which this file was designed. | |
# 0x4 - NT and there is no need to change it. | |
OS=0x4, | |
# The general type of file. | |
# 0x1 - the file is an application. | |
fileType=0x1, | |
# The function of the file. | |
# 0x0 - the function is not defined for this fileType | |
subtype=0x0, | |
# Creation date and time stamp. | |
date=(0, 0) | |
), | |
kids=[ | |
StringFileInfo( | |
[ | |
StringTable( | |
u'040904b0', | |
[StringStruct(u'CompanyName', u'Google LLC'), | |
StringStruct(u'FileDescription', u'Google Chrome'), | |
StringStruct(u'FileVersion', u'78, 0, 3904, 108'), | |
StringStruct(u'InternalName', u'chrome_exe'), | |
StringStruct(u'LegalCopyright', u'Copyright 2019 Google LLC. All rights reserved.'), | |
StringStruct(u'OriginalFilename', u'chrome.exe'), | |
StringStruct(u'ProductName', u'Google Chrome'), | |
StringStruct(u'ProductVersion', u'78.0.3904.108'), | |
StringStruct(u'CompanyShortName', u'Google'), | |
StringStruct(u'ProductShortName', u'Chrome'), | |
StringStruct(u'LastChange', u'4b26898a39ee037623a72fcfb77279fce0e7d648-refs/branch-heads/3904@{#889}'), | |
StringStruct(u'Official Build', u'1')]) | |
]), | |
VarFileInfo([VarStruct(u'Translation', [1033, 1200])]) | |
] | |
) |
@Lagdu Thanks for contributing.
Which StringStruct
do you use for the git commit hash? I test them and unfortunately, just some of them are shown in program properties:
Hi Jarek
I guess i'm not using a special structure (don't really know in fact)
Here is what I have tested tonight.
So i guess you should put the git hash in the ProducVersion and it will work with a simple string.
The filevers seems to be a special format and maybe you cannot add the format you want but only "X,X,X,X" format
I personnaly dont care about the windows detail but I use it inside my program as follow (copy screen of mu prog) :
If u want to use thoses informations in your code you can do like this.
import win32api
def getFileProperties(fname):
"""
Read all properties of the given file return them as a dictionary.
"""
propNames = ('Comments', 'InternalName', 'ProductName',
'CompanyName', 'LegalCopyright', 'ProductVersion',
'FileDescription', 'LegalTrademarks', 'PrivateBuild',
'FileVersion', 'OriginalFilename', 'SpecialBuild')
props = {'StringFileInfo': None}
strInfo = {}
try:
for propName in propNames:
# The "040904B0" must match the information you have in your version file. Dont know how to get it dynamic
strInfoPath = u'\\StringFileInfo\\040904B0\\'
strInfo[propName] = win32api.GetFileVersionInfo(fname, strInfoPath+propName)
props['StringFileInfo'] = strInfo
except:
props=False
return props
........................
properties_detail = getFileProperties("./Prog.exe")
if properties_detail:
product_name_text = properties_detail['StringFileInfo']['ProductName']
product_version_text = properties_detail['StringFileInfo']['ProductVersion']
product_desc_text = properties_detail['StringFileInfo']['FileDescription']
product_file_version_text = properties_detail['StringFileInfo']['FileVersion']
product_support_text = "[email protected]"
I'm begining in python so i guess there are better way to do it but it works for me.
I also made some modification in your process.
I'am calling the updateVersion.py in my spec file so when i want to build my program i write the command line like this.
pyinstaller Prog.spec 1.1.0.2
So i just need one line to build and set my version.
Thanks for this code. I made a simpler version since I am only using it for argparse --version
command.
At the top of the spec file:
# update the version with the latest git commit
import subprocess
git_commit = subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD'], text=True)
new_version = '1.0-' + git_commit.strip()
print('Building with new version number', new_version)
with open('_version.py', 'w') as f:
f.write('version = "' + new_version + '"')
And this at the end to reset so that git doesn't notice changes every time
with open('_version.py', 'w') as f:
f.write("# placeholder will be overwritten by PyInstaller\nversion = ''")
@Lagdu, can u share a sample . I am trying to achieve the same
Helped me a lot thank you bro :)
I also added code like this to bring in my versioning the GIT commit :