Skip to content

Commit 03adae7

Browse files
committed
feat(package): JSON message format for --list
1 parent 3c90b68 commit 03adae7

File tree

2 files changed

+142
-7
lines changed

2 files changed

+142
-7
lines changed

Diff for: src/cargo/ops/cargo_package/mod.rs

+19-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::collections::BTreeMap;
12
use std::collections::BTreeSet;
23
use std::collections::HashMap;
34
use std::fs::{self, File};
@@ -33,6 +34,7 @@ use crate::util::HumanBytes;
3334
use crate::{drop_println, ops};
3435
use anyhow::{bail, Context as _};
3536
use cargo_util::paths;
37+
use cargo_util_schemas::messages;
3638
use flate2::{Compression, GzBuilder};
3739
use tar::{Builder, EntryType, Header, HeaderMode};
3840
use tracing::debug;
@@ -278,7 +280,23 @@ fn do_package<'a>(
278280
}
279281
}
280282
PackageMessageFormat::Json => {
281-
let _ = ws.gctx().shell().print_json(&HashMap::<(), ()>::new());
283+
let message = messages::PackageList {
284+
id: pkg.package_id().to_spec(),
285+
files: BTreeMap::from_iter(ar_files.into_iter().map(|f| {
286+
let file = match f.contents {
287+
FileContents::OnDisk(path) => messages::PackageFile::Copy { path },
288+
FileContents::Generated(
289+
GeneratedFile::Manifest(path)
290+
| GeneratedFile::Lockfile(Some(path)),
291+
) => messages::PackageFile::Generate { path: Some(path) },
292+
FileContents::Generated(
293+
GeneratedFile::VcsInfo(_) | GeneratedFile::Lockfile(None),
294+
) => messages::PackageFile::Generate { path: None },
295+
};
296+
(f.rel_path, file)
297+
})),
298+
};
299+
let _ = ws.gctx().shell().print_json(&message);
282300
}
283301
}
284302
} else {

Diff for: tests/testsuite/package_message_format.rs

+123-6
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,26 @@ fn single_package() {
117117
.with_stdout_data(
118118
str![[r#"
119119
[
120-
{}
120+
{
121+
"files": {
122+
"Cargo.lock": {
123+
"kind": "generate"
124+
},
125+
"Cargo.toml": {
126+
"kind": "generate",
127+
"path": "[ROOT]/foo/Cargo.toml"
128+
},
129+
"Cargo.toml.orig": {
130+
"kind": "copy",
131+
"path": "[ROOT]/foo/Cargo.toml"
132+
},
133+
"src/lib.rs": {
134+
"kind": "copy",
135+
"path": "[ROOT]/foo/src/lib.rs"
136+
}
137+
},
138+
"id": "path+[ROOTURL]/foo#0.0.0"
139+
}
121140
]
122141
"#]]
123142
.is_json()
@@ -133,7 +152,27 @@ fn single_package() {
133152
.with_stdout_data(
134153
str![[r#"
135154
[
136-
{}
155+
{
156+
"files": {
157+
"Cargo.lock": {
158+
"kind": "generate",
159+
"path": "[ROOT]/foo/Cargo.lock"
160+
},
161+
"Cargo.toml": {
162+
"kind": "generate",
163+
"path": "[ROOT]/foo/Cargo.toml"
164+
},
165+
"Cargo.toml.orig": {
166+
"kind": "copy",
167+
"path": "[ROOT]/foo/Cargo.toml"
168+
},
169+
"src/lib.rs": {
170+
"kind": "copy",
171+
"path": "[ROOT]/foo/src/lib.rs"
172+
}
173+
},
174+
"id": "path+[ROOTURL]/foo#0.0.0"
175+
}
137176
]
138177
"#]]
139178
.is_json()
@@ -184,8 +223,46 @@ fn workspace() {
184223
.with_stdout_data(
185224
str![[r#"
186225
[
187-
{},
188-
{}
226+
{
227+
"files": {
228+
"Cargo.lock": {
229+
"kind": "generate"
230+
},
231+
"Cargo.toml": {
232+
"kind": "generate",
233+
"path": "[ROOT]/foo/gondor/Cargo.toml"
234+
},
235+
"Cargo.toml.orig": {
236+
"kind": "copy",
237+
"path": "[ROOT]/foo/gondor/Cargo.toml"
238+
},
239+
"src/lib.rs": {
240+
"kind": "copy",
241+
"path": "[ROOT]/foo/gondor/src/lib.rs"
242+
}
243+
},
244+
"id": "path+[ROOTURL]/foo/gondor#0.0.0"
245+
},
246+
{
247+
"files": {
248+
"Cargo.lock": {
249+
"kind": "generate"
250+
},
251+
"Cargo.toml": {
252+
"kind": "generate",
253+
"path": "[ROOT]/foo/rohan/Cargo.toml"
254+
},
255+
"Cargo.toml.orig": {
256+
"kind": "copy",
257+
"path": "[ROOT]/foo/rohan/Cargo.toml"
258+
},
259+
"src/lib.rs": {
260+
"kind": "copy",
261+
"path": "[ROOT]/foo/rohan/src/lib.rs"
262+
}
263+
},
264+
"id": "path+[ROOTURL]/foo/rohan#0.0.0"
265+
}
189266
]
190267
"#]]
191268
.is_json()
@@ -201,8 +278,48 @@ fn workspace() {
201278
.with_stdout_data(
202279
str![[r#"
203280
[
204-
{},
205-
{}
281+
{
282+
"files": {
283+
"Cargo.lock": {
284+
"kind": "generate",
285+
"path": "[ROOT]/foo/Cargo.lock"
286+
},
287+
"Cargo.toml": {
288+
"kind": "generate",
289+
"path": "[ROOT]/foo/gondor/Cargo.toml"
290+
},
291+
"Cargo.toml.orig": {
292+
"kind": "copy",
293+
"path": "[ROOT]/foo/gondor/Cargo.toml"
294+
},
295+
"src/lib.rs": {
296+
"kind": "copy",
297+
"path": "[ROOT]/foo/gondor/src/lib.rs"
298+
}
299+
},
300+
"id": "path+[ROOTURL]/foo/gondor#0.0.0"
301+
},
302+
{
303+
"files": {
304+
"Cargo.lock": {
305+
"kind": "generate",
306+
"path": "[ROOT]/foo/Cargo.lock"
307+
},
308+
"Cargo.toml": {
309+
"kind": "generate",
310+
"path": "[ROOT]/foo/rohan/Cargo.toml"
311+
},
312+
"Cargo.toml.orig": {
313+
"kind": "copy",
314+
"path": "[ROOT]/foo/rohan/Cargo.toml"
315+
},
316+
"src/lib.rs": {
317+
"kind": "copy",
318+
"path": "[ROOT]/foo/rohan/src/lib.rs"
319+
}
320+
},
321+
"id": "path+[ROOTURL]/foo/rohan#0.0.0"
322+
}
206323
]
207324
"#]]
208325
.is_json()

0 commit comments

Comments
 (0)