@@ -125,7 +125,7 @@ library_plan prepare_library(state& st, | |||
} | |||
package_plan prepare_one(state& st, const sdist_target& sd) { | |||
package_plan pkg{sd.sd.manifest.pkg_id.name, sd.sd.manifest.namespace_}; | |||
package_plan pkg{sd.sd.manifest.id.name, sd.sd.manifest.namespace_}; | |||
auto libs = collect_libraries(sd.sd.path); | |||
for (const auto& lib : libs) { | |||
pkg.add_library(prepare_library(st, sd, lib, sd.sd.manifest)); |
@@ -1,16 +0,0 @@ | |||
#pragma once | |||
#include <dds/source/dist.hpp> | |||
#include <dds/temp.hpp> | |||
namespace dds { | |||
class pkg_cache; | |||
class pkg_db; | |||
struct package_info; | |||
temporary_sdist get_package_sdist(const package_info&); | |||
void get_all(const std::vector<package_id>& pkgs, dds::pkg_cache& repo, const pkg_db& cat); | |||
} // namespace dds |
@@ -1,8 +1,8 @@ | |||
#include "./build_common.hpp" | |||
#include <dds/catalog/get.hpp> | |||
#include <dds/pkg/cache.hpp> | |||
#include <dds/pkg/db.hpp> | |||
#include <dds/pkg/get/get.hpp> | |||
using namespace dds; | |||
@@ -30,11 +30,11 @@ builder dds::cli::create_project_builder(const dds::cli::options& opts) { | |||
// Download dependencies | |||
auto deps = repo.solve(man.dependencies, cat); | |||
get_all(deps, repo, cat); | |||
for (const package_id& pk : deps) { | |||
for (const pkg_id& pk : deps) { | |||
auto sdist_ptr = repo.find(pk); | |||
assert(sdist_ptr); | |||
sdist_build_params deps_params; | |||
deps_params.subdir = fs::path("_deps") / sdist_ptr->manifest.pkg_id.to_string(); | |||
deps_params.subdir = fs::path("_deps") / sdist_ptr->manifest.id.to_string(); | |||
builder.add(*sdist_ptr, deps_params); | |||
} | |||
}); |
@@ -2,8 +2,8 @@ | |||
#include <dds/build/builder.hpp> | |||
#include <dds/build/params.hpp> | |||
#include <dds/catalog/get.hpp> | |||
#include <dds/pkg/cache.hpp> | |||
#include <dds/pkg/get/get.hpp> | |||
#include <range/v3/action/join.hpp> | |||
#include <range/v3/range/conversion.hpp> | |||
@@ -46,12 +46,12 @@ int build_deps(const options& opts) { | |||
dds_log(info, "Loading {} dependencies", all_deps.size()); | |||
auto deps = repo.solve(all_deps, cat); | |||
dds::get_all(deps, repo, cat); | |||
for (const dds::package_id& pk : deps) { | |||
for (const dds::pkg_id& pk : deps) { | |||
auto sdist_ptr = repo.find(pk); | |||
assert(sdist_ptr); | |||
dds::sdist_build_params deps_params; | |||
deps_params.subdir = sdist_ptr->manifest.pkg_id.to_string(); | |||
dds_log(info, "Dependency: {}", sdist_ptr->manifest.pkg_id.to_string()); | |||
deps_params.subdir = sdist_ptr->manifest.id.to_string(); | |||
dds_log(info, "Dependency: {}", sdist_ptr->manifest.id.to_string()); | |||
bd.add(*sdist_ptr, deps_params); | |||
} | |||
}); |
@@ -1,10 +1,10 @@ | |||
#include "../options.hpp" | |||
#include <dds/catalog/get.hpp> | |||
#include <dds/dym.hpp> | |||
#include <dds/error/errors.hpp> | |||
#include <dds/http/session.hpp> | |||
#include <dds/pkg/db.hpp> | |||
#include <dds/pkg/get/get.hpp> | |||
#include <dds/util/result.hpp> | |||
#include <boost/leaf/handle_exception.hpp> | |||
@@ -15,7 +15,7 @@ namespace dds::cli::cmd { | |||
static int _pkg_get(const options& opts) { | |||
auto cat = opts.open_catalog(); | |||
for (const auto& item : opts.pkg.get.pkgs) { | |||
auto id = package_id::parse(item); | |||
auto id = pkg_id::parse(item); | |||
dds::dym_target dym; | |||
auto info = cat.get(id); | |||
if (!info) { |
@@ -17,7 +17,7 @@ namespace dds::cli::cmd { | |||
static int _pkg_ls(const options& opts) { | |||
auto list_contents = [&](pkg_cache repo) { | |||
auto same_name | |||
= [](auto&& a, auto&& b) { return a.manifest.pkg_id.name == b.manifest.pkg_id.name; }; | |||
= [](auto&& a, auto&& b) { return a.manifest.id.name == b.manifest.id.name; }; | |||
auto all = repo.iter_sdists(); | |||
auto grp_by_name = all // | |||
@@ -25,23 +25,22 @@ static int _pkg_ls(const options& opts) { | |||
| ranges::views::transform(ranges::to_vector) // | |||
| ranges::views::transform([](auto&& grp) { | |||
assert(grp.size() > 0); | |||
return std::pair(grp[0].manifest.pkg_id.name, grp); | |||
return std::pair(grp[0].manifest.id.name, grp); | |||
}); | |||
for (const auto& [name, grp] : grp_by_name) { | |||
dds_log(info, "{}:", name); | |||
for (const dds::sdist& sd : grp) { | |||
dds_log(info, " - {}", sd.manifest.pkg_id.version.to_string()); | |||
dds_log(info, " - {}", sd.manifest.id.version.to_string()); | |||
} | |||
} | |||
return 0; | |||
}; | |||
return dds::pkg_cache::with_cache(opts.pkg_cache_dir.value_or( | |||
pkg_cache::default_local_path()), | |||
dds::pkg_cache_flags::read, | |||
list_contents); | |||
return dds::pkg_cache::with_cache(opts.pkg_cache_dir.value_or(pkg_cache::default_local_path()), | |||
dds::pkg_cache_flags::read, | |||
list_contents); | |||
} | |||
int pkg_ls(const options& opts) { |
@@ -29,10 +29,10 @@ int repoman_import(const options& opts) { | |||
[](dds::e_sqlite3_error_exc, | |||
boost::leaf::match<neo::sqlite3::errc, neo::sqlite3::errc::constraint_unique>, | |||
dds::e_repo_import_targz tgz, | |||
dds::package_id pkg_id) { | |||
dds::pkg_id pkid) { | |||
dds_log(error, | |||
"Package {} (from {}) is already present in the repository", | |||
pkg_id.to_string(), | |||
pkid.to_string(), | |||
tgz.path); | |||
return 1; | |||
}, |
@@ -13,8 +13,8 @@ namespace dds::cli::cmd { | |||
static int _repoman_ls(const options& opts) { | |||
auto repo = repo_manager::open(opts.repoman.repo_dir); | |||
for (auto pkg_id : repo.all_packages()) { | |||
std::cout << pkg_id.to_string() << '\n'; | |||
for (auto id : repo.all_packages()) { | |||
std::cout << id.to_string() << '\n'; | |||
} | |||
return 0; | |||
} |
@@ -12,8 +12,8 @@ namespace dds::cli::cmd { | |||
static int _repoman_remove(const options& opts) { | |||
auto repo = repo_manager::open(opts.repoman.repo_dir); | |||
for (auto& str : opts.repoman.remove.pkgs) { | |||
auto pkg_id = dds::package_id::parse(str); | |||
repo.delete_package(pkg_id); | |||
auto id = dds::pkg_id::parse(str); | |||
repo.delete_package(id); | |||
} | |||
return 0; | |||
} | |||
@@ -30,17 +30,17 @@ int repoman_remove(const options& opts) { | |||
[](dds::e_sqlite3_error_exc, | |||
boost::leaf::match<neo::sqlite3::errc, neo::sqlite3::errc::constraint_unique>, | |||
dds::e_repo_import_targz tgz, | |||
dds::package_id pkg_id) { | |||
dds::pkg_id pkid) { | |||
dds_log(error, | |||
"Package {} (from {}) is already present in the repository", | |||
pkg_id.to_string(), | |||
pkid.to_string(), | |||
tgz.path); | |||
return 1; | |||
}, | |||
[](dds::e_system_error_exc e, dds::e_repo_delete_path tgz, dds::package_id pkg_id) { | |||
[](dds::e_system_error_exc e, dds::e_repo_delete_path tgz, dds::pkg_id pkid) { | |||
dds_log(error, | |||
"Cannot delete requested package '{}' from repository (Path {}): {}", | |||
pkg_id.to_string(), | |||
pkid.to_string(), | |||
tgz.path, | |||
e.message); | |||
return 1; |
@@ -15,7 +15,7 @@ int sdist_create(const options& opts) { | |||
.include_tests = true, | |||
}; | |||
auto pkg_man = package_manifest::load_from_directory(params.project_dir); | |||
auto default_filename = fmt::format("{}.tar.gz", pkg_man->pkg_id.to_string()); | |||
auto default_filename = fmt::format("{}.tar.gz", pkg_man->id.to_string()); | |||
auto filepath = opts.out_path.value_or(fs::current_path() / default_filename); | |||
create_sdist_targz(filepath, params); | |||
return 0; |
@@ -50,7 +50,7 @@ package_manifest parse_json(const json5::data& data, std::string_view fpath) { | |||
required_key{"name", | |||
"A string 'name' is required", | |||
require_str{"'name' must be a string"}, | |||
put_into{ret.pkg_id.name}}, | |||
put_into{ret.id.name}}, | |||
required_key{"namespace", | |||
"A string 'namespace' is a required ", | |||
require_str{"'namespace' must be a string"}, | |||
@@ -58,7 +58,7 @@ package_manifest parse_json(const json5::data& data, std::string_view fpath) { | |||
required_key{"version", | |||
"A 'version' string is requried", | |||
require_str{"'version' must be a string"}, | |||
put_into{ret.pkg_id.version, | |||
put_into{ret.id.version, | |||
[](std::string s) { return semver::version::parse(s); }}}, | |||
if_key{"depends", | |||
[&](auto&& dat) { |
@@ -1,7 +1,7 @@ | |||
#pragma once | |||
#include <dds/deps.hpp> | |||
#include <dds/package/id.hpp> | |||
#include <dds/pkg/id.hpp> | |||
#include <dds/util/fs.hpp> | |||
#include <optional> | |||
@@ -23,7 +23,7 @@ enum class test_lib { | |||
*/ | |||
struct package_manifest { | |||
/// The package ID, as determined by `Name` and `Version` together | |||
package_id pkg_id; | |||
dds::pkg_id id; | |||
/// The declared `Namespace` of the package. This directly corresponds with the libman Namespace | |||
std::string namespace_; | |||
/// The `test_driver` that this package declares, or `nullopt` if absent. |
@@ -60,7 +60,7 @@ pkg_cache pkg_cache::_open_for_directory(bool writeable, path_ref dirpath) { | |||
} | |||
void pkg_cache::add_sdist(const sdist& sd, if_exists ife_action) { | |||
neo_assertion_breadcrumbs("Importing sdist archive", sd.manifest.pkg_id.to_string()); | |||
neo_assertion_breadcrumbs("Importing sdist archive", sd.manifest.id.to_string()); | |||
if (!_write_enabled) { | |||
dds_log(critical, | |||
"DDS attempted to write into a cache that wasn't opened with a write-lock. This " | |||
@@ -68,11 +68,11 @@ void pkg_cache::add_sdist(const sdist& sd, if_exists ife_action) { | |||
"cache, we'll hard-exit immediately."); | |||
std::terminate(); | |||
} | |||
auto sd_dest = _root / sd.manifest.pkg_id.to_string(); | |||
auto sd_dest = _root / sd.manifest.id.to_string(); | |||
if (fs::exists(sd_dest)) { | |||
auto msg = fmt:: | |||
format("Package '{}' (Importing from [{}]) is already available in the local cache", | |||
sd.manifest.pkg_id.to_string(), | |||
sd.manifest.id.to_string(), | |||
sd.path.string()); | |||
if (ife_action == if_exists::throw_exc) { | |||
throw_user_error<errc::sdist_exists>(msg); | |||
@@ -95,10 +95,10 @@ void pkg_cache::add_sdist(const sdist& sd, if_exists ife_action) { | |||
} | |||
fs::rename(tmp_copy, sd_dest); | |||
_sdists.insert(sdist::from_directory(sd_dest)); | |||
dds_log(info, "Source distribution '{}' successfully exported", sd.manifest.pkg_id.to_string()); | |||
dds_log(info, "Source distribution '{}' successfully exported", sd.manifest.id.to_string()); | |||
} | |||
const sdist* pkg_cache::find(const package_id& pkg) const noexcept { | |||
const sdist* pkg_cache::find(const pkg_id& pkg) const noexcept { | |||
auto found = _sdists.find(pkg); | |||
if (found == _sdists.end()) { | |||
return nullptr; | |||
@@ -106,22 +106,22 @@ const sdist* pkg_cache::find(const package_id& pkg) const noexcept { | |||
return &*found; | |||
} | |||
std::vector<package_id> pkg_cache::solve(const std::vector<dependency>& deps, | |||
const pkg_db& ctlg) const { | |||
std::vector<pkg_id> pkg_cache::solve(const std::vector<dependency>& deps, | |||
const pkg_db& ctlg) const { | |||
return dds::solve( | |||
deps, | |||
[&](std::string_view name) -> std::vector<package_id> { | |||
[&](std::string_view name) -> std::vector<pkg_id> { | |||
auto mine = ranges::views::all(_sdists) // | |||
| ranges::views::filter( | |||
[&](const sdist& sd) { return sd.manifest.pkg_id.name == name; }) | |||
| ranges::views::transform([](const sdist& sd) { return sd.manifest.pkg_id; }); | |||
[&](const sdist& sd) { return sd.manifest.id.name == name; }) | |||
| ranges::views::transform([](const sdist& sd) { return sd.manifest.id; }); | |||
auto avail = ctlg.by_name(name); | |||
auto all = ranges::views::concat(mine, avail) | ranges::to_vector; | |||
ranges::sort(all, std::less{}); | |||
ranges::unique(all, std::less{}); | |||
return all; | |||
}, | |||
[&](const package_id& pkg_id) { | |||
[&](const pkg_id& pkg_id) { | |||
auto found = find(pkg_id); | |||
if (found) { | |||
return found->manifest.dependencies; |
@@ -83,7 +83,7 @@ public: | |||
void add_sdist(const sdist&, if_exists = if_exists::throw_exc); | |||
const sdist* find(const package_id& pk) const noexcept; | |||
const sdist* find(const pkg_id& pk) const noexcept; | |||
auto iter_sdists() const noexcept { | |||
class ret { | |||
@@ -99,7 +99,7 @@ public: | |||
return r; | |||
} | |||
std::vector<package_id> solve(const std::vector<dependency>& deps, const pkg_db&) const; | |||
std::vector<pkg_id> solve(const std::vector<dependency>& deps, const pkg_db&) const; | |||
}; | |||
} // namespace dds |
@@ -134,9 +134,7 @@ void migrate_repodb_3(nsql::database& db) { | |||
)"); | |||
} | |||
void store_with_remote(const neo::sqlite3::statement_cache&, | |||
const package_info& pkg, | |||
std::monostate) { | |||
void store_with_remote(const neo::sqlite3::statement_cache&, const pkg_info& pkg, std::monostate) { | |||
neo_assert_always( | |||
invariant, | |||
false, | |||
@@ -146,7 +144,7 @@ void store_with_remote(const neo::sqlite3::statement_cache&, | |||
} | |||
void store_with_remote(neo::sqlite3::statement_cache& stmts, | |||
const package_info& pkg, | |||
const pkg_info& pkg, | |||
const http_remote_listing& http) { | |||
nsql::exec( // | |||
stmts(R"( | |||
@@ -164,7 +162,7 @@ void store_with_remote(neo::sqlite3::statement_cache& stmts, | |||
} | |||
void store_with_remote(neo::sqlite3::statement_cache& stmts, | |||
const package_info& pkg, | |||
const pkg_info& pkg, | |||
const git_remote_listing& git) { | |||
std::string url = git.url; | |||
if (url.starts_with("https://") || url.starts_with("http://")) { | |||
@@ -197,7 +195,7 @@ void store_with_remote(neo::sqlite3::statement_cache& stmts, | |||
void do_store_pkg(neo::sqlite3::database& db, | |||
neo::sqlite3::statement_cache& st_cache, | |||
const package_info& pkg) { | |||
const pkg_info& pkg) { | |||
dds_log(debug, "Recording package {}@{}", pkg.ident.name, pkg.ident.version.to_string()); | |||
std::visit([&](auto&& remote) { store_with_remote(st_cache, pkg, remote); }, pkg.remote); | |||
auto db_pkg_id = db.last_insert_rowid(); | |||
@@ -304,12 +302,12 @@ pkg_db pkg_db::open(const std::string& db_path) { | |||
pkg_db::pkg_db(nsql::database db) | |||
: _db(std::move(db)) {} | |||
void pkg_db::store(const package_info& pkg) { | |||
void pkg_db::store(const pkg_info& pkg) { | |||
nsql::transaction_guard tr{_db}; | |||
do_store_pkg(_db, _stmt_cache, pkg); | |||
} | |||
std::optional<package_info> pkg_db::get(const package_id& pk_id) const noexcept { | |||
std::optional<pkg_info> pkg_db::get(const pkg_id& pk_id) const noexcept { | |||
auto ver_str = pk_id.version.to_string(); | |||
dds_log(trace, "Lookup package {}@{}", pk_id.name, ver_str); | |||
auto& st = _stmt_cache(R"( | |||
@@ -362,7 +360,7 @@ std::optional<package_info> pkg_db::get(const package_id& pk_id) const noexcept | |||
auto deps = dependencies_of(pk_id); | |||
auto info = package_info{ | |||
auto info = pkg_info{ | |||
pk_id, | |||
std::move(deps), | |||
std::move(description), | |||
@@ -374,10 +372,10 @@ std::optional<package_info> pkg_db::get(const package_id& pk_id) const noexcept | |||
auto pair_to_pkg_id = [](auto&& pair) { | |||
const auto& [name, ver] = pair; | |||
return package_id{name, semver::version::parse(ver)}; | |||
return pkg_id{name, semver::version::parse(ver)}; | |||
}; | |||
std::vector<package_id> pkg_db::all() const noexcept { | |||
std::vector<pkg_id> pkg_db::all() const noexcept { | |||
return nsql::exec_tuples<std::string, std::string>( | |||
_stmt_cache("SELECT name, version FROM dds_cat_pkgs"_sql)) | |||
| neo::lref // | |||
@@ -385,7 +383,7 @@ std::vector<package_id> pkg_db::all() const noexcept { | |||
| ranges::to_vector; | |||
} | |||
std::vector<package_id> pkg_db::by_name(std::string_view sv) const noexcept { | |||
std::vector<pkg_id> pkg_db::by_name(std::string_view sv) const noexcept { | |||
return nsql::exec_tuples<std::string, std::string>( // | |||
_stmt_cache( | |||
R"( | |||
@@ -400,7 +398,7 @@ std::vector<package_id> pkg_db::by_name(std::string_view sv) const noexcept { | |||
| ranges::to_vector; | |||
} | |||
std::vector<dependency> pkg_db::dependencies_of(const package_id& pkg) const noexcept { | |||
std::vector<dependency> pkg_db::dependencies_of(const pkg_id& pkg) const noexcept { | |||
dds_log(trace, "Lookup dependencies of {}@{}", pkg.name, pkg.version.to_string()); | |||
return nsql::exec_tuples<std::string, | |||
std::string, |
@@ -1,12 +1,12 @@ | |||
#pragma once | |||
#include "./info.hpp" | |||
#include <dds/deps.hpp> | |||
#include <dds/package/id.hpp> | |||
#include <dds/pkg/id.hpp> | |||
#include <dds/util/fs.hpp> | |||
#include <dds/util/glob.hpp> | |||
#include <dds/catalog/package_info.hpp> | |||
#include <neo/sqlite3/database.hpp> | |||
#include <neo/sqlite3/statement.hpp> | |||
#include <neo/sqlite3/statement_cache.hpp> | |||
@@ -34,12 +34,12 @@ public: | |||
static fs::path default_path() noexcept; | |||
void store(const package_info& info); | |||
std::optional<package_info> get(const package_id& id) const noexcept; | |||
void store(const pkg_info& info); | |||
std::optional<pkg_info> get(const pkg_id& id) const noexcept; | |||
std::vector<package_id> all() const noexcept; | |||
std::vector<package_id> by_name(std::string_view sv) const noexcept; | |||
std::vector<dependency> dependencies_of(const package_id& pkg) const noexcept; | |||
std::vector<pkg_id> all() const noexcept; | |||
std::vector<pkg_id> by_name(std::string_view sv) const noexcept; | |||
std::vector<dependency> dependencies_of(const pkg_id& pkg) const noexcept; | |||
auto& database() noexcept { return _db; } | |||
auto& database() const noexcept { return _db; } |
@@ -26,8 +26,8 @@ public: | |||
}; | |||
TEST_CASE_METHOD(catalog_test_case, "Store a simple package") { | |||
db.store(dds::package_info{ | |||
dds::package_id("foo", semver::version::parse("1.2.3")), | |||
db.store(dds::pkg_info{ | |||
dds::pkg_id("foo", semver::version::parse("1.2.3")), | |||
{}, | |||
"example", | |||
dds::git_remote_listing{std::nullopt, "git+http://example.com", "master"}, | |||
@@ -45,8 +45,8 @@ TEST_CASE_METHOD(catalog_test_case, "Store a simple package") { | |||
CHECK(std::get<dds::git_remote_listing>(info->remote).ref == "master"); | |||
// Update the entry with a new git remote ref | |||
CHECK_NOTHROW(db.store(dds::package_info{ | |||
dds::package_id("foo", semver::version::parse("1.2.3")), | |||
CHECK_NOTHROW(db.store(dds::pkg_info{ | |||
dds::pkg_id("foo", semver::version::parse("1.2.3")), | |||
{}, | |||
"example", | |||
dds::git_remote_listing{std::nullopt, "git+http://example.com", "develop"}, | |||
@@ -58,8 +58,8 @@ TEST_CASE_METHOD(catalog_test_case, "Store a simple package") { | |||
} | |||
TEST_CASE_METHOD(catalog_test_case, "Package requirements") { | |||
db.store(dds::package_info{ | |||
dds::package_id{"foo", semver::version::parse("1.2.3")}, | |||
db.store(dds::pkg_info{ | |||
dds::pkg_id{"foo", semver::version::parse("1.2.3")}, | |||
{ | |||
{"bar", {semver::version::parse("1.2.3"), semver::version::parse("1.4.0")}}, | |||
{"baz", {semver::version::parse("5.3.0"), semver::version::parse("6.0.0")}}, |
@@ -1,13 +1,13 @@ | |||
#include "./base.hpp" | |||
#include <dds/package/id.hpp> | |||
#include <dds/pkg/id.hpp> | |||
#include <dds/util/log.hpp> | |||
#include <nlohmann/json.hpp> | |||
using namespace dds; | |||
void remote_listing_base::generate_auto_lib_files(const package_id& pid, path_ref root) const { | |||
void remote_listing_base::generate_auto_lib_files(const pkg_id& pid, path_ref root) const { | |||
if (auto_lib.has_value()) { | |||
dds_log(info, "Generating library data automatically"); | |||
@@ -8,12 +8,12 @@ | |||
namespace dds { | |||
struct package_id; | |||
struct pkg_id; | |||
struct remote_listing_base { | |||
std::optional<lm::usage> auto_lib{}; | |||
void generate_auto_lib_files(const package_id& pid, path_ref root) const; | |||
void generate_auto_lib_files(const pkg_id& pid, path_ref root) const; | |||
}; | |||
template <typename T> |
@@ -14,7 +14,7 @@ using namespace dds; | |||
namespace { | |||
temporary_sdist do_pull_sdist(const package_info& listing, std::monostate) { | |||
temporary_sdist do_pull_sdist(const pkg_info& listing, std::monostate) { | |||
neo_assert_always( | |||
invariant, | |||
false, | |||
@@ -25,7 +25,7 @@ temporary_sdist do_pull_sdist(const package_info& listing, std::monostate) { | |||
} | |||
template <remote_listing R> | |||
temporary_sdist do_pull_sdist(const package_info& listing, const R& remote) { | |||
temporary_sdist do_pull_sdist(const pkg_info& listing, const R& remote) { | |||
auto tmpdir = dds::temporary_dir::create(); | |||
remote.pull_source(tmpdir.path()); | |||
@@ -43,19 +43,19 @@ temporary_sdist do_pull_sdist(const package_info& listing, const R& remote) { | |||
} // namespace | |||
temporary_sdist dds::get_package_sdist(const package_info& pkg) { | |||
temporary_sdist dds::get_package_sdist(const pkg_info& pkg) { | |||
auto tsd = std::visit([&](auto&& remote) { return do_pull_sdist(pkg, remote); }, pkg.remote); | |||
if (!(tsd.sdist.manifest.pkg_id == pkg.ident)) { | |||
if (!(tsd.sdist.manifest.id == pkg.ident)) { | |||
throw_external_error<errc::sdist_ident_mismatch>( | |||
"The package name@version in the generated source distribution does not match the name " | |||
"listed in the remote listing file (expected '{}', but got '{}')", | |||
pkg.ident.to_string(), | |||
tsd.sdist.manifest.pkg_id.to_string()); | |||
tsd.sdist.manifest.id.to_string()); | |||
} | |||
return tsd; | |||
} | |||
void dds::get_all(const std::vector<package_id>& pkgs, pkg_cache& repo, const pkg_db& cat) { | |||
void dds::get_all(const std::vector<pkg_id>& pkgs, pkg_cache& repo, const pkg_db& cat) { | |||
std::mutex repo_mut; | |||
auto absent_pkg_infos = pkgs // | |||
@@ -72,7 +72,7 @@ void dds::get_all(const std::vector<package_id>& pkgs, pkg_cache& repo, const pk | |||
return *info; | |||
}); | |||
auto okay = parallel_run(absent_pkg_infos, 8, [&](package_info inf) { | |||
auto okay = parallel_run(absent_pkg_infos, 8, [&](pkg_info inf) { | |||
dds_log(info, "Download package: {}", inf.ident.to_string()); | |||
auto tsd = get_package_sdist(inf); | |||
std::scoped_lock lk{repo_mut}; |
@@ -0,0 +1,16 @@ | |||
#pragma once | |||
#include <dds/source/dist.hpp> | |||
#include <dds/temp.hpp> | |||
namespace dds { | |||
class pkg_cache; | |||
class pkg_db; | |||
struct pkg_info; | |||
temporary_sdist get_package_sdist(const pkg_info&); | |||
void get_all(const std::vector<pkg_id>& pkgs, dds::pkg_cache& repo, const pkg_db& cat); | |||
} // namespace dds |
@@ -1,4 +1,4 @@ | |||
#include <dds/catalog/remote/http.hpp> | |||
#include "./http.hpp" | |||
#include <dds/error/errors.hpp> | |||
#include <dds/source/dist.hpp> |
@@ -1,4 +1,4 @@ | |||
#include <dds/package/id.hpp> | |||
#include <dds/pkg/id.hpp> | |||
#include <dds/error/errors.hpp> | |||
@@ -8,7 +8,7 @@ | |||
using namespace dds; | |||
package_id package_id::parse(std::string_view s) { | |||
pkg_id pkg_id::parse(std::string_view s) { | |||
auto at_pos = s.find('@'); | |||
if (at_pos == s.npos) { | |||
throw_user_error<errc::invalid_pkg_id>("Invalid package ID '{}'", s); | |||
@@ -20,7 +20,7 @@ package_id package_id::parse(std::string_view s) { | |||
return {std::string(name), semver::version::parse(ver_str)}; | |||
} | |||
package_id::package_id(std::string_view n, semver::version v) | |||
pkg_id::pkg_id(std::string_view n, semver::version v) | |||
: name(n) | |||
, version(std::move(v)) { | |||
if (name.find('@') != name.npos) { | |||
@@ -29,4 +29,4 @@ package_id::package_id(std::string_view n, semver::version v) | |||
} | |||
} | |||
std::string package_id::to_string() const noexcept { return name + "@" + version.to_string(); } | |||
std::string pkg_id::to_string() const noexcept { return name + "@" + version.to_string(); } |
@@ -15,32 +15,32 @@ namespace dds { | |||
* `to_string` method convert between this textual representation, and supports | |||
* full round-trips. | |||
*/ | |||
struct package_id { | |||
struct pkg_id { | |||
/// The name of the package | |||
std::string name; | |||
/// The version of the package | |||
semver::version version; | |||
/// Default-initialize a package_id with a blank name and a default version | |||
package_id() = default; | |||
/// Default-initialize a pkg_id with a blank name and a default version | |||
pkg_id() = default; | |||
/// Construct a package ID from a name-version pair | |||
package_id(std::string_view s, semver::version v); | |||
pkg_id(std::string_view s, semver::version v); | |||
/** | |||
* Parse the given string into a package_id object. | |||
* Parse the given string into a pkg_id object. | |||
*/ | |||
static package_id parse(std::string_view); | |||
static pkg_id parse(std::string_view); | |||
/** | |||
* Convert this package_id into its corresponding textual representation. | |||
/**d | |||
* Convert this pkg_id into its corresponding textual representation. | |||
* The returned string can be passed back to `parse()` for a round-trip | |||
*/ | |||
std::string to_string() const noexcept; | |||
friend bool operator<(const package_id& lhs, const package_id& rhs) noexcept { | |||
friend bool operator<(const pkg_id& lhs, const pkg_id& rhs) noexcept { | |||
return std::tie(lhs.name, lhs.version) < std::tie(rhs.name, rhs.version); | |||
} | |||
friend bool operator==(const package_id& lhs, const package_id& rhs) noexcept { | |||
friend bool operator==(const pkg_id& lhs, const pkg_id& rhs) noexcept { | |||
return std::tie(lhs.name, lhs.version) == std::tie(rhs.name, rhs.version); | |||
} | |||
}; |
@@ -1,4 +1,4 @@ | |||
#include <dds/package/id.hpp> | |||
#include <dds/pkg/id.hpp> | |||
#include <catch2/catch.hpp> | |||
@@ -14,7 +14,7 @@ TEST_CASE("Package package ID strings") { | |||
{"foo@1.2.3-alpha", "foo", "1.2.3-alpha"}, | |||
})); | |||
auto pk_id = dds::package_id::parse(id_str); | |||
auto pk_id = dds::pkg_id::parse(id_str); | |||
CHECK(pk_id.to_string() == id_str); | |||
CHECK(pk_id.name == exp_name); | |||
CHECK(pk_id.version.to_string() == exp_ver); | |||
@@ -44,8 +44,8 @@ TEST_CASE("Package ordering") { | |||
{"foo@0.1.2-alpha", less_than, "foo@1.0.0"}, | |||
})); | |||
auto lhs = dds::package_id::parse(lhs_str); | |||
auto rhs = dds::package_id::parse(rhs_str); | |||
auto lhs = dds::pkg_id::parse(lhs_str); | |||
auto rhs = dds::pkg_id::parse(rhs_str); | |||
if (ord == less_than) { | |||
CHECK(lhs < rhs); |
@@ -1,4 +1,4 @@ | |||
#include "./package_info.hpp" | |||
#include "./info.hpp" | |||
#include <dds/error/errors.hpp> | |||
#include <dds/util/string.hpp> |
@@ -1,10 +1,10 @@ | |||
#pragma once | |||
#include "./remote/git.hpp" | |||
#include "./remote/http.hpp" | |||
#include "./get/git.hpp" | |||
#include "./get/http.hpp" | |||
#include <dds/deps.hpp> | |||
#include <dds/package/id.hpp> | |||
#include <dds/pkg/id.hpp> | |||
#include <dds/util/glob.hpp> | |||
#include <optional> | |||
@@ -18,8 +18,8 @@ using remote_listing_var = std::variant<std::monostate, git_remote_listing, http | |||
remote_listing_var parse_remote_url(std::string_view url); | |||
struct package_info { | |||
package_id ident; | |||
struct pkg_info { | |||
pkg_id ident; | |||
std::vector<dependency> deps; | |||
std::string description; | |||
@@ -143,11 +143,11 @@ void repo_manager::import_targz(path_ref tgz_file) { | |||
throw std::runtime_error("Invalid package archive"); | |||
} | |||
DDS_E_SCOPE(man->pkg_id); | |||
DDS_E_SCOPE(man->id); | |||
neo::sqlite3::transaction_guard tr{_db}; | |||
dds_log(debug, "Recording package {}@{}", man->pkg_id.name, man->pkg_id.version.to_string()); | |||
dds_log(debug, "Recording package {}@{}", man->id.name, man->id.version.to_string()); | |||
nsql::exec( // | |||
_stmts(R"( | |||
INSERT INTO dds_repo_packages (name, version, description, url) | |||
@@ -158,8 +158,8 @@ void repo_manager::import_targz(path_ref tgz_file) { | |||
printf('dds:%s@%s', ?1, ?2) | |||
) | |||
)"_sql), | |||
man->pkg_id.name, | |||
man->pkg_id.version.to_string()); | |||
man->id.name, | |||
man->id.version.to_string()); | |||
auto package_id = _db.last_insert_rowid(); | |||
@@ -179,14 +179,14 @@ void repo_manager::import_targz(path_ref tgz_file) { | |||
} | |||
auto dest_path | |||
= pkg_dir() / man->pkg_id.name / man->pkg_id.version.to_string() / "sdist.tar.gz"; | |||
= pkg_dir() / man->id.name / man->id.version.to_string() / "sdist.tar.gz"; | |||
fs::create_directories(dest_path.parent_path()); | |||
fs::copy(tgz_file, dest_path); | |||
tr.commit(); | |||
} | |||
void repo_manager::delete_package(package_id pkg_id) { | |||
void repo_manager::delete_package(pkg_id pkg_id) { | |||
neo::sqlite3::transaction_guard tr{_db}; | |||
DDS_E_SCOPE(pkg_id); |
@@ -1,6 +1,6 @@ | |||
#pragma once | |||
#include <dds/package/id.hpp> | |||
#include <dds/pkg/id.hpp> | |||
#include <dds/util/fs.hpp> | |||
#include <neo/sqlite3/database.hpp> | |||
@@ -54,7 +54,7 @@ public: | |||
std::string name() const noexcept; | |||
void import_targz(path_ref tgz_path); | |||
void delete_package(package_id id); | |||
void delete_package(pkg_id id); | |||
auto all_packages() const noexcept { | |||
using namespace neo::sqlite3::literals; | |||
@@ -62,7 +62,7 @@ public: | |||
auto tups = neo::sqlite3::iter_tuples<std::string, std::string>(st); | |||
return tups | ranges::views::transform([](auto&& pair) { | |||
auto [name, version] = pair; | |||
return package_id{name, semver::version::parse(version)}; | |||
return pkg_id{name, semver::version::parse(version)}; | |||
}); | |||
} | |||
}; |
@@ -22,10 +22,9 @@ TEST_CASE("Open and import into a repository") { | |||
CHECK(dds::fs::is_directory(repo.pkg_dir() / "neo-url/")); | |||
CHECK(dds::fs::is_regular_file(repo.pkg_dir() / "neo-url/0.2.1/sdist.tar.gz")); | |||
CHECK_THROWS_AS(repo.import_targz(neo_url_tgz), neo::sqlite3::constraint_unique_error); | |||
repo.delete_package(dds::package_id::parse("neo-url@0.2.1")); | |||
repo.delete_package(dds::pkg_id::parse("neo-url@0.2.1")); | |||
CHECK_FALSE(dds::fs::is_regular_file(repo.pkg_dir() / "neo-url/0.2.1/sdist.tar.gz")); | |||
CHECK_FALSE(dds::fs::is_directory(repo.pkg_dir() / "neo-url")); | |||
CHECK_THROWS_AS(repo.delete_package(dds::package_id::parse("neo-url@0.2.1")), | |||
std::system_error); | |||
CHECK_THROWS_AS(repo.delete_package(dds::pkg_id::parse("neo-url@0.2.1")), std::system_error); | |||
CHECK_NOTHROW(repo.import_targz(neo_url_tgz)); | |||
} |
@@ -66,14 +66,14 @@ struct req_type { | |||
auto as_pkg_id(const req_type& req) { | |||
const version_range_set& versions = req.dep.versions; | |||
assert(versions.num_intervals() == 1); | |||
return package_id{req.dep.name, (*versions.iter_intervals().begin()).low}; | |||
return pkg_id{req.dep.name, (*versions.iter_intervals().begin()).low}; | |||
} | |||
struct solver_provider { | |||
pkg_id_provider_fn& pkgs_for_name; | |||
deps_provider_fn& deps_for_pkg; | |||
mutable std::map<std::string, std::vector<package_id>> pkgs_by_name = {}; | |||
mutable std::map<std::string, std::vector<pkg_id>> pkgs_by_name = {}; | |||
std::optional<req_type> best_candidate(const req_type& req) const { | |||
dds_log(debug, "Find best candidate of {}", req.dep.to_string()); | |||
@@ -85,7 +85,7 @@ struct solver_provider { | |||
} | |||
// Find the first package with the version contained by the ranges in the requirement | |||
auto& for_name = found->second; | |||
auto cand = std::find_if(for_name.cbegin(), for_name.cend(), [&](const package_id& pk) { | |||
auto cand = std::find_if(for_name.cbegin(), for_name.cend(), [&](const pkg_id& pk) { | |||
return req.dep.versions.contains(pk.version); | |||
}); | |||
if (cand == for_name.cend()) { | |||
@@ -156,9 +156,9 @@ struct explainer { | |||
} // namespace | |||
std::vector<package_id> dds::solve(const std::vector<dependency>& deps, | |||
pkg_id_provider_fn pkgs_prov, | |||
deps_provider_fn deps_prov) { | |||
std::vector<pkg_id> dds::solve(const std::vector<dependency>& deps, | |||
pkg_id_provider_fn pkgs_prov, | |||
deps_provider_fn deps_prov) { | |||
auto wrap_req | |||
= deps | ranges::views::transform([](const dependency& dep) { return req_type{dep}; }); | |||
@@ -1,16 +1,16 @@ | |||
#pragma once | |||
#include <dds/deps.hpp> | |||
#include <dds/package/id.hpp> | |||
#include <dds/pkg/id.hpp> | |||
#include <functional> | |||
namespace dds { | |||
using pkg_id_provider_fn = std::function<std::vector<package_id>(std::string_view)>; | |||
using deps_provider_fn = std::function<std::vector<dependency>(const package_id& pk)>; | |||
using pkg_id_provider_fn = std::function<std::vector<pkg_id>(std::string_view)>; | |||
using deps_provider_fn = std::function<std::vector<dependency>(const pkg_id& pk)>; | |||
std::vector<package_id> | |||
std::vector<pkg_id> | |||
solve(const std::vector<dependency>& deps, pkg_id_provider_fn, deps_provider_fn); | |||
} // namespace dds |
@@ -1,8 +1,8 @@ | |||
#include "./dist.hpp" | |||
#include <dds/catalog/remote/http.hpp> | |||
#include <dds/error/errors.hpp> | |||
#include <dds/library/root.hpp> | |||
#include <dds/pkg/get/http.hpp> | |||
#include <dds/temp.hpp> | |||
#include <dds/util/fs.hpp> | |||
#include <dds/util/log.hpp> | |||
@@ -116,7 +116,7 @@ sdist dds::create_sdist_in_dir(path_ref out, const sdist_params& params) { | |||
auto pkg_man = package_manifest::load_from_file(*man_path); | |||
sdist_export_file(out, params.project_dir, *man_path); | |||
dds_log(info, "Generated export as {}", pkg_man.pkg_id.to_string()); | |||
dds_log(info, "Generated export as {}", pkg_man.id.to_string()); | |||
return sdist::from_directory(out); | |||
} | |||
@@ -34,14 +34,10 @@ struct temporary_sdist { | |||
inline constexpr struct sdist_compare_t { | |||
bool operator()(const sdist& lhs, const sdist& rhs) const { | |||
return lhs.manifest.pkg_id < rhs.manifest.pkg_id; | |||
} | |||
bool operator()(const sdist& lhs, const package_id& rhs) const { | |||
return lhs.manifest.pkg_id < rhs; | |||
} | |||
bool operator()(const package_id& lhs, const sdist& rhs) const { | |||
return lhs < rhs.manifest.pkg_id; | |||
return lhs.manifest.id < rhs.manifest.id; | |||
} | |||
bool operator()(const sdist& lhs, const pkg_id& rhs) const { return lhs.manifest.id < rhs; } | |||
bool operator()(const pkg_id& lhs, const sdist& rhs) const { return lhs < rhs.manifest.id; } | |||
using is_transparent = int; | |||
} sdist_compare; | |||