@@ -294,7 +294,7 @@ catalog catalog::open(const std::string& db_path) { | |||
ensure_migrated(db); | |||
} catch (const nsql::sqlite3_error& e) { | |||
dds_log(critical, | |||
"Failed to load the repository database. It appears to be invalid/corrupted. The " | |||
"Failed to load the package database. It appears to be invalid/corrupted. The " | |||
"exception message is: {}", | |||
e.what()); | |||
throw_external_error<errc::corrupted_catalog_db>(); |
@@ -2,7 +2,7 @@ | |||
#include <dds/catalog/catalog.hpp> | |||
#include <dds/error/errors.hpp> | |||
#include <dds/repo/repo.hpp> | |||
#include <dds/pkg/cache.hpp> | |||
#include <dds/util/log.hpp> | |||
#include <dds/util/parallel.hpp> | |||
@@ -55,7 +55,7 @@ temporary_sdist dds::get_package_sdist(const package_info& pkg) { | |||
return tsd; | |||
} | |||
void dds::get_all(const std::vector<package_id>& pkgs, repository& repo, const catalog& cat) { | |||
void dds::get_all(const std::vector<package_id>& pkgs, pkg_cache& repo, const catalog& cat) { | |||
std::mutex repo_mut; | |||
auto absent_pkg_infos = pkgs // |
@@ -5,12 +5,12 @@ | |||
namespace dds { | |||
class repository; | |||
class pkg_cache; | |||
class catalog; | |||
struct package_info; | |||
temporary_sdist get_package_sdist(const package_info&); | |||
void get_all(const std::vector<package_id>& pkgs, dds::repository& repo, const catalog& cat); | |||
void get_all(const std::vector<package_id>& pkgs, dds::pkg_cache& repo, const catalog& cat); | |||
} // namespace dds |
@@ -2,7 +2,7 @@ | |||
#include <dds/catalog/catalog.hpp> | |||
#include <dds/catalog/get.hpp> | |||
#include <dds/repo/repo.hpp> | |||
#include <dds/pkg/cache.hpp> | |||
using namespace dds; | |||
@@ -17,16 +17,16 @@ builder dds::cli::create_project_builder(const dds::cli::options& opts) { | |||
auto man = package_manifest::load_from_directory(opts.project_dir).value_or(package_manifest{}); | |||
auto cat_path = opts.pkg_db_dir.value_or(catalog::default_path()); | |||
auto repo_path = opts.pkg_cache_dir.value_or(repository::default_local_path()); | |||
auto repo_path = opts.pkg_cache_dir.value_or(pkg_cache::default_local_path()); | |||
builder builder; | |||
if (!opts.build.lm_index.has_value()) { | |||
auto cat = catalog::open(cat_path); | |||
// Build the dependencies | |||
repository::with_repository( // | |||
pkg_cache::with_cache( // | |||
repo_path, | |||
repo_flags::write_lock | repo_flags::create_if_absent, | |||
[&](repository repo) { | |||
pkg_cache_flags::write_lock | pkg_cache_flags::create_if_absent, | |||
[&](pkg_cache repo) { | |||
// Download dependencies | |||
auto deps = repo.solve(man.dependencies, cat); | |||
get_all(deps, repo, cat); |
@@ -3,7 +3,7 @@ | |||
#include <dds/build/builder.hpp> | |||
#include <dds/build/params.hpp> | |||
#include <dds/catalog/get.hpp> | |||
#include <dds/repo/repo.hpp> | |||
#include <dds/pkg/cache.hpp> | |||
#include <range/v3/action/join.hpp> | |||
#include <range/v3/range/conversion.hpp> | |||
@@ -38,10 +38,10 @@ int build_deps(const options& opts) { | |||
auto all_deps = ranges::views::concat(all_file_deps, cmd_deps) | ranges::to_vector; | |||
auto cat = opts.open_catalog(); | |||
dds::repository::with_repository( // | |||
opts.pkg_cache_dir.value_or(repository::default_local_path()), | |||
dds::repo_flags::write_lock | dds::repo_flags::create_if_absent, | |||
[&](dds::repository repo) { | |||
dds::pkg_cache::with_cache( // | |||
opts.pkg_cache_dir.value_or(pkg_cache::default_local_path()), | |||
dds::pkg_cache_flags::write_lock | dds::pkg_cache_flags::create_if_absent, | |||
[&](dds::pkg_cache repo) { | |||
// Download dependencies | |||
dds_log(info, "Loading {} dependencies", all_deps.size()); | |||
auto deps = repo.solve(all_deps, cat); |
@@ -1,7 +1,7 @@ | |||
#include "../options.hpp" | |||
#include <dds/http/session.hpp> | |||
#include <dds/repo/repo.hpp> | |||
#include <dds/pkg/cache.hpp> | |||
#include <dds/source/dist.hpp> | |||
#include <dds/util/result.hpp> | |||
@@ -15,9 +15,9 @@ | |||
namespace dds::cli::cmd { | |||
static int _pkg_import(const options& opts) { | |||
return repository::with_repository( // | |||
opts.pkg_cache_dir.value_or(repository::default_local_path()), | |||
repo_flags::write_lock | repo_flags::create_if_absent, | |||
return pkg_cache::with_cache( // | |||
opts.pkg_cache_dir.value_or(pkg_cache::default_local_path()), | |||
pkg_cache_flags::write_lock | pkg_cache_flags::create_if_absent, | |||
[&](auto repo) { | |||
for (std::string_view tgz_where : opts.pkg.import.items) { | |||
neo_assertion_breadcrumbs("Importing sdist", tgz_where); |
@@ -1,6 +1,6 @@ | |||
#include "../options.hpp" | |||
#include <dds/repo/repo.hpp> | |||
#include <dds/pkg/cache.hpp> | |||
#include <dds/source/dist.hpp> | |||
#include <dds/util/result.hpp> | |||
@@ -15,7 +15,7 @@ | |||
namespace dds::cli::cmd { | |||
static int _pkg_ls(const options& opts) { | |||
auto list_contents = [&](repository repo) { | |||
auto list_contents = [&](pkg_cache repo) { | |||
auto same_name | |||
= [](auto&& a, auto&& b) { return a.manifest.pkg_id.name == b.manifest.pkg_id.name; }; | |||
@@ -38,10 +38,10 @@ static int _pkg_ls(const options& opts) { | |||
return 0; | |||
}; | |||
return dds::repository::with_repository(opts.pkg_cache_dir.value_or( | |||
repository::default_local_path()), | |||
dds::repo_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) { |
@@ -1,4 +1,4 @@ | |||
#include "./repo.hpp" | |||
#include "./cache.hpp" | |||
#include <dds/catalog/catalog.hpp> | |||
#include <dds/error/errors.hpp> | |||
@@ -20,16 +20,16 @@ using namespace dds; | |||
using namespace ranges; | |||
void repository::_log_blocking(path_ref dirpath) noexcept { | |||
dds_log(warn, "Another process has the repository directory locked [{}]", dirpath.string()); | |||
dds_log(warn, "Waiting for repository to be released..."); | |||
void pkg_cache::_log_blocking(path_ref dirpath) noexcept { | |||
dds_log(warn, "Another process has the package cache directory locked [{}]", dirpath.string()); | |||
dds_log(warn, "Waiting for cache to be released..."); | |||
} | |||
void repository::_init_repo_dir(path_ref dirpath) noexcept { fs::create_directories(dirpath); } | |||
void pkg_cache::_init_cache_dir(path_ref dirpath) noexcept { fs::create_directories(dirpath); } | |||
fs::path repository::default_local_path() noexcept { return dds_data_dir() / "repo"; } | |||
fs::path pkg_cache::default_local_path() noexcept { return dds_data_dir() / "pkg"; } | |||
repository repository::_open_for_directory(bool writeable, path_ref dirpath) { | |||
pkg_cache pkg_cache::_open_for_directory(bool writeable, path_ref dirpath) { | |||
auto try_read_sdist = [](path_ref p) -> std::optional<sdist> { | |||
if (starts_with(p.filename().string(), ".")) { | |||
return std::nullopt; | |||
@@ -59,20 +59,19 @@ repository repository::_open_for_directory(bool writeable, path_ref dirpath) { | |||
return {writeable, dirpath, std::move(entries)}; | |||
} | |||
void repository::add_sdist(const sdist& sd, if_exists ife_action) { | |||
void pkg_cache::add_sdist(const sdist& sd, if_exists ife_action) { | |||
neo_assertion_breadcrumbs("Importing sdist archive", sd.manifest.pkg_id.to_string()); | |||
if (!_write_enabled) { | |||
dds_log( | |||
critical, | |||
"DDS attempted to write into a repository that wasn't opened with a write-lock. This " | |||
"is a hard bug and should be reported. For the safety and integrity of the local " | |||
"repository, we'll hard-exit immediately."); | |||
dds_log(critical, | |||
"DDS attempted to write into a cache that wasn't opened with a write-lock. This " | |||
"is a hard bug and should be reported. For the safety and integrity of the local " | |||
"cache, we'll hard-exit immediately."); | |||
std::terminate(); | |||
} | |||
auto sd_dest = _root / sd.manifest.pkg_id.to_string(); | |||
if (fs::exists(sd_dest)) { | |||
auto msg = fmt:: | |||
format("Package '{}' (Importing from [{}]) is already available in the local repo", | |||
format("Package '{}' (Importing from [{}]) is already available in the local cache", | |||
sd.manifest.pkg_id.to_string(), | |||
sd.path.string()); | |||
if (ife_action == if_exists::throw_exc) { | |||
@@ -99,7 +98,7 @@ void repository::add_sdist(const sdist& sd, if_exists ife_action) { | |||
dds_log(info, "Source distribution '{}' successfully exported", sd.manifest.pkg_id.to_string()); | |||
} | |||
const sdist* repository::find(const package_id& pkg) const noexcept { | |||
const sdist* pkg_cache::find(const package_id& pkg) const noexcept { | |||
auto found = _sdists.find(pkg); | |||
if (found == _sdists.end()) { | |||
return nullptr; | |||
@@ -107,8 +106,8 @@ const sdist* repository::find(const package_id& pkg) const noexcept { | |||
return &*found; | |||
} | |||
std::vector<package_id> repository::solve(const std::vector<dependency>& deps, | |||
const catalog& ctlg) const { | |||
std::vector<package_id> pkg_cache::solve(const std::vector<dependency>& deps, | |||
const catalog& ctlg) const { | |||
return dds::solve( | |||
deps, | |||
[&](std::string_view name) -> std::vector<package_id> { |
@@ -15,7 +15,7 @@ | |||
namespace dds { | |||
enum repo_flags { | |||
enum pkg_cache_flags { | |||
none = 0b00, | |||
read = none, | |||
create_if_absent = 0b01, | |||
@@ -28,40 +28,40 @@ enum class if_exists { | |||
ignore, | |||
}; | |||
inline repo_flags operator|(repo_flags a, repo_flags b) { | |||
return static_cast<repo_flags>(int(a) | int(b)); | |||
inline pkg_cache_flags operator|(pkg_cache_flags a, pkg_cache_flags b) { | |||
return static_cast<pkg_cache_flags>(int(a) | int(b)); | |||
} | |||
class repository { | |||
class pkg_cache { | |||
using sdist_set = std::set<sdist, sdist_compare_t>; | |||
bool _write_enabled = false; | |||
fs::path _root; | |||
sdist_set _sdists; | |||
repository(bool writeable, path_ref p, sdist_set sds) | |||
pkg_cache(bool writeable, path_ref p, sdist_set sds) | |||
: _write_enabled(writeable) | |||
, _root(p) | |||
, _sdists(std::move(sds)) {} | |||
static void _log_blocking(path_ref dir) noexcept; | |||
static void _init_repo_dir(path_ref dir) noexcept; | |||
static repository _open_for_directory(bool writeable, path_ref); | |||
static void _log_blocking(path_ref dir) noexcept; | |||
static void _init_cache_dir(path_ref dir) noexcept; | |||
static pkg_cache _open_for_directory(bool writeable, path_ref); | |||
public: | |||
template <typename Func> | |||
static decltype(auto) with_repository(path_ref dirpath, repo_flags flags, Func&& fn) { | |||
static decltype(auto) with_cache(path_ref dirpath, pkg_cache_flags flags, Func&& fn) { | |||
if (!fs::exists(dirpath)) { | |||
if (flags & repo_flags::create_if_absent) { | |||
_init_repo_dir(dirpath); | |||
if (flags & pkg_cache_flags::create_if_absent) { | |||
_init_cache_dir(dirpath); | |||
} | |||
} | |||
shared_file_mutex mut{dirpath / ".dds-repo-lock"}; | |||
shared_file_mutex mut{dirpath / ".dds-cache-lock"}; | |||
std::shared_lock shared_lk{mut, std::defer_lock}; | |||
std::unique_lock excl_lk{mut, std::defer_lock}; | |||
bool writeable = (flags & repo_flags::write_lock) != repo_flags::none; | |||
bool writeable = (flags & pkg_cache_flags::write_lock) != pkg_cache_flags::none; | |||
if (writeable) { | |||
if (!excl_lk.try_lock()) { | |||
@@ -75,8 +75,8 @@ public: | |||
} | |||
} | |||
auto repo = _open_for_directory(writeable, dirpath); | |||
return std::invoke(NEO_FWD(fn), std::move(repo)); | |||
auto cache = _open_for_directory(writeable, dirpath); | |||
return std::invoke(NEO_FWD(fn), std::move(cache)); | |||
} | |||
static fs::path default_local_path() noexcept; |