You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

182 lines
6.1 KiB

#!/bin/echo "This module must be imported by other Python scripts."
import argparse, configparser, os, platform, re, sys
import Detail.Utility as utility
assert sys.version_info >= ( 3, 8 )
class Configuration():
upstreamURL = ""
toplevelPath = ""
binariesPath = ""
toolsPath = ""
libQtPath = ""
openSSLPath = ""
vcvarsallPath = ""
cmakeGenerator = ""
linuxdeployURL = ""
platformVersion = ""
productName = "Synergy"
productVersion = "unknown-version"
productStage = "snapshot"
productRevision = "0"
productPackageName = "-".join( [ productName, productVersion, productStage ] ).lower()
productRepoPath = ""
productBuildPath = ""
productCheckout = ""
# Constructor
def __init__( self, configPath ):
def programOptions( self ):
parser = argparse.ArgumentParser( description =
"This utility builds the Synergy-Core binaries. The product version is extracted from the most recent Git tag. One can also build older versions "
"by checking out specific git tags, see options below." )
parser.add_argument( "--checkout", dest = "productCheckout", help = "Checkout and build a specific Git tag (or commit hash) for the Synergy-Core submodule." )
for key, value in vars( parser.parse_args() ).items():
setattr( self, key, value )
def loadConfiguration( self, configPath ):
utility.printItem( "configPath: ", configPath )
parser = configparser.ConfigParser(
dict_type = dict,
allow_no_value = True,
default_section = "All" )
parser.read( configPath )
section = platform.system()
for name in self.propertyList():
value = parser.get( section, name, fallback = getattr( self, name ) )
setattr( self, name, value )
def validateToplevelPath( self ):
queriedURL = utility.captureCommandOutput( "git config --get remote.origin.url" )
self.toplevelPath = utility.captureCommandOutput( "git rev-parse --show-toplevel" )
utility.printItem( "toplevelPath: ", self.toplevelPath )
utility.printItem( "upstreamURL: ", self.upstreamURL )
utility.printItem( "queriedURL: ", queriedURL )
if not os.path.exists( self.toplevelPath ):
utility.printError( "Git top level path does not exist:\n\t", self.toplevelPath )
raise SystemExit( 1 )
if queriedURL != self.upstreamURL:
utility.printError( "The upstream URL at the current working directory does not match project upstream URL:\n\t", queriedURL )
raise SystemExit( 1 )
def validateConfigurationPaths( self ):
def resolvePath( self, name, mustExist = True ):
path = getattr( self, name )
if not path: return
path = utility.joinPath( self.toplevelPath, os.path.expanduser( path ) )
utility.printItem( name + ": ", path )
if not os.path.exists( path ) and mustExist:
utility.printError( "Required path does not exist:\n\t", path )
raise SystemExit( 1 )
setattr( self, name, path )
resolvePath( self, "productRepoPath" )
resolvePath( self, "productBuildPath", mustExist = False )
resolvePath( self, "binariesPath" )
resolvePath( self, "toolsPath" )
resolvePath( self, "libQtPath" )
resolvePath( self, "openSSLPath" )
resolvePath( self, "vcvarsallPath" )
def configurePlatformVersion( self ):
if platform.system() == "Windows":
self.platformVersion = "-".join( [ platform.system(), platform.release(), platform.machine() ] )
else:
import distro # TODO: Move this to global scope when distro supports Windows
platformInfo = list( distro.linux_distribution( full_distribution_name = False ) )
while "" in platformInfo:
platformInfo.remove( "" )
platformInfo.append( platform.machine() )
self.platformVersion = "-".join( platformInfo )
utility.printItem( "platformVersion: ", self.platformVersion )
def configureProductVersion( self ):
self.updateProductVersion()
programOptions( self )
utility.printHeading( "Loading configuration..." )
loadConfiguration( self, configPath )
utility.printHeading( "Git configuration..." )
validateToplevelPath( self )
utility.printHeading( "Path configuration..." )
validateConfigurationPaths( self )
utility.printHeading( "Version configuration..." )
configurePlatformVersion( self )
configureProductVersion( self )
def updateProductVersion( self ):
os.chdir( self.productRepoPath )
lastTag = utility.captureCommandOutput( "git describe --tags --abbrev=0" )
utility.printItem( "lastTag: ", lastTag )
matches = re.search( "v?(\d+(?:\.\d+)+)(?:-(\w+))?", lastTag )
if not matches:
utility.printError( "Unable to extract version information from Git tags." )
raise SystemExit( 1 )
self.productVersion = matches.group( 1 )
self.productRevision = utility.captureCommandOutput( "git rev-parse --short=8 HEAD" )
self.productStage = matches.group( 2 ) if matches.group( 2 ) else self.productRevision
self.productPackageName = "-".join( [ self.productName, self.productVersion, self.productStage, self.platformVersion ] ).lower()
utility.printItem( "productVersion: ", self.productVersion )
utility.printItem( "productStage: ", self.productStage )
utility.printItem( "productRevision: ", self.productRevision )
utility.printItem( "productPackageName: ", self.productPackageName )
os.chdir( self.toplevelPath )
# Property list
def propertyList( self ):
return dict( ( name, getattr( self, name ) ) for name in dir( self ) if not callable( getattr( self, name ) ) and not name.startswith( '__' ) )
config = Configuration( utility.joinPath( utility.basePathAtSource( __file__ ), "..", "config.txt" ) )