aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build2/test/script/parser.cxx3
-rw-r--r--build2/test/script/runner.cxx14
-rw-r--r--build2/test/script/script6
-rw-r--r--build2/test/script/script.cxx21
4 files changed, 28 insertions, 16 deletions
diff --git a/build2/test/script/parser.cxx b/build2/test/script/parser.cxx
index e3194cb..4c7b17b 100644
--- a/build2/test/script/parser.cxx
+++ b/build2/test/script/parser.cxx
@@ -912,7 +912,8 @@ namespace build2
case pending::clean:
{
- c.cleanups.push_back (parse_path (move (w), "cleanup path"));
+ c.cleanups.push_back (
+ {cleanup_type::always, parse_path (move (w), "cleanup path")});
break;
}
}
diff --git a/build2/test/script/runner.cxx b/build2/test/script/runner.cxx
index f42299e..ee7b5df 100644
--- a/build2/test/script/runner.cxx
+++ b/build2/test/script/runner.cxx
@@ -86,7 +86,7 @@ namespace build2
try
{
ofdstream os (orp);
- sp.clean (orp);
+ sp.clean ({cleanup_type::always, orp}, true);
os << (rd.type == redirect_type::here_string
? rd.str
@@ -190,7 +190,7 @@ namespace build2
//
assert (empty (sp.wd_path));
- sp.clean (sp.wd_path);
+ sp.clean ({cleanup_type::always, sp.wd_path}, true);
}
void concurrent_runner::
@@ -213,8 +213,10 @@ namespace build2
<< " is out of working directory " << sp.wd_path;
};
- for (const auto& p: reverse_iterate (sp.cleanups))
+ for (const auto& c: reverse_iterate (sp.cleanups))
{
+ const path& p (c.path);
+
// Remove directory if exists and empty. Fail otherwise.
//
if (p.to_directory ())
@@ -401,7 +403,7 @@ namespace build2
}
open_stdin ();
- sp.clean (stdin);
+ sp.clean ({cleanup_type::always, stdin}, true);
break;
}
@@ -473,7 +475,7 @@ namespace build2
fail (cl) << "unable to write " << p << ": " << e.what ();
}
- sp.clean (p);
+ sp.clean ({cleanup_type::always, p}, true);
return os.fd ();
};
@@ -506,7 +508,7 @@ namespace build2
// Register command-created paths for cleanup.
//
for (const auto& p: c.cleanups)
- sp.clean (normalize (p));
+ sp.clean ({p.type, normalize (p.path)}, false);
// If there is no correct exit status by whatever reason then dump
// stderr (if cached), print the proper diagnostics and fail.
diff --git a/build2/test/script/script b/build2/test/script/script
index ab54ad0..0b3a05e 100644
--- a/build2/test/script/script
+++ b/build2/test/script/script
@@ -151,7 +151,7 @@ namespace build2
redirect out;
redirect err;
- build2::cleanups cleanups;
+ script::cleanups cleanups;
command_exit exit {exit_comparison::eq, 0};
};
@@ -200,7 +200,7 @@ namespace build2
optional<description> desc;
- build2::cleanups cleanups;
+ test::script::cleanups cleanups;
// Variables.
//
@@ -236,7 +236,7 @@ namespace build2
// cleanup type if this path is already registered.
//
void
- clean (cleanup p, bool implicit);
+ clean (cleanup, bool implicit);
public:
virtual
diff --git a/build2/test/script/script.cxx b/build2/test/script/script.cxx
index 058720a..77b8902 100644
--- a/build2/test/script/script.cxx
+++ b/build2/test/script/script.cxx
@@ -126,7 +126,11 @@ namespace build2
for (const auto& p: c.cleanups)
{
o << " &";
- print_path (p);
+
+ if (p.type != cleanup_type::always)
+ o << (p.type == cleanup_type::maybe ? '?' : '!');
+
+ print_path (p.path);
}
if (c.exit.comparison != exit_comparison::eq || c.exit.status != 0)
@@ -288,15 +292,20 @@ namespace build2
const_cast<dir_path&> (wd_path) = dir_path (p->wd_path) /= id;
}
- // command
- //
void scope::
- clean (path p)
+ clean (cleanup c, bool implicit)
{
using std::find; // Hidden by scope::find().
- if (find (cleanups.begin (), cleanups.end (), p) == cleanups.end ())
- cleanups.emplace_back (move (p));
+ assert (!implicit || c.type == cleanup_type::always);
+
+ auto pr = [&c] (const cleanup& v) -> bool {return v.path == c.path;};
+ auto i (find_if (cleanups.begin (), cleanups.end (), pr));
+
+ if (i == cleanups.end ())
+ cleanups.emplace_back (move (c));
+ else if (!implicit)
+ i->type = c.type;
}
// script_base