mirror of
https://github.com/pesde-pkg/pesde.git
synced 2025-04-19 11:23:56 +01:00
feat: show available targets when none fit
This will help prevent user confusion with targets. Instead of a cryptic "no matching versions available" error, it'll now list the available targets (if the source decides to output them, so if the specifier has a target option)
This commit is contained in:
parent
0e73db2831
commit
e6ee935c11
15 changed files with 148 additions and 93 deletions
|
@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- Binary linkers are now done in Rust to simplify their implementation and cross-runtime portability by @daimond113
|
- Binary linkers are now done in Rust to simplify their implementation and cross-runtime portability by @daimond113
|
||||||
|
- Show available targets in add and install commands if the specifier hasn't matched any by @daimond113
|
||||||
|
|
||||||
## [0.6.0] - 2025-02-22
|
## [0.6.0] - 2025-02-22
|
||||||
### Added
|
### Added
|
||||||
|
|
|
@ -143,22 +143,35 @@ impl AddCommand {
|
||||||
.await
|
.await
|
||||||
.context("failed to refresh package source")?;
|
.context("failed to refresh package source")?;
|
||||||
|
|
||||||
let Some(version_id) = source
|
let (_, mut versions, suggestions) = source
|
||||||
.resolve(
|
.resolve(
|
||||||
&specifier,
|
&specifier,
|
||||||
&ResolveOptions {
|
&ResolveOptions {
|
||||||
project: project.clone(),
|
project: project.clone(),
|
||||||
target: manifest.target.kind(),
|
target: manifest.target.kind(),
|
||||||
refreshed_sources,
|
refreshed_sources,
|
||||||
|
loose_target: false,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.context("failed to resolve package")?
|
.context("failed to resolve package")?;
|
||||||
.1
|
|
||||||
.pop_last()
|
let Some((version_id, _)) = versions.pop_last() else {
|
||||||
.map(|(v_id, _)| v_id)
|
anyhow::bail!(
|
||||||
else {
|
"no matching versions found for package{}",
|
||||||
anyhow::bail!("no versions found for package");
|
if suggestions.is_empty() {
|
||||||
|
"".into()
|
||||||
|
} else {
|
||||||
|
format!(
|
||||||
|
". available targets: {}",
|
||||||
|
suggestions
|
||||||
|
.into_iter()
|
||||||
|
.map(|t| t.to_string())
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(", ")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
let project_target = manifest.target.kind();
|
let project_target = manifest.target.kind();
|
||||||
|
|
|
@ -82,56 +82,28 @@ impl ExecuteCommand {
|
||||||
.context("failed to refresh source")?;
|
.context("failed to refresh source")?;
|
||||||
|
|
||||||
let version_req = self.package.1.unwrap_or(VersionReq::STAR);
|
let version_req = self.package.1.unwrap_or(VersionReq::STAR);
|
||||||
let Some((id, pkg_ref)) = ('finder: {
|
let Some((v_id, pkg_ref)) = source
|
||||||
let specifier = PesdeDependencySpecifier {
|
.resolve(
|
||||||
|
&PesdeDependencySpecifier {
|
||||||
name: self.package.0.clone(),
|
name: self.package.0.clone(),
|
||||||
version: version_req.clone(),
|
version: version_req.clone(),
|
||||||
index: DEFAULT_INDEX_NAME.into(),
|
index: DEFAULT_INDEX_NAME.into(),
|
||||||
target: None,
|
target: None,
|
||||||
};
|
|
||||||
|
|
||||||
if let Some((v_id, pkg_ref)) = source
|
|
||||||
.resolve(
|
|
||||||
&specifier,
|
|
||||||
&ResolveOptions {
|
|
||||||
project: project.clone(),
|
|
||||||
target: TargetKind::Lune,
|
|
||||||
refreshed_sources: refreshed_sources.clone(),
|
|
||||||
},
|
},
|
||||||
)
|
|
||||||
.await
|
|
||||||
.context("failed to resolve package")?
|
|
||||||
.1
|
|
||||||
.pop_last()
|
|
||||||
{
|
|
||||||
break 'finder Some((
|
|
||||||
PackageId::new(PackageNames::Pesde(self.package.0.clone()), v_id),
|
|
||||||
pkg_ref,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
source
|
|
||||||
.resolve(
|
|
||||||
&specifier,
|
|
||||||
&ResolveOptions {
|
&ResolveOptions {
|
||||||
project: project.clone(),
|
project: project.clone(),
|
||||||
target: TargetKind::Luau,
|
target: TargetKind::Luau,
|
||||||
refreshed_sources: refreshed_sources.clone(),
|
refreshed_sources: refreshed_sources.clone(),
|
||||||
|
loose_target: true,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.context("failed to resolve package")?
|
.context("failed to resolve package")?
|
||||||
.1
|
.1
|
||||||
.pop_last()
|
.pop_last()
|
||||||
.map(|(v_id, pkg_ref)| {
|
else {
|
||||||
(
|
|
||||||
PackageId::new(PackageNames::Pesde(self.package.0.clone()), v_id),
|
|
||||||
pkg_ref,
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}) else {
|
|
||||||
anyhow::bail!(
|
anyhow::bail!(
|
||||||
"no Lune or Luau package could be found for {}@{version_req}",
|
"no compatible package could be found for {}@{version_req}",
|
||||||
self.package.0,
|
self.package.0,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -151,7 +123,10 @@ impl ExecuteCommand {
|
||||||
project.auth_config().clone(),
|
project.auth_config().clone(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let id = Arc::new(id);
|
let id = Arc::new(PackageId::new(
|
||||||
|
PackageNames::Pesde(self.package.0.clone()),
|
||||||
|
v_id,
|
||||||
|
));
|
||||||
|
|
||||||
let fs = source
|
let fs = source
|
||||||
.download(
|
.download(
|
||||||
|
|
|
@ -204,8 +204,9 @@ impl InitCommand {
|
||||||
},
|
},
|
||||||
&ResolveOptions {
|
&ResolveOptions {
|
||||||
project: project.clone(),
|
project: project.clone(),
|
||||||
target: TargetKind::Lune,
|
target: TargetKind::Luau,
|
||||||
refreshed_sources,
|
refreshed_sources,
|
||||||
|
loose_target: true,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
|
|
@ -92,6 +92,7 @@ impl OutdatedCommand {
|
||||||
project: project.clone(),
|
project: project.clone(),
|
||||||
target: manifest_target_kind,
|
target: manifest_target_kind,
|
||||||
refreshed_sources: refreshed_sources.clone(),
|
refreshed_sources: refreshed_sources.clone(),
|
||||||
|
loose_target: false,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
|
|
@ -465,6 +465,7 @@ info: otherwise, the file was deemed unnecessary, if you don't understand why, p
|
||||||
project: project.clone(),
|
project: project.clone(),
|
||||||
target: target_kind,
|
target: target_kind,
|
||||||
refreshed_sources: refreshed_sources.clone(),
|
refreshed_sources: refreshed_sources.clone(),
|
||||||
|
loose_target: false,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
|
|
@ -234,11 +234,12 @@ impl Project {
|
||||||
.await
|
.await
|
||||||
.map_err(|e| Box::new(e.into()))?;
|
.map_err(|e| Box::new(e.into()))?;
|
||||||
|
|
||||||
let (name, resolved) = source
|
let (name, resolved, suggestions) = source
|
||||||
.resolve(&specifier, &ResolveOptions {
|
.resolve(&specifier, &ResolveOptions {
|
||||||
project: self.clone(),
|
project: self.clone(),
|
||||||
target,
|
target,
|
||||||
refreshed_sources: refreshed_sources.clone(),
|
refreshed_sources: refreshed_sources.clone(),
|
||||||
|
loose_target: false,
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
.map_err(|e| Box::new(e.into()))?;
|
.map_err(|e| Box::new(e.into()))?;
|
||||||
|
@ -251,7 +252,21 @@ impl Project {
|
||||||
.or_else(|| resolved.last_key_value().map(|(ver, _)| PackageId::new(name, ver.clone())))
|
.or_else(|| resolved.last_key_value().map(|(ver, _)| PackageId::new(name, ver.clone())))
|
||||||
else {
|
else {
|
||||||
return Err(Box::new(errors::DependencyGraphError::NoMatchingVersion(
|
return Err(Box::new(errors::DependencyGraphError::NoMatchingVersion(
|
||||||
format!("{specifier} ({target})"),
|
format!(
|
||||||
|
"{specifier} {target}{}",
|
||||||
|
if suggestions.is_empty() {
|
||||||
|
"".into()
|
||||||
|
} else {
|
||||||
|
format!(
|
||||||
|
" available targets: {}",
|
||||||
|
suggestions
|
||||||
|
.into_iter()
|
||||||
|
.map(|t| t.to_string())
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(", ")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
),
|
||||||
)));
|
)));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,12 @@ use crate::{
|
||||||
use fs_err::tokio as fs;
|
use fs_err::tokio as fs;
|
||||||
use gix::{bstr::BStr, traverse::tree::Recorder, ObjectId, Url};
|
use gix::{bstr::BStr, traverse::tree::Recorder, ObjectId, Url};
|
||||||
use relative_path::RelativePathBuf;
|
use relative_path::RelativePathBuf;
|
||||||
use std::{collections::BTreeMap, fmt::Debug, hash::Hash, path::PathBuf};
|
use std::{
|
||||||
|
collections::{BTreeMap, BTreeSet},
|
||||||
|
fmt::Debug,
|
||||||
|
hash::Hash,
|
||||||
|
path::PathBuf,
|
||||||
|
};
|
||||||
use tokio::task::{spawn_blocking, JoinSet};
|
use tokio::task::{spawn_blocking, JoinSet};
|
||||||
use tracing::instrument;
|
use tracing::instrument;
|
||||||
|
|
||||||
|
@ -322,6 +327,7 @@ impl PackageSource for GitPackageSource {
|
||||||
dependencies,
|
dependencies,
|
||||||
},
|
},
|
||||||
)]),
|
)]),
|
||||||
|
BTreeSet::new(),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
manifest::target::Target,
|
manifest::target::{Target, TargetKind},
|
||||||
names::PackageNames,
|
names::PackageNames,
|
||||||
reporters::DownloadProgressReporter,
|
reporters::DownloadProgressReporter,
|
||||||
source::{
|
source::{
|
||||||
|
@ -7,7 +7,10 @@ use crate::{
|
||||||
traits::*,
|
traits::*,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use std::{collections::BTreeMap, fmt::Debug};
|
use std::{
|
||||||
|
collections::{BTreeMap, BTreeSet},
|
||||||
|
fmt::Debug,
|
||||||
|
};
|
||||||
|
|
||||||
/// Packages' filesystems
|
/// Packages' filesystems
|
||||||
pub mod fs;
|
pub mod fs;
|
||||||
|
@ -43,7 +46,7 @@ pub const ADDITIONAL_FORBIDDEN_FILES: &[&str] = &["default.project.json"];
|
||||||
pub const IGNORED_DIRS: &[&str] = &[".git"];
|
pub const IGNORED_DIRS: &[&str] = &[".git"];
|
||||||
|
|
||||||
/// The result of resolving a package
|
/// The result of resolving a package
|
||||||
pub type ResolveResult<Ref> = (PackageNames, BTreeMap<VersionId, Ref>);
|
pub type ResolveResult<Ref> = (PackageNames, BTreeMap<VersionId, Ref>, BTreeSet<TargetKind>);
|
||||||
|
|
||||||
/// All possible package sources
|
/// All possible package sources
|
||||||
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
|
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
|
||||||
|
@ -98,13 +101,14 @@ impl PackageSource for PackageSources {
|
||||||
(PackageSources::Pesde(source), DependencySpecifiers::Pesde(specifier)) => source
|
(PackageSources::Pesde(source), DependencySpecifiers::Pesde(specifier)) => source
|
||||||
.resolve(specifier, options)
|
.resolve(specifier, options)
|
||||||
.await
|
.await
|
||||||
.map(|(name, results)| {
|
.map(|(name, results, suggestions)| {
|
||||||
(
|
(
|
||||||
name,
|
name,
|
||||||
results
|
results
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(version, pkg_ref)| (version, PackageRefs::Pesde(pkg_ref)))
|
.map(|(version, pkg_ref)| (version, PackageRefs::Pesde(pkg_ref)))
|
||||||
.collect(),
|
.collect(),
|
||||||
|
suggestions,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.map_err(Into::into),
|
.map_err(Into::into),
|
||||||
|
@ -113,13 +117,14 @@ impl PackageSource for PackageSources {
|
||||||
(PackageSources::Wally(source), DependencySpecifiers::Wally(specifier)) => source
|
(PackageSources::Wally(source), DependencySpecifiers::Wally(specifier)) => source
|
||||||
.resolve(specifier, options)
|
.resolve(specifier, options)
|
||||||
.await
|
.await
|
||||||
.map(|(name, results)| {
|
.map(|(name, results, suggestions)| {
|
||||||
(
|
(
|
||||||
name,
|
name,
|
||||||
results
|
results
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(version, pkg_ref)| (version, PackageRefs::Wally(pkg_ref)))
|
.map(|(version, pkg_ref)| (version, PackageRefs::Wally(pkg_ref)))
|
||||||
.collect(),
|
.collect(),
|
||||||
|
suggestions,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.map_err(Into::into),
|
.map_err(Into::into),
|
||||||
|
@ -127,13 +132,14 @@ impl PackageSource for PackageSources {
|
||||||
(PackageSources::Git(source), DependencySpecifiers::Git(specifier)) => source
|
(PackageSources::Git(source), DependencySpecifiers::Git(specifier)) => source
|
||||||
.resolve(specifier, options)
|
.resolve(specifier, options)
|
||||||
.await
|
.await
|
||||||
.map(|(name, results)| {
|
.map(|(name, results, suggestions)| {
|
||||||
(
|
(
|
||||||
name,
|
name,
|
||||||
results
|
results
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(version, pkg_ref)| (version, PackageRefs::Git(pkg_ref)))
|
.map(|(version, pkg_ref)| (version, PackageRefs::Git(pkg_ref)))
|
||||||
.collect(),
|
.collect(),
|
||||||
|
suggestions,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.map_err(Into::into),
|
.map_err(Into::into),
|
||||||
|
@ -142,7 +148,7 @@ impl PackageSource for PackageSources {
|
||||||
source
|
source
|
||||||
.resolve(specifier, options)
|
.resolve(specifier, options)
|
||||||
.await
|
.await
|
||||||
.map(|(name, results)| {
|
.map(|(name, results, suggestions)| {
|
||||||
(
|
(
|
||||||
name,
|
name,
|
||||||
results
|
results
|
||||||
|
@ -151,6 +157,7 @@ impl PackageSource for PackageSources {
|
||||||
(version, PackageRefs::Workspace(pkg_ref))
|
(version, PackageRefs::Workspace(pkg_ref))
|
||||||
})
|
})
|
||||||
.collect(),
|
.collect(),
|
||||||
|
suggestions,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.map_err(Into::into)
|
.map_err(Into::into)
|
||||||
|
@ -159,13 +166,14 @@ impl PackageSource for PackageSources {
|
||||||
(PackageSources::Path(source), DependencySpecifiers::Path(specifier)) => source
|
(PackageSources::Path(source), DependencySpecifiers::Path(specifier)) => source
|
||||||
.resolve(specifier, options)
|
.resolve(specifier, options)
|
||||||
.await
|
.await
|
||||||
.map(|(name, results)| {
|
.map(|(name, results, suggestions)| {
|
||||||
(
|
(
|
||||||
name,
|
name,
|
||||||
results
|
results
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(version, pkg_ref)| (version, PackageRefs::Path(pkg_ref)))
|
.map(|(version, pkg_ref)| (version, PackageRefs::Path(pkg_ref)))
|
||||||
.collect(),
|
.collect(),
|
||||||
|
suggestions,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.map_err(Into::into),
|
.map_err(Into::into),
|
||||||
|
|
|
@ -14,7 +14,7 @@ use crate::{
|
||||||
Project,
|
Project,
|
||||||
};
|
};
|
||||||
use futures::TryStreamExt as _;
|
use futures::TryStreamExt as _;
|
||||||
use std::collections::{BTreeMap, HashMap};
|
use std::collections::{BTreeMap, BTreeSet, HashMap};
|
||||||
use tracing::instrument;
|
use tracing::instrument;
|
||||||
|
|
||||||
/// The path package reference
|
/// The path package reference
|
||||||
|
@ -122,6 +122,7 @@ impl PackageSource for PathPackageSource {
|
||||||
VersionId::new(manifest.version, manifest.target.kind()),
|
VersionId::new(manifest.version, manifest.target.kind()),
|
||||||
pkg_ref,
|
pkg_ref,
|
||||||
)]),
|
)]),
|
||||||
|
BTreeSet::new(),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,10 @@ use specifier::PesdeDependencySpecifier;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
engine::EngineKind,
|
engine::EngineKind,
|
||||||
manifest::{target::Target, Alias, DependencyType},
|
manifest::{
|
||||||
|
target::{Target, TargetKind},
|
||||||
|
Alias, DependencyType,
|
||||||
|
},
|
||||||
names::{PackageName, PackageNames},
|
names::{PackageName, PackageNames},
|
||||||
reporters::{response_to_async_read, DownloadProgressReporter},
|
reporters::{response_to_async_read, DownloadProgressReporter},
|
||||||
source::{
|
source::{
|
||||||
|
@ -147,6 +150,7 @@ impl PackageSource for PesdePackageSource {
|
||||||
let ResolveOptions {
|
let ResolveOptions {
|
||||||
project,
|
project,
|
||||||
target: project_target,
|
target: project_target,
|
||||||
|
loose_target,
|
||||||
..
|
..
|
||||||
} = options;
|
} = options;
|
||||||
|
|
||||||
|
@ -158,14 +162,28 @@ impl PackageSource for PesdePackageSource {
|
||||||
|
|
||||||
tracing::debug!("{} has {} possible entries", specifier.name, entries.len());
|
tracing::debug!("{} has {} possible entries", specifier.name, entries.len());
|
||||||
|
|
||||||
|
let suggestions = entries
|
||||||
|
.iter()
|
||||||
|
.filter(|(_, entry)| !entry.yanked)
|
||||||
|
.filter(|(v_id, _)| version_matches(&specifier.version, v_id.version()))
|
||||||
|
.map(|(v_id, _)| v_id.target())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let specifier_target = specifier.target.unwrap_or(*project_target);
|
||||||
|
|
||||||
Ok((
|
Ok((
|
||||||
PackageNames::Pesde(specifier.name.clone()),
|
PackageNames::Pesde(specifier.name.clone()),
|
||||||
entries
|
entries
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter(|(_, entry)| !entry.yanked)
|
.filter(|(_, entry)| !entry.yanked)
|
||||||
.filter(|(VersionId(version, target), _)| {
|
.filter(|(v_id, _)| version_matches(&specifier.version, v_id.version()))
|
||||||
version_matches(&specifier.version, version)
|
.filter(|(v_id, _)| {
|
||||||
&& specifier.target.unwrap_or(*project_target) == *target
|
// we want anything which might contain bins, scripts (so not Roblox)
|
||||||
|
if *loose_target && specifier_target == TargetKind::Luau {
|
||||||
|
!matches!(v_id.target(), TargetKind::Roblox | TargetKind::RobloxServer)
|
||||||
|
} else {
|
||||||
|
specifier_target == v_id.target()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.map(|(id, entry)| {
|
.map(|(id, entry)| {
|
||||||
(
|
(
|
||||||
|
@ -177,6 +195,7 @@ impl PackageSource for PesdePackageSource {
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.collect(),
|
.collect(),
|
||||||
|
suggestions,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,9 @@ pub struct ResolveOptions {
|
||||||
pub target: TargetKind,
|
pub target: TargetKind,
|
||||||
/// The sources that have been refreshed
|
/// The sources that have been refreshed
|
||||||
pub refreshed_sources: RefreshedSources,
|
pub refreshed_sources: RefreshedSources,
|
||||||
|
/// Whether to find any compatible target instead of a strict equal. Each source defines its
|
||||||
|
/// own loose rules.
|
||||||
|
pub loose_target: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Options for downloading a package
|
/// Options for downloading a package
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
manifest::{errors, Alias, DependencyType},
|
manifest::{errors, target::TargetKind, Alias, DependencyType},
|
||||||
names::wally::WallyPackageName,
|
names::wally::WallyPackageName,
|
||||||
source::{specifiers::DependencySpecifiers, wally::specifier::WallyDependencySpecifier},
|
source::{specifiers::DependencySpecifiers, wally::specifier::WallyDependencySpecifier},
|
||||||
};
|
};
|
||||||
|
@ -9,7 +9,7 @@ use semver::{Version, VersionReq};
|
||||||
use serde::{Deserialize, Deserializer};
|
use serde::{Deserialize, Deserializer};
|
||||||
use tracing::instrument;
|
use tracing::instrument;
|
||||||
|
|
||||||
#[derive(Deserialize, Clone, Debug)]
|
#[derive(Deserialize, Copy, Clone, Debug)]
|
||||||
#[serde(rename_all = "lowercase")]
|
#[serde(rename_all = "lowercase")]
|
||||||
pub enum Realm {
|
pub enum Realm {
|
||||||
#[serde(alias = "dev")]
|
#[serde(alias = "dev")]
|
||||||
|
@ -17,6 +17,15 @@ pub enum Realm {
|
||||||
Server,
|
Server,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Realm {
|
||||||
|
pub fn to_target(self) -> TargetKind {
|
||||||
|
match self {
|
||||||
|
Realm::Shared => TargetKind::Roblox,
|
||||||
|
Realm::Server => TargetKind::RobloxServer,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Clone, Debug)]
|
#[derive(Deserialize, Clone, Debug)]
|
||||||
#[serde(rename_all = "kebab-case")]
|
#[serde(rename_all = "kebab-case")]
|
||||||
pub struct WallyPackage {
|
pub struct WallyPackage {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
manifest::target::{Target, TargetKind},
|
manifest::target::Target,
|
||||||
names::{wally::WallyPackageName, PackageNames},
|
names::{wally::WallyPackageName, PackageNames},
|
||||||
reporters::{response_to_async_read, DownloadProgressReporter},
|
reporters::{response_to_async_read, DownloadProgressReporter},
|
||||||
source::{
|
source::{
|
||||||
|
@ -9,11 +9,7 @@ use crate::{
|
||||||
traits::{
|
traits::{
|
||||||
DownloadOptions, GetTargetOptions, PackageSource, RefreshOptions, ResolveOptions,
|
DownloadOptions, GetTargetOptions, PackageSource, RefreshOptions, ResolveOptions,
|
||||||
},
|
},
|
||||||
wally::{
|
wally::{compat_util::get_target, manifest::WallyManifest, pkg_ref::WallyPackageRef},
|
||||||
compat_util::get_target,
|
|
||||||
manifest::{Realm, WallyManifest},
|
|
||||||
pkg_ref::WallyPackageRef,
|
|
||||||
},
|
|
||||||
PackageSources, ResolveResult, IGNORED_DIRS, IGNORED_FILES,
|
PackageSources, ResolveResult, IGNORED_DIRS, IGNORED_FILES,
|
||||||
},
|
},
|
||||||
util::hash,
|
util::hash,
|
||||||
|
@ -24,7 +20,10 @@ use gix::Url;
|
||||||
use relative_path::RelativePathBuf;
|
use relative_path::RelativePathBuf;
|
||||||
use reqwest::header::AUTHORIZATION;
|
use reqwest::header::AUTHORIZATION;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use std::{collections::BTreeMap, path::PathBuf};
|
use std::{
|
||||||
|
collections::{BTreeMap, BTreeSet},
|
||||||
|
path::PathBuf,
|
||||||
|
};
|
||||||
use tokio::{io::AsyncReadExt as _, pin, task::spawn_blocking};
|
use tokio::{io::AsyncReadExt as _, pin, task::spawn_blocking};
|
||||||
use tokio_util::compat::FuturesAsyncReadCompatExt as _;
|
use tokio_util::compat::FuturesAsyncReadCompatExt as _;
|
||||||
use tracing::instrument;
|
use tracing::instrument;
|
||||||
|
@ -198,13 +197,7 @@ impl PackageSource for WallyPackageSource {
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
Ok((
|
Ok((
|
||||||
VersionId(
|
VersionId(manifest.package.version, manifest.package.realm.to_target()),
|
||||||
manifest.package.version,
|
|
||||||
match manifest.package.realm {
|
|
||||||
Realm::Server => TargetKind::RobloxServer,
|
|
||||||
Realm::Shared => TargetKind::Roblox,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
WallyPackageRef {
|
WallyPackageRef {
|
||||||
index_url: index_url.clone(),
|
index_url: index_url.clone(),
|
||||||
dependencies,
|
dependencies,
|
||||||
|
@ -212,6 +205,7 @@ impl PackageSource for WallyPackageSource {
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
.collect::<Result<_, errors::ResolveError>>()?,
|
.collect::<Result<_, errors::ResolveError>>()?,
|
||||||
|
BTreeSet::new(),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ use crate::{
|
||||||
};
|
};
|
||||||
use futures::StreamExt as _;
|
use futures::StreamExt as _;
|
||||||
use relative_path::RelativePathBuf;
|
use relative_path::RelativePathBuf;
|
||||||
use std::collections::BTreeMap;
|
use std::collections::{BTreeMap, BTreeSet};
|
||||||
use tokio::pin;
|
use tokio::pin;
|
||||||
use tracing::instrument;
|
use tracing::instrument;
|
||||||
|
|
||||||
|
@ -47,6 +47,8 @@ impl PackageSource for WorkspacePackageSource {
|
||||||
..
|
..
|
||||||
} = options;
|
} = options;
|
||||||
|
|
||||||
|
let mut suggestions = BTreeSet::new();
|
||||||
|
|
||||||
let (path, manifest) = 'finder: {
|
let (path, manifest) = 'finder: {
|
||||||
let target = specifier.target.unwrap_or(*project_target);
|
let target = specifier.target.unwrap_or(*project_target);
|
||||||
|
|
||||||
|
@ -54,10 +56,15 @@ impl PackageSource for WorkspacePackageSource {
|
||||||
pin!(members);
|
pin!(members);
|
||||||
|
|
||||||
while let Some((path, manifest)) = members.next().await.transpose()? {
|
while let Some((path, manifest)) = members.next().await.transpose()? {
|
||||||
if manifest.name == specifier.name && manifest.target.kind() == target {
|
let member_target = manifest.target.kind();
|
||||||
|
if manifest.name == specifier.name {
|
||||||
|
suggestions.insert(member_target);
|
||||||
|
|
||||||
|
if member_target == target {
|
||||||
break 'finder (path, manifest);
|
break 'finder (path, manifest);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return Err(errors::ResolveError::NoWorkspaceMember(
|
return Err(errors::ResolveError::NoWorkspaceMember(
|
||||||
specifier.name.to_string(),
|
specifier.name.to_string(),
|
||||||
|
@ -121,6 +128,7 @@ impl PackageSource for WorkspacePackageSource {
|
||||||
VersionId::new(manifest.version, manifest_target_kind),
|
VersionId::new(manifest.version, manifest_target_kind),
|
||||||
pkg_ref,
|
pkg_ref,
|
||||||
)]),
|
)]),
|
||||||
|
suggestions,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue