Compare commits

..

27 Commits

Author SHA1 Message Date
Jaguar
d147ae7bb6 Fix typos (#239) 2019-08-28 21:28:52 -07:00
Lucien Greathouse
9b6ce57c79 Add notice about 0.4.x end-of-life. Closes #235. 2019-08-27 14:46:29 -07:00
Lucien Greathouse
ed85d2a327 Fix doc image links 2019-02-08 14:08:59 -08:00
Lucien Greathouse
7e5b8cadfc Update doc links 2019-01-28 15:39:52 -08:00
Lucien Greathouse
c805f4fa2d Point site URL to 0.4.x 2019-01-12 16:33:08 -08:00
Lucien Greathouse
f09d7fb0ff Update docs home to be more specific 2019-01-10 10:51:03 -08:00
Lucien Greathouse
4e918bab5e Ignore generate-docs command, should only exist on master 2019-01-09 23:20:19 -08:00
Lucien Greathouse
8e3f9b3bfd Add links to newer docs from 0.4.x docs 2019-01-09 23:16:08 -08:00
Lucien Greathouse
300975f49c 0.4.13 2018-11-12 21:51:48 -08:00
Lucien Greathouse
325cf56457 Update CHANGES and test-project 2018-11-12 21:47:08 -08:00
Lucien Greathouse
71b1320aa8 Issue a warning instead of dying when a partition target does not exist 2018-11-12 21:45:28 -08:00
Lucien Greathouse
c5abc87dbd Increase polling interval to 300ms 2018-08-17 11:24:05 -07:00
Lucien Greathouse
bd7ab593d5 Release 0.4.12 2018-06-21 11:21:42 -07:00
Lucien Greathouse
c93da3f6b2 Update CHANGES 2018-06-21 11:19:22 -07:00
Lucien Greathouse
8b90e98696 Added a plugin action for the sync in command (#80) 2018-06-21 11:17:26 -07:00
Lucien Greathouse
bc40ec8a5a Update CHANGES 2018-06-21 11:11:03 -07:00
Lucien Greathouse
f19cbccdd5 Fix assertion failure when renaming files.
Fixes #78.
2018-06-21 11:10:28 -07:00
Lucien Greathouse
f25ae914e4 Add TODO about preserving partition roots in reconciliation 2018-06-20 18:23:24 -07:00
Lucien Greathouse
fb7bfa928a Release 0.4.11 2018-06-10 15:54:57 -07:00
Lucien Greathouse
100d69262c Update CHANGES 2018-06-10 15:52:42 -07:00
Lucien Greathouse
5e01658846 Remove straggling debug message 2018-06-10 15:50:30 -07:00
Lucien Greathouse
ccec93aee8 Untangle route terminology a bit 2018-06-10 15:50:03 -07:00
Lucien Greathouse
a089d82023 Fix incorrect route being assigned to init.lua and init.model.json files 2018-06-10 15:44:56 -07:00
Lucien Greathouse
82ba583fa0 Fix incorrect synchronization for Plugin:_pull that would make polling flaky 2018-06-10 15:13:49 -07:00
Lucien Greathouse
1b82044d7d Defensively insert existing instances into RouteMap 2018-06-10 15:03:36 -07:00
Lucien Greathouse
0d49a2e0af Mention VS Code extension in getting started guide 2018-06-02 01:04:31 -07:00
Lucien Greathouse
1343d3a2a9 Pick up rest of changes for 0.4.10, oops 2018-06-02 00:50:35 -07:00
18 changed files with 108 additions and 55 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
/site /site
/generate-docs

View File

@@ -1,6 +1,22 @@
# Rojo Change Log # Rojo Change Log
## Current master ## Current master
* *No changes*
## 0.4.13 (November 12, 2018)
* When `rojo.json` points to a file or directory that does not exist, Rojo now issues a warning instead of throwing an error and exiting
## 0.4.12 (June 21, 2018)
* Fixed obscure assertion failure when renaming or deleting files ([#78](https://github.com/LPGhatguy/rojo/issues/78))
* Added a `PluginAction` for the sync in command, which should help with some automation scripts ([#80](https://github.com/LPGhatguy/rojo/pull/80))
## 0.4.11 (June 10, 2018)
* Defensively insert existing instances into RouteMap; should fix most duplication cases when syncing into existing trees.
* Fixed incorrect synchronization from `Plugin:_pull` that would cause polling to create issues
* Fixed incorrect file routes being assigned to `init.lua` and `init.model.json` files
* Untangled route handling-internals slightly
## 0.4.10 (June 2, 2018)
* Added support for `init.model.json` files, which enable versioning `Tool` instances (among other things) with Rojo. ([#66](https://github.com/LPGhatguy/rojo/issues/66)) * Added support for `init.model.json` files, which enable versioning `Tool` instances (among other things) with Rojo. ([#66](https://github.com/LPGhatguy/rojo/issues/66))
* Fixed obscure error when syncing into an invalid service. * Fixed obscure error when syncing into an invalid service.
* Fixed multiple sync processes occurring when a server ID mismatch is detected. * Fixed multiple sync processes occurring when a server ID mismatch is detected.

View File

@@ -8,7 +8,7 @@
<a href="https://travis-ci.org/LPGhatguy/rojo"> <a href="https://travis-ci.org/LPGhatguy/rojo">
<img src="https://api.travis-ci.org/LPGhatguy/rojo.svg?branch=master" alt="Travis-CI Build Status" /> <img src="https://api.travis-ci.org/LPGhatguy/rojo.svg?branch=master" alt="Travis-CI Build Status" />
</a> </a>
<img src="https://img.shields.io/badge/latest_version-0.4.9-brightgreen.svg" alt="Current server version" /> <img src="https://img.shields.io/badge/latest_version-0.4.13-brightgreen.svg" alt="Current server version" />
<a href="https://lpghatguy.github.io/rojo"> <a href="https://lpghatguy.github.io/rojo">
<img src="https://img.shields.io/badge/documentation-website-brightgreen.svg" alt="Rojo Documentation" /> <img src="https://img.shields.io/badge/documentation-website-brightgreen.svg" alt="Rojo Documentation" />
</a> </a>

View File

@@ -56,7 +56,7 @@ If your project is in the right place, Rojo will let you know that it was found
In Roblox Studio, open the plugins tab and find Rojo's buttons. In Roblox Studio, open the plugins tab and find Rojo's buttons.
![Location of Rojo's plugin buttons in Roblox Studio](/images/plugin-buttons.png) ![Location of Rojo's plugin buttons in Roblox Studio](../images/plugin-buttons.png)
{: align="center" } {: align="center" }
Press **Test Connection** to verify that the plugin can communicate with the dev server. Watch the Output panel for the results. Press **Test Connection** to verify that the plugin can communicate with the dev server. Watch the Output panel for the results.
@@ -64,7 +64,7 @@ Press **Test Connection** to verify that the plugin can communicate with the dev
!!! info !!! info
If you see an error message, return to the previous steps and make sure that the Rojo dev server is running. If you see an error message, return to the previous steps and make sure that the Rojo dev server is running.
![Rojo error in Roblox Studio Output](/images/connection-error.png) ![Rojo error in Roblox Studio Output](../images/connection-error.png)
{: align="center" } {: align="center" }
After your connection was successful, press **Sync In** to move code from the filesystem into Studio, or use **Toggle Polling** to have Rojo automatically sync in changes as they happen. After your connection was successful, press **Sync In** to move code from the filesystem into Studio, or use **Toggle Polling** to have Rojo automatically sync in changes as they happen.

View File

@@ -20,4 +20,7 @@ To install the plugin, either:
* Install the plugin from the [Roblox plugin page](https://www.roblox.com/library/1211549683/Rojo). * Install the plugin from the [Roblox plugin page](https://www.roblox.com/library/1211549683/Rojo).
* This gives you less control over what version you install -- you will always have the latest version. * This gives you less control over what version you install -- you will always have the latest version.
* Or, download the latest release from [the GitHub releases section](https://github.com/LPGhatguy/rojo/releases) and install it into your Roblox plugins folder * Or, download the latest release from [the GitHub releases section](https://github.com/LPGhatguy/rojo/releases) and install it into your Roblox plugins folder
* You can open this folder by clicking the "Plugins Folder" button from the Plugins toolbar in Roblox Studio * You can open this folder by clicking the "Plugins Folder" button from the Plugins toolbar in Roblox Studio
## Visual Studio Code Extension
If you use Visual Studio Code on Windows, you can install [Evaera's unofficial Rojo extension](https://marketplace.visualstudio.com/items?itemName=evaera.vscode-rojo), which will install both halves of Rojo for you. It even has a nifty UI to add partitions and start/stop the Rojo server!

View File

@@ -1,6 +1,16 @@
# Home This is the documentation home for **Rojo 0.4.x**.
This is the documentation home for Rojo.
**Rojo** is a flexible multi-tool designed for creating robust Roblox projects. !!! warning
Rojo 0.4.x has reached end-of-life as of the release of Rojo 0.5.0 on August 27, 2019.
This documentation is a work in progress, and is incomplete. Upgrading to Rojo 0.5.0 is strongly recommended to get new features and continue getting support.
Available versions of these docs:
* [Latest version from `master` branch](https://rojo.space/docs/latest)
* [0.5.x](https://rojo.space/docs/0.5.x)
* [0.4.x](https://rojo.space/docs/0.4.x)
**Rojo** is a tool designed to enable Roblox developers to use professional-grade software engineering tools.
This documentation is a continual work in progress. If you find any issues, please file an issue on [Rojo's issue tracker](https://github.com/rojo-rbx/rojo/issues)!

View File

@@ -5,7 +5,7 @@ This page aims to describe how Rojo turns files on the filesystem into Roblox ob
Any directory on the filesystem will turn into a `Folder` instance in Roblox, unless that folder matches the name of a service or other existing instance. In those cases, that instance will be preserved. Any directory on the filesystem will turn into a `Folder` instance in Roblox, unless that folder matches the name of a service or other existing instance. In those cases, that instance will be preserved.
## Scripts ## Scripts
Rojo can represent `ModuleScript`, `Script`, and `LocalScript` objects. The default script type is `ModuleScript`, since most scripts in well-structued Roblox projects will be modules. Rojo can represent `ModuleScript`, `Script`, and `LocalScript` objects. The default script type is `ModuleScript`, since most scripts in well-structured Roblox projects will be modules.
| File Name | Instance Type | | File Name | Instance Type |
| -------------- | -------------- | | -------------- | -------------- |
@@ -13,7 +13,7 @@ Rojo can represent `ModuleScript`, `Script`, and `LocalScript` objects. The defa
| `*.client.lua` | `LocalScript` | | `*.client.lua` | `LocalScript` |
| `*.lua` | `ModuleScript` | | `*.lua` | `ModuleScript` |
If a directory contains a file named `init.server.lua`, `init.client.lua`, or `init.lua`, that folder will be transformed into a `*Script` instance with the conents of the `init` file. This can be used to create scripts inside of scripts. If a directory contains a file named `init.server.lua`, `init.client.lua`, or `init.lua`, that folder will be transformed into a `*Script` instance with the contents of the `init` file. This can be used to create scripts inside of scripts.
For example, this file tree: For example, this file tree:
@@ -23,7 +23,7 @@ For example, this file tree:
Will turn into these instances in Roblox: Will turn into these instances in Roblox:
![Example of Roblox instances](/images/sync-example.png) ![Example of Roblox instances](images/sync-example.png)
## Models ## Models
Rojo supports a JSON model format for representing simple models. It's designed for instance types like `BindableEvent` or `Value` objects, and is not suitable for larger models. Rojo supports a JSON model format for representing simple models. It's designed for instance types like `BindableEvent` or `Value` objects, and is not suitable for larger models.
@@ -62,4 +62,4 @@ JSON model files are fairly strict; any syntax errors will cause the model to fa
} }
] ]
} }
``` ```

View File

@@ -1,5 +1,5 @@
site_name: Rojo Documentation site_name: Rojo Documentation
site_url: https://lpghatguy.github.io/rojo/ site_url: https://lpghatguy.github.io/rojo/0.4.x
repo_name: LPGhatguy/rojo repo_name: LPGhatguy/rojo
repo_url: https://github.com/LPGhatguy/rojo repo_url: https://github.com/LPGhatguy/rojo
@@ -9,7 +9,7 @@ theme:
primary: 'Red' primary: 'Red'
accent: 'Red' accent: 'Red'
pages: nav:
- Home: index.md - Home: index.md
- Why Rojo?: why-rojo.md - Why Rojo?: why-rojo.md
- Getting Started: - Getting Started:

View File

@@ -1,6 +1,6 @@
return { return {
pollingRate = 0.2, pollingRate = 0.3,
version = {0, 4, 9}, version = {0, 4, 13},
expectedServerVersionString = "0.4.x", expectedServerVersionString = "0.4.x",
protocolVersion = 1, protocolVersion = 1,
icons = { icons = {

View File

@@ -55,15 +55,20 @@ local function main()
end) end)
end) end)
toolbar:CreateButton("Sync In", "Sync into Roblox Studio", Config.icons.syncIn) local function syncIn()
.Click:Connect(function() checkUpgrade()
checkUpgrade()
pluginInstance:syncIn() pluginInstance:syncIn()
:catch(function(err) :catch(function(err)
warn(err) warn(err)
end) end)
end) end
local shortDescription = "Sync In"
local longDescription = "Sync into Roblox Studio"
toolbar:CreateButton(shortDescription, longDescription, Config.icons.syncIn).Click:Connect(syncIn)
plugin:CreatePluginAction("RojoSyncIn", shortDescription, longDescription).Triggered:Connect(syncIn)
toolbar:CreateButton("Toggle Polling", "Poll server for changes", Config.icons.togglePolling) toolbar:CreateButton("Toggle Polling", "Poll server for changes", Config.icons.togglePolling)
.Click:Connect(function() .Click:Connect(function()

View File

@@ -169,38 +169,34 @@ function Plugin:stopPolling()
return Promise.resolve(true) return Promise.resolve(true)
end end
function Plugin:_pull(api, project, routes) function Plugin:_pull(api, project, fileRoutes)
return api:read(routes) return api:read(fileRoutes)
:andThen(function(items) :andThen(function(items)
for index = 1, #routes do for index = 1, #fileRoutes do
local itemRoute = routes[index] local fileRoute = fileRoutes[index]
local partitionName = itemRoute[1] local partitionName = fileRoute[1]
local partition = project.partitions[partitionName] local partition = project.partitions[partitionName]
local item = items[index] local item = items[index]
local partitionRoute = collectMatch(partition.target, "[^.]+") local partitionTargetRbxRoute = collectMatch(partition.target, "[^.]+")
-- If the item route's length was 1, we need to rename the instance to -- If the item route's length was 1, we need to rename the instance to
-- line up with the partition's root object name. -- line up with the partition's root object name.
-- if item ~= nil and #fileRoute == 1 then
-- This is a HACK! local objectName = partition.target:match("[^.]+$")
if #itemRoute == 1 then item.Name = objectName
if item then
local objectName = partition.target:match("[^.]+$")
item.Name = objectName
end
end end
local fullRoute = {} local itemRbxRoute = {}
for _, piece in ipairs(partitionRoute) do for _, piece in ipairs(partitionTargetRbxRoute) do
table.insert(fullRoute, piece) table.insert(itemRbxRoute, piece)
end end
for i = 2, #itemRoute do for i = 2, #fileRoute do
table.insert(fullRoute, itemRoute[i]) table.insert(itemRbxRoute, fileRoute[i])
end end
self._reconciler:reconcileRoute(fullRoute, item, itemRoute) self._reconciler:reconcileRoute(itemRbxRoute, item, fileRoute)
end end
end) end)
end end
@@ -283,15 +279,20 @@ function Plugin:syncIn()
return Promise.reject(info) return Promise.reject(info)
end end
local routes = {} local fileRoutes = {}
for name in pairs(info.project.partitions) do for name in pairs(info.project.partitions) do
table.insert(routes, {name}) table.insert(fileRoutes, {name})
end end
self:_pull(api, info.project, routes) local pullSuccess, pullResult = self:_pull(api, info.project, fileRoutes):await()
self._syncInProgress = false self._syncInProgress = false
if not pullSuccess then
return Promise.reject(pullResult)
end
print("Rojo: Sync successful!") print("Rojo: Sync successful!")
end) end)
:catch(function(err) :catch(function(err)

View File

@@ -170,6 +170,8 @@ function Reconciler:reconcile(rbx, item)
-- Item was deleted -- Item was deleted
if item == nil then if item == nil then
if rbx ~= nil then if rbx ~= nil then
-- TODO: If this is a partition root, should we leave it alone?
self._routeMap:removeByRbx(rbx) self._routeMap:removeByRbx(rbx)
rbx:Destroy() rbx:Destroy()
end end
@@ -190,18 +192,24 @@ function Reconciler:reconcile(rbx, item)
return self:_reify(item) return self:_reify(item)
end end
-- It's possible that the instance we're associating with this item hasn't
-- been inserted into the RouteMap yet.
if item.Route ~= nil then
self._routeMap:insert(item.Route, rbx)
end
applyProperties(rbx, item.Properties) applyProperties(rbx, item.Properties)
self:_reconcileChildren(rbx, item) self:_reconcileChildren(rbx, item)
return rbx return rbx
end end
function Reconciler:reconcileRoute(route, item, itemRoute) function Reconciler:reconcileRoute(rbxRoute, item, fileRoute)
local parent local parent
local rbx = game local rbx = game
for i = 1, #route do for i = 1, #rbxRoute do
local piece = route[i] local piece = rbxRoute[i]
local child = rbx:FindFirstChild(piece) local child = rbx:FindFirstChild(piece)
@@ -217,7 +225,7 @@ function Reconciler:reconcileRoute(route, item, itemRoute)
end end
-- We don't want to create a folder if we're reaching our target item! -- We don't want to create a folder if we're reaching our target item!
if child == nil and i ~= #route then if child == nil and i ~= #rbxRoute then
child = Instance.new("Folder") child = Instance.new("Folder")
child.Parent = rbx child.Parent = rbx
child.Name = piece child.Name = piece
@@ -229,12 +237,14 @@ function Reconciler:reconcileRoute(route, item, itemRoute)
-- Let's check the route map! -- Let's check the route map!
if rbx == nil then if rbx == nil then
rbx = self._routeMap:get(itemRoute) rbx = self._routeMap:get(fileRoute)
end end
rbx = self:reconcile(rbx, item) rbx = self:reconcile(rbx, item)
reparent(rbx, parent) if rbx ~= nil then
reparent(rbx, parent)
end
end end
return Reconciler return Reconciler

2
server/Cargo.lock generated
View File

@@ -636,7 +636,7 @@ dependencies = [
[[package]] [[package]]
name = "rojo" name = "rojo"
version = "0.4.10" version = "0.4.13"
dependencies = [ dependencies = [
"clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "rojo" name = "rojo"
version = "0.4.10" version = "0.4.13"
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"

View File

@@ -59,6 +59,7 @@ impl Plugin for JsonModelPlugin {
rbx_item.name.clear(); rbx_item.name.clear();
rbx_item.name.push_str(vfs_item.name()); rbx_item.name.push_str(vfs_item.name());
rbx_item.route = Some(vfs_item.route().to_vec());
for (child_name, child_item) in children { for (child_name, child_item) in children {
if child_name == init_item.name() { if child_name == init_item.name() {

View File

@@ -79,6 +79,7 @@ impl Plugin for ScriptPlugin {
rbx_item.name.clear(); rbx_item.name.clear();
rbx_item.name.push_str(vfs_item.name()); rbx_item.name.push_str(vfs_item.name());
rbx_item.route = Some(vfs_item.route().to_vec());
for (child_name, child_item) in children { for (child_name, child_item) in children {
if child_name == init_item.name() { if child_name == init_item.name() {

View File

@@ -83,7 +83,8 @@ impl VfsWatcher {
match watcher.watch(&root_path, RecursiveMode::Recursive) { match watcher.watch(&root_path, RecursiveMode::Recursive) {
Ok(_) => (), Ok(_) => (),
Err(_) => { Err(_) => {
panic!("Unable to watch partition {}, with path {}! Make sure that it's a file or directory.", partition_name, root_path.display()); eprintln!("WARNING: Unable to watch partition {}, with path {}\nMake sure that it's a file or directory.", partition_name, root_path.display());
continue;
}, },
} }

View File

@@ -9,6 +9,10 @@
"extra": { "extra": {
"path": "extra-script.lua", "path": "extra-script.lua",
"target": "ReplicatedStorage.ExtraScript" "target": "ReplicatedStorage.ExtraScript"
},
"does-not-exist": {
"path": "hahah",
"target": "ReplicatedStorage.Never"
} }
} }
} }