[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [craft-blueprints-kde/2018.03] /: Implement package for KEXI (alphas and stables)
From:       Jaroslaw Staniek <null () kde ! org>
Date:       2018-04-10 15:28:57
Message-ID: E1f5vCb-0002Ni-JR () code ! kde ! org
[Download RAW message or body]

Git commit bccecb58eacc5c0f5a79a6619066591ef4e838f2 by Jaroslaw Staniek.
Committed on 10/04/2018 at 15:25.
Pushed by staniek into branch '2018.03'.

Implement package for KEXI (alphas and stables)

Summary:
Implement package for KEXI (alphas and stables)

- Better separate mysql from mariadb variant installations
- Introduce 'versionStrings' and 'versionSemantic' for KEXI to support alpha/preview \
                and stable installers with nice names
   - example Alpha file: `KEXI_3.2_Alpha_2018-02-23_(91178a597)_Win64.exe` \
                (2018-02-23 date is based on git log here)
   - example Preview file: `KEXI_3.1.0_Preview_2018-03-22_(14dada252)_Win64.exe` \
                (2018-03-22 date is set manually based on "official" Preview release)
- Make 3.1 releases as Preview for now
- Separate desktop from other builds (opens further extensions)
- Add custom NSIS file, provide correct website, icon, license text, license files, \
                readmes, architecture
- Offer execution of the installed app in NSIS, associate with .kexi extension
- add blacklists: strip down installer as much as possible

Test Plan:
craft mysql
craft kexi
craft --package kexi

Reviewers: vonreth

Reviewed By: vonreth

Subscribers: vonreth, piggz

Tags: #kexi

Differential Revision: https://phabricator.kde.org/D11713

M  +19   -11   binary/mysql/mysql.py
A  +190  -0    extragear/kexi/FileAssociation.nsh
A  +168  -0    extragear/kexi/NullsoftInstaller.nsi
A  +44   -0    extragear/kexi/blacklist.txt
M  +89   -16   extragear/kexi/kexi.py

https://commits.kde.org/craft-blueprints-kde/bccecb58eacc5c0f5a79a6619066591ef4e838f2

diff --git a/binary/mysql/mysql.py b/binary/mysql/mysql.py
index 2a1be47..b2c5bc2 100644
--- a/binary/mysql/mysql.py
+++ b/binary/mysql/mysql.py
@@ -54,22 +54,30 @@ class Package(BinaryPackageBase):
         self.subinfo.options.package.packSources = False
 
     def install(self):
-        libname = "mariadb" if self.subinfo.options.dynamic.useMariaDB else "mysql"
         shutil.copytree(os.path.join(self.sourceDir(), "bin"), \
                os.path.join(self.installDir(), "bin"),
-                        ignore=shutil.ignore_patterns('*.pdb', '*.map', '*test*', \
                'mysqld-debug.exe', '*.pl', 'debug*'))
-        utils.copyFile(os.path.join(self.sourceDir(), "lib", f"lib{libname}.dll"), \
                os.path.join(self.installDir(), "bin"))
-        if not self.subinfo.options.dynamic.useMariaDB:
-            utils.copyFile(os.path.join(self.sourceDir(), "lib", \
                f"lib{libname}d.dll"), os.path.join(self.installDir(), "bin"))
-        shutil.copytree(os.path.join(self.sourceDir(), "lib"), \
                os.path.join(self.installDir(), "lib"),
-                        ignore=shutil.ignore_patterns('*.pdb', '*.map', 'debug*', \
                f'lib{libname}.dll',
-                                                      f'lib{libname}.dll', \
                f'{libname}*'))
-        if CraftCore.compiler.isMinGW():
-            utils.createImportLibs(f"lib{libname}d", self.installDir())
-            utils.createImportLibs(f"lib{libname}", self.installDir())
+                        ignore=shutil.ignore_patterns('*.pdb', '*.map', '*test*', \
'mysqld-debug.exe', 'echo.exe', '*.pl', 'debug*')) +        \
shutil.copytree(os.path.join(self.sourceDir(), "lib", "plugin"), \
os.path.join(self.installDir(), "lib", "plugin"), +                        \
                ignore=shutil.ignore_patterns('*.pdb', '*.map', 'debug*'))
         shutil.copytree(os.path.join(self.sourceDir(), "include"), \
os.path.join(self.installDir(), "include"),  ignore=shutil.ignore_patterns('*.def'))
         shutil.copytree(os.path.join(self.sourceDir(), "share"), \
os.path.join(self.installDir(), "share"),  \
ignore=shutil.ignore_patterns('Makefile*')) +
+        if self.subinfo.options.dynamic.useMariaDB:
+            utils.copyFile(os.path.join(self.sourceDir(), "lib", \
f"mariadbclient.lib"), os.path.join(self.installDir(), "lib")) +            \
utils.copyFile(os.path.join(self.sourceDir(), "lib", f"libmariadb.lib"), \
os.path.join(self.installDir(), "lib")) +            \
utils.copyFile(os.path.join(self.sourceDir(), "lib", f"libmariadb.dll"), \
os.path.join(self.installDir(), "bin")) +            if CraftCore.compiler.isMinGW():
+                utils.createImportLibs(f"libmariadb", self.installDir())
+        else:
+            utils.copyFile(os.path.join(self.sourceDir(), "lib", \
f"mysqlclient.lib"), os.path.join(self.installDir(), "lib")) +            \
utils.copyFile(os.path.join(self.sourceDir(), "lib", f"libmysql.lib"), \
os.path.join(self.installDir(), "lib")) +            \
utils.copyFile(os.path.join(self.sourceDir(), "lib", f"libmysqld.lib"), \
os.path.join(self.installDir(), "lib")) +            \
utils.copyFile(os.path.join(self.sourceDir(), "lib", f"libmysqld.dll"), \
os.path.join(self.installDir(), "bin")) +            \
utils.copyFile(os.path.join(self.sourceDir(), "lib", f"libmysql.dll"), \
os.path.join(self.installDir(), "bin")) +            if CraftCore.compiler.isMinGW():
+                utils.createImportLibs(f"libmysqld", self.installDir())
+                utils.createImportLibs(f"libmysql", self.installDir())
         return True
 
     def qmerge(self):
