@@ -126,6 +126,64 @@ function Get-PackagesToBuild() {
126
126
return $buildOrder
127
127
}
128
128
129
+ # https://doc.rust-lang.org/cargo/reference/registry-web-api.html#publish
130
+ # https://github.com/rust-lang/cargo/blob/5c87c14f9a162daf10d4133fdaab35c72d67b018/crates/crates-io/lib.rs#L42
131
+ function Get-ApiMetadata ($package ) {
132
+ $packagePath = Split-Path - Path $package.manifest_path - Parent
133
+ $readmePath = $package.readme ? (Join-Path - Path $packagePath - ChildPath $package.readme ) : $null
134
+
135
+ $jsonBody = [ordered ]@ {
136
+ ' name' = $package.name
137
+ ' vers' = $package.version
138
+ ' deps' = @ ()
139
+ ' features' = $package.features
140
+ ' authors' = $package.authors
141
+ ' description' = $package.description
142
+ ' documentation' = $package.documentation
143
+ ' homepage' = $package.homepage
144
+ ' readme' = if ($readmePath -and (Test-Path - Path $readmePath )) {
145
+ Get-Content - Path $readmePath - Raw
146
+ }
147
+ else {
148
+ $null
149
+ }
150
+ ' readme_file' = $package.readme
151
+ ' keywords' = $package.keywords
152
+ ' categories' = $package.categories
153
+ ' license' = $package.license
154
+ ' license_file' = $package.license_file
155
+ ' repository' = $package.repository
156
+ ' links' = $package.links
157
+ ' rust_version' = $package.rust_version
158
+ }
159
+
160
+ foreach ($dependency in $package.dependencies ) {
161
+ $jsonBody.deps += @ {
162
+ ' name' = $dependency.name
163
+ ' version_req' = $dependency.req
164
+ ' features' = $dependency.features
165
+ ' optional' = $dependency.optional
166
+ ' default_features' = $dependency.default_features
167
+ ' target' = $dependency.target
168
+ ' kind' = $dependency.kind
169
+ ' explicit_name_in_toml' = $dependency.rename
170
+ }
171
+ }
172
+
173
+ return $jsonBody
174
+ }
175
+
176
+ function New-ApiPutFile ($crateMetadata , $crateFilePath ) {
177
+ $metadataBytes = [Text.Encoding ]::Utf8.GetBytes($crateMetadata )
178
+ $metadataLengthBytes = [BitConverter ]::GetBytes([UInt32 ]$metadataBytes.Length )
179
+ $crateBytes = [IO.File ]::ReadAllBytes($crateFilePath )
180
+ $crateLengthBytes = [BitConverter ]::GetBytes([UInt32 ]$crateBytes.Length )
181
+
182
+ $bytes += $metadataLengthBytes + $metadataBytes + $crateLengthBytes + $crateBytes
183
+
184
+ return $bytes
185
+ }
186
+
129
187
Push-Location $RepoRoot
130
188
try {
131
189
[array ]$packages = Get-PackagesToBuild
@@ -159,27 +217,38 @@ try {
159
217
}
160
218
161
219
foreach ($package in $packages ) {
220
+ Write-Host " `n Processing package '$ ( $package.name ) '"
162
221
$packageName = $package.name
163
222
$packageVersion = $package.version
164
223
165
224
if ($OutputPath -and $package.OutputPackage ) {
166
- $crateFilePath = " $RepoRoot /target/package/$packageName -$packageVersion .crate"
225
+ $sourceCrateFile = " $RepoRoot /target/package/$packageName -$packageVersion .crate"
226
+
167
227
$targetDirectory = " $OutputPath /$packageName "
228
+ $targetCrateFile = " $OutputPath /$packageName -$packageVersion .crate"
229
+ $targetJsonFile = " $OutputPath /$packageName -$packageVersion .json"
230
+ $targetBinFile = " $OutputPath /$packageName .bin"
168
231
169
232
if (Test-Path $targetDirectory ) {
170
233
Write-Host " Removing existing directory '$targetDirectory '"
171
234
Remove-Item - Path $targetDirectory - Recurse - Force
172
235
}
236
+ New-Item - ItemType Directory - Path $targetDirectory - Force | Out-Null
173
237
174
- Write-Host " Copying crate ' $crateFilePath ' to '$OutputPath '"
175
- Copy-Item - Path $crateFilePath - Destination $OutputPath - Force
238
+ Write-Host " Copying crate file to '$targetCrateFile '"
239
+ Copy-Item - Path $sourceCrateFile - Destination $targetCrateFile - Force
176
240
177
- Write-Host " Exctracting crate '$crateFilePath ' to '$targetDirectory '"
178
- New-Item - ItemType Directory - Path $targetDirectory - Force | Out-Null
179
- tar - xf $crateFilePath -- directory $targetDirectory -- strip- components= 1
241
+ $crateMetadata = Get-ApiMetadata $package | ConvertTo-Json - Depth 10
242
+
243
+ Write-Host " Writing crates.io request metadata to '$targetJsonFile '"
244
+ $crateMetadata | Out-File - FilePath " $targetJsonFile " - Encoding utf8
245
+
246
+ $uploadBytes = New-ApiPutFile $crateMetadata $sourceCrateFile
247
+ Write-Host " Writing crates.io request bundle to '$targetBinFile '"
248
+ [IO.File ]::WriteAllBytes($targetBinFile , $uploadBytes )
180
249
181
- # Remove Cargo.toml.orig from the extracted directory
182
- Remove-Item - Path " $targetDirectory /Cargo.toml.orig " - Force - ErrorAction SilentlyContinue
250
+ Write-Host " Exctracting crate file to ' $targetDirectory ' "
251
+ tar - xf $sourceCrateFile -- directory $targetDirectory -- strip - components = 1
183
252
}
184
253
}
185
254
}
0 commit comments