Fix updating components and local components (#4856)
* Fix updating components and local components * fix typo
This commit is contained in:
1 parent
6e3f362872
commit
43373f0be7
1 file changed
+33
-15
@@ -24,7 +24,7 @@ pub enum ComponentCommand {
|
|||||||
|
|
||||||
/// The registry to use
|
/// The registry to use
|
||||||
#[clap(flatten)]
|
#[clap(flatten)]
|
||||||
registry: Option<ComponentRegistry>,
|
registry: ComponentRegistry,
|
||||||
|
|
||||||
/// Overwrite the component if it already exists
|
/// Overwrite the component if it already exists
|
||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
@@ -38,7 +38,7 @@ pub enum ComponentCommand {
|
|||||||
|
|
||||||
/// The registry to use
|
/// The registry to use
|
||||||
#[clap(flatten)]
|
#[clap(flatten)]
|
||||||
registry: Option<ComponentRegistry>,
|
registry: ComponentRegistry,
|
||||||
},
|
},
|
||||||
|
|
||||||
/// Update a component registry
|
/// Update a component registry
|
||||||
@@ -52,7 +52,7 @@ pub enum ComponentCommand {
|
|||||||
List {
|
List {
|
||||||
/// The registry to list components in
|
/// The registry to list components in
|
||||||
#[clap(flatten)]
|
#[clap(flatten)]
|
||||||
registry: Option<ComponentRegistry>,
|
registry: ComponentRegistry,
|
||||||
},
|
},
|
||||||
|
|
||||||
/// Clear the component registry cache
|
/// Clear the component registry cache
|
||||||
@@ -109,6 +109,9 @@ impl ComponentCommand {
|
|||||||
// Resolve the registry
|
// Resolve the registry
|
||||||
let registry = Self::resolve_registry(registry, &config)?;
|
let registry = Self::resolve_registry(registry, &config)?;
|
||||||
|
|
||||||
|
// Get the registry root. Components can't copy files outside of this path
|
||||||
|
let registry_root = registry.resolve().await?;
|
||||||
|
|
||||||
// Read all components from the registry
|
// Read all components from the registry
|
||||||
let components = registry.read_components().await?;
|
let components = registry.read_components().await?;
|
||||||
let mode = if force {
|
let mode = if force {
|
||||||
@@ -183,6 +186,7 @@ impl ComponentCommand {
|
|||||||
// Once we have all required components, add them
|
// Once we have all required components, add them
|
||||||
for (component, mode) in required_components {
|
for (component, mode) in required_components {
|
||||||
add_component(
|
add_component(
|
||||||
|
®istry_root,
|
||||||
component_args.global_assets_path.as_deref(),
|
component_args.global_assets_path.as_deref(),
|
||||||
component_args.module_path.as_deref(),
|
component_args.module_path.as_deref(),
|
||||||
&component,
|
&component,
|
||||||
@@ -244,7 +248,7 @@ impl ComponentCommand {
|
|||||||
/// Remove a component from the managed component module
|
/// Remove a component from the managed component module
|
||||||
async fn remove_component(
|
async fn remove_component(
|
||||||
component_args: &ComponentArgs,
|
component_args: &ComponentArgs,
|
||||||
registry: Option<ComponentRegistry>,
|
registry: ComponentRegistry,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let config = Self::resolve_config().await?;
|
let config = Self::resolve_config().await?;
|
||||||
let registry = Self::resolve_registry(registry, &config)?;
|
let registry = Self::resolve_registry(registry, &config)?;
|
||||||
@@ -294,10 +298,10 @@ impl ComponentCommand {
|
|||||||
|
|
||||||
/// Resolve a registry from the config if none is provided
|
/// Resolve a registry from the config if none is provided
|
||||||
fn resolve_registry(
|
fn resolve_registry(
|
||||||
registry: Option<ComponentRegistry>,
|
registry: ComponentRegistry,
|
||||||
config: &DioxusConfig,
|
config: &DioxusConfig,
|
||||||
) -> Result<ComponentRegistry> {
|
) -> Result<ComponentRegistry> {
|
||||||
if let Some(registry) = registry {
|
if !registry.is_default() {
|
||||||
return Ok(registry);
|
return Ok(registry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -398,6 +402,14 @@ impl RemoteComponentRegistry {
|
|||||||
if let Some(rev) = &rev {
|
if let Some(rev) = &rev {
|
||||||
Self::checkout_rev(&repo, &git, rev)?;
|
Self::checkout_rev(&repo, &git, rev)?;
|
||||||
}
|
}
|
||||||
|
// Otherwise, just checkout the latest commit on the default branch
|
||||||
|
else {
|
||||||
|
let head = repo.head()?;
|
||||||
|
let branch = head.shorthand().unwrap_or("main");
|
||||||
|
let oid = repo.refname_to_id(&format!("refs/remotes/origin/{branch}"))?;
|
||||||
|
let object = repo.find_object(oid, None).unwrap();
|
||||||
|
repo.reset(&object, git2::ResetType::Hard, None)?;
|
||||||
|
}
|
||||||
anyhow::Ok(())
|
anyhow::Ok(())
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -560,6 +572,7 @@ enum ComponentExistsBehavior {
|
|||||||
|
|
||||||
/// Add a component to the managed component module
|
/// Add a component to the managed component module
|
||||||
async fn add_component(
|
async fn add_component(
|
||||||
|
registry_root: &Path,
|
||||||
assets_path: Option<&Path>,
|
assets_path: Option<&Path>,
|
||||||
component_path: Option<&Path>,
|
component_path: Option<&Path>,
|
||||||
component: &ResolvedComponent,
|
component: &ResolvedComponent,
|
||||||
@@ -585,7 +598,7 @@ async fn add_component(
|
|||||||
|
|
||||||
// Copy any global assets
|
// Copy any global assets
|
||||||
let assets_root = global_assets_root(assets_path, config).await?;
|
let assets_root = global_assets_root(assets_path, config).await?;
|
||||||
copy_global_assets(&assets_root, component).await?;
|
copy_global_assets(registry_root, &assets_root, component).await?;
|
||||||
|
|
||||||
// Add the module to the components mod.rs
|
// Add the module to the components mod.rs
|
||||||
let mod_rs_path = components_root.join("mod.rs");
|
let mod_rs_path = components_root.join("mod.rs");
|
||||||
@@ -739,8 +752,9 @@ async fn read_component(path: &Path) -> Result<ResolvedComponent> {
|
|||||||
})?;
|
})?;
|
||||||
|
|
||||||
let component = serde_json::from_slice(&bytes)?;
|
let component = serde_json::from_slice(&bytes)?;
|
||||||
|
let absolute_path = dunce::canonicalize(path)?;
|
||||||
Ok(ResolvedComponent {
|
Ok(ResolvedComponent {
|
||||||
path: path.to_path_buf(),
|
path: absolute_path,
|
||||||
component,
|
component,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -771,9 +785,12 @@ async fn discover_components(root: ResolvedComponent) -> Result<Vec<ResolvedComp
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Copy any global assets for the component
|
/// Copy any global assets for the component
|
||||||
async fn copy_global_assets(assets_root: &Path, component: &ResolvedComponent) -> Result<()> {
|
async fn copy_global_assets(
|
||||||
let cache_dir = Workspace::component_cache_dir();
|
registry_root: &Path,
|
||||||
|
assets_root: &Path,
|
||||||
|
component: &ResolvedComponent,
|
||||||
|
) -> Result<()> {
|
||||||
|
let canonical_registry_root = dunce::canonicalize(registry_root)?;
|
||||||
for path in &component.global_assets {
|
for path in &component.global_assets {
|
||||||
let src = component.path.join(path);
|
let src = component.path.join(path);
|
||||||
let absolute_source = dunce::canonicalize(&src).with_context(|| {
|
let absolute_source = dunce::canonicalize(&src).with_context(|| {
|
||||||
@@ -785,11 +802,12 @@ async fn copy_global_assets(assets_root: &Path, component: &ResolvedComponent) -
|
|||||||
})?;
|
})?;
|
||||||
|
|
||||||
// Make sure the source is inside the component registry somewhere
|
// Make sure the source is inside the component registry somewhere
|
||||||
if !absolute_source.starts_with(&cache_dir) {
|
if !absolute_source.starts_with(&canonical_registry_root) {
|
||||||
bail!(
|
bail!(
|
||||||
"Cannot copy global asset '{}' for component '{}' because it is outside of the component registry",
|
"Cannot copy global asset '{}' for component '{}' because it is outside of the component registry '{}'",
|
||||||
src.display(),
|
absolute_source.display(),
|
||||||
component.name
|
component.name,
|
||||||
|
canonical_registry_root.display()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user