diff --git a/extragear/kexi/FileAssociation.nsh b/extragear/kexi/FileAssociation.nsh
new file mode 100644
index 0000000..cc2f985
--- /dev/null
+++ b/extragear/kexi/FileAssociation.nsh
@@ -0,0 +1,190 @@
+/*
+_____________________________________________________________________________
+
+                       File Association
+_____________________________________________________________________________
+
+ Based on code taken from http://nsis.sourceforge.net/File_Association
+
+ Usage in script:
+ 1. !include "FileAssociation.nsh"
+ 2. [Section|Function]
+      ${FileAssociationFunction} "Param1" "Param2" "..." $var
+    [SectionEnd|FunctionEnd]
+
+ FileAssociationFunction=[RegisterExtension|UnRegisterExtension]
+
+_____________________________________________________________________________
+
+ ${RegisterExtension} "[executable]" "[extension]" "[description]"
+
+"[executable]"     ; executable which opens the file format
+                   ;
+"[extension]"      ; extension, which represents the file format to open
+                   ;
+"[description]"    ; description for the extension. This will be display in Windows \
Explorer. +                   ;
+
+
+ ${UnRegisterExtension} "[extension]" "[description]"
+
+"[extension]"      ; extension, which represents the file format to open
+                   ;
+"[description]"    ; description for the extension. This will be display in Windows \
Explorer. +                   ;
+
+_____________________________________________________________________________
+
+                         Macros
+_____________________________________________________________________________
+
+ Change log window verbosity (default: 3=no script)
+
+ Example:
+ !include "FileAssociation.nsh"
+ !insertmacro RegisterExtension
+ ${FileAssociation_VERBOSE} 4   # all verbosity
+ !insertmacro UnRegisterExtension
+ ${FileAssociation_VERBOSE} 3   # no script
+*/
+
+
+!ifndef FileAssociation_INCLUDED
+!define FileAssociation_INCLUDED
+
+!include Util.nsh
+
+!verbose push
+!verbose 3
+!ifndef _FileAssociation_VERBOSE
+  !define _FileAssociation_VERBOSE 3
+!endif
+!verbose ${_FileAssociation_VERBOSE}
+!define FileAssociation_VERBOSE `!insertmacro FileAssociation_VERBOSE`
+!verbose pop
+
+!macro FileAssociation_VERBOSE _VERBOSE
+  !verbose push
+  !verbose 3
+  !undef _FileAssociation_VERBOSE
+  !define _FileAssociation_VERBOSE ${_VERBOSE}
+  !verbose pop
+!macroend
+
+
+
+!macro RegisterExtensionCall _EXECUTABLE _EXTENSION _DESCRIPTION
+  !verbose push
+  !verbose ${_FileAssociation_VERBOSE}
+  Push `${_DESCRIPTION}`
+  Push `${_EXTENSION}`
+  Push `${_EXECUTABLE}`
+  ${CallArtificialFunction} RegisterExtension_
+  !verbose pop
+!macroend
+
+!macro UnRegisterExtensionCall _EXTENSION _DESCRIPTION
+  !verbose push
+  !verbose ${_FileAssociation_VERBOSE}
+  Push `${_EXTENSION}`
+  Push `${_DESCRIPTION}`
+  ${CallArtificialFunction} UnRegisterExtension_
+  !verbose pop
+!macroend
+
+
+
+!define RegisterExtension `!insertmacro RegisterExtensionCall`
+!define un.RegisterExtension `!insertmacro RegisterExtensionCall`
+
+!macro RegisterExtension
+!macroend
+
+!macro un.RegisterExtension
+!macroend
+
+!macro RegisterExtension_
+  !verbose push
+  !verbose ${_FileAssociation_VERBOSE}
+
+  Exch $R2 ;exe
+  Exch
+  Exch $R1 ;ext
+  Exch
+  Exch 2
+  Exch $R0 ;desc
+  Exch 2
+  Push $0
+  Push $1
+
+  ReadRegStr $1 HKCR $R1 ""  ; read current file association
+  StrCmp "$1" "" NoBackup  ; is it empty
+  StrCmp "$1" "$R0" NoBackup  ; is it our own
+    WriteRegStr HKCR $R1 "backup_val" "$1"  ; backup current value
+NoBackup:
+  WriteRegStr HKCR $R1 "" "$R0"  ; set our file association
+
+  ReadRegStr $0 HKCR $R0 ""
+  StrCmp $0 "" 0 Skip
+    WriteRegStr HKCR "$R0" "" "$R0"
+    WriteRegStr HKCR "$R0\shell" "" "open"
+    WriteRegStr HKCR "$R0\DefaultIcon" "" "$R2,0"
+Skip:
+  WriteRegStr HKCR "$R0\shell\open\command" "" '"$R2" "%1"'
+  WriteRegStr HKCR "$R0\shell\edit" "" "Edit $R0"
+  WriteRegStr HKCR "$R0\shell\edit\command" "" '"$R2" "%1"'
+
+  Pop $1
+  Pop $0
+  Pop $R2
+  Pop $R1
+  Pop $R0
+
+  !verbose pop
+!macroend
+
+
+
+!define UnRegisterExtension `!insertmacro UnRegisterExtensionCall`
+!define un.UnRegisterExtension `!insertmacro UnRegisterExtensionCall`
+
+!macro UnRegisterExtension
+!macroend
+
+!macro un.UnRegisterExtension
+!macroend
+
+!macro UnRegisterExtension_
+  !verbose push
+  !verbose ${_FileAssociation_VERBOSE}
+
+  Exch $R1 ;desc
+  Exch
+  Exch $R0 ;ext
+  Exch
+  Push $0
+  Push $1
+
+  ReadRegStr $1 HKCR $R0 ""
+  StrCmp $1 $R1 0 NoOwn ; only do this if we own it
+  ReadRegStr $1 HKCR $R0 "backup_val"
+  StrCmp $1 "" 0 Restore ; if backup="" then delete the whole key
+  DeleteRegKey HKCR $R0
+  Goto NoOwn
+
+Restore:
+  WriteRegStr HKCR $R0 "" $1
+  DeleteRegValue HKCR $R0 "backup_val"
+  DeleteRegKey HKCR $R1 ;Delete key with association name settings
+
+NoOwn:
+
+  Pop $1
+  Pop $0
+  Pop $R1
+  Pop $R0
+
+  !verbose pop
+!macroend
+
+!endif # !FileAssociation_INCLUDED
diff --git a/extragear/kexi/NullsoftInstaller.nsi \
b/extragear/kexi/NullsoftInstaller.nsi new file mode 100644
index 0000000..33743df
--- /dev/null
+++ b/extragear/kexi/NullsoftInstaller.nsi
@@ -0,0 +1,168 @@
+; KEXI script for NullsoftInstallerPackager
+;
+; Copyright 2010 Patrick Spendrin <ps_ml@gmx.de>
+; Copyright 2016 Kevin Funk <kfunk@kde.org>
+; Copyright 2018 Jarosław Staniek <staniek@kde.org>
+
+; registry stuff
+!define regkey "Software\@{company}\@{productname}\@{version}"
+!define uninstkey "Software\Microsoft\Windows\CurrentVersion\Uninstall\@{productname} \
@{version}" +
+!define startmenu "$SMPROGRAMS\@{productname}\@{productname} @{version}"
+!define uninstall_string "Uninstall @{productname} @{version}"
+!define uninstaller "${uninstall_string}.exe"
+
+BrandingText "Generated by Craft https://community.kde.org/Craft"
+
+;--------------------------------
+
+XPStyle on
+ShowInstDetails hide
+ShowUninstDetails hide
+
+SetCompressor /SOLID lzma
+
+Name "@{productname} @{version}"
+Caption "@{productname} @{version}"
+
+OutFile "@{setupname}"
+!include "MUI2.nsh"
+!include "LogicLib.nsh"
+!include "x64.nsh"
+!include "FileAssociation.nsh"
+
+;!define MUI_ICON
+@{icon}
+;!define MUI_ICON
+
+!insertmacro MUI_PAGE_WELCOME
+
+;!insertmacro MUI_PAGE_LICENSE
+@{license}
+;!insertmacro MUI_PAGE_LICENSE
+
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+
+!define MUI_FINISHPAGE_NOAUTOCLOSE
+!define MUI_FINISHPAGE_RUN
+!define MUI_FINISHPAGE_RUN_TEXT "Run @{productname}"
+!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink"
+!define MUI_FINISHPAGE_LINK "Visit @{productname} home page"
+!define MUI_FINISHPAGE_LINK_LOCATION "@{webpage}"
+!insertmacro MUI_PAGE_FINISH
+
+!insertmacro MUI_LANGUAGE "English"
+
+SetDateSave on
+SetDatablockOptimize on
+CRCCheck on
+SilentInstall normal
+
+InstallDir "@{defaultinstdir}\@{productname}\@{version}"
+InstallDirRegKey HKLM "${regkey}" "Install_Dir"
+
+Var /global ExistingInstallation
+
+Function .onInit
+!if @{architecture} == "x64"
+  ${IfNot} ${RunningX64}
+  MessageBox MB_OK|MB_ICONEXCLAMATION "This installer can only be run on 64-bit \
Windows." +  Abort
+  ${EndIf}
+!endif
+ReadRegStr $R0 HKLM "${regkey}" "Install_Dir"
+${IfNot} $R0 == ""
+  StrCpy $ExistingInstallation $R0
+${EndIf}
+FunctionEnd
+
+Function LaunchLink
+  ExecShell "" "${startmenu}\@{productname} @{version}.lnk"
+FunctionEnd
+
+;--------------------------------
+
+AutoCloseWindow false
+
+
+; beginning (invisible) section
+Section
+${IfNot} $ExistingInstallation == ""
+  ExecWait '"$ExistingInstallation\${uninstaller}" /S _?=$ExistingInstallation'
+${EndIf}
+  WriteRegStr HKLM "${regkey}" "Install_Dir" "$INSTDIR"
+  ; write uninstall strings
+  WriteRegStr HKLM "${uninstkey}" "DisplayName" "@{productname} @{version}"
+  WriteRegStr HKLM "${uninstkey}" "UninstallString" '"$INSTDIR\${uninstaller}"'
+  WriteRegStr HKLM "${uninstkey}" "DisplayIcon" "$INSTDIR\@{executable}"
+  WriteRegStr HKLM "${uninstkey}" "URLInfoAbout" "@{webpage}"
+  WriteRegStr HKLM "${uninstkey}" "Publisher" "@{company}"
+  WriteRegStr HKLM "${uninstkey}" "DisplayVersion" "@{version}"
+
+  ; TODO:  find a way to extend the default script
+  ; TODO? WriteRegStr HKCR "*\shell\OpenWith@{productname}\@{version}" "" "Edit with \
@{productname} @{version}" +  ; TODO? WriteRegStr HKCR \
"*\shell\OpenWith@{productname}\@{version}\command" "" '"$INSTDIR\@{executable}" \
"%V"' +
+  !define kexi_file_desc "KEXI project file"
+  !define kexi_file_ext ".kexi"
+  ${registerExtension} "$INSTDIR\@{executable}" "${kexi_file_ext}" \
"${kexi_file_desc}" +
+  SetOutPath $INSTDIR
+
+
+; package all files, recursively, preserving attributes
+; assume files are in the correct places
+
+File /a /r /x "*.nsi" /x "@{setupname}" "@{srcdir}\*.*"
+
+WriteUninstaller "${uninstaller}"
+
+SectionEnd
+
+; create shortcuts
+Section
+SetShellVarContext all
+CreateDirectory "${startmenu}"
+SetOutPath $INSTDIR ; for working directory
+CreateShortCut "${startmenu}\@{productname} @{version}.lnk" "$INSTDIR\@{executable}"
+CreateShortCut "${startmenu}\${uninstall_string}.lnk" "$INSTDIR\${uninstaller}"
+@{extrashortcuts}
+SectionEnd
+
+;post install
+Section
+SetOutPath "$INSTDIR"
+!if "@{vcredist}" != "none"
+    File /a /oname=vcredist.exe "@{vcredist}"
+    ExecWait '"$INSTDIR\vcredist.exe" /passive /norestart'
+!endif
+ExecWait '"$INSTDIR\bin\update-mime-database.exe" "$INSTDIR\share\mime"'
+ExecWait '"$INSTDIR\bin\kbuildsycoca5.exe" "--noincremental"'
+Delete "$INSTDIR\vcredist.exe"
+SectionEnd
+
+; Uninstaller
+; All section names prefixed by "Un" will be in the uninstaller
+
+UninstallText "This will uninstall @{productname} @{version}."
+
+Section "Uninstall"
+SetShellVarContext all
+ExecWait '"$INSTDIR\bin\kdeinit5.exe" "--shutdown"'
+ExecWait '"taskkill" "/F" "/IM" "dbus-daemon.exe"'
+
+DeleteRegKey HKLM "${uninstkey}"
+DeleteRegKey HKLM "${regkey}"
+
+Delete "${startmenu}\@{productname} @{version}.lnk"
+Delete "${startmenu}\${uninstall_string}.lnk"
+
+RMDir /r "${startmenu}"
+RMDir /r "$INSTDIR"
+
+${unregisterExtension} "${kexi_file_ext}" "${kexi_file_desc}"
+
+SectionEnd
diff --git a/extragear/kexi/blacklist.txt b/extragear/kexi/blacklist.txt
new file mode 100644
index 0000000..a20038b
--- /dev/null
+++ b/extragear/kexi/blacklist.txt
@@ -0,0 +1,44 @@
+# blacklist for KEXI
+
+# common app stuff
+lib/.*
+share/.*
+
+# Unused Qt modules
+qml/.*
+
+# unneeded LLVM artifacts
+tools/msbuild/.*
+
+# unrelated
+dev-utils/.*
+
+# other files
+bin/dbus-env\.bat
+bin/libGLESv2.dll
+bin/qmltooling/.*
+bin/data/(?!(applications|color-schemes|dbus-1|kexi|kf5/kcharselect|kf5/licenses|kf5/sonnet|kservices5|kservicetypes5|kstyle|locale|metainfo|mime|xdg))/.*
 +bin/data/(aspell|kdevappwizard|wallpapers)/.*
