@@ -221,7 +221,7 @@ fn sync(
221
221
let pathsource = PathSource :: new ( src, id. source_id ( ) , gctx) ;
222
222
let paths = pathsource. list_files ( pkg) ?;
223
223
let mut map = BTreeMap :: new ( ) ;
224
- cp_sources ( pkg, src, & paths, & dst, & mut map, & mut tmp_buf)
224
+ cp_sources ( pkg, src, & paths, & dst, & mut map, & mut tmp_buf, gctx )
225
225
. with_context ( || format ! ( "failed to copy over vendored sources for: {}" , id) ) ?;
226
226
227
227
// Finally, emit the metadata about this package
@@ -317,6 +317,7 @@ fn cp_sources(
317
317
dst : & Path ,
318
318
cksums : & mut BTreeMap < String , String > ,
319
319
tmp_buf : & mut [ u8 ] ,
320
+ gctx : & GlobalContext ,
320
321
) -> CargoResult < ( ) > {
321
322
for p in paths {
322
323
let relative = p. strip_prefix ( & src) . unwrap ( ) ;
@@ -360,7 +361,12 @@ fn cp_sources(
360
361
let cksum = if dst. file_name ( ) == Some ( OsStr :: new ( "Cargo.toml" ) )
361
362
&& pkg. package_id ( ) . source_id ( ) . is_git ( )
362
363
{
363
- let contents = pkg. manifest ( ) . to_normalized_contents ( ) ?;
364
+ let packaged_files = paths
365
+ . iter ( )
366
+ . map ( |p| p. strip_prefix ( src) . unwrap ( ) . to_owned ( ) )
367
+ . collect :: < Vec < _ > > ( ) ;
368
+ let vendored_pkg = prepare_for_vendor ( pkg, & packaged_files, gctx) ?;
369
+ let contents = vendored_pkg. manifest ( ) . to_normalized_contents ( ) ?;
364
370
copy_and_checksum (
365
371
& dst,
366
372
& mut dst_opts,
@@ -392,6 +398,119 @@ fn cp_sources(
392
398
Ok ( ( ) )
393
399
}
394
400
401
+ /// HACK: Perform the bare minimum of `prepare_for_publish` needed for #14348.
402
+ ///
403
+ /// There are parts of `prepare_for_publish` that could be directly useful (e.g. stripping
404
+ /// `[workspace]`) while other parts that require other filesystem operations (moving the README
405
+ /// file) and ideally we'd reuse `cargo package` code to take care of all of this for us.
406
+ fn prepare_for_vendor (
407
+ me : & Package ,
408
+ packaged_files : & [ PathBuf ] ,
409
+ gctx : & GlobalContext ,
410
+ ) -> CargoResult < Package > {
411
+ let contents = me. manifest ( ) . contents ( ) ;
412
+ let document = me. manifest ( ) . document ( ) ;
413
+ let original_toml = prepare_toml_for_vendor (
414
+ me. manifest ( ) . normalized_toml ( ) . clone ( ) ,
415
+ packaged_files,
416
+ gctx,
417
+ ) ?;
418
+ let normalized_toml = original_toml. clone ( ) ;
419
+ let features = me. manifest ( ) . unstable_features ( ) . clone ( ) ;
420
+ let workspace_config = me. manifest ( ) . workspace_config ( ) . clone ( ) ;
421
+ let source_id = me. package_id ( ) . source_id ( ) ;
422
+ let mut warnings = Default :: default ( ) ;
423
+ let mut errors = Default :: default ( ) ;
424
+ let manifest = crate :: util:: toml:: to_real_manifest (
425
+ contents. to_owned ( ) ,
426
+ document. clone ( ) ,
427
+ original_toml,
428
+ normalized_toml,
429
+ features,
430
+ workspace_config,
431
+ source_id,
432
+ me. manifest_path ( ) ,
433
+ gctx,
434
+ & mut warnings,
435
+ & mut errors,
436
+ ) ?;
437
+ let new_pkg = Package :: new ( manifest, me. manifest_path ( ) ) ;
438
+ Ok ( new_pkg)
439
+ }
440
+
441
+ fn prepare_toml_for_vendor (
442
+ mut me : cargo_util_schemas:: manifest:: TomlManifest ,
443
+ packaged_files : & [ PathBuf ] ,
444
+ gctx : & GlobalContext ,
445
+ ) -> CargoResult < cargo_util_schemas:: manifest:: TomlManifest > {
446
+ let package = me
447
+ . package
448
+ . as_mut ( )
449
+ . expect ( "venedored manifests must have packages" ) ;
450
+ if let Some ( cargo_util_schemas:: manifest:: StringOrBool :: String ( path) ) = & package. build {
451
+ let path = paths:: normalize_path ( Path :: new ( path) ) ;
452
+ let included = packaged_files. contains ( & path) ;
453
+ let build = if included {
454
+ let path = path
455
+ . into_os_string ( )
456
+ . into_string ( )
457
+ . map_err ( |_err| anyhow:: format_err!( "non-UTF8 `package.build`" ) ) ?;
458
+ let path = crate :: util:: toml:: normalize_path_string_sep ( path) ;
459
+ cargo_util_schemas:: manifest:: StringOrBool :: String ( path)
460
+ } else {
461
+ gctx. shell ( ) . warn ( format ! (
462
+ "ignoring `package.build` as `{}` is not included in the published package" ,
463
+ path. display( )
464
+ ) ) ?;
465
+ cargo_util_schemas:: manifest:: StringOrBool :: Bool ( false )
466
+ } ;
467
+ package. build = Some ( build) ;
468
+ }
469
+
470
+ let lib = if let Some ( target) = & me. lib {
471
+ crate :: util:: toml:: prepare_target_for_publish (
472
+ target,
473
+ Some ( packaged_files) ,
474
+ "library" ,
475
+ gctx,
476
+ ) ?
477
+ } else {
478
+ None
479
+ } ;
480
+ let bin = crate :: util:: toml:: prepare_targets_for_publish (
481
+ me. bin . as_ref ( ) ,
482
+ Some ( packaged_files) ,
483
+ "binary" ,
484
+ gctx,
485
+ ) ?;
486
+ let example = crate :: util:: toml:: prepare_targets_for_publish (
487
+ me. example . as_ref ( ) ,
488
+ Some ( packaged_files) ,
489
+ "example" ,
490
+ gctx,
491
+ ) ?;
492
+ let test = crate :: util:: toml:: prepare_targets_for_publish (
493
+ me. test . as_ref ( ) ,
494
+ Some ( packaged_files) ,
495
+ "test" ,
496
+ gctx,
497
+ ) ?;
498
+ let bench = crate :: util:: toml:: prepare_targets_for_publish (
499
+ me. bench . as_ref ( ) ,
500
+ Some ( packaged_files) ,
501
+ "benchmark" ,
502
+ gctx,
503
+ ) ?;
504
+
505
+ me. lib = lib;
506
+ me. bin = bin;
507
+ me. example = example;
508
+ me. test = test;
509
+ me. bench = bench;
510
+
511
+ Ok ( me)
512
+ }
513
+
395
514
fn copy_and_checksum < T : Read > (
396
515
dst_path : & Path ,
397
516
dst_opts : & mut OpenOptions ,
0 commit comments