feat: add utility function to reduce code duplication

This commit is contained in:
daimond113 2025-01-02 22:21:18 +01:00
parent 6f5e2a2473
commit a627a7253f
No known key found for this signature in database
GPG key ID: 3A8ECE51328B513C
6 changed files with 69 additions and 64 deletions

View file

@ -19,7 +19,7 @@ use pesde::{
}, },
PackageSources, IGNORED_DIRS, IGNORED_FILES, PackageSources, IGNORED_DIRS, IGNORED_FILES,
}, },
Project, RefreshedSources, DEFAULT_INDEX_NAME, MANIFEST_FILE_NAME, PACKAGES_CONTAINER_NAME, Project, RefreshedSources, DEFAULT_INDEX_NAME, MANIFEST_FILE_NAME,
}; };
use reqwest::{header::AUTHORIZATION, StatusCode}; use reqwest::{header::AUTHORIZATION, StatusCode};
use semver::VersionReq; use semver::VersionReq;
@ -121,15 +121,11 @@ impl PublishCommand {
.filter(|(_, node)| node.direct.is_some()) .filter(|(_, node)| node.direct.is_some())
.map(|(id, node)| { .map(|(id, node)| {
let project = project.clone(); let project = project.clone();
let base_folder = manifest let container_folder = node.container_folder_from_project(
.target id,
.kind() &project,
.packages_folder(id.version_id().target()); manifest.target.kind(),
let container_folder = project );
.package_dir()
.join(base_folder)
.join(PACKAGES_CONTAINER_NAME)
.join(node.container_folder(id));
let id = Arc::new(id.clone()); let id = Arc::new(id.clone());
let node = node.clone(); let node = node.clone();

View file

@ -7,7 +7,7 @@ use pesde::{
linking::generator::generate_bin_linking_module, linking::generator::generate_bin_linking_module,
names::{PackageName, PackageNames}, names::{PackageName, PackageNames},
source::traits::{GetTargetOptions, PackageRef, PackageSource, RefreshOptions}, source::traits::{GetTargetOptions, PackageRef, PackageSource, RefreshOptions},
Project, MANIFEST_FILE_NAME, PACKAGES_CONTAINER_NAME, Project, MANIFEST_FILE_NAME,
}; };
use relative_path::RelativePathBuf; use relative_path::RelativePathBuf;
use std::{ use std::{
@ -86,17 +86,16 @@ impl RunCommand {
_ => anyhow::bail!("multiple versions found. use the package's alias instead."), _ => anyhow::bail!("multiple versions found. use the package's alias instead."),
}; };
let base_folder = project let container_folder = node.container_folder_from_project(
&id,
&project,
project
.deser_manifest() .deser_manifest()
.await? .await
.context("failed to deserialize manifest")?
.target .target
.kind() .kind(),
.packages_folder(id.version_id().target()); );
let container_folder = project
.package_dir()
.join(base_folder)
.join(PACKAGES_CONTAINER_NAME)
.join(node.container_folder(&id));
let source = node.pkg_ref.source(); let source = node.pkg_ref.source();
source source

View file

@ -4,13 +4,13 @@ use crate::{
DependencyGraph, DependencyGraphNode, DependencyGraphNodeWithTarget, DependencyGraph, DependencyGraphNode, DependencyGraphNodeWithTarget,
DependencyGraphWithTarget, DependencyGraphWithTarget,
}, },
manifest::DependencyType, manifest::{target::TargetKind, DependencyType},
reporters::DownloadsReporter, reporters::DownloadsReporter,
source::{ source::{
ids::PackageId, ids::PackageId,
traits::{GetTargetOptions, PackageRef, PackageSource}, traits::{GetTargetOptions, PackageRef, PackageSource},
}, },
Project, RefreshedSources, PACKAGES_CONTAINER_NAME, Project, RefreshedSources,
}; };
use fs_err::tokio as fs; use fs_err::tokio as fs;
use futures::TryStreamExt; use futures::TryStreamExt;
@ -19,7 +19,6 @@ use std::{
convert::Infallible, convert::Infallible,
future::{self, Future}, future::{self, Future},
num::NonZeroUsize, num::NonZeroUsize,
path::PathBuf,
sync::Arc, sync::Arc,
}; };
use tokio::{pin, task::JoinSet}; use tokio::{pin, task::JoinSet};
@ -187,22 +186,14 @@ impl Project {
let mut tasks = JoinSet::new(); let mut tasks = JoinSet::new();
while let Some((id, node, fs)) = downloaded.try_next().await? { while let Some((id, node, fs)) = downloaded.try_next().await? {
let container_folder = self let container_folder =
.package_dir() node.container_folder_from_project(&id, self, manifest.target.kind());
.join(
manifest
.target
.kind()
.packages_folder(id.version_id().target()),
)
.join(PACKAGES_CONTAINER_NAME)
.join(node.container_folder(&id));
if prod && node.resolved_ty == DependencyType::Dev { if prod && node.resolved_ty == DependencyType::Dev {
continue; continue;
} }
downloaded_graph.insert(id, (node, container_folder.clone())); downloaded_graph.insert(id, node);
let cas_dir = self.cas_dir().to_path_buf(); let cas_dir = self.cas_dir().to_path_buf();
tasks.spawn(async move { tasks.spawn(async move {
@ -220,20 +211,24 @@ impl Project {
let (downloaded_wally_graph, downloaded_other_graph) = downloaded_graph let (downloaded_wally_graph, downloaded_other_graph) = downloaded_graph
.into_iter() .into_iter()
.partition::<HashMap<_, _>, _>(|(_, (node, _))| node.pkg_ref.is_wally_package()); .partition::<HashMap<_, _>, _>(|(_, node)| node.pkg_ref.is_wally_package());
let mut graph = Arc::new(DependencyGraphWithTarget::new()); let mut graph = Arc::new(DependencyGraphWithTarget::new());
async fn get_graph_targets<Hooks: DownloadAndLinkHooks>( async fn get_graph_targets<Hooks: DownloadAndLinkHooks>(
graph: &mut Arc<DependencyGraphWithTarget>, graph: &mut Arc<DependencyGraphWithTarget>,
project: &Project, project: &Project,
downloaded_graph: HashMap<PackageId, (DependencyGraphNode, PathBuf)>, manifest_target_kind: TargetKind,
downloaded_graph: HashMap<PackageId, DependencyGraphNode>,
) -> Result<(), errors::DownloadAndLinkError<Hooks::Error>> { ) -> Result<(), errors::DownloadAndLinkError<Hooks::Error>> {
let mut tasks = downloaded_graph let mut tasks = downloaded_graph
.into_iter() .into_iter()
.map(|(id, (node, container_folder))| { .map(|(id, node)| {
let source = node.pkg_ref.source(); let source = node.pkg_ref.source();
let path = Arc::from(container_folder.as_path()); let path = Arc::from(
node.container_folder_from_project(&id, project, manifest_target_kind)
.as_path(),
);
let id = Arc::new(id.clone()); let id = Arc::new(id.clone());
let project = project.clone(); let project = project.clone();
@ -266,7 +261,12 @@ impl Project {
} }
// step 2. get targets for non Wally packages (Wally packages require the scripts packages to be downloaded first) // step 2. get targets for non Wally packages (Wally packages require the scripts packages to be downloaded first)
get_graph_targets::<Hooks>(&mut graph, self, downloaded_other_graph) get_graph_targets::<Hooks>(
&mut graph,
self,
manifest.target.kind(),
downloaded_other_graph,
)
.instrument(tracing::debug_span!("get targets (non-wally)")) .instrument(tracing::debug_span!("get targets (non-wally)"))
.await?; .await?;
@ -287,7 +287,12 @@ impl Project {
} }
// step 3. get targets for Wally packages // step 3. get targets for Wally packages
get_graph_targets::<Hooks>(&mut graph, self, downloaded_wally_graph) get_graph_targets::<Hooks>(
&mut graph,
self,
manifest.target.kind(),
downloaded_wally_graph,
)
.instrument(tracing::debug_span!("get targets (wally)")) .instrument(tracing::debug_span!("get targets (wally)"))
.await?; .await?;

View file

@ -9,6 +9,7 @@ use crate::{
specifiers::DependencySpecifiers, specifiers::DependencySpecifiers,
traits::PackageRef, traits::PackageRef,
}, },
Project, PACKAGES_CONTAINER_NAME,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::{collections::BTreeMap, path::PathBuf}; use std::{collections::BTreeMap, path::PathBuf};
@ -61,6 +62,20 @@ impl DependencyGraphNode {
.join(version.to_string()) .join(version.to_string())
.join(name.as_str().1) .join(name.as_str().1)
} }
/// Returns the folder to store the contents of the package in starting from the project's package directory
pub fn container_folder_from_project(
&self,
package_id: &PackageId,
project: &Project,
manifest_target_kind: TargetKind,
) -> PathBuf {
project
.package_dir()
.join(manifest_target_kind.packages_folder(package_id.version_id().target()))
.join(PACKAGES_CONTAINER_NAME)
.join(self.container_folder(package_id))
}
} }
/// A graph of `DependencyGraphNode`s /// A graph of `DependencyGraphNode`s

View file

@ -91,13 +91,11 @@ impl Project {
return Ok((package_id, vec![])); return Ok((package_id, vec![]));
}; };
let container_folder = project let container_folder = node.node.container_folder_from_project(
.package_dir() &package_id,
.join( &project,
manifest_target_kind.packages_folder(package_id.version_id().target()), manifest_target_kind,
) );
.join(PACKAGES_CONTAINER_NAME)
.join(node.node.container_folder(&package_id));
let types = if lib_file.as_str() != LINK_LIB_NO_FILE_FOUND { let types = if lib_file.as_str() != LINK_LIB_NO_FILE_FOUND {
let lib_file = lib_file.to_path(&container_folder); let lib_file = lib_file.to_path(&container_folder);

View file

@ -2,7 +2,7 @@ use crate::{
graph::DependencyGraph, graph::DependencyGraph,
reporters::{PatchProgressReporter, PatchesReporter}, reporters::{PatchProgressReporter, PatchesReporter},
source::ids::PackageId, source::ids::PackageId,
Project, MANIFEST_FILE_NAME, PACKAGES_CONTAINER_NAME, Project, MANIFEST_FILE_NAME,
}; };
use fs_err::tokio as fs; use fs_err::tokio as fs;
use futures::TryFutureExt; use futures::TryFutureExt;
@ -102,16 +102,8 @@ impl Project {
continue; continue;
}; };
let container_folder = self let container_folder =
.package_dir() node.container_folder_from_project(&package_id, self, manifest.target.kind());
.join(
manifest
.target
.kind()
.packages_folder(package_id.version_id().target()),
)
.join(PACKAGES_CONTAINER_NAME)
.join(node.container_folder(&package_id));
let reporter = reporter.clone(); let reporter = reporter.clone();
let span = tracing::info_span!("apply patch", package_id = package_id.to_string()); let span = tracing::info_span!("apply patch", package_id = package_id.to_string());