Skip to content

Commit

Permalink
Patched assorted glitches in new registry functions. Began an example…
Browse files Browse the repository at this point in the history
… / unit test for such features.
  • Loading branch information
BuvinJ committed Nov 24, 2020
1 parent 58f71d5 commit 4962e72
Show file tree
Hide file tree
Showing 4 changed files with 132 additions and 40 deletions.
99 changes: 65 additions & 34 deletions distbuilder/qt_installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -863,7 +863,7 @@ class _QtIfwScript:
if IS_WINDOWS:

__REG_KEY_EXISTS_TMPL = "registryKeyExists( %s, %s )"
__REG_KEY_EXISTS_LIKE_TMPL = "registryKeyExistsLike( %s, %s, %s, %s )"
__REG_KEY_EXISTS_LIKE_TMPL = "registryKeyExistsLike( %s, %s, %s, %s, %s )"

__REG_ENTRY_VALUE_TMPL = "registryEntryValue( %s, %s, %s )"
__ASSIGN_REG_ENTRY_VALUE_TMPL = "var %s = %s;\n"
Expand Down Expand Up @@ -900,6 +900,10 @@ def orList( conditions ):
def _autoQuote( value, isAutoQuote ):
return '"%s"' % (value,) if isAutoQuote else value

@staticmethod
def _autoEscapeBackSlash( value, isAutoEscape ):
return value.replace( "\\", "\\\\" ) if isAutoEscape else value

