// file : bpkg/cfg-add.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2016 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #include #include #include #include #include #include using namespace std; using namespace butl; namespace bpkg { int cfg_add (const cfg_add_options& o, cli::scanner& args) { tracer trace ("cfg_add"); dir_path c (o.directory ()); l4 ([&]{trace << "configuration: " << c;}); if (!args.more ()) fail << "repository location argument expected" << info << "run 'bpkg help cfg-add' for more information"; repository_location rl (parse_location (args.next ())); const string& rn (rl.canonical_name ()); // Create the new repository and add is as a complement to the root. // database db (open (c, trace)); transaction t (db.begin ()); session s; // Repository dependencies can have cycles. // It is possible that this repository is already in the database. // For example, it might be a prerequisite of one of the already // added repository. // shared_ptr r (db.find (rl.canonical_name ())); if (r == nullptr) { r.reset (new repository (rl)); db.persist (r); } shared_ptr root (db.load ("")); if (!root->complements.insert (lazy_shared_ptr (db, r)).second) { fail << rn << " is already a repository of this configuration"; } db.update (root); t.commit (); if (verb) text << "added repository " << rn; return 0; } }