diff --git a/cmd/tools/modules/testing/common.v b/cmd/tools/modules/testing/common.v index cd20ba80a1..6eddb5b140 100644 --- a/cmd/tools/modules/testing/common.v +++ b/cmd/tools/modules/testing/common.v @@ -1,6 +1,7 @@ module testing import os +import time import term import benchmark import sync @@ -59,6 +60,13 @@ pub fn (mut ts TestSession) init() { } pub fn (mut ts TestSession) test() { + // Ensure that .tmp.c files generated from compiling _test.v files, + // are easy to delete at the end, *without* affecting the existing ones. + now := time.sys_mono_now() + new_vtmp_dir := os.join_path(os.temp_dir(), 'v', 'test_session_$now') + os.mkdir_all(new_vtmp_dir) + os.setenv('VTMP', new_vtmp_dir, true) + // ts.init() mut remaining_files := []string{} for dot_relative_file in ts.files { @@ -99,6 +107,10 @@ pub fn (mut ts TestSession) test() { pool_of_test_runners.work_on_pointers(remaining_files.pointers()) ts.benchmark.stop() eprintln(term.h_divider('-')) + // cleanup generated .tmp.c files after successfull tests: + if ts.benchmark.nfail == 0 { + os.rmdir_all(new_vtmp_dir) + } } pub fn (mut m TestMessageHandler) display_message() { diff --git a/vlib/os/os.v b/vlib/os/os.v index 41651bf32f..ea31a71831 100644 --- a/vlib/os/os.v +++ b/vlib/os/os.v @@ -1225,12 +1225,14 @@ pub fn flush() { pub fn mkdir_all(path string) { mut p := if path.starts_with(os.path_separator) { os.path_separator } else { '' } - for subdir in path.split(os.path_separator) { + path_parts := path.trim_left(os.path_separator).split(os.path_separator) + for subdir in path_parts { p += subdir + os.path_separator - if !os.is_dir(p) { - os.mkdir(p) or { - panic(err) - } + if os.exists(p) && os.is_dir(p) { + continue + } + os.mkdir(p) or { + panic('folder: $p, error: $err') } } } diff --git a/vlib/v/builder/compile.v b/vlib/v/builder/compile.v index 863a1473ae..dac716be64 100644 --- a/vlib/v/builder/compile.v +++ b/vlib/v/builder/compile.v @@ -8,12 +8,15 @@ import os import v.pref fn get_vtmp_folder() string { - vtmp := os.join_path(os.temp_dir(), 'v') - if !os.is_dir(vtmp) { - os.mkdir(vtmp) or { - verror(err) - } + mut vtmp := os.getenv('VTMP') + if vtmp.len > 0 { + return vtmp } + vtmp = os.join_path(os.temp_dir(), 'v') + if !os.exists(vtmp) || !os.is_dir(vtmp) { + os.mkdir_all(vtmp) + } + os.setenv('VTMP', vtmp, true) return vtmp }