mirror of
https://github.com/rojo-rbx/rojo.git
synced 2026-04-25 15:16:07 +00:00
Defer application of init.meta.json until after init Lua files. (#549)
Fixes #546.
This commit is contained in:
committed by
GitHub
parent
c06463b61d
commit
e5dbee1073
@@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
source: tests/tests/build.rs
|
||||||
|
assertion_line: 98
|
||||||
|
expression: contents
|
||||||
|
---
|
||||||
|
<roblox version="4">
|
||||||
|
<Item class="LocalScript" referent="0">
|
||||||
|
<Properties>
|
||||||
|
<string name="Name">issue_546</string>
|
||||||
|
<bool name="Disabled">true</bool>
|
||||||
|
<string name="Source">print("Hello, world!")</string>
|
||||||
|
</Properties>
|
||||||
|
</Item>
|
||||||
|
</roblox>
|
||||||
2
rojo-test/build-tests/issue_546/README.md
Normal file
2
rojo-test/build-tests/issue_546/README.md
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# Issue #546 (https://github.com/rojo-rbx/rojo/issues/546)
|
||||||
|
Regression from Rojo 6.2.0 to Rojo 7.0.0. Meta files named as init.meta.json should apply after init.client.lua and other init files.
|
||||||
6
rojo-test/build-tests/issue_546/default.project.json
Normal file
6
rojo-test/build-tests/issue_546/default.project.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"name": "issue_546",
|
||||||
|
"tree": {
|
||||||
|
"$path": "hello"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
rojo-test/build-tests/issue_546/hello/init.client.lua
Normal file
1
rojo-test/build-tests/issue_546/hello/init.client.lua
Normal file
@@ -0,0 +1 @@
|
|||||||
|
print("Hello, world!")
|
||||||
5
rojo-test/build-tests/issue_546/hello/init.meta.json
Normal file
5
rojo-test/build-tests/issue_546/hello/init.meta.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"Disabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,6 +10,40 @@ pub fn snapshot_dir(
|
|||||||
context: &InstanceContext,
|
context: &InstanceContext,
|
||||||
vfs: &Vfs,
|
vfs: &Vfs,
|
||||||
path: &Path,
|
path: &Path,
|
||||||
|
) -> anyhow::Result<Option<InstanceSnapshot>> {
|
||||||
|
let mut snapshot = match snapshot_dir_no_meta(context, vfs, path)? {
|
||||||
|
Some(snapshot) => snapshot,
|
||||||
|
None => return Ok(None),
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(mut meta) = dir_meta(vfs, path)? {
|
||||||
|
meta.apply_all(&mut snapshot)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(Some(snapshot))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Retrieves the meta file that should be applied for this directory, if it
|
||||||
|
/// exists.
|
||||||
|
pub fn dir_meta(vfs: &Vfs, path: &Path) -> anyhow::Result<Option<DirectoryMetadata>> {
|
||||||
|
let meta_path = path.join("init.meta.json");
|
||||||
|
|
||||||
|
if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? {
|
||||||
|
let metadata = DirectoryMetadata::from_slice(&meta_contents, meta_path)?;
|
||||||
|
Ok(Some(metadata))
|
||||||
|
} else {
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Snapshot a directory without applying meta files; useful for if the
|
||||||
|
/// directory's ClassName will change before metadata should be applied. For
|
||||||
|
/// example, this can happen if the directory contains an `init.client.lua`
|
||||||
|
/// file.
|
||||||
|
pub fn snapshot_dir_no_meta(
|
||||||
|
context: &InstanceContext,
|
||||||
|
vfs: &Vfs,
|
||||||
|
path: &Path,
|
||||||
) -> anyhow::Result<Option<InstanceSnapshot>> {
|
) -> anyhow::Result<Option<InstanceSnapshot>> {
|
||||||
let passes_filter_rules = |child: &DirEntry| {
|
let passes_filter_rules = |child: &DirEntry| {
|
||||||
context
|
context
|
||||||
@@ -52,7 +86,7 @@ pub fn snapshot_dir(
|
|||||||
path.join("init.client.lua"),
|
path.join("init.client.lua"),
|
||||||
];
|
];
|
||||||
|
|
||||||
let mut snapshot = InstanceSnapshot::new()
|
let snapshot = InstanceSnapshot::new()
|
||||||
.name(instance_name)
|
.name(instance_name)
|
||||||
.class_name("Folder")
|
.class_name("Folder")
|
||||||
.children(snapshot_children)
|
.children(snapshot_children)
|
||||||
@@ -63,11 +97,6 @@ pub fn snapshot_dir(
|
|||||||
.context(context),
|
.context(context),
|
||||||
);
|
);
|
||||||
|
|
||||||
if let Some(meta_contents) = vfs.read(&meta_path).with_not_found()? {
|
|
||||||
let mut metadata = DirectoryMetadata::from_slice(&meta_contents, meta_path)?;
|
|
||||||
metadata.apply_all(&mut snapshot)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(Some(snapshot))
|
Ok(Some(snapshot))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,11 @@ use memofs::{IoResultExt, Vfs};
|
|||||||
|
|
||||||
use crate::snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot};
|
use crate::snapshot::{InstanceContext, InstanceMetadata, InstanceSnapshot};
|
||||||
|
|
||||||
use super::{dir::snapshot_dir, meta_file::AdjacentMetadata, util::match_trailing};
|
use super::{
|
||||||
|
dir::{dir_meta, snapshot_dir_no_meta},
|
||||||
|
meta_file::AdjacentMetadata,
|
||||||
|
util::match_trailing,
|
||||||
|
};
|
||||||
|
|
||||||
/// Core routine for turning Lua files into snapshots.
|
/// Core routine for turning Lua files into snapshots.
|
||||||
pub fn snapshot_lua(
|
pub fn snapshot_lua(
|
||||||
@@ -66,7 +70,7 @@ pub fn snapshot_lua_init(
|
|||||||
init_path: &Path,
|
init_path: &Path,
|
||||||
) -> anyhow::Result<Option<InstanceSnapshot>> {
|
) -> anyhow::Result<Option<InstanceSnapshot>> {
|
||||||
let folder_path = init_path.parent().unwrap();
|
let folder_path = init_path.parent().unwrap();
|
||||||
let dir_snapshot = snapshot_dir(context, vfs, folder_path)?.unwrap();
|
let dir_snapshot = snapshot_dir_no_meta(context, vfs, folder_path)?.unwrap();
|
||||||
|
|
||||||
if dir_snapshot.class_name != "Folder" {
|
if dir_snapshot.class_name != "Folder" {
|
||||||
anyhow::bail!(
|
anyhow::bail!(
|
||||||
@@ -86,6 +90,10 @@ pub fn snapshot_lua_init(
|
|||||||
init_snapshot.children = dir_snapshot.children;
|
init_snapshot.children = dir_snapshot.children;
|
||||||
init_snapshot.metadata = dir_snapshot.metadata;
|
init_snapshot.metadata = dir_snapshot.metadata;
|
||||||
|
|
||||||
|
if let Some(mut meta) = dir_meta(vfs, folder_path)? {
|
||||||
|
meta.apply_all(&mut init_snapshot)?;
|
||||||
|
}
|
||||||
|
|
||||||
Ok(Some(init_snapshot))
|
Ok(Some(init_snapshot))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,11 +36,13 @@ gen_build_tests! {
|
|||||||
init_meta_class_name,
|
init_meta_class_name,
|
||||||
init_meta_properties,
|
init_meta_properties,
|
||||||
init_with_children,
|
init_with_children,
|
||||||
|
issue_546,
|
||||||
json_as_lua,
|
json_as_lua,
|
||||||
json_model_in_folder,
|
json_model_in_folder,
|
||||||
json_model_legacy_name,
|
json_model_legacy_name,
|
||||||
module_in_folder,
|
module_in_folder,
|
||||||
module_init,
|
module_init,
|
||||||
|
optional,
|
||||||
project_composed_default,
|
project_composed_default,
|
||||||
project_composed_file,
|
project_composed_file,
|
||||||
project_root_name,
|
project_root_name,
|
||||||
@@ -53,7 +55,6 @@ gen_build_tests! {
|
|||||||
txt,
|
txt,
|
||||||
txt_in_folder,
|
txt_in_folder,
|
||||||
unresolved_values,
|
unresolved_values,
|
||||||
optional,
|
|
||||||
weldconstraint,
|
weldconstraint,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user