-
Notifications
You must be signed in to change notification settings - Fork 6
/
NativeActuals.kt
52 lines (43 loc) · 1.58 KB
/
NativeActuals.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
@file:OptIn(ExperimentalFileSystem::class)
package io
import kotlinx.cinterop.refTo
import kotlinx.cinterop.toKString
import kotlinx.coroutines.runBlocking
import okio.ExperimentalFileSystem
import okio.FileSystem
import platform.posix.chdir
import platform.posix.fgets
import platform.posix.pclose
import platform.posix.popen
actual val fileSystem: FileSystem = FileSystem.SYSTEM
actual suspend fun findExecutable(executable: String): String =
executable
/**
* https://stackoverflow.com/questions/57123836/kotlin-native-execute-command-and-get-the-output
*/
actual suspend fun executeCommandAndCaptureOutput(
command: List<String>, // "find . -name .git"
options: ExecuteCommandOptions
): String {
chdir(options.directory)
val commandToExecute = command.joinToString(separator = " ") { arg ->
if (arg.contains(" ")) "'$arg'" else arg
}
val redirect = if (options.redirectStderr) " 2>&1 " else ""
val fp = popen("$commandToExecute $redirect", "r") ?: error("Failed to run command: $command")
val stdout = buildString {
val buffer = ByteArray(4096)
while (true) {
val input = fgets(buffer.refTo(0), buffer.size, fp) ?: break
append(input.toKString())
}
}
val status = pclose(fp)
if (status != 0 && options.abortOnError) {
println(stdout)
throw Exception("Command `$command` failed with status $status${if (options.redirectStderr) ": $stdout" else ""}")
}
return if (options.trim) stdout.trim() else stdout
}
actual fun runTest(block: suspend () -> Unit) =
runBlocking { block() }