+bin/data/icons/(breeze_cursors|breeze-dark|Breeze_Snow|hicolor|)/.*
+
+# strip most executables
+bin/(?!(kexi|kbuildsycoca5|update-mime-database|kioslave|QtWebProcess)).*\.exe
+bin/Qt5Designer.*\.dll
+bin/Qt5Test\.dll
+bin/Qt5QuickTest\.dll
+bin/testplug.dll
+plugins/org.kde.kdecoration2/.*
+plugins/plasma/.*
+plugins/platforms/qdirect2d\.dll
+plugins/platforms/qminimal\.dll
+plugins/platforms/qoffscreen\.dll
+plugins/playlistformats/.*
+plugins/qmltooling/.*
+plugins/scenegraph/.*
+plugins/sensors/.*
+plugins/sensorgestures/.*
+plugins/bearer/.*
+plugins/generic/.*
+plugins/sqldrivers/(?!(qsqlite))\.dll
+plugins/texttospeech/.*
+# no, needed by Qt5WebKit: bin/Qt5Sql\.dll
diff --git a/extragear/kexi/kexi.py b/extragear/kexi/kexi.py
index 20aca6e..a528445 100644
--- a/extragear/kexi/kexi.py
+++ b/extragear/kexi/kexi.py
@@ -1,16 +1,34 @@
 import info
 from CraftOS.osutils import OsUtils
