OC-KittenOS/repository/docs/us-clawf

231 lines
5.4 KiB
Plaintext

As of KittenOS NEO r5, CLAW has been
rewritten to be lighter on memory
usage. This has caused a change in
the formats CLAW uses, and this
has made them non-trivial.
Note that this documentation should
not be considered the final format
CLAW will ever use.
There was a format before this, and
a format before that, and there may
be a format after this, and a format
further out into the future.
So all the CLAW formats over time
will be described here.
-- CLAW "local.lua" Lua format
A CLAW "local.lua" file, like the
"-claw.lua" files used in the 'claw'
directory of the OC-KittenOS Git
repository, is a full index of what
the other formats are meant to
represent.
It is a serialized Lua table, with
the keys being package IDs,
and the values being tables of the
form as follows:
desc = A description
v = The version number
deps = ipairsable table, list of
packages required for installation
dirs = ipairsable table, list of
the dirs, no pre/post '/'.
files = ipairsable table, list of
the files, no prefixed '/'.
All mentioned directories must be
in dirs.
-- CLAWr2 "local.lua" binary format
The first attempt at saving memory
lead to local.lua being stored in
memory in a binary format.
This did lead to a reduction in use,
but I found it insufficient.
The following two notes are from
testing KittenOS NEO r4.
Even a slightly loaded system with a
simple background service could run
out of memory on the package screen.
Indeed, even a baseline "just claw
and allmem" reading failed for tests
due to the launcher refusing to work
with CLAW loaded.
The format is slightly weird, since
it being on disk resulted from a bug
in what was meant to be only an
*in-memory* compression scheme.
Firstly, I should define a length-
byte-prefixed-string.
It's a byte, followed by that many
bytes for the contents.
Secondly, I should define a length-
byte-prefixed list.
It's a byte, followed by that many
length-prefixed-strings.
It is a list of entries made up of
the following form:
LPStr packageId
LPStr desc
u16be v
LPList dirs
LPList files
LPList deps
The idea here is simply that the Lua
table format is extremely memory-
inefficient, prioritizing speed, so
by packing stuff into a string, it
can save some memory.
However, more code was needed to
encode and decode this format, so
the savings weren't great.
-- CLAWr5 (C2) ".c2x"/".c2p"/".c2l"
This is the current format, and is
hopefully the last format that will
be needed.
The solution was to rewrite CLAW, to
make the GUI stay a GUI and separate
the logic up via separate file
formats entirely.
All 3 of these formats are line-based
formats that use "\n" to split their
entries, and they are rather strict
about this.
All 3 kinds of files are found in the
data/app-claw/ directory, and their
names matter.
--- C2L
".c2l" is the simplest format, simply
being a file listing of the app-claw
directory. It is only used for a
remote repository, where it is
called "local.c2l".
--- C2P
".c2p" is the second simplest.
It is the raw text, unlinewrapped, of
the package description panel.
The name given to it is important:
"PACKAGE.VERSION.c2p"
Thus, the app-claw that currently
exists has a c2p file with name:
"app-claw.5.c2p"
This is only used by the app-claw UI,
for version numbers, descriptions,
and to show the entries in the first
place. Since none of these matter to
the installation/removal process,
they are ignored completely by the
installer/remover.
--- C2X
The app-claw UI runs a separate
program to perform actions based on
the .c2p files it finds and what the
user chooses to do.
These actions summarize to 4 kinds of
possible action between any readable
source (for installations) and a
local filesystem for a given package
ID:
1. Install with dependencies
2. Install without dependencies
3. Remove checking for dep. errors
4. Remove regardless of dep. errors
C2X files use the name "PACKAGE.c2x",
and following the example previously
the app-claw file is "app-claw.c2x".
C2X files solely serve the role of
dependency, install, and removal
instructions, and thus do not have
any user-friendly information such
as a description.
The first character of each line in
the file describes what the line
does.
'+' means the remainder is a filename
to be installed/removed.
CLAW will fail to overwrite a file
that already exists.
Upgrades are handled by an unchecked
package removal prior to install.
'/' means the remainder's a directory
to be added on installation.
'?' means the remainder's a package
that this package requires.
Note that the C2P and C2X files are
NOT automatically installed/removed,
the C2X file must specify them
explicitly. Otherwise, a package may
enter some errant states:
1. Not installed according to UI, but
installed for dependency purposes,
and could be theoretically removed
(no C2P, but a C2X)
2. Installed according to UI, but
cannot be removed, cannot be
reinstalled, and does not count
for dependency purposes
(no C2X, but a C2P)
3. Completely uninstalled according
to both UI and dependencies, and
cannot be removed or reinstalled
(no C2P or C2X)
C2X files are entirely responsible
for the management of packages, and
a basic CLAW client could be made
with only support for C2L and C2X,
C2P files being handled as part of
C2X handling but having no inherent
meaning of their own.
This client would not have versioning
information or other such things,
but it would work.