Changes associated with version 0.61:

[1] Updated to Java version 11.
[2] Updated to Python 3.6.
[3] Updated Glum library version 2.0.0-RC3.
[4] Updated Launch4J to version 3.14.
[5] Updated DistMaker build scripts.
This commit is contained in:
Norberto Lopez
2022-11-18 12:00:00 +00:00
committed by lopeznr1
parent a66a5d0f29
commit 6c565557ca
28 changed files with 755 additions and 564 deletions

View File

@@ -2,16 +2,7 @@
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="script"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="lib" path="lib/glum-1.3.7.jar" sourcepath="lib/glum-1.3.7-src.jar">
<attributes>
<attribute name="module" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="lib" path="lib/guava-18.0.jar" sourcepath="lib/guava-18.0-sources.jar">
<attributes>
<attribute name="module" value="true"/>
@@ -23,5 +14,6 @@
</attributes>
</classpathentry>
<classpathentry kind="lib" path="lib/miglayout-3.7.2-swing.jar"/>
<classpathentry kind="lib" path="lib/glum-2.0.0-RC3.jar" sourcepath="lib/glum-2.0.0-RC3-src.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@@ -1,15 +1,18 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false

View File

@@ -0,0 +1,63 @@
eclipse.preferences.version=1
editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
formatter_profile=_NobesFormat-2019Aug
formatter_settings_version=16
sp_cleanup.add_default_serial_version_id=true
sp_cleanup.add_generated_serial_version_id=false
sp_cleanup.add_missing_annotations=true
sp_cleanup.add_missing_deprecated_annotations=true
sp_cleanup.add_missing_methods=false
sp_cleanup.add_missing_nls_tags=false
sp_cleanup.add_missing_override_annotations=true
sp_cleanup.add_missing_override_annotations_interface_methods=true
sp_cleanup.add_serial_version_id=false
sp_cleanup.always_use_blocks=true
sp_cleanup.always_use_parentheses_in_expressions=false
sp_cleanup.always_use_this_for_non_static_field_access=false
sp_cleanup.always_use_this_for_non_static_method_access=false
sp_cleanup.convert_functional_interfaces=false
sp_cleanup.convert_to_enhanced_for_loop=false
sp_cleanup.correct_indentation=true
sp_cleanup.format_source_code=false
sp_cleanup.format_source_code_changes_only=false
sp_cleanup.insert_inferred_type_arguments=false
sp_cleanup.make_local_variable_final=true
sp_cleanup.make_parameters_final=false
sp_cleanup.make_private_fields_final=true
sp_cleanup.make_type_abstract_if_missing_method=false
sp_cleanup.make_variable_declarations_final=false
sp_cleanup.never_use_blocks=false
sp_cleanup.never_use_parentheses_in_expressions=true
sp_cleanup.on_save_use_additional_actions=true
sp_cleanup.organize_imports=true
sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
sp_cleanup.remove_private_constructors=true
sp_cleanup.remove_redundant_modifiers=false
sp_cleanup.remove_redundant_semicolons=false
sp_cleanup.remove_redundant_type_arguments=false
sp_cleanup.remove_trailing_whitespaces=true
sp_cleanup.remove_trailing_whitespaces_all=true
sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
sp_cleanup.remove_unnecessary_casts=true
sp_cleanup.remove_unnecessary_nls_tags=false
sp_cleanup.remove_unused_imports=false
sp_cleanup.remove_unused_local_variables=false
sp_cleanup.remove_unused_private_fields=true
sp_cleanup.remove_unused_private_members=false
sp_cleanup.remove_unused_private_methods=true
sp_cleanup.remove_unused_private_types=true
sp_cleanup.sort_members=false
sp_cleanup.sort_members_all=false
sp_cleanup.use_anonymous_class_creation=false
sp_cleanup.use_blocks=false
sp_cleanup.use_blocks_only_for_return_and_throw=false
sp_cleanup.use_lambda=true
sp_cleanup.use_parentheses_in_expressions=false
sp_cleanup.use_this_for_non_static_field_access=false
sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
sp_cleanup.use_this_for_non_static_method_access=false
sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true

Binary file not shown.

Binary file not shown.

BIN
lib/glum-2.0.0-RC3-src.jar Normal file

Binary file not shown.

BIN
lib/glum-2.0.0-RC3.jar Normal file

Binary file not shown.

View File

@@ -1,4 +1,4 @@
#! /usr/bin/env python
#! /usr/bin/env python3
import copy
import math
@@ -224,9 +224,8 @@ def buildDistTree(aBuildPath, aRootPath, aArgs, aJreNode):
# Write out the PkgInfo file
dstPath = os.path.join(aRootPath, appName + '.app', 'Contents', "PkgInfo")
f = open(dstPath, 'wb')
f.write('APPL????')
f.close()
with open(dstPath, mode='wt', encoding='utf-8', newline='\n') as tmpFO:
tmpFO.write('APPL????')
# Define the payloadPath for where to store the appLauncher
payloadPath = os.path.join(aRootPath, appName + '.app', 'Contents')
@@ -284,14 +283,14 @@ def buildDistTree(aBuildPath, aRootPath, aArgs, aJreNode):
# Update the .DS_Store file to reflect the new volume name
srcPath = os.path.join(aRootPath, '.DS_Store')
classPath = appInstallRoot + '/lib/glum-1.3.7.jar:' + appInstallRoot + '/lib/distMaker.jar:' + appInstallRoot + '/lib/guava-18.0.jar'
classPath = appInstallRoot + '/lib/glum-2.0.0-RC3.jar:' + appInstallRoot + '/lib/distMaker-0.61.jar:' + appInstallRoot + '/lib/guava-18.0.jar'
cmd = ['java', '-cp', classPath, 'dsstore.MainApp', srcPath, appName]
proc = miscUtils.executeAndLog(cmd, "\t\tdsstore.MainApp: ")
if proc.returncode != 0:
print('\tError: Failed to update .DS_Store. Return code: ' + str(proc.returncode))
def buildPListInfo(aDestFile, aArgs, aJreNode):
def buildPListInfo(aDstFile, aArgs, aJreNode):
"""Method that will construct and populate the Info.plist file. This file
defines the attributes associated with the (Apple) app."""
# Retrieve vars of interest
@@ -299,84 +298,82 @@ def buildPListInfo(aDestFile, aArgs, aJreNode):
if aArgs.icnsFile != None:
icnsStr = os.path.basename(aArgs.icnsFile)
f = open(aDestFile, 'wb')
# writeln(f, 0, '<?xml version="1.0" encoding="UTF-8" standalone="no"?>')
writeln(f, 0, '<?xml version="1.0" ?>')
writeln(f, 0, '<plist version="1.0">')
writeln(f, 1, '<dict>')
with open(aDstFile, mode='wt', encoding='utf-8', newline='\n') as tmpFO:
# writeln(tmpFO, 0, '<?xml version="1.0" encoding="UTF-8" standalone="no"?>')
writeln(tmpFO, 0, '<?xml version="1.0" ?>')
writeln(tmpFO, 0, '<plist version="1.0">')
writeln(tmpFO, 1, '<dict>')
tupL = []
tupL.append(('CFBundleDevelopmentRegion', 'English'))
tupL.append(('CFBundleExecutable', 'JavaAppLauncher'))
tupL.append(('CFBundleGetInfoString', aArgs.company))
tupL.append(('CFBundleInfoDictionaryVersion', 6.0))
tupL.append(('CFBundleIconFile', icnsStr))
tupL.append(('CFBundleIdentifier', aArgs.name.lower()))
tupL.append(('CFBundleDisplayName', aArgs.name))
tupL.append(('CFBundleName', aArgs.name))
tupL.append(('CFBundlePackageType', 'APPL'))
tupL.append(('CFBundleSignature', '????'))
tupL.append(('CFBundleVersion', aArgs.version))
tupL.append(('NSHighResolutionCapable', 'true'))
tupL.append(('NSHumanReadableCopyright', ''))
tupL = []
tupL.append(('CFBundleDevelopmentRegion', 'English'))
tupL.append(('CFBundleExecutable', 'JavaAppLauncher'))
tupL.append(('CFBundleGetInfoString', aArgs.company))
tupL.append(('CFBundleInfoDictionaryVersion', 6.0))
tupL.append(('CFBundleIconFile', icnsStr))
tupL.append(('CFBundleIdentifier', aArgs.name.lower()))
tupL.append(('CFBundleDisplayName', aArgs.name))
tupL.append(('CFBundleName', aArgs.name))
tupL.append(('CFBundlePackageType', 'APPL'))
tupL.append(('CFBundleSignature', '????'))
tupL.append(('CFBundleVersion', aArgs.version))
tupL.append(('NSHighResolutionCapable', 'true'))
tupL.append(('NSHumanReadableCopyright', ''))
# Define the JVM that is to be uesd
if aJreNode != None:
jrePath = jreUtils.getBasePathFor(aJreNode)
tupL.append(('JVMRuntime', jrePath))
else:
# tupL.append(('JVMVersion', '1.7+'))
raise Exception('Support for utilizing the system JRE has not been added yet.')
# Define the JVM that is to be uesd
if aJreNode != None:
jrePath = jreUtils.getBasePathFor(aJreNode)
tupL.append(('JVMRuntime', jrePath))
else:
# tupL.append(('JVMVersion', '1.7+'))
raise Exception('Support for utilizing the system JRE has not been added yet.')
# Define the main entry point (AppLauncher) and the working directory
tupL.append(('JVMMainClassName', 'appLauncher.AppLauncher'))
# Define the main entry point (AppLauncher) and the working directory
tupL.append(('JVMMainClassName', 'appLauncher.AppLauncher'))
cwdPath = os.path.join('$APP_ROOT', 'Contents', 'app')
tupL.append(('WorkingDirectory', cwdPath))
cwdPath = os.path.join('$APP_ROOT', 'Contents', 'app')
tupL.append(('WorkingDirectory', cwdPath))
# Application configuration
for (key, val) in tupL:
writeln(f, 2, '<key>' + key + '</key>')
writeln(f, 2, '<string>' + str(val) + '</string>')
# Application configuration
for (key, val) in tupL:
writeln(tmpFO, 2, '<key>' + key + '</key>')
writeln(tmpFO, 2, '<string>' + str(val) + '</string>')
# JVM options
jvmArgs = list(aArgs.jvmArgs)
if any(aStr.startswith('-Dapple.laf.useScreenMenuBar') == False for aStr in jvmArgs) == True:
jvmArgs.append('-Dapple.laf.useScreenMenuBar=true')
if any(aStr.startswith('-Dcom.apple.macos.useScreenMenuBar') == False for aStr in jvmArgs) == True:
jvmArgs.append('-Dcom.apple.macos.useScreenMenuBar=true')
if any(aStr.startswith('-Dcom.apple.macos.use-file-dialog-packages') == False for aStr in jvmArgs) == True:
jvmArgs.append('-Dcom.apple.macos.use-file-dialog-packages=true')
jvmArgs.append('-Dcom.apple.mrj.application.apple.menu.about.name=' + aArgs.name)
jvmArgs.append('-Dapple.awt.application.name=' + aArgs.name)
jvmArgs.append('-Djava.system.class.loader=appLauncher.RootClassLoader')
# if icnsStr != None:
# jvmArgs.append('-Xdock:icon=Contents/Resources/' + icnsStr)
# JVM options
jvmArgs = list(aArgs.jvmArgs)
if any(aStr.startswith('-Dapple.laf.useScreenMenuBar') == False for aStr in jvmArgs) == True:
jvmArgs.append('-Dapple.laf.useScreenMenuBar=true')
if any(aStr.startswith('-Dcom.apple.macos.useScreenMenuBar') == False for aStr in jvmArgs) == True:
jvmArgs.append('-Dcom.apple.macos.useScreenMenuBar=true')
if any(aStr.startswith('-Dcom.apple.macos.use-file-dialog-packages') == False for aStr in jvmArgs) == True:
jvmArgs.append('-Dcom.apple.macos.use-file-dialog-packages=true')
jvmArgs.append('-Dcom.apple.mrj.application.apple.menu.about.name=' + aArgs.name)
jvmArgs.append('-Dapple.awt.application.name=' + aArgs.name)
jvmArgs.append('-Djava.system.class.loader=appLauncher.RootClassLoader')
# if icnsStr != None:
# jvmArgs.append('-Xdock:icon=Contents/Resources/' + icnsStr)
writeln(f, 2, '<key>JVMOptions</key>')
writeln(f, 2, '<array>')
for aStr in jvmArgs:
writeln(f, 3, '<string>' + aStr + '</string>')
writeln(f, 2, '</array>')
writeln(tmpFO, 2, '<key>JVMOptions</key>')
writeln(tmpFO, 2, '<array>')
for aStr in jvmArgs:
writeln(tmpFO, 3, '<string>' + aStr + '</string>')
writeln(tmpFO, 2, '</array>')
# # ClassPath: AppLauncher
# writeln(f, 2, '<key>Java</key>')
# writeln(f, 2, '<dict>')
# # ClassPath: AppLauncher
# writeln(tmpFO, 2, '<key>Java</key>')
# writeln(tmpFO, 2, '<dict>')
#
# classPathStr = '$JAVAROOT/' + deployJreDist.getAppLauncherFileName()
# classPathStr = '$JAVAROOT/' + deployJreDist.getAppLauncherFileName()
#
# tupL = []
# tupL.append(('ClassPath', classPathStr))
# tupL = []
# tupL.append(('ClassPath', classPathStr))
#
# for (key, val) in tupL:
# writeln(f, 3, '<key>' + key + '</key>')
# writeln(f, 3, '<string>' + str(val) + '</string>')
# for (key, val) in tupL:
# writeln(tmpFO, 3, '<key>' + key + '</key>')
# writeln(tmpFO, 3, '<string>' + str(val) + '</string>')
#
# writeln(f, 2, '</dict>')
writeln(f, 1, '</dict>')
writeln(f, 0, '</plist>')
f.close()
# writeln(tmpFO, 2, '</dict>')
writeln(tmpFO, 1, '</dict>')
writeln(tmpFO, 0, '</plist>')
def checkSystemEnvironment():
@@ -386,9 +383,9 @@ def checkSystemEnvironment():
return True
def writeln(f, tabL, aStr, tabStr=' '):
def writeln(aFO, tabL, aStr, tabStr=' '):
tStr = ''
for i in range(tabL):
tStr += tabStr
f.write(tStr + aStr + '\n')
aFO.write(tStr + aStr + '\n')

