// file : bpkg/rep-add.cxx -*- C++ -*- // copyright : Copyright (c) 2014-2019 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #include #include #include #include #include #include using namespace std; using namespace butl; namespace bpkg { shared_ptr rep_add (const common_options& o, transaction& t, const repository_location& rl) { const string& rn (rl.canonical_name ()); database& db (t.database ()); shared_ptr r (db.find (rn)); bool updated (false); if (r == nullptr) { r.reset (new repository (rl)); db.persist (r); } else if (r->location.url () != rl.url ()) { r->location = rl; db.update (r); updated = true; } shared_ptr root (db.load ("")); bool added ( root->complements.insert (lazy_shared_ptr (db, r)).second); if (added) db.update (root); if (verb && !o.no_result ()) text << (added ? "added " : updated ? "updated " : "unchanged ") << rn; return r; } int rep_add (const rep_add_options& o, cli::scanner& args) { tracer trace ("rep_add"); dir_path c (o.directory ()); l4 ([&]{trace << "configuration: " << c;}); if (!args.more ()) fail << "repository location argument expected" << info << "run 'bpkg help rep-add' for more information"; database db (open (c, trace)); transaction t (db); session s; // Repository dependencies can have cycles. while (args.more ()) { repository_location rl ( parse_location (args.next (), o.type_specified () ? optional (o.type ()) : nullopt)); rep_add (o, t, rl); } t.commit (); return 0; } }