mirror of
https://github.com/rojo-rbx/rojo.git
synced 2026-04-23 14:15:24 +00:00
Compare commits
13 Commits
v0.5.0-alp
...
v0.5.0-alp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
83a0ae673c | ||
|
|
7de646c290 | ||
|
|
5d681a72ac | ||
|
|
d725970e6e | ||
|
|
54b82760cd | ||
|
|
77f79fa913 | ||
|
|
6db714a2b1 | ||
|
|
913ac7c9f5 | ||
|
|
eecbfd29e7 | ||
|
|
41025225b2 | ||
|
|
07c7b28c03 | ||
|
|
3faf3d2a56 | ||
|
|
be094d5b7c |
22
CHANGELOG.md
22
CHANGELOG.md
@@ -2,6 +2,28 @@
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.5.0 Alpha 9](https://github.com/LPGhatguy/rojo/releases/tag/v0.5.0-alpha.9) (April 4, 2019)
|
||||||
|
* Changed `rojo build` to use buffered I/O, which can make it up to 2x faster in some cases.
|
||||||
|
* Building [*Road Not Taken*](https://github.com/LPGhatguy/roads) to an `rbxlx` file dropped from 150ms to 70ms on my machine
|
||||||
|
* Fixed `LocalizationTable` instances being made from `csv` files incorrectly interpreting empty rows and columns. ([#149](https://github.com/LPGhatguy/rojo/pull/149))
|
||||||
|
* Fixed CSV files with entries that parse as numbers causing Rojo to panic. ([#152](https://github.com/LPGhatguy/rojo/pull/152))
|
||||||
|
* Improved error messages when malformed CSV files are found in a Rojo project.
|
||||||
|
|
||||||
|
## [0.5.0 Alpha 8](https://github.com/LPGhatguy/rojo/releases/tag/v0.5.0-alpha.8) (March 29, 2019)
|
||||||
|
* Added support for a bunch of new types when dealing with XML model/place files:
|
||||||
|
* `ColorSequence`
|
||||||
|
* `Float64`
|
||||||
|
* `Int64`
|
||||||
|
* `NumberRange`
|
||||||
|
* `NumberSequence`
|
||||||
|
* `PhysicalProperties`
|
||||||
|
* `Ray`
|
||||||
|
* `Rect`
|
||||||
|
* `Ref`
|
||||||
|
* Improved server instance ordering behavior when files are added during a live session ([#135](https://github.com/LPGhatguy/rojo/pull/135))
|
||||||
|
* Fixed error being thrown when trying to unload the Rojo plugin.
|
||||||
|
* Added partial fix for [issue #141](https://github.com/LPGhatguy/rojo/issues/141) for `Lighting.Technology`, which should restore live sync functionality for the default project file.
|
||||||
|
|
||||||
## [0.5.0 Alpha 6](https://github.com/LPGhatguy/rojo/releases/tag/v0.5.0-alpha.6) (March 19, 2019)
|
## [0.5.0 Alpha 6](https://github.com/LPGhatguy/rojo/releases/tag/v0.5.0-alpha.6) (March 19, 2019)
|
||||||
* Fixed `rojo init` giving unexpected results by upgrading to `rbx_dom_weak` 1.1.0
|
* Fixed `rojo init` giving unexpected results by upgrading to `rbx_dom_weak` 1.1.0
|
||||||
* Fixed live server not responding when the Rojo plugin is connected ([#133](https://github.com/LPGhatguy/rojo/issues/133))
|
* Fixed live server not responding when the Rojo plugin is connected ([#133](https://github.com/LPGhatguy/rojo/issues/133))
|
||||||
|
|||||||
461
Cargo.lock
generated
461
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -25,7 +25,7 @@ If you have Rust installed, the easiest way to get Rojo is with Cargo!
|
|||||||
To install the latest 0.5.0 alpha, use:
|
To install the latest 0.5.0 alpha, use:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cargo install rojo --version 0.5.0-alpha.6
|
cargo install rojo --version 0.5.0-alpha.9
|
||||||
```
|
```
|
||||||
|
|
||||||
## Installing the Plugin
|
## Installing the Plugin
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
return {
|
return {
|
||||||
codename = "Epiphany",
|
codename = "Epiphany",
|
||||||
version = {0, 5, 0, "-alpha.6"},
|
version = {0, 5, 0, "-alpha.9"},
|
||||||
expectedServerVersionString = "0.5.0 or newer",
|
expectedServerVersionString = "0.5.0 or newer",
|
||||||
protocolVersion = 2,
|
protocolVersion = 2,
|
||||||
defaultHost = "localhost",
|
defaultHost = "localhost",
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ local app = Roact.createElement(App, {
|
|||||||
plugin = plugin,
|
plugin = plugin,
|
||||||
})
|
})
|
||||||
|
|
||||||
Roact.mount(app, game:GetService("CoreGui"), "Rojo UI")
|
local tree = Roact.mount(app, game:GetService("CoreGui"), "Rojo UI")
|
||||||
|
|
||||||
plugin.Unloading:Connect(function()
|
plugin.Unloading:Connect(function()
|
||||||
Roact.unmount(app)
|
Roact.unmount(tree)
|
||||||
end)
|
end)
|
||||||
@@ -19,6 +19,11 @@ local function setCanonicalProperty(instance, key, value)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Temporary workaround for fixing issue #141 in this specific case.
|
||||||
|
if instance.ClassName == "Lighting" and key == "Technology" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
-- If we don't have permissions to access this value at all, we can skip it.
|
-- If we don't have permissions to access this value at all, we can skip it.
|
||||||
local readSuccess, existingValue = pcall(function()
|
local readSuccess, existingValue = pcall(function()
|
||||||
return instance[key]
|
return instance[key]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "rojo"
|
name = "rojo"
|
||||||
version = "0.5.0-alpha.6"
|
version = "0.5.0-alpha.9"
|
||||||
authors = ["Lucien Greathouse <me@lpghatguy.com>"]
|
authors = ["Lucien Greathouse <me@lpghatguy.com>"]
|
||||||
description = "A tool to create robust Roblox projects"
|
description = "A tool to create robust Roblox projects"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
@@ -30,8 +30,8 @@ log = "0.4"
|
|||||||
maplit = "1.0.1"
|
maplit = "1.0.1"
|
||||||
notify = "4.0"
|
notify = "4.0"
|
||||||
rbx_binary = "0.4.0"
|
rbx_binary = "0.4.0"
|
||||||
rbx_dom_weak = "1.2.0"
|
rbx_dom_weak = "1.3.0"
|
||||||
rbx_xml = "0.5.0"
|
rbx_xml = "0.6.0"
|
||||||
rbx_reflection = "2.0.374"
|
rbx_reflection = "2.0.374"
|
||||||
regex = "1.0"
|
regex = "1.0"
|
||||||
reqwest = "0.9.5"
|
reqwest = "0.9.5"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use std::{
|
use std::{
|
||||||
path::PathBuf,
|
path::PathBuf,
|
||||||
fs::File,
|
fs::File,
|
||||||
io,
|
io::{self, Write, BufWriter},
|
||||||
};
|
};
|
||||||
|
|
||||||
use log::info;
|
use log::info;
|
||||||
@@ -92,7 +92,7 @@ pub fn build(options: &BuildOptions) -> Result<(), BuildError> {
|
|||||||
let mut imfs = Imfs::new();
|
let mut imfs = Imfs::new();
|
||||||
imfs.add_roots_from_project(&project)?;
|
imfs.add_roots_from_project(&project)?;
|
||||||
let tree = construct_oneoff_tree(&project, &imfs)?;
|
let tree = construct_oneoff_tree(&project, &imfs)?;
|
||||||
let mut file = File::create(&options.output_file)?;
|
let mut file = BufWriter::new(File::create(&options.output_file)?);
|
||||||
|
|
||||||
match output_kind {
|
match output_kind {
|
||||||
OutputKind::Rbxmx => {
|
OutputKind::Rbxmx => {
|
||||||
@@ -121,5 +121,7 @@ pub fn build(options: &BuildOptions) -> Result<(), BuildError> {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
file.flush()?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -1,23 +1,28 @@
|
|||||||
use std::{
|
use std::{
|
||||||
collections::HashMap,
|
mem,
|
||||||
sync::{
|
sync::{
|
||||||
atomic::{AtomicUsize, Ordering},
|
|
||||||
RwLock,
|
RwLock,
|
||||||
Mutex,
|
Mutex,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
use futures::sync::mpsc;
|
use futures::sync::oneshot;
|
||||||
|
|
||||||
/// A unique identifier, not guaranteed to be generated in any order.
|
struct Listener<T> {
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
sender: oneshot::Sender<(u32, Vec<T>)>,
|
||||||
pub struct ListenerId(usize);
|
cursor: u32,
|
||||||
|
}
|
||||||
|
|
||||||
/// Generate a new ID, which has no defined ordering.
|
fn fire_listener_if_ready<T: Clone>(messages: &[T], listener: Listener<T>) -> Result<(), Listener<T>> {
|
||||||
pub fn get_listener_id() -> ListenerId {
|
let current_cursor = messages.len() as u32;
|
||||||
static LAST_ID: AtomicUsize = AtomicUsize::new(0);
|
|
||||||
|
|
||||||
ListenerId(LAST_ID.fetch_add(1, Ordering::SeqCst))
|
if listener.cursor < current_cursor {
|
||||||
|
let new_messages = messages[(listener.cursor as usize)..].to_vec();
|
||||||
|
let _ = listener.sender.send((current_cursor, new_messages));
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
Err(listener)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A message queue with persistent history that can be subscribed to.
|
/// A message queue with persistent history that can be subscribed to.
|
||||||
@@ -26,42 +31,53 @@ pub fn get_listener_id() -> ListenerId {
|
|||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct MessageQueue<T> {
|
pub struct MessageQueue<T> {
|
||||||
messages: RwLock<Vec<T>>,
|
messages: RwLock<Vec<T>>,
|
||||||
message_listeners: Mutex<HashMap<ListenerId, mpsc::Sender<()>>>,
|
message_listeners: Mutex<Vec<Listener<T>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Clone> MessageQueue<T> {
|
impl<T: Clone> MessageQueue<T> {
|
||||||
pub fn new() -> MessageQueue<T> {
|
pub fn new() -> MessageQueue<T> {
|
||||||
MessageQueue {
|
MessageQueue {
|
||||||
messages: RwLock::new(Vec::new()),
|
messages: RwLock::new(Vec::new()),
|
||||||
message_listeners: Mutex::new(HashMap::new()),
|
message_listeners: Mutex::new(Vec::new()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn push_messages(&self, new_messages: &[T]) {
|
pub fn push_messages(&self, new_messages: &[T]) {
|
||||||
let mut message_listeners = self.message_listeners.lock().unwrap();
|
let mut message_listeners = self.message_listeners.lock().unwrap();
|
||||||
|
let mut messages = self.messages.write().unwrap();
|
||||||
|
messages.extend_from_slice(new_messages);
|
||||||
|
|
||||||
{
|
let mut remaining_listeners = Vec::new();
|
||||||
let mut messages = self.messages.write().unwrap();
|
|
||||||
messages.extend_from_slice(new_messages);
|
for listener in message_listeners.drain(..) {
|
||||||
|
match fire_listener_if_ready(&messages, listener) {
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(listener) => remaining_listeners.push(listener)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for listener in message_listeners.values_mut() {
|
// Without this annotation, Rust gets confused since the first argument
|
||||||
listener.try_send(()).unwrap();
|
// is a MutexGuard, but the second is a Vec.
|
||||||
}
|
mem::replace::<Vec<_>>(&mut message_listeners, remaining_listeners);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn subscribe(&self, sender: mpsc::Sender<()>) -> ListenerId {
|
pub fn subscribe(&self, cursor: u32, sender: oneshot::Sender<(u32, Vec<T>)>) {
|
||||||
let id = get_listener_id();
|
let listener = {
|
||||||
|
let listener = Listener {
|
||||||
|
sender,
|
||||||
|
cursor,
|
||||||
|
};
|
||||||
|
|
||||||
|
let messages = self.messages.read().unwrap();
|
||||||
|
|
||||||
|
match fire_listener_if_ready(&messages, listener) {
|
||||||
|
Ok(_) => return,
|
||||||
|
Err(listener) => listener
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let mut message_listeners = self.message_listeners.lock().unwrap();
|
let mut message_listeners = self.message_listeners.lock().unwrap();
|
||||||
message_listeners.insert(id, sender);
|
message_listeners.push(listener);
|
||||||
|
|
||||||
id
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn unsubscribe(&self, id: ListenerId) {
|
|
||||||
let mut message_listeners = self.message_listeners.lock().unwrap();
|
|
||||||
message_listeners.remove(&id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_message_cursor(&self) -> u32 {
|
pub fn get_message_cursor(&self) -> u32 {
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ pub enum SnapshotError {
|
|||||||
},
|
},
|
||||||
|
|
||||||
XmlModelDecodeError {
|
XmlModelDecodeError {
|
||||||
|
#[fail(cause)]
|
||||||
inner: rbx_xml::DecodeError,
|
inner: rbx_xml::DecodeError,
|
||||||
path: PathBuf,
|
path: PathBuf,
|
||||||
},
|
},
|
||||||
@@ -115,6 +116,12 @@ pub enum SnapshotError {
|
|||||||
path: PathBuf,
|
path: PathBuf,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
CsvDecodeError {
|
||||||
|
#[fail(cause)]
|
||||||
|
inner: csv::Error,
|
||||||
|
path: PathBuf,
|
||||||
|
},
|
||||||
|
|
||||||
ProjectNodeUnusable,
|
ProjectNodeUnusable,
|
||||||
|
|
||||||
ProjectNodeInvalidTransmute {
|
ProjectNodeInvalidTransmute {
|
||||||
@@ -151,6 +158,9 @@ impl fmt::Display for SnapshotError {
|
|||||||
SnapshotError::BinaryModelDecodeError { inner, path } => {
|
SnapshotError::BinaryModelDecodeError { inner, path } => {
|
||||||
write!(output, "Malformed rbxm model: {:?} in path {}", inner, path.display())
|
write!(output, "Malformed rbxm model: {:?} in path {}", inner, path.display())
|
||||||
},
|
},
|
||||||
|
SnapshotError::CsvDecodeError { inner, path } => {
|
||||||
|
write!(output, "Malformed csv file: {} in path {}", inner, path.display())
|
||||||
|
},
|
||||||
SnapshotError::ProjectNodeUnusable => {
|
SnapshotError::ProjectNodeUnusable => {
|
||||||
write!(output, "Rojo project nodes must specify either $path or $className.")
|
write!(output, "Rojo project nodes must specify either $path or $className.")
|
||||||
},
|
},
|
||||||
@@ -475,16 +485,87 @@ fn snapshot_txt_file<'source>(
|
|||||||
fn snapshot_csv_file<'source>(
|
fn snapshot_csv_file<'source>(
|
||||||
file: &'source ImfsFile,
|
file: &'source ImfsFile,
|
||||||
) -> SnapshotResult<'source> {
|
) -> SnapshotResult<'source> {
|
||||||
|
/// Struct that holds any valid row from a Roblox CSV translation table.
|
||||||
|
///
|
||||||
|
/// We manually deserialize into this table from CSV, but let JSON handle
|
||||||
|
/// serializing.
|
||||||
|
#[derive(Debug, Default, Serialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
struct LocalizationEntry<'a> {
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
key: Option<&'a str>,
|
||||||
|
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
context: Option<&'a str>,
|
||||||
|
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
example: Option<&'a str>,
|
||||||
|
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
source: Option<&'a str>,
|
||||||
|
|
||||||
|
values: HashMap<&'a str, &'a str>,
|
||||||
|
}
|
||||||
|
|
||||||
let instance_name = file.path
|
let instance_name = file.path
|
||||||
.file_stem().expect("Could not extract file stem")
|
.file_stem().expect("Could not extract file stem")
|
||||||
.to_str().expect("Could not convert path to UTF-8");
|
.to_str().expect("Could not convert path to UTF-8");
|
||||||
|
|
||||||
let entries: Vec<LocalizationEntryJson> = csv::Reader::from_reader(file.contents.as_slice())
|
// Normally, we'd be able to let the csv crate construct our struct for us.
|
||||||
.deserialize()
|
//
|
||||||
// TODO: Propagate error upward instead of panicking
|
// However, because of a limitation with Serde's 'flatten' feature, it's not
|
||||||
.map(|result| result.expect("Malformed localization table found!"))
|
// possible presently to losslessly collect extra string values while using
|
||||||
.map(LocalizationEntryCsv::to_json)
|
// csv+Serde.
|
||||||
.collect();
|
//
|
||||||
|
// https://github.com/BurntSushi/rust-csv/issues/151
|
||||||
|
let mut reader = csv::Reader::from_reader(file.contents.as_slice());
|
||||||
|
|
||||||
|
let headers = reader.headers()
|
||||||
|
.map_err(|inner| SnapshotError::CsvDecodeError {
|
||||||
|
inner,
|
||||||
|
path: file.path.to_path_buf(),
|
||||||
|
})?
|
||||||
|
.clone();
|
||||||
|
|
||||||
|
let mut records = Vec::new();
|
||||||
|
|
||||||
|
for record in reader.into_records() {
|
||||||
|
let record = record
|
||||||
|
.map_err(|inner| SnapshotError::CsvDecodeError {
|
||||||
|
inner,
|
||||||
|
path: file.path.to_path_buf(),
|
||||||
|
})?;
|
||||||
|
|
||||||
|
records.push(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut entries = Vec::new();
|
||||||
|
|
||||||
|
for record in &records {
|
||||||
|
let mut entry = LocalizationEntry::default();
|
||||||
|
|
||||||
|
for (header, value) in headers.iter().zip(record.into_iter()) {
|
||||||
|
if header.is_empty() || value.is_empty() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
match header {
|
||||||
|
"Key" => entry.key = Some(value),
|
||||||
|
"Source" => entry.source = Some(value),
|
||||||
|
"Context" => entry.context = Some(value),
|
||||||
|
"Example" => entry.example = Some(value),
|
||||||
|
_ => {
|
||||||
|
entry.values.insert(header, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if entry.key.is_none() && entry.source.is_none() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
entries.push(entry);
|
||||||
|
}
|
||||||
|
|
||||||
let table_contents = serde_json::to_string(&entries)
|
let table_contents = serde_json::to_string(&entries)
|
||||||
.expect("Could not encode JSON for localization table");
|
.expect("Could not encode JSON for localization table");
|
||||||
@@ -506,39 +587,6 @@ fn snapshot_csv_file<'source>(
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
|
||||||
#[serde(rename_all = "PascalCase")]
|
|
||||||
struct LocalizationEntryCsv {
|
|
||||||
key: String,
|
|
||||||
context: String,
|
|
||||||
example: String,
|
|
||||||
source: String,
|
|
||||||
#[serde(flatten)]
|
|
||||||
values: HashMap<String, String>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl LocalizationEntryCsv {
|
|
||||||
fn to_json(self) -> LocalizationEntryJson {
|
|
||||||
LocalizationEntryJson {
|
|
||||||
key: self.key,
|
|
||||||
context: self.context,
|
|
||||||
example: self.example,
|
|
||||||
source: self.source,
|
|
||||||
values: self.values,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
|
||||||
#[serde(rename_all = "camelCase")]
|
|
||||||
struct LocalizationEntryJson {
|
|
||||||
key: String,
|
|
||||||
context: String,
|
|
||||||
example: String,
|
|
||||||
source: String,
|
|
||||||
values: HashMap<String, String>,
|
|
||||||
}
|
|
||||||
|
|
||||||
fn snapshot_json_model_file<'source>(
|
fn snapshot_json_model_file<'source>(
|
||||||
file: &'source ImfsFile,
|
file: &'source ImfsFile,
|
||||||
) -> SnapshotResult<'source> {
|
) -> SnapshotResult<'source> {
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ pub fn reify_subtree(
|
|||||||
instance_per_path: &mut PathMap<HashSet<RbxId>>,
|
instance_per_path: &mut PathMap<HashSet<RbxId>>,
|
||||||
metadata_per_instance: &mut HashMap<RbxId, MetadataPerInstance>,
|
metadata_per_instance: &mut HashMap<RbxId, MetadataPerInstance>,
|
||||||
changes: &mut InstanceChanges,
|
changes: &mut InstanceChanges,
|
||||||
) {
|
) -> RbxId {
|
||||||
let instance = reify_core(snapshot);
|
let instance = reify_core(snapshot);
|
||||||
let id = tree.insert_instance(instance, parent_id);
|
let id = tree.insert_instance(instance, parent_id);
|
||||||
|
|
||||||
@@ -164,6 +164,8 @@ pub fn reify_subtree(
|
|||||||
for child in &snapshot.children {
|
for child in &snapshot.children {
|
||||||
reify_subtree(child, tree, id, instance_per_path, metadata_per_instance, changes);
|
reify_subtree(child, tree, id, instance_per_path, metadata_per_instance, changes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
id
|
||||||
}
|
}
|
||||||
|
|
||||||
fn reify_metadata(
|
fn reify_metadata(
|
||||||
@@ -222,6 +224,9 @@ fn reify_core(snapshot: &RbxSnapshotInstance) -> RbxInstanceProperties {
|
|||||||
instance
|
instance
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Updates the given instance to match the properties defined on the snapshot.
|
||||||
|
///
|
||||||
|
/// Returns whether any changes were applied.
|
||||||
fn reconcile_instance_properties(instance: &mut RbxInstanceProperties, snapshot: &RbxSnapshotInstance) -> bool {
|
fn reconcile_instance_properties(instance: &mut RbxInstanceProperties, snapshot: &RbxSnapshotInstance) -> bool {
|
||||||
let mut has_diffs = false;
|
let mut has_diffs = false;
|
||||||
|
|
||||||
@@ -279,6 +284,8 @@ fn reconcile_instance_properties(instance: &mut RbxInstanceProperties, snapshot:
|
|||||||
has_diffs
|
has_diffs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Updates the children of the instance in the `RbxTree` to match the children
|
||||||
|
/// of the `RbxSnapshotInstance`. Order will be updated to match.
|
||||||
fn reconcile_instance_children(
|
fn reconcile_instance_children(
|
||||||
tree: &mut RbxTree,
|
tree: &mut RbxTree,
|
||||||
id: RbxId,
|
id: RbxId,
|
||||||
@@ -287,12 +294,21 @@ fn reconcile_instance_children(
|
|||||||
metadata_per_instance: &mut HashMap<RbxId, MetadataPerInstance>,
|
metadata_per_instance: &mut HashMap<RbxId, MetadataPerInstance>,
|
||||||
changes: &mut InstanceChanges,
|
changes: &mut InstanceChanges,
|
||||||
) {
|
) {
|
||||||
let mut visited_snapshot_indices = HashSet::new();
|
// These lists are kept so that we can apply all the changes we figure out
|
||||||
|
let mut children_to_maybe_update: Vec<(RbxId, &RbxSnapshotInstance)> = Vec::new();
|
||||||
let mut children_to_update: Vec<(RbxId, &RbxSnapshotInstance)> = Vec::new();
|
let mut children_to_add: Vec<(usize, &RbxSnapshotInstance)> = Vec::new();
|
||||||
let mut children_to_add: Vec<&RbxSnapshotInstance> = Vec::new();
|
|
||||||
let mut children_to_remove: Vec<RbxId> = Vec::new();
|
let mut children_to_remove: Vec<RbxId> = Vec::new();
|
||||||
|
|
||||||
|
// This map is used once we're done mutating children to sort them according
|
||||||
|
// to the order specified in the snapshot. Without it, a snapshot with a new
|
||||||
|
// child prepended will cause the RbxTree instance to have out-of-order
|
||||||
|
// children and would make Rojo non-deterministic.
|
||||||
|
let mut ids_to_snapshot_indices = HashMap::new();
|
||||||
|
|
||||||
|
// Since we have to enumerate the children of both the RbxTree instance and
|
||||||
|
// our snapshot, we keep a set of the snapshot children we've seen.
|
||||||
|
let mut visited_snapshot_indices = vec![false; snapshot.children.len()];
|
||||||
|
|
||||||
let children_ids = tree.get_instance(id).unwrap().get_children_ids();
|
let children_ids = tree.get_instance(id).unwrap().get_children_ids();
|
||||||
|
|
||||||
// Find all instances that were removed or updated, which we derive by
|
// Find all instances that were removed or updated, which we derive by
|
||||||
@@ -303,7 +319,7 @@ fn reconcile_instance_children(
|
|||||||
// Locate a matching snapshot for this instance
|
// Locate a matching snapshot for this instance
|
||||||
let mut matching_snapshot = None;
|
let mut matching_snapshot = None;
|
||||||
for (snapshot_index, child_snapshot) in snapshot.children.iter().enumerate() {
|
for (snapshot_index, child_snapshot) in snapshot.children.iter().enumerate() {
|
||||||
if visited_snapshot_indices.contains(&snapshot_index) {
|
if visited_snapshot_indices[snapshot_index] {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -311,7 +327,8 @@ fn reconcile_instance_children(
|
|||||||
// similar. This heuristic is similar to React's reconciliation
|
// similar. This heuristic is similar to React's reconciliation
|
||||||
// strategy.
|
// strategy.
|
||||||
if child_snapshot.name == child_instance.name {
|
if child_snapshot.name == child_instance.name {
|
||||||
visited_snapshot_indices.insert(snapshot_index);
|
ids_to_snapshot_indices.insert(child_id, snapshot_index);
|
||||||
|
visited_snapshot_indices[snapshot_index] = true;
|
||||||
matching_snapshot = Some(child_snapshot);
|
matching_snapshot = Some(child_snapshot);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -319,26 +336,23 @@ fn reconcile_instance_children(
|
|||||||
|
|
||||||
match matching_snapshot {
|
match matching_snapshot {
|
||||||
Some(child_snapshot) => {
|
Some(child_snapshot) => {
|
||||||
children_to_update.push((child_instance.get_id(), child_snapshot));
|
children_to_maybe_update.push((child_instance.get_id(), child_snapshot));
|
||||||
},
|
}
|
||||||
None => {
|
None => {
|
||||||
children_to_remove.push(child_instance.get_id());
|
children_to_remove.push(child_instance.get_id());
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find all instancs that were added, which is just the snapshots we didn't
|
// Find all instancs that were added, which is just the snapshots we didn't
|
||||||
// match up to existing instances above.
|
// match up to existing instances above.
|
||||||
for (snapshot_index, child_snapshot) in snapshot.children.iter().enumerate() {
|
for (snapshot_index, child_snapshot) in snapshot.children.iter().enumerate() {
|
||||||
if !visited_snapshot_indices.contains(&snapshot_index) {
|
if !visited_snapshot_indices[snapshot_index] {
|
||||||
children_to_add.push(child_snapshot);
|
children_to_add.push((snapshot_index, child_snapshot));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for child_snapshot in &children_to_add {
|
// Apply all of our removals we gathered from our diff
|
||||||
reify_subtree(child_snapshot, tree, id, instance_per_path, metadata_per_instance, changes);
|
|
||||||
}
|
|
||||||
|
|
||||||
for child_id in &children_to_remove {
|
for child_id in &children_to_remove {
|
||||||
if let Some(subtree) = tree.remove_instance(*child_id) {
|
if let Some(subtree) = tree.remove_instance(*child_id) {
|
||||||
for id in subtree.iter_all_ids() {
|
for id in subtree.iter_all_ids() {
|
||||||
@@ -348,7 +362,18 @@ fn reconcile_instance_children(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (child_id, child_snapshot) in &children_to_update {
|
// Apply all of our children additions
|
||||||
|
for (snapshot_index, child_snapshot) in &children_to_add {
|
||||||
|
let id = reify_subtree(child_snapshot, tree, id, instance_per_path, metadata_per_instance, changes);
|
||||||
|
ids_to_snapshot_indices.insert(id, *snapshot_index);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply any updates that might have updates
|
||||||
|
for (child_id, child_snapshot) in &children_to_maybe_update {
|
||||||
reconcile_subtree(tree, *child_id, child_snapshot, instance_per_path, metadata_per_instance, changes);
|
reconcile_subtree(tree, *child_id, child_snapshot, instance_per_path, metadata_per_instance, changes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Apply the sort mapping defined by ids_to_snapshot_indices above
|
||||||
|
let instance = tree.get_instance_mut(id).unwrap();
|
||||||
|
instance.sort_children_unstable_by_key(|id| ids_to_snapshot_indices.get(&id).unwrap());
|
||||||
}
|
}
|
||||||
@@ -7,7 +7,11 @@ use std::{
|
|||||||
sync::Arc,
|
sync::Arc,
|
||||||
};
|
};
|
||||||
|
|
||||||
use futures::{future, Future, stream::Stream, sync::mpsc};
|
use futures::{
|
||||||
|
future::{self, IntoFuture},
|
||||||
|
Future,
|
||||||
|
sync::oneshot,
|
||||||
|
};
|
||||||
use hyper::{
|
use hyper::{
|
||||||
service::Service,
|
service::Service,
|
||||||
header,
|
header,
|
||||||
@@ -168,30 +172,13 @@ impl ApiService {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let message_queue = Arc::clone(&self.live_session.message_queue);
|
let message_queue = Arc::clone(&self.live_session.message_queue);
|
||||||
|
|
||||||
// Did the client miss any messages since the last subscribe?
|
|
||||||
{
|
|
||||||
let (new_cursor, new_messages) = message_queue.get_messages_since(cursor);
|
|
||||||
|
|
||||||
if !new_messages.is_empty() {
|
|
||||||
return Box::new(future::ok(response_json(&SubscribeResponse {
|
|
||||||
session_id: self.live_session.session_id(),
|
|
||||||
messages: Cow::Borrowed(&new_messages),
|
|
||||||
message_cursor: new_cursor,
|
|
||||||
})));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let (tx, rx) = mpsc::channel(1024);
|
|
||||||
let sender_id = message_queue.subscribe(tx);
|
|
||||||
let session_id = self.live_session.session_id();
|
let session_id = self.live_session.session_id();
|
||||||
|
|
||||||
|
let (tx, rx) = oneshot::channel();
|
||||||
|
message_queue.subscribe(cursor, tx);
|
||||||
|
|
||||||
let result = rx.into_future()
|
let result = rx.into_future()
|
||||||
.and_then(move |_| {
|
.and_then(move |(new_cursor, new_messages)| {
|
||||||
message_queue.unsubscribe(sender_id);
|
|
||||||
|
|
||||||
let (new_cursor, new_messages) = message_queue.get_messages_since(cursor);
|
|
||||||
|
|
||||||
Box::new(future::ok(response_json(SubscribeResponse {
|
Box::new(future::ok(response_json(SubscribeResponse {
|
||||||
session_id: session_id,
|
session_id: session_id,
|
||||||
messages: Cow::Owned(new_messages),
|
messages: Cow::Owned(new_messages),
|
||||||
|
|||||||
@@ -11,10 +11,7 @@ use librojo::{
|
|||||||
|
|
||||||
use test_util::tree::trees_equal;
|
use test_util::tree::trees_equal;
|
||||||
|
|
||||||
// TODO: Snapshot application isn't communicative right now with the current
|
#[test]
|
||||||
// snapshot reconciler. In practice this mostly isn't a problem, but presents
|
|
||||||
// a problem trying to rely on determinism to make snapshot tests.
|
|
||||||
// #[test]
|
|
||||||
fn patch_communicativity() {
|
fn patch_communicativity() {
|
||||||
let base_tree = RbxTree::new(RbxInstanceProperties {
|
let base_tree = RbxTree::new(RbxInstanceProperties {
|
||||||
name: "DataModel".into(),
|
name: "DataModel".into(),
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ macro_rules! generate_snapshot_tests {
|
|||||||
|
|
||||||
generate_snapshot_tests!(
|
generate_snapshot_tests!(
|
||||||
empty,
|
empty,
|
||||||
|
localization,
|
||||||
multi_partition_game,
|
multi_partition_game,
|
||||||
nested_partitions,
|
nested_partitions,
|
||||||
single_partition_game,
|
single_partition_game,
|
||||||
|
|||||||
6
test-projects/localization/default.project.json
Normal file
6
test-projects/localization/default.project.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"name": "localization",
|
||||||
|
"tree": {
|
||||||
|
"$path": "src"
|
||||||
|
}
|
||||||
|
}
|
||||||
69
test-projects/localization/expected-snapshot.json
Normal file
69
test-projects/localization/expected-snapshot.json
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
{
|
||||||
|
"name": "localization",
|
||||||
|
"class_name": "Folder",
|
||||||
|
"properties": {},
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"name": "empty-column-bug-147",
|
||||||
|
"class_name": "LocalizationTable",
|
||||||
|
"properties": {
|
||||||
|
"Contents": {
|
||||||
|
"Type": "String",
|
||||||
|
"Value": "[{\"key\":\"Language.Name\",\"source\":\"English\",\"values\":{}},{\"key\":\"Language.Region\",\"source\":\"United States\",\"values\":{}},{\"key\":\"Label.Thickness\",\"source\":\"Thickness\",\"values\":{}},{\"key\":\"Label.Opacity\",\"source\":\"Opacity\",\"values\":{}},{\"key\":\"Toolbar.Undo\",\"source\":\"Undo\",\"values\":{}},{\"key\":\"Toolbar.Redo\",\"source\":\"Redo\",\"values\":{}},{\"key\":\"Toolbar.Camera\",\"source\":\"Top-down camera\",\"values\":{}},{\"key\":\"Toolbar.Saves\",\"source\":\"Saved drawings\",\"values\":{}},{\"key\":\"Toolbar.Preferences\",\"source\":\"Settings\",\"values\":{}},{\"key\":\"Toolbar.Mode.Vector\",\"source\":\"Vector mode\",\"values\":{}},{\"key\":\"Toolbar.Mode.Pixel\",\"source\":\"Pixel mode\",\"values\":{}}]"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"children": [],
|
||||||
|
"metadata": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "src/empty-column-bug-147.csv",
|
||||||
|
"project_definition": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "integers-bug-145",
|
||||||
|
"class_name": "LocalizationTable",
|
||||||
|
"properties": {
|
||||||
|
"Contents": {
|
||||||
|
"Type": "String",
|
||||||
|
"Value": "[{\"key\":\"Count\",\"example\":\"A number demonstrating issue 145\",\"source\":\"3\",\"values\":{\"es\":\"7\"}}]"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"children": [],
|
||||||
|
"metadata": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "src/integers-bug-145.csv",
|
||||||
|
"project_definition": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "normal",
|
||||||
|
"class_name": "LocalizationTable",
|
||||||
|
"properties": {
|
||||||
|
"Contents": {
|
||||||
|
"Type": "String",
|
||||||
|
"Value": "[{\"key\":\"Ack\",\"example\":\"An exclamation of despair\",\"source\":\"Ack!\",\"values\":{\"es\":\"¡Ay!\"}}]"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"children": [],
|
||||||
|
"metadata": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "src/normal.csv",
|
||||||
|
"project_definition": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "src",
|
||||||
|
"project_definition": [
|
||||||
|
"localization",
|
||||||
|
{
|
||||||
|
"class_name": null,
|
||||||
|
"children": {},
|
||||||
|
"properties": {},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": "src"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
17
test-projects/localization/src/empty-column-bug-147.csv
Normal file
17
test-projects/localization/src/empty-column-bug-147.csv
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
,Key,Source,Context,Example
|
||||||
|
,,,,
|
||||||
|
Metadata,Language.Name,English,,
|
||||||
|
,Language.Region,United States,,
|
||||||
|
,,,,
|
||||||
|
Options,Label.Thickness,Thickness,,
|
||||||
|
,Label.Opacity,Opacity,,
|
||||||
|
,,,,
|
||||||
|
Toolbar,Toolbar.Undo,Undo,,
|
||||||
|
,Toolbar.Redo,Redo,,
|
||||||
|
,,,,
|
||||||
|
,Toolbar.Camera,Top-down camera,,
|
||||||
|
,Toolbar.Saves,Saved drawings,,
|
||||||
|
,Toolbar.Preferences,Settings,,
|
||||||
|
,,,,
|
||||||
|
,Toolbar.Mode.Vector,Vector mode,,
|
||||||
|
,Toolbar.Mode.Pixel,Pixel mode,,
|
||||||
|
2
test-projects/localization/src/integers-bug-145.csv
Normal file
2
test-projects/localization/src/integers-bug-145.csv
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
Key,Source,Context,Example,es
|
||||||
|
Count,3,,A number demonstrating issue 145,7
|
||||||
|
2
test-projects/localization/src/normal.csv
Normal file
2
test-projects/localization/src/normal.csv
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
Key,Source,Context,Example,es
|
||||||
|
Ack,Ack!,,An exclamation of despair,¡Ay!
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"instances": {
|
"instances": {
|
||||||
"8d44bb30-db3c-4366-a6c5-633bd1441885": {
|
"00f207b1-fc18-4088-a45e-caf8cd98f5dd": {
|
||||||
"Name": "main",
|
"Name": "main",
|
||||||
"ClassName": "ModuleScript",
|
"ClassName": "ModuleScript",
|
||||||
"Properties": {
|
"Properties": {
|
||||||
@@ -9,69 +9,32 @@
|
|||||||
"Value": "-- hello, from a/main.lua"
|
"Value": "-- hello, from a/main.lua"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Id": "8d44bb30-db3c-4366-a6c5-633bd1441885",
|
"Id": "00f207b1-fc18-4088-a45e-caf8cd98f5dd",
|
||||||
"Children": [],
|
"Children": [],
|
||||||
"Parent": "1aafa29b-bdca-40a0-a677-7ead327b84ce"
|
"Parent": "14fed1a3-ba97-46a6-ae93-ac26bd9471df"
|
||||||
},
|
},
|
||||||
"b1c9928c-bf11-427f-90eb-b672c811d859": {
|
"14fed1a3-ba97-46a6-ae93-ac26bd9471df": {
|
||||||
|
"Name": "Ack",
|
||||||
|
"ClassName": "Folder",
|
||||||
|
"Properties": {},
|
||||||
|
"Id": "14fed1a3-ba97-46a6-ae93-ac26bd9471df",
|
||||||
|
"Children": [
|
||||||
|
"c55fd55c-258e-4a93-a63a-ea243038c9b9",
|
||||||
|
"00f207b1-fc18-4088-a45e-caf8cd98f5dd"
|
||||||
|
],
|
||||||
|
"Parent": "99eefe5f-ef74-49e6-8a8b-c833e00ca56b"
|
||||||
|
},
|
||||||
|
"c910510c-37a8-4fd8-ae41-01169ccb739c": {
|
||||||
"Name": "Bar",
|
"Name": "Bar",
|
||||||
"ClassName": "Folder",
|
"ClassName": "Folder",
|
||||||
"Properties": {},
|
"Properties": {},
|
||||||
"Id": "b1c9928c-bf11-427f-90eb-b672c811d859",
|
"Id": "c910510c-37a8-4fd8-ae41-01169ccb739c",
|
||||||
"Children": [
|
"Children": [
|
||||||
"8d690a2a-e987-4c86-b9ac-18e6d3a98503"
|
"71a95983-c856-4cf2-aee6-bd8a523e80e4"
|
||||||
],
|
],
|
||||||
"Parent": "9f141826-14c2-492b-b360-2558712f0c08"
|
"Parent": "99eefe5f-ef74-49e6-8a8b-c833e00ca56b"
|
||||||
},
|
},
|
||||||
"645ba594-4482-441f-9f41-5bb9c444405b": {
|
"c55fd55c-258e-4a93-a63a-ea243038c9b9": {
|
||||||
"Name": "multi_partition_game",
|
|
||||||
"ClassName": "DataModel",
|
|
||||||
"Properties": {},
|
|
||||||
"Id": "645ba594-4482-441f-9f41-5bb9c444405b",
|
|
||||||
"Children": [
|
|
||||||
"b1298bcc-e370-44a6-9ef4-fbefa290124c",
|
|
||||||
"9f141826-14c2-492b-b360-2558712f0c08"
|
|
||||||
],
|
|
||||||
"Parent": null
|
|
||||||
},
|
|
||||||
"9f141826-14c2-492b-b360-2558712f0c08": {
|
|
||||||
"Name": "ReplicatedStorage",
|
|
||||||
"ClassName": "ReplicatedStorage",
|
|
||||||
"Properties": {},
|
|
||||||
"Id": "9f141826-14c2-492b-b360-2558712f0c08",
|
|
||||||
"Children": [
|
|
||||||
"1aafa29b-bdca-40a0-a677-7ead327b84ce",
|
|
||||||
"b1c9928c-bf11-427f-90eb-b672c811d859"
|
|
||||||
],
|
|
||||||
"Parent": "645ba594-4482-441f-9f41-5bb9c444405b"
|
|
||||||
},
|
|
||||||
"8d690a2a-e987-4c86-b9ac-18e6d3a98503": {
|
|
||||||
"Name": "something",
|
|
||||||
"ClassName": "ModuleScript",
|
|
||||||
"Properties": {
|
|
||||||
"Source": {
|
|
||||||
"Type": "String",
|
|
||||||
"Value": "-- b/something.lua"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Id": "8d690a2a-e987-4c86-b9ac-18e6d3a98503",
|
|
||||||
"Children": [],
|
|
||||||
"Parent": "b1c9928c-bf11-427f-90eb-b672c811d859"
|
|
||||||
},
|
|
||||||
"b1298bcc-e370-44a6-9ef4-fbefa290124c": {
|
|
||||||
"Name": "HttpService",
|
|
||||||
"ClassName": "HttpService",
|
|
||||||
"Properties": {
|
|
||||||
"HttpEnabled": {
|
|
||||||
"Type": "Bool",
|
|
||||||
"Value": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Id": "b1298bcc-e370-44a6-9ef4-fbefa290124c",
|
|
||||||
"Children": [],
|
|
||||||
"Parent": "645ba594-4482-441f-9f41-5bb9c444405b"
|
|
||||||
},
|
|
||||||
"54f2f276-964f-4c60-87d8-5fb2209c97c9": {
|
|
||||||
"Name": "foo",
|
"Name": "foo",
|
||||||
"ClassName": "StringValue",
|
"ClassName": "StringValue",
|
||||||
"Properties": {
|
"Properties": {
|
||||||
@@ -80,25 +43,153 @@
|
|||||||
"Value": "Hello world, from a/foo.txt"
|
"Value": "Hello world, from a/foo.txt"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Id": "54f2f276-964f-4c60-87d8-5fb2209c97c9",
|
"Id": "c55fd55c-258e-4a93-a63a-ea243038c9b9",
|
||||||
"Children": [],
|
"Children": [],
|
||||||
"Parent": "1aafa29b-bdca-40a0-a677-7ead327b84ce"
|
"Parent": "14fed1a3-ba97-46a6-ae93-ac26bd9471df"
|
||||||
},
|
},
|
||||||
"1aafa29b-bdca-40a0-a677-7ead327b84ce": {
|
"71a95983-c856-4cf2-aee6-bd8a523e80e4": {
|
||||||
"Name": "Ack",
|
"Name": "something",
|
||||||
"ClassName": "Folder",
|
"ClassName": "ModuleScript",
|
||||||
|
"Properties": {
|
||||||
|
"Source": {
|
||||||
|
"Type": "String",
|
||||||
|
"Value": "-- b/something.lua"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Id": "71a95983-c856-4cf2-aee6-bd8a523e80e4",
|
||||||
|
"Children": [],
|
||||||
|
"Parent": "c910510c-37a8-4fd8-ae41-01169ccb739c"
|
||||||
|
},
|
||||||
|
"3b5af13f-c997-4009-915c-0810b0e83032": {
|
||||||
|
"Name": "multi_partition_game",
|
||||||
|
"ClassName": "DataModel",
|
||||||
"Properties": {},
|
"Properties": {},
|
||||||
"Id": "1aafa29b-bdca-40a0-a677-7ead327b84ce",
|
"Id": "3b5af13f-c997-4009-915c-0810b0e83032",
|
||||||
"Children": [
|
"Children": [
|
||||||
"54f2f276-964f-4c60-87d8-5fb2209c97c9",
|
"bf8e2d4f-33a0-42a0-8168-1b62d6ac050c",
|
||||||
"8d44bb30-db3c-4366-a6c5-633bd1441885"
|
"99eefe5f-ef74-49e6-8a8b-c833e00ca56b"
|
||||||
],
|
],
|
||||||
"Parent": "9f141826-14c2-492b-b360-2558712f0c08"
|
"Parent": null
|
||||||
|
},
|
||||||
|
"bf8e2d4f-33a0-42a0-8168-1b62d6ac050c": {
|
||||||
|
"Name": "HttpService",
|
||||||
|
"ClassName": "HttpService",
|
||||||
|
"Properties": {
|
||||||
|
"HttpEnabled": {
|
||||||
|
"Type": "Bool",
|
||||||
|
"Value": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Id": "bf8e2d4f-33a0-42a0-8168-1b62d6ac050c",
|
||||||
|
"Children": [],
|
||||||
|
"Parent": "3b5af13f-c997-4009-915c-0810b0e83032"
|
||||||
|
},
|
||||||
|
"99eefe5f-ef74-49e6-8a8b-c833e00ca56b": {
|
||||||
|
"Name": "ReplicatedStorage",
|
||||||
|
"ClassName": "ReplicatedStorage",
|
||||||
|
"Properties": {},
|
||||||
|
"Id": "99eefe5f-ef74-49e6-8a8b-c833e00ca56b",
|
||||||
|
"Children": [
|
||||||
|
"14fed1a3-ba97-46a6-ae93-ac26bd9471df",
|
||||||
|
"c910510c-37a8-4fd8-ae41-01169ccb739c"
|
||||||
|
],
|
||||||
|
"Parent": "3b5af13f-c997-4009-915c-0810b0e83032"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"root_id": "645ba594-4482-441f-9f41-5bb9c444405b",
|
"root_id": "3b5af13f-c997-4009-915c-0810b0e83032",
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"645ba594-4482-441f-9f41-5bb9c444405b": {
|
"00f207b1-fc18-4088-a45e-caf8cd98f5dd": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "a/main.lua",
|
||||||
|
"project_definition": null
|
||||||
|
},
|
||||||
|
"bf8e2d4f-33a0-42a0-8168-1b62d6ac050c": {
|
||||||
|
"ignore_unknown_instances": true,
|
||||||
|
"source_path": null,
|
||||||
|
"project_definition": [
|
||||||
|
"HttpService",
|
||||||
|
{
|
||||||
|
"class_name": "HttpService",
|
||||||
|
"children": {},
|
||||||
|
"properties": {
|
||||||
|
"HttpEnabled": {
|
||||||
|
"Type": "Bool",
|
||||||
|
"Value": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"14fed1a3-ba97-46a6-ae93-ac26bd9471df": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "a",
|
||||||
|
"project_definition": [
|
||||||
|
"Ack",
|
||||||
|
{
|
||||||
|
"class_name": null,
|
||||||
|
"children": {},
|
||||||
|
"properties": {},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": "a"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"c55fd55c-258e-4a93-a63a-ea243038c9b9": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "a/foo.txt",
|
||||||
|
"project_definition": null
|
||||||
|
},
|
||||||
|
"71a95983-c856-4cf2-aee6-bd8a523e80e4": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "b/something.lua",
|
||||||
|
"project_definition": null
|
||||||
|
},
|
||||||
|
"c910510c-37a8-4fd8-ae41-01169ccb739c": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "b",
|
||||||
|
"project_definition": [
|
||||||
|
"Bar",
|
||||||
|
{
|
||||||
|
"class_name": null,
|
||||||
|
"children": {},
|
||||||
|
"properties": {},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": "b"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"99eefe5f-ef74-49e6-8a8b-c833e00ca56b": {
|
||||||
|
"ignore_unknown_instances": true,
|
||||||
|
"source_path": null,
|
||||||
|
"project_definition": [
|
||||||
|
"ReplicatedStorage",
|
||||||
|
{
|
||||||
|
"class_name": "ReplicatedStorage",
|
||||||
|
"children": {
|
||||||
|
"Ack": {
|
||||||
|
"class_name": null,
|
||||||
|
"children": {},
|
||||||
|
"properties": {},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": "a"
|
||||||
|
},
|
||||||
|
"Bar": {
|
||||||
|
"class_name": null,
|
||||||
|
"children": {},
|
||||||
|
"properties": {},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": "b"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"properties": {},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"3b5af13f-c997-4009-915c-0810b0e83032": {
|
||||||
"ignore_unknown_instances": true,
|
"ignore_unknown_instances": true,
|
||||||
"source_path": null,
|
"source_path": null,
|
||||||
"project_definition": [
|
"project_definition": [
|
||||||
@@ -146,97 +237,6 @@
|
|||||||
"path": null
|
"path": null
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
"1aafa29b-bdca-40a0-a677-7ead327b84ce": {
|
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "a",
|
|
||||||
"project_definition": [
|
|
||||||
"Ack",
|
|
||||||
{
|
|
||||||
"class_name": null,
|
|
||||||
"children": {},
|
|
||||||
"properties": {},
|
|
||||||
"ignore_unknown_instances": null,
|
|
||||||
"path": "a"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"b1c9928c-bf11-427f-90eb-b672c811d859": {
|
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "b",
|
|
||||||
"project_definition": [
|
|
||||||
"Bar",
|
|
||||||
{
|
|
||||||
"class_name": null,
|
|
||||||
"children": {},
|
|
||||||
"properties": {},
|
|
||||||
"ignore_unknown_instances": null,
|
|
||||||
"path": "b"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"54f2f276-964f-4c60-87d8-5fb2209c97c9": {
|
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "a/foo.txt",
|
|
||||||
"project_definition": null
|
|
||||||
},
|
|
||||||
"9f141826-14c2-492b-b360-2558712f0c08": {
|
|
||||||
"ignore_unknown_instances": true,
|
|
||||||
"source_path": null,
|
|
||||||
"project_definition": [
|
|
||||||
"ReplicatedStorage",
|
|
||||||
{
|
|
||||||
"class_name": "ReplicatedStorage",
|
|
||||||
"children": {
|
|
||||||
"Ack": {
|
|
||||||
"class_name": null,
|
|
||||||
"children": {},
|
|
||||||
"properties": {},
|
|
||||||
"ignore_unknown_instances": null,
|
|
||||||
"path": "a"
|
|
||||||
},
|
|
||||||
"Bar": {
|
|
||||||
"class_name": null,
|
|
||||||
"children": {},
|
|
||||||
"properties": {},
|
|
||||||
"ignore_unknown_instances": null,
|
|
||||||
"path": "b"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"properties": {},
|
|
||||||
"ignore_unknown_instances": null,
|
|
||||||
"path": null
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"8d44bb30-db3c-4366-a6c5-633bd1441885": {
|
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "a/main.lua",
|
|
||||||
"project_definition": null
|
|
||||||
},
|
|
||||||
"b1298bcc-e370-44a6-9ef4-fbefa290124c": {
|
|
||||||
"ignore_unknown_instances": true,
|
|
||||||
"source_path": null,
|
|
||||||
"project_definition": [
|
|
||||||
"HttpService",
|
|
||||||
{
|
|
||||||
"class_name": "HttpService",
|
|
||||||
"children": {},
|
|
||||||
"properties": {
|
|
||||||
"HttpEnabled": {
|
|
||||||
"Type": "Bool",
|
|
||||||
"Value": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ignore_unknown_instances": null,
|
|
||||||
"path": null
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"8d690a2a-e987-4c86-b9ac-18e6d3a98503": {
|
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "b/something.lua",
|
|
||||||
"project_definition": null
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
{
|
{
|
||||||
"instances": {
|
"instances": {
|
||||||
"8d44bb30-db3c-4366-a6c5-633bd1441885": {
|
"b48b369f-5706-4029-9fa6-90651a4910ea": {
|
||||||
|
"Name": "added",
|
||||||
|
"ClassName": "Folder",
|
||||||
|
"Properties": {},
|
||||||
|
"Id": "b48b369f-5706-4029-9fa6-90651a4910ea",
|
||||||
|
"Children": [],
|
||||||
|
"Parent": "14fed1a3-ba97-46a6-ae93-ac26bd9471df"
|
||||||
|
},
|
||||||
|
"00f207b1-fc18-4088-a45e-caf8cd98f5dd": {
|
||||||
"Name": "main",
|
"Name": "main",
|
||||||
"ClassName": "ModuleScript",
|
"ClassName": "ModuleScript",
|
||||||
"Properties": {
|
"Properties": {
|
||||||
@@ -9,77 +17,33 @@
|
|||||||
"Value": "-- hello, from a/main.lua"
|
"Value": "-- hello, from a/main.lua"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Id": "8d44bb30-db3c-4366-a6c5-633bd1441885",
|
"Id": "00f207b1-fc18-4088-a45e-caf8cd98f5dd",
|
||||||
"Children": [],
|
"Children": [],
|
||||||
"Parent": "1aafa29b-bdca-40a0-a677-7ead327b84ce"
|
"Parent": "14fed1a3-ba97-46a6-ae93-ac26bd9471df"
|
||||||
},
|
},
|
||||||
"b1c9928c-bf11-427f-90eb-b672c811d859": {
|
"14fed1a3-ba97-46a6-ae93-ac26bd9471df": {
|
||||||
|
"Name": "Ack",
|
||||||
|
"ClassName": "Folder",
|
||||||
|
"Properties": {},
|
||||||
|
"Id": "14fed1a3-ba97-46a6-ae93-ac26bd9471df",
|
||||||
|
"Children": [
|
||||||
|
"b48b369f-5706-4029-9fa6-90651a4910ea",
|
||||||
|
"c55fd55c-258e-4a93-a63a-ea243038c9b9",
|
||||||
|
"00f207b1-fc18-4088-a45e-caf8cd98f5dd"
|
||||||
|
],
|
||||||
|
"Parent": "99eefe5f-ef74-49e6-8a8b-c833e00ca56b"
|
||||||
|
},
|
||||||
|
"c910510c-37a8-4fd8-ae41-01169ccb739c": {
|
||||||
"Name": "Bar",
|
"Name": "Bar",
|
||||||
"ClassName": "Folder",
|
"ClassName": "Folder",
|
||||||
"Properties": {},
|
"Properties": {},
|
||||||
"Id": "b1c9928c-bf11-427f-90eb-b672c811d859",
|
"Id": "c910510c-37a8-4fd8-ae41-01169ccb739c",
|
||||||
"Children": [
|
"Children": [
|
||||||
"8d690a2a-e987-4c86-b9ac-18e6d3a98503"
|
"71a95983-c856-4cf2-aee6-bd8a523e80e4"
|
||||||
],
|
],
|
||||||
"Parent": "9f141826-14c2-492b-b360-2558712f0c08"
|
"Parent": "99eefe5f-ef74-49e6-8a8b-c833e00ca56b"
|
||||||
},
|
},
|
||||||
"645ba594-4482-441f-9f41-5bb9c444405b": {
|
"c55fd55c-258e-4a93-a63a-ea243038c9b9": {
|
||||||
"Name": "multi_partition_game",
|
|
||||||
"ClassName": "DataModel",
|
|
||||||
"Properties": {},
|
|
||||||
"Id": "645ba594-4482-441f-9f41-5bb9c444405b",
|
|
||||||
"Children": [
|
|
||||||
"b1298bcc-e370-44a6-9ef4-fbefa290124c",
|
|
||||||
"9f141826-14c2-492b-b360-2558712f0c08"
|
|
||||||
],
|
|
||||||
"Parent": null
|
|
||||||
},
|
|
||||||
"9f141826-14c2-492b-b360-2558712f0c08": {
|
|
||||||
"Name": "ReplicatedStorage",
|
|
||||||
"ClassName": "ReplicatedStorage",
|
|
||||||
"Properties": {},
|
|
||||||
"Id": "9f141826-14c2-492b-b360-2558712f0c08",
|
|
||||||
"Children": [
|
|
||||||
"1aafa29b-bdca-40a0-a677-7ead327b84ce",
|
|
||||||
"b1c9928c-bf11-427f-90eb-b672c811d859"
|
|
||||||
],
|
|
||||||
"Parent": "645ba594-4482-441f-9f41-5bb9c444405b"
|
|
||||||
},
|
|
||||||
"8d690a2a-e987-4c86-b9ac-18e6d3a98503": {
|
|
||||||
"Name": "something",
|
|
||||||
"ClassName": "ModuleScript",
|
|
||||||
"Properties": {
|
|
||||||
"Source": {
|
|
||||||
"Type": "String",
|
|
||||||
"Value": "-- b/something.lua"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Id": "8d690a2a-e987-4c86-b9ac-18e6d3a98503",
|
|
||||||
"Children": [],
|
|
||||||
"Parent": "b1c9928c-bf11-427f-90eb-b672c811d859"
|
|
||||||
},
|
|
||||||
"b1298bcc-e370-44a6-9ef4-fbefa290124c": {
|
|
||||||
"Name": "HttpService",
|
|
||||||
"ClassName": "HttpService",
|
|
||||||
"Properties": {
|
|
||||||
"HttpEnabled": {
|
|
||||||
"Type": "Bool",
|
|
||||||
"Value": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Id": "b1298bcc-e370-44a6-9ef4-fbefa290124c",
|
|
||||||
"Children": [],
|
|
||||||
"Parent": "645ba594-4482-441f-9f41-5bb9c444405b"
|
|
||||||
},
|
|
||||||
"46353305-8818-48fe-94fd-80cf0c5d974c": {
|
|
||||||
"Name": "added",
|
|
||||||
"ClassName": "Folder",
|
|
||||||
"Properties": {},
|
|
||||||
"Id": "46353305-8818-48fe-94fd-80cf0c5d974c",
|
|
||||||
"Children": [],
|
|
||||||
"Parent": "1aafa29b-bdca-40a0-a677-7ead327b84ce"
|
|
||||||
},
|
|
||||||
"54f2f276-964f-4c60-87d8-5fb2209c97c9": {
|
|
||||||
"Name": "foo",
|
"Name": "foo",
|
||||||
"ClassName": "StringValue",
|
"ClassName": "StringValue",
|
||||||
"Properties": {
|
"Properties": {
|
||||||
@@ -88,50 +52,67 @@
|
|||||||
"Value": "Hello world, from a/foo.txt"
|
"Value": "Hello world, from a/foo.txt"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Id": "54f2f276-964f-4c60-87d8-5fb2209c97c9",
|
"Id": "c55fd55c-258e-4a93-a63a-ea243038c9b9",
|
||||||
"Children": [],
|
"Children": [],
|
||||||
"Parent": "1aafa29b-bdca-40a0-a677-7ead327b84ce"
|
"Parent": "14fed1a3-ba97-46a6-ae93-ac26bd9471df"
|
||||||
},
|
},
|
||||||
"1aafa29b-bdca-40a0-a677-7ead327b84ce": {
|
"71a95983-c856-4cf2-aee6-bd8a523e80e4": {
|
||||||
"Name": "Ack",
|
"Name": "something",
|
||||||
"ClassName": "Folder",
|
"ClassName": "ModuleScript",
|
||||||
|
"Properties": {
|
||||||
|
"Source": {
|
||||||
|
"Type": "String",
|
||||||
|
"Value": "-- b/something.lua"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Id": "71a95983-c856-4cf2-aee6-bd8a523e80e4",
|
||||||
|
"Children": [],
|
||||||
|
"Parent": "c910510c-37a8-4fd8-ae41-01169ccb739c"
|
||||||
|
},
|
||||||
|
"3b5af13f-c997-4009-915c-0810b0e83032": {
|
||||||
|
"Name": "multi_partition_game",
|
||||||
|
"ClassName": "DataModel",
|
||||||
"Properties": {},
|
"Properties": {},
|
||||||
"Id": "1aafa29b-bdca-40a0-a677-7ead327b84ce",
|
"Id": "3b5af13f-c997-4009-915c-0810b0e83032",
|
||||||
"Children": [
|
"Children": [
|
||||||
"54f2f276-964f-4c60-87d8-5fb2209c97c9",
|
"bf8e2d4f-33a0-42a0-8168-1b62d6ac050c",
|
||||||
"8d44bb30-db3c-4366-a6c5-633bd1441885",
|
"99eefe5f-ef74-49e6-8a8b-c833e00ca56b"
|
||||||
"46353305-8818-48fe-94fd-80cf0c5d974c"
|
|
||||||
],
|
],
|
||||||
"Parent": "9f141826-14c2-492b-b360-2558712f0c08"
|
"Parent": null
|
||||||
|
},
|
||||||
|
"bf8e2d4f-33a0-42a0-8168-1b62d6ac050c": {
|
||||||
|
"Name": "HttpService",
|
||||||
|
"ClassName": "HttpService",
|
||||||
|
"Properties": {
|
||||||
|
"HttpEnabled": {
|
||||||
|
"Type": "Bool",
|
||||||
|
"Value": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Id": "bf8e2d4f-33a0-42a0-8168-1b62d6ac050c",
|
||||||
|
"Children": [],
|
||||||
|
"Parent": "3b5af13f-c997-4009-915c-0810b0e83032"
|
||||||
|
},
|
||||||
|
"99eefe5f-ef74-49e6-8a8b-c833e00ca56b": {
|
||||||
|
"Name": "ReplicatedStorage",
|
||||||
|
"ClassName": "ReplicatedStorage",
|
||||||
|
"Properties": {},
|
||||||
|
"Id": "99eefe5f-ef74-49e6-8a8b-c833e00ca56b",
|
||||||
|
"Children": [
|
||||||
|
"14fed1a3-ba97-46a6-ae93-ac26bd9471df",
|
||||||
|
"c910510c-37a8-4fd8-ae41-01169ccb739c"
|
||||||
|
],
|
||||||
|
"Parent": "3b5af13f-c997-4009-915c-0810b0e83032"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"root_id": "645ba594-4482-441f-9f41-5bb9c444405b",
|
"root_id": "3b5af13f-c997-4009-915c-0810b0e83032",
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"b1c9928c-bf11-427f-90eb-b672c811d859": {
|
"c55fd55c-258e-4a93-a63a-ea243038c9b9": {
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "b",
|
|
||||||
"project_definition": [
|
|
||||||
"Bar",
|
|
||||||
{
|
|
||||||
"class_name": null,
|
|
||||||
"children": {},
|
|
||||||
"properties": {},
|
|
||||||
"ignore_unknown_instances": null,
|
|
||||||
"path": "b"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"54f2f276-964f-4c60-87d8-5fb2209c97c9": {
|
|
||||||
"ignore_unknown_instances": false,
|
"ignore_unknown_instances": false,
|
||||||
"source_path": "a/foo.txt",
|
"source_path": "a/foo.txt",
|
||||||
"project_definition": null
|
"project_definition": null
|
||||||
},
|
},
|
||||||
"8d44bb30-db3c-4366-a6c5-633bd1441885": {
|
"99eefe5f-ef74-49e6-8a8b-c833e00ca56b": {
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "a/main.lua",
|
|
||||||
"project_definition": null
|
|
||||||
},
|
|
||||||
"9f141826-14c2-492b-b360-2558712f0c08": {
|
|
||||||
"ignore_unknown_instances": true,
|
"ignore_unknown_instances": true,
|
||||||
"source_path": null,
|
"source_path": null,
|
||||||
"project_definition": [
|
"project_definition": [
|
||||||
@@ -160,7 +141,17 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"b1298bcc-e370-44a6-9ef4-fbefa290124c": {
|
"71a95983-c856-4cf2-aee6-bd8a523e80e4": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "b/something.lua",
|
||||||
|
"project_definition": null
|
||||||
|
},
|
||||||
|
"00f207b1-fc18-4088-a45e-caf8cd98f5dd": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "a/main.lua",
|
||||||
|
"project_definition": null
|
||||||
|
},
|
||||||
|
"bf8e2d4f-33a0-42a0-8168-1b62d6ac050c": {
|
||||||
"ignore_unknown_instances": true,
|
"ignore_unknown_instances": true,
|
||||||
"source_path": null,
|
"source_path": null,
|
||||||
"project_definition": [
|
"project_definition": [
|
||||||
@@ -179,31 +170,12 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"46353305-8818-48fe-94fd-80cf0c5d974c": {
|
"b48b369f-5706-4029-9fa6-90651a4910ea": {
|
||||||
"ignore_unknown_instances": false,
|
"ignore_unknown_instances": false,
|
||||||
"source_path": "a/added",
|
"source_path": "a/added",
|
||||||
"project_definition": null
|
"project_definition": null
|
||||||
},
|
},
|
||||||
"1aafa29b-bdca-40a0-a677-7ead327b84ce": {
|
"3b5af13f-c997-4009-915c-0810b0e83032": {
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "a",
|
|
||||||
"project_definition": [
|
|
||||||
"Ack",
|
|
||||||
{
|
|
||||||
"class_name": null,
|
|
||||||
"children": {},
|
|
||||||
"properties": {},
|
|
||||||
"ignore_unknown_instances": null,
|
|
||||||
"path": "a"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"8d690a2a-e987-4c86-b9ac-18e6d3a98503": {
|
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "b/something.lua",
|
|
||||||
"project_definition": null
|
|
||||||
},
|
|
||||||
"645ba594-4482-441f-9f41-5bb9c444405b": {
|
|
||||||
"ignore_unknown_instances": true,
|
"ignore_unknown_instances": true,
|
||||||
"source_path": null,
|
"source_path": null,
|
||||||
"project_definition": [
|
"project_definition": [
|
||||||
@@ -251,6 +223,34 @@
|
|||||||
"path": null
|
"path": null
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"c910510c-37a8-4fd8-ae41-01169ccb739c": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "b",
|
||||||
|
"project_definition": [
|
||||||
|
"Bar",
|
||||||
|
{
|
||||||
|
"class_name": null,
|
||||||
|
"children": {},
|
||||||
|
"properties": {},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": "b"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"14fed1a3-ba97-46a6-ae93-ac26bd9471df": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "a",
|
||||||
|
"project_definition": [
|
||||||
|
"Ack",
|
||||||
|
{
|
||||||
|
"class_name": null,
|
||||||
|
"children": {},
|
||||||
|
"properties": {},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": "a"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
{
|
{
|
||||||
"instances": {
|
"instances": {
|
||||||
"8d44bb30-db3c-4366-a6c5-633bd1441885": {
|
"866071d6-465a-4b88-8c63-07489d950916": {
|
||||||
|
"Name": "added",
|
||||||
|
"ClassName": "Folder",
|
||||||
|
"Properties": {},
|
||||||
|
"Id": "866071d6-465a-4b88-8c63-07489d950916",
|
||||||
|
"Children": [],
|
||||||
|
"Parent": "c910510c-37a8-4fd8-ae41-01169ccb739c"
|
||||||
|
},
|
||||||
|
"00f207b1-fc18-4088-a45e-caf8cd98f5dd": {
|
||||||
"Name": "main",
|
"Name": "main",
|
||||||
"ClassName": "ModuleScript",
|
"ClassName": "ModuleScript",
|
||||||
"Properties": {
|
"Properties": {
|
||||||
@@ -9,70 +17,33 @@
|
|||||||
"Value": "-- hello, from a/main.lua"
|
"Value": "-- hello, from a/main.lua"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Id": "8d44bb30-db3c-4366-a6c5-633bd1441885",
|
"Id": "00f207b1-fc18-4088-a45e-caf8cd98f5dd",
|
||||||
"Children": [],
|
"Children": [],
|
||||||
"Parent": "1aafa29b-bdca-40a0-a677-7ead327b84ce"
|
"Parent": "14fed1a3-ba97-46a6-ae93-ac26bd9471df"
|
||||||
},
|
},
|
||||||
"b1c9928c-bf11-427f-90eb-b672c811d859": {
|
"14fed1a3-ba97-46a6-ae93-ac26bd9471df": {
|
||||||
|
"Name": "Ack",
|
||||||
|
"ClassName": "Folder",
|
||||||
|
"Properties": {},
|
||||||
|
"Id": "14fed1a3-ba97-46a6-ae93-ac26bd9471df",
|
||||||
|
"Children": [
|
||||||
|
"c55fd55c-258e-4a93-a63a-ea243038c9b9",
|
||||||
|
"00f207b1-fc18-4088-a45e-caf8cd98f5dd"
|
||||||
|
],
|
||||||
|
"Parent": "99eefe5f-ef74-49e6-8a8b-c833e00ca56b"
|
||||||
|
},
|
||||||
|
"c910510c-37a8-4fd8-ae41-01169ccb739c": {
|
||||||
"Name": "Bar",
|
"Name": "Bar",
|
||||||
"ClassName": "Folder",
|
"ClassName": "Folder",
|
||||||
"Properties": {},
|
"Properties": {},
|
||||||
"Id": "b1c9928c-bf11-427f-90eb-b672c811d859",
|
"Id": "c910510c-37a8-4fd8-ae41-01169ccb739c",
|
||||||
"Children": [
|
"Children": [
|
||||||
"8d690a2a-e987-4c86-b9ac-18e6d3a98503",
|
"866071d6-465a-4b88-8c63-07489d950916",
|
||||||
"a8566e76-0495-45a3-a713-1c59ab39453b"
|
"71a95983-c856-4cf2-aee6-bd8a523e80e4"
|
||||||
],
|
],
|
||||||
"Parent": "9f141826-14c2-492b-b360-2558712f0c08"
|
"Parent": "99eefe5f-ef74-49e6-8a8b-c833e00ca56b"
|
||||||
},
|
},
|
||||||
"645ba594-4482-441f-9f41-5bb9c444405b": {
|
"c55fd55c-258e-4a93-a63a-ea243038c9b9": {
|
||||||
"Name": "multi_partition_game",
|
|
||||||
"ClassName": "DataModel",
|
|
||||||
"Properties": {},
|
|
||||||
"Id": "645ba594-4482-441f-9f41-5bb9c444405b",
|
|
||||||
"Children": [
|
|
||||||
"b1298bcc-e370-44a6-9ef4-fbefa290124c",
|
|
||||||
"9f141826-14c2-492b-b360-2558712f0c08"
|
|
||||||
],
|
|
||||||
"Parent": null
|
|
||||||
},
|
|
||||||
"9f141826-14c2-492b-b360-2558712f0c08": {
|
|
||||||
"Name": "ReplicatedStorage",
|
|
||||||
"ClassName": "ReplicatedStorage",
|
|
||||||
"Properties": {},
|
|
||||||
"Id": "9f141826-14c2-492b-b360-2558712f0c08",
|
|
||||||
"Children": [
|
|
||||||
"1aafa29b-bdca-40a0-a677-7ead327b84ce",
|
|
||||||
"b1c9928c-bf11-427f-90eb-b672c811d859"
|
|
||||||
],
|
|
||||||
"Parent": "645ba594-4482-441f-9f41-5bb9c444405b"
|
|
||||||
},
|
|
||||||
"8d690a2a-e987-4c86-b9ac-18e6d3a98503": {
|
|
||||||
"Name": "something",
|
|
||||||
"ClassName": "ModuleScript",
|
|
||||||
"Properties": {
|
|
||||||
"Source": {
|
|
||||||
"Type": "String",
|
|
||||||
"Value": "-- b/something.lua"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Id": "8d690a2a-e987-4c86-b9ac-18e6d3a98503",
|
|
||||||
"Children": [],
|
|
||||||
"Parent": "b1c9928c-bf11-427f-90eb-b672c811d859"
|
|
||||||
},
|
|
||||||
"b1298bcc-e370-44a6-9ef4-fbefa290124c": {
|
|
||||||
"Name": "HttpService",
|
|
||||||
"ClassName": "HttpService",
|
|
||||||
"Properties": {
|
|
||||||
"HttpEnabled": {
|
|
||||||
"Type": "Bool",
|
|
||||||
"Value": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Id": "b1298bcc-e370-44a6-9ef4-fbefa290124c",
|
|
||||||
"Children": [],
|
|
||||||
"Parent": "645ba594-4482-441f-9f41-5bb9c444405b"
|
|
||||||
},
|
|
||||||
"54f2f276-964f-4c60-87d8-5fb2209c97c9": {
|
|
||||||
"Name": "foo",
|
"Name": "foo",
|
||||||
"ClassName": "StringValue",
|
"ClassName": "StringValue",
|
||||||
"Properties": {
|
"Properties": {
|
||||||
@@ -81,33 +52,158 @@
|
|||||||
"Value": "Hello world, from a/foo.txt"
|
"Value": "Hello world, from a/foo.txt"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Id": "54f2f276-964f-4c60-87d8-5fb2209c97c9",
|
"Id": "c55fd55c-258e-4a93-a63a-ea243038c9b9",
|
||||||
"Children": [],
|
"Children": [],
|
||||||
"Parent": "1aafa29b-bdca-40a0-a677-7ead327b84ce"
|
"Parent": "14fed1a3-ba97-46a6-ae93-ac26bd9471df"
|
||||||
},
|
},
|
||||||
"a8566e76-0495-45a3-a713-1c59ab39453b": {
|
"71a95983-c856-4cf2-aee6-bd8a523e80e4": {
|
||||||
"Name": "added",
|
"Name": "something",
|
||||||
"ClassName": "Folder",
|
"ClassName": "ModuleScript",
|
||||||
"Properties": {},
|
"Properties": {
|
||||||
"Id": "a8566e76-0495-45a3-a713-1c59ab39453b",
|
"Source": {
|
||||||
|
"Type": "String",
|
||||||
|
"Value": "-- b/something.lua"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Id": "71a95983-c856-4cf2-aee6-bd8a523e80e4",
|
||||||
"Children": [],
|
"Children": [],
|
||||||
"Parent": "b1c9928c-bf11-427f-90eb-b672c811d859"
|
"Parent": "c910510c-37a8-4fd8-ae41-01169ccb739c"
|
||||||
},
|
},
|
||||||
"1aafa29b-bdca-40a0-a677-7ead327b84ce": {
|
"3b5af13f-c997-4009-915c-0810b0e83032": {
|
||||||
"Name": "Ack",
|
"Name": "multi_partition_game",
|
||||||
"ClassName": "Folder",
|
"ClassName": "DataModel",
|
||||||
"Properties": {},
|
"Properties": {},
|
||||||
"Id": "1aafa29b-bdca-40a0-a677-7ead327b84ce",
|
"Id": "3b5af13f-c997-4009-915c-0810b0e83032",
|
||||||
"Children": [
|
"Children": [
|
||||||
"54f2f276-964f-4c60-87d8-5fb2209c97c9",
|
"bf8e2d4f-33a0-42a0-8168-1b62d6ac050c",
|
||||||
"8d44bb30-db3c-4366-a6c5-633bd1441885"
|
"99eefe5f-ef74-49e6-8a8b-c833e00ca56b"
|
||||||
],
|
],
|
||||||
"Parent": "9f141826-14c2-492b-b360-2558712f0c08"
|
"Parent": null
|
||||||
|
},
|
||||||
|
"bf8e2d4f-33a0-42a0-8168-1b62d6ac050c": {
|
||||||
|
"Name": "HttpService",
|
||||||
|
"ClassName": "HttpService",
|
||||||
|
"Properties": {
|
||||||
|
"HttpEnabled": {
|
||||||
|
"Type": "Bool",
|
||||||
|
"Value": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Id": "bf8e2d4f-33a0-42a0-8168-1b62d6ac050c",
|
||||||
|
"Children": [],
|
||||||
|
"Parent": "3b5af13f-c997-4009-915c-0810b0e83032"
|
||||||
|
},
|
||||||
|
"99eefe5f-ef74-49e6-8a8b-c833e00ca56b": {
|
||||||
|
"Name": "ReplicatedStorage",
|
||||||
|
"ClassName": "ReplicatedStorage",
|
||||||
|
"Properties": {},
|
||||||
|
"Id": "99eefe5f-ef74-49e6-8a8b-c833e00ca56b",
|
||||||
|
"Children": [
|
||||||
|
"14fed1a3-ba97-46a6-ae93-ac26bd9471df",
|
||||||
|
"c910510c-37a8-4fd8-ae41-01169ccb739c"
|
||||||
|
],
|
||||||
|
"Parent": "3b5af13f-c997-4009-915c-0810b0e83032"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"root_id": "645ba594-4482-441f-9f41-5bb9c444405b",
|
"root_id": "3b5af13f-c997-4009-915c-0810b0e83032",
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"645ba594-4482-441f-9f41-5bb9c444405b": {
|
"bf8e2d4f-33a0-42a0-8168-1b62d6ac050c": {
|
||||||
|
"ignore_unknown_instances": true,
|
||||||
|
"source_path": null,
|
||||||
|
"project_definition": [
|
||||||
|
"HttpService",
|
||||||
|
{
|
||||||
|
"class_name": "HttpService",
|
||||||
|
"children": {},
|
||||||
|
"properties": {
|
||||||
|
"HttpEnabled": {
|
||||||
|
"Type": "Bool",
|
||||||
|
"Value": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"c910510c-37a8-4fd8-ae41-01169ccb739c": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "b",
|
||||||
|
"project_definition": [
|
||||||
|
"Bar",
|
||||||
|
{
|
||||||
|
"class_name": null,
|
||||||
|
"children": {},
|
||||||
|
"properties": {},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": "b"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"866071d6-465a-4b88-8c63-07489d950916": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "b/added",
|
||||||
|
"project_definition": null
|
||||||
|
},
|
||||||
|
"14fed1a3-ba97-46a6-ae93-ac26bd9471df": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "a",
|
||||||
|
"project_definition": [
|
||||||
|
"Ack",
|
||||||
|
{
|
||||||
|
"class_name": null,
|
||||||
|
"children": {},
|
||||||
|
"properties": {},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": "a"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"00f207b1-fc18-4088-a45e-caf8cd98f5dd": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "a/main.lua",
|
||||||
|
"project_definition": null
|
||||||
|
},
|
||||||
|
"99eefe5f-ef74-49e6-8a8b-c833e00ca56b": {
|
||||||
|
"ignore_unknown_instances": true,
|
||||||
|
"source_path": null,
|
||||||
|
"project_definition": [
|
||||||
|
"ReplicatedStorage",
|
||||||
|
{
|
||||||
|
"class_name": "ReplicatedStorage",
|
||||||
|
"children": {
|
||||||
|
"Ack": {
|
||||||
|
"class_name": null,
|
||||||
|
"children": {},
|
||||||
|
"properties": {},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": "a"
|
||||||
|
},
|
||||||
|
"Bar": {
|
||||||
|
"class_name": null,
|
||||||
|
"children": {},
|
||||||
|
"properties": {},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": "b"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"properties": {},
|
||||||
|
"ignore_unknown_instances": null,
|
||||||
|
"path": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"71a95983-c856-4cf2-aee6-bd8a523e80e4": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "b/something.lua",
|
||||||
|
"project_definition": null
|
||||||
|
},
|
||||||
|
"c55fd55c-258e-4a93-a63a-ea243038c9b9": {
|
||||||
|
"ignore_unknown_instances": false,
|
||||||
|
"source_path": "a/foo.txt",
|
||||||
|
"project_definition": null
|
||||||
|
},
|
||||||
|
"3b5af13f-c997-4009-915c-0810b0e83032": {
|
||||||
"ignore_unknown_instances": true,
|
"ignore_unknown_instances": true,
|
||||||
"source_path": null,
|
"source_path": null,
|
||||||
"project_definition": [
|
"project_definition": [
|
||||||
@@ -155,102 +251,6 @@
|
|||||||
"path": null
|
"path": null
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
"1aafa29b-bdca-40a0-a677-7ead327b84ce": {
|
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "a",
|
|
||||||
"project_definition": [
|
|
||||||
"Ack",
|
|
||||||
{
|
|
||||||
"class_name": null,
|
|
||||||
"children": {},
|
|
||||||
"properties": {},
|
|
||||||
"ignore_unknown_instances": null,
|
|
||||||
"path": "a"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"a8566e76-0495-45a3-a713-1c59ab39453b": {
|
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "b/added",
|
|
||||||
"project_definition": null
|
|
||||||
},
|
|
||||||
"8d690a2a-e987-4c86-b9ac-18e6d3a98503": {
|
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "b/something.lua",
|
|
||||||
"project_definition": null
|
|
||||||
},
|
|
||||||
"8d44bb30-db3c-4366-a6c5-633bd1441885": {
|
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "a/main.lua",
|
|
||||||
"project_definition": null
|
|
||||||
},
|
|
||||||
"9f141826-14c2-492b-b360-2558712f0c08": {
|
|
||||||
"ignore_unknown_instances": true,
|
|
||||||
"source_path": null,
|
|
||||||
"project_definition": [
|
|
||||||
"ReplicatedStorage",
|
|
||||||
{
|
|
||||||
"class_name": "ReplicatedStorage",
|
|
||||||
"children": {
|
|
||||||
"Ack": {
|
|
||||||
"class_name": null,
|
|
||||||
"children": {},
|
|
||||||
"properties": {},
|
|
||||||
"ignore_unknown_instances": null,
|
|
||||||
"path": "a"
|
|
||||||
},
|
|
||||||
"Bar": {
|
|
||||||
"class_name": null,
|
|
||||||
"children": {},
|
|
||||||
"properties": {},
|
|
||||||
"ignore_unknown_instances": null,
|
|
||||||
"path": "b"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"properties": {},
|
|
||||||
"ignore_unknown_instances": null,
|
|
||||||
"path": null
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"b1c9928c-bf11-427f-90eb-b672c811d859": {
|
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "b",
|
|
||||||
"project_definition": [
|
|
||||||
"Bar",
|
|
||||||
{
|
|
||||||
"class_name": null,
|
|
||||||
"children": {},
|
|
||||||
"properties": {},
|
|
||||||
"ignore_unknown_instances": null,
|
|
||||||
"path": "b"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"54f2f276-964f-4c60-87d8-5fb2209c97c9": {
|
|
||||||
"ignore_unknown_instances": false,
|
|
||||||
"source_path": "a/foo.txt",
|
|
||||||
"project_definition": null
|
|
||||||
},
|
|
||||||
"b1298bcc-e370-44a6-9ef4-fbefa290124c": {
|
|
||||||
"ignore_unknown_instances": true,
|
|
||||||
"source_path": null,
|
|
||||||
"project_definition": [
|
|
||||||
"HttpService",
|
|
||||||
{
|
|
||||||
"class_name": "HttpService",
|
|
||||||
"children": {},
|
|
||||||
"properties": {
|
|
||||||
"HttpEnabled": {
|
|
||||||
"Type": "Bool",
|
|
||||||
"Value": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"ignore_unknown_instances": null,
|
|
||||||
"path": null
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user