View File

@@ -1,6 +1,5 @@
#! /usr/bin/env python
#! /usr/bin/env python3
from __future__ import print_function
import argparse
import os
import platform
@@ -11,7 +10,6 @@ import subprocess
import sys
import tempfile
import distutils.spawn
import jreUtils
import miscUtils
import appleUtils
@@ -73,12 +71,11 @@ def buildCatalogFile(aArgs, aDeltaPath):
# Save the records to the catalog file
dstPath = os.path.join(aDeltaPath, "catalog.txt")
f = open(dstPath, 'wb')
for aRecord in records:
f.write(','.join(aRecord) + '\n')
with open(dstPath, mode='wt', encoding='utf-8', newline='\n') as tmpFO:
for aRecord in records:
tmpFO.write(','.join(aRecord) + '\n')
f.write('exit\n')
f.close()
tmpFO.write('exit\n')
def checkForRequiredApplicationsAndExit():
@@ -87,26 +84,29 @@ def checkForRequiredApplicationsAndExit():
The current set of required applications are:
java, jar, (genisoimage or hdiutil)"""
# Check for java (version 1.8 or later)
evalPath = distutils.spawn.find_executable('java')
evalPath = shutil.which('java')
errL = []
if evalPath == None:
errL.append('Failed while trying to locate java. Please install Java')
else:
tmpStr = subprocess.check_output(['java', '-version'], stderr=subprocess.STDOUT)
pattern = '\"(\d+\.\d+).*\"'
verStr = re.search(pattern, tmpStr).groups()[0]
verVal = float(verStr)
if verVal < 1.8:
verStrRaw = subprocess.check_output(['java', '-version'], stderr=subprocess.STDOUT)
verStrRaw = verStrRaw.decode("utf-8")
pattern = '\"(\d+)(\.\d+)*.*\"'
verStrFull = re.search(pattern, verStrRaw).group().strip('"')
pattern = '(\d+)(\.\d+){0,1}'
verStrPart = re.search(pattern, verStrFull).group()
javaVer = float(verStrPart)
if javaVer < 1.8:
errL.append('Installed version of Java is too old. Require Java 1.8. Installed version: {}'.format(verVal))
# Check for jar
evalPath = distutils.spawn.find_executable('jar')
evalPath = shutil.which('jar')
if evalPath == None:
errL.append('Failed while trying to locate jar. Please install jar (typically included with Java)')
# Check for genisoimage or hdiutil
genisoimagePath = distutils.spawn.find_executable('genisoimage')
hdiutilPath = distutils.spawn.find_executable('hdiutil')
genisoimagePath = shutil.which('genisoimage')
hdiutilPath = shutil.which('hdiutil')
if genisoimagePath == None and hdiutilPath == None:
if platform.system() == 'Darwin':
errL.append('Failed while trying to locate executable hdiutil. Please install hdiutil')
@@ -137,7 +137,7 @@ def checkForSuggestedApplications():
The current set of suggested applications are:
ImageMagick:convert"""
retL = []
evalPath = distutils.spawn.find_executable('convert')
evalPath = shutil.which('convert')
if evalPath == None:
retL.append('Application \'convert\' was not found. Please install (ImageMagick) convert')
retL.append('\tWindows icons will not be supported when using argument: -iconFile.')
@@ -293,6 +293,22 @@ if __name__ == "__main__":
if args.javaCode != None and len(args.classPath) == 0:
args.classPath = getClassPath(args.javaCode)
# Ensure all specified classPath files exist
errMsgL = []
for aPath in args.classPath:
fullPath = os.path.join(args.javaCode, aPath)
if os.path.exists(fullPath) == False:
errMsgL += ['Specified file does not exist: ' + aPath]
elif os.path.isfile(fullPath) == False:
errMsgL += ['Specified path is not a regular file: ' + aPath]
if len(errMsgL) > 0:
print('There are issues with the --classPath argument.')
print('Utilized --javaCode argument: ' + args.javaCode)
for aErrMsg in errMsgL:
print(' ' + aErrMsg)
exit()
# Clean up the jvmArgs to replace the escape sequence '\-' to '-'
# and to ensure that all the args start with the '-' character
newJvmArgs = []
@@ -377,7 +393,11 @@ if __name__ == "__main__":
exit(-1)
dstPath = deltaCodePath;
try:
shutil.copytree(srcPath, dstPath, symlinks=False, ignore=checkReadable)
os.makedirs(deltaCodePath)
for aPath in args.classPath:
fullSrcPath = os.path.join(args.javaCode, aPath)
dstPath = os.path.join(deltaCodePath, os.path.basename(fullSrcPath))
shutil.copy(fullSrcPath, dstPath)
except (ErrorDM, shutil.Error) as aExp:
print(' [ERROR] There were issues while copying the javaCode files. Path: ' + srcPath)
print(' {}\n'.format(aExp), file=sys.stderr)

View File

