From 79a760af92146a63e337c4399ec57134f56d8886 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 9 Apr 2019 09:00:29 +0200 Subject: Add dry-run support to install/uninstall rules --- build2/version/utility.cxx | 91 ++++++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 44 deletions(-) (limited to 'build2/version') diff --git a/build2/version/utility.cxx b/build2/version/utility.cxx index 4222fff..6c4d43e 100644 --- a/build2/version/utility.cxx +++ b/build2/version/utility.cxx @@ -18,61 +18,64 @@ namespace build2 auto_rmfile fixup_manifest (const path& in, path out, const standard_version& v) { - auto_rmfile r (move (out)); + auto_rmfile r (move (out), !dry_run /* active */); - try + if (!dry_run) { - permissions perm (path_permissions (in)); - - ifdstream ifs (in); - manifest_parser p (ifs, in.string ()); + try + { + permissions perm (path_permissions (in)); - auto_fd ofd (fdopen (r.path, - fdopen_mode::out | - fdopen_mode::create | - fdopen_mode::exclusive | - fdopen_mode::binary, - perm)); + ifdstream ifs (in); + manifest_parser p (ifs, in.string ()); - ofdstream ofs (move (ofd)); - manifest_serializer s (ofs, r.path.string ()); + auto_fd ofd (fdopen (r.path, + fdopen_mode::out | + fdopen_mode::create | + fdopen_mode::exclusive | + fdopen_mode::binary, + perm)); - manifest_name_value nv (p.next ()); - assert (nv.name.empty () && nv.value == "1"); // We just loaded it. - s.next (nv.name, nv.value); - - for (nv = p.next (); !nv.empty (); nv = p.next ()) - { - if (nv.name == "version") - nv.value = v.string (); + ofdstream ofs (move (ofd)); + manifest_serializer s (ofs, r.path.string ()); + manifest_name_value nv (p.next ()); + assert (nv.name.empty () && nv.value == "1"); // We just loaded it. s.next (nv.name, nv.value); - } - s.next (nv.name, nv.value); // End of manifest. - s.next (nv.name, nv.value); // End of stream. + for (nv = p.next (); !nv.empty (); nv = p.next ()) + { + if (nv.name == "version") + nv.value = v.string (); - ofs.close (); - ifs.close (); + s.next (nv.name, nv.value); + } - return r; - } - catch (const manifest_parsing& e) - { - location l (&in, e.line, e.column); - fail (l) << e.description << endf; - } - catch (const manifest_serialization& e) - { - location l (&r.path); - fail (l) << e.description << endf; - } - catch (const io_error& e) - { - fail << "io error: " << e << - info << "while reading " << in << - info << "while writing " << r.path << endf; + s.next (nv.name, nv.value); // End of manifest. + s.next (nv.name, nv.value); // End of stream. + + ofs.close (); + ifs.close (); + } + catch (const manifest_parsing& e) + { + location l (&in, e.line, e.column); + fail (l) << e.description; + } + catch (const manifest_serialization& e) + { + location l (&r.path); + fail (l) << e.description; + } + catch (const io_error& e) + { + fail << "io error: " << e << + info << "while reading " << in << + info << "while writing " << r.path; + } } + + return r; } } } -- cgit v1.1