+import datetime
+import os
+import subprocess
 
 
 class subinfo(info.infoclass):
     def setTargets(self):
-        versions = ['3.1', 'master']
-        for ver in versions:
-            self.svnTargets[ver] = f"git://anongit.kde.org/kexi|{ver}"
+        self.versionStrings = {}
+        self.versionSemantic = {}
+
+        ver = '3.1' # default version, TODO update on release
+        self.svnTargets[ver] = f"git://anongit.kde.org/kexi|{ver}"
+        self.versionStrings[ver] = '3.1.0 Preview' # TODO update on release
+        self.versionSemantic[ver] = '3.1.0' # TODO update on release
+
+        ver = 'master'
+        self.svnTargets[ver] = f"git://anongit.kde.org/kexi|master"
+        self.versionStrings[ver] = '3.2 Alpha' # TODO update on release
+        self.versionSemantic[ver] = '3.1.90' # TODO update on release
+
+        versions = [*self.svnTargets]
         self.defaultTarget = versions[0]
         self.description = "A visual database applications builder"
+        self.webpage = "http://kexi-project.org"
         self.options.configure.args = " -DBUILD_EXAMPLES=ON"
 
+    def registerOptions(self):
+        self.options.dynamic.registerOption("desktop", True)
+
     def setDependencies(self):
         self.runtimeDependencies["virtual/base"] = "default"
         self.buildDependencies["frameworks/extra-cmake-modules"] = "default"
