From cae11509203061e894e6310c35ea50ae818af3a7 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 18 Sep 2015 06:59:28 +0200 Subject: Implement pkg-update command --- bpkg/bpkg-options.cli | 7 +++++ bpkg/bpkg.cxx | 2 ++ bpkg/buildfile | 2 ++ bpkg/cfg-create.cxx | 2 +- bpkg/pkg-configure.cxx | 2 +- bpkg/pkg-disfigure.cxx | 2 +- bpkg/pkg-update | 17 ++++++++++++ bpkg/pkg-update-options.cli | 33 +++++++++++++++++++++++ bpkg/pkg-update.cxx | 64 +++++++++++++++++++++++++++++++++++++++++++++ bpkg/test.sh | 29 ++++++++++++++++++++ bpkg/utility | 7 +++-- bpkg/utility.cxx | 6 ++--- 12 files changed, 165 insertions(+), 8 deletions(-) create mode 100644 bpkg/pkg-update create mode 100644 bpkg/pkg-update-options.cli create mode 100644 bpkg/pkg-update.cxx (limited to 'bpkg') diff --git a/bpkg/bpkg-options.cli b/bpkg/bpkg-options.cli index e694c3b..9e2e6b2 100644 --- a/bpkg/bpkg-options.cli +++ b/bpkg/bpkg-options.cli @@ -70,6 +70,13 @@ namespace bpkg "" }; + bool pkg-update + { + "", + "Update package.", + "" + }; + bool cfg-create { "[]", diff --git a/bpkg/bpkg.cxx b/bpkg/bpkg.cxx index a6862c4..0df2613 100644 --- a/bpkg/bpkg.cxx +++ b/bpkg/bpkg.cxx @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -179,6 +180,7 @@ try PKG_COMMAND (purge); PKG_COMMAND (configure); PKG_COMMAND (disfigure); + PKG_COMMAND (update); // cfg-* commands // diff --git a/bpkg/buildfile b/bpkg/buildfile index b24fedb..e8f156e 100644 --- a/bpkg/buildfile +++ b/bpkg/buildfile @@ -20,6 +20,7 @@ exe{bpkg}: cxx{package package-odb database diagnostics utility} \ cxx{pkg-purge} cli.cxx{pkg-purge-options} \ cxx{pkg-configure} cli.cxx{pkg-configure-options} \ cxx{pkg-disfigure} cli.cxx{pkg-disfigure-options} \ + cxx{pkg-update} cli.cxx{pkg-update-options} \ cxx{cfg-create} cli.cxx{cfg-create-options} \ cxx{rep-create} cli.cxx{rep-create-options} \ $libs @@ -47,5 +48,6 @@ cli.cxx{pkg-unpack-options}: cli{pkg-unpack-options} cli.cxx{pkg-purge-options}: cli{pkg-purge-options} cli.cxx{pkg-configure-options}: cli{pkg-configure-options} cli.cxx{pkg-disfigure-options}: cli{pkg-disfigure-options} +cli.cxx{pkg-update-options}: cli{pkg-update-options} cli.cxx{cfg-create-options}: cli{cfg-create-options} cli.cxx{rep-create-options}: cli{rep-create-options} diff --git a/bpkg/cfg-create.cxx b/bpkg/cfg-create.cxx index d780657..44728b8 100644 --- a/bpkg/cfg-create.cxx +++ b/bpkg/cfg-create.cxx @@ -112,7 +112,7 @@ namespace bpkg // Configure. // - run_b ("configure(" + c.string () + "/)", vars); + run_b ("configure(" + c.string () + "/)", true, vars); // Run quiet. // Create the database. // diff --git a/bpkg/pkg-configure.cxx b/bpkg/pkg-configure.cxx index 65355ba..169772c 100644 --- a/bpkg/pkg-configure.cxx +++ b/bpkg/pkg-configure.cxx @@ -90,7 +90,7 @@ namespace bpkg // try { - run_b (bspec); + run_b (bspec, true, vars); // Run quiet. } catch (const failed&) { diff --git a/bpkg/pkg-disfigure.cxx b/bpkg/pkg-disfigure.cxx index fca5dd7..e064cba 100644 --- a/bpkg/pkg-disfigure.cxx +++ b/bpkg/pkg-disfigure.cxx @@ -69,7 +69,7 @@ namespace bpkg try { if (exists (out_root)) - run_b (bspec); + run_b (bspec, true); // Run quiet. // Make sure the out directory is gone unless it is the same as src. // diff --git a/bpkg/pkg-update b/bpkg/pkg-update new file mode 100644 index 0000000..0ff4b0d --- /dev/null +++ b/bpkg/pkg-update @@ -0,0 +1,17 @@ +// file : bpkg/pkg-update -*- C++ -*- +// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#ifndef BPKG_PKG_UPDATE +#define BPKG_PKG_UPDATE + +#include +#include + +namespace bpkg +{ + void + pkg_update (const pkg_update_options&, cli::scanner& args); +} + +#endif // BPKG_PKG_UPDATE diff --git a/bpkg/pkg-update-options.cli b/bpkg/pkg-update-options.cli new file mode 100644 index 0000000..e9fbbb2 --- /dev/null +++ b/bpkg/pkg-update-options.cli @@ -0,0 +1,33 @@ +// file : bpkg/pkg-update-options.cli +// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +include ; + +/* +"\section=1" +"\name=bpkg-pkg-update" + +"\h{SYNOPSIS} + +bpkg pkg-update " + +"\h{DESCRIPTION} + +The \cb{pkg-update} command updates the previously configured +(\cb{pkg-configure}) package. Underneath, this command doesn't +do much more than run (\cb{b update})." +*/ + +namespace bpkg +{ + class pkg_update_options: common_options + { + dir_path --directory|-d (".") + { + "", + "Assume configuration is in rather than in the current working + directory." + }; + }; +} diff --git a/bpkg/pkg-update.cxx b/bpkg/pkg-update.cxx new file mode 100644 index 0000000..015a628 --- /dev/null +++ b/bpkg/pkg-update.cxx @@ -0,0 +1,64 @@ +// file : bpkg/pkg-update.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include + +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace butl; + +namespace bpkg +{ + void + pkg_update (const pkg_update_options& o, cli::scanner& args) + { + tracer trace ("pkg_update"); + + const dir_path& c (o.directory ()); + level4 ([&]{trace << "configuration: " << c;}); + + if (!args.more ()) + fail << "package name argument expected" << + info << "run 'bpkg help pkg-update' for more information"; + + string n (args.next ()); + + database db (open (c, trace)); + + 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->state != state::configured) + fail << "package " << n << " is " << p->state << + info << "expected it to be configured"; + + level4 ([&]{trace << p->name << " " << p->version;}); + + assert (p->out_root); // Should be present since configured. + dir_path out_root (c / *p->out_root); // Always relative. + level4 ([&]{trace << "out_root: " << out_root;}); + + // Form the buildspec. + // + string bspec ("update(" + out_root.string () + "/)"); + level4 ([&]{trace << "buildspec: " << bspec;}); + + // Update. + // + run_b (bspec); + + if (verb) + text << "updated " << p->name << " " << p->version; + } +} diff --git a/bpkg/test.sh b/bpkg/test.sh index 66ff1ad..b7282b6 100755 --- a/bpkg/test.sh +++ b/bpkg/test.sh @@ -262,3 +262,32 @@ chmod 755 $out $out/build rm -r $out test pkg-purge -f $pkg stat unknown + +## +## pkg-update +## + +fail pkg-update # package name expected +fail pkg-update $pkg # no such package +test pkg-fetch -e $pkga +fail pkg-update $pkg # wrong package state +test pkg-purge $pkg + +# src == out +# +test pkg-fetch -e $pkga +test pkg-unpack $pkg +test pkg-configure $pkg +test pkg-update $pkg +test pkg-update $pkg +test pkg-disfigure $pkg +test pkg-purge $pkg + +# src != out +# +test pkg-unpack -e $pkgd +test pkg-configure $pkg +test pkg-update $pkg +test pkg-update $pkg +test pkg-disfigure $pkg +test pkg-purge $pkg diff --git a/bpkg/utility b/bpkg/utility index ffe5b94..32ae252 100644 --- a/bpkg/utility +++ b/bpkg/utility @@ -48,10 +48,13 @@ namespace bpkg inline void run (const cstrings& args) {run (args.data ());} - // Run build2, mapping verbosity levels. + // Run build2, mapping verbosity levels. If quiet is true, then + // run build2 quiet if our verbosity level is 1. // void - run_b (const string& buildspec, const strings& vars = strings ()); + run_b (const string& buildspec, + bool quiet = false, + const strings& vars = strings ()); // Call a function if there is an exception. // diff --git a/bpkg/utility.cxx b/bpkg/utility.cxx index b122545..db47476 100644 --- a/bpkg/utility.cxx +++ b/bpkg/utility.cxx @@ -151,7 +151,7 @@ namespace bpkg } void - run_b (const string& bspec, const strings& vars) + run_b (const string& bspec, bool quiet, const strings& vars) { cstrings args {"b"}; @@ -160,11 +160,11 @@ namespace bpkg // as us. // string vl; - if (verb <= 1) + if (verb <= (quiet ? 1 : 0)) args.push_back ("-q"); else if (verb == 2) args.push_back ("-v"); - else + else if (verb > 2) { vl = to_string (verb); args.push_back ("--verbose"); -- cgit v1.1