Skip to content

Commit 42568b9

Browse files
authored
Release Rojo v7.7.0-rc.1 (#1174)
1 parent 87f58e0 commit 42568b9

File tree

7 files changed

+600
-267
lines changed

7 files changed

+600
-267
lines changed

CHANGELOG.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ Making a new release? Simply add the new header with the version and date undern
3131

3232
## Unreleased
3333

34+
## [7.7.0-rc.1] (November 27th, 2025)
35+
3436
* Fixed a bug where passing `--skip-git` to `rojo init` would still create a file named `gitignore.txt` ([#1172])
3537
* A new command `rojo syncback` has been added. It can be used as `rojo syncback [path to project] --input [path to file]`. ([#937])
3638
This command takes a Roblox file and pulls Instances out of it and places them in the correct position in the provided project.
@@ -65,13 +67,11 @@ Making a new release? Simply add the new header with the version and date undern
6567
- `syncCurrentCamera` is a toggle for whether to sync back the Workspace's CurrentCamera. Defaults to `false`.
6668
- `syncUnscriptable` is a toggle for whether to sync back properties that cannot be set by the Roblox Studio plugin. Defaults to `true`.
6769

68-
If you are used to the `UpliftGames` version of this feature, there are a few notable differences:
69-
- `syncUnscriptable` defaults to `true` instead of `false`
70-
- `ignoreTrees` doesn't require the root of the project's name in it.
7170
* Fixed bugs and improved performance & UX for the script diff viewer ([#994])
7271
* Rebuilt the internal communication between the server and plugin to use [websockets](https://devforum.roblox.com/t/websockets-support-in-studio-is-now-available/4021932/1) instead of [long polling](https://en.wikipedia.org/wiki/Push_technology#Long_polling) ([#1142])
7372
* Added support for `.jsonc` files for all JSON-related files (e.g. `.project.jsonc` and `.meta.jsonc`) to accompany JSONC support ([#1159])
7473

74+
[7.7.0-rc.1]: https://github.com/rojo-rbx/rojo/releases/tag/v7.7.0-rc.1
7575
[#937]: https://github.com/rojo-rbx/rojo/pull/937
7676
[#994]: https://github.com/rojo-rbx/rojo/pull/994
7777
[#1142]: https://github.com/rojo-rbx/rojo/pull/1142

Cargo.lock

Lines changed: 13 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rojo"
3-
version = "7.7.0-prealpha"
3+
version = "7.7.0-rc.1"
44
rust-version = "1.88"
55
authors = [
66
"Lucien Greathouse <me@lpghatguy.com>",
@@ -49,17 +49,19 @@ harness = false
4949
memofs = { version = "0.3.0", path = "crates/memofs" }
5050

5151
# These dependencies can be uncommented when working on rbx-dom simultaneously
52-
# rbx_binary = { path = "../rbx-dom/rbx_binary" }
52+
# rbx_binary = { path = "../rbx-dom/rbx_binary", features = [
53+
# "unstable_text_format",
54+
# ] }
5355
# rbx_dom_weak = { path = "../rbx-dom/rbx_dom_weak" }
5456
# rbx_reflection = { path = "../rbx-dom/rbx_reflection" }
5557
# rbx_reflection_database = { path = "../rbx-dom/rbx_reflection_database" }
5658
# rbx_xml = { path = "../rbx-dom/rbx_xml" }
5759

58-
rbx_binary = { version = "2.0.0", features = ["unstable_text_format"] }
59-
rbx_dom_weak = "4.0.0"
60-
rbx_reflection = "6.0.0"
61-
rbx_reflection_database = "2.0.1"
62-
rbx_xml = "2.0.0"
60+
rbx_binary = { version = "2.0.1", features = ["unstable_text_format"] }
61+
rbx_dom_weak = "4.1.0"
62+
rbx_reflection = "6.1.0"
63+
rbx_reflection_database = "2.0.2"
64+
rbx_xml = "2.0.1"
6365

6466
anyhow = "1.0.80"
6567
backtrace = "0.3.69"

plugin/Version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7.7.0-prealpha
1+
7.7.0-rc.1

plugin/rbx_dom_lua/base64.lua

Lines changed: 7 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -1,139 +1,10 @@
1-
-- Thanks to Tiffany352 for this base64 implementation!
2-
3-
local floor = math.floor
4-
local char = string.char
5-
6-
local function encodeBase64(str)
7-
local out = {}
8-
local nOut = 0
9-
local alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
10-
local strLen = #str
11-
12-
-- 3 octets become 4 hextets
13-
for i = 1, strLen - 2, 3 do
14-
local b1, b2, b3 = str:byte(i, i + 3)
15-
local word = b3 + b2 * 256 + b1 * 256 * 256
16-
17-
local h4 = word % 64 + 1
18-
word = floor(word / 64)
19-
local h3 = word % 64 + 1
20-
word = floor(word / 64)
21-
local h2 = word % 64 + 1
22-
word = floor(word / 64)
23-
local h1 = word % 64 + 1
24-
25-
out[nOut + 1] = alphabet:sub(h1, h1)
26-
out[nOut + 2] = alphabet:sub(h2, h2)
27-
out[nOut + 3] = alphabet:sub(h3, h3)
28-
out[nOut + 4] = alphabet:sub(h4, h4)
29-
nOut = nOut + 4
30-
end
31-
32-
local remainder = strLen % 3
33-
34-
if remainder == 2 then
35-
-- 16 input bits -> 3 hextets (2 full, 1 partial)
36-
local b1, b2 = str:byte(-2, -1)
37-
-- partial is 4 bits long, leaving 2 bits of zero padding ->
38-
-- offset = 4
39-
local word = b2 * 4 + b1 * 4 * 256
40-
41-
local h3 = word % 64 + 1
42-
word = floor(word / 64)
43-
local h2 = word % 64 + 1
44-
word = floor(word / 64)
45-
local h1 = word % 64 + 1
46-
47-
out[nOut + 1] = alphabet:sub(h1, h1)
48-
out[nOut + 2] = alphabet:sub(h2, h2)
49-
out[nOut + 3] = alphabet:sub(h3, h3)
50-
out[nOut + 4] = "="
51-
elseif remainder == 1 then
52-
-- 8 input bits -> 2 hextets (2 full, 1 partial)
53-
local b1 = str:byte(-1, -1)
54-
-- partial is 2 bits long, leaving 4 bits of zero padding ->
55-
-- offset = 16
56-
local word = b1 * 16
57-
58-
local h2 = word % 64 + 1
59-
word = floor(word / 64)
60-
local h1 = word % 64 + 1
61-
62-
out[nOut + 1] = alphabet:sub(h1, h1)
63-
out[nOut + 2] = alphabet:sub(h2, h2)
64-
out[nOut + 3] = "="
65-
out[nOut + 4] = "="
66-
end
67-
-- if the remainder is 0, then no work is needed
68-
69-
return table.concat(out, "")
70-
end
71-
72-
local function decodeBase64(str)
73-
local out = {}
74-
local nOut = 0
75-
local alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
76-
local strLen = #str
77-
local acc = 0
78-
local nAcc = 0
79-
80-
local alphabetLut = {}
81-
for i = 1, #alphabet do
82-
alphabetLut[alphabet:sub(i, i)] = i - 1
83-
end
84-
85-
-- 4 hextets become 3 octets
86-
for i = 1, strLen do
87-
local ch = str:sub(i, i)
88-
local byte = alphabetLut[ch]
89-
if byte then
90-
acc = acc * 64 + byte
91-
nAcc = nAcc + 1
92-
end
93-
94-
if nAcc == 4 then
95-
local b3 = acc % 256
96-
acc = floor(acc / 256)
97-
local b2 = acc % 256
98-
acc = floor(acc / 256)
99-
local b1 = acc % 256
100-
101-
out[nOut + 1] = char(b1)
102-
out[nOut + 2] = char(b2)
103-
out[nOut + 3] = char(b3)
104-
nOut = nOut + 3
105-
nAcc = 0
106-
acc = 0
107-
end
108-
end
109-
110-
if nAcc == 3 then
111-
-- 3 hextets -> 16 bit output
112-
acc = acc * 64
113-
acc = floor(acc / 256)
114-
local b2 = acc % 256
115-
acc = floor(acc / 256)
116-
local b1 = acc % 256
117-
118-
out[nOut + 1] = char(b1)
119-
out[nOut + 2] = char(b2)
120-
elseif nAcc == 2 then
121-
-- 2 hextets -> 8 bit output
122-
acc = acc * 64
123-
acc = floor(acc / 256)
124-
acc = acc * 64
125-
acc = floor(acc / 256)
126-
local b1 = acc % 256
127-
128-
out[nOut + 1] = char(b1)
129-
elseif nAcc == 1 then
130-
error("Base64 has invalid length")
131-
end
132-
133-
return table.concat(out, "")
134-
end
1+
local EncodingService = game:GetService("EncodingService")
1352

1363
return {
137-
decode = decodeBase64,
138-
encode = encodeBase64,
4+
decode = function(input: string)
5+
return buffer.tostring(EncodingService:Base64Decode(buffer.fromstring(input)))
6+
end,
7+
encode = function(input: string)
8+
return buffer.tostring(EncodingService:Base64Encode(buffer.fromstring(input)))
9+
end,
13910
}

plugin/rbx_dom_lua/customProperties.lua

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,4 +208,30 @@ return {
208208
end,
209209
},
210210
},
211+
StyleRule = {
212+
PropertiesSerialize = {
213+
read = function(instance: StyleRule)
214+
return true, instance:GetProperties()
215+
end,
216+
write = function(instance: StyleRule, _, value: { [any]: any })
217+
if typeof(value) ~= "table" then
218+
return false, Error.new(Error.Kind.CannotParseBinaryString)
219+
end
220+
221+
local existing = instance:GetProperties()
222+
223+
for itemName, itemValue in pairs(value) do
224+
instance:SetProperty(itemName, itemValue)
225+
end
226+
227+
for existingItemName in pairs(existing) do
228+
if value[existingItemName] == nil then
229+
instance:SetProperty(existingItemName, nil)
230+
end
231+
end
232+
233+
return true
234+
end,
235+
},
236+
},
211237
}

0 commit comments

Comments
 (0)