@@ -88,66 +88,136 @@ impl Wasmer {
88
88
) -> Result < PublishPackageOutput , Error > {
89
89
let client = Wasmer :: get_client ( ) ?;
90
90
91
- if wasmer_api:: query:: get_package_release ( client, hash)
92
- . await ?
93
- . is_some ( )
91
+ let ( id, hash) = if let Some ( release) =
92
+ wasmer_api:: query:: get_package_release ( client, hash) . await ?
94
93
{
95
- // The package was already published.
96
- return Ok ( PublishPackageOutput {
97
- manifest : serde_wasm_bindgen:: to_value ( & manifest)
98
- . map_err ( |e| anyhow:: anyhow!( "{e:?}" ) ) ?,
99
- hash : hash. to_string ( ) ,
100
- } ) ;
101
- }
94
+ ( release. id , release. webc_v3 . map ( |v| v. webc_sha256 ) )
95
+ } else {
96
+ let signed_url = wasmer_api:: query:: get_signed_url_for_package_upload (
97
+ client,
98
+ Some ( 60 * 30 ) ,
99
+ Some ( format ! ( "js-{}" , random( ) ) . replace ( '.' , "-" ) ) . as_deref ( ) ,
100
+ None ,
101
+ None ,
102
+ )
103
+ . await ?
104
+ . ok_or_else ( || anyhow:: anyhow!( "No signed url!" ) ) ?
105
+ . url ;
106
+
107
+ upload ( bytes, & signed_url) . await ?;
108
+
109
+ let ( namespace, name) =
110
+ if let Some ( full_name) = manifest. package . as_ref ( ) . and_then ( |p| p. name . clone ( ) ) {
111
+ let splits: Vec < String > = full_name. split ( '/' ) . map ( |s| s. to_string ( ) ) . collect ( ) ;
112
+ (
113
+ splits
114
+ . first ( )
115
+ . ok_or_else ( || anyhow:: anyhow!( "No namespace provided!" ) ) ?
116
+ . clone ( ) ,
117
+ splits. get ( 1 ) . cloned ( ) ,
118
+ )
119
+ } else {
120
+ return Err ( utils:: Error :: Rust ( anyhow:: anyhow!(
121
+ "No namespace provided!"
122
+ ) ) ) ;
123
+ } ;
124
+
125
+ tracing:: debug!( "Pushing package release..." ) ;
126
+ let out = wasmer_api:: query:: push_package_release (
127
+ client,
128
+ name. as_deref ( ) ,
129
+ & namespace,
130
+ & signed_url,
131
+ manifest. package . as_ref ( ) . map ( |p| p. private ) ,
132
+ )
133
+ . await
134
+ . map_err ( |e| anyhow:: anyhow!( "{e:?}" ) ) ?
135
+ . ok_or_else ( || anyhow:: anyhow!( "Backend returned no data!" ) ) ?;
136
+ if let Some ( package_web) = out. package_webc {
137
+ ( package_web. id , package_web. webc_v3 . map ( |v| v. webc_sha256 ) )
138
+ } else {
139
+ return Err (
140
+ anyhow:: anyhow!( "No package identifier was found, tagging failed!" ) . into ( ) ,
141
+ ) ;
142
+ }
143
+ } ;
144
+
145
+ let hash =
146
+ hash. ok_or_else ( || anyhow:: anyhow!( "No hash given for the uploaded package!" ) ) ?;
147
+
148
+ if let Some ( name) = manifest. package . as_ref ( ) . and_then ( |p| p. name . as_ref ( ) ) {
149
+ // We use a hack to deploy with unnamed packages that fills in the namespace in the
150
+ // manifest, so just checking if "name" is some is not enough. The logical solution?
151
+ // Another - smaller - hack!
152
+ let splits = name
153
+ . split ( '/' )
154
+ . filter ( |v| !v. is_empty ( ) )
155
+ . collect :: < Vec < _ > > ( ) ;
156
+
157
+ if splits. len ( ) <= 1 {
158
+ return Ok ( PublishPackageOutput {
159
+ manifest : serde_wasm_bindgen:: to_value ( & manifest)
160
+ . map_err ( |e| anyhow:: anyhow!( "{e:?}" ) ) ?,
161
+ hash,
162
+ } ) ;
163
+ }
102
164
103
- let signed_url = wasmer_api:: query:: get_signed_url_for_package_upload (
104
- client,
105
- Some ( 60 * 30 ) ,
106
- Some ( format ! ( "js-{}" , random( ) ) . replace ( '.' , "-" ) ) . as_deref ( ) ,
107
- None ,
108
- None ,
109
- )
110
- . await ?
111
- . ok_or_else ( || anyhow:: anyhow!( "No signed url!" ) ) ?
112
- . url ;
113
-
114
- upload ( bytes, & signed_url) . await ?;
115
-
116
- let ( namespace, name) =
117
- if let Some ( full_name) = manifest. package . as_ref ( ) . and_then ( |p| p. name . clone ( ) ) {
118
- let splits: Vec < String > = full_name. split ( '/' ) . map ( |s| s. to_string ( ) ) . collect ( ) ;
119
- (
120
- splits
121
- . first ( )
122
- . ok_or_else ( || anyhow:: anyhow!( "No namespace provided!" ) ) ?
123
- . clone ( ) ,
124
- splits. get ( 1 ) . cloned ( ) ,
125
- )
165
+ let version =
166
+ if let Some ( version) = manifest. package . as_ref ( ) . and_then ( |p| p. version . as_ref ( ) ) {
167
+ version. to_string ( )
168
+ } else {
169
+ return Err ( anyhow:: anyhow!( "No version provided!" ) . into ( ) ) ;
170
+ } ;
171
+
172
+ let maybe_description = manifest
173
+ . package
174
+ . as_ref ( )
175
+ . and_then ( |p| p. description . clone ( ) ) ;
176
+ let maybe_homepage = manifest. package . as_ref ( ) . and_then ( |p| p. homepage . clone ( ) ) ;
177
+ let maybe_license = manifest. package . as_ref ( ) . and_then ( |p| p. license . clone ( ) ) ;
178
+ let maybe_license_file = manifest
179
+ . package
180
+ . as_ref ( )
181
+ . and_then ( |p| p. license_file . clone ( ) )
182
+ . map ( |f| f. to_string_lossy ( ) . to_string ( ) ) ;
183
+ let maybe_readme = manifest
184
+ . package
185
+ . as_ref ( )
186
+ . and_then ( |p| p. readme . clone ( ) )
187
+ . map ( |f| f. to_string_lossy ( ) . to_string ( ) ) ;
188
+ let maybe_repository = manifest. package . as_ref ( ) . and_then ( |p| p. repository . clone ( ) ) ;
189
+
190
+ let private = if let Some ( pkg) = & manifest. package {
191
+ Some ( pkg. private )
126
192
} else {
127
- return Err ( utils:: Error :: Rust ( anyhow:: anyhow!(
128
- "No namespace provided!"
129
- ) ) ) ;
193
+ Some ( false )
130
194
} ;
131
195
132
- let out = wasmer_api:: query:: push_package_release (
133
- client,
134
- name. as_deref ( ) ,
135
- & namespace,
136
- & signed_url,
137
- manifest. package . as_ref ( ) . map ( |p| p. private ) ,
138
- )
139
- . await
140
- . map_err ( |e| anyhow:: anyhow!( "{e:?}" ) ) ?
141
- . ok_or_else ( || anyhow:: anyhow!( "Backend returned no data!" ) ) ?;
196
+ let manifest_raw = Some ( toml:: to_string ( & manifest) ?) ;
197
+
198
+ let r = wasmer_api:: query:: tag_package_release (
199
+ client,
200
+ maybe_description. as_deref ( ) ,
201
+ maybe_homepage. as_deref ( ) ,
202
+ maybe_license. as_deref ( ) ,
203
+ maybe_license_file. as_deref ( ) ,
204
+ manifest_raw. as_deref ( ) ,
205
+ name,
206
+ None ,
207
+ & id,
208
+ private,
209
+ maybe_readme. as_deref ( ) ,
210
+ maybe_repository. as_deref ( ) ,
211
+ & version,
212
+ ) ;
213
+
214
+ r. await ?;
215
+ }
142
216
143
217
Ok ( PublishPackageOutput {
144
218
manifest : serde_wasm_bindgen:: to_value ( & manifest)
145
219
. map_err ( |e| anyhow:: anyhow!( "{e:?}" ) ) ?,
146
- hash : out
147
- . package_webc
148
- . and_then ( |p| p. webc_v3 )
149
- . map ( |c| c. webc_sha256 )
150
- . ok_or_else ( || anyhow:: anyhow!( "No package was published!" ) ) ?,
220
+ hash,
151
221
} )
152
222
}
153
223
}
0 commit comments