@@ -34,13 +52,16 @@ class subinfo(info.infoclass):
         self.runtimeDependencies["extragear/kdb"] = "default"
         self.runtimeDependencies["extragear/kproperty"] = "default"
         self.runtimeDependencies["extragear/kreport"] = "default"
-        # Desktop only:
-        self.runtimeDependencies["frameworks/tier2/kcompletion"] = "default"
-        self.runtimeDependencies["frameworks/tier3/kio"] = "default"
-        self.runtimeDependencies["frameworks/tier3/ktexteditor"] = "default"
-        self.runtimeDependencies["frameworks/tier3/ktextwidgets"] = "default"
-        if OsUtils.isLinux():
-            self.runtimeDependencies["frameworks/tier1/kcrash"] = "default"
+        if self.options.dynamic.desktop:
+            # Desktop only:
+            self.runtimeDependencies["frameworks/tier1/breeze-icons"] = "default" # \
hard dependency for now +            \
self.runtimeDependencies["frameworks/tier2/kcompletion"] = "default" +            \
self.runtimeDependencies["frameworks/tier3/kio"] = "default" +            \
self.runtimeDependencies["frameworks/tier3/ktexteditor"] = "default" +            \
self.runtimeDependencies["frameworks/tier3/ktextwidgets"] = "default" +            \
self.runtimeDependencies["kde/plasma/breeze"] = "default" # hard dependency for now + \
if OsUtils.isLinux(): +                \
self.runtimeDependencies["frameworks/tier1/kcrash"] = "default"  
 
 from Package.CMakePackageBase import *
