|
|
@@ -432,10 +432,30 @@ public int manifest_deploy(string[] args) {
|
|
|
var artifact_base = @"$(manifest.name)-$version_string.image.tar";
|
|
|
printerr(@"Saving image to \"$artifact_base.xz\"...\n");
|
|
|
try {
|
|
|
- var save_proc = new Subprocess.newv(new string[] { "podman", "save", "-o", artifact_base, tag }, SubprocessFlags.INHERIT_FDS);
|
|
|
+ // Stream podman save stdout directly into xz stdin (no intermediate
|
|
|
+ // .tar on disk); xz -T0 uses every available CPU core/thread
|
|
|
+ var xz_launcher = new SubprocessLauncher(SubprocessFlags.STDIN_PIPE);
|
|
|
+ xz_launcher.set_stdout_file_path(@"$artifact_base.xz");
|
|
|
+ var xz_proc = xz_launcher.spawnv(new string[] { "xz", "-T0" });
|
|
|
+
|
|
|
+ var save_launcher = new SubprocessLauncher(SubprocessFlags.STDOUT_PIPE);
|
|
|
+ var save_proc = save_launcher.spawnv(new string[] { "podman", "save", tag });
|
|
|
+
|
|
|
+ var source = save_proc.get_stdout_pipe();
|
|
|
+ var sink = xz_proc.get_stdin_pipe();
|
|
|
+ var buffer = new uint8[65536];
|
|
|
+ while (true) {
|
|
|
+ var read = source.read(buffer);
|
|
|
+ if (read <= 0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ sink.write(buffer[0:read]);
|
|
|
+ }
|
|
|
+ sink.close();
|
|
|
+ source.close();
|
|
|
+
|
|
|
save_proc.wait_check();
|
|
|
- var compress_proc = new Subprocess.newv(new string[] { "xz", "-T0", artifact_base }, SubprocessFlags.INHERIT_FDS);
|
|
|
- compress_proc.wait_check();
|
|
|
+ xz_proc.wait_check();
|
|
|
}
|
|
|
catch(Error e) {
|
|
|
printerr(@"Saving the image failed: $(e.message)\n");
|