aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/version/utility.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'libbuild2/version/utility.cxx')
-rw-r--r--libbuild2/version/utility.cxx81
1 files changed, 81 insertions, 0 deletions
diff --git a/libbuild2/version/utility.cxx b/libbuild2/version/utility.cxx
new file mode 100644
index 0000000..c93a251
--- /dev/null
+++ b/libbuild2/version/utility.cxx
@@ -0,0 +1,81 @@
+// file : libbuild2/version/utility.cxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#include <libbuild2/version/utility.hxx>
+
+#include <libbutl/manifest-parser.mxx>
+#include <libbutl/manifest-serializer.mxx>
+
+#include <libbuild2/diagnostics.hxx>
+
+using namespace butl;
+
+namespace build2
+{
+ namespace version
+ {
+ auto_rmfile
+ fixup_manifest (const path& in, path out, const standard_version& v)
+ {
+ auto_rmfile r (move (out), !dry_run /* active */);
+
+ if (!dry_run)
+ {
+ try
+ {
+ permissions perm (path_permissions (in));
+
+ ifdstream ifs (in);
+ manifest_parser p (ifs, in.string ());
+
+ auto_fd ofd (fdopen (r.path,
+ fdopen_mode::out |
+ fdopen_mode::create |
+ fdopen_mode::exclusive |
+ fdopen_mode::binary,
+ perm));
+
+ 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);
+
+ for (nv = p.next (); !nv.empty (); nv = p.next ())
+ {
+ if (nv.name == "version")
+ nv.value = v.string ();
+
+ s.next (nv.name, nv.value);
+ }
+
+ 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;
+ }
+ }
+}