1
1
use super :: FILE_VERSION ;
2
2
use crate :: utils:: serde:: RawCondaPackageData ;
3
- use crate :: { Channel , EnvironmentPackageData , LockFile , PypiPackageData } ;
3
+ use crate :: { Channel , EnvironmentPackageData , LockFile , PypiPackageData , UrlOrPath } ;
4
4
use itertools:: Itertools ;
5
5
use pep508_rs:: ExtraName ;
6
6
use rattler_conda_types:: Platform ;
7
7
use serde:: { Serialize , Serializer } ;
8
+ use std:: borrow:: Cow ;
8
9
use std:: collections:: { BTreeSet , HashSet } ;
9
10
use std:: { cmp:: Ordering , collections:: BTreeMap } ;
10
11
use url:: Url ;
@@ -37,17 +38,19 @@ enum SerializablePackageSelector<'a> {
37
38
conda : & ' a Url ,
38
39
} ,
39
40
Pypi {
40
- pypi : & ' a Url ,
41
+ pypi : & ' a UrlOrPath ,
41
42
#[ serde( skip_serializing_if = "BTreeSet::is_empty" ) ]
42
43
extras : & ' a BTreeSet < ExtraName > ,
43
44
} ,
44
45
}
45
46
46
47
impl < ' a > SerializablePackageSelector < ' a > {
47
- fn url ( & self ) -> & Url {
48
+ fn url ( & self ) -> Cow < ' _ , UrlOrPath > {
48
49
match self {
49
- SerializablePackageSelector :: Conda { conda } => conda,
50
- SerializablePackageSelector :: Pypi { pypi, .. } => pypi,
50
+ SerializablePackageSelector :: Conda { conda } => {
51
+ Cow :: Owned ( UrlOrPath :: Url ( ( * conda) . clone ( ) ) )
52
+ }
53
+ SerializablePackageSelector :: Pypi { pypi, .. } => Cow :: Borrowed ( pypi) ,
51
54
}
52
55
}
53
56
}
@@ -78,34 +81,41 @@ impl<'a> Ord for SerializablePackageSelector<'a> {
78
81
(
79
82
SerializablePackageSelector :: Conda { conda : a } ,
80
83
SerializablePackageSelector :: Conda { conda : b } ,
81
- )
82
- | (
84
+ ) => compare_url_by_filename ( a , b ) ,
85
+ (
83
86
SerializablePackageSelector :: Pypi { pypi : a, .. } ,
84
87
SerializablePackageSelector :: Pypi { pypi : b, .. } ,
85
- ) => {
86
- // First sort packages just by their filename. Since most of the time the urls end
87
- // in the packages filename this causes the urls to be sorted by package name.
88
- if let ( Some ( a) , Some ( b) ) = (
89
- a. path_segments ( )
90
- . and_then ( Iterator :: last)
91
- . map ( str:: to_lowercase) ,
92
- b. path_segments ( )
93
- . and_then ( Iterator :: last)
94
- . map ( str:: to_lowercase) ,
95
- ) {
96
- match a. cmp ( & b) {
97
- Ordering :: Equal => { }
98
- ordering => return ordering,
99
- }
100
- }
101
-
102
- // Otherwise just sort by their full URL
103
- a. cmp ( b)
104
- }
88
+ ) => match ( a, b) {
89
+ ( UrlOrPath :: Url ( a) , UrlOrPath :: Url ( b) ) => compare_url_by_filename ( a, b) ,
90
+ ( UrlOrPath :: Url ( _) , UrlOrPath :: Path ( _) ) => Ordering :: Less ,
91
+ ( UrlOrPath :: Path ( _) , UrlOrPath :: Url ( _) ) => Ordering :: Greater ,
92
+ ( UrlOrPath :: Path ( a) , UrlOrPath :: Path ( b) ) => a. cmp ( b) ,
93
+ } ,
105
94
}
106
95
}
107
96
}
108
97
98
+ /// First sort packages just by their filename. Since most of the time the urls end
99
+ /// in the packages filename this causes the urls to be sorted by package name.
100
+ fn compare_url_by_filename ( a : & Url , b : & Url ) -> Ordering {
101
+ if let ( Some ( a) , Some ( b) ) = (
102
+ a. path_segments ( )
103
+ . and_then ( Iterator :: last)
104
+ . map ( str:: to_lowercase) ,
105
+ b. path_segments ( )
106
+ . and_then ( Iterator :: last)
107
+ . map ( str:: to_lowercase) ,
108
+ ) {
109
+ match a. cmp ( & b) {
110
+ Ordering :: Equal => { }
111
+ ordering => return ordering,
112
+ }
113
+ }
114
+
115
+ // Otherwise just sort by their full URL
116
+ a. cmp ( b)
117
+ }
118
+
109
119
impl < ' a > SerializablePackageData < ' a > {
110
120
fn source_name ( & self ) -> & str {
111
121
match self {
@@ -114,10 +124,12 @@ impl<'a> SerializablePackageData<'a> {
114
124
}
115
125
}
116
126
117
- fn url ( & self ) -> & Url {
127
+ fn url ( & self ) -> Cow < ' _ , UrlOrPath > {
118
128
match self {
119
- SerializablePackageData :: Conda ( p) => & p. url ,
120
- SerializablePackageData :: Pypi ( p) => & p. url ,
129
+ SerializablePackageData :: Conda ( p) => {
130
+ Cow :: Owned ( UrlOrPath :: Url ( p. url . clone ( ) . into_owned ( ) ) )
131
+ }
132
+ SerializablePackageData :: Pypi ( p) => Cow :: Borrowed ( & p. url_or_path ) ,
121
133
}
122
134
}
123
135
}
@@ -197,7 +209,7 @@ impl Serialize for LockFile {
197
209
. pypi_environment_package_datas
198
210
[ pypi_runtime_index] ;
199
211
SerializablePackageSelector :: Pypi {
200
- pypi : & pypi_package. url ,
212
+ pypi : & pypi_package. url_or_path ,
201
213
extras : & pypi_runtime. extras ,
202
214
}
203
215
}
0 commit comments