Enhance instance metadata and reconciliation logic for glob-ignored children

- Added `globIgnoredChildren` to `ApiInstanceMetadata` to manage child deletion behavior based on glob patterns.
- Updated `shouldDeleteChild` function to suppress deletions when `globIgnoredChildren` is true, differentiating from scripts-only mode.
- Enhanced tests to verify correct behavior of instance deletion based on the new metadata, ensuring robust handling of unknown scripts.
- Refactored snapshot handling to incorporate `globIgnoredChildren` in metadata, improving clarity and maintainability.
This commit is contained in:
Joe 2026-03-07 11:44:07 -06:00
parent 4b38c070fb
commit 12bccf91c5
50 changed files with 247 additions and 14 deletions

View file

@ -35,11 +35,17 @@ local SCRIPT_CLASS_NAMES = {
} }
local function shouldDeleteChild(virtualInstance, childInstance) local function shouldDeleteChild(virtualInstance, childInstance)
-- If the parent allows deleting unknown instances, always allow
if shouldDeleteUnknownInstances(virtualInstance) then if shouldDeleteUnknownInstances(virtualInstance) then
return true return true
end end
-- When the parent has glob-ignored children, suppress ALL deletions
-- (including scripts). This differs from scripts-only mode where
-- scripts are still eligible for deletion.
if virtualInstance.Metadata and virtualInstance.Metadata.globIgnoredChildren then
return false
end
-- In scripts-only mode (where parent has ignoreUnknownInstances: true), -- In scripts-only mode (where parent has ignoreUnknownInstances: true),
-- we still want to allow deletion of scripts. This ensures deleted -- we still want to allow deletion of scripts. This ensures deleted
-- script files show up in the sync diff. -- script files show up in the sync diff.

View file

