aboutsummaryrefslogtreecommitdiff
path: root/bpkg
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2018-03-09 14:02:32 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2018-03-09 14:58:10 +0300
commit61adcbd5ca83762c02cfa421e09fbd65c52b6da9 (patch)
tree4eaf5089ad37104a53ca74464c26b597ed2414bc /bpkg
parent538711543c68be94b3e7e3192394bc2f19f49516 (diff)
Fix up package manifest version for pkg-unpack
Diffstat (limited to 'bpkg')
-rw-r--r--bpkg/manifest-utility.cxx95
-rw-r--r--bpkg/manifest-utility.hxx15
-rw-r--r--bpkg/pkg-build.cxx3
-rw-r--r--bpkg/pkg-unpack.cxx12
-rw-r--r--bpkg/pkg-unpack.hxx3
-rw-r--r--bpkg/rep-fetch.cxx101
6 files changed, 129 insertions, 100 deletions
diff --git a/bpkg/manifest-utility.cxx b/bpkg/manifest-utility.cxx
index 50ee4e8..b35af4a 100644
--- a/bpkg/manifest-utility.cxx
+++ b/bpkg/manifest-utility.cxx
@@ -6,8 +6,11 @@
#include <libbutl/url.mxx>
#include <libbutl/sha256.mxx>
+#include <libbutl/process.mxx>
+#include <libbutl/process-io.mxx> // operator<<(ostream, process_path)
#include <bpkg/diagnostics.hxx>
+#include <bpkg/common-options.hxx>
using namespace std;
using namespace butl;
@@ -180,4 +183,96 @@ namespace bpkg
return false;
}
}
+
+ optional<version>
+ package_version (const common_options& o, const dir_path& d)
+ {
+ const char* b (name_b (o));
+
+ try
+ {
+ process_path pp (process::path_search (b, exec_dir));
+
+ fdpipe pipe (open_pipe ());
+
+ process pr (
+ process_start_callback (
+ [] (const char* const args[], size_t n)
+ {
+ if (verb >= 2)
+ print_process (args, n);
+ },
+ 0 /* stdin */, pipe /* stdout */, 2 /* stderr */,
+ pp,
+
+ verb < 2
+ ? strings ({"-q"})
+ : verb == 2
+ ? strings ({"-v"})
+ : strings ({"--verbose", to_string (verb)}),
+
+ o.build_option (),
+ "info:",
+ d.representation ()));
+
+ // Shouldn't throw, unless something is severely damaged.
+ //
+ pipe.out.close ();
+
+ try
+ {
+ optional<version> r;
+
+ ifdstream is (move (pipe.in),
+ fdstream_mode::skip,
+ ifdstream::badbit);
+
+ for (string l; !eof (getline (is, l)); )
+ {
+ if (l.compare (0, 9, "version: ") == 0)
+ try
+ {
+ string v (l, 9);
+
+ // An empty version indicates that the version module is not
+ // enabled for the project.
+ //
+ if (!v.empty ())
+ r = version (v);
+
+ break;
+ }
+ catch (const invalid_argument&)
+ {
+ fail << "no package version in '" << l << "'" <<
+ info << "produced by '" << pp << "'; use --build to override";
+ }
+ }
+
+ is.close ();
+
+ if (pr.wait ())
+ return r;
+
+ // Fall through.
+ }
+ catch (const io_error&)
+ {
+ if (pr.wait ())
+ fail << "unable to read '" << b << "' output";
+
+ // Fall through.
+ }
+
+ // We should only get here if the child exited with an error status.
+ //
+ assert (!pr.wait ());
+
+ fail << "unable to obtain version using '" << b << "'" << endf;
+ }
+ catch (const process_error& e)
+ {
+ fail << "unable to execute '" << b << "': " << e << endf;
+ }
+ }
}
diff --git a/bpkg/manifest-utility.hxx b/bpkg/manifest-utility.hxx
index f608858..ee73c4a 100644
--- a/bpkg/manifest-utility.hxx
+++ b/bpkg/manifest-utility.hxx
@@ -74,6 +74,21 @@ namespace bpkg
//
bool
repository_name (const string&);
+
+ // Return the version of a package as provided by the build2 version module.
+ // Return nullopt if the version module is disabled for the package (or the
+ // build2 project directory doesn't contain the manifest file). Fail if the
+ // directory is not a build2 project.
+ //
+ // Note that if the package directory is under the version control, then the
+ // resulting version may be populated with the snapshot information (see
+ // libbutl/standard-version.mxx for more details). Thus, this function can
+ // be used for fixing up the package manifest version.
+ //
+ class common_options;
+
+ optional<version>
+ package_version (const common_options&, const dir_path&);
}
#endif // BPKG_MANIFEST_UTILITY_HXX
diff --git a/bpkg/pkg-build.cxx b/bpkg/pkg-build.cxx
index 5395d8d..cc14f1e 100644
--- a/bpkg/pkg-build.cxx
+++ b/bpkg/pkg-build.cxx
@@ -2099,7 +2099,8 @@ namespace bpkg
assert (pl.repository.object_id () == ""); // Special root.
transaction t (db.begin ());
- sp = pkg_unpack (c,
+ sp = pkg_unpack (o,
+ c,
t,
path_cast<dir_path> (pl.location),
true, // Replace.
diff --git a/bpkg/pkg-unpack.cxx b/bpkg/pkg-unpack.cxx
index 9bd3e03..7472194 100644
--- a/bpkg/pkg-unpack.cxx
+++ b/bpkg/pkg-unpack.cxx
@@ -127,7 +127,8 @@ namespace bpkg
}
shared_ptr<selected_package>
- pkg_unpack (const dir_path& c,
+ pkg_unpack (const common_options& o,
+ const dir_path& c,
transaction& t,
const dir_path& d,
bool replace,
@@ -147,6 +148,13 @@ namespace bpkg
//
pkg_unpack_check (c, t, m.name, replace);
+ // Fix-up the package version.
+ //
+ optional<version> v (package_version (o, d));
+
+ if (v)
+ m.version = move (*v);
+
// Use the special root repository as the repository of this
// package.
//
@@ -411,7 +419,7 @@ namespace bpkg
info << "run 'bpkg help pkg-unpack' for more information";
p = pkg_unpack (
- c, t, dir_path (args.next ()), o.replace (), o.purge ());
+ o, c, t, dir_path (args.next ()), o.replace (), o.purge ());
}
else
{
diff --git a/bpkg/pkg-unpack.hxx b/bpkg/pkg-unpack.hxx
index 9fdc848..a04d197 100644
--- a/bpkg/pkg-unpack.hxx
+++ b/bpkg/pkg-unpack.hxx
@@ -21,7 +21,8 @@ namespace bpkg
// Unpack the package as a source directory and commit the transaction.
//
shared_ptr<selected_package>
- pkg_unpack (const dir_path& configuration,
+ pkg_unpack (const common_options&,
+ const dir_path& configuration,
transaction&,
const dir_path&,
bool replace,
diff --git a/bpkg/rep-fetch.cxx b/bpkg/rep-fetch.cxx
index 2e884c4..8f1528c 100644
--- a/bpkg/rep-fetch.cxx
+++ b/bpkg/rep-fetch.cxx
@@ -6,8 +6,6 @@
#include <set>
-#include <libbutl/process.mxx>
-#include <libbutl/process-io.mxx> // operator<<(ostream, process_path)
#include <libbutl/manifest-parser.mxx>
#include <bpkg/auth.hxx>
@@ -231,103 +229,14 @@ namespace bpkg
package_info (dr);
}
- // Fix-up the package version. Note that the package may have the
- // version module enable and the directory repository may well be a git
- // repository.
+ // Fix-up the package version.
//
- const char* b (name_b (co));
+ optional<version> v (package_version (co, d));
- try
- {
- process_path pp (process::path_search (b, exec_dir));
-
- fdpipe pipe (open_pipe ());
-
- process pr (
- process_start_callback (
- [] (const char* const args[], size_t n)
- {
- if (verb >= 2)
- print_process (args, n);
- },
- 0 /* stdin */, pipe /* stdout */, 2 /* stderr */,
- pp,
-
- verb < 2
- ? strings ({"-q"})
- : verb == 2
- ? strings ({"-v"})
- : strings ({"--verbose", to_string (verb)}),
-
- co.build_option (),
- "info:",
- d.representation ()));
-
- // Shouldn't throw, unless something is severely damaged.
- //
- pipe.out.close ();
-
- try
- {
- ifdstream is (move (pipe.in),
- fdstream_mode::skip,
- ifdstream::badbit);
-
- for (string l; !eof (getline (is, l)); )
- {
- if (l.compare (0, 9, "version: ") == 0)
- try
- {
- string v (l, 9);
-
- // An empty version indicates that the version module is not
- // enabled for the project, and so we don't amend the package
- // version.
- //
- if (!v.empty ())
- sm.version = version (v);
-
- break;
- }
- catch (const invalid_argument&)
- {
- fail << "no package version in '" << l << "'" <<
- info << "produced by '" << pp << "'; use --build to override";
- }
- }
-
- is.close ();
-
- // If succeess then save the package manifest together with the
- // repository state it belongs to and go to the next package.
- //
- if (pr.wait ())
- {
- fps.emplace_back (rep_fetch_data::package {move (sm),
- repo_fragment});
- continue;
- }
-
- // Fall through.
- }
- catch (const io_error&)
- {
- if (pr.wait ())
- failure ("unable to read information");
-
- // Fall through.
- }
-
- // We should only get here if the child exited with an error status.
- //
- assert (!pr.wait ());
+ if (v)
+ sm.version = move (*v);
- failure ("unable to obtain information");
- }
- catch (const process_error& e)
- {
- fail << "unable to execute " << b << ": " << e;
- }
+ fps.emplace_back (rep_fetch_data::package {move (sm), repo_fragment});
}
return fps;