10000 Draft: Kitchen Sink of Refactors by Malax · Pull Request #655 · heroku/libcnb.rs · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Draft: Kitchen Sink of Refactors #655

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 11 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 53 additions & 65 deletions libcnb-cargo/src/package/command.rs
< EDBE tr data-hunk="e4beb1066ab7a4eba90b47871e615f3cf62bf5b86c1a60e89a3d11eee431fcfd" class="show-top-border">
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,18 @@ use libcnb_package::buildpack_dependency::{
rewrite_package_descriptor_relative_path_dependencies_to_absolute,
};
use libcnb_package::buildpack_package::{read_buildpack_package, BuildpackPackage};
use libcnb_package::cargo::CargoProfile;
use libcnb_package::cross_compile::{cross_compile_assistance, CrossCompileAssistance};
use libcnb_package::dependency_graph::{create_dependency_graph, get_dependencies};
use libcnb_package::output::create_packaged_buildpack_dir_resolver;
use libcnb_package::{
assemble_buildpack_directory, find_buildpack_dirs, find_cargo_workspace_root_dir, CargoProfile,
assemble_buildpack_directory, find_buildpack_dirs, find_cargo_workspace_root_dir,
};
use std::ffi::OsString;
use std::path::{Path, PathBuf};

type Result<T> = std::result::Result<T, Error>;

