diff options
-rw-r--r-- | bdep/project.cxx | 11 | ||||
-rw-r--r-- | bdep/project.hxx | 9 | ||||
-rw-r--r-- | bdep/publish.cli | 8 | ||||
-rw-r--r-- | bdep/publish.cxx | 95 | ||||
-rw-r--r-- | bdep/sync.cxx | 23 | ||||
-rw-r--r-- | bdep/sync.hxx | 10 |
6 files changed, 127 insertions, 29 deletions
diff --git a/bdep/project.cxx b/bdep/project.cxx index 7f80c9f..d8cfc8a 100644 --- a/bdep/project.cxx +++ b/bdep/project.cxx @@ -5,7 +5,6 @@ #include <bdep/project.hxx> #include <bdep/project-odb.hxx> -#include <libbutl/b.mxx> #include <libbutl/manifest-parser.mxx> #include <libbpkg/manifest.hxx> @@ -406,10 +405,8 @@ namespace bdep } } - // Obtain build2 project info for package source or output directories. - // - static b_project_info - package_info (const common_options& o, const dir_path& d) + package_info + package_b_info (const common_options& o, const dir_path& d) { try { @@ -437,7 +434,7 @@ namespace bdep standard_version package_version (const common_options& o, const dir_path& d) { - b_project_info pi (package_info (o, d)); + package_info pi (package_b_info (o, d)); if (pi.version.empty ()) fail << "empty version for package directory " << d; @@ -456,7 +453,7 @@ namespace bdep // Note: the package directory inside the configuration is a bit of an // assumption. // - b_project_info pi (package_info (o, (dir_path (cfg) /= p.string ()))); + package_info pi (package_b_info (o, (dir_path (cfg) /= p.string ()))); if (pi.version.empty ()) fail << "empty version for package " << p; diff --git a/bdep/project.hxx b/bdep/project.hxx index 9f628f5..83cefc9 100644 --- a/bdep/project.hxx +++ b/bdep/project.hxx @@ -7,6 +7,8 @@ #include <odb/core.hxx> +#include <libbutl/b.mxx> + #include <libbpkg/package-name.hxx> #include <bdep/types.hxx> @@ -266,6 +268,13 @@ namespace bdep package_version (const common_options&, const dir_path& cfg, const package_name&); + + // Obtain build2 project info for package source or output directory. + // + using package_info = butl::b_project_info; + + package_info + package_b_info (const common_options&, const dir_path&); } #endif // BDEP_PROJECT_HXX diff --git a/bdep/publish.cli b/bdep/publish.cli index cba7436..1d3771c 100644 --- a/bdep/publish.cli +++ b/bdep/publish.cli @@ -24,7 +24,7 @@ namespace bdep \c{<pkg-spec> = (\b{--directory}|\b{-d} <pkg-dir>)... | <prj-spec>\n <prj-spec> = \b{--directory}|\b{-d} <prj-dir>\n - <cfg-spec> = \b{@}<cfg-name> | \b{--config}|\b{-c} <cfg-dir>} + <cfg-spec> = \b{@}<cfg-name> | \b{--config}|\b{-c} <cfg-dir> | \b{--forward}} \h|DESCRIPTION| @@ -143,6 +143,12 @@ namespace bdep other recognized outcomes refer to the submission service documentation." } + + bool --forward + { + "Use the forwarded configuration for each package instead of the + default configuration." + } }; "\h|ENVIRONMENT| diff --git a/bdep/publish.cxx b/bdep/publish.cxx index ab58025..0e13b86 100644 --- a/bdep/publish.cxx +++ b/bdep/publish.cxx @@ -49,6 +49,8 @@ namespace bdep info << "use --control to specify explicitly" << endf; } + // If cfg is empty, then use each package's (forwarded) source directory. + // static int cmd_publish (const cmd_publish_options& o, const dir_path& prj, @@ -109,11 +111,12 @@ namespace bdep struct package { package_name name; + dir_path path; standard_version version; package_name project; string section; // alpha|beta|stable (or --section) - path archive; + bdep::path archive; string checksum; package_manifest manifest; @@ -146,7 +149,9 @@ namespace bdep package_name n (move (pl.name)); package_name p (pl.project ? move (*pl.project) : n); - standard_version v (package_version (o, cfg, n)); + standard_version v (cfg.empty () + ? package_version (o, prj / pl.path) + : package_version (o, cfg, n)); // Should we allow publishing snapshots and, if so, to which section? // For example, is it correct to consider a "between betas" snapshot a @@ -185,6 +190,7 @@ namespace bdep v.beta () ? "beta" : "stable"); pkgs.push_back (package {move (n), + move (pl.path), move (v), move (p), move (s), @@ -249,10 +255,13 @@ namespace bdep // build2's version module by default does not allow distribution of // uncommitted projects. // + dir_path d (cfg.empty () + ? prj / p.path + : dir_path (cfg) /= p.name.string ()); run_b ( o, "dist:", - "'" + (dir_path (cfg) /= p.name.string ()).representation () + "'", + "'" + d.representation () + "'", "config.dist.root='" + dr.representation () + "'", "config.dist.archives=tar.gz", "config.dist.checksums=sha256", @@ -793,6 +802,15 @@ namespace bdep { tracer trace ("publish"); + if (o.forward ()) + { + if (const char* n = (o.config_name_specified () ? "@<cfg-name>" : + o.config_id_specified () ? "--config-id" : + o.config_specified () ? "--config|-c" : + o.all () ? "--all|-a" : nullptr)) + fail << n << " specified together with --forward"; + } + // If we are publishing the entire project, then we have two choices: we // can publish all the packages in the project or we can only do so for // packages that were initialized in the configuration that we are going @@ -808,33 +826,68 @@ namespace bdep const dir_path& prj (pp.project); - // We need a single configuration to prepare package distribution. + // Unless we are using the forwarded configurations, we need a single + // configuration to prepare package distributions. // - shared_ptr<configuration> cfg; + dir_path cfg_dir; + + if (o.forward ()) { - // Don't keep the database open longer than necessary. + // Note: in this case we don't even open the database. // - database db (open (prj, trace)); + dir_paths cfgs; + + for (const package_location& pl: pp.packages) + { + dir_path d (prj / pl.path); - transaction t (db.begin ()); - configurations cfgs (find_configurations (o, prj, t)); - t.commit (); + package_info pi (package_b_info (o, d)); - if (cfgs.size () > 1) - fail << "multiple configurations specified for publish"; + if (pi.src_root == pi.out_root) + fail << "package " << pl.name << " source directory is not forwarded" << + info << "package source directory is " << d; - // Verify packages are present in the configuration. - // - verify_project_packages (pp, cfgs); + // Get the configuration root. + // + (pi.out_root /= pi.amalgamation).normalize (); - cfg = move (cfgs[0]); + if (find (cfgs.begin (), cfgs.end (), pi.out_root) == cfgs.end ()) + cfgs.push_back (move (pi.out_root)); + } + + // Pre-sync the configurations to avoid triggering the build system hook + // (see sync for details). + // + for (const dir_path& cfg: cfgs) + cmd_sync_implicit (o, cfg); } + else + { + shared_ptr<configuration> cfg; + { + // Don't keep the database open longer than necessary. + // + database db (open (prj, trace)); - // Pre-sync the configuration to avoid triggering the build system hook - // (see sync for details). - // - cmd_sync (o, prj, cfg, strings () /* pkg_args */, true /* implicit */); + transaction t (db.begin ()); + configurations cfgs (find_configurations (o, prj, t)); + t.commit (); + + if (cfgs.size () > 1) + fail << "multiple configurations specified for publish"; + + // Verify packages are present in the configuration. + // + verify_project_packages (pp, cfgs); + + cfg = move (cfgs[0]); + } + + cmd_sync (o, prj, cfg, strings () /* pkg_args */, true /* implicit */); + + cfg_dir = cfg->path; + } - return cmd_publish (o, prj, cfg->path, move (pp.packages)); + return cmd_publish (o, prj, cfg_dir, move (pp.packages)); } } diff --git a/bdep/sync.cxx b/bdep/sync.cxx index 3c51882..1ed3c12 100644 --- a/bdep/sync.cxx +++ b/bdep/sync.cxx @@ -604,6 +604,29 @@ namespace bdep strings () /* dep_pkgs */); } + void + cmd_sync_implicit (const common_options& co, + const dir_path& cfg, + bool fetch, + bool yes, + bool name_cfg) + { + if (!synced (cfg, true /* implicit */)) + cmd_sync (co, + cfg, + dir_path (), + nullptr, + strings (), + true /* implicit */, + fetch, + yes, + name_cfg, + nullopt /* upgrade */, + nullopt /* recursive */, + package_locations () /* prj_pkgs */, + strings () /* dep_pkgs */); + } + int cmd_sync (cmd_sync_options&& o, cli::group_scanner& args) { diff --git a/bdep/sync.hxx b/bdep/sync.hxx index 5711a3f..a74b228 100644 --- a/bdep/sync.hxx +++ b/bdep/sync.hxx @@ -31,6 +31,16 @@ namespace bdep bool yes = true, bool name_cfg = false); + // As above but perform an implicit sync without a configuration object + // (i.e., as if from the hook). + // + void + cmd_sync_implicit (const common_options&, + const dir_path& cfg, + bool fetch = true, + bool yes = true, + bool name_cfg = true); + int cmd_sync (cmd_sync_options&&, cli::group_scanner& args); |