[M5+] use devbox attr_paths for pinned-dep nixpkgs attr
This commit is contained in:
@@ -38,7 +38,8 @@ auto recipe_already_known(const std::string& name, const std::string& version,
|
||||
// Overwrites any existing entry for the same (name, version). Other
|
||||
// lockfile entries (root package, sibling deps) are preserved verbatim.
|
||||
auto record_lockfile_rev(const fs::path& project_root, const std::string& name,
|
||||
const std::string& version, const std::string& rev)
|
||||
const std::string& version,
|
||||
const resolver::ResolvedVersion& resolved)
|
||||
-> util::Result<void> {
|
||||
const auto lock_path = project_root / "Cargoxx.lock";
|
||||
lockfile::Lockfile lock;
|
||||
@@ -56,7 +57,8 @@ auto record_lockfile_rev(const fs::path& project_root, const std::string& name,
|
||||
bool replaced = false;
|
||||
for (auto& p : lock.packages) {
|
||||
if (p.name == name && p.version == version) {
|
||||
p.nixpkgs_rev = rev;
|
||||
p.nixpkgs_rev = resolved.nixpkgs_rev;
|
||||
p.nixpkgs_attr = resolved.nixpkgs_attr;
|
||||
replaced = true;
|
||||
break;
|
||||
}
|
||||
@@ -66,8 +68,8 @@ auto record_lockfile_rev(const fs::path& project_root, const std::string& name,
|
||||
.name = name,
|
||||
.version = version,
|
||||
.dependencies = {},
|
||||
.nixpkgs_attr = std::nullopt,
|
||||
.nixpkgs_rev = rev,
|
||||
.nixpkgs_attr = resolved.nixpkgs_attr,
|
||||
.nixpkgs_rev = resolved.nixpkgs_rev,
|
||||
.linkdb_source = std::nullopt,
|
||||
});
|
||||
}
|
||||
@@ -169,13 +171,13 @@ auto cmd_add(const fs::path& project_root, const std::string& name,
|
||||
const bool wildcard = effective_version == "*";
|
||||
auto* env = std::getenv("CARGOXX_NO_AUTORESOLVE");
|
||||
const bool autoresolve_disabled = env != nullptr && *env != 0;
|
||||
std::optional<std::string> resolved_rev;
|
||||
std::optional<resolver::ResolvedVersion> resolved;
|
||||
if (!wildcard && !autoresolve_disabled) {
|
||||
auto rev = resolver::resolve_version(name, effective_version);
|
||||
if (!rev) {
|
||||
return std::unexpected(rev.error());
|
||||
auto r = resolver::resolve_version(name, effective_version);
|
||||
if (!r) {
|
||||
return std::unexpected(r.error());
|
||||
}
|
||||
resolved_rev = std::move(*rev);
|
||||
resolved = std::move(*r);
|
||||
}
|
||||
|
||||
m->dependencies.push_back(manifest::Dependency{
|
||||
@@ -188,9 +190,9 @@ auto cmd_add(const fs::path& project_root, const std::string& name,
|
||||
return std::unexpected(r.error());
|
||||
}
|
||||
|
||||
if (resolved_rev) {
|
||||
if (resolved) {
|
||||
if (auto r = record_lockfile_rev(project_root, name, effective_version,
|
||||
*resolved_rev);
|
||||
*resolved);
|
||||
!r) {
|
||||
return std::unexpected(r.error());
|
||||
}
|
||||
|
||||
@@ -75,14 +75,23 @@ auto merge_lockfile(const manifest::Manifest& m,
|
||||
const auto& dep = m.dependencies[i];
|
||||
const auto& rec = recipes[i];
|
||||
std::optional<std::string> rev;
|
||||
// The recipe's nixpkgs_attr is correct for unpinned deps (it's
|
||||
// curated against nixos-unstable). When the prior lockfile
|
||||
// already carries an attr — written by `cargoxx add <pkg>@<v>`
|
||||
// from devbox's authoritative attr_paths for the pinned rev —
|
||||
// that one wins.
|
||||
std::string attr = rec.nixpkgs_attr;
|
||||
if (auto p = find_prior(dep.name, dep.version_spec); p) {
|
||||
rev = p->nixpkgs_rev;
|
||||
if (p->nixpkgs_attr && !p->nixpkgs_attr->empty()) {
|
||||
attr = *p->nixpkgs_attr;
|
||||
}
|
||||
}
|
||||
lock.packages.push_back(lockfile::LockfilePackage{
|
||||
.name = dep.name,
|
||||
.version = dep.version_spec,
|
||||
.dependencies = {},
|
||||
.nixpkgs_attr = rec.nixpkgs_attr,
|
||||
.nixpkgs_attr = std::move(attr),
|
||||
.nixpkgs_rev = std::move(rev),
|
||||
.linkdb_source = rec.source,
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user