| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- include_guard "temp_dir"
- template temp_dir {
- objref_arg(_arg0) log;
- alias(@_arg1) temp_base_dir;
- alias(@_arg2) mktemp;
- alias(@_arg3) rm;
- # Create a temporary directory.
- var("") created_dir;
- Do {
- # Build the path template.
- value(@concat(temp_base_dir, "/build-")) temp_prefix;
- concat(temp_prefix, "XXXXXXXXXXXXXXXX") temp_template;
-
- # Call mktemp.
- call(@run_process_output, {{mktemp, "-d", temp_template}}) mktemp_res;
-
- # Check mktemp success.
- If (@not(mktemp_res.succeeded)) {
- log->call(@error, "mktemp failed");
- _do->break();
- };
-
- # Remove a trailing newline from the output.
- objref(^mktemp_res.output) output;
- If (@num_equal(output.length, "0")) {
- log->call(@error, "mktemp result is empty");
- _do->break();
- };
- var(@num_subtract(output.length, "1")) len_minus_one;
- output->substr(len_minus_one) last_char;
- If (@val_different(last_char, "\n")) {
- log->call(@error, "last char of mktemp result is not a newline");
- _do->break();
- };
- output->substr("0", len_minus_one) without_newline;
- output->reset(without_newline);
-
- # Check created dir prefix.
- output->substr("0", temp_prefix.length) created_prefix;
- If (@val_different(created_prefix, temp_prefix)) {
- log->call(@error, "mktemp result prefix incorrect");
- _do->break();
- };
-
- # Remember it.
- created_dir->set(output);
- } Interrupt {
- # Do not interrupt the directory creation, or we might
- # end up with creating but not removing a directory.
- if(@false);
- } dir_creation;
-
- # Expose success status.
- var(dir_creation.succeeded) succeeded;
-
- # Arrange for removing the temp dir.
- If (succeeded) {
- run({}, {rm, "-rf", created_dir});
- };
- }
|