# Filesystem Management
GnWManager supports interactions with a [LittleFS](https://github.com/littlefs-project/littlefs) partition on the Game & Watch's external SPI Flash.
In general, the external SPI flash layout is as follows:
If running multiple firmwares, typically:
1. Firmware 1 is the patched factory firmware.
2. Firmware 2 is retro-go
#### Format
Format a new filesystem partition.
```bash
gnwmanager format [OPTIONS]
```
Help string:
```bash
╭─ Options ─────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --size INT_PARSER Size of filesystem. Defaults to previous filesystem size. │
│ --offset INT_PARSER Distance in bytes from the END of the filesystem, to the END of flash. [default: 0] │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
```
If no `--size` is specified, and a previous filesystem existed, it will format to the old filesystem's size.
#### Shell
Enter an interactive unix-like shell. All commands in this tutorial are available in the interactive shell.
```bash
gnwmanager shell
```
For example:
```bash
$ gnwmanager shell
Interactive shell. Press Ctrl-D to exit.
gnw$ mkdir hello-world
gnw$ mkdir hello-world/foo/bar/baz
gnw$ tree
.
└── [ 0B DIR ] hello-world
└── [ 0B DIR ] foo
└── [ 0B DIR ] bar
```
Note: `*` wildcard for files/folders will **not** be expanded by gnwmanager's shell.
`*` wildcard expansion is handled by your computer's shell.
#### ls
List the contents of a directory
```bash
gnwmanager ls
```
Example:
```bash
$ gnwmanager ls hello-world
0B DIR foo
```
#### tree
List contents of device directory and its descendants.
Help string:
```bash
$ gnwmanager tree --help
Usage: gnwmanager tree [OPTIONS] [PATH]
List contents of device directory and its descendants.
╭─ Arguments ───────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ path [PATH] On-device folder path to list. Defaults to root [default: .] │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ─────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --depth INT_PARSER Maximum depth of the directory tree. [default: 2] │
│ --offset INT_PARSER Distance in bytes from the END of the filesystem, to the END of flash. [default: 0] │
│ --help -h Show this message and exit. │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
```
Example:
```bash
$ gnwmanager tree hello-world
hello-world
└── [ 0B DIR ] foo
└── [ 0B DIR ] bar
└── [ 0B DIR ] baz
```
#### mkdir
Creates a folder (and all necessary parenting folders) on-device.
```bash
gnwmanager mkdir my_directory_name
```
This is most equivalent to `mkdir -p my_new_dir` on Unix systems.
If the directory already exists, no action is performed.
#### mv
Moves/Renames a file/folder on-device. Not for transferring data to/from computer.
```bash
gnwmanager mv src dst
```
#### cp
Copies a file/folder on-device. Not for transferring data to/from computer.
```bash
gnwmanager cp src dst
```
#### push
Pushes file(s) and folder(s) to device.
```bash
gnwmanager push
```
Help string:
```bash
$ gnwmanager push --help
Usage: gnwmanager push [OPTIONS] GNW_PATH LOCAL_PATHS...
Push file(s) and folder(s) to device.
╭─ Arguments ───────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * gnw_path PATH Game-and-watch file or folder to write to. [required] │
│ * local_paths LOCAL_PATHS... Local file or folder to copy data from. [required] │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ─────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --offset INT_PARSER Distance in bytes from the END of the filesystem, to the END of flash. [default: 0] │
│ --help -h Show this message and exit. │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
```
Note that the destination `gnw_path` **is the first argument**.
Pushing files follows the same rules as the unix `cp -r` outlined below:
1. **Pushing a directory to another location without a target directory name specified:**
```bash
gnwmanager push /destination/ /source/directory
```
This will push the `/source/directory` to `/destination/directory`.
If `/destination/directory` does not already exist, it will be created.
If it does exist, the contents of `/source/directory` will be merged into the existing `/destination/directory`.
2. **Pushing a directory to another location with a target directory name specified:**
```bash
gnwmanager push /destination/newname /source/directory
```
This will copy /source/directory to /destination/newname.
If `/destination/newname` does not already exist, it will be created.
If it does exist and is a directory, the contents of `/source/directory` will be merged into the existing `/destination/newname`.
If `/destination/newname` exists and is a file, the command will fail.
3. **Copying only the contents of a directory:**
```bash
gnwmanager push /destination/ /source/directory/*
```
By using the `*` wildcard, you're selecting all items inside `/source/directory`.
These items will be copied directly into `/destination/`.
If `/destination/` has some of the same named items, they will be overwritten by the ones from `/source/directory`.
If `/destination/` does not exist, it (and any required parents) will be created.
#### pull
Pulls file(s) and folder(s) from device.
```bash
gnwmanager pull
```
Help string:
```bash
$ gnwmanager pull --help
Usage: gnwmanager pull [OPTIONS] GNW_PATH LOCAL_PATH
Pull a file or folder from device.
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * gnw_path PATH Game-and-watch file or folder to copy to computer. [required] │
│ * local_path PATH Local file or folder to copy data to. [required] │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --offset INT_PARSER Distance in bytes from the END of the filesystem, to the END of flash. [default: 0]│
│ --help -h Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
```
Note that the source `gnw_path` **is the first argument**.