fix(tvix/cli): panic on root cause of the fetchurl(non-boot) bug

Currently we produce wrong drvPaths for a large number of packages
that use fetchurl (but not fetchurlBoot, which is what stdenv uses).
A simple reproducer is `pkgs.perl538`.

I debugged this down to the root cause, which is the fact that tvix
doesn't realize that the mapping from FOD-paths to outputHash is
*NOT* a 1:1 mapping.  It is a many-to-one mapping.  You can have
lots of different FODs with the same outputHash or even the same
outPath.  For example, perl538.src and perldevel.src use the same
source tarball but a different `version`.

Anyways, I have found the root cause but have run out of time for a
while, so I've added a panic!() to in the spot where we have a logic
bug in order to call it out.

Change-Id: I9766b39cfe2fe7eafec84945b2ad6cc28f9c4b7d
Reviewed-on: https://cl.tvl.fyi/c/depot/+/9364
Reviewed-by: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
Autosubmit: Adam Joseph <adam@westernsemico.com>
This commit is contained in:
Adam Joseph 2023-09-18 03:47:29 -07:00 committed by clbot
parent efaff79584
commit 2b4920c355

View file

@ -93,7 +93,33 @@ impl KnownPaths {
match (path_kind, &mut entry.get_mut().kind) { match (path_kind, &mut entry.get_mut().kind) {
// These variant combinations require no "merging action". // These variant combinations require no "merging action".
(PathKind::Plain, PathKind::Plain) => (), (PathKind::Plain, PathKind::Plain) => (),
(PathKind::Output { .. }, PathKind::Output { .. }) => (),
(
PathKind::Output {
name: name1,
derivation: drv1,
},
PathKind::Output {
name: ref name2,
derivation: ref drv2,
},
) => {
#[cfg(debug_assertions)]
{
if &name1 != name2 {
panic!(
"inserted path {} with two different names: {} and {}",
path, name1, name2
);
}
if &drv1 != drv2 {
panic!(
"inserted path {} with two different derivations: {} and {}",
path, drv1, drv2
);
}
}
}
( (
PathKind::Derivation { output_names: new }, PathKind::Derivation { output_names: new },