forked from rojo-rbx/rojo
* Add Glob wrapper type with better serialization * Introduce PathIgnoreRule struct * Implement equality for Glob type * Add PathIgnoreRule to InstanceContext * Implement glob ignores in directory middleware * Fix up filters * Use Iterator::all instead of loop * Add project-level configuration for glob ignores * Add test project for glob ignores * Wire up project file and snapshots to make glob ignores work * Better codepaths for adding ignore rules with empty iterators * Add test for globs inherited from parent projects * Add test details, support glob ignores in nested projects * Add feature flag for globs * Switch to use ExactSizeIterator instead of size_hint * Remove glob visitor
66 lines
2.0 KiB
Rust
66 lines
2.0 KiB
Rust
//! Initialization routines that are used by more than one Rojo command or
|
|
//! utility.
|
|
|
|
use std::path::Path;
|
|
|
|
use rbx_dom_weak::RbxInstanceProperties;
|
|
|
|
use crate::{
|
|
project::Project,
|
|
snapshot::{
|
|
apply_patch_set, compute_patch_set, InstanceContext, InstancePropertiesWithMeta,
|
|
PathIgnoreRule, RojoTree,
|
|
},
|
|
snapshot_middleware::snapshot_from_vfs,
|
|
vfs::{Vfs, VfsFetcher},
|
|
};
|
|
|
|
pub fn start<F: VfsFetcher>(
|
|
fuzzy_project_path: &Path,
|
|
vfs: &Vfs<F>,
|
|
) -> (Option<Project>, RojoTree) {
|
|
log::trace!("Loading project file from {}", fuzzy_project_path.display());
|
|
let maybe_project = Project::load_fuzzy(fuzzy_project_path).expect("TODO: Project load failed");
|
|
|
|
log::trace!("Constructing initial tree");
|
|
let mut tree = RojoTree::new(InstancePropertiesWithMeta {
|
|
properties: RbxInstanceProperties {
|
|
name: "ROOT".to_owned(),
|
|
class_name: "Folder".to_owned(),
|
|
properties: Default::default(),
|
|
},
|
|
metadata: Default::default(),
|
|
});
|
|
|
|
let root_id = tree.get_root_id();
|
|
|
|
log::trace!("Reading project root");
|
|
let entry = vfs
|
|
.get(fuzzy_project_path)
|
|
.expect("could not get project path");
|
|
|
|
let mut instance_context = InstanceContext::default();
|
|
|
|
if let Some(project) = &maybe_project {
|
|
let rules = project.glob_ignore_paths.iter().map(|glob| PathIgnoreRule {
|
|
glob: glob.clone(),
|
|
base_path: project.folder_location().to_path_buf(),
|
|
});
|
|
|
|
instance_context.add_path_ignore_rules(rules);
|
|
}
|
|
|
|
log::trace!("Generating snapshot of instances from VFS");
|
|
let snapshot = snapshot_from_vfs(&instance_context, vfs, &entry)
|
|
.expect("snapshot failed")
|
|
.expect("snapshot did not return an instance");
|
|
|
|
log::trace!("Computing patch set");
|
|
let patch_set = compute_patch_set(&snapshot, &tree, root_id);
|
|
|
|
log::trace!("Applying patch set");
|
|
apply_patch_set(&mut tree, patch_set);
|
|
|
|
(maybe_project, tree)
|
|
}
|