@@ -34,7 +34,27 @@ use crate::{Installable, LockError, RequiresPython};
34
34
35
35
#[ derive( Debug , thiserror:: Error ) ]
36
36
pub enum PylockTomlError {
37
- #[ error( "`packages` entry for `{0}` must contain one of: `wheels`, `directory`, `archive`, `sdist`, or `vcs`" ) ]
37
+ #[ error( "Package `{0}` includes both a registry (`packages.wheels`) and a directory source (`packages.directory`)" ) ]
38
+ WheelWithDirectory ( PackageName ) ,
39
+ #[ error( "Package `{0}` includes both a registry (`packages.wheels`) and a VCS source (`packages.vcs`)" ) ]
40
+ WheelWithVcs ( PackageName ) ,
41
+ #[ error( "Package `{0}` includes both a registry (`packages.wheels`) and an archive source (`packages.archive`)" ) ]
42
+ WheelWithArchive ( PackageName ) ,
43
+ #[ error( "Package `{0}` includes both a registry (`packages.sdist`) and a directory source (`packages.directory`)" ) ]
44
+ SdistWithDirectory ( PackageName ) ,
45
+ #[ error( "Package `{0}` includes both a registry (`packages.sdist`) and a VCS source (`packages.vcs`)" ) ]
46
+ SdistWithVcs ( PackageName ) ,
47
+ #[ error( "Package `{0}` includes both a registry (`packages.sdist`) and an archive source (`packages.archive`)" ) ]
48
+ SdistWithArchive ( PackageName ) ,
49
+ #[ error( "Package `{0}` includes both a directory (`packages.directory`) and a VCS source (`packages.vcs`)" ) ]
50
+ DirectoryWithVcs ( PackageName ) ,
51
+ #[ error( "Package `{0}` includes both a directory (`packages.directory`) and an archive source (`packages.archive`)" ) ]
52
+ DirectoryWithArchive ( PackageName ) ,
53
+ #[ error( "Package `{0}` includes both a VCS (`packages.vcs`) and an archive source (`packages.archive`)" ) ]
54
+ VcsWithArchive ( PackageName ) ,
55
+ #[ error(
56
+ "Package `{0}` must include one of: `wheels`, `directory`, `archive`, `sdist`, or `vcs`"
57
+ ) ]
38
58
MissingSource ( PackageName ) ,
39
59
#[ error( "`packages.wheel` entry for `{0}` must have a `path` or `url`" ) ]
40
60
WheelMissingPathUrl ( PackageName ) ,
@@ -538,6 +558,47 @@ impl<'lock> PylockToml {
538
558
let root = graph. add_node ( Node :: Root ) ;
539
559
540
560
for package in self . packages {
561
+ match (
562
+ package. wheels . is_some ( ) ,
563
+ package. sdist . is_some ( ) ,
564
+ package. directory . is_some ( ) ,
565
+ package. vcs . is_some ( ) ,
566
+ package. archive . is_some ( ) ,
567
+ ) {
568
+ // `packages.wheels` is mutually exclusive with `packages.directory`, `packages.vcs`, and `packages.archive`.
569
+ ( true , _, true , _, _) => {
570
+ return Err ( PylockTomlError :: WheelWithDirectory ( package. name . clone ( ) ) ) ;
571
+ }
572
+ ( true , _, _, true , _) => {
573
+ return Err ( PylockTomlError :: WheelWithVcs ( package. name . clone ( ) ) ) ;
574
+ }
575
+ ( true , _, _, _, true ) => {
576
+ return Err ( PylockTomlError :: WheelWithArchive ( package. name . clone ( ) ) ) ;
577
+ }
578
+ // `packages.sdist` is mutually exclusive with `packages.directory`, `packages.vcs`, and `packages.archive`.
579
+ ( _, true , true , _, _) => {
580
+ return Err ( PylockTomlError :: SdistWithDirectory ( package. name . clone ( ) ) ) ;
581
+ }
582
+ ( _, true , _, true , _) => {
583
+ return Err ( PylockTomlError :: SdistWithVcs ( package. name . clone ( ) ) ) ;
584
+ }
585
+ ( _, true , _, _, true ) => {
586
+ return Err ( PylockTomlError :: SdistWithArchive ( package. name . clone ( ) ) ) ;
587
+ }
588
+ // `packages.directory` is mutually exclusive with `packages.vcs`, and `packages.archive`.
589
+ ( _, _, true , true , _) => {
590
+ return Err ( PylockTomlError :: DirectoryWithVcs ( package. name . clone ( ) ) ) ;
591
+ }
592
+ ( _, _, true , _, true ) => {
593
+ return Err ( PylockTomlError :: DirectoryWithArchive ( package. name . clone ( ) ) ) ;
594
+ }
595
+ // `packages.vcs` is mutually exclusive with `packages.archive`.
596
+ ( _, _, _, true , true ) => {
597
+ return Err ( PylockTomlError :: VcsWithArchive ( package. name . clone ( ) ) ) ;
598
+ }
599
+ _ => { }
600
+ }
601
+
541
602
// Omit packages that aren't relevant to the current environment.
542
603
let install = package. marker . evaluate ( markers, & [ ] ) ;
543
604
0 commit comments