mirror of
https://github.com/pesde-pkg/pesde.git
synced 2025-04-28 23:53:52 +01:00
feat: add utility function to reduce code duplication
This commit is contained in:
parent
6f5e2a2473
commit
a627a7253f
6 changed files with 69 additions and 64 deletions
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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?;
|
||||||
|
|
||||||
|
|
15
src/graph.rs
15
src/graph.rs
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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());
|
||||||
|
|
Loading…
Add table
Reference in a new issue