Module records and aliases

Installation records what a module reports about itself. dpm_install_module
opens a module once, writes its version and description to a .meta file in
/var/lib/dpm/metadata/, and records the alternate names it declared in
modules.aliases beside it. dpm_uninstall_module removes both, leaving the
module file in place.

dpm_list_modules reads those records and opens no module. A module with no
record lists with a version of <uninstalled> and still loads when a caller
names it. An unreadable or absent metadata directory costs the listing its
detail and costs nothing else.

Aliases give a module alternate names, declared through the new
dpm_module_aliases contract symbol or added with dpm_add_module_alias. A
name is recorded once: one already serving as an alias, or belonging to an
installed module, is refused rather than repointed. dpm_require matches a
name against the installed modules, then the alias table, then the module
path.

The metadata directory is a fifth override field and the -M flag, and
[modules] metadata in core.conf.

The test suite is four binaries covering context, modules, records, and
aliases, each a ctest case of its own, alongside the CLI cases.
This commit is contained in:
2026-08-24 03:51:39 -04:00
parent 71d409b5c7
commit 0291e61fd8
32 changed files with 2147 additions and 290 deletions

View File

@@ -28,6 +28,7 @@
#include <memory>
#include <string>
#include "internal/metadata.hpp"
#include "internal/modules.hpp"
/** @brief A libdpm-core.so context: configuration, logging, module registry */
@@ -38,6 +39,9 @@ struct dpm_ctx {
/** Directory modules are loaded from. */
std::string module_path;
/** Directory the .meta records and modules.aliases were read from. */
std::string metadata_dir;
/** Target root for package operations. */
std::string root;
@@ -58,6 +62,15 @@ struct dpm_ctx {
/** Validated modules keyed by name; each is loaded at most once. */
std::map<std::string, std::unique_ptr<dpm_module>> modules;
/** Records of installed modules, keyed by module name. */
std::map<std::string, dpm_module_meta_records> meta_records;
/** Placeholder records a listing reports for modules carrying none. */
std::map<std::string, dpm_module_meta_records> uninstalled;
/** Alternate module names, keyed by alias. */
std::map<std::string, std::string> aliases;
/** Reason for the most recent failure. */
std::string last_error;
};