@@ -76,3 +76,152 @@ $VARIANTS_SHARED = @{
7676 }
7777 }
7878}
79+
80+ # Global cache for checksums
81+ $global :CHECKSUMS = @ {}
82+ function global :Set-Checksums ($k , $url ) {
83+ $global :CHECKSUMS [$k ] = if ($global :CHECKSUMS [$k ]) { $global :CHECKSUMS [$k ] } else { [System.Text.Encoding ]::UTF8.GetString( (Invoke-WebRequest $url ).Content ) -split " `n " }
84+ }
85+ function global :Get-ChecksumsFile ($k , $keyword ) {
86+ $global :CHECKSUMS [$k ] | ? { $_ -match $keyword } | % { $_ -split " \s" } | Select-Object - Last 1 | % { $_.TrimStart (' *' ) }
87+ }
88+ function global :Get-ChecksumsSha ($k , $keyword ) {
89+ $global :CHECKSUMS [$k ] | ? { $_ -match $keyword } | % { $_ -split " \s" } | Select-Object - First 1
90+ }
91+
92+ # Global functions
93+ function global :Generate-DownloadBinary ($o ) {
94+ Set-StrictMode - Version Latest
95+
96+ $releaseUrl = " https://$ ( $o [' project' ] ) /releases/download/$ ( $o [' version' ] ) "
97+ $checksumsUrl = " $releaseUrl /$ ( $o [' checksums' ] ) "
98+ Set-Checksums $o [' binary' ] $checksumsUrl
99+
100+ $binaryUpper = $o [' binary' ].ToUpper()
101+ @"
102+ # Install $ ( $o [' binary' ] )
103+ RUN set -eux; \
104+ export $ ( $binaryUpper ) _VERSION="$ ( $o [' version' ] ) "; \
105+ case "`$ ( uname -m )" in \
106+
107+ "@
108+ foreach ($a in ($o [' architectures' ] -split ' ,' ) ) {
109+ $split = $a -split ' /'
110+ $os = $split [0 ]
111+ $arch = $split [1 ]
112+ $archv = if ($split.Count -gt 2 ) { $split [2 ] } else { ' ' }
113+ switch ($a ) {
114+ " $os /386" {
115+ $regex = " $os [-_](i?$arch |x86)[-_]?$archv $ ( [regex ]::Escape($o [' archiveformat' ]) ) $"
116+ $hardware = ' x86'
117+ }
118+ " $os /amd64" {
119+ $regex = " $os [-_]($arch |x86_64)[-_]?$archv $ ( [regex ]::Escape($o [' archiveformat' ]) ) $"
120+ $hardware = ' x86_64'
121+ }
122+ " $os /arm/v6" {
123+ $regex = " $os [-_]($arch |arm)[-_]?($archv )?$ ( [regex ]::Escape($o [' archiveformat' ]) ) $"
124+ $hardware = ' armhf'
125+ }
126+ " $os /arm/v7" {
127+ $regex = " $os [-_]($arch |arm)[-_]?($archv )?$ ( [regex ]::Escape($o [' archiveformat' ]) ) $"
128+ $hardware = ' armv7l'
129+ }
130+ " $os /arm64" {
131+ $regex = " $os [-_]($arch |aarch64)[-_]?$archv $ ( [regex ]::Escape($o [' archiveformat' ]) ) $"
132+ $hardware = ' aarch64'
133+ }
134+ " $os /ppc64le" {
135+ $regex = " $os [-_]$arch [-_]?$archv $ ( [regex ]::Escape($o [' archiveformat' ]) ) $"
136+ $hardware = ' ppc64le'
137+ }
138+ " $os /riscv64" {
139+ $regex = " $os [-_]$arch [-_]?$archv $ ( [regex ]::Escape($o [' archiveformat' ]) ) $"
140+ $hardware = ' riscv64'
141+ }
142+ " $os /s390x" {
143+ $regex = " $os [-_]$arch [-_]?$archv $ ( [regex ]::Escape($o [' archiveformat' ]) ) $"
144+ $hardware = ' s390x'
145+ }
146+ default {
147+ throw " Unsupported architecture: $a "
148+ }
149+ }
150+
151+ @"
152+ '$hardware ') \
153+ URL=$releaseUrl /$ ( Get-ChecksumsFile $o [' binary' ] $regex ) ; \
154+ SHA256=$ ( Get-ChecksumsSha $o [' binary' ] $regex ) ; \
155+ ;; \
156+
157+ "@
158+ }
159+
160+ @"
161+ *) \
162+ echo "Architecture not supported"; \
163+ exit 1; \
164+ ;; \
165+ esac; \
166+
167+ "@
168+
169+ @"
170+ FILE=$ ( $o [' binary' ] ) $ ( $o [' archiveformat' ] ) ; \
171+ wget -q "`$ URL" -O "`$ FILE"; \
172+ echo "`$ SHA256 `$ FILE" | sha256sum -c -; \
173+
174+ "@
175+
176+
177+ if ($o [' archiveformat' ] -match ' \.tar\.gz|\.tgz' ) {
178+ if ($o [' archivefiles' ].Count -gt 0 ) {
179+ @"
180+ tar -xvf "`$ FILE" --no-same-owner --no-same-permissions -- $ ( $o [' archivefiles' ] -join ' ' ) ; \
181+ rm -f "`$ FILE"; \
182+
183+ "@
184+ }else {
185+ @"
186+ tar -xvf "`$ FILE" --no-same-owner --no-same-permissions; \
187+ rm -f "`$ FILE"; \
188+
189+ "@
190+ }
191+ }elseif ($o [' archiveformat' ] -match ' \.bz2' ) {
192+ @"
193+ bzip2 -d "`$ FILE"; \
194+
195+ "@
196+ }elseif ($o [' archiveformat' ] -match ' \.gz' ) {
197+ @"
198+ gzip -d "`$ FILE"; \
199+
200+ "@
201+ }else {
202+ throw " Invalid 'archiveformat'. Supported formats: .tar.gz, .tgz, .bz2, .gz"
203+ }
204+
205+ @"
206+ mv -v $ ( $o [' binary' ] ) /usr/local/bin/$ ( $o [' binary' ] ) ; \
207+ chmod +x /usr/local/bin/$ ( $o [' binary' ] ) ; \
208+ $ ( $o [' binary' ] ) $ ( $o [' versionSubcommand' ] ) ; \
209+
210+ "@
211+
212+ if ($o.Contains (' archivefiles' )) {
213+ if ($license = $o [' archivefiles' ] | ? { $_ -match ' LICENSE' }) {
214+ @"
215+ mkdir -p /licenses; \
216+ mv -v $license /licenses/$license ; \
217+
218+ "@
219+ }
220+ }
221+
222+ @"
223+ :
224+
225+
226+ "@
227+ }
0 commit comments