#[allow(clippy::too_many_lines)]
pub(crate) fn execute(args: &PackageArgs) -> Result<()> {
pub(crate) fn execute(args: &PackageArgs) -> Result<(), Error> {
let target_triple = args.target.clone();

let cargo_profile = if args.release {
Expand All @@ -40,7 +39,7 @@ pub(crate) fn execute(args: &PackageArgs) -> Result<()> {
let package_dir = args
.package_dir
.clone()
.map_or_else(|| get_default_package_dir(&workspace_root_path), Ok)?;
.unwrap_or(get_default_package_dir(&workspace_root_path));

std::fs::create_dir_all(&package_dir)
.map_err(|e| Error::CreatePackageDirectory(package_dir.clone(), e))?;
Expand All @@ -49,7 +48,7 @@ pub(crate) fn execute(args: &PackageArgs) -> Result<()> {
.map_err(|e| Error::FindBuildpackDirs(workspace_root_path, e))?
.into_iter()
.map(read_buildpack_package)
.collect::<std::result::Result<Vec<_>, _>>()
.collect::<Result<Vec<_>, _>>()
.map_err(|error| Error::ReadBuildpackPackage(Box::new(error)))?;

let buildpack_packages_graph =
Expand All @@ -72,8 +71,9 @@ pub(crate) fn execute(args: &PackageArgs) -> Result<()> {
Err(Error::NoBuildpacksFound)?;
}

let build_order = get_dependencies(&buildpack_packages_graph, &buildpack_packages_requested)
.map_err(Error::GetDependencies)?;
let ordered_buildpack_packages =
get_dependencies(&buildpack_packages_graph, &buildpack_packages_requested)
.map_err(Error::GetDependencies)?;

let packaged_buildpack_dir_resolver =
create_packaged_buildpack_dir_resolver(&package_dir, cargo_profile, &target_triple);
Expand All @@ -86,41 +86,47 @@ pub(crate) fn execute(args: &PackageArgs) -> Result<()> {
}
};

let mut current_count = 1;
let total_count = build_order.len();
for buildpack_package in &build_order {
for (buildpack_package_index, buildpack_package) in
ordered_buildpack_packages.iter().enumerate()
{
eprintln!(
"📦 [{current_count}/{total_count}] Building {}",
"📦 [{}/{}] Building {}",
buildpack_package_index + 1,
ordered_buildpack_packages.len(),
buildpack_package.buildpack_id()
);
let target_dir = lookup_target_dir(buildpack_package);
match buildpack_package.buildpack_data.buildpack_descriptor {
BuildpackDescriptor::Single(_) => {
if contains_buildpack_binaries(&buildpack_package.path) {
eprintln!("Not a libcnb.rs buildpack, nothing to compile...");
} else {
package_single_buildpack(
buildpack_package,
&target_dir,
cargo_profile,
&target_triple,
args.no_cross_compile_assistance,
)?;
}
}
BuildpackDescriptor::Meta(_) => {
package_meta_buildpack(
buildpack_package,
&target_dir,
&packaged_buildpack_dir_resolver,
)?;
}

if contains_buildpack_binaries(&buildpack_package.path) {
eprintln!("Not a libcnb.rs buildpack, nothing to compile...");
continue;
}

let buildpack_target_dir = lookup_target_dir(buildpack_package);

if buildpack_target_dir.exists() {
std::fs::remove_dir_all(&buildpack_target_dir).map_err(|error| {
Error::CleanBuildpackTargetDirectory(buildpack_target_dir.clone(), error)
})?;
}
current_count += 1;

match buildpack_package.buildpack_descriptor {
BuildpackDescriptor::Single(_) => package_single_buildpack(
buildpack_package,
&buildpack_target_dir,
cargo_profile,
&target_triple,
args.no_cross_compile_assistance,
),
BuildpackDescriptor::Meta(_) => package_meta_buildpack(
buildpack_package,
&buildpack_target_dir,
&packaged_buildpack_dir_resolver,
),
}?;
}

eprint_pack_command_hint(
build_order
ordered_buildpack_packages
.into_iter()
.map(lookup_target_dir)
.collect::<Vec<_>>(),
Expand All @@ -142,7 +148,7 @@ fn package_single_buildpack(
cargo_profile: CargoProfile,
target_triple: &str,
no_cross_compile_assistance: bool,
) -> Result<()> {
) -> Result<(), Error> {
let cargo_metadata = MetadataCommand::new()
.manifest_path(&buildpack_package.path.join("Cargo.toml"))
.exec()
Expand All @@ -153,7 +159,6 @@ fn package_single_buildpack(
eprintln!("Building binaries ({target_triple})...");

let buildpack_binaries = build_buildpack_binaries(
&buildpack_package.path,
&cargo_metadata,
cargo_profile,
&cargo_build_env,
Expand All @@ -163,11 +168,9 @@ fn package_single_buildpack(

eprintln!("Writing buildpack directory...");

clean_target_directory(target_dir)?;

assemble_buildpack_directory(
target_dir,
&buildpack_package.buildpack_data.buildpack_descriptor_path,
buildpack_package.path.join("buildpack.toml"),
&buildpack_binaries,
)
.map_err(|e| Error::AssembleBuildpackDirectory(target_dir.to_path_buf(), e))?;
Expand All @@ -185,24 +188,21 @@ fn package_meta_buildpack(
buildpack_package: &BuildpackPackage,
target_dir: &Path,
packaged_buildpack_dir_resolver: &impl Fn(&BuildpackId) -> PathBuf,
) -> Result<()> {
) -> Result<(), Error> {
eprintln!("Writing buildpack directory...");

clean_target_directory(target_dir)?;

std::fs::create_dir_all(target_dir)
.map_err(|e| Error::CreateBuildpackTargetDirectory(target_dir.to_path_buf(), e))?;

std::fs::copy(
&buildpack_package.buildpack_data.buildpack_descriptor_path,
buildpack_package.path.join("buildpack.toml"),
target_dir.join("buildpack.toml"),
)
.map_err(|e| Error::CopyBuildpackToml(target_dir.to_path_buf(), e))?;

let package_descriptor_content = &buildpack_package
.package_descriptor_data
.package_descriptor
.as_ref()
.map(|package_descriptor_data| &package_descriptor_data.package_descriptor)
.ok_or(Error::MissingPackageDescriptorData)
.and_then(|package_descriptor| {
rewrite_package_descriptor_local_dependencies(
Expand Down Expand Up @@ -251,27 +251,19 @@ fn print_requested_buildpack_output_dirs(output_directories: Vec<PathBuf>) {
}
}

fn clean_target_directory(dir: &Path) -> Result<()> {
if dir.exists() {
std::fs::remove_dir_all(dir)
.map_err(|e| Error::CleanBuildpackTargetDirectory(dir.to_path_buf(), e))?;
}
Ok(())
}

fn eprint_compiled_buildpack_success(source_dir: &Path, target_dir: &Path) -> Result<()> {
fn eprint_compiled_buildpack_success(source_dir: &Path, target_dir: &Path) -> Result<(), Error> {
let size_in_bytes = calculate_dir_size(target_dir)
.map_err(|e| Error::CalculateDirectorySize(target_dir.to_path_buf(), e))?;

// Precision will only be lost for sizes bigger than 52 bits (~4 Petabytes), and even
// then will only result in a less precise figure, so is not an issue.
#[allow(clippy::cast_precision_loss)]
let size_in_mb = size_in_bytes as f64 / (1024.0 * 1024.0);
let size_in_mib = size_in_bytes as f64 / (1024.0 * 1024.0);
let relative_output_path =
pathdiff::diff_paths(target_dir, source_dir).unwrap_or_else(|| source_dir.to_path_buf());

eprintln!(
"Successfully wrote buildpack directory: {} ({size_in_mb:.2} MiB)",
"Successfully wrote buildpack directory: {} ({size_in_mib:.2} MiB)",
relative_output_path.to_string_lossy(),
);

Expand Down Expand Up @@ -311,7 +303,7 @@ fn contains_buildpack_binaries(dir: &Path) -> bool {
fn get_cargo_build_env(
target_triple: &str,
no_cross_compile_assistance: bool,
) -> Result<Vec<(OsString, OsString)>> {
) -> Result<Vec<(OsString, OsString)>, Error> {
if no_cross_compile_assistance {
Ok(vec![])
} else {
Expand All @@ -333,10 +325,6 @@ fn get_cargo_build_env(
}
}

fn get_default_package_dir(workspace_root_path: &Path) -> Result<PathBuf> {
MetadataCommand::new()
.manifest_path(&workspace_root_path.join("Cargo.toml"))
.exec()
.map(|metadata| metadata.workspace_root.into_std_path_buf().join("packaged"))
.map_err(|e| Error::GetBuildpackOutputDir(workspace_root_path.to_path_buf(), e))
fn get_default_package_dir(workspace_root_path: &Path) -> PathBuf {
workspace_root_path.join("packaged")
}
2 changes: 0 additions & 2 deletions libcnb-cargo/src/package/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,4 @@ pub(crate) enum Error {
CalculateDirectorySize(PathBuf, #[source] std::io::Error),
#[error("{0}")]
CrossCompilationHelp(String),
#[error("Failed to get buildpack output directory: {1}")]
GetBuildpackOutputDir(PathBuf, #[source] cargo_metadata::Error),
}
13 changes: 5 additions & 8 deletions libcnb-cargo/tests/integration_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
use libcnb_data::buildpack::BuildpackId;
use libcnb_data::buildpack_id;
use libcnb_data::package_descriptor::PackageDescriptorDependency;
use libcnb_package::cargo::CargoProfile;
use libcnb_package::output::create_packaged_buildpack_dir_resolver;
use libcnb_package::{read_buildpack_data, read_package_descriptor_data, CargoProfile};
use libcnb_package::{read_buildpack_descriptor, read_package_descriptor};
use std::io::ErrorKind;
use std::path::{Path, PathBuf};
use std::process::Command;
Expand Down Expand Up @@ -239,9 +240,8 @@ fn validate_packaged_buildpack(packaged_buildpack_dir: &Path, buildpack_id: &Bui
assert!(packaged_buildpack_dir.join("bin").join("detect").exists());

assert_eq!(
&read_buildpack_data(packaged_buildpack_dir)
&read_buildpack_descriptor(packaged_buildpack_dir)
.unwrap()
.buildpack_descriptor
.buildpack()
.id,
buildpack_id
Expand All @@ -257,19 +257,16 @@ fn validate_packaged_meta_buildpack(
assert!(packaged_buildpack_dir.join("package.toml").exists());

assert_eq!(
&read_buildpack_data(packaged_buildpack_dir)
&read_buildpack_descriptor(packaged_buildpack_dir)
.unwrap()
.buildpack_descriptor
.buildpack()
.id,
buildpack_id
);

assert_eq!(
read_package_descriptor_data(packaged_buildpack_dir)
read_package_descriptor(packaged_buildpack_dir.join("package.toml"))
.unwrap()
.unwrap()
.package_descriptor
.dependencies,
expected_package_descriptor_dependencies
);
Expand Down
Loading
0