Skip to content

Commit

Permalink
Added qtIfwTempDataFilePath(), QtIfwExternalOp.CreateTempDataFile, Qt…
Browse files Browse the repository at this point in the history
…IfwExternalOp.WriteTempDataFile, and "Cascading Scripts Example" to demo the use of these functions and more importantly how to share values and evaluate conditions across installer operations.
  • Loading branch information
BuvinJ committed Jan 5, 2021
1 parent 02e211e commit 3749157
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 11 deletions.
1 change: 1 addition & 0 deletions distbuilder/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
, nestQtIfwPackage \
, joinPathQtIfw \
, qtIfwDynamicValue \
, qtIfwTempDataFilePath \
, QT_IFW_VERBOSE_SWITCH \
, QT_IFW_DYNAMIC_VARS \
, QT_IFW_TARGET_DIR \
Expand Down
2 changes: 1 addition & 1 deletion distbuilder/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.7.8.25"
__version__ = "0.7.8.26"
48 changes: 40 additions & 8 deletions distbuilder/qt_installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,13 +77,13 @@
QT_IFW_INSTALLER_DIR = "@InstallerDirPath@"
QT_IFW_INTALLER_PATH = "@InstallerFilePath@"

_QT_IFW_SCRIPTS_DIR = "ScriptsDir"
_QT_IFW_SCRIPTS_DIR = "ScriptsDir" # CUSTOM!
_QT_IFW_INSTALLER_TEMP_DIR = "InstallerTempDir" # CUSTOM!
_QT_IFW_MAINTENANCE_TEMP_DIR = "MaintenanceTempDir" # CUSTOM!

_QT_IFW_VAR_TMPLT = "@%s@"

QT_IFW_SCRIPTS_DIR = _QT_IFW_VAR_TMPLT % (_QT_IFW_SCRIPTS_DIR,) # CUSTOM!
QT_IFW_SCRIPTS_DIR = _QT_IFW_VAR_TMPLT % (_QT_IFW_SCRIPTS_DIR,) # CUSTOM!
QT_IFW_INSTALLER_TEMP_DIR = _QT_IFW_VAR_TMPLT % (_QT_IFW_INSTALLER_TEMP_DIR,) # CUSTOM!
QT_IFW_MAINTENANCE_TEMP_DIR = _QT_IFW_VAR_TMPLT % (_QT_IFW_MAINTENANCE_TEMP_DIR,) # CUSTOM!

Expand All @@ -102,7 +102,6 @@
QT_IFW_APPS_X86_DIR = "@ApplicationsDirX86@"
QT_IFW_APPS_X64_DIR = "@ApplicationsDirX64@"


QT_IFW_INTRO_PAGE = "Introduction"
QT_IFW_TARGET_DIR_PAGE = "TargetDirectory"
QT_IFW_COMPONENTS_PAGE = "ComponentSelection"
Expand Down Expand Up @@ -147,6 +146,8 @@
_QT_IFW_WATCH_DOG_SUFFIX = "-watchdog"
_QT_IFW_WATCH_DOG_EXT = ".vbs" if IS_WINDOWS else ""

_QT_IFW_TEMP_DATA_EXT = ".dat"

QT_IFW_DYNAMIC_PATH_VARS = [
"TargetDir"
, "RootDir"
Expand Down Expand Up @@ -186,6 +187,10 @@
def joinPathQtIfw( head, tail ): return "%s/%s" % ( head, tail )

def qtIfwDynamicValue( name ): return "@%s@" % (name,)

def qtIfwTempDataFilePath( rootFileName ):
return joinExt( joinPath( QT_IFW_SCRIPTS_DIR, rootFileName ),
_QT_IFW_TEMP_DATA_EXT )

# -----------------------------------------------------------------------------
class QtIfwConfig:
Expand Down Expand Up @@ -5124,18 +5129,30 @@ class QtIfwExternalOp:
__SCRIPT_ROOT_NAME_TMPLT = "%s_%d"

__NOT_FOUND_EXIT_CODE = 100


@staticmethod
def CreateTempDataFile( event, fileName, isElevated=True ):
return QtIfwExternalOp.__genScriptOp( event,
script=QtIfwExternalOp.WriteTempDataFileScript( fileName ),
isElevated=isElevated )

@staticmethod
def WriteTempDataFile( event, fileName, data, isElevated=True ):
return QtIfwExternalOp.__genScriptOp( event,
script=QtIfwExternalOp.WriteTempDataFileScript( fileName, data ),
isElevated=isElevated )

@staticmethod
def RemoveFile( event, filePath, isElevated=True ): # TODO: Test in NIX/MAC
return QtIfwExternalOp.__genScriptOp( event,
script=QtIfwExternalOp.RemoveFileScript( filePath ),
isElevated=isElevated )
script=QtIfwExternalOp.RemoveFileScript( filePath ),
isElevated=isElevated )

