From 4243d26ab9245b64f141c3733726f931c32eccdc Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 10 Dec 2015 08:15:20 +0200 Subject: Add support for passing several packages to pkg-{update,clean} commands --- bpkg/pkg-command.cxx | 77 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 61 insertions(+), 16 deletions(-) (limited to 'bpkg/pkg-command.cxx') diff --git a/bpkg/pkg-command.cxx b/bpkg/pkg-command.cxx index 281b326..c52038c 100644 --- a/bpkg/pkg-command.cxx +++ b/bpkg/pkg-command.cxx @@ -24,11 +24,11 @@ namespace bpkg { tracer trace ("pkg_command"); + level4 ([&]{trace << "command: " << cmd;}); + assert (p->state == package_state::configured); assert (p->out_root); // Should be present since configured. - level4 ([&]{trace << "command: " << cmd;}); - dir_path out_root (c / *p->out_root); // Always relative. level4 ([&]{trace << "out_root: " << out_root;}); @@ -40,6 +40,41 @@ namespace bpkg run_b (o, bspec); } + void + pkg_command (const string& cmd, + const dir_path& c, + const common_options& o, + const vector>& ps) + { + tracer trace ("pkg_command"); + + level4 ([&]{trace << "command: " << cmd;}); + + // Form the buildspec. + // + string bspec (cmd + "("); + + for (const shared_ptr& p: ps) + { + assert (p->state == package_state::configured); + assert (p->out_root); // Should be present since configured. + + dir_path out_root (c / *p->out_root); // Always relative. + level4 ([&]{trace << p->name << " out_root: " << out_root;}); + + if (bspec.back () != '(') + bspec += ' '; + bspec += out_root.string (); + bspec += '/'; + } + + bspec += ')'; + + level4 ([&]{trace << "buildspec: " << bspec;}); + + run_b (o, bspec); + } + int pkg_command (const string& cmd, const configuration_options& o, @@ -54,28 +89,38 @@ namespace bpkg fail << "package name argument expected" << info << "run 'bpkg help pkg-" << cmd << "' for more information"; - string n (args.next ()); + vector> ps; + { + database db (open (c, trace)); + transaction t (db.begin ()); - database db (open (c, trace)); + while (args.more ()) + { + string n (args.next ()); + shared_ptr p (db.find (n)); - transaction t (db.begin ()); - shared_ptr p (db.find (n)); - t.commit (); + if (p == nullptr) + fail << "package " << n << " does not exist in configuration " << c; - if (p == nullptr) - fail << "package " << n << " does not exist in configuration " << c; + if (p->state != package_state::configured) + fail << "package " << n << " is " << p->state << + info << "expected it to be configured"; - if (p->state != package_state::configured) - fail << "package " << n << " is " << p->state << - info << "expected it to be configured"; + level4 ([&]{trace << p->name << " " << p->version;}); + ps.push_back (move (p)); + } - level4 ([&]{trace << p->name << " " << p->version;}); + t.commit (); + } - pkg_command (cmd, c, o, p); + pkg_command (cmd, c, o, ps); if (verb) - text << cmd << (cmd.back () != 'e' ? "ed " : "d ") - << p->name << " " << p->version; + { + for (const shared_ptr& p: ps) + text << cmd << (cmd.back () != 'e' ? "ed " : "d ") + << p->name << " " << p->version; + } return 0; } -- cgit v1.1