@@ -1,4 +1,4 @@
#! /usr/bin/env python
#! /usr/bin/env python3
import argparse
import getpass
@@ -24,18 +24,17 @@ def getDistInfo(aDistPath):
exit()
exeMode = None
f = open(cfgFile, 'r')
for aLine in f:
aLine = aLine[:-1]
if aLine.startswith('-') == True:
exeMode = aLine;
elif exeMode == '-name' and len(aLine) > 0:
appName = aLine
elif exeMode == '-version' and len(aLine) > 0:
version = aLine
elif exeMode == '-buildDate' and len(aLine) > 0:
buildDate = aLine
f.close()
with open(cfgFile, mode='rt', encoding='utf-8') as tmpFO:
for aLine in tmpFO:
aLine = aLine[:-1]
if aLine.startswith('-') == True:
exeMode = aLine;
elif exeMode == '-name' and len(aLine) > 0:
appName = aLine
elif exeMode == '-version' and len(aLine) > 0:
version = aLine
elif exeMode == '-buildDate' and len(aLine) > 0:
buildDate = aLine
if appName == None or version == None or buildDate == None:
print('Distribution corresponding to the folder: ' + aDistPath + ' does not appear to be valid!')
@@ -51,16 +50,15 @@ def getDistInfo(aDistPath):
print('Release will not be deployed...')
exit()
f = open(catFile, 'r')
for aLine in f:
aLine = aLine[:-1]
tokenL = aLine.split(',')
# Check to see if legacy JREs are allowed
if len(tokenL) >= 2 and tokenL[0] == 'jre' and isLegacyJre == None:
isLegacyJre = False
if tokenL[1].strip().startswith('1.') == True:
isLegacyJre = True
f.close()
with open(catFile, mode='rt', encoding='utf-8') as tmpFO:
for aLine in tmpFO:
aLine = aLine[:-1]
tokenL = aLine.split(',')
# Check to see if legacy JREs are allowed
if len(tokenL) >= 2 and tokenL[0] == 'jre' and isLegacyJre == None:
isLegacyJre = False
if tokenL[1].strip().startswith('1.') == True:
isLegacyJre = True
if isLegacyJre == None:
print('Distribution corresponding to the folder: ' + aDistPath + ' does not appear to be valid!')
@@ -84,66 +82,61 @@ def addReleaseInfo(aDeployPath, aAppName, aVerStr, aBuildDate, aIsLegacyJre):
verFile = os.path.join(aDeployPath, 'releaseInfo.txt')
if os.path.isfile(verFile) == True:
# Read the legacy releases
f = open(verFile, 'r')
for aLine in f:
aLine = aLine[:-1]
# Ignore empty lines and comments
if len(aLine) == 0:
continue
if aLine.startswith('#') == True:
continue
with open(verFile, mode='rt', encoding='utf-8') as tmpFO:
for aLine in tmpFO:
aLine = aLine[:-1]
# Ignore empty lines and comments
if len(aLine) == 0:
continue
if aLine.startswith('#') == True:
continue
tokenL = aLine.split(',')
if len(tokenL) >= 2 and tokenL[0] == 'name':
isLegacyRelease = True
continue
tokenL = aLine.split(',')
if len(tokenL) >= 2 and tokenL[0] == 'name':
isLegacyRelease = True
continue
# Ignore legacy exit instructions
if len(tokenL) >= 1 and tokenL[0] == 'exit':
continue
# Ignore legacy exit instructions
if len(tokenL) >= 1 and tokenL[0] == 'exit':
continue
# Record all legacy releases
if len(tokenL) == 2:
legacyReleaseL += [(tokenL[0], tokenL[1])]
continue
f.close()
# Record all legacy releases
if len(tokenL) == 2:
legacyReleaseL += [(tokenL[0], tokenL[1])]
continue
# Create the appCatalog.txt file
catFile = os.path.join(aDeployPath, 'appCatalog.txt')
if os.path.isfile(catFile) == False:
if isLegacyRelease == True and len(legacyReleaseL) > 0:
f = open(catFile, 'w')
f.write('name' + ',' + aAppName + '\n\n')
# Copy the legacy releases
for (aLegacyVer, aLegacyDate) in legacyReleaseL:
f.write('R,{},{}\n'.format(aLegacyVer, aLegacyDate))
f.write('info,msg,This is a legacy release.\n')
f.write('info,msg,\n')
if aIsLegacyJre == True:
f.write('info,msg,Downgrading to this version may require a mandatory upgrade (ver: ' + aVerStr + ') before further upgrades are allowed.\n\n')
else:
f.write('# A release should be made using a legacy JRE (1.8+) and this DistMaker release. The release notes will need to be manually.\n')
f.write('info,msg,Downgrading to this version will require a mandatory 2-step upgrade in order to use releases made with non legacy JREs.\n\n')
f.close()
os.chmod(catFile, 0o644)
with open(catFile, mode='wt', encoding='utf-8', newline='\n') as tmpFO:
tmpFO.write('name' + ',' + aAppName + '\n\n')
# Copy the legacy releases
for (aLegacyVer, aLegacyDate) in legacyReleaseL:
tmpFO.write('R,{},{}\n'.format(aLegacyVer, aLegacyDate))
tmpFO.write('info,msg,This is a legacy release.\n')
tmpFO.write('info,msg,\n')
if aIsLegacyJre == True:
tmpFO.write('info,msg,Downgrading to this version may require a mandatory upgrade (ver: ' + aVerStr + ') before further upgrades are allowed.\n\n')
else:
tmpFO.write('# A release should be made using a legacy JRE (1.8+) and this DistMaker release. The release notes will need to be manually.\n')
tmpFO.write('info,msg,Downgrading to this version will require a mandatory 2-step upgrade in order to use releases made with non legacy JREs.\n\n')
else:
# Form the default (empty) appCatalog.txt
f = open(catFile, 'w')
f.write('name' + ',' + aAppName + '\n\n')
f.close()
os.chmod(catFile, 0o644)
with open(catFile, mode='wt', encoding='utf-8', newline='\n') as tmpFO:
tmpFO.write('name' + ',' + aAppName + '\n\n')
os.chmod(catFile, 0o644)
# Updated the appCatalog.txt info file
f = open(catFile, 'a')
f.write('R,{},{}\n'.format(aVerStr, aBuildDate))
f.write('info,msg,There are no release notes available.\n\n')
f.close()
with open(catFile, mode='at', encoding='utf-8', newline='\n') as tmpFO:
tmpFO.write('R,{},{}\n'.format(aVerStr, aBuildDate))
tmpFO.write('info,msg,There are no release notes available.\n\n')
# Update the (legacy) releaseInfo.txt file
if isLegacyRelease == True and aIsLegacyJre == True:
f = open(verFile, 'a')
f.write(aVerStr + ',' + aBuildDate + '\n')
f.close()
with open(verFile, mode='at', encoding='utf-8', newline='\n') as tmpFO:
tmpFO.write(aVerStr + ',' + aBuildDate + '\n')
def delReleaseInfoLegacy(aDeployPath, aAppName, aVerStr, aBuildDate):
@@ -155,22 +148,20 @@ def delReleaseInfoLegacy(aDeployPath, aAppName, aVerStr, aBuildDate):
# Read the file
releaseInfo = []
f = open(verFile, 'r')
for line in f:
tokens = line[:-1].split(',', 1);
if len(tokens) == 2 and tokens[0] == aVerStr:
# By not adding the current record to the releaseInfo list, we are effectively removing the record
print('Removing release record from info file. Version: ' + aVerStr)
elif len(tokens) == 2 and tokens[0] != 'name':
releaseInfo.append((tokens[0], tokens[1]))
f.close()
with open(verFile, mode='rt', encoding='utf-8') as tmpFO:
for line in tmpFO:
tokens = line[:-1].split(',', 1);
if len(tokens) == 2 and tokens[0] == aVerStr:
# By not adding the current record to the releaseInfo list, we are effectively removing the record
print('Removing release record from info file. Version: ' + aVerStr)
elif len(tokens) == 2 and tokens[0] != 'name':
releaseInfo.append((tokens[0], tokens[1]))
# Write the updated file
f = open(verFile, 'w')
f.write('name' + ',' + aAppName + '\n')
for verTup in releaseInfo:
f.write(verTup[0] + ',' + verTup[1] + '\n')
f.close()
with open(verFile, mode='wt', encoding='utf-8', newline='\n') as tmpFO:
tmpFO.write('name' + ',' + aAppName + '\n')
for verTup in releaseInfo:
tmpFO.write(verTup[0] + ',' + verTup[1] + '\n')
def delReleaseInfo(aDeployPath, aAppName, aVerStr, aBuildDate):
@@ -188,33 +179,31 @@ def delReleaseInfo(aDeployPath, aAppName, aVerStr, aBuildDate):
# Read the file (and skip over all lines found after the release we are searching for)
isDeleteMode = False
passLineL = []
f = open(catFile, 'r')
for aLine in f:
aLine = aLine[:-1]
tokenL = aLine.split(',');
# Determine when to enter / exit isDeleteMode
if len(tokenL) == 3 and tokenL[0] == 'R' and tokenL[1] == aVerStr:
# By not adding the current record to the releaseInfo list, we are effectively removing the record
isDeleteMode = True
# We exit deleteMode when see a different release or exit instruction
elif len(tokenL) == 3 and tokenL[0] == 'R' and tokenL[1] != aVerStr:
isDeleteMode = False
elif len(tokenL) >= 1 and tokenL[0] == 'exit':
isDeleteMode = False
with open(catFile, mode='rt', encoding='utf-8') as tmpFO:
for aLine in tmpFO:
aLine = aLine[:-1]
tokenL = aLine.split(',');
# Determine when to enter / exit isDeleteMode
if len(tokenL) == 3 and tokenL[0] == 'R' and tokenL[1] == aVerStr:
# By not adding the current record to the releaseInfo list, we are effectively removing the record
isDeleteMode = True
# We exit deleteMode when see a different release or exit instruction
elif len(tokenL) == 3 and tokenL[0] == 'R' and tokenL[1] != aVerStr:
isDeleteMode = False
elif len(tokenL) >= 1 and tokenL[0] == 'exit':
isDeleteMode = False
# Skip to next if we are in deleteMode
if isDeleteMode == True:
continue
# Skip to next if we are in deleteMode
if isDeleteMode == True:
continue
# Save off all lines when we are not in delete mode
passLineL += [aLine]
f.close()
# Save off all lines when we are not in delete mode
passLineL += [aLine]
# Write the updated file
f = open(catFile, 'w')
for aLine in passLineL:
f.write(aLine + '\n')
f.close()
with open(catFile, mode='wt', encoding='utf-8', newline='\n') as tmpFO:
for aLine in passLineL:
tmpFO.write(aLine + '\n')
def addRelease(aRootPath, aAppName, aVerStr, aBuildDate, aIsLegacyJre):
@@ -223,8 +212,8 @@ def addRelease(aRootPath, aAppName, aVerStr, aBuildDate, aIsLegacyJre):
if os.path.isdir(deployPath) == False:
print('Application ' + aAppName + ' has never been deployed to the root location: ' + aRootPath)
print('Create a new release of the application at the specified location?')
input = raw_input('--> ').upper()
if input != 'Y' and input != 'YES':
tmpAns = input('--> ').upper()
if tmpAns != 'Y' and tmpAns != 'YES':
print('Release will not be made for app ' + aAppName)
exit()