@@ -50,14 +71,66 @@ class Package(CMakePackageBase):
     def __init__(self):
         CMakePackageBase.__init__(self)
 
+    def stableVersion(self):
+        """ Returns stable version for \
self.subinfo.versionSemantic[self.subinfo.buildTarget], +            that is x.y for \
stable releases and x.y+1 for unsable releases +        """
+        buildTarget = \
self.subinfo.versionSemantic[self.subinfo.buildTarget].split('.') +        if \
int(buildTarget[2]) >= 90: +            return \
f"{buildTarget[0]}.{int(buildTarget[1]) + 1}" +        else:
+            return f"{buildTarget[0]}.{buildTarget[1]}"
+
     def createPackage(self):
-        # TODO
-        #self.blacklist_file.append(os.path.join(self.packageDir(), \
'blacklist.txt')) +        self.defines["version_semantic"] = \
self.subinfo.versionSemantic[self.subinfo.buildTarget] +        ver = \
self.subinfo.versionStrings[self.subinfo.buildTarget] +        isAlpha = \
ver.endswith("Alpha") +        isPreview = "Preview" in ver
+        if isAlpha or isPreview: # add git hash and date for Alphas/Previews
+            gitHash = subprocess.check_output(
+                ["git", "rev-parse", "--short", self.subinfo.buildTarget],
+                cwd=self.sourceDir(), universal_newlines=True).strip()
+            if isAlpha:
+                date = subprocess.check_output(
+                    ["git", "show", "--no-patch", "--format=%ci", \
self.subinfo.buildTarget], +                    cwd=self.sourceDir(), \
universal_newlines=True).strip().split(" ")[0] +            elif isPreview:
+                date = str(datetime.date.today())
+            ver = f"{ver} {date} ({gitHash})"
+        self.defines["version"] = ver
         self.defines["productname"] = "KEXI"