@staticmethod
def RemoveDir( event, dirPath, isElevated=True ): # TODO: Test in NIX/MAC
return QtIfwExternalOp.__genScriptOp( event,
script=QtIfwExternalOp.RemoveDirScript( dirPath ),
isElevated=isElevated )
script=QtIfwExternalOp.RemoveDirScript( dirPath ),
isElevated=isElevated )

# TODO: Test in NIX/MAC
@staticmethod
Expand Down Expand Up @@ -5349,6 +5366,21 @@ def __genScriptOp( event, script, uninstScript=None,
isElevated=isElevated,
externalRes=externalRes if externalRes else [] )

# TODO: Auto handle escape sequences?
@staticmethod
def WriteTempDataFileScript( fileName, data=None ): # TODO: Test in NIX/MAC
filePath = qtIfwTempDataFilePath( fileName )
if data is None:
return ExecutableScript( QtIfwExternalOp.__scriptRootName(
"touchTempDataFile" ), script=(
'echo. > "%s"' % (filePath,) if IS_WINDOWS else
'touch "%s"' % (filePath,) ) )
else:
return ExecutableScript( QtIfwExternalOp.__scriptRootName(
"writeTempDataFile" ), script=(
'echo %s > "%s"' % (data, filePath,) if IS_WINDOWS else
'echo "%s" > "%s"' % (data, filePath,) ) )