View File

@@ -1,6 +1,5 @@
#! /usr/bin/env python
#! /usr/bin/env python3
from __future__ import print_function
import argparse
import collections
import getpass
@@ -83,20 +82,18 @@ def addAppLauncherRelease(aRootPath):
# Create the appCatalog file
catFile = os.path.join(deployPath, 'appCatalog.txt')
if os.path.isfile(catFile) == False:
f = open(catFile, 'w')
f.write('name' + ',' + 'AppLauncher' + '\n')
f.write('digest' + ',' + 'sha256' + '\n\n')
f.close()
with open(catFile, mode='wt', encoding='utf-8', newline='\n') as tmpFO:
tmpFO.write('name' + ',' + 'AppLauncher' + '\n')
tmpFO.write('digest' + ',' + 'sha256' + '\n\n')
os.chmod(catFile, 0o644)
# Updated the appCatalog file
f = open(catFile, 'a')
digestStr = miscUtils.computeDigestForFile(srcFile, 'sha256')
stat = os.stat(srcFile)
fileLen = stat.st_size
f.write("F,{},{},{},{}\n".format(digestStr, fileLen, dstFileName, version))
# f.write('\n')
f.close()
with open(catFile, mode='at', encoding='utf-8', newline='\n') as tmpFO:
digestStr = miscUtils.computeDigestForFile(srcFile, 'sha256')
stat = os.stat(srcFile)
fileLen = stat.st_size
tmpFO.write("F,{},{},{},{}\n".format(digestStr, fileLen, dstFileName, version))
# tmpFO.write('\n')
# Copy the src appLauncher.jar file to it's deployed location
shutil.copy2(srcFile, dstFile)
@@ -112,8 +109,8 @@ def addRelease(aRootPath, aJreNodeL, aVerStr):
if os.path.isdir(installPath) == False:
regPrintln('A JRE has never been deployed to the root location: ' + aRootPath)
regPrintln('Create a new release of the JRE at the specified location?')
input = raw_input('--> ').upper()
if input != 'Y' and input != 'YES':
tmpAns = input('--> ').upper()
if tmpAns != 'Y' and tmpAns != 'YES':
regPrintln('Release will not be made for JRE version: ' + aVerStr)
exit()
@@ -141,27 +138,25 @@ def addReleaseInfo(aInstallPath, aJreNodeL, aVerStr):
# Create the jreCatalogfile
catFile = os.path.join(aInstallPath, 'jreCatalog.txt')
if os.path.isfile(catFile) == False:
f = open(catFile, 'w')
f.write('name' + ',' + 'JRE' + '\n')
f.write('digest' + ',' + 'sha256' + '\n\n')
# Note new JRE catalogs require DistMaker versions 0.55 or later
f.write('exit,DistMaker,0.55' + '\n\n')
f.close()
with open(catFile, mode='wt', encoding='utf-8', newline='\n') as tmpFO:
tmpFO.write('name' + ',' + 'JRE' + '\n')
tmpFO.write('digest' + ',' + 'sha256' + '\n\n')
# Note new JRE catalogs require DistMaker versions 0.55 or later
tmpFO.write('exit,DistMaker,0.55' + '\n\n')
os.chmod(catFile, 0o644)
exitVerDM = [0, 55]
# Determine the last exit,DistMaker instruction specified
else:
f = open(catFile, 'r')
for line in f:
tokens = line[:-1].split(',');
# Record the (exit) version of interest
if len(tokens) == 3 and tokens[0] == 'exit' and tokens[1] == 'DistMaker':
try:
exitVerDM = jreUtils.verStrToVerArr(tokens[2])
except:
exitVerDM = None
f.close()
with open(catFile, mode='rt', encoding='utf-8') as tmpFO:
for line in tmpFO:
tokens = line[:-1].split(',');
# Record the (exit) version of interest
if len(tokens) == 3 and tokens[0] == 'exit' and tokens[1] == 'DistMaker':
try:
exitVerDM = jreUtils.verStrToVerArr(tokens[2])
except:
exitVerDM = None
# Locate the list of JREs with a matching version
matchJreNodeL = jreUtils.getJreNodesForVerStr(aJreNodeL, aVerStr)
@@ -176,29 +171,28 @@ def addReleaseInfo(aInstallPath, aJreNodeL, aVerStr):
needExitInstr = True
# Updated the jreCatalogfile
f = open(catFile, 'a')
# Write the exit info to stop legacy DistMakers from processing further
if needExitInstr == True:
f.write('exit,DistMaker,0.48\n\n')
# Write out the JRE release info
f.write("jre,{}\n".format(aVerStr))
if needExitInstr == True:
f.write("require,AppLauncher,0.1,0.2\n")
for aJreNode in matchJreNodeL:
tmpFile = aJreNode.getFile()
stat = os.stat(tmpFile)
digestStr = miscUtils.computeDigestForFile(tmpFile, 'sha256')
fileLen = stat.st_size
archStr = aJreNode.getArchitecture();
platStr = aJreNode.getPlatform()
if exitVerDM != None and exitVerDM > [0, 54]:
f.write("F,{},{},{},{},{}\n".format(archStr, platStr, os.path.basename(tmpFile), digestStr, fileLen))
elif exitVerDM != None:
f.write("F,{},{},{},{}\n".format(digestStr, fileLen, platStr, os.path.basename(tmpFile)))
else:
f.write("F,{},{},{}\n".format(digestStr, fileLen, os.path.basename(tmpFile)))
f.write('\n')
f.close()
with open(catFile, mode='at', encoding='utf-8', newline='\n') as tmpFO:
# Write the exit info to stop legacy DistMakers from processing further
if needExitInstr == True:
tmpFO.write('exit,DistMaker,0.48\n\n')
# Write out the JRE release info
tmpFO.write("jre,{}\n".format(aVerStr))
if needExitInstr == True:
tmpFO.write("require,AppLauncher,0.1,0.2\n")
for aJreNode in matchJreNodeL:
tmpFile = aJreNode.getFile()
stat = os.stat(tmpFile)
digestStr = miscUtils.computeDigestForFile(tmpFile, 'sha256')
fileLen = stat.st_size
archStr = aJreNode.getArchitecture();
platStr = aJreNode.getPlatform()
if exitVerDM != None and exitVerDM > [0, 54]:
tmpFO.write("F,{},{},{},{},{}\n".format(archStr, platStr, os.path.basename(tmpFile), digestStr, fileLen))
elif exitVerDM != None:
tmpFO.write("F,{},{},{},{}\n".format(digestStr, fileLen, platStr, os.path.basename(tmpFile)))
else:
tmpFO.write("F,{},{},{}\n".format(digestStr, fileLen, os.path.basename(tmpFile)))
tmpFO.write('\n')
destPath = os.path.join(aInstallPath, aVerStr)
os.makedirs(destPath, 0o755)
@@ -248,29 +242,27 @@ def delReleaseInfo(aInstallPath, aVerStr):
# Read the file
inputLineL = []
isDeleteMode = False
f = open(catFile, 'r')
for line in f:
tokens = line[:-1].split(',', 1);
# Switch to deleteMode when we find a matching JRE release
if len(tokens) == 2 and tokens[0] == 'jre' and tokens[1] == aVerStr:
isDeleteMode = True
continue
# Switch out of deleteMode when we find a different JRE release
elif len(tokens) == 2 and tokens[0] == 'jre' and tokens[1] != aVerStr:
isDeleteMode = False
# Skip over the input line if we are in deleteMode
elif isDeleteMode == True:
continue
with open(catFile, mode='rt', encoding='utf-8') as tmpFO:
for line in tmpFO:
tokens = line[:-1].split(',', 1);
# Switch to deleteMode when we find a matching JRE release
if len(tokens) == 2 and tokens[0] == 'jre' and tokens[1] == aVerStr:
isDeleteMode = True
continue
# Switch out of deleteMode when we find a different JRE release
elif len(tokens) == 2 and tokens[0] == 'jre' and tokens[1] != aVerStr:
isDeleteMode = False
# Skip over the input line if we are in deleteMode
elif isDeleteMode == True:
continue
# Save off the input line
inputLineL.append(line)
f.close()
# Save off the input line
inputLineL.append(line)
# Write the updated file
f = open(catFile, 'w')
for aLine in inputLineL:
f.write(aLine)
f.close()
with open(catFile, mode='wt', encoding='utf-8', newline='\n') as tmpFO:
for aLine in inputLineL:
tmpFO.write(aLine)
def showReleaseInfo(aRootPath, aJreNodeL):

View File

@@ -1,4 +1,4 @@
#! /usr/bin/env python
#! /usr/bin/env python3
import glob
import os
@@ -110,7 +110,7 @@ def getJreNode(aJreNodeL, aArchStr, aPlatStr, aJvmVerSpec):
any specific update for a major version of JAVA then just specify the major version. Example '1.8' instead of
1.8.0_73'"""
# Transform a single string to a list of size 1
if isinstance(aJvmVerSpec, basestring):
if isinstance(aJvmVerSpec, str):
aJvmVerSpec = [aJvmVerSpec]
# Retrieve the min and max JVM versions from aJvmVerSpec
@@ -185,8 +185,8 @@ def loadJreCatalog(aFile):
# Read the file
regPrintln('Loading JRE catalog: {}'.format(aFile))
with open(aFile, 'r') as workF:
for (lineNum, aLine) in enumerate(workF, 1):
with open(aFile, mode='rt', encoding='utf-8') as tmpFO:
for (lineNum, aLine) in enumerate(tmpFO, 1):
# Skip empty lines / comments
line = aLine.strip()
if len(line) == 0 or line[0] == '#':

View File

