11import Foundation
2+ import Subprocess
23import SwiftlyCore
34import SystemPackage
45
@@ -263,7 +264,13 @@ public struct Linux: Platform {
263264 }
264265
265266 if requireSignatureValidation {
266- guard ( try ? self . runProgram ( " gpg " , " --version " , quiet: true ) ) != nil else {
267+ let result = try await run (
268+ . name( " gpg " ) ,
269+ arguments: [ " --version " ] ,
270+ output: . discarded
271+ )
272+
273+ if !result. terminationStatus. isSuccess {
267274 var msg = " gpg is not installed. "
268275 if let manager {
269276 msg += """
@@ -283,11 +290,9 @@ public struct Linux: Platform {
283290 try await fs. withTemporary ( files: tmpFile) {
284291 try await ctx. httpClient. getGpgKeys ( ) . download ( to: tmpFile)
285292 if let mockedHomeDir = ctx. mockedHomeDir {
286- var env = ProcessInfo . processInfo. environment
287- env [ " GNUPGHOME " ] = ( mockedHomeDir / " .gnupg " ) . string
288- try await sys. gpg ( ) . _import ( key: tmpFile) . run ( self , env: env, quiet: true )
293+ try await sys. gpg ( ) . _import ( key: tmpFile) . run ( environment: . inherit. updating ( [ " GNUPGHOME " : ( mockedHomeDir / " .gnupg " ) . string] ) , quiet: true )
289294 } else {
290- try await sys. gpg ( ) . _import ( key: tmpFile) . run ( self , quiet: true )
295+ try await sys. gpg ( ) . _import ( key: tmpFile) . run ( quiet: true )
291296 }
292297 }
293298 }
@@ -315,7 +320,12 @@ public struct Linux: Platform {
315320 do {
316321 switch manager {
317322 case " apt-get " :
318- if let pkgList = try await self . runProgramOutput ( " dpkg " , " -l " , package ) {
323+ let result = try await run ( . name( " dpkg " ) , arguments: [ " -l " , package ] , output: . string( limit: 100 * 1024 ) )
324+ if !result. terminationStatus. isSuccess {
325+ return false
326+ }
327+
328+ if let pkgList = result. standardOutput {
319329 // The package might be listed but not in an installed non-error state.
320330 //
321331 // Look for something like this:
@@ -329,8 +339,8 @@ public struct Linux: Platform {
329339 }
330340 return false
331341 case " yum " :
332- try self . runProgram ( " yum " , " list " , " installed " , package , quiet : true )
333- return true
342+ let result = try await run ( . name ( " yum " ) , arguments : [ " list " , " installed " , package ] , output : . discarded )
343+ return result . terminationStatus . isSuccess
334344 default :
335345 return true
336346 }
@@ -390,7 +400,15 @@ public struct Linux: Platform {
390400 tmpDir / String( name)
391401 }
392402
393- try self . runProgram ( ( tmpDir / " swiftly " ) . string, " init " )
403+ let config = Configuration (
404+ executable: . path( tmpDir / " swiftly " ) ,
405+ arguments: [ " init " ]
406+ )
407+
408+ let result = try await run ( config, output: . standardOutput, error: . standardError)
409+ if !result. terminationStatus. isSuccess {
410+ throw RunProgramError ( terminationStatus: result. terminationStatus, config: config)
411+ }
394412 }
395413 }
396414
@@ -424,11 +442,9 @@ public struct Linux: Platform {
424442 await ctx. message ( " Verifying toolchain signature... " )
425443 do {
426444 if let mockedHomeDir = ctx. mockedHomeDir {
427- var env = ProcessInfo . processInfo. environment
428- env [ " GNUPGHOME " ] = ( mockedHomeDir / " .gnupg " ) . string
429- try await sys. gpg ( ) . verify ( detached_signature: sigFile, signed_data: archive) . run ( self , env: env, quiet: false )
445+ try await sys. gpg ( ) . verify ( detached_signature: sigFile, signed_data: archive) . run ( environment: . inherit. updating ( [ " GNUPGHOME " : ( mockedHomeDir / " .gnupg " ) . string] ) , quiet: false )
430446 } else {
431- try await sys. gpg ( ) . verify ( detached_signature: sigFile, signed_data: archive) . run ( self , quiet: !verbose)
447+ try await sys. gpg ( ) . verify ( detached_signature: sigFile, signed_data: archive) . run ( quiet: !verbose)
432448 }
433449 } catch {
434450 throw SwiftlyError ( message: " Signature verification failed: \( error) . " )
@@ -453,11 +469,9 @@ public struct Linux: Platform {
453469 await ctx. message ( " Verifying swiftly signature... " )
454470 do {
455471 if let mockedHomeDir = ctx. mockedHomeDir {
456- var env = ProcessInfo . processInfo. environment
457- env [ " GNUPGHOME " ] = ( mockedHomeDir / " .gnupg " ) . string
458- try await sys. gpg ( ) . verify ( detached_signature: sigFile, signed_data: archive) . run ( self , env: env, quiet: false )
472+ try await sys. gpg ( ) . verify ( detached_signature: sigFile, signed_data: archive) . run ( environment: . inherit. updating ( [ " GNUPGHOME " : ( mockedHomeDir / " .gnupg " ) . string] ) , quiet: false )
459473 } else {
460- try await sys. gpg ( ) . verify ( detached_signature: sigFile, signed_data: archive) . run ( self , quiet: !verbose)
474+ try await sys. gpg ( ) . verify ( detached_signature: sigFile, signed_data: archive) . run ( quiet: !verbose)
461475 }
462476 } catch {
463477 throw SwiftlyError ( message: " Signature verification failed: \( error) . " )
@@ -611,7 +625,7 @@ public struct Linux: Platform {
611625
612626 public func getShell( ) async throws -> String {
613627 let userName = ProcessInfo . processInfo. userName
614- if let entry = try await sys. getent ( database: " passwd " , key: userName) . entries ( self ) . first {
628+ if let entry = try await sys. getent ( database: " passwd " , key: userName) . entries ( ) . first {
615629 if let shell = entry. last { return shell }
616630 }
617631
0 commit comments