# OpenTween - Client of Twitter # Copyright (c) 2021 kim_upsilon (@kim_upsilon) # All rights reserved. # # This file is part of OpenTween. # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the Free # Software Foundation; either version 3 of the License, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see , or write to # the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, # Boston, MA 02110-1301, USA. # # Reproducible Build に対応した ZIP アーカイブのビルドを行うスクリプト # # 使い方: # .\tools\build-zip-archive.ps1 -BinDir .\OpenTween\bin\Debug\ -DestPath OpenTween.zip # Param( [Parameter(Mandatory = $true)][String] $BinDir, [Parameter(Mandatory = $true)][String] $DestPath, [String] $HeadCommit = 'HEAD' ) Set-StrictMode -Version 3.0 $ErrorActionPreference = 'Stop' $assemblyName = "OpenTween" $exePath = Join-Path $BinDir "${assemblyName}.exe" $pdbPath = Join-Path $BinDir "${assemblyName}.pdb" $includeFiles = @( "en\", "Icons\", "LICENSE", "LICENSE.GPL-3", "LICENSE.ja", "LICENSE.LGPL-3", "${assemblyName}.exe", "${assemblyName}.exe.config" ) . .\tools\functions.ps1 Function Get-SourceDateEpoch() { # 本来 $unixEpoch は UTC で表さなければならないが、ZIP アーカイブには # ローカルのタイムゾーンの日時でタイムスタンプが記録されるため、わざとタイムゾーンを指定していない。 # これにより、生成される ZIP アーカイブには UTC での $sourceDateEpoch に相当する日時が記録されるようになる $unixEpoch = Get-Date "1970/01/01 00:00:00" $sourceDateUnixtime = [int](Invoke-NativeCommand "git log -1 --pretty=%ct ${HeadCommit}") $sourceDateEpoch = $unixEpoch.AddSeconds($sourceDateUnixtime) return $sourceDateEpoch } Function Reset-Timestamps([String[]] $Path, [DateTime] $Timestamp) { # ZIP アーカイブに含めるファイルのタイムスタンプを揃える Get-ChildItem $Path -Recurse | Set-ItemProperty -Name "LastWriteTime" -Value $Timestamp } Function Build-Package([String[]] $Path, [String] $DestPath) { Compress-Archive -Force -Path $Path -DestinationPath $DestPath } Function Get-CommandVersion([String] $Name) { Get-Command -Name $Name | Select -Property Name, @{Name='ProductVersion'; Expression={$_.FileVersionInfo.ProductVersion}} } Function Get-RuntimeVersion() { return [PSCustomObject]@{ Name = 'RuntimeVersion' Value = [Attribute]::GetCustomAttribute( [Object].Assembly, [System.Reflection.AssemblyInformationalVersionAttribute] ).InformationalVersion } } $includePaths = $includeFiles | % { Join-Path $BinDir $_ } $timestamp = Get-SourceDateEpoch Reset-Timestamps -Path $includePaths -Timestamp $timestamp Build-Package -Path $includePaths -DestPath $DestPath Write-Host Write-Host "Build success!" @( Get-CommandVersion 'msbuild.exe' Get-CommandVersion 'csc.exe' Get-RuntimeVersion [PSCustomObject]@{ Name = 'SOURCE_DATE_EPOCH' Value = $timestamp } Get-FileHash -Algorithm SHA256 $destPath # Get-FileHash -Algorithm SHA256 $pdbPath ) | Format-List