@ -244,6 +244,64 @@ return function()
assert(isEmpty(patch.removed)) assert(isEmpty(patch.removed))
end) end)
it(
"should still remove unknown scripts when ignoreUnknownInstances is true but globIgnoredChildren is false",
function()
local knownInstances = InstanceMap.new()
local virtualInstances = {
ROOT = {
ClassName = "Folder",
Name = "Folder",
Properties = {},
Children = {},
Metadata = {
ignoreUnknownInstances = true,
globIgnoredChildren = false,
},
},
}
local rootInstance = Instance.new("Folder")
local unknownScript = Instance.new("ModuleScript")
unknownScript.Parent = rootInstance
knownInstances:insert("ROOT", rootInstance)
local ok, patch = diff(knownInstances, virtualInstances, "ROOT")
assert(ok, tostring(patch))
expect(#patch.removed).to.equal(1)
expect(patch.removed[1]).to.equal(unknownScript)
end
)
it("should NOT remove unknown scripts when globIgnoredChildren is true", function()
local knownInstances = InstanceMap.new()
local virtualInstances = {
ROOT = {
ClassName = "Folder",
Name = "Folder",
Properties = {},
Children = {},
Metadata = {
ignoreUnknownInstances = true,
globIgnoredChildren = true,
},
},
}
local rootInstance = Instance.new("Folder")
local unknownScript = Instance.new("ModuleScript")
unknownScript.Parent = rootInstance
knownInstances:insert("ROOT", rootInstance)
local ok, patch = diff(knownInstances, virtualInstances, "ROOT")
assert(ok, tostring(patch))
assert(isEmpty(patch.removed))
end)
it("should generate a patch with an added child", function() it("should generate a patch with an added child", function()
local knownInstances = InstanceMap.new() local knownInstances = InstanceMap.new()
local virtualInstances = { local virtualInstances = {

View file

@ -9,6 +9,7 @@ local ApiValue = t.keys(t.string)
local ApiInstanceMetadata = t.interface({ local ApiInstanceMetadata = t.interface({
ignoreUnknownInstances = t.optional(t.boolean), ignoreUnknownInstances = t.optional(t.boolean),
globIgnoredChildren = t.optional(t.boolean),
}) })
local ApiInstance = t.interface({ local ApiInstance = t.interface({

View file

@ -371,14 +371,7 @@ impl ServeSession {
let patch_start = Instant::now(); let patch_start = Instant::now();
let project_folder = root_project.folder_location().to_path_buf(); let project_folder = root_project.folder_location().to_path_buf();
let watch_ignore_rules: Vec<PathIgnoreRule> = root_project let watch_ignore_rules = root_project.path_ignore_rules();
.glob_ignore_paths
.iter()
.map(|glob| PathIgnoreRule {
glob: glob.clone(),
base_path: root_project.folder_location().to_path_buf(),
})
.collect();
std::thread::scope(|s| { std::thread::scope(|s| {
s.spawn(|| { s.spawn(|| {
use walkdir::WalkDir; use walkdir::WalkDir;

View file

@ -21,6 +21,11 @@ pub struct InstanceMetadata {
/// manage. /// manage.
pub ignore_unknown_instances: bool, pub ignore_unknown_instances: bool,
/// Whether this directory had children excluded by `globIgnorePaths`.
/// Distinguishes glob-ignored directories (suppress ALL deletions including
/// scripts) from scripts-only mode (suppress non-script deletions only).
pub glob_ignored_children: bool,
/// If a change occurs to this instance, the instigating source is what /// If a change occurs to this instance, the instigating source is what
/// should be run through the snapshot functions to regenerate it. /// should be run through the snapshot functions to regenerate it.
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
@ -79,6 +84,7 @@ impl InstanceMetadata {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
ignore_unknown_instances: false, ignore_unknown_instances: false,
glob_ignored_children: false,
instigating_source: None, instigating_source: None,
relevant_paths: Vec::new(), relevant_paths: Vec::new(),
context: InstanceContext::default(), context: InstanceContext::default(),
@ -96,6 +102,13 @@ impl InstanceMetadata {
} }
} }
pub fn glob_ignored_children(self, glob_ignored_children: bool) -> Self {
Self {
glob_ignored_children,
..self
}
}
pub fn instigating_source(self, instigating_source: impl Into<InstigatingSource>) -> Self { pub fn instigating_source(self, instigating_source: impl Into<InstigatingSource>) -> Self {
Self { Self {
instigating_source: Some(instigating_source.into()), instigating_source: Some(instigating_source.into()),

View file

@ -110,6 +110,8 @@ fn compute_patch_set_internal(
.get_instance(id) .get_instance(id)
.expect("Instance did not exist in tree"); .expect("Instance did not exist in tree");
let ignore_unknown = snapshot.metadata.ignore_unknown_instances;
compute_property_patches( compute_property_patches(
&context.snapshot_specified_ids, &context.snapshot_specified_ids,
&mut snapshot, &mut snapshot,
@ -117,7 +119,15 @@ fn compute_patch_set_internal(
patch_set, patch_set,
tree, tree,
); );
compute_children_patches(context, &mut snapshot, tree, id, patch_set, session); compute_children_patches(
context,
&mut snapshot,
tree,
id,
patch_set,
session,
ignore_unknown,
);
} }
fn compute_property_patches( fn compute_property_patches(
@ -267,6 +277,7 @@ fn compute_children_patches(
id: Ref, id: Ref,
patch_set: &mut PatchSet, patch_set: &mut PatchSet,
session: &super::matching::MatchingSession, session: &super::matching::MatchingSession,
ignore_unknown_instances: bool,
) { ) {
use super::matching::match_forward; use super::matching::match_forward;
@ -310,9 +321,13 @@ fn compute_children_patches(
}); });
} }
// Unmatched tree children: instances to be removed. // Unmatched tree children: instances to be removed, unless the parent
for tree_child_id in match_result.unmatched_tree { // snapshot says to ignore unknown instances (e.g. $ignoreUnknownInstances
patch_set.removed_instances.push(tree_child_id); // or directories with glob-ignored children).
if !ignore_unknown_instances {
for tree_child_id in match_result.unmatched_tree {
patch_set.removed_instances.push(tree_child_id);
}
} }
} }
@ -426,6 +441,96 @@ mod test {
assert_eq!(patch_set, expected_patch_set); assert_eq!(patch_set, expected_patch_set);
} }
#[test]
fn ignore_unknown_instances_suppresses_removals() {
use super::super::patch_apply::apply_patch_set;
let mut tree = RojoTree::new(InstanceSnapshot::new().name("root").class_name("Folder"));
let root_id = tree.get_root_id();
// Add two children (A and B) to the tree via a patch.
let add_patch = PatchSet {
added_instances: vec![
PatchAdd {
parent_id: root_id,
instance: InstanceSnapshot::new().name("A").class_name("Folder"),
},
PatchAdd {
parent_id: root_id,
instance: InstanceSnapshot::new().name("B").class_name("Folder"),
},
],
updated_instances: Vec::new(),
removed_instances: Vec::new(),
stage_ids: std::collections::HashSet::new(),
stage_paths: Vec::new(),
};
apply_patch_set(&mut tree, add_patch);
// Snapshot only has child A, with ignore_unknown_instances = true.
// Child B is "unknown" and should NOT be removed.
let snapshot = InstanceSnapshot {
snapshot_id: Ref::none(),
metadata: super::super::InstanceMetadata::new().ignore_unknown_instances(true),
properties: UstrMap::new(),
name: Cow::Borrowed("root"),
class_name: ustr("Folder"),
children: vec![InstanceSnapshot::new().name("A").class_name("Folder")],
};
let patch_set = compute_patch_set(Some(snapshot), &tree, root_id);
assert!(
patch_set.removed_instances.is_empty(),
"Unmatched tree children should NOT be removed when ignore_unknown_instances is true"
);
}
#[test]
fn default_removes_unmatched_children() {
use super::super::patch_apply::apply_patch_set;
let mut tree = RojoTree::new(InstanceSnapshot::new().name("root").class_name("Folder"));
let root_id = tree.get_root_id();
let add_patch = PatchSet {
added_instances: vec![
PatchAdd {
parent_id: root_id,
instance: InstanceSnapshot::new().name("A").class_name("Folder"),
},
PatchAdd {
parent_id: root_id,
instance: InstanceSnapshot::new().name("B").class_name("Folder"),
},
],
updated_instances: Vec::new(),
removed_instances: Vec::new(),
stage_ids: std::collections::HashSet::new(),
stage_paths: Vec::new(),
};
apply_patch_set(&mut tree, add_patch);
// Snapshot only has child A, with default metadata (ignore_unknown_instances = false).
// Child B should be removed.
let snapshot = InstanceSnapshot {
snapshot_id: Ref::none(),
metadata: Default::default(),
properties: UstrMap::new(),
name: Cow::Borrowed("root"),
class_name: ustr("Folder"),
children: vec![InstanceSnapshot::new().name("A").class_name("Folder")],
};
let patch_set = compute_patch_set(Some(snapshot), &tree, root_id);
assert_eq!(
patch_set.removed_instances.len(),
1,
"Unmatched tree children should be removed when ignore_unknown_instances is false"
);
}
/// The same as rewrite_ref_existing_instance_update, except that the /// The same as rewrite_ref_existing_instance_update, except that the
/// property is added in a new instance instead of modifying an existing /// property is added in a new instance instead of modifying an existing
/// one. /// one.

View file

@ -10,6 +10,7 @@ properties:
"!String": Value of Foo "!String": Value of Foo
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
relevant_paths: [] relevant_paths: []
context: {} context: {}
specified_id: ~ specified_id: ~

View file

@ -8,6 +8,7 @@ class_name: ROOT
properties: {} properties: {}
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
relevant_paths: [] relevant_paths: []
context: {} context: {}
specified_id: ~ specified_id: ~

View file

@ -10,6 +10,7 @@ properties:
"!String": Should be removed "!String": Should be removed
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
relevant_paths: [] relevant_paths: []
context: {} context: {}
specified_id: ~ specified_id: ~

View file

@ -8,6 +8,7 @@ class_name: Folder
properties: {} properties: {}
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
relevant_paths: [] relevant_paths: []
context: {} context: {}
specified_id: ~ specified_id: ~

View file

@ -9,6 +9,7 @@ added_instances:
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
relevant_paths: [] relevant_paths: []
context: {} context: {}
specified_id: ~ specified_id: ~

View file

@ -118,7 +118,8 @@ pub fn snapshot_dir_no_meta(
.instigating_source(path) .instigating_source(path)
.relevant_paths(relevant_paths) .relevant_paths(relevant_paths)
.context(context) .context(context)
.ignore_unknown_instances(any_child_glob_ignored), .ignore_unknown_instances(any_child_glob_ignored)
.glob_ignored_children(any_child_glob_ignored),
); );
Ok(Some(snapshot)) Ok(Some(snapshot))
@ -602,6 +603,10 @@ mod test {
snap.metadata.ignore_unknown_instances, snap.metadata.ignore_unknown_instances,
"Directory with glob-ignored children should have ignore_unknown_instances = true" "Directory with glob-ignored children should have ignore_unknown_instances = true"
); );
assert!(
snap.metadata.glob_ignored_children,
"Directory with glob-ignored children should have glob_ignored_children = true"
);
assert_eq!( assert_eq!(
snap.children.len(), snap.children.len(),
1, 1,
@ -636,6 +641,10 @@ mod test {
!snap.metadata.ignore_unknown_instances, !snap.metadata.ignore_unknown_instances,
"Directory without glob-ignored children should have ignore_unknown_instances = false" "Directory without glob-ignored children should have ignore_unknown_instances = false"
); );
assert!(
!snap.metadata.glob_ignored_children,
"Directory without glob-ignored children should have glob_ignored_children = false"
);
assert_eq!(snap.children.len(), 2); assert_eq!(snap.children.len(), 2);
} }
} }

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.csv Path: /foo.csv
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /root/init.csv Path: /root/init.csv
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /root/init.csv Path: /root/init.csv
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: true ignore_unknown_instances: true
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.csv Path: /foo.csv
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo Path: /foo
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo Path: /foo
relevant_paths: relevant_paths:
@ -30,6 +31,7 @@ children:
- snapshot_id: "00000000000000000000000000000000" - snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo/Child Path: /foo/Child
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.json5 Path: /foo.json5
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.json5 Path: /foo.json5
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.model.json5 Path: /foo.model.json5
relevant_paths: relevant_paths:
@ -22,6 +23,7 @@ children:
- snapshot_id: "00000000000000000000000000000000" - snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
relevant_paths: [] relevant_paths: []
context: {} context: {}
specified_id: ~ specified_id: ~

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.model.json5 Path: /foo.model.json5
relevant_paths: relevant_paths:
@ -22,6 +23,7 @@ children:
- snapshot_id: "00000000000000000000000000000000" - snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
relevant_paths: [] relevant_paths: []
context: {} context: {}
specified_id: ~ specified_id: ~

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.client.luau Path: /foo.client.luau
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /root/init.luau Path: /root/init.luau
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /root/init.luau Path: /root/init.luau
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.legacy.luau Path: /foo.legacy.luau
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.local.luau Path: /foo.local.luau
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.luau Path: /foo.luau
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: true ignore_unknown_instances: true
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.luau Path: /foo.luau
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.plugin.luau Path: /foo.plugin.luau
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /bar.server.luau Path: /bar.server.luau
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.server.luau Path: /foo.server.luau
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: true ignore_unknown_instances: true
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.server.luau Path: /foo.server.luau
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
relevant_paths: relevant_paths:
- /foo/bar.meta.json5 - /foo/bar.meta.json5
context: {} context: {}

View file

@ -5,6 +5,7 @@ expression: snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
relevant_paths: relevant_paths:
- /foo/init.meta.json5 - /foo/init.meta.json5
context: {} context: {}

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: true ignore_unknown_instances: true
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo/default.project.json5 Path: /foo/default.project.json5
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: true ignore_unknown_instances: true
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo/hello.project.json5 Path: /foo/hello.project.json5
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: true ignore_unknown_instances: true
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo/default.project.json5 Path: /foo/default.project.json5
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: true ignore_unknown_instances: true
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.project.json5 Path: /foo.project.json5
relevant_paths: relevant_paths:
@ -20,6 +21,7 @@ children:
- snapshot_id: "00000000000000000000000000000000" - snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: true ignore_unknown_instances: true
glob_ignored_children: false
instigating_source: instigating_source:
ProjectNode: ProjectNode:
path: /foo.project.json5 path: /foo.project.json5

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: true ignore_unknown_instances: true
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo/default.project.json5 Path: /foo/default.project.json5
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: true ignore_unknown_instances: true
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo/default.project.json5 Path: /foo/default.project.json5
relevant_paths: relevant_paths:
@ -21,6 +22,7 @@ children:
- snapshot_id: "00000000000000000000000000000000" - snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: true ignore_unknown_instances: true
glob_ignored_children: false
instigating_source: instigating_source:
ProjectNode: ProjectNode:
path: /foo/other.project.json5 path: /foo/other.project.json5

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo/default.project.json5 Path: /foo/default.project.json5
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: true ignore_unknown_instances: true
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.project.json5 Path: /foo.project.json5
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: true ignore_unknown_instances: true
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.project.json5 Path: /foo.project.json5
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.toml Path: /foo.toml
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: foo.toml Path: foo.toml
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.txt Path: /foo.txt
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.txt Path: /foo.txt
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: /foo.yaml Path: /foo.yaml
relevant_paths: relevant_paths:

View file

@ -5,6 +5,7 @@ expression: instance_snapshot
snapshot_id: "00000000000000000000000000000000" snapshot_id: "00000000000000000000000000000000"
metadata: metadata:
ignore_unknown_instances: false ignore_unknown_instances: false
glob_ignored_children: false
instigating_source: instigating_source:
Path: foo.yaml Path: foo.yaml
relevant_paths: relevant_paths: