aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build2/version/utility.cxx78
-rw-r--r--build2/version/utility.hxx25
2 files changed, 103 insertions, 0 deletions
diff --git a/build2/version/utility.cxx b/build2/version/utility.cxx
new file mode 100644
index 0000000..8211e85
--- /dev/null
+++ b/build2/version/utility.cxx
@@ -0,0 +1,78 @@
+// file : build2/version/utility.cxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#include <build2/version/utility.hxx>
+
+#include <libbutl/manifest-parser.mxx>
+#include <libbutl/manifest-serializer.mxx>
+
+#include <build2/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));
+
+ 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 ();
+
+ return r;
+ }
+ 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;
+ }
+ }
+ }
+}
diff --git a/build2/version/utility.hxx b/build2/version/utility.hxx
new file mode 100644
index 0000000..c373f6c
--- /dev/null
+++ b/build2/version/utility.hxx
@@ -0,0 +1,25 @@
+// file : build2/version/utility.hxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef BUILD2_VERSION_UTILITY_HXX
+#define BUILD2_VERSION_UTILITY_HXX
+
+#include <build2/types.hxx>
+#include <build2/utility.hxx>
+
+#include <build2/filesystem.hxx>
+
+namespace build2
+{
+ namespace version
+ {
+ // Re-serialize the manifest fixing up the version. Note that this will
+ // not preserve comments. Probably acceptable for snapshots.
+ //
+ auto_rmfile
+ fixup_manifest (const path& in, path out, const standard_version&);
+ }
+}
+
+#endif // BUILD2_VERSION_UTILITY_HXX