diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2019-04-09 09:00:29 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2019-04-09 09:00:29 +0200 |
commit | 79a760af92146a63e337c4399ec57134f56d8886 (patch) | |
tree | 1f576594fcfc987a6874533815cc6a20c60cd78d /build2/version | |
parent | d2951ce7344dade96f78286cc311ed86c46d086e (diff) |
Add dry-run support to install/uninstall rules
Diffstat (limited to 'build2/version')
-rw-r--r-- | build2/version/utility.cxx | 91 |
1 files changed, 47 insertions, 44 deletions
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; } } } |