@staticmethod
def RemoveFileScript( filePath ): # TODO: Test in NIX/MAC
return ExecutableScript( QtIfwExternalOp.__scriptRootName(
Expand Down
120 changes: 120 additions & 0 deletions examples/hello_qtifw_ops/cascading_scripts.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
from distbuilder import PyToBinInstallerProcess, ConfigFactory, \
QtIfwExternalOp, QtIfwPackageScript, ExecutableScript, \
joinPath, qtIfwDynamicValue, qtIfwTempDataFilePath, \
IS_WINDOWS, QT_IFW_DESKTOP_DIR, QT_IFW_HOME_DIR

ON_INSTALL = QtIfwExternalOp.ON_INSTALL

f = configFactory = ConfigFactory()
f.productName = "Hello Cascading Scripts Example"
f.description = "A Distribution Builder Example"
f.companyTradeName = "Some Company"
f.companyLegalName = "Some Company Inc."
f.binaryName = "RunConditionsTest"
f.isGui = True
f.entryPointPy = "../run_conditions_app/hello_gui.py"
f.iconFilePath = "../hello_world_tk/demo.ico"
f.version = (1,0,0,0)
f.setupName = "HelloIfwCascadingScriptsSetup"

class BuildProcess( PyToBinInstallerProcess ):
def onQtIfwConfig( self, cfg ):

def customizeFinishedPage( cfg ):
# Disable the run program check box by default, for this example.
cfg.controlScript.isRunProgChecked = False

# A boolean state may be represented via a file's existence,
# created (or not) during an installer operation...
def setBoolCascadeOp( fileName ):
return QtIfwExternalOp.CreateTempDataFile( ON_INSTALL, fileName )

# A boolean state may be evaluated via a file's existence,
# during a subsequent installer operation...
def getBoolCascadeOp( fileName, destFilePath ):
createFileScript = ExecutableScript( "createBoolEvalFile", script=([
'set "msg=FALSE"'
, 'if exist "{srcFilePath}" set "msg=TRUE"'
, 'echo %msg% > "{destFilePath}"'
] if IS_WINDOWS else [
'msg="FALSE"'
, '[ -f "{srcFilePath}" ] && msg="TRUE"'
, 'echo "${msg}" > "{destFilePath}"'
]), replacements={
'srcFilePath' : qtIfwTempDataFilePath( fileName )
, 'destFilePath': destFilePath
})
return QtIfwExternalOp( script=createFileScript,
uninstScript=QtIfwExternalOp.RemoveFileScript( destFilePath ) )

# An installer variable may be set somewhere in the QtScript...
def setInstallerVaribale( pkgScript, varName ):
# Package Script preOpSupport is a convenient place to test this
# Change the value assigned to test the results...
pkgScript.preOpSupport = QtIfwPackageScript.setValue(
varName, QT_IFW_HOME_DIR )

# An installer variable can be written to a data file...
def setVaribaleCascadeOp( fileName, varName ):
return QtIfwExternalOp.WriteTempDataFile( ON_INSTALL, fileName,
qtIfwDynamicValue( varName ) )

# Or a dynamic value may be determined in a script and then written
# to a data file during an installer operation...
def setTimeCascadeViaScriptOp( fileName ):
passTimeScript= ExecutableScript( "createTimeFile", script=([
'echo %time% > "{timeFilePath}"'
] if IS_WINDOWS else [
'echo $(date +"%T") > "{timeFilePath}"'
]), replacements={
'timeFilePath': qtIfwTempDataFilePath( fileName )
})
return QtIfwExternalOp( script=passTimeScript )

# A value can be read from a data file during an installer operation...
def getVaribaleCascadeOp( fileName, destFilePath ):
createFileScript = ExecutableScript( "%sFetch" % (fileName,),
script=([
'set /p msg=< "{srcFilePath}"'
, 'echo %msg% > "{destFilePath}"'
] if IS_WINDOWS else [
'msg=$(cat "{srcFilePath}")'
, 'echo "${msg}" > "{destFilePath}"'
]), replacements={
'srcFilePath' : qtIfwTempDataFilePath( fileName )
, 'destFilePath': destFilePath
})
return QtIfwExternalOp( script=createFileScript,
uninstScript=QtIfwExternalOp.RemoveFileScript( destFilePath ) )

BOOL_FILE_NAME = "boolData"
BOOL_EVAL_FILE_NAME = "cascadingBool.txt"
VAR_NAME = "myDynamicPath"
VAR_FILE_NAME = "varData"
VAR_FETCH_FILE_NAME = "cascadingVar.txt"
TIME_FILE_NAME = "timeData"
TIME_FETCH_FILE_NAME = "cascadingTime.txt"

customizeFinishedPage( cfg )
pkg = cfg.packages[0]
setInstallerVaribale( pkg.pkgScript, VAR_NAME )

pkg.pkgScript.externalOps += [
setBoolCascadeOp( BOOL_FILE_NAME ), # comment this out to test!
getBoolCascadeOp( BOOL_FILE_NAME,
joinPath( QT_IFW_DESKTOP_DIR, BOOL_EVAL_FILE_NAME ) ),

setVaribaleCascadeOp( VAR_FILE_NAME, VAR_NAME ),
getVaribaleCascadeOp( VAR_FILE_NAME,
joinPath( QT_IFW_DESKTOP_DIR, VAR_FETCH_FILE_NAME ) ),

setTimeCascadeViaScriptOp( TIME_FILE_NAME ),
getVaribaleCascadeOp( TIME_FILE_NAME,
joinPath( QT_IFW_DESKTOP_DIR, TIME_FETCH_FILE_NAME ) ),
]

p = BuildProcess( configFactory, isDesktopTarget=True )
p.isInstallTest = True
# uncomment to leave scripts in temp directory, post any dynamic modifications
# p.isScriptDebugInstallTest = True
p.run()
3 changes: 1 addition & 2 deletions examples/hello_qtifw_ops/windows_registry.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from distbuilder import PyToBinInstallerProcess, ConfigFactory, \
QtIfwControlScript, QtIfwPackageScript, QtIfwExternalOp as ExOp, \
joinPath
from distbuilder.qt_installer import qtIfwDynamicValue
joinPath, qtIfwDynamicValue

f = configFactory = ConfigFactory()
f.productName = "Hello Registry Example"
Expand Down

0 comments on commit 3749157

Please sign in to comment.