@@ -1,4 +1,4 @@
#! /usr/bin/env python
#! /usr/bin/env python3
import copy
import os
@@ -109,7 +109,7 @@ def buildDistTree(aBuildPath, aRootPath, aArgs, aJreNode):
jreUtils.unpackAndRenameToStandard(aJreNode, aRootPath)
def buildBashScript(aDestFile, aArgs, aJreNode):
def buildBashScript(aDstFile, aArgs, aJreNode):
# Form the jvmArgStr but strip away the -Xmx* component if it is specified
# since the JVM maxMem is dynamically configurable (via DistMaker)
maxMem = None
@@ -120,63 +120,61 @@ def buildBashScript(aDestFile, aArgs, aJreNode):
else:
jvmArgsStr += aStr + ' '
f = open(aDestFile, 'wb')
# f.write('#!/bin/bash\n')
f.write('#!/usr/bin/env bash\n')
with open(aDstFile, mode='wt', encoding='utf-8', newline='\n') as tmpFO:
# tmpFO.write('#!/bin/bash\n')
tmpFO.write('#!/usr/bin/env bash\n')
f.write('# Do not remove the opening or closing brackets: {}. This enables safe inline\n')
f.write('# mutations to this script while it is running\n')
f.write('{ # Do not remove this bracket! \n\n')
tmpFO.write('# Do not remove the opening or closing brackets: {}. This enables safe inline\n')
tmpFO.write('# mutations to this script while it is running\n')
tmpFO.write('{ # Do not remove this bracket! \n\n')
f.write('# Define where the Java executable is located\n')
if aJreNode == None:
f.write('javaExe=java\n\n')
else:
jrePath = jreUtils.getBasePathFor(aJreNode)
f.write('javaExe=../' + jrePath + '/bin/java\n\n')
tmpFO.write('# Define where the Java executable is located\n')
if aJreNode == None:
tmpFO.write('javaExe=java\n\n')
else:
jrePath = jreUtils.getBasePathFor(aJreNode)
tmpFO.write('javaExe=../' + jrePath + '/bin/java\n\n')
f.write('# Define the maximum memory to allow the application to utilize\n')
if maxMem == None:
f.write('#maxMem=512m # Uncomment out this line to change from defaults.\n\n')
else:
f.write('maxMem=' + maxMem + '\n\n')
tmpFO.write('# Define the maximum memory to allow the application to utilize\n')
if maxMem == None:
tmpFO.write('#maxMem=512m # Uncomment out this line to change from defaults.\n\n')
else:
tmpFO.write('maxMem=' + maxMem + '\n\n')
f.write('# Get the installation path\n')
f.write('# We support the Linux / Macosx variants explicitly and then default back to Linux\n')
f.write('if [ "$(uname -s)" == "Darwin" ]; then\n')
f.write(' # Macosx platform: We assume the coreutils package has been installed...\n')
f.write(' installPath=$(greadlink -f "$BASH_SOURCE")\n')
f.write('elif [ "$(uname -s)" == "Linux" ]; then\n')
f.write(' # Linux platform\n')
f.write(' installPath=$(readlink -f "$BASH_SOURCE")\n')
f.write('else\n')
f.write(' # Other platform: ---> Defaults back to Linux platform\n')
f.write(' installPath=$(readlink -f "$BASH_SOURCE")\n')
f.write('fi\n')
f.write('installPath=$(dirname "$installPath")\n\n')
tmpFO.write('# Get the installation path\n')
tmpFO.write('# We support the Linux / Macosx variants explicitly and then default back to Linux\n')
tmpFO.write('if [ "$(uname -s)" == "Darwin" ]; then\n')
tmpFO.write(' # Macosx platform: We assume the coreutils package has been installed...\n')
tmpFO.write(' installPath=$(greadlink -f "$BASH_SOURCE")\n')
tmpFO.write('elif [ "$(uname -s)" == "Linux" ]; then\n')
tmpFO.write(' # Linux platform\n')
tmpFO.write(' installPath=$(readlink -f "$BASH_SOURCE")\n')
tmpFO.write('else\n')
tmpFO.write(' # Other platform: ---> Defaults back to Linux platform\n')
tmpFO.write(' installPath=$(readlink -f "$BASH_SOURCE")\n')
tmpFO.write('fi\n')
tmpFO.write('installPath=$(dirname "$installPath")\n\n')
f.write('# Change the working directory to the app folder in the installation path\n')
f.write('cd "$installPath"/app\n\n')
tmpFO.write('# Change the working directory to the app folder in the installation path\n')
tmpFO.write('cd "$installPath"/app\n\n')
f.write('# Setup the xmxStr to define the maximum JVM memory.\n')
f.write('if [ -z ${maxMem+x} ]; then\n')
f.write(' xmxStr=""\n')
f.write('else\n')
f.write(' xmxStr=\'-Xmx\'$maxMem\n')
f.write('fi\n\n')
tmpFO.write('# Setup the xmxStr to define the maximum JVM memory.\n')
tmpFO.write('if [ -z ${maxMem+x} ]; then\n')
tmpFO.write(' xmxStr=""\n')
tmpFO.write('else\n')
tmpFO.write(' xmxStr=\'-Xmx\'$maxMem\n')
tmpFO.write('fi\n\n')
exeCmd = '$javaExe ' + jvmArgsStr + '$xmxStr -Djava.system.class.loader=appLauncher.RootClassLoader '
exeCmd = exeCmd + '-cp ../launcher/' + deployJreDist.getAppLauncherFileName() + ' appLauncher.AppLauncher $*'
f.write('# Run the application\n')
f.write(exeCmd + '\n\n')
exeCmd = '$javaExe ' + jvmArgsStr + '$xmxStr -Djava.system.class.loader=appLauncher.RootClassLoader '
exeCmd = exeCmd + '-cp ../launcher/' + deployJreDist.getAppLauncherFileName() + ' appLauncher.AppLauncher $*'
tmpFO.write('# Run the application\n')
tmpFO.write(exeCmd + '\n\n')
f.write('exit # Do not remove this exit! (just before the bracket)\n')
f.write('} # Do not remove this bracket! \n\n')
f.close()
tmpFO.write('exit # Do not remove this exit! (just before the bracket)\n')
tmpFO.write('} # Do not remove this bracket! \n\n')
# Make the script executable
os.chmod(aDestFile, 00755)
os.chmod(aDstFile, 0o755)
def checkSystemEnvironment():

View File

@@ -1,3 +1,5 @@
#! /usr/bin/env python3
import hashlib
import os
import time

View File

