[M5+] use devbox attr_paths for pinned-dep nixpkgs attr

This commit is contained in:
2026-05-10 13:06:35 +00:00
parent 935e8d5f79
commit 1604b1d5a8
6 changed files with 86 additions and 27 deletions

View File

@@ -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());
}

View File

@@ -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,
});