@staticmethod
def embedResources( embeddedResources ):
def chunks(s, n):
Expand Down Expand Up @@ -1366,7 +1370,9 @@ def ifComponentSelected( package, isNegated=False,
def registryKeyExists( key, isAutoBitContext=True,
isAutoQuote=True ):
return _QtIfwScript.__REG_KEY_EXISTS_TMPL % (
_QtIfwScript._autoQuote( key, isAutoQuote ),
_QtIfwScript._autoEscapeBackSlash(
_QtIfwScript._autoQuote( key, isAutoQuote ),
isAutoQuote ).replace(":",""),
_QtIfwScript.toBool( isAutoBitContext ) )

@staticmethod
Expand All @@ -1379,23 +1385,31 @@ def ifRegistryKeyExists( key, isAutoBitContext=True, isNegated=False,
("{" if isMultiLine else ""), (2*_QtIfwScript.TAB) )

@staticmethod
def registryKeyExistsLike( keyNameContains, isAutoBitContext=True,
def registryKeyExistsLike( parentKey, childKeyNameContains,
isAutoBitContext=True,
isCaseSensitive=False, isRecursive=False,
isAutoQuote=True ):
return _QtIfwScript.__REG_KEY_EXISTS_TMPL % (
_QtIfwScript._autoQuote( keyNameContains, isAutoQuote ),
return _QtIfwScript.__REG_KEY_EXISTS_LIKE_TMPL % (
_QtIfwScript._autoEscapeBackSlash(
_QtIfwScript._autoQuote( parentKey, isAutoQuote ),
isAutoQuote ).replace(":",""),
_QtIfwScript._autoEscapeBackSlash(
_QtIfwScript._autoQuote( childKeyNameContains, isAutoQuote ),
isAutoQuote ).replace(":",""),
_QtIfwScript.toBool( isAutoBitContext ),
_QtIfwScript.toBool( isCaseSensitive ),
_QtIfwScript.toBool( isRecursive ) )

@staticmethod
def ifRegistryKeyExistsLike( keyNameContains, isAutoBitContext=True,
def ifRegistryKeyExistsLike( parentKey, childKeyNameContains,
isAutoBitContext=True,
isCaseSensitive=False, isRecursive=False,
isNegated=False,
isAutoQuote=True, isMultiLine=False ):
return 'if( %s%s )%s\n%s' % (
"!" if isNegated else "",
_QtIfwScript.registryKeyExistsLike( keyNameContains,
_QtIfwScript.registryKeyExistsLike(
parentKey, childKeyNameContains,
isAutoBitContext=isAutoBitContext,
isCaseSensitive=isCaseSensitive, isRecursive=isRecursive,
isAutoQuote=isAutoQuote ),
Expand All @@ -1405,16 +1419,17 @@ def ifRegistryKeyExistsLike( keyNameContains, isAutoBitContext=True,
def registryEntryValue( key, valueName, isAutoBitContext=True,
isAutoQuote=True ):
return _QtIfwScript.__REG_ENTRY_VALUE_TMPL % (
_QtIfwScript._autoQuote( key, isAutoQuote ),
_QtIfwScript._autoEscapeBackSlash(
_QtIfwScript._autoQuote( key, isAutoQuote ),
isAutoQuote ).replace(":",""),
_QtIfwScript._autoQuote( valueName, isAutoQuote ),
_QtIfwScript.toBool( isAutoBitContext ) )

@staticmethod
def assignRegistryEntryVar( key, valueName, isAutoBitContext=True,
varName="regValue", isAutoQuote=True ):
return _QtIfwScript.__ASSIGN_REG_ENTRY_VALUE_TMPL % (
_QtIfwScript._autoQuote( varName, isAutoQuote ),
_QtIfwScript.registryEntryValue(
varName, _QtIfwScript.registryEntryValue(
key, valueName, isAutoBitContext=isAutoBitContext,
isAutoQuote=isAutoQuote ) )

Expand All @@ -1431,8 +1446,10 @@ def setValueFromRegistryEntry( key,
@staticmethod
def registryEntryExists( key, valueName, isAutoBitContext=True,
isAutoQuote=True ):
return _QtIfwScript.__REG_ENTRY_EXISTS_TMPL % (
_QtIfwScript._autoQuote( key, isAutoQuote ),
return _QtIfwScript.__REG_ENTRY_EXISTS_TMPL % (
_QtIfwScript._autoEscapeBackSlash(
_QtIfwScript._autoQuote( key, isAutoQuote ),
isAutoQuote ).replace(":",""),
_QtIfwScript._autoQuote( valueName, isAutoQuote ),
_QtIfwScript.toBool( isAutoBitContext ) )

Expand All @@ -1453,7 +1470,9 @@ def registryEntryExistsLike( key, valueNameContains,
isCaseSensitive=False, isRecursive=False,
isAutoQuote=True ):
return _QtIfwScript.__REG_ENTRY_EXISTS_LIKE_TMPL % (
_QtIfwScript._autoQuote( key, isAutoQuote ),
_QtIfwScript._autoEscapeBackSlash(
_QtIfwScript._autoQuote( key, isAutoQuote ),
isAutoQuote ).replace(":",""),
_QtIfwScript._autoQuote( valueNameContains, isAutoQuote ),
_QtIfwScript.toBool( isAutoBitContext ),
_QtIfwScript.toBool( isCaseSensitive ),
Expand Down Expand Up @@ -2210,19 +2229,20 @@ def _genLib( self ):
TAB + 'if( !installer.gainAdminRights() ) ' + NEW +
(2*TAB) + 'throw new Error("Elevated privileges required.")' + END +
TAB + 'if( !registryEntryExists( key, valueName, isAutoBitContext ) )' + NEW +
(2*TAB) + 'return null' + END +
(2*TAB) + 'return null' + END +
TAB + 'var keySearch = " \\"" + key + "\\""' + END +
TAB + 'var valSearch = valueName==null ? " /VE " : '
'" /V \\"" + valueName + "\\""' + END +
TAB + 'var bitContext = isAutoBitContext===false ? " /reg:64" : ""' + END +
TAB + 'var regQuery = "for /f \\"tokens=2*\\" %a in '
'(\'REG QUERY \\"" + key + "\\"" + valSearch + bitContext + '
'(\'REG QUERY" + keySearch + valSearch + bitContext + '
'" ^| FINDSTR \\"REG_\\"\') do @echo %b\\n"' + END +
TAB + 'var result = installer.execute( "cmd.exe", ["/k"], regQuery )' + END +
TAB + 'if( result[1] != 0 ) ' + NEW +
(2*TAB) + 'throw new Error("Registry query failed.")' + END +
TAB + TRY +
(2*TAB) + 'var cmdOutLns = result[0].split(\"\\n\")' + END +
(2*TAB) + 'value = cmdOutLns[cmdOutLns.length-2].trim()' + END + EBLK +
(2*TAB) + 'value = cmdOutLns[1].trim()' + END + EBLK +
TAB + CATCH + 'value = null;' + EBLK +
TAB + _QtIfwScript.log( '"Registry value: " + value', isAutoQuote=False ) +
TAB + 'return value' + END +
Expand All @@ -2235,19 +2255,20 @@ def _genLib( self ):
TAB + 'if( !installer.gainAdminRights() ) ' + NEW +
(2*TAB) + 'throw new Error("Elevated privileges required.")' + END +
TAB + 'var existsOutput = "exists"' + END +
TAB + 'var keySearch = " \\"" + key + "\\""' + END +
TAB + 'var valSearch = valueName==null ? " /VE " : '
'" /V \\"" + valueName + "\\""' + END +
TAB + 'var bitContext = isAutoBitContext===false ? " /reg:64" : ""' + END +
TAB + 'var regQuery = "REG QUERY \\"" + key + "\\"" + '
'valSearch + bitContext + '
TAB + 'var regQuery = "@echo off & REG QUERY" + keySearch + valSearch + '
'bitContext + '
'" 1>null 2>&1 && echo " + existsOutput + "\\n"' + END +
TAB + 'var result = installer.execute( "cmd.exe", ["/k"], regQuery )' + END +
TAB + 'if( result[1] != 0 ) ' + NEW +
(2*TAB) + 'throw new Error("Registry query failed.")' + END +
TAB + 'var output' + END +
TAB + TRY +
(2*TAB) + 'var cmdOutLns = result[0].split(\"\\n\")' + END +
(2*TAB) + 'output = cmdOutLns[cmdOutLns.length-2].trim()' + END + EBLK +
(2*TAB) + 'output = cmdOutLns[1].trim()' + END + EBLK +
TAB + CATCH + 'output = null;' + EBLK +
TAB + 'var exists = output==existsOutput' + END +
TAB + _QtIfwScript.log( '"Registry value exists: " + exists', isAutoQuote=False ) +
Expand All @@ -2264,20 +2285,21 @@ def _genLib( self ):
TAB + 'if( !installer.gainAdminRights() ) ' + NEW +
(2*TAB) + 'throw new Error("Elevated privileges required.")' + END +
TAB + 'var existsOutput = "exists"' + END +
TAB + 'var keySearch = " \\"" + key + "\\""' + END +
TAB + 'var valSearch = " /F \\"" + valueNameContains + "\\""' + END +
TAB + 'var bitContext = isAutoBitContext===false ? " /reg:64" : ""' + END +
TAB + 'var caseSens = isCaseSensitive ? " /C" : ""' + END +
TAB + 'var subSearch = isRecursive ? " /S" : ""' + END +
TAB + 'var regQuery = "REG QUERY \\"%key%\\"" + valSearch + bitContext + '
'caseSens + subSearch + '
TAB + 'var regQuery = "@echo off & REG QUERY" + keySearch + valSearch + '
'bitContext + caseSens + subSearch + '
'" 1>null 2>&1 && echo " + existsOutput + "\\n"' + END +
TAB + 'var result = installer.execute( "cmd.exe", ["/k"], regQuery )' + END +
TAB + 'if( result[1] != 0 ) ' + NEW +
(2*TAB) + 'throw new Error("Registry query failed.")' + END +
TAB + 'var output' + END +
TAB + TRY +
(2*TAB) + 'var cmdOutLns = result[0].split(\"\\n\")' + END +
(2*TAB) + 'output = cmdOutLns[cmdOutLns.length-2].trim()' + END + EBLK +
(2*TAB) + 'output = cmdOutLns[1].trim()' + END + EBLK +
TAB + CATCH + 'output = null;' + EBLK +
TAB + 'var exists = output==existsOutput' + END +
TAB + _QtIfwScript.log( '"Registry value exists: " + exists', isAutoQuote=False ) +
Expand All @@ -2290,37 +2312,38 @@ def _genLib( self ):
TAB + 'if( !installer.gainAdminRights() ) ' + NEW +
(2*TAB) + 'throw new Error("Elevated privileges required.")' + END +
TAB + 'var existsOutput = "exists"' + END +
TAB + 'var keySearch = " /F \\"" + keyNameContains + "\\""' + END +
TAB + 'var bitContext = isAutoBitContext===false ? " /reg:64" : ""' + END +
TAB + 'var regQuery = "REG QUERY " + keySearch + " /K /C /E" + bitContext + '
TAB + 'var keySearch = " \\"" + key + "\\" /VE"' + END +
TAB + 'var bitContext = isAutoBitContext===false ? " /reg:64" : ""' + END +
TAB + 'var regQuery = "@echo off & REG QUERY" + keySearch + bitContext + '
'" 1>null 2>&1 && echo " + existsOutput + "\\n"' + END +
TAB + 'var result = installer.execute( "cmd.exe", ["/k"], regQuery )' + END +
TAB + 'var result = installer.execute( "cmd.exe", ["/k"], regQuery )' + END +
TAB + 'if( result[1] != 0 ) ' + NEW +
(2*TAB) + 'throw new Error("Registry query failed.")' + END +
TAB + 'var output' + END +
TAB + TRY +
(2*TAB) + 'var cmdOutLns = result[0].split(\"\\n\")' + END +
(2*TAB) + 'output = cmdOutLns[cmdOutLns.length-2].trim()' + END + EBLK +
(2*TAB) + 'output = cmdOutLns[1].trim()' + END + EBLK +
TAB + CATCH + 'output = null;' + EBLK +
TAB + 'var exists = output==existsOutput' + END +
TAB + _QtIfwScript.log( '"Registry key exists: " + exists', isAutoQuote=False ) +
TAB + 'return exists' + END +
EBLK + NEW +
'function registryKeyExistsLike( keyNameContains, isAutoBitContext, '
'isCaseSensitive, isRecursive ) ' + SBLK +
'function registryKeyExistsLike( parentKey, childKeyNameContains, '
'isAutoBitContext, isCaseSensitive, isRecursive ) ' + SBLK +
TAB + _QtIfwScript.log( "Registry entry exists query" ) +
TAB + _QtIfwScript.log( '" keyNameContains: " + keyNameContains', isAutoQuote=False ) +
TAB + _QtIfwScript.log( '" parentKey: " + parentKey', isAutoQuote=False ) +
TAB + _QtIfwScript.log( '" childKeyNameContains: " + childKeyNameContains', isAutoQuote=False ) +
TAB + _QtIfwScript.log( '" isAutoBitContext: " + isAutoBitContext', isAutoQuote=False ) +
TAB + _QtIfwScript.log( '" isCaseSensitive: " + isCaseSensitive', isAutoQuote=False ) +
TAB + _QtIfwScript.log( '" isRecursive: " + isRecursive', isAutoQuote=False ) +
TAB + 'if( !installer.gainAdminRights() ) ' + NEW +
(2*TAB) + 'throw new Error("Elevated privileges required.")' + END +
TAB + 'var existsOutput = "exists"' + END +
TAB + 'var keySearch = " /F \\"" + keyNameContains + "\\""' + END +
TAB + 'var keySearch = " \\"" + parentKey + "\\" /K /F \\"" + childKeyNameContains + "\\""' + END +
TAB + 'var bitContext = isAutoBitContext===false ? " /reg:64" : ""' + END +
TAB + 'var caseSens = isCaseSensitive ? " /C" : ""' + END +
TAB + 'var subSearch = isRecursive ? " /S" : ""' + END +
TAB + 'var regQuery = "REG QUERY " + keySearch + " /K " + bitContext + '
TAB + 'var regQuery = "@echo off & REG QUERY" + keySearch + bitContext + '
'caseSens + subSearch + '
'" 1>null 2>&1 && echo " + existsOutput + "\\n"' + END +
TAB + 'var result = installer.execute( "cmd.exe", ["/k"], regQuery )' + END +
Expand All @@ -2329,7 +2352,7 @@ def _genLib( self ):
TAB + 'var output' + END +
TAB + TRY +
(2*TAB) + 'var cmdOutLns = result[0].split(\"\\n\")' + END +
(2*TAB) + 'output = cmdOutLns[cmdOutLns.length-2].trim()' + END + EBLK +
(2*TAB) + 'output = cmdOutLns[1].trim()' + END + EBLK +
TAB + CATCH + 'output = null;' + EBLK +
TAB + 'var exists = output==existsOutput' + END +
TAB + _QtIfwScript.log( '"Registry key exists: " + exists', isAutoQuote=False ) +
Expand Down Expand Up @@ -2931,6 +2954,8 @@ def __init__( self,

self.isIntroductionPageVisible = True
self.introductionPageCallbackBody = None
self.introductionPageOnInstall = None
self.introductionPageOnMaintain = None
self.isAutoIntroductionPageCallback = True

self.isTargetDirectoryPageVisible = True
Expand Down Expand Up @@ -3479,8 +3504,14 @@ def __genIntroductionPageCallbackBody( self ):
self.introductionPageCallbackBody = (
_QtIfwScript.log("IntroductionPageCallback") +
_QtIfwScript.ifInstalling( isMultiLine=True ) +
_QtIfwScript.elevate() +
_QtIfwScript.elevate() +
(self.introductionPageOnInstall if
self.introductionPageOnInstall else "") +
_QtIfwScript.END_BLOCK +
_QtIfwScript.ELSE + _QtIfwScript.START_BLOCK +
(self.introductionPageOnMaintain if
self.introductionPageOnMaintain else "") +
_QtIfwScript.END_BLOCK +
_QtIfwScript.ifCmdLineSwitch( _QtIfwScript.AUTO_PILOT_CMD_ARG ) +
QtIfwControlScript.clickButton(
QtIfwControlScript.NEXT_BUTTON )
Expand Down
2 changes: 2 additions & 0 deletions docs/ConfigClasses.md
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,8 @@ Attributes & default values:
isIntroductionPageVisible = True
introductionPageCallbackBody = None
introductionPageOnInstall = None
introductionPageOnMaintain = None
isAutoIntroductionPageCallback = True

isTargetDirectoryPageVisible = True
Expand Down
15 changes: 9 additions & 6 deletions docs/LowLevel.md
Original file line number Diff line number Diff line change
Expand Up @@ -478,6 +478,7 @@ Static Functions:

quote( value )
_autoQuote( value, isAutoQuote )
_autoEscapeBackSlash( value, isAutoEscape )

toNull( v ) <convert Python None to QtScript null, else pass through>

Expand Down Expand Up @@ -591,10 +592,12 @@ Static Functions:
isAutoQuote=True ): pass
ifRegistryKeyExists( key, isAutoBitContext=True, isNegated=False,
isAutoQuote=True, isMultiLine=False )
registryKeyExistsLike( keyNameContains, isAutoBitContext=True,
registryKeyExistsLike( parentKey, childKeyNameContains,
isAutoBitContext=True,
isCaseSensitive=False, isRecursive=False,
isAutoQuote=True )
ifRegistryKeyExistsLike( keyNameContains, isAutoBitContext=True,
ifRegistryKeyExistsLike( parentKey, childKeyNameContains,
isAutoBitContext=True,
isCaseSensitive=False, isRecursive=False,
isNegated=False,
isAutoQuote=True, isMultiLine=False )
Expand Down Expand Up @@ -747,14 +750,14 @@ following add-on **QT SCRIPT** functions:
isOsRegisteredProgram()

registryKeyExists( key, isAutoBitContext )
registryKeyExistsLike( keyNameContains, isAutoBitContext,
isCaseSensitive, isRecursive )
registryKeyExistsLike( parentKey, childKeyNameContains,
isAutoBitContext, isCaseSensitive, isRecursive )

registryEntryValue( key, valueName, isAutoBitContext )
registryEntryExists( key, valueName, isAutoBitContext )
registryEntryExistsLike( key, valueNameContains, isAutoBitContext,
isCaseSensitive, isRecursive )
registryEntryExistsLike( key, valueNameContains,
isAutoBitContext, isCaseSensitive, isRecursive )
executeBatchDetached( scriptPath, bat, args )
executeVbScript( vbs )
Expand Down

0 comments on commit 4962e72

Please sign in to comment.