Gxji{uS@
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
Kun(~kbxr!3
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
diff --git a/resources/windows/msi_i18n/en_US.wxl b/resources/windows/msi_i18n/en_US.wxl
deleted file mode 100644
index cdd87fd5..00000000
--- a/resources/windows/msi_i18n/en_US.wxl
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
- 1033
-
- Windows 7 or higher is required to run [ProductName].
-
- This install package only supports 64-bit operating systems
- This install package only supports 32-bit operating systems
-
- Welcome to the [ProductName] [Installer]!
-
-Click Install to proceed with a standard installation, or click Advanced to change the installation directory and access other customizations.
-
- [ProductName] [Installer]!
-
-This wizard will help you install, modify, repair or uninstall the [ProductName] application on this computer.
- I accept the terms in the License Agreement
- Change the installation directory, create application shortcuts and choose whether to launch the application after installation. Click Cancel to exit the installer.
- Location:
- Browse
- Add a shortcut to the desktop
-
- Launch [ProductName] after installation
-
- Select the directory you want [ProductName] be installed to.
- Create a new folder
- Go thte parent folder
-
- Currently defined installation directory:
-
- Are you sure you want to cancel [ProductName] installation?
-
- [ProductName] installation was interrupted and your system has not been modified.
-
- To install [ProductName] in the future, please run the installer again.
-
- [Progress1] [ProductName]. This may take several minutes.
- Status:
-
- [Progress2] successful. Click Finish to exit the installer.
-
-
-
diff --git a/resources/windows/msi_modify.ico b/resources/windows/msi_modify.ico
deleted file mode 100644
index 6b3b6c03d6ac37cdad98d0e623edc8d6b2085c3f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 59310
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
Cm(V-_
diff --git a/resources/windows/msi_question.ico b/resources/windows/msi_question.ico
deleted file mode 100644
index 07eb69622e0f9d38322c492cadf1d4be75f1431e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 59310
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
diff --git a/resources/windows/msi_remove.ico b/resources/windows/msi_remove.ico
deleted file mode 100644
index 69644eac20dec6142cef8ff0a0b13bdd0ffbb8db..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 59310
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
Bp(6kQ
diff --git a/resources/windows/msi_up.ico b/resources/windows/msi_up.ico
deleted file mode 100644
index 97e033ab91683c8a1bbad0ff54569b1535433ca6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 59310
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
diff --git a/scripts/Makefile.ps1 b/scripts/Makefile.ps1
deleted file mode 100644
index 7cf1a8a5..00000000
--- a/scripts/Makefile.ps1
+++ /dev/null
@@ -1,766 +0,0 @@
-# We would have preferred to put this main section to the end of the file,
-# but script arguments must be defined as the first statement in a PowerShell
-# script.
-Param (
- [parameter(Position=0)]$makeRule
-)
-
-# While the different sections of this file may be better with import statements
-# or even better with PowerShell modules, choosing this option would require
-# them to be installed on CircleCI servers, which also breaks selfcontainement
-# of this makefile.
-
-################################################################################
-# Logging functions
-################################################################################
-#Region
-function Print {
- Param (
- [String]$message,
- [Switch]$NoNewLine
- )
- if ($NoNewLine) {
- Write-Host " $message" -NoNewLine
- } else {
- Write-Host " $message"
- }
-}
-
-function Print-Info {
- Param (
- [String]$message,
- [Switch]$NoNewLine
- )
- if ([String]::IsNullOrEmpty($message)) {
- return
- }
-
- Write-Host "[" -NoNewLine
- Write-Host "+" -NoNewLine -ForegroundColor Green
- Write-Host "]" -NoNewLine
-
- if ($NoNewLine) {
- Write-Host " $message" -NoNewLine
- } else {
- Write-Host " $message"
- }
-}
-
-function Print-Warning {
- Param (
- [String]$message,
- [Switch]$NoNewLine
- )
- if ([String]::IsNullOrEmpty($message)) {
- return
- }
-
- Write-Host "[" -NoNewLine
- Write-Host "!" -NoNewLine -ForegroundColor Magenta
- Write-Host "]" -NoNewLine
-
- if ($NoNewLine) {
- Write-Host " $message" -NoNewLine
- } else {
- Write-Host " $message"
- }
-}
-
-# Avoid stacktrace to be displayed along side the error message.
-# We want things simplistic.
-# src.: https://stackoverflow.com/q/38064704/3514658
-# src.: https://stackoverflow.com/a/38064769
-# We won't use [Console]::*Write* not $host.ui.Write* statements
-# as they are UI items
-# src.: https://web.archive.org/web/20190720224207/https://docs.microsoft.com/en-us/powershell/developer/cmdlet/types-of-cmdlet-output
-# Rewriting the error printing function in C# and calling it from Posh is not
-# working either because the redirection to stderr doesn't work under Posh but
-# is working when the Posh script is run from cmd.exe. We are giving up here
-# and simply using Write-Host without stderr redirection.
-function Print-Error {
- Param (
- [String]$message,
- [Switch]$NoNewLine
- )
- if ([String]::IsNullOrEmpty($message)) {
- return
- }
-
- Write-Host "[" -NoNewLine
- Write-Host "-" -NoNewLine -ForegroundColor Red
- Write-Host "]" -NoNewLine
-
- if ($NoNewLine) {
- Write-Host " $message" -NoNewLine
- } else {
- Write-Host " $message"
- }
-}
-#EndRegion
-
-################################################################################
-# OS related functions
-################################################################################
-#Region
-function Check-Command($cmdname) {
- return [bool](Get-Command -Name $cmdname -ErrorAction SilentlyContinue)
-}
-
-function Refresh-Path {
- $env:Path =
- [System.Environment]::GetEnvironmentVariable("Path", "Machine") +
- ";" +
- [System.Environment]::GetEnvironmentVariable("Path", "User")
-}
-
-function Get-RootDir {
- return "$(Split-Path $PSCommandPath)\..\"
-}
-
-# src: https://superuser.com/a/756696/456258
-function Is-Admin {
- return ([Security.Principal.WindowsPrincipal] `
- [Security.Principal.WindowsIdentity]::GetCurrent() `
- ).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
-}
-#EndRegion
-
-################################################################################
-# Check and install of dependencies related functions
-################################################################################
-#Region
-function Check-Deps {
- Param (
- [Switch]
- $verbose,
- [Switch]
- $throwable
- )
-
- if ($PSVersionTable.PSVersion.Major -lt 5) {
- Print-Error "You need at least PowerShell 5.0 to execute this Makefile. Operation aborted."
- exit
- }
-
- [array]$missing = @()
-
- if ($verbose) { Print-Info "Checking choco dependency..." }
- if (!(Check-Command "choco")) {
- if ($verbose) { Print-Error "choco dependency missing." }
- $missing += "choco"
- }
-
- if ($verbose) { Print-Info "Checking git dependency..." }
- if (!(Check-Command "git")) {
- if ($verbose) { Print-Error "git dependency missing." }
- $missing += "git"
- }
-
- if ($verbose) { Print-Info "Checking nodejs/npm dependency..." }
- # Testing if the folder is not empty first is needed otherwise if there is
- # a file called like that in the path where the makefile is invocated, the
- # check will succeed while it is plain wrong.
- if ([string]::IsNullOrEmpty($(Get-NpmDir)) -or
- # We could have used the builtin Test-Path cmdlet instead but it is
- # tested for folders as well. We need to test for a file existence
- # here.
- ![System.IO.File]::Exists("$(Get-NpmDir)\npm.cmd") -or
- ![System.IO.File]::Exists("$(Get-NpmDir)\node.exe")) {
- if ($verbose) { Print-Error "nodejs/npm dependency missing." }
- $missing += "npm"
- }
-
- if ($verbose) { Print-Info "Checking wix dependency..." }
- if ([string]::IsNullOrEmpty($(Get-WixDir)) -or
- ![System.IO.File]::Exists("$(Get-WixDir)\heat.exe") -or
- ![System.IO.File]::Exists("$(Get-WixDir)\candle.exe") -or
- ![System.IO.File]::Exists("$(Get-WixDir)\light.exe")) {
- if ($verbose) { Print-Error "wix dependency missing." }
- $missing += "wix"
- }
-
- if ($verbose) { Print-Info "Checking signtool dependency..." }
- if ([string]::IsNullOrEmpty($(Get-SignToolDir)) -or
- ![System.IO.File]::Exists("$(Get-SignToolDir)\signtool.exe")) {
- if ($verbose) { Print-Error "signtool dependency missing." }
- $missing += "signtool"
- }
- if ($verbose) { Print-Info "Checking jq dependency..." }
- if (!(Check-Command "jq")) {
- if ($verbose) { Print-Error "jq dependency missing." }
- $missing += "jq"
- }
-
- if ($throwable -and $missing.Count -gt 0) {
- throw "com.mattermost.makefile.deps.missing"
- }
-
- return $missing
-}
-
-function Install-Deps {
- [array]$missing = Check-Deps -Verbose
-
- if ($missing -eq $null) {
- Print-Info "All dependencies met; exiting dependencies installation..."
- return
- }
-
- if (-not (Is-Admin)) {
- throw "com.mattermost.makefile.deps.notadmin"
- }
-
- foreach ($missingItem in $missing) {
- switch ($missingItem) {
- "choco" {
- Print-Info "Installing chocolatey..."
- Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
- break;
- }
- "git" {
- Print-Info "Installing git..."
- choco install git --yes
- break;
- }
- "wix" {
- Install-Wix
- break;
- }
- "signtool" {
- Print-Info "Installing Windows 10 SDK (for signtool)..."
- choco install windows-sdk-10.1 --yes
- break;
- }
- "npm" {
- Print-Info "Installing nodejs-lts (with npm)..."
- choco install nodejs-lts --yes
- break;
- }
- "jq" {
- Print-Info "Installing jq"
- choco install jq --yes
- break;
- }
- }
-
- Print-Info "Refreshing PATH..."
- Refresh-Path
- }
-
- InstallDeps-Electron
-}
-
-function Install-Wix {
- Print-Info "Downloading wixtoolset..."
- # choco is using 3.11 which causes problems building on remote ssh due to dotnet3.5
- # choco install wixtoolset --yes
- $WebClient = New-Object System.Net.WebClient
- # if they ever fix the installer we can move to 3.11
- $WebClient.DownloadFile("https://github.com/wixtoolset/wix3/releases/download/wix3112rtm/wix311.exe",".\scripts\wix.exe")
- #$WebClient.DownloadFile("https://github.com/wixtoolset/wix3/releases/download/wix3104rtm/wix310.exe",".\scripts\wix.exe")
- Print-Info "Installing wixtoolset..."
- # todo: check hash
- .\scripts\wix.exe -q
- if ($LastExitCode -ne $null) {
- throw "com.mattermost.makefile.deps.wix"
- }
- Print-Info "wixtoolset installed!"
-}
-#EndRegion
-
-################################################################################
-# Research of dependencies related functions
-################################################################################
-#Region
-function Get-WixDir {
- $progFile = (${env:ProgramFiles(x86)}, ${env:ProgramFiles} -ne $null)[0]
- $wixDirs = @(Get-ChildItem -Path $progFile -Recurse -Filter "*wix toolset*" -Attributes Directory -Depth 2 -ErrorAction SilentlyContinue)
- if ($wixDirs[0] -eq $null) {
- return $null
- }
- $wixDir = Join-Path -Path "$progFile" -ChildPath "$($wixDirs[0])"
- $wixDir = Join-Path -Path "$wixDir" -ChildPath "bin"
- return $wixDir
-}
-
-function Get-SignToolDir {
- $progFile = (${env:ProgramFiles(x86)}, ${env:ProgramFiles} -ne $null)[0]
- $signToolDir = Join-Path -Path "$progFile" -ChildPath "Windows Kits\10\bin\"
- # Check if we are on 64 bits or not.
- if ($env:PROCESSOR_ARCHITECTURE -ilike '*64*') {
- $arch = "x64"
- } else {
- $arch = "x86"
- }
- [array]$signToolExes = (
- Get-ChildItem -Path "$signToolDir" -Filter "signtool.exe" -Recurse -ErrorAction SilentlyContinue -Force | % {
- if ($_.FullName -ilike '*x64*') {
- return $_.FullName;
- }
- }
- )
- if ($signToolExes -eq $null -or
- [string]::IsNullOrEmpty($signToolExes[0])) {
- return $null
- }
-
- if (Test-Path $signToolExes[0]) {
- return Split-Path $signToolExes[0]
- }
- return $null
-}
-
-function Get-NpmDir {
- # npm is always installed as a nodejs dependency. 64 bits version available.
- # C:\Program Files\nodejs\npm with a shortcut leading to
- # C:\Program Files\nodejs\node_modules\npm\bin
- $progFile = ${env:ProgramFiles}
- $npmDir = Join-Path -Path "$progFile" -ChildPath "nodejs"
- if ([System.IO.File]::Exists("$npmDir\npm.cmd")) {
- return $npmDir
- }
- $progFile = ${env:ProgramW6432}
- $npmDir = Join-Path -Path "$progFile" -ChildPath "nodejs"
- if ([System.IO.File]::Exists("$npmDir\npm.cmd")) {
- return $npmDir
- }
- return $null
-}
-#EndRegion
-
-################################################################################
-# Mattermost related functions
-################################################################################
-#region
-function Prepare-Path {
-
- # As we may need to install new dependencies, make sure the PATH env
- # variable is not too large. Some CI envs like AppVeyor have already the
- # PATH env variable defined at the maximum which prevents new strings to
- # be added to it. We will remove all the stuff added for programs in
- # Program Files (64 bits and 32 bits variants) except the path of our
- # dependencies.
- # src.: https://gist.github.com/wget/a102f89c301014836aaa49a98dd06ee2
- $oldPath = $env:Path
-
- [array]$newPath
- # Cleanup the PATH from everything contained in Program Files...
- $newPath = ($env:Path -split ';') | Where-Object { $_ -notlike "C:\Program Files*" }
- # ...except from Git
- $newPath += ($env:Path -split ';') | Where-Object { $_ -like "C:\Program Files*\*Git*" }
- $env:Path = $newPath -join ';'
- Print-Info "Reducing and reordering PATH from `n ""$oldPath""`n to`n ""$env:Path"""
-
- # Prepending ensures we are using our own path here to avoid the paths the
- # user might have defined to interfere.
-
- # Prepend the PATH with npm/nodejs dir
- Print-Info "Checking if npm dir is already in the PATH..."
- $env:Path = "$(Get-NpmDir)" + ";" + $env:Path
-
- # Prepend the PATH with wix dir
- Print-Info "Checking if wix dir is already in the PATH..."
- $env:Path = "$(Get-WixDir)" + ";" + $env:Path
-
- # Prepend the PATH with signtool dir
- Print-Info "Checking if signtool dir is already in the PATH..."
- $env:Path = "$(Get-SignToolDir)" + ";" + $env:Path
-}
-
-function Catch-Interruption {
- [console]::TreatControlCAsInput = $true
- while ($true) {
- if ([console]::KeyAvailable) {
- $key = Read-Host
- #$key = [system.console]::readkey($true)
- if (($key.modifiers -band [consolemodifiers]"control") -and
- ($key.key -eq "C")) {
- Print-Warning "Ctrl-C pressed. Cancelling the build process and restoring computer state..."
- Restore-ComputerState
- exit
- }
- }
- }
-}
-
-function Backup-ComputerState {
- $env:COM_MATTERMOST_MAKEFILE_PATH_BACKUP = $env:Path
-
- Push-Location "$(Get-RootDir)"
- # Needed because for native apps, PowerShell doesn't change the
- # process current path location
- #src.: https://stackoverflow.com/a/4725090/3514658
- [Environment]::CurrentDirectory = $PWD
-
- # Refresh path because it might have been made durty in the current shell
- Refresh-Path
-}
-
-function Restore-ComputerState {
-
- Print-Info "Restoring PATH..."
- $env:Path = $env:COM_MATTERMOST_MAKEFILE_PATH_BACKUP
-
- Print-Info "Restoring current working directory..."
- Pop-location
- [Environment]::CurrentDirectory = $PWD
-
- # Remove all COM_MATTERMOST_MAKEFILE_ prefixed env variable
- foreach ($item in (Get-Item -Path Env:*)) {
- if ($item.Name -imatch 'COM_MATTERMOST_MAKEFILE_') {
- Print-Info "Removing Mattermost env variable: $($item.Name)..."
- Remove-Item env:\$($item.Name)
- }
- }
-}
-
-function Optimize-Build {
- Print-Info "Checking if Windows Search is running..."
- if ((Get-Service -Name "Windows Search").Status -eq "Running") {
- Print-Info "Windows Search is running. Disabling it..."
- Stop-Service "Windows Search"
- Print-Warning "WARNING: This makefile disabled Windows Search, to reenable it, type in an administror Powershell: Start-Service ""Windows Search"""
- } else {
- Print-Info "Windows Search has already been disabled."
- }
-
- Print-Info "Checking if Windows Defender realtime protection is active..."
- if (!(Get-MpPreference).DisableRealtimeMonitoring) {
- Print-Info "Windows Defender realtime protection is active. Disabling it..."
- Set-MpPreference -DisableRealtimeMonitoring $true
- Print-Warning "WARNING: This makefile disabled Windows Defender realtime protection, to reenable it, type in an administror Powershell: Set-MpPreference -DisableRealtimeMonitoring `$false"
- } else {
- Print-Info "Windows Defender realtime protection has already been disabled."
- }
-}
-
-function Run-BuildId {
- Print-Info -NoNewLine "Getting build date..."
- $env:COM_MATTERMOST_MAKEFILE_BUILD_DATE = (Get-Date).ToUniversalTime().ToString("yyyy-MM-dd")
- Print " [$env:COM_MATTERMOST_MAKEFILE_BUILD_DATE]"
-
- # Generate build version ids
- #
- # nodejs/npm does require to have semver parsable versions:
- # major.minor.patch
- # Non number values are allowed only if they are not starting the dot verion.
- # 4.3.0-rc2 is allowed but 4.3.rc2 is not
- #
- # wix toolset supports semver up to the revision dot syntax:
- # major.minor.patch.revision.
- # ProductVersion Property is defined as
- # [0-255].[0-255].[0-65535]
- # 8 , 8 , 16 signed bit
- # File Version is defined as
- # [0-65535].[0-65535].[0-65535].[0-65535]
- # 16 , 16 , 16 , 16 signed bit
- #
- # Other chars other than numbers should be removed.
- # Versions like v4.3.0-rc0 shoud be. We are thus forcing to
- # have a format like 4.3.0.rc0.
- # When the last tag is not present or not a parsable semver version, we are
- # taking the number of revisions reachable from the HEAD of the current branch
- # (other branches are not taken into account).
- # Example:
- # $ git rev-list --count --first-parent HEAD
- # 645
- # Using the date is unreliable, because this requires to have a precision at
- # seconds, leading to an overflow of the integer range supported by wix.
- # 4.3.0.20190512074020 is not accepted and fails with the following error:
- # candle.exe : error CNDL0001 : Value was either too large or too small for an Int32.
- # Exception Type: System.OverflowException
- # Add the revision only if we are not building a tag
-
- $version = "$(jq -r '.version' package.json)"
- $winVersion = "$($version -Replace '-','.' -Replace '[^0-9.]')"
-
- Print-Info "Checking build id tag validity... [$version]"
- [version]$appVersion = New-Object -TypeName System.Version
- [void][version]::TryParse($winVersion, [ref]$appVersion)
- if (!($appVersion)) {
- # if we couldn't parse, it might be a -develop or something similar, so we just add a
- # number there that will change overtime. Most likely this is a PR to be tested
- $revision = "$(git rev-list --all --count)"
- $winVersion = "$($version -Replace '-.*').${revision}"
- [void][version]::TryParse($winVersion, [ref]$appVersion)
- if (!($appVersion)) {
- Print-Error "Non parsable tag detected. Fallbacking to version 0.0.0."
- $version = "0.0.0"
- }
- }
-
- Print-Info -NoNewLine "Getting build id version..."
- $env:COM_MATTERMOST_MAKEFILE_BUILD_ID = "$version"
- Print " [$env:COM_MATTERMOST_MAKEFILE_BUILD_ID]"
-
- Print-Info -NoNewLine "Getting build id version for msi..."
- $env:COM_MATTERMOST_MAKEFILE_BUILD_ID_MSI = $winVersion.Split('.')[0..3] -Join '.'
- Print " [$env:COM_MATTERMOST_MAKEFILE_BUILD_ID_MSI]"
-
- Print-Info -NoNewLine "Getting build id version for node/npm..."
- $env:COM_MATTERMOST_MAKEFILE_BUILD_ID_NODE = $version
- Print " [$env:COM_MATTERMOST_MAKEFILE_BUILD_ID_NODE]"
-
- Print-Info "Patching version from msi xml descriptor..."
- $msiDescriptorFileName = "scripts\msi_installer.wxs"
- $msiDescriptor = [xml](Get-Content $msiDescriptorFileName)
- $msiDescriptor.Wix.Product.Version = [string]$env:COM_MATTERMOST_MAKEFILE_BUILD_ID_MSI
- $ComponentDownload = $msiDescriptor.CreateElement("Property", "http://schemas.microsoft.com/wix/2006/wi")
- $ComponentDownload.InnerText = "https://releases.mattermost.com/desktop/$version/mattermost-desktop-$version-`$(var.Platform).msi"
- $ComponentDownload.SetAttribute("Id", "ComponentDownload")
- $msiDescriptor.Wix.Product.AppendChild($ComponentDownload)
- $msiDescriptor.Save($msiDescriptorFileName)
- Print-Info "Modified Wix XML"
-}
-
-function InstallDeps-Electron {
- Print-Info "Installing nodejs/electron dependencies (running npm ci)..."
- npm i -g node-gyp
- node-gyp install
- node-gyp install --devdir="$env:USERPROFILE\.electron-gyp" --target=$(jq -r .devDependencies.electron package.json) --dist-url="https://electronjs.org/headers"
- node-gyp install --devdir="$env:USERPROFILE\.electron-gyp" --target=$(jq -r .devDependencies.electron package.json) --dist-url="https://electronjs.org/headers" --arch arm64
- node-gyp install --devdir="$env:USERPROFILE\.electron-gyp" --target=$(jq -r .devDependencies.electron package.json) --dist-url="https://electronjs.org/headers" --arch ia32
- npm ci
-}
-
-function Run-BuildElectron {
- #npm install --prefix="$(Get-RootDir)" "$(Get-RootDir)"
- Print-Info "Building nodejs/electron code (running npm run build)..."
- npm run build
- #npm run build --prefix="$(Get-RootDir)" "$(Get-RootDir)"
- Print-Info "Packaging nodejs/electron for Windows (running npm run package:windows)..."
- # NSIS has the upgrade flag enabled, so it must be done first
- npm run package:windows-nsis
- npm run package:windows
- #npm run package:windows --prefix="$(Get-RootDir)" "$(Get-RootDir)"
-}
-
-function Run-BuildForceSignature {
- # Only sign the executable and .dll if this is a release and not a pull request
- # check.
- if (Test-Path 'env:PFX') {
- Print-Info "Signing"
- foreach ($archPath in "release\win-unpacked", "release\win-ia32-unpacked") {
- # Note: The C++ redistribuable files will be resigned again even if they have a
- # correct signature from Microsoft. Windows doesn't seem to complain, but we
- # don't know whether this is authorized by the Microsoft EULA.
- Get-ChildItem -Path $archPath -recurse "*.dll" | ForEach-Object {
- Print-Info "Signing $($_.Name) (waiting for 2 * 15 seconds)..."
- # Waiting for at least 15 seconds is needed because these time
- # servers usually have rate limits and signtool can fail with the
- # following error message:
- # "SignTool Error: The specified timestamp server either could not be reached or returned an invalid response.
- # src.: https://web.archive.org/web/20190306223053/https://github.com/electron-userland/electron-builder/issues/2795#issuecomment-466831315
- Start-Sleep -s 15
- signtool.exe sign /f "./mattermost-desktop-windows.pfx" /p "$env:PFX_KEY" /tr "http://timestamp.digicert.com" /fd sha1 /td sha1 "$($_.FullName)"
- Start-Sleep -s 15
- signtool.exe sign /f "./mattermost-desktop-windows.pfx" /p "$env:PFX_KEY" /tr "http://timestamp.digicert.com" /fd sha256 /td sha256 /as "$($_.FullName)"
- }
-
- Print-Info "Signing Mattermost.exe (waiting for 2 * 15 seconds)..."
- Start-Sleep -s 15
- signtool.exe sign /f "./mattermost-desktop-windows.pfx" /p "$env:PFX_KEY" /tr "http://timestamp.digicert.com" /fd sha1 /td sha1 "$archPath\Mattermost.exe"
- Start-Sleep -s 15
- signtool.exe sign /f "./mattermost-desktop-windows.pfx" /p "$env:PFX_KEY" /tr "http://timestamp.digicert.com" /fd sha256 /td sha256 /as "$archPath\Mattermost.exe"
- }
- } else {
- Print-Info "Certificate file not found, DLLs and executable won't be signed."
- }
-}
-
-
-function Run-BuildLicense {
-
- # Convert license to RTF
- $licenseTxtFile = "LICENSE.txt";
- $licenseRtfFile = "resources/windows/license.rtf";
- $licenseNewParagraph = "\par" + [Environment]::NewLine;
- $sw = [System.IO.File]::CreateText($licenseRtfFile);
- $sw.WriteLine("{\rtf1\ansi\deff0\nouicompat{\fonttbl{\f0\fnil\fcharset0 Courier New;}}\pard\qj\f0\fs18");
- $lineToAdd = "";
- $gapDetected = 0;
- # We are relying on introspected C#/.NET rather than the buggy Get-Content
- # cmdlet because Get-Content considers by default a `-Delimiter` to '\n'
- # and thus breaks the purpose of the parser.
- foreach ($line in [System.IO.File]::ReadLines($licenseTxtFile)) {
- # trim() is equivalent to .replace("\ \s+", "")
- # We replace one backslash by two. Since the first arg is a regex,
- # we need to escape it.
- # src.: https://stackoverflow.com/a/31324570/3514658
- $sanitizedLine = $line.trim().replace("\\", "\\").replace("{", "\{").replace("}", "\}");
- # Print previous string gathered if gap detected.
- if ([string]::IsNullOrEmpty($sanitizedLine)) {
- $gapDetected++;
- # For first line keep paragraph definition from document head.
- if ($gapDetected -eq 1) {
- $sw.Write($lineToAdd);
- } elseif ($gapDetected -eq 2) {
- $sw.Write($licenseNewParagraph + $lineToAdd);
- } else {
- $sw.Write($licenseNewParagraph + $lineToAdd + $licenseNewParagraph);
- }
- $lineToAdd = "";
- continue;
- }
- # Keep carriage return for first two blocks comprising Copyright and
- # license name statements.
- if ($gapDetected -lt 3) {
- $lineToAdd += $sanitizedLine + $licenseNewParagraph;
- continue;
- }
- # Do not add heading space if the line begins a new paragraph.
- if ($lineToAdd -eq "") {
- $lineToAdd += $sanitizedLine;
- continue;
- }
- $lineToAdd += " " + $sanitizedLine;
- }
- if ($lineToAdd -ne "") {
- $sw.Write([Environment]::NewLine + $licenseNewParagraph + $lineToAdd + "\par");
- }
- $sw.Close();
-}
-
-function Run-BuildMsi {
- Print-Info "Building 32 bits msi installer..."
- heat.exe dir "release\win-ia32-unpacked\" -o "scripts\msi_installer_files.wxs" -scom -frag -srd -sreg -gg -cg MattermostDesktopFiles -t "scripts\msi_installer_files_replace_id.xslt" -dr INSTALLDIR
- candle.exe -dPlatform=x86 "scripts\msi_installer.wxs" "scripts\msi_installer_files.wxs" -o "scripts\"
- light.exe "scripts\msi_installer.wixobj" "scripts\msi_installer_files.wixobj" -loc "resources\windows\msi_i18n\en_US.wxl" -o "release\$($env:COM_MATTERMOST_MAKEFILE_BUILD_ID)\mattermost-desktop-$($env:COM_MATTERMOST_MAKEFILE_BUILD_ID)-x86.msi" -b "release\win-ia32-unpacked\"
-
- Print-Info "Building 64 bits msi installer..."
- heat.exe dir "release\win-unpacked\" -o "scripts\msi_installer_files.wxs" -scom -frag -srd -sreg -gg -cg MattermostDesktopFiles -t "scripts\msi_installer_files_replace_id.xslt" -t "scripts\msi_installer_files_set_win64.xslt" -dr INSTALLDIR
- candle.exe -dPlatform=x64 "scripts\msi_installer.wxs" "scripts\msi_installer_files.wxs" -o "scripts\"
- light.exe "scripts\msi_installer.wixobj" "scripts\msi_installer_files.wixobj" -loc "resources\windows\msi_i18n\en_US.wxl" -o "release\$($env:COM_MATTERMOST_MAKEFILE_BUILD_ID)\mattermost-desktop-$($env:COM_MATTERMOST_MAKEFILE_BUILD_ID)-x64.msi" -b "release\win-unpacked\"
-
- # Only sign the executable and .dll if this is a release and not a pull request
- # check.
- if (Test-Path 'env:PFX') {
- Print-Info "Signing mattermost-desktop-$($env:COM_MATTERMOST_MAKEFILE_BUILD_ID)-x86.msi (waiting for 15 seconds)..."
- Start-Sleep -s 15
- # Dual signing is not supported on msi files. Is it recommended to sign with 256 hash.
- # src.: https://security.stackexchange.com/a/124685/84134
- # src.: https://social.msdn.microsoft.com/Forums/windowsdesktop/en-us/d4b70ecd-a883-4289-8047-cc9cde28b492#0b3e3b80-6b3b-463f-ac1e-1bf0dc831952
- signtool.exe sign /f "./mattermost-desktop-windows.pfx" /p "$env:PFX_KEY" /tr "http://timestamp.digicert.com" /fd sha256 /td sha256 /d "release\$($env:COM_MATTERMOST_MAKEFILE_BUILD_ID)\mattermost-desktop-$($env:COM_MATTERMOST_MAKEFILE_BUILD_ID)-x86.msi" "release\$($env:COM_MATTERMOST_MAKEFILE_BUILD_ID)\mattermost-desktop-$($env:COM_MATTERMOST_MAKEFILE_BUILD_ID)-x86.msi"
-
- Print-Info "Signing mattermost-desktop-$($env:COM_MATTERMOST_MAKEFILE_BUILD_ID)-x64.msi (waiting for 15 seconds)..."
- Start-Sleep -s 15
- signtool.exe sign /f "./mattermost-desktop-windows.pfx" /p "$env:PFX_KEY" /tr "http://timestamp.digicert.com" /fd sha256 /td sha256 /d "release\$($env:COM_MATTERMOST_MAKEFILE_BUILD_ID)\mattermost-desktop-$($env:COM_MATTERMOST_MAKEFILE_BUILD_ID)-x64.msi" "release\$($env:COM_MATTERMOST_MAKEFILE_BUILD_ID)\mattermost-desktop-$($env:COM_MATTERMOST_MAKEFILE_BUILD_ID)-x64.msi"
- } else {
- Print-Info "Certificate file not found, the msi installers won't be signed."
- }
-}
-
-function Get-Cert {
- if (Test-Path 'env:PFX') {
- Print-Info "Getting windows certificate"
- [IO.File]::WriteAllBytes("./mattermost-desktop-windows.pfx", [Convert]::FromBase64String($env:PFX))
- $password = "$env:PFX_KEY" | convertto-securestring -asplaintext -force
- Print-Info "Importing certificate into the machine"
- Import-PfxCertificate -filepath "./mattermost-desktop-windows.pfx" cert:\localMachine\my -password $password
- } else {
- Print-Warning "No env:PFX environment variable found, build will not be signed."
- }
-}
-
-function Remove-Cert {
- if (Test-Path 'env:PFX') {
- Print-Info "Removing windows certificate"
- Remove-Item -path "./mattermost-desktop-windows.pfx"
- }
-}
-
-function Run-Build {
- Check-Deps -Verbose -Throwable
- Prepare-Path
- Get-Cert
- Run-BuildId
- Run-BuildElectron
- Run-BuildForceSignature
- Run-BuildLicense
- Run-BuildMsi
- Remove-Cert
-}
-
-function Run-Test {
- Check-Deps -Verbose -Throwable
- Prepare-Path
- npm test
-}
-#EndRegion
-
-################################################################################
-# Main function
-################################################################################
-#Region
-function Main {
- try {
- if ($makeRule -eq $null) {
- Print-Info "No argument passed to the make file. Executing ""all"" rule."
- $makeRule = "all"
- }
-
- Backup-ComputerState
-
- switch ($makeRule.toLower()) {
- "all" {
- Install-Deps
- Run-Build
- }
- "build" {
- Install-Deps
- Run-Build
- }
- "test" {
- Install-Deps
- Run-Test
- }
- "install-deps" {
- Install-Deps
- }
- "optimize" {
- Optimize-Build
- }
- "install-cert" {
- Get-Cert
- }
- "remove-cert" {
- Remove-Cert
- }
- default {
- Print-Error "Makefile argument ""$_"" is invalid. Build process aborted."
- }
- }
-
- $env:COM_MATTERMOST_MAKEFILE_EXECUTION_SUCCESS = $true
- $exitCode = 0
-
- } catch {
- switch ($_.Exception.Message) {
- "com.mattermost.makefile.deps.missing" {
- Print-Error "The following dependencies are missing: $($missing -Join ', ').`n Please install dependencies as an administrator:`n # makefile.ps1 install-deps"
- $exitCode = -1
- }
- "com.mattermost.makefile.deps.notadmin" {
- Print-Error "Installing dependencies requires admin privileges. Operation aborted.`n Please reexecute this makefile as an administrator:`n # makefile.ps1 install-deps"
- $exitCode = -2
- }
- "com.mattermost.makefile.deps.wix" {
- Print-Error "There was nothing wrong with your source code,but we found a problem installing wix toolset and couldn't continue. please try re-running the job."
- $exitCode = -3
- }
- default {
- Print-Error "Another error occurred: $_"
- $exitCode = -100
- }
- }
- } finally {
- if (!($env:COM_MATTERMOST_MAKEFILE_EXECUTION_SUCCESS)) {
- Print-Warning "Makefile interrupted by Ctrl + C or by another interruption handler."
- }
- Restore-ComputerState
- exit $exitCode
- }
-}
-
-Main
-#EndRegion
\ No newline at end of file
diff --git a/scripts/cp_artifacts.sh b/scripts/cp_artifacts.sh
index 7e99a0e9..97a23c9a 100755
--- a/scripts/cp_artifacts.sh
+++ b/scripts/cp_artifacts.sh
@@ -10,11 +10,6 @@ if [[ ! -d "${DEST}" ]]; then
mkdir -p "${DEST}"
fi
-if [[ -f "${SRC}/mattermost-desktop-${VERSION}-win-ia32.zip" ]]; then
- echo -e "Copying Win32\n"
- cp "${SRC}/mattermost-desktop-${VERSION}-win-ia32.zip" "${DEST}/mattermost-desktop-${VERSION}-win32.zip"
- SOMETHING_COPIED=1
-fi
if [[ -f "${SRC}/mattermost-desktop-${VERSION}-win-x64.zip" ]]; then
echo -e "Copying Win64\n"
cp "${SRC}/mattermost-desktop-${VERSION}-win-x64.zip" "${DEST}/mattermost-desktop-${VERSION}-win64.zip"
@@ -30,14 +25,14 @@ if [[ ${MM_WIN_INSTALLERS-0} -eq 1 && -f "${SRC}/mattermost-desktop-setup-${VERS
cp "${SRC}/mattermost-desktop-setup-${VERSION}-win.exe" "${DEST}/"
SOMETHING_COPIED=$((SOMETHING_COPIED + 3))
fi
-if [[ ${MM_WIN_INSTALLERS-0} -eq 1 && -f "${SRC}/mattermost-desktop-${VERSION}-x64.msi" ]]; then
+if [[ ${MM_WIN_INSTALLERS-0} -eq 1 && -f "${SRC}/mattermost-desktop-${VERSION}-win-x64.msi" ]]; then
echo -e "Copying win-msi-x64\n"
- cp "${SRC}/mattermost-desktop-${VERSION}-x64.msi" "${DEST}/"
+ cp "${SRC}/mattermost-desktop-${VERSION}-win-x64.msi" "${DEST}/"
SOMETHING_COPIED=$((SOMETHING_COPIED + 4))
fi
-if [[ ${MM_WIN_INSTALLERS-0} -eq 1 && -f "${SRC}/mattermost-desktop-${VERSION}-x86.msi" ]]; then
- echo -e "Copying win-msi-x86\n"
- cp "${SRC}/mattermost-desktop-${VERSION}-x86.msi" "${DEST}/"
+if [[ ${MM_WIN_INSTALLERS-0} -eq 1 && -f "${SRC}/mattermost-desktop-${VERSION}-win-arm64.msi" ]]; then
+ echo -e "Copying win-msi-arm64\n"
+ cp "${SRC}/mattermost-desktop-${VERSION}-win-arm64.msi" "${DEST}/"
SOMETHING_COPIED=$((SOMETHING_COPIED + 5))
fi
diff --git a/scripts/cp_msi_app_update.js b/scripts/cp_msi_app_update.js
new file mode 100644
index 00000000..f5c397c2
--- /dev/null
+++ b/scripts/cp_msi_app_update.js
@@ -0,0 +1,6 @@
+// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
+// See LICENSE.txt for license information.
+
+const fs = require('fs');
+fs.copyFileSync('release/win-unpacked/resources/app-update.yml', 'release/msi-app-update.yml');
+fs.unlinkSync('release/win-unpacked/resources/app-update.yml');
\ No newline at end of file
diff --git a/scripts/generate_release_markdown.sh b/scripts/generate_release_markdown.sh
index 2dda4a92..e83952ce 100755
--- a/scripts/generate_release_markdown.sh
+++ b/scripts/generate_release_markdown.sh
@@ -21,15 +21,11 @@ Release notes can be found here: https://docs.mattermost.com/install/desktop-app
The download links can be found below.
-#### Windows - msi files (beta)
-$(print_link "${BASE_URL}/mattermost-desktop-${VERSION}-x64.msi")
-$(print_link "${BASE_URL}/mattermost-desktop-${VERSION}-x86.msi")
-
-#### Windows - setup exe files
-$(print_link "${BASE_URL}/mattermost-desktop-setup-${VERSION}-win.exe")
+#### Windows - installer files
+$(print_link "${BASE_URL}/mattermost-desktop-${VERSION}-win-x64.msi")
+$(print_link "${BASE_URL}/mattermost-desktop-${VERSION}-win-arm64.msi") (beta)
#### Windows - zip files
-$(print_link "${BASE_URL}/mattermost-desktop-${VERSION}-win32.zip")
$(print_link "${BASE_URL}/mattermost-desktop-${VERSION}-win64.zip")
$(print_link "${BASE_URL}/mattermost-desktop-${VERSION}-arm64.zip") (beta)
diff --git a/scripts/installer.nsh b/scripts/installer.nsh
new file mode 100644
index 00000000..87f1d363
--- /dev/null
+++ b/scripts/installer.nsh
@@ -0,0 +1,8 @@
+# This macro fetches the currently install MM version via MSI (if any) and uninstalls it first
+!macro customInit
+ nsExec::ExecToStack "$\"$%SYSTEMROOT%\system32\WindowsPowerShell\v1.0\powershell.exe$\" -command $\"$$Installer = New-Object -ComObject WindowsInstaller.Installer; $$MMProduct = $$Installer.ProductsEx('', '', 7) | Where-Object -FilterScript {$$_.InstallProperty('ProductName') -eq 'Mattermost'}; if ($$MMProduct -ne $$null) {Write-Host -NoNewline $$MMProduct.ProductCode()}$\""
+ Pop $0
+ Pop $1
+ StrCmp $1 "" 0 +1
+ ExecWait '"$%SYSTEMROOT%\system32\msiexec.exe" /x $1 /qn'
+!macroend
\ No newline at end of file
diff --git a/scripts/msi_installer.wxs b/scripts/msi_installer.wxs
deleted file mode 100644
index 72cd1150..00000000
--- a/scripts/msi_installer.wxs
+++ /dev/null
@@ -1,1006 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- = 601)]]>
-
-
-
-
-
-
-
-
-
-
-