-        self.defines["executable"] = "bin\\kexi.exe"
-        #self.defines["icon"] = os.path.join(self.packageDir(), "kexi.ico")
+        #default: self.defines["company"] = "KDE"
+        self.defines["webpage"] = self.subinfo.webpage
+        self.defines["executable"] = f"bin\\kexi-{self.stableVersion()}.exe"
+        self.defines["icon"] = os.path.join(self.buildDir(), "src", \
"_source_var.ico") +        self.defines["license"] = os.path.join(self.sourceDir(), \
"COPYING.LIB") +        # user-friendly filename
+        arch = '32' if CraftCore.compiler.isX86() else '64'
+        filename = f"{self.defines['productname']}_{self.defines['version']}_Win{arch}.exe".replace(' \
', '_') +        self.defines["setupname"] = \
os.path.join(self.packageDestinationDir(), filename) +
+        self.blacklist_file.append(os.path.join(self.packageDir(), 'blacklist.txt'))
+
+        self.ignoredPackages.append("libs/d3dcompiler")
+        self.ignoredPackages.append("libs/qt5/qttools")
+        self.ignoredPackages.append("libs/qt5/qtscript")
+        # no, needed by Qt5WebKit: \
self.ignoredPackages.append("libs/qt5/qtmultimedia") +        # no, needed by \
Qt5WebKit: self.ignoredPackages.append("libs/qt5/qtwebchannel") +        # no, needed \
by Qt5WebKit: self.ignoredPackages.append("qt-libs/phonon") +
+        self.ignoredPackages.append("frameworks/tier2/kpackage")
+        self.ignoredPackages.append("frameworks/tier3/kdeclarative")
+        self.ignoredPackages.append("frameworks/tier3/knewstuff")
+        self.ignoredPackages.append("frameworks/tier3/kwallet") # pulled in by kio
+        self.ignoredPackages.append("frameworks/tier3/plasma-framework")
+
         # TODO:  find a way to extend the default script
-        #self.scriptname = os.path.join(self.packageDir(), "NullsoftInstaller.nsi")
-        #self.ignoredPackages.append("binary/mysql")
+        self.scriptname = os.path.join(self.packageDir(), "NullsoftInstaller.nsi")
+        utils.copyFile(os.path.join(self.packageDir(), "FileAssociation.nsh"),
+                       self.workDir(), False) # needed in workdir
+
+        for file in ["COPYING.DOC", "COPYING.LIB", "COPYING", "AUTHORS", \
"README.md", "README.PACKAGERS.md"]: +            \
utils.copyFile(os.path.join(self.sourceDir(), file), +                           \
os.path.join(self.installDir(), file), False)  
         return TypePackager.createPackage(self)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic