diff options
| author | cashmere <cashmere@autistici.org> | 2026-09-04 09:05:24 +0200 |
|---|---|---|
| committer | cashmere <cashmere@autistici.org> | 2026-09-04 09:05:24 +0200 |
| commit | 4f49b16079b27d7ce633619e4cddfdf2bffbc952 (patch) | |
| tree | c296c1e7f3c3e2f6859c6d3a1b1b208779b89679 /www/glossary.md | |
| download | relic-master.tar.gz | |
Diffstat (limited to 'www/glossary.md')
| -rw-r--r-- | www/glossary.md | 466 |
1 files changed, 466 insertions, 0 deletions
diff --git a/www/glossary.md b/www/glossary.md new file mode 100644 index 0000000..8fff002 --- /dev/null +++ b/www/glossary.md @@ -0,0 +1,466 @@ +# Glossary + +There are several terms-of-art in Fossil that have specific meanings +which are either not immediately obvious to an outsider or which have +technical associations that can lead someone to either use the terms +incorrectly or to get the wrong idea from someone using those terms +correctly. We hope to teach users how to properly “speak Fossil” with +this glossary. + +The bullet-point lists following each definition are meant to be +clarifying and illustrative. They are not part of the definitions +themselves. + + +## <a id="project"></a>Project + +A collection of one or more computer files that serve some conceptually +unified purpose, which purpose changes and evolves over time, with the +history of that project being a valuable record. + +* We qualify the Fossil definition of this common word like this to + set aside cases where a zip file or tarball would suffice. If you + can pack your project up into such an archive once and be done with + it, Fossil is overkill. + + And yet that is often just the beginning, since there is often a + need for something to be changed, so now you have “version 2” of the + archive file. If you can foresee yourself creating versioned archive + files for your project, then you probably should be using Fossil for + it instead, then using Fossil’s [zip] or [tarball] command to + automatically produce archives of the latest version rather than + manually produce and track versions of the archive. The web version + of these commands ([`/zip`][zw] and [`/tarball`][tw]) are + particularly useful for public distribution of the latest version of + a project’s files. + +* Fossil was designed to host the SQLite software project, which is + comprised of source code, makefiles, scripts, documentation files, + and so forth. Fossil is also useful for many other purposes, such as + a fiction book project where each chapter is held in a separate file + and assembled into a finished whole deliverable. + +* We speak of projects being more than one file because even though + Fossil can be made to track the history of a single file, it is far + more often the case that when you get to something of a scale + sufficient to be called a “project,” there is more than one + version-tracked file involved, if not at the start, then certainly + by the end of the project. + + To take the example of a fiction book above, instead of putting each + chapter in a separate file, you could use a single AsciiDoc file for + the entire book project rather than make use of its [include + facility][AIF] to assemble it from chapter files, since that does at + least solve the [key problems][IFRS] inherent in version-tracking + something like Word’s DOCX format with Fossil instead. + + While Fossil will happily track the single file containing the prose + of your book project for you, you’re still likely to want separate + files for the cover artwork, a style sheet for use in converting the + source document to HTML, scripts to convert that intermediate output + to PDF and ePub in a reliably repeatable fashion, a `README` file + containing instructions to the printing house, and so forth. + +* Fossil requires that all the files for a project be collected into a + single directory hierarchy, owned by a single user with full rights + to modify those files. Fossil is not a good choice for managing a + project that has files scattered hither and yon all over the file + system, nor of collections of files with complicated ownership and + access rights. + + A project made of an operating system + installation’s configuration file set is not a good use of Fossil, + because you’ll have all of your OS’s *other* files intermixed. + Worse, Fossil doesn’t track OS permissions, so even if you were to + try to use Fossil as a system deployment tool by archiving versions + of the OS configuration files and then unpacking them on a new + system, the extracted project files would have read/write access by + the user who did the extraction, which probably isn’t what you were + wanting. + + Even with these problems aside, do you really want a `.fslckout` + SQLite database at the root of your filesystem? Are you prepared for + the consequences of saying `fossil clean --verily` on such a system? + You can constrain that with [the `ignore-glob` setting][IGS], but + are you prepared to write and maintain all the rules needed to keep + Fossil from blowing away the untracked portions of the file system? + We believe Fossil is a poor choice for a whole-system configuration + backup utility. + + As a counterexample, a project tracking your [Vim] configuration + history is a much better use of Fossil, because it’s all held within + `~/.vim`, and your user has full rights to that subdirectory. + +[AIF]: https://docs.asciidoctor.org/asciidoc/latest/directives/include/ +[IGS]: /help/ignore-glob +[IFRS]: ./image-format-vs-repo-size.md +[tarball]: /help/tarball +[tw]: /help/www/tarball +[Vim]: https://www.vim.org/ +[zip]: /help/zip +[zw]: /help/www/zip + + +## Repository <a id="repository" name="repo"></a> + +A single file that contains all historical versions of all files in a +project, which can be [cloned] to other machines and +[synchronized][sync] with them. Jargon: repo. + +* A Fossil repo is similar to an archive file in that it is a single + file that stores compressed versions of one or more files. Files can be + extracted from the repo, and new files can be added to the repo, + but a Fossil repo has other capabilities + above and beyond what simple archive formats can do. + +* Fossil does not care what you name your repository files, though + we do suggest “`.fossil`” as a standard extension. There is + only one place in Fossil where that convention is required, being the + [`fossil server DIRECTORY`][svrcmd] command, since it serves up + `*.fossil` files from `DIRECTORY`. If you don’t use that feature, + you can name your repo files anything you like. + +* Cloned and synced repos redundantly store all available information + about that project, so if any one repo is lost, all of the cloned + historical content of the project as of the last sync is preserved + in each surviving repo. + + Each user generally clones the project repository down to each + computer they use to participate in that project, and there is + usually at least one central host for the project as well, so there + is usually plenty of redundancy in any given Fossil-based project. + + That said, a Fossil repository clone is a backup only in a limited + sense, because some information can’t be cloned, some doesn’t sync + by default, and some data is neither clonable nor syncable. We cover + these limitations and the workarounds for them in a separate + document, [Backing Up a Remote Fossil Repository][backup]. + +* Rather than be a backup, a Fossil repository clone is a + communication method for coordinating work on the project among + multiple machines and users: local work done against one repository + is communicated up to its parent repository on the next sync, and + work done on other repositories that were previously synced up to + that parent get pulled down into the local repo clone. + + This bidirectional sync is automatic and on by default in Fossil. + You can [disable it][asdis], or you can [push] or [pull] + unidirectionally, if you wish. + + The Fossil philosophy is that all project information resides in + each clone of the repository. In the ideal world, this would occur + instantly and automatically, but in actual use, Fossil falls + somewhat short of that mark. Some limitations are simply + technological: a given clone may be temporarily out of communication + with its parent repository, network delays exist, and so forth. + Fossil is [an AP mode system][CAP]. (This is sometimes called + “eventual consistency.”) Other cases come down to administrative + necessity, as covered in [the backup doc][backup]. + +* Fossil doesn’t require that you have redundant clones. Whether you + do or not is a local decision based on usage needs, communication + requirements, desire for backups, and so forth. + +* Fossil doesn’t care where the repositories are stored, but we + recommend keeping them all in a single subdirectory such as + "`~/fossils`" or "`%USERPROFILE%\Fossils`". A flat set of files + suffices for simple purposes, but you may have use for something + more complicated. This author uses a scheme like the following on + mobile machines that shuttle between home and the office: + +``` pikchr toggle indent +box "~/museum/" fit +move right 0.1 +line right dotted +move right 0.05 +box invis "where one stores valuable fossils" ljust + +arrow down 50% from first box.s then right 50% +box "work/" fit +move right 0.1 +line dotted +move right 0.05 +box invis "projects from $DAYJOB" ljust + +arrow down 50% from 2nd vertex of previous arrow then right 50% +box "home/" fit +move right 0.1 +line dotted right until even with previous line.end +move right 0.05 +box invis "personal at-home projects" ljust + +arrow down 50% from 2nd vertex of previous arrow then right 50% +box "other/" fit +move right 0.1 +line dotted right until even with previous line.end +move right 0.05 +box invis "clones of Fossil itself, SQLite, etc." ljust +``` + +[asdis]: /help/autosync +[backup]: ./backup.md +[CAP]: ./cap-theorem.md +[cloned]: /help/clone +[pull]: /help/pull +[push]: /help/push +[svrcmd]: /help/server +[sync]: /help/sync + +[repository]: #repo +[repositories]: #repo + + +## Version / Revision / Hash / UUID <a id="version" name="hash"></a> + +These terms all mean the same thing: a long hexadecimal +[SHA hash value](./hashes.md) that uniquely identifies a particular +[check-in](#ci). + +We’ve listed the alternatives in decreasing preference order: + +* **Version** and **revision** are near-synonyms in common usage. + Fossil’s code and documentation use both interchangeably because + Fossil was created to manage the development of the SQLite project, + which formerly used [CVS], the Concurrent Versions System. CVS in + turn started out as a front-end to [RCS], the Revision Control + System, but even though CVS uses “version” in its name, it numbers + check-ins using a system derived from RCS’s scheme, which it calls + “Revisions” in user-facing output. Fossil inherits this confusion + honestly. + +* **Hash** refers to the [SHA1 or SHA3-256 hash](./hashes.md) of the + content of the checked-in data, uniquely identifying that version of + the managed files. It is a strictly correct synonym, used more often + in low-level contexts than the term “version.” + +* **UUID** is a deprecated term still found in many parts of the + Fossil internals and (decreasingly) its documentation. The problem + with using this as a synonym for a Fossil-managed version of the + managed files is that there are [standards][UUID] defining the + format of a “UUID,” none of which Fossil follows, not even the + [version 4][ruuid] (random) format, the type of UUID closest in + meaning and usage to a Fossil hash.(^A pre-Fossil 2.0 style SHA1 + hash is 160 bits, not the 128 bits many people expect for a proper + UUID, and even if you truncate it to 128 bits to create a “good + enough” version prefix, the 6 bits reserved in the UUID format for + the variant code cannot make a correct declaration except by a + random 1:64 chance. The SHA3-256 option allowed in Fossil 2.0 and + higher doesn’t help with this confusion, making a Fossil version + hash twice as large as a proper UUID. Alas, the term will never be + fully obliterated from use since there are columns in the Fossil + repository format that use the obsolete term; we cannot change this + without breaking backwards compatibility.) + +You will find all of these synonyms used in the Fossil documentation. +Some day we may settle on a single term, but it doesn’t seem likely. + +[CVS]: https://en.wikipedia.org/wiki/Concurrent_Versions_System +[hash]: #version +[RCS]: https://en.wikipedia.org/wiki/Revision_Control_System +[ruuid]: https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random) +[snfs]: https://en.wikipedia.org/wiki/Snapshot_(computer_storage)#File_systems +[UUID]: https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random) +[version]: #version + + +## Check-in <a id="check-in" name="ci"></a> + +A [version] of the project’s files that have been committed to the +[repository]; as such, it is sometimes called a “commit” instead. A +check-in is a snapshot of the project at an instant in time, as seen from +a single [check-out’s](#co) perspective. It is sometimes styled +“`CHECKIN`”, especially in command documentation where any +[valid check-in name][ciname] can be used. + +* There is a harmless conflation of terms here: any of the various + synonyms for [version] may be used where “check-in” is more accurate, + and vice versa, because there is a 1:1 relation between them. A + check-in *has* a version, but a version suffices to uniquely look up + a particular commit.[^snapshot] + +* Combining both sets of synonyms results in a list of terms that is + confusing to new Fossil users, but it’s easy + enough to internalize the concepts. [Committing][commit] creates a + *commit.* It may also be said to create a checked-in *version* of a + particular *revision* of the project’s files, thus creating an + immutable *snapshot* of the project’s state at the time of the + commit. Fossil users find each of these different words for the + same concept useful for expressive purposes among ourselves, but to + Fossil proper, they all mean the same thing. + +* Check-ins are immutable. + +* Check-ins exist only inside the repository. Contrast a + [check-out](#co). + +* Check-ins may have [one or more names][ciname], but only the + [hash] is globally unique, across all time; we call it the check-in’s + canonical name. The other names are either imprecise, contextual, or + change their meaning over time and across [repositories]. + +[^snapshot]: You may sometimes see the term “snapshot” used as a synonym + for a check-in or the version number identifying said check-in. We + must warn against this usage because there is a potential confusion + here: [the `stash` command][stash] uses the term “snapshot,” as does + [the `undo` system][undo] to make a distinction with check-ins. + Nevertheless, there is a conceptual overlap here between Fossil and + systems that do use the term “snapshot,” the primary distinction being + that Fossil will capture only changes to files you’ve [added][add] to + the [repository], not to everything in [the check-out directory](#co) + at the time of the snapshot. (Thus [the `extras` command][extras].) + Contrast a snapshot taken by a virtual machine system or a + [snapshotting file system][snfs], which captures changes to everything + on the managed storage volume. + +[add]: /help/add +[ciname]: ./checkin_names.wiki +[extras]: /help/extras +[stash]: /help/stash +[undo]: /help/undo + + + +## Check-out <a id="check-out" name="co"></a> + +A set of files extracted from a [repository] that represent a +particular [check-in](#ci) of the [project](#project). + +* Unlike a check-in, a check-out is mutable. It may start out as a + version of a particular check-in extracted from the repository, but + the user is then free to make modifications to the checked-out + files. Once those changes are formally [committed][commit], they + become a new immutable check-in, derived from its parent check-in. + +* You can switch from one check-in to another within a check-out + directory by passing those names to [the `fossil update` + command][update]. + +* Check-outs relate to repositories in a one-to-many fashion: it is + common to have a single repo clone on a machine but to have it + [open] in [multiple working directories][mwd]. Check-out directories + are associated with the repos they were created from by settings + stored in the check-out directory. This is in the `.fslckout` file on + POSIX type systems, but for historical compatibility reasons, it’s + called `_FOSSIL_` by native Windows builds of Fossil. + + (Contrast the Cygwin and WSL Fossil binaries, which use POSIX file + naming rules.) + +* In the same way that one cannot extract files from a zip archive + without having a copy of that zip file, one cannot make check-outs + without access to the repository file or a clone thereof. + +* Because a Fossil repository is an SQLite database file, the same + rules for avoiding data corruption apply to it. In particular, it is + [nearly a hard requirement][h2cflp] that the repository clone be on + the same machine as the one where you make check-outs and the + subsequent check-ins. + + That said, the relative locations of the repo and the check-out + within the local file system are arbitrary. The repository may be + located inside the folder holding the check-out, but it certainly + does not have to be, and it usually is not. As an example, [the + Fossil plugin for Visual Studio Code][fpvsc] defaults to storing the + repo clone within the project directory as a file called `.fsl`, but + this is because VSCode’s version control features assume it’s being + used with Git, where the repository is the `.git` subdirectory + contents. With Fossil, [different check-out workflows][cwork] are + preferred. + +[commit]: /help/commit +[cwork]: ./ckout-workflows.md +[h2cflp]: https://www.sqlite.org/howtocorrupt.html#_file_locking_problems +[fpvsc]: https://marketplace.visualstudio.com/items?itemName=koog1000.fossil +[open]: /help/open +[mwd]: ./ckout-workflows.md#mcw +[update]: /help/update + + +## <a id="docs"></a>Embedded Documentation + +Serving as an alternative to Fossil’s built-in [wiki], the [embedded +documentation feature][edoc] stores the same type of marked-up text +files, but under Fossil’s powerful version control features. + +* The simple rule for determining whether to use the wiki or embedded + docs for any given document is whether the content is considered + “evergreen,” as with a Wikipedia article. + + While Fossil’s wiki feature does store the history of each + document’s changes, Fossil always presents the current version of + the document unless you manually go out of your way to dig back into + the history. Then, having done so, links from that historical + version of the wiki document take you to the current versions of the + target documents, not to the version contemporaneous with the source + document. + + The consequence is that if you say something like… + + $ fossil up 2020-04-01 + $ fossil ui --page wcontent + + …you will **not** see the list of wiki articles as of April Fool’s Day in 2020, but + instead the list of *current* wiki article versions, the same as if you ran it + from a check-out of the tip-of-trunk. + + Contrast embedded docs, which are not only version-controlled as + normal files are in Fossil, they participate in all the tagging, + branching, and other versioning features. There are several + consequences of this, such as that Fossil’s [special check-in + names][ciname] work with embedded doc URLs: + + * <p>If you visit an embedded doc as `/doc/release/file.md` and + then click on a relative link from that document, you will remain on + the release branch. This lets you see not only the release + version of a software project but also the documentation as of + that release.</p> + + * <p>If you visit `/doc/2020-04-01/file.md`, you will not only + pull up the version of `file.md` as of that date, relative links + will take you to contemporaneous versions of those embedded docs + as well.</p> + + * <p>If you say `fossil up 2020-04-01 && fossil ui` and then visit + `/doc/ckout/file.md`, you’ll not only see the checked-out + version of the file as of that date, relative links will show + you other files within that checkout.</p> + +* Fossil’s wiki presents a flat list of articles, while embedded docs + are stored in the repository’s file hierarchy, a powerful + organizational tool well-suited to complicated documentation. + +* Your repository’s Home page is a good candidate for the wiki, as is + documentation meant for use only with the current version of the + repository’s contents. + +* If you are at all uncertain whether to use the wiki or the embedded + documentation feature, prefer the latter, since it is inherently + more powerful, and when you use the [`/fileedit` feature][fef], the + workflow is scarcely different from using the wiki. + + (This very file is embedded documentation: clone + [Fossil’s self-hosting repository][fshr] and you will find it as + `www/glossary.md`.) + +[edoc]: ./embeddeddoc.wiki +[fef]: ./fileedit-page.md +[fshr]: ./selfhost.wiki +[wiki]: ./wikitheory.wiki + + +## <a id="cap"></a>Capability + +Fossil includes a powerful [role-based access control system][rbac] +which affects which users have permission to do certain things within a given +[repository]. You can read more about this complex topic +[here](./caps/). + +Some people — and indeed certain parts of Fossil’s own code — use the +term “permissions” instead, but since [operating system file permissions +also play into this](./caps/#webonly), we prefer the term “capabilities” +(or “caps” for short) when talking about Fossil’s RBAC system to avoid a +confusion here. + +[rbac]: https://en.wikipedia.org/wiki/Role-based_access_control + +<div style="height:50em" id="this-space-intentionally-left-blank"></div> |