@@ -1,4 +1,5 @@
#! /usr/bin/env python
#! /usr/bin/env python3
import argparse
import hashlib
import os
@@ -56,14 +57,14 @@ def computeDigestForFile(evalFile, digestType, block_size=2**20):
else:
raise ErrorDM('Unrecognized hash function: ' + digestType);
f = open(evalFile, 'rb')
while True:
data = f.read(block_size)
if not data:
break
hash.update(data)
f.close()
return hash.hexdigest()
with open(evalFile, mode='rb') as tmpFO:
while True:
data = tmpFO.read(block_size)
if not data:
break
hash.update(data)
return hash.hexdigest()
def getPlatformTypes(aPlatformArr, aPlatformStr):
@@ -103,7 +104,7 @@ def executeAndLog(aCommand, indentStr=""):
try:
proc = subprocess.Popen(aCommand, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
proc.wait()
outStr = proc.stdout.read()
outStr = proc.stdout.read().decode('utf-8')
if outStr != "":
outStr = logUtils.appendLogOutputWithText(outStr, indentStr)
print(outStr)
@@ -164,13 +165,7 @@ def requirePythonVersion(aVer):
exit(-1)
def buildAppLauncherConfig(aDestFile, aArgs):
classPathStr = ''
for aStr in aArgs.classPath:
classPathStr += 'java/' + aStr + ':'
if len(classPathStr) > 0:
classPathStr = classPathStr[0:-1]
def buildAppLauncherConfig(aDstFile, aArgs):
jvmArgsStr = ''
for aStr in aArgs.jvmArgs:
if len(aStr) > 2 and aStr[0:1] == '\\':
@@ -181,41 +176,39 @@ def buildAppLauncherConfig(aDestFile, aArgs):
for aStr in aArgs.appArgs:
appArgsStr += ' ' + aStr
f = open(aDestFile, 'wb')
with open(aDstFile, mode='wt', encoding='utf-8', newline='\n') as tmpFO:
# App name section
tmpFO.write('-name\n')
tmpFO.write(aArgs.name + '\n')
tmpFO.write('\n')
# App name section
f.write('-name\n')
f.write(aArgs.name + '\n')
f.write('\n')
# Version section
tmpFO.write('-version\n')
tmpFO.write(aArgs.version + '\n')
tmpFO.write('\n')
# Version section
f.write('-version\n')
f.write(aArgs.version + '\n')
f.write('\n')
# Build date section
exeDate = time.localtime()
buildDate = time.strftime('%Y%b%d %H:%M:%S', exeDate)
tmpFO.write('-buildDate\n')
tmpFO.write(buildDate + '\n')
tmpFO.write('\n')
# Build date section
exeDate = time.localtime()
buildDate = time.strftime('%Y%b%d %H:%M:%S', exeDate)
f.write('-buildDate\n')
f.write(buildDate + '\n')
f.write('\n')
# MainClass section
tmpFO.write('-mainClass\n')
tmpFO.write(aArgs.mainClass + '\n')
tmpFO.write('\n')
# MainClass section
f.write('-mainClass\n')
f.write(aArgs.mainClass + '\n')
f.write('\n')
# ClassPath section
tmpFO.write('-classPath\n')
for aPath in aArgs.classPath:
fileName = os.path.basename(aPath)
tmpFO.write(fileName + '\n')
tmpFO.write('\n')
# ClassPath section
f.write('-classPath\n')
for aStr in aArgs.classPath:
f.write(aStr + '\n')
f.write('\n')
# Application args section
f.write('-appArgs\n')
for aStr in aArgs.appArgs:
f.write(aStr + '\n')
f.write('\n')
f.close()
# Application args section
tmpFO.write('-appArgs\n')
for aStr in aArgs.appArgs:
tmpFO.write(aStr + '\n')
tmpFO.write('\n')

View File

@@ -1,4 +1,4 @@
#! /usr/bin/env python
#! /usr/bin/env python3
import copy
import glob
@@ -55,13 +55,13 @@ def buildRelease(aArgs, aBuildPath, aJreNodeL):
appInstallRoot = os.path.dirname(appInstallRoot)
l4jPath = os.path.join(appInstallRoot, 'template', 'launch4j')
if platform.system() == 'Darwin':
exeCmd = ['tar', '-C', tmpPath, '-xf', l4jPath + '/launch4j-3.12-macosx-x86.tgz']
exeCmd = ['tar', '-C', tmpPath, '-xf', l4jPath + '/launch4j-3.14-macosx-x86.tgz']
else:
is64Bit = sys.maxsize > 2**32
if is64Bit == True:
exeCmd = ['tar', '-C', tmpPath, '-xf', l4jPath + '/launch4j-3.12-linux-x64.tgz']
exeCmd = ['tar', '-C', tmpPath, '-xf', l4jPath + '/launch4j-3.14-linux-x64.tgz']
else:
exeCmd = ['tar', '-C', tmpPath, '-xf', l4jPath + '/launch4j-3.12-linux.tgz']
exeCmd = ['tar', '-C', tmpPath, '-xf', l4jPath + '/launch4j-3.14-linux.tgz']
retCode = subprocess.call(exeCmd)
if retCode != 0:
print('Failed to extract launch4j package...')
@@ -166,66 +166,65 @@ def buildDistTree(aBuildPath, aRootPath, aArgs, aJreNode):
if winIconFile != None:
os.remove(winIconFile)
def buildLaunch4JConfig(aDestFile, aArgs, aJreNode, aIconFile):
f = open(aDestFile, 'wb')
def buildLaunch4JConfig(aDstFile, aArgs, aJreNode, aIconFile):
with open(aDstFile, mode='wt', encoding='utf-8', newline='\n') as tmpFO:
writeln(f, 0, "<launch4jConfig>")
if aArgs.debug == True:
writeln(f, 1, "<headerType>console</headerType>");
else:
writeln(f, 1, "<headerType>gui</headerType>");
writeln(f, 1, "<outfile>" + aArgs.name + ".exe</outfile>");
writeln(f, 1, "<dontWrapJar>true</dontWrapJar>");
writeln(f, 1, "<errTitle>" + aArgs.name + "</errTitle>");
writeln(f, 1, "<downloadUrl>http://java.com/download</downloadUrl>");
# writeln(f, 1, "<supportUrl>url</supportUrl>");
writeln(tmpFO, 0, "<launch4jConfig>")
if aArgs.debug == True:
writeln(tmpFO, 1, "<headerType>console</headerType>");
else:
writeln(tmpFO, 1, "<headerType>gui</headerType>");
writeln(tmpFO, 1, "<outfile>" + aArgs.name + ".exe</outfile>");
writeln(tmpFO, 1, "<dontWrapJar>true</dontWrapJar>");
writeln(tmpFO, 1, "<errTitle>" + aArgs.name + "</errTitle>");
writeln(tmpFO, 1, "<downloadUrl>http://java.com/download</downloadUrl>");
# writeln(tmpFO, 1, "<supportUrl>url</supportUrl>");
# writeln(f, 1, "<cmdLine>app.cfg</cmdLine>");
writeln(f, 1, "<chdir>app/</chdir>");
writeln(f, 1, "<priority>normal</priority>");
writeln(f, 1, "<customProcName>true</customProcName>");
writeln(f, 1, "<stayAlive>false</stayAlive>");
if aIconFile != None:
writeln(f, 1, "<icon>" + aIconFile + "</icon>");
# writeln(tmpFO, 1, "<cmdLine>app.cfg</cmdLine>");
writeln(tmpFO, 1, "<chdir>app/</chdir>");
writeln(tmpFO, 1, "<priority>normal</priority>");
writeln(tmpFO, 1, "<customProcName>true</customProcName>");
writeln(tmpFO, 1, "<stayAlive>false</stayAlive>");
if aIconFile != None:
writeln(tmpFO, 1, "<icon>" + aIconFile + "</icon>");
writeln(f, 1, "<classPath>");
writeln(f, 2, "<mainClass>appLauncher.AppLauncher</mainClass>");
writeln(f, 2, "<cp>../launcher/" + deployJreDist.getAppLauncherFileName() + "</cp>");
writeln(f, 1, "</classPath>");
writeln(tmpFO, 1, "<classPath>");
writeln(tmpFO, 2, "<mainClass>appLauncher.AppLauncher</mainClass>");
writeln(tmpFO, 2, "<cp>../launcher/" + deployJreDist.getAppLauncherFileName() + "</cp>");
writeln(tmpFO, 1, "</classPath>");
if aArgs.forceSingleInstance != False:
writeln(f, 0, "");
writeln(f, 1, "<singleInstance>");
writeln(f, 2, "<mutexName>" + aArgs.name + ".mutex</mutexName>");
writeln(f, 2, "<windowTitle>" + aArgs.name + "</windowTitle>");
writeln(f, 1, "</singleInstance>");
if aArgs.forceSingleInstance != False:
writeln(tmpFO, 0, "");
writeln(tmpFO, 1, "<singleInstance>");
writeln(tmpFO, 2, "<mutexName>" + aArgs.name + ".mutex</mutexName>");
writeln(tmpFO, 2, "<windowTitle>" + aArgs.name + "</windowTitle>");
writeln(tmpFO, 1, "</singleInstance>");
writeln(f, 0, "");
writeln(f, 1, "<jre>");
if aJreNode != None:
jrePath = jreUtils.getBasePathFor(aJreNode)
writeln(f, 2, "<path>" + jrePath + "</path>");
else:
jreVer = getJreMajorVersion(aArgs.jreVerSpec)
writeln(f, 2, "<minVersion>" + jreVer + "</minVersion>"); # Valid values: '1.7.0' or '1.8.0' ...
writeln(f, 2, "<jdkPreference>preferJre</jdkPreference>"); # Valid values: jreOnlyjdkOnly|preferJre|preferJdk
for aJvmArg in aArgs.jvmArgs:
writeln(f, 2, "<opt>" + aJvmArg + "</opt>");
writeln(f, 2, "<opt>-Djava.system.class.loader=appLauncher.RootClassLoader</opt>");
writeln(f, 1, "</jre>");
writeln(tmpFO, 0, "");
writeln(tmpFO, 1, "<jre>");
if aJreNode != None:
jrePath = jreUtils.getBasePathFor(aJreNode)
writeln(tmpFO, 2, "<path>" + jrePath + "</path>");
else:
jreVer = getJreMajorVersion(aArgs.jreVerSpec)
writeln(tmpFO, 2, "<minVersion>" + jreVer + "</minVersion>"); # Valid values: '1.7.0' or '1.8.0' ...
writeln(tmpFO, 2, "<jdkPreference>preferJre</jdkPreference>"); # Valid values: jreOnlyjdkOnly|preferJre|preferJdk
for aJvmArg in aArgs.jvmArgs:
writeln(tmpFO, 2, "<opt>" + aJvmArg + "</opt>");
writeln(tmpFO, 2, "<opt>-Djava.system.class.loader=appLauncher.RootClassLoader</opt>");
writeln(tmpFO, 1, "</jre>");
writeln(f, 0, "");
writeln(f, 1, "<messages>");
writeln(f, 2, "<startupErr>" + aArgs.name + " error...</startupErr>");
writeln(f, 2, "<bundledJreErr>Failed to locate the bundled JRE</bundledJreErr>");
writeln(f, 2, "<jreVersionErr>Located JRE is not the proper version.</jreVersionErr>");
writeln(f, 2, "<launcherErr>Failed to launch " + aArgs.name + "</launcherErr>");
writeln(f, 1, "</messages>");
writeln(tmpFO, 0, "");
writeln(tmpFO, 1, "<messages>");
writeln(tmpFO, 2, "<startupErr>" + aArgs.name + " error...</startupErr>");
writeln(tmpFO, 2, "<bundledJreErr>Failed to locate the bundled JRE</bundledJreErr>");
writeln(tmpFO, 2, "<jreVersionErr>Located JRE is not the proper version.</jreVersionErr>");
writeln(tmpFO, 2, "<launcherErr>Failed to launch " + aArgs.name + "</launcherErr>");
writeln(tmpFO, 1, "</messages>");
writeln(f, 0, "")
writeln(f, 0, "</launch4jConfig>")
f.write('\n')
f.close()
writeln(tmpFO, 0, "")
writeln(tmpFO, 0, "</launch4jConfig>")
tmpFO.write('\n')
def checkSystemEnvironment():

View File

@@ -15,7 +15,7 @@ import glum.version.Version;
public class DistApp
{
/** The DistMaker version is defined here. */
public static final Version version = new PlainVersion(0, 57, 0);
public static final Version version = new PlainVersion(0, 61, 0);
/**
* Main entry point that will print out the version of DistMaker to stdout.

View File

@@ -12,8 +12,6 @@ import java.util.*;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import com.google.common.base.Joiner;
import distMaker.gui.PickReleasePanel;
import distMaker.jre.*;
import distMaker.node.*;
@@ -142,14 +140,16 @@ public class DistMakerEngine
*/
public UpdateStatus isUpToDate()
{
LoggingTask task = new LoggingTask();
var task = new BufferTask();
// LoggingTask task = new LoggingTask();
String appName = currRelease.getName();
List<AppRelease> unsortedReleaseL = DistUtils.getAvailableAppReleases(task, updateSiteUrl, appName, refCredential);
if (unsortedReleaseL == null)
{
// The update check failed, so return a status of false with a message about the problem
String msg = Joiner.on("; ").join(task.getMessages());
// String msg = Joiner.on("; ").join(task.getMessages());
var msg = task.getBuffer();
return new UpdateStatus(msg);
}
// Sort the items, and isolate the newest item

View File

@@ -1,37 +0,0 @@
package distMaker;
import glum.task.SilentTask;
import java.util.ArrayList;
import java.util.List;
public class LoggingTask extends SilentTask
{
private final List<String> messageL = new ArrayList<>();
@Override
public void logReg(String aMsg)
{
messageL.add(aMsg);
super.logReg(aMsg);
}
@Override
public void logRegln(String aMsg)
{
messageL.add(aMsg);
super.logRegln(aMsg);
}
@Override
public void logRegUpdate(String aMsg)
{
messageL.add(aMsg);
super.logRegUpdate(aMsg);
}
List<String> getMessages()
{
return messageL;
}
}

View File

@@ -38,7 +38,7 @@ public class PickReleasePanel extends GlassPanel implements ActionListener, Item
// GUI vars
private JLabel titleL;
private JRadioButton newestRB, olderRB;
private ItemListPanel<AppRelease> listPanel;
private ItemListPanel<AppRelease, LookUp> listPanel;
private QueryTableCellRenderer col0Renderer, col1Renderer;
private JButton abortB, proceedB;
private JTextArea headTA, infoTA;
@@ -197,7 +197,7 @@ public class PickReleasePanel extends GlassPanel implements ActionListener, Item
// Latest version area
newestRB = GuiUtil.createJRadioButton(this, "Unspecified", smallFont);
newestRB.setSelected(true);
// newestRB.setSelected(true);
// Older version area
olderRB = GuiUtil.createJRadioButton(this, "Select an older release:", smallFont);
@@ -232,6 +232,9 @@ public class PickReleasePanel extends GlassPanel implements ActionListener, Item
proceedB = GuiUtil.createJButton("Proceed", this, smallFont);
add(abortB, "align right,span,split 2");
add(proceedB, "");
// Set the initial state
newestRB.setSelected(true);
}
/**
@@ -255,10 +258,10 @@ public class PickReleasePanel extends GlassPanel implements ActionListener, Item
tmpComposer.setRenderer(LookUp.Version, col0Renderer);
tmpComposer.setRenderer(LookUp.BuildTime, col1Renderer);
tmpIH = new QueryItemHandler<>(tmpComposer);
tmpIH = new QueryItemHandler<>();
myItemProcessor = new StaticItemProcessor<>();
listPanel = new ItemListPanel<>(tmpIH, myItemProcessor, false);
listPanel = new ItemListPanel<>(tmpIH, myItemProcessor, tmpComposer, false);
listPanel.setSortingEnabled(false);
listPanel.addListSelectionListener(this);
return listPanel;

View File

@@ -30,8 +30,8 @@ public class JreVersion implements Comparable<JreVersion>, Version
{
label = aLabel;
String[] tokenArr = label.split("[._]");
ArrayList<Integer> workL = new ArrayList<>();
var tokenArr = label.split("[._]");
var workL = new ArrayList<Integer>();
for (String aStr : tokenArr)
{
int tmpVal = ParseUtil.readInt(aStr, Integer.MIN_VALUE);
@@ -66,7 +66,6 @@ public class JreVersion implements Comparable<JreVersion>, Version
public static JreVersion getBetterVersion(JreVersion verA, JreVersion verB)
{
JreVersion defaultVer;
int valA, valB, idxCnt;
// Default JreVersion is the version that is more specific
defaultVer = null;
@@ -76,14 +75,14 @@ public class JreVersion implements Comparable<JreVersion>, Version
defaultVer = verA;
// Set the idxCnt to the less specific JreVersion
idxCnt = Math.min(verA.compL.size(), verB.compL.size());
var idxCnt = Math.min(verA.compL.size(), verB.compL.size());
// Compare each integral component (which originated from the label)
// Assume higher values correspond to later versions
for (int c1 = 0; c1 < idxCnt; c1++)
{
valA = verA.compL.get(c1);
valB = verB.compL.get(c1);
var valA = verA.compL.get(c1);
var valB = verB.compL.get(c1);
if (valA > valB)
return verA;
if (valB > valA)
@@ -95,7 +94,7 @@ public class JreVersion implements Comparable<JreVersion>, Version
}
@Override
public int getMajorVersion()
public int major()
{
if (isLegacy == true)
return compL.get(1);
@@ -107,7 +106,7 @@ public class JreVersion implements Comparable<JreVersion>, Version
}
@Override
public int getMinorVersion()
public int minor()
{
if (isLegacy == true)
{
@@ -123,7 +122,7 @@ public class JreVersion implements Comparable<JreVersion>, Version
}
@Override
public int getPatchVersion()
public int patch()
{
if (isLegacy == true)
{
@@ -141,10 +140,8 @@ public class JreVersion implements Comparable<JreVersion>, Version
@Override
public int compareTo(JreVersion aItem)
{
JreVersion tmpVer;
// Note the natural ordering is from oldest version to most recent version
tmpVer = JreVersion.getBetterVersion(this, aItem);
var tmpVer = JreVersion.getBetterVersion(this, aItem);
if (tmpVer == aItem)
return -1;
if (tmpVer == this)

View File

@@ -34,7 +34,7 @@ public class PlatformUtils
*/
public static String getAppLauncherFileName(Version aVersion)
{
if (aVersion.getMajorVersion() == 0 && aVersion.getMinorVersion() == 0)
if (aVersion.major() == 0 && aVersion.minor() == 0)
return "appLauncher.jar";
return "appLauncher-" + aVersion + ".jar";

View File

@@ -14,7 +14,7 @@ public class ParseUtils
* <p>
* Processing of the configuration file should exit if the specified needed version is not met or the version string
* could not be parsed into major minor components.
*
*
* @param aTargName
* The target component whose version will be evaluated. Current supported values are one of the following:
* [AppLauncher, DistMaker]
@@ -39,25 +39,22 @@ public class ParseUtils
int needMinorVer = Integer.MAX_VALUE;
try
{
String[] versionArr;
versionArr = aNeededVer.split("\\.");
var versionArr = aNeededVer.split("\\.");
if (versionArr.length >= 1)
needMajorVer = Integer.parseInt(versionArr[0]);
if (versionArr.length >= 2)
needMinorVer = Integer.parseInt(versionArr[1]);
}
catch(Throwable aExp)
catch (Throwable aExp)
{
// Ignore just assume version components are whatever we managed to parse
}
Version needVer;
needVer = new PlainVersion(needMajorVer, needMinorVer, 0);
var needVer = new PlainVersion(needMajorVer, needMinorVer, 0);
// Exit the logic if the needVer > evalVer
if (needVer.getMajorVersion() > evalVer.getMajorVersion())
if (needVer.major() > evalVer.major())
return true;
if (needVer.getMajorVersion() == needVer.getMajorVersion() && needVer.getMinorVersion() > evalVer.getMinorVersion())
if (needVer.major() == needVer.major() && needVer.minor() > evalVer.minor())
return true;
return false;

81
tools/build.xml Normal file
View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Ant script for building the library. This Ant script is used by the
script buildRelease to aide in the compilation of Java source files into
a binary jar file.
Please note that the basedir is set to the parent folder. This build.xml
file is expected to reside in ~/tools/ folder.-->
<project basedir="../" default="install" name="DistMaker">
<description>
DistMaker Library
</description>
<!-- PACKAGE PROPERTIES -->
<property file="build.properties"/>
<property name="src" location="src"/>
<property name="build" location="bin"/>
<property name="classes" location="bin/classes"/>
<path id="class.path">
<pathelement path="${classes}"/>
<pathelement path="lib/commons-compress-1.15.jar"/>
<pathelement path="lib/glum-2.0.0-RC3.jar"/>
<pathelement path="lib/guava-18.0.jar"/>
<pathelement path="lib/miglayout-3.7.2-swing.jar"/>
<pathelement path="."/>
</path>
<!-- BUILD PROPERTIES -->
<property name="javac.cmdline" value="-Xlint:unchecked"/>
<property name="javac.debug" value="on"/>
<property name="javac.debuglevel" value="lines,vars,source"/>
<property name="javac.deprecated" value="on"/>
<property name="javac.optimize" value="on"/>
<property name="javac.version" value="11"/>
<!-- Perform initialization for various tasks -->
<target name="init" description="Initialization task">
<!-- create timestamp -->
<tstamp/>
<!-- create any necessary directories -->
<mkdir dir="${build}"/>
<mkdir dir="${classes}"/>
<!-- <mkdir dir="${doc}"/> -->
</target>
<!-- Build the binary build structure from source files -->
<target name="compile" depends="init" description="Compile source code for the library">
<!-- Build class files from source files -->
<javac srcdir="${src}" destdir="${classes}" includeantruntime="false"
debug="${javac.debug}" debuglevel="${javac.debuglevel}"
deprecation="${javac.deprecated}" includes="**/*.java"
optimize="${javac.optimize}" source="${javac.version}" target="${javac.version}">
<classpath refid="class.path"/>
<compilerarg line="${javac.cmdline}"/>
</javac>
</target>
<!-- Clean up ant build content -->
<target name="clean" description="Complete clean">
<delete dir="${build}"/>
</target>
<!-- Generate JavaDoc documentation -->
<!--
<target name="javadoc" description="Produce javadoc API in doc directory">
<javadoc destdir="${doc}">
<classpath refid="class.path"/>
<link href="http://ws.apache.org/axis/java/apiDocs/"/>
<link href="http://java.sun.com/javase/6/docs/api/"/>
<packageset dir="src"/>
<bottom><![CDATA[<i>Copyright &#169; 2008 JHU/APL. All Rights Reserved.</i>]]></bottom>
</javadoc>
</target>
-->
</project>

View File

@@ -1,4 +1,4 @@
#! /usr/bin/env python
#! /usr/bin/env python3
import argparse
import glob
@@ -7,40 +7,147 @@ import shutil
import signal
import subprocess
import sys
import traceback
# Define the libraries the application depends on
libList = ['glum-1.3.7.jar', 'guava-18.0.jar', 'distMaker.jar']
# Define the (baseline) version
baseVersion = "0.61"
# Define relevant base names
appBaseName = 'DistMaker'
libBaseName = 'distMaker'
# Define the libraries DistMaker depends on
libList = ['glum-2.0.0-RC3.jar', 'guava-18.0.jar']
#libList += ['commons-compress-1.15.jar']
# Define the paths to various executables
antPath = '/spare/apache/apache-ant-1.10.8'
antExe = os.path.join(antPath, 'bin/ant')
jdkPath = '/spare/jdk-11'
jarExe = os.path.join(jdkPath, 'bin/jar')
javaExe = os.path.join(jdkPath, 'bin/java')
def buildRelease(aVersion, aDoNotClean=False):
"""Method that builds a release of DistMaker. Upon sucessful execution, a
tar.gz archive will be generated named: 'DistMaker-<aVersion>.tar.gz'. Note
that releases of DistMaker aVersion 0.50 or later (2018May01+) will no longer
include static JREs."""
def checkForInstalledApps():
"""Checks for installed applications needed to build a release of the
DistMaker library / package.
"""
# Ensure required applications are installed
errList = []
for aPath in [antExe, jarExe, javaExe]:
if os.path.exists(aPath) == False:
errList.append('System executable is missing: ' + aPath)
if len(errList) > 0:
print('There are configuration errors with the environment or system.')
# print('System Path:' + str(sys.path))
print('Please correct the following:')
for aError in errList:
print('\t' + aError)
sys.exit(0)
def buildLibraryJar(aVersion):
"""Method that builds the library jars. Upon sucessful execution
jar files (binary + source) will be generated.
"""
# Note it is assumed that this is run from the path /proj/glum/
# Compile the java files
# Run the Ant script to build the class files
os.environ["JAVA_HOME"] = jdkPath
exeCmd = [antExe, '-f', 'tools/build.xml', 'compile']
retCode = subprocess.call(exeCmd)
if retCode != 0:
print('Failed while trying to run ant script. Exiting...\n')
sys.exit(0)
print('Finished executing Ant script.\n')
# Generate the manifest file
manifestFN = 'release/Manifest.txt'
# buildManifestFile(manifestFN)
# Build the (bin) jar file
jarBinFN = 'release/' + libBaseName + '-' + aVersion + '.jar'
# exeCmd = [jarExe, 'cfm', jarBinFN, manifestFN, '-C', 'bin/classes', '.']
exeCmd = [jarExe, 'cfM', jarBinFN, '-C', 'bin/classes', '.']
retCode = subprocess.call(exeCmd)
if retCode != 0:
print('Failed to build jar file: ' + jarBinFN)
exit(-1)
# Build the (src) jar file
jarSrcFN = 'release/' + libBaseName + '-' + aVersion + '-src.jar'
exeCmd = ['zip', '-D9q', '../' + jarSrcFN, '-r', '.']
retCode = subprocess.call(exeCmd, cwd='./src')
if retCode != 0:
print('Failed to build jar file: ' + jarSrcFN)
exit(-1)
# Remove the manifest file
# os.remove(manifestFN)
def buildRelease(aExtraTag, aDoNotClean=False):
"""Method that builds a release of DistMaker. Upon sucessful execution
the following will be created:
- distMaker-<version>.jar
- distMaker-<version>-src.jar
- DistMaker-<version>.tar.gz
"""
# Define the version to build
version = baseVersion
if aExtraTag != None:
if aExtraTag.startswith('.') or aExtraTag.startswith('-'):
version = baseVersion + aExtraTag
else:
version = baseVersion + '-' + aExtraTag
# Retrieve the install path
installPath = getInstallRoot()
installPath = os.path.dirname(installPath)
# Determine the workPath
workPath = os.path.join(installPath, 'release', 'DistMaker-' + aVersion)
destFileGZ = os.path.join(installPath, 'release', 'DistMaker-' + aVersion + '.tar.gz')
# Define the paths of interest
jarBinPathFN = os.path.join(installPath, 'release', libBaseName + '-' + version + '.jar')
jarSrcPathFN = os.path.join(installPath, 'release', libBaseName + '-' + version + '-src.jar')
# Bail if the work folder for which we compose the release already exists
workPath = os.path.join(installPath, 'release', appBaseName + '-' + version)
destFileGZ = os.path.join(installPath, 'release', appBaseName + '-' + version + '.tar.gz')
# Let the user know of the version we are building
print('Building ' + appBaseName + ' release ' + version + '...\n')
# Bail if there is a prior build
failMsgL = []
if os.path.exists(jarBinPathFN) == True:
failMsgL += ['Library binary file already exists: ' + jarBinPathFN]
if os.path.exists(jarSrcPathFN) == True:
failMsgL += ['Library source file already exists: ' + jarSrcPathFN]
if os.path.exists(workPath) == True:
errPrintln('\tAborting DistMaker release build. Release folder already exists: ' + workPath)
failMsgL += ['Release folder already exists: ' + workPath]
if os.path.exists(destFileGZ) == True:
failMsgL += ['Release package already exists: ' + destFileGZ]
if len(failMsgL) > 0:
errPrintln('Aborting ' + appBaseName + ' release build. Reasons:')
for aFailMsg in failMsgL:
errPrintln(' - ' + aFailMsg)
errPrintln('')
exit(-1)
# Bail if the release already exists
if os.path.exists(destFileGZ) == True:
errPrintln('\tAborting DistMaker release build. Release already exists. File: ' + destFileGZ)
# Build the library jars
buildLibraryJar(version)
# Confirm that we have built the class files properly by retrieving the
# version from the built application jar and comparing it to our version.
tmpVersion = getLibraryBinVersion(jarBinPathFN)
if tmpVersion != version:
print('Failure: Embedded release: {} Expected: {}\n\tAborting...'.format(tmpVersion, version))
exit(-1)
# Laydown the structure, and let the user know of the version we are building
print('Building DistMaker release ' + aVersion + '...')
os.mkdir(workPath)
# Copy the regular docs
# Copy the regular documents
dstPath = os.path.join(workPath, 'doc')
os.mkdir(dstPath)
for aFile in ['QuickStartGuide.pdf', 'ReadMe.txt']:
@@ -61,6 +168,9 @@ def buildRelease(aVersion, aDoNotClean=False):
srcPath = os.path.join(installPath, 'lib', aLib)
shutil.copy2(srcPath, dstPath)
# Copy the (newly) built DistMaker (binary) library
shutil.copy2(jarBinPathFN, dstPath)
# Copy the scripts
dstPath = os.path.join(workPath, 'script')
os.mkdir(dstPath)
@@ -73,7 +183,7 @@ def buildRelease(aVersion, aDoNotClean=False):
os.makedirs(dstPath + '/apple')
os.makedirs(dstPath + '/background')
os.makedirs(dstPath + '/launch4j')
for aFile in ['appLauncher.jar', 'JreCatalog.txt', 'apple/.DS_Store.template', 'apple/JavaAppLauncher', 'background/background.png', 'launch4j/launch4j-3.12-linux-x64.tgz', 'launch4j/launch4j-3.12-linux.tgz', 'launch4j/launch4j-3.12-macosx-x86.tgz']:
for aFile in ['appLauncher.jar', 'JreCatalog.txt', 'apple/.DS_Store.template', 'apple/JavaAppLauncher', 'background/background.png', 'launch4j/launch4j-3.14-linux-x64.tgz', 'launch4j/launch4j-3.14-linux.tgz', 'launch4j/launch4j-3.14-macosx-x86.tgz']:
srcPath = os.path.join(installPath, 'template', aFile)
shutil.copy2(srcPath, dstPath + '/' + aFile)
@@ -88,7 +198,10 @@ def buildRelease(aVersion, aDoNotClean=False):
if aDoNotClean == False:
shutil.rmtree(workPath)
print('DistMaker release ' + aVersion + ' built.')
print(appBaseName + ' release ' + version + ' built. Assets:')
for aFilePath in [jarBinPathFN, jarSrcPathFN, destFileGZ]:
print(' - ' + aFilePath)
print('')
def errPrintln(aMessage=''):
@@ -98,31 +211,20 @@ def errPrintln(aMessage=''):
sys.stderr.write(aMessage + '\n')
def getDistMakerVersion():
"""Method that will return the version of the distMaker.jar file that resides
in the library path. The version of the DistMaker release is defined by the
value associated with the disMaker.jar file. Any failures will result in the
abrupt exit of this script."""
# Retrieve the install path
installPath = getInstallRoot()
installPath = os.path.dirname(installPath)
# Check for distMaker.jar library prerequisite
testPath = os.path.join(installPath, 'lib', 'distMaker.jar')
if os.path.exists(testPath) == False:
errPrintln('\tAborting DistMaker release build. The file ' + testPath + ' does not exist.')
errPrintln('\tPlease run the buildDistMakerBin.jardesc from your workspace.')
exit(-1)
def getLibraryBinVersion(aJarBinPath):
"""Method that will return the version of the specified binary jar file.
The binary jar file will be queried (package distmaker.DistApp) and the
output will be parsed. Any failures will result in the abrupt exit of this
script."""
try:
cpStr = ':lib/'.join(libList)
cpStr = 'lib/' + cpStr
exeCmd = ['java', '-cp', cpStr, 'distMaker.DistApp', '--version']
cpStr = aJarBinPath
cpStr += ':lib/' + ':lib/'.join(libList)
exeCmd = [javaExe, '-cp', cpStr, 'distMaker.DistApp', '--version']
output = subprocess.check_output(exeCmd).decode('utf-8')
version = output.split()[1]
version = output.split()[1].strip()
return version
except:
errPrintln('\tPlease run the buildDistMakerBin.jardesc from your workspace.')
except Exception as aExp:
traceback.print_exc()
exit(-1)
@@ -144,19 +246,20 @@ if __name__ == "__main__":
# Logic to capture Ctrl-C and bail
signal.signal(signal.SIGINT, handleSignal)
# Require python version 2.7 or later
targVer = (2, 7)
# Require python version 3.6 or later
targVer = (3, 6)
if sys.version_info < targVer:
print('The installed version of python is too old. Please upgrade.')
print(' Current version: ' + '.'.join(str(i) for i in sys.version_info))
print(' Require version: ' + '.'.join(str(i) for i in targVer))
sys.exit(-1)
tmpDescr = 'Utility to build a DistMaker release\n'
tmpDescr = 'Utility to build a ' + appBaseName + ' release\n'
parser = argparse.ArgumentParser(prefix_chars='-', description=tmpDescr, add_help=False, fromfile_prefix_chars='@')
parser.add_argument('--help', '-h', help='Show this help message and exit.', action='help')
parser.add_argument('--doNotClean', default=False, action='store_true', help='Do NOT remove temporary work folder created while generating release.')
parser.add_argument('--doFullBuild', default=False, action='store_true', help='Force a full build of the main jar file. (Unsupported action)')
parser.add_argument('--extraTag', default=None, action='store', help='Specify an extra tag for to the version.')
# Intercept any request for a help message and bail
argv = sys.argv;
@@ -168,12 +271,11 @@ if __name__ == "__main__":
parser.formatter_class.max_help_position = 50
args = parser.parse_args()
# Get the version of DistMaker we are building
version = getDistMakerVersion()
print('DistMaker version: ' + version)
# TODO: Finish this functionality
if args.doFullBuild == True:
print("Unsupported action: [--doFullBuild]. Skipping...")
buildRelease(version, args.doNotClean)
# Ensure required applications are installed
checkForInstalledApps()
buildRelease(args.extraTag, args.doNotClean)