rosebud pull
Bring a game's current files, including edits made in Rosebud, into a folder.
rosebud pull --directory <folder> [--force]pull downloads the game's text files and media into the folder, creating it if needed. It needs an active game connection, the game must be claimed, and the game owner's plan must include code download (Rosebud Pro or higher).
Options
| Option | Details |
|---|---|
--directory <folder> | The folder you publish and update from. |
--force | Take Rosebud's copy of every conflicted file, discarding your edits to it, and restore files missing locally. It never touches files changed or added only on your side. |
--state <file> | The game's state file. |
Example
rosebud pull --directory ./dist{
"project_id": "6f1d2c8e-...",
"content_version": "e4a09b12c6...",
"directory": "./dist",
"status": "conflicts",
"written": ["src/main.js"],
"removed": [],
"local_only": ["src/debug.js"],
"missing_locally": [],
"conflicts": [
{
"path": "src/player.js",
"reason": "both_changed",
"rosebud_copy": ".rosebud/project.remote/src/player.js"
}
],
"skipped": [],
"next_action": "Merge Rosebud's copy of src/player.js into yours, then run rosebud update ..."
}If your game has a build step, pull into a new, empty folder such as ./rosebud-files, copy the changes into your source and rebuild. Then release the build with --expected-version <content_version from the pull>.
| Field | Meaning |
|---|---|
written | Files Rosebud changed or added, now in the folder. |
removed | Files Rosebud deleted, now removed from the folder. |
local_only | Your own new or changed files. pull keeps them, and the next update uploads them. |
missing_locally | Files Rosebud and your last sync have but the folder lacks. The next update removes them from the game unless you restore them; --force restores them. |
conflicts | Files changed on both sides. Your copy stays; Rosebud's copy is saved under rosebud_copy. |
skipped | Names this disk can't keep, such as a Windows name ending in a dot or space or a device name like con.js (unsafe_path). The next update removes them from the game unless they're renamed in Rosebud first. |
status | synced, or conflicts while any remain. |
Conflicts
Merge each conflict into your own file, keeping both changes. Rosebud's copies go in a .remote folder beside the state file (.rosebud/project.remote/ for the default state), outside your build folder, so update never uploads them. pull empties it each time, so don't edit there.
reason | Meaning |
|---|---|
both_changed | You and Rosebud both changed the file. Merge both changes into yours. |
local_deleted | You deleted it and Rosebud changed it. Restore it from Rosebud's copy, or leave it deleted. |
remote_deleted | Rosebud deleted it and you changed it. There's no Rosebud copy: keep the file to restore it, or delete it. |
While conflicts remain, update refuses with pull_conflicts. Pull again until it reports none, or pass the version you merged against:
rosebud update --directory ./dist --expected-version <content_version from pull>Notes
- Without code download on the owner's plan,
pullfails withplan_required(exit 3).publishandupdatestill work: ask what changed in Rosebud before you update, so you don't replace those edits. Don't create a second game to get around it. sync_unavailable(exit 3) means this Rosebud server can't read files back yet, andunsupported_projectmeans it can't read this game's files back. Nothing was changed.- If a file changes while
pulldownloads, it stops withfolder_changed(exit 2) before touching the folder. A download that doesn't match its checksum fails withdownload_corrupt(exit 4) and changes nothing. Either way, run it again. - The last sync belongs to the folder it happened in. Pulling into another folder, or into an empty or missing one, writes all of Rosebud's files.
updatefrom a different folder than the last pull refuses withdirectory_mismatch. Pull into that folder first. .DS_Store,Thumbs.dbanddesktop.iniare skipped.pull'snext_actionnames other hidden files in the folder, such as.git, becauseupdaterefuses them.
Names that differ only by case or Unicode form
A name that differs from Rosebud's only by Unicode form (an accented letter stored as one character or two) is the same file on every system. One that differs only by letter case is the same file where the disk treats it so, by default on macOS and Windows. Either way your edits to it are kept.
pull never lets one name replace another:
- Rosebud's
foo.jsagainst yourFoo.jsis acase_conflict. - Two Rosebud names that would land on one file or folder here (
Foo.jsandfoo.js,Scripts/andscripts/) are each aname_collision, andpullwrites neither.
clashes_with names the other side, Rosebud's copies go to the .remote folder, and next_action says what to rename. --force settles a case_conflict only when Rosebud renamed a file you had synced by letter case: it takes Rosebud's name and version and discards your edits to the file. It never replaces a file of your own under another case, and never settles a name_collision: rename first.