Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Converted all uses of the [https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-name | obsolete] named anchor feature from HTML before 4.0 to use fragment identifiers instead. (<tt>www/*</tt> subtree only.) Where possible, changed constructs like <verbatim><a name="foo"></a><h3></verbatim> to <verbatim><h3 id="foo"></verbatim> Also fixed a few cases where the link target came after a header so the browser would scroll the header off the screen when visiting the targeted section. Added a 50em pad at the bottom of one such edited doc to allow the intra-doc link targets to be useful since it's a short enough doc that on sufficiently tall browser windows, scrolling isn't possible, so using those anchors has no visible effect. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
93cee1f56e581b5c5257d8b90d529892 |
| User & Date: | wyoung 2021-09-17 02:02:44.048 |
| Original Comment: | Converted all uses of the [https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-name | obsolete] named anchor feature from HTML before 4.0 to use fragment identifiers instead. Where possible, changed constructs like <nowiki><a name="foo"></a><h3></nowiki> to <nowiki><h3 id="foo"></nowiki>. Also fixed a few cases where the link target came after a header so the browser would scroll the header off the screen when visiting the targeted section. Motivation: Recent versions of Firefox and Chrome appear to have finally given up on supporting this old intra-document linking style. Even should these browser regressions be fixed, this is still an objective improvement, both from a style and functionality improvement. |
Context
|
2021-09-17
| ||
| 02:32 | Updated the JS doc's section about the hamburger menu to reflect the recent addition of this menu to other stock skins. ... (check-in: 36d84427f6 user: wyoung tags: trunk) | |
| 02:02 | Converted all uses of the [https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-name | obsolete] named anchor feature from HTML before 4.0 to use fragment identifiers instead. (<tt>www/*</tt> subtree only.) Where possible, changed constructs like <verbatim><a name="foo"></a><h3></verbatim> to <verbatim><h3 id="foo"></verbatim> Also fixed a few cases where the link target came after a header so the browser would scroll the header off the screen when visiting the targeted section. Added a 50em pad at the bottom of one such edited doc to allow the intra-doc link targets to be useful since it's a short enough doc that on sufficiently tall browser windows, scrolling isn't possible, so using those anchors has no visible effect. ... (check-in: 93cee1f56e user: wyoung tags: trunk) | |
| 00:34 | Remove obsolete diagram source files that have now been replaced by Pikchr. The files are still accessible in older versions, of course, and can be easily resurrected if needed. But there is no reason to include them in modern source tarballs. ... (check-in: dbf94ab50c user: drh tags: trunk) | |
Changes
Changes to www/aboutcgi.wiki.
| ︙ | ︙ | |||
182 183 184 185 186 187 188 |
at "/home/www/resps/subdir.fossil" but there is no such repository.
So then it looks at "/home/www/repos/subdir/three.fossil" and finds
a repository. The PATH_INFO is shortened by removing
"subdir/three/" leaving it at just "timeline".
<li> Fossil looks at the rest of PATH_INFO to see that the webpage
requested is "timeline".
</ol>
| | | 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
at "/home/www/resps/subdir.fossil" but there is no such repository.
So then it looks at "/home/www/repos/subdir/three.fossil" and finds
a repository. The PATH_INFO is shortened by removing
"subdir/three/" leaving it at just "timeline".
<li> Fossil looks at the rest of PATH_INFO to see that the webpage
requested is "timeline".
</ol>
<a id="cgivar"></a>
The web server sets many environment variables in step 2 in addition
to just PATH_INFO. The following diagram shows a few of these variables
and their relationship to the request URL:
<pre>
REQUEST_URI
______________|___________________
/ \
|
| ︙ | ︙ |
Changes to www/adding_code.wiki.
| ︙ | ︙ | |||
100 101 102 103 104 105 106 | the makefiles, you should be able to recompile Fossil and have it include your new source file, even before you source file contains any code. It is recommended that you try this. Be sure to [/help/add|fossil add] your new source file to the self-hosting Fossil repository and then [/help/commit|commit] your changes! | < | | 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
the makefiles, you should be able to recompile Fossil and have it include
your new source file, even before you source file contains any code.
It is recommended that you try this.
Be sure to [/help/add|fossil add] your new source file to the self-hosting
Fossil repository and then [/help/commit|commit] your changes!
<h2 id="newcmd">4.0 Creating A New Command</h2>
By "commands" we mean the keywords that follow "fossil" when invoking
Fossil from the command-line. So, for example, in
<b>fossil diff xyzzy.c</b>
The "command" is "diff". Commands may optionally be followed by
|
| ︙ | ︙ | |||
166 167 168 169 170 171 172 | Fossil for parsing command-line options and for opening and accessing and manipulating the repository and the working check-out. Study implementations of existing commands to get an idea of how things are done. You can easily find the implementations of existing commands by searching for "COMMAND: <i>name</i>" in the files of the "src/" directory. | < | | 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | Fossil for parsing command-line options and for opening and accessing and manipulating the repository and the working check-out. Study implementations of existing commands to get an idea of how things are done. You can easily find the implementations of existing commands by searching for "COMMAND: <i>name</i>" in the files of the "src/" directory. <h2 id="newpage">5.0 Creating A New Web Page</h2> As with commands, new webpages can be added simply by inserting a function that generates the webpage together with a special header comment. A template follows: <blockquote><verbatim> /* |
| ︙ | ︙ |
Changes to www/caps/admin-v-setup.md.
1 2 3 4 5 6 7 8 9 10 11 | # Differences Between Setup and Admin Users This document explains the distinction between [Setup users][caps] and [Admin users][capa]. For other information about use types, see: * [Administering User Capabilities](./) * [How Moderation Works](../forum.wiki#moderation) * [Users vs Subscribers](../alerts.md#uvs) * [Defense Against Spiders](../antibot.wiki) | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # Differences Between Setup and Admin Users This document explains the distinction between [Setup users][caps] and [Admin users][capa]. For other information about use types, see: * [Administering User Capabilities](./) * [How Moderation Works](../forum.wiki#moderation) * [Users vs Subscribers](../alerts.md#uvs) * [Defense Against Spiders](../antibot.wiki) ## <a id="philosophy"></a>Philosophical Core The Setup user "owns" the Fossil repository and may delegate a subset of that power to one or more Admin users. The Setup user can grant Admin capability and take it away, but Admin users cannot grant themselves Setup capability, either directly via the Admin → Users UI page or via any indirect means. (If you discover |
| ︙ | ︙ | |||
55 56 57 58 59 60 61 | We’ll explore these distinctions in the rest of this document. [bc]: ../blockchain.md [ucap]: ./index.md#ucap [uv]: ../unvers.wiki | | | 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | We’ll explore these distinctions in the rest of this document. [bc]: ../blockchain.md [ucap]: ./index.md#ucap [uv]: ../unvers.wiki ## <a id="binary"></a>No Granularity Fossil doesn’t make any distinction between these two user types beyond this binary choice: Setup or Admin. A few features of Fossil are broken down so that only part of the feature is accessible to Admin, with the rest left only to Setup users, but for the most part each feature affected by this distinction is |
| ︙ | ︙ | |||
89 90 91 92 93 94 95 | the Admin user is allowed to do, and which must be left to Setup? Do we assign a separate capability letter to each step in `/setup_skin`? Do we assign one more each to the five sections of a skin? (Header, Footer, CSS, JavaScript, and Details.) It quickly becomes unmanageable. | | | | 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | the Admin user is allowed to do, and which must be left to Setup? Do we assign a separate capability letter to each step in `/setup_skin`? Do we assign one more each to the five sections of a skin? (Header, Footer, CSS, JavaScript, and Details.) It quickly becomes unmanageable. ## <a id="capgroups"></a>Capability Groups We can break up the set of powers the Admin user capability grants into several groups, then defend each group as a coherent whole. ### <a id="security"></a>Security While establishing the Fossil repository's security policy is a task for the Setup user, *maintaining* that policy is something that Fossil allows a Setup user to delegate to trustworthy users via the Admin user capability: * **Manage users**: The only thing an Admin-only user cannot do on the |
| ︙ | ︙ | |||
132 133 134 135 136 137 138 | Some security-conscious people might be bothered by the fact that Admin-only users have these abilities. Think of a large IT organization: if the CIO hires a [tiger team][tt] to test the company's internal IT defenses, the line grunts fix the reported problems, not the CIO. | | | 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | Some security-conscious people might be bothered by the fact that Admin-only users have these abilities. Think of a large IT organization: if the CIO hires a [tiger team][tt] to test the company's internal IT defenses, the line grunts fix the reported problems, not the CIO. ### <a id="administrivia"></a>Administrivia It is perfectly fine for a Fossil repository to only have Setup users, no Admin users. The smaller the repository, the more likely the repository has no Admin-only users. If the Setup user neither needs nor wants to grant Admin power to others, there is no requirement in Fossil to do so. [Setup capability is a pure superset of Admin capability.][sia] |
| ︙ | ︙ | |||
202 203 204 205 206 207 208 | * **Configure search** [ale]: ../alerts.md [shun]: ../shunning.wiki | | | 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 | * **Configure search** [ale]: ../alerts.md [shun]: ../shunning.wiki ### <a id="cosmetics"></a>Cosmetics While the Setup user is responsible for setting up the initial "look" of a Fossil repository, the Setup user entrusts Admin users with *maintaining* that look. An Admin-only user therefore has the following special abilities: * Modify the repository skin |
| ︙ | ︙ | |||
225 226 227 228 229 230 231 | These capabilities allow an Admin-only user to affect the branding and possibly even the back-end finances of a project. This is why we began this document with a philosophical discussion: if you cannot entrust a user with these powers, you should not grant that user Admin capability. | | | | 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 | These capabilities allow an Admin-only user to affect the branding and possibly even the back-end finances of a project. This is why we began this document with a philosophical discussion: if you cannot entrust a user with these powers, you should not grant that user Admin capability. ## <a id="clones"></a>Clones and Backups Fossil is a *distributed* version control system, which has direct effects on the “Setup user” concept in the face of clones. When you clone a repository, your local user becomes a Setup user on the local clone even if you are not one on the remote repository. This may be surprising to you, but it should also be sensible once you realize that your operating system will generally give you full control over the local repository file. What use trying to apply remote restrictions on the local file, then? The distinctions above therefore are intransitive: they apply only within a single repository instance. Fossil behaves differently when you do a clone as a user with Setup capability on the remote repository, which primarily has effects on the fidelity of clone-as-backup, which we cover [elsewhere](../backup.md). We strongly encourage you to read that document if you expect to use a clone as a complete replacement for the remote repository. ## <a id="apsu"></a>The All-Powerful Setup User Setup users get [every user capability](./ref.html) of Fossil except for [two exceptionally dangerous capabilities](#dcap), which they can later grant to themselves or to others. In addition, Setup users can use every feature of the Fossil UI. If Fossil can do a thing, a Setup user on that repo can make Fossil do it. |
| ︙ | ︙ | |||
382 383 384 385 386 387 388 | through that UI instance, regardless of the capability set defined in the repo’s user table. This is true even if you cloned a remote repo where you do not have Setup caps. This is why `ui` always binds to `localhost` without needing the `--localhost` flag: in this mode, anyone who can connect to that repo’s web UI has full power over that repo. | | | | | 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 | through that UI instance, regardless of the capability set defined in the repo’s user table. This is true even if you cloned a remote repo where you do not have Setup caps. This is why `ui` always binds to `localhost` without needing the `--localhost` flag: in this mode, anyone who can connect to that repo’s web UI has full power over that repo. ## <a id="dcap"></a>Dangerous Capabilities Initially Denied to Everyone There are two capabilities that Fossil doesn’t grant by default to Setup or Admin users automatically. They are exceptionally dangerous, so Fossil makes these users grant themselves (or others) these capabilities deliberately, hopefully after careful consideration. ### <a id="y"></a>Write Unversioned Fossil currently doesn’t distinguish the sub-operations of [`fossil uv`](/help?cmd=uv); they’re all covered by [**WrUnver**][capy] (“y”) capability. Since some of these operations are unconditionally destructive due to the nature of unversioned content, and since this goes against Fossil’s philosophy of immutable history, nobody gets cap “y” on a Fossil repo by default, not even the Setup or Admin users. A Setup or Admin user must grant cap “y” to someone — not necessarily themselves! — before modifications to remote unversioned content are possible. Operations on unversioned content made without this capability affect your local clone only. In this way, your local unversioned file table can have different content from that in its parent repo. This state of affairs will continue until your user either gets cap “y” and syncs that content with its parent or you say `fossil uv revert` to make your local unversioned content table match that of its parent repo. ### <a id="x"></a>Private Branch Push For private branches to remain private, they must never be accidentally pushed to a public repository. It can be [difficult to impossible][shun] to recover from such a mistake, so nobody gets [**Private**][capx] (“x”) capability on a Fossil repo by default, not even Admin or Setup users. There are two common uses for private branches. |
| ︙ | ︙ |
Changes to www/caps/impl.md.
1 2 | # Implementation Details of User Capabilities | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # Implementation Details of User Capabilities ## <a id="choices"></a>Capability Letter Choices We [assigned][ref] user capability characters using only lowercase ASCII letters at first, so those are the most important within Fossil: they control the functions most core to Fossil’s operation. Once we used up most of the lowercase letters, we started using uppercase, and then during the development of the [forum feature][for] we assigned most of the decimal numerals. All of the lowercase ASCII letters are now assigned. Eventually, we might have to start using ASCII punctuation and symbols. We expect to run out of reasons to define new caps before we’re forced to switch to Unicode, though the possibilities for [mnemonic][mn] assignments with emoji are intriguing. <span style="vertical-align: bottom">😉</span> The existing caps are usually mnemonic, especially among the earliest and therefore most central assignments, made when we still had lots of letters to choose from. There is still hope for good future mnemonic assignments among the uppercase letters, which are mostly still unused. ## <a id="bitfield"></a>Why Not Bitfields? Some may question the use of ASCII character strings for [capability sets][ucap] instead of bitfields, which are more efficient, both in terms of storage and processing time. Fossil handles these character strings in one of two ways. For most HTTP hits, Fossil [expands][sexp] the string into a [`struct` full of |
| ︙ | ︙ | |||
41 42 43 44 45 46 47 | network connection, followed by the required I/O to satisfy the request. Either method is plenty fast in that context. In exchange for this immeasurable cost per hit, we get human-readable capability sets. | | | 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
network connection, followed by the required I/O to satisfy the request.
Either method is plenty fast in that context.
In exchange for this immeasurable cost per hit, we get human-readable
capability sets.
## <a id="filter"></a>Why Doesn’t Fossil Filter “Bad” Artifacts on Sync?
Fossil is more trusting about the content it receives from a remote
clone during sync than you might expect. Common manifestations of this
design choice are:
1. A user may be able to impersonate other users. This can be
[accidental](./index.md#defuser) as well as purposeful.
|
| ︙ | ︙ |
Changes to www/caps/index.md.
| ︙ | ︙ | |||
18 19 20 21 22 23 24 | [an]: https://en.wikipedia.org/wiki/Alphanumeric [avs]: ./admin-v-setup.md [lg]: ./login-groups.md [rbac]: https://en.wikipedia.org/wiki/Role-based_access_control | | | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | [an]: https://en.wikipedia.org/wiki/Alphanumeric [avs]: ./admin-v-setup.md [lg]: ./login-groups.md [rbac]: https://en.wikipedia.org/wiki/Role-based_access_control ## <a id="ucat"></a>User Categories Before we explain individual user capabilities and their proper administration, we want to talk about an oft-overlooked and misunderstood feature of Fossil: user categories. Fossil defines four user categories. Two of these apply based on the user’s login status: **nobody** and **anonymous**. The other two act |
| ︙ | ︙ | |||
80 81 82 83 84 85 86 | treat the same category as if it were called “member.” There is currently no way to define custom user categories. [svr]: ../server/ | | | 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | treat the same category as if it were called “member.” There is currently no way to define custom user categories. [svr]: ../server/ ## <a id="ucap"></a>Individual User Capabilities When one or more users need to be different from the basic capabilities defined in user categories, you can assign caps to individual users. You may want to have the [cap reference][ref] open when doing such work. It is useful at this time to expand on the logical expression [above](#cat), which covered only the four fixed user categories. |
| ︙ | ︙ | |||
116 117 118 119 120 121 122 | subscribers, which is why we show it in square brackets. (See [Users vs Subscribers](../alerts.md#uvs).) [apsu]: ./admin-v-setup.md#apsu [avsp]: ./admin-v-setup.md#philosophy | | | 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | subscribers, which is why we show it in square brackets. (See [Users vs Subscribers](../alerts.md#uvs).) [apsu]: ./admin-v-setup.md#apsu [avsp]: ./admin-v-setup.md#philosophy ## <a id="new"></a>New Repository Defaults Fossil creates one user account in new repos, which is named after your OS user name [by default](#defuser). Fossil gives the initial repository user the [all-powerful Setup capability][apsu]. |
| ︙ | ︙ | |||
155 156 157 158 159 160 161 | Those in the “developer” category get the “nobody” and “anonymous” cap sets plus **[e][e][i][i]**: view sensitive user material and check in changes. [bot]: ../antibot.wiki | | | | 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | Those in the “developer” category get the “nobody” and “anonymous” cap sets plus **[e][e][i][i]**: view sensitive user material and check in changes. [bot]: ../antibot.wiki ## <a id="pvt"></a>Consequences of Taking a Repository Private When you click Admin → Security-Audit → “Take it private,” one of the things it does is set the user capabilities for the “nobody” and “anonymous” user categories to blank, so that users who haven’t logged in can’t even see your project’s home page, and the option to log in as “anonymous” isn’t even offered. Until you log in with a user name, all you see is the repository’s skin and those few UI elements that work without any user capability checks at all, such as the “Login” link. Beware: Fossil does not reassign the capabilities these users had to other users or to the “reader” or “developer” user category! All users except those with Setup capability will lose all capabilities they inherited from “nobody” and “anonymous” categories. Setup is the [lone exception][apsu]. If you will have non-Setup users in your private repo, you should parcel out some subset of the capability set the “nobody” and “anonymous” categories had to other categories or to individual users first. ## <a id="read-v-clone"></a>Reading vs. Cloning Fossil has two capabilities that are often confused: [**Read**](./ref.html#o) and [**Clone**](./ref.html#g). The **Read** capability has nothing to do with reading data from a local repository, because [caps affect Fossil’s web interfaces only](#webonly). Once you’ve cloned a remote repository to your local |
| ︙ | ︙ | |||
204 205 206 207 208 209 210 | on private or semi-private repos to prevent them from pulling individual elements of the repo over the web one at a time, as someone may do when denied the bulk **Clone** capability. [edoc]: ../embeddeddoc.wiki | | | 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 | on private or semi-private repos to prevent them from pulling individual elements of the repo over the web one at a time, as someone may do when denied the bulk **Clone** capability. [edoc]: ../embeddeddoc.wiki ## <a id="defuser"></a>Default User Name By default, Fossil assumes your OS user account name is the same as the one you use in any Fossil repository. It is the [default for a new repository](#new), though you can override this with [the `--admin-user` option][auo]. Fossil has other ways of overriding this in other contexts such as the `name@` syntax in clone URLs. |
| ︙ | ︙ | |||
232 233 234 235 236 237 238 | [auo]: /help?name=new [fos]: ./impl.md#filter [shun]: ../shunning.wiki | | | | 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 | [auo]: /help?name=new [fos]: ./impl.md#filter [shun]: ../shunning.wiki ## <a id="utclone"></a>Cloning the User Table When cloning over HTTP, the initial user table in the local clone is set to its “[new state:](#new)” only one user with Setup capability, named after either your OS user account, per the default above, or after the user given in the clone URL. There is one exception: if you clone as a named Setup user, you get a complete copy of the user information. This restriction keeps the user table private except for the only user allowed to make absolutely complete clones of a remote repo, such as for failover or backup purposes. Every other user’s clone is missing this and a few other items, either for information security or PII privacy reasons. When cloning with file system paths, `file://` URLs, or over SSH, you get a complete clone, including the parent repo’s complete user table. All of the above applies to [login groups][lg] as well. ## <a id="webonly"></a>Caps Affect Web Interfaces Only Fossil’s user capability system only affects accesses over `http[s]://` URLs. This includes clone, sync/push/pull, the [UI pages][wp], and [the JSON API][japi]. For everything else, the user caps aren’t consulted at all. The only checks made when working directly with a local repository are |
| ︙ | ︙ | |||
317 318 319 320 321 322 323 | Checks for capabilities like [**Read**][o] and [**Write**][i] within the HTTP conversation between two Fossil instances only have a useful effect when done over an `http[s]://` URL. [sxycap]: /file?ci=ec5efceb8aac6cb4&name=src/main.c&ln=2748-2752 | | | | 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 | Checks for capabilities like [**Read**][o] and [**Write**][i] within the HTTP conversation between two Fossil instances only have a useful effect when done over an `http[s]://` URL. [sxycap]: /file?ci=ec5efceb8aac6cb4&name=src/main.c&ln=2748-2752 ## <a id="pubpg"></a>Public Pages In Admin → Access, there is an option for giving a list of [globs][glob] to name URLs which get treated as if the visitor had [the default cap set](#defcap). For example, you could take the [**Read**][o] capability away from the “nobody” user category, who has it by default, to prevent users without logins from pulling down your repository contents one artifact at a time, yet give those users the ability to read the project documentation by setting the glob to match your [embedded documentation][edoc]’s URL root. ## <a id="defcap"></a>Default User Capability Set In Admin → Access, you can define a default user capability set, which is used as: 1. the default caps for users newly created by an Admin or Setup user 2. the default caps for self-registered users, an option in that same UI 3. the effective caps for URIs considered [public pages](#pubpg) |
| ︙ | ︙ |
Changes to www/changes.wiki.
1 2 | <title>Change Log</title> | < | | 1 2 3 4 5 6 7 8 9 10 |
<title>Change Log</title>
<h2 id='v2_17'>Changes for version 2.17 (pending)</h2>
* Added new options to the various
[/help?cmd=diff|diff commands]: --by, -b, --webpage, --json, --tcl.
* Performance and display improvements to the internal diff engine, including
partial-line matching for unified diffs and improved partial line matching for
side-by-side diffs.
* The --branchcolor option on [/help?cmd=commit|fossil commit] and
[/help?cmd=amend|fossil amend] can now take the value "auto" to
|
| ︙ | ︙ | |||
30 31 32 33 34 35 36 |
* The [/mdrules|Markdown formatter] now interprets the content of
block HTML markup (such as <table>) in most cases. Only content
of <pre> and <script> is passed through verbatim.
* The [/help?cmd=wiki|wiki list command] no longer lists "deleted"
pages by default. Use the new <tt>--all</tt> option to include deleted
pages in the output.
| < | | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
* The [/mdrules|Markdown formatter] now interprets the content of
block HTML markup (such as <table>) in most cases. Only content
of <pre> and <script> is passed through verbatim.
* The [/help?cmd=wiki|wiki list command] no longer lists "deleted"
pages by default. Use the new <tt>--all</tt> option to include deleted
pages in the output.
<h2 id='v2_16'>Changes for Version 2.16 (2021-07-02)</h2>
* <b>Security:</b> Fix the client-side TLS so that it verifies that the
server hostname matches its certificate.
* The default "ssh" command on Windows is changed to "ssh" instead of the
legacy "plink", as ssh is now generally available on Windows systems.
Installations that still need to use the legacy "plink" can make that
happen by running: '<tt>fossil set ssh-command "plink -ssh" --global</tt>'.
* Added the [./patchcmd.md|fossil patch] command.
|
| ︙ | ︙ | |||
77 78 79 80 81 82 83 |
abandoned email accounts forever.
* SQL that defines [/tktsetup_tab|database objects for tickets] now
[/timeline?c=c717f1ef9a1a4c91|can DROP] a VIEW or an INDEX provided
that its name starts with '<code>ticket</code>' or '<code>fx_</code>'.
* Update the built-in SQLite to version 3.36.0.
* Numerous other minor enhancements.
| < | | 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
abandoned email accounts forever.
* SQL that defines [/tktsetup_tab|database objects for tickets] now
[/timeline?c=c717f1ef9a1a4c91|can DROP] a VIEW or an INDEX provided
that its name starts with '<code>ticket</code>' or '<code>fx_</code>'.
* Update the built-in SQLite to version 3.36.0.
* Numerous other minor enhancements.
<h2 id='v2_15'>Changes for Version 2.15 (2021-03-26) and Patch 2.15.1 on (2021-04-07)
and 2.15.2 on (2021-06-15)</h2>
* <b>Patch 2.15.2:</b> Fix the client-side TLS so that it verifies that the
server hostname matches its certificate. <b>Upgrading to
the patch is recommended.</b>
* <b>Patch 2.15.1:</b> Fix a data exfiltration bug in the server. <b>Upgrading to
the patch is recommended.</b>
* The [./defcsp.md|default CSP] has been relaxed slightly to allow
|
| ︙ | ︙ | |||
162 163 164 165 166 167 168 |
is recent enough.
* Webpage that shows [/help?cmd=/whistory|history of a wiki page]
gained client-side UI to help with comparison between two arbitrary
versions of a wiki (by the means of anchoring a "baseline" version)
and the ability to squeeze several sequential edits made by the same
user into a single "recycled" row (the latest edit in that sequence).
| < | | 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
is recent enough.
* Webpage that shows [/help?cmd=/whistory|history of a wiki page]
gained client-side UI to help with comparison between two arbitrary
versions of a wiki (by the means of anchoring a "baseline" version)
and the ability to squeeze several sequential edits made by the same
user into a single "recycled" row (the latest edit in that sequence).
<h2 id='v2_14'>Changes for Version 2.14 (2021-01-20) and Patch 2.14.1 on (2021-04-07)
and 2.14.2 on (2021-06-15)</h2>
* <b>Patch 2.14.2:</b> Fix the client-side TLS so that it verifies that the
server hostname matches its certificate. <b>Upgrading to
the patch is recommended.</b><
* <b>Patch 2.14.1:</b> Fix a data exfiltration bug in the server.
<b>Upgrading to the patch is recommended.</b>
* <b>Schema Update Notice #1:</b>
|
| ︙ | ︙ | |||
229 230 231 232 233 234 235 |
for custom ticket configurations.
* The built-in SQLite is updated to version 3.35.0 alpha containing
performance optimizations, especially performance associated with
startup, and minor improvements to the CLI.
* Performance optimizations to Fossil itself.
* Countless improvements and enhancements to the documentation
| < | | 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |
for custom ticket configurations.
* The built-in SQLite is updated to version 3.35.0 alpha containing
performance optimizations, especially performance associated with
startup, and minor improvements to the CLI.
* Performance optimizations to Fossil itself.
* Countless improvements and enhancements to the documentation
<h2 id='v2_13'>Changes for Version 2.13 (2020-11-01)</h2>
* Added support for [./interwiki.md|interwiki links].
* Enable <del> and <ins> markup in wiki.
* Improvements to the Forum threading display.
* Added support for embedding [./pikchr.md|pikchr]
markup in markdown and fossil-wiki content.
* The new "[/help?cmd=pikchr|pikchr]" command can render
|
| ︙ | ︙ | |||
260 261 262 263 264 265 266 |
* The built-in SQLite is updated to an alpha of version 3.34.0, and
the minimum SQLite version is increased to 3.34.0 because the
/finfo change in the previous bullet depends on enhancements to
recursive common table expressions that are only available in
SQLite 3.34.0 and later.
* Countless other minor refinements and documentation improvements.
| < | | 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 |
* The built-in SQLite is updated to an alpha of version 3.34.0, and
the minimum SQLite version is increased to 3.34.0 because the
/finfo change in the previous bullet depends on enhancements to
recursive common table expressions that are only available in
SQLite 3.34.0 and later.
* Countless other minor refinements and documentation improvements.
<h2 id='v2_12'>Changes for Version 2.12.1 (2020-08-20)</h2>
* (2.12.1): Fix client-side vulnerabilities discovered by Max Justicz.
* Security fix in the "[/help?cmd=git|fossil git export]" command.
The same fix is also backported to version 2.10.1 and 2.11.1.
New "safety-net" features were added to prevent similar problems
in the future.
* Enhancements to the graph display for cases when there are
|
| ︙ | ︙ | |||
343 344 345 346 347 348 349 |
no longer saved via the UI (the [/help?cmd=wiki|wiki CLI command]
can, though).
* The [/help?cmd=allow-symlinks|allow-symlinks setting] no longer
syncs. It must be activated individually on any clones which require
symlinks.
* Countless documentation enhancements.
| < | | 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 |
no longer saved via the UI (the [/help?cmd=wiki|wiki CLI command]
can, though).
* The [/help?cmd=allow-symlinks|allow-symlinks setting] no longer
syncs. It must be activated individually on any clones which require
symlinks.
* Countless documentation enhancements.
<h2 id='v2_11'>Changes for Version 2.11 (2020-05-25)</h2>
* (2.11.2): Backport security fixes from 2.12.1
* (2.11.1): Backport security fix for the "fossil git export" command.
* Support [/md_rules|Markdown] in the default ticket configuration.
* Timestamp strings in [./checkin_names.wiki|object names]
can now omit punctation. So, for example, "202004181942" and
"2020-04-18 19:42" mean the same thing.
|
| ︙ | ︙ | |||
434 435 436 437 438 439 440 |
page so that it does not add "anonymous" capabilities to the
"nobody" user.
* Update internal Unicode character tables, used in regular expression
handling, from version 12.1 to 13.
* Many documentation enhancements.
* Many minor enhancements to existing features.
| < | | 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 |
page so that it does not add "anonymous" capabilities to the
"nobody" user.
* Update internal Unicode character tables, used in regular expression
handling, from version 12.1 to 13.
* Many documentation enhancements.
* Many minor enhancements to existing features.
<h2 id='v2_10'>Changes for Version 2.10 (2019-10-04)</h2>
* (2.10.2): backport security fixes from 2.12.1
* (2.10.1): backport security fix for the "fossil git export" command.
* Added support for [./serverext.wiki|CGI-based Server Extensions].
* Added the [/help?cmd=repolist-skin|repolist-skin] setting used to
add style to repository list pages.
* Enhance the hierarchical display of Forum threads to do less
|
| ︙ | ︙ | |||
471 472 473 474 475 476 477 |
* The check-in lock interval is reduced from 24 hours to 60 seconds,
though the interval is now configurable using a setting.
An additional check for conflicts is added after interactive
check-in comment entry, to compensate for the reduced lock interval.
* Performance optimizations.
* Many documentation improvements.
| < | | 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 |
* The check-in lock interval is reduced from 24 hours to 60 seconds,
though the interval is now configurable using a setting.
An additional check for conflicts is added after interactive
check-in comment entry, to compensate for the reduced lock interval.
* Performance optimizations.
* Many documentation improvements.
<h2 id='v2_9'>Changes for Version 2.9 (2019-07-13)</h2>
* Added the [/help?cmd=git|fossil git export] command and instructions
for [./mirrortogithub.md|creating a GitHub mirror of a Fossil project].
* Improved handling of relative hyperlinks on the
[/help?cmd=/artifact|/artifact] pages for wiki. For example,
hyperlinks and the lizard <img> now work correctly
for both [/artifact/2ff24ab0887cf522] and
|
| ︙ | ︙ | |||
542 543 544 545 546 547 548 |
caused by concurrent commits when operating in auto-sync mode.
* Fix a bug ([https://fossil-scm.org/forum/forumpost/c51b9a1169|details])
that can cause repository databases to be overwritten with debugging
output, thus corrupting the repository. This is only a factor when
CGI debugging is enabled, and even then is a rare occurrence, but it is
obviously an important fix.
| < | | 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 |
caused by concurrent commits when operating in auto-sync mode.
* Fix a bug ([https://fossil-scm.org/forum/forumpost/c51b9a1169|details])
that can cause repository databases to be overwritten with debugging
output, thus corrupting the repository. This is only a factor when
CGI debugging is enabled, and even then is a rare occurrence, but it is
obviously an important fix.
<h2 id='v2_8'>Changes for Version 2.8 (2019-02-20)</h2>
* Show cherry-pick merges as dotted lines on the timeline graph.
→ The "fossil rebuild" command must be run to create and
populate the new "cherrypick" table in the repository in order
for this feature to operate.
* Add the ability to associate branches, check-ins, and tags with
specially-named Wiki pages. This gives the ability to better
|
| ︙ | ︙ | |||
609 610 611 612 613 614 615 |
to the checkout database to avoid any problems.
* Add the backoffice-disable setting to completely disable the
backoffice feature.
* Update the built-in SQLite to version 3.27.1.
* Various other small enhancements to webpages and documentation.
| < | | 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 |
to the checkout database to avoid any problems.
* Add the backoffice-disable setting to completely disable the
backoffice feature.
* Update the built-in SQLite to version 3.27.1.
* Various other small enhancements to webpages and documentation.
<h2 id='v2_7'>Changes for Version 2.7 (2018-09-22)</h2>
* Add the [./alerts.md|email alerts] feature for commits, ticket
changes, wiki changes, forum posts, and announcements. This is
still a work in progress. It is functional, but it is not as easy to
setup and use as it ought to be.
* Add the [./forum.wiki|discussion forum] feature.
* Add new user capabilities letters needed to support alerts and forum.
|
| ︙ | ︙ | |||
652 653 654 655 656 657 658 |
* The `mv-rm-files` setting is now compiled into Fossil in the
default Fossil configuration; no longer must you say
<tt>./configure --with-legacy-mv-rm</tt> to make it available. The
setting remains disabled by default, however, so you must still say
<tt>fossil set mv-rm-files 1</tt> to enable it on each repository
where you want hard <tt>mv/rm</tt> behavior.
| < | | 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 |
* The `mv-rm-files` setting is now compiled into Fossil in the
default Fossil configuration; no longer must you say
<tt>./configure --with-legacy-mv-rm</tt> to make it available. The
setting remains disabled by default, however, so you must still say
<tt>fossil set mv-rm-files 1</tt> to enable it on each repository
where you want hard <tt>mv/rm</tt> behavior.
<h2 id='v2_6'>Changes for Version 2.6 (2018-05-04)</h2>
* Fix a bug that was causing crashes while trying to clone the TCL
repository. This fix is the main reason for the current release.
* Added the new "Classic" timeline viewing mode. "Classic" is the
same as "Verbose" in the previous release. The "Verbose" mode is
now like "Compact" except the extra check-in details are shown by
default.
|
| ︙ | ︙ | |||
681 682 683 684 685 686 687 |
time column.
* In the tarball cache replacement algorithm, give extra weight to
tarballs that have been accessed more than once.
* Additional defenses against web-based attacks. There have not been
any known vulnerabilities. We are just being paranoid.
* Update the built-in SQLite to an alpha version of 3.24.0.
| < | | 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 |
time column.
* In the tarball cache replacement algorithm, give extra weight to
tarballs that have been accessed more than once.
* Additional defenses against web-based attacks. There have not been
any known vulnerabilities. We are just being paranoid.
* Update the built-in SQLite to an alpha version of 3.24.0.
<h2 id='v2_5'>Changes for Version 2.5 (2018-02-07)</h2>
* Numerous enhancements to the look and feel of the web interface.
Especially: Added separate "Modern", "Compact", "Verbose", and
"Columnar" view options on timelines.
* Common display settings (such as the "view" option and the number
of rows in a timeline) are held in a cookie and thus persist
across multiple pages.
|
| ︙ | ︙ | |||
717 718 719 720 721 722 723 |
* Begin factoring out in-line javascript into separately loaded
script files. This is a step along the
road toward supporting a strict Content Security Policy. More work
is to be done.
* Initial infrastructure is in place to make use of the pledge()
system call in OpenBSD. More work is to be done.
| < | | 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 |
* Begin factoring out in-line javascript into separately loaded
script files. This is a step along the
road toward supporting a strict Content Security Policy. More work
is to be done.
* Initial infrastructure is in place to make use of the pledge()
system call in OpenBSD. More work is to be done.
<h2 id='v2_4'>Changes for Version 2.4 (2017-11-03)</h2>
* New feature: URL Aliases. URL Aliases allow an administrator
to define their own URLs on the web interface that are rewritten to
built-in URLs with specific parameters. Create and configure URL Aliases
using the /Setup/URL_Aliases menu option in the web interface.
* Add tech-note search capability.
* Add the -r|--revision and -o|--origin options to the
|
| ︙ | ︙ | |||
757 758 759 760 761 762 763 |
[/help?cmd=zip|zip], and [/help?cmd=tarball|tarball] pages and commands to
honor the versioned manifest setting when outside of an open checkout
directory.
* The admin-log and access-log settings are now on by default for
new repositories.
* Update the built-in SQLite to version 3.21.0.
| < | < | < | < | < | | 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 |
[/help?cmd=zip|zip], and [/help?cmd=tarball|tarball] pages and commands to
honor the versioned manifest setting when outside of an open checkout
directory.
* The admin-log and access-log settings are now on by default for
new repositories.
* Update the built-in SQLite to version 3.21.0.
<h2 id='v2_3'>Changes for Version 2.3 (2017-07-21)</h2>
* Update the built-in SQLite to version 3.20.0 (beta).
* Update internal Unicode character tables, used in regular expression
handling, from version 9.0 to 10.0.
* Show the last-sync-URL on the [/help?cmd=/urllist|/urllist] page.
* Added the "Event Summary" activity report.
[/reports?type=ci&view=lastchng|example]
* Added the "Security Audit" page, available to administrators only
* Added the Last Login time to the user list page, for administrators only
* Added the --numstat option to the [/help?cmd=diff|fossil diff] command
* Limit the size of the heap and stack on unix systems, as a proactive
defense against the
[https://www.qualys.com/2017/06/19/stack-clash/stack-clash.txt|Stack Clash]
attack.
* Fix "database locked" warnings caused by "PRAGMA optimize".
* Fix a potential XSS vulnerability on the
[/help?cmd=/help|/help] webpage.
* Documentation updates
<h2 id='v2_2'>Changes for Version 2.2 (2017-04-11)</h2>
* GIT comment tags are now handled by Fossil during import/export.
* Show the content of README files on directory listings.
([/file/skins|example])
* Support for Basic Authentication if enabled (default off).
* Show the hash algorithms used on the
[/help?cmd=/rcvfromlist|/rcvfromlist] page.
* The [/help?cmd=/tarball|/tarball] and [/help?cmd=/zip|/zip] pages
now use the the r= query parameter
to select which check-in to deliver. The uuid= query parameter
is still accepted for backwards compatibility.
* Update the built-in SQLite to version 3.18.0.
* Run "[https://www.sqlite.org/pragma.html#pragma_optimize|PRAGMA optimize]"
on the database connection as it is closing.
<h2 id='v2_1'>Changes for Version 2.1 (2017-03-10)</h2>
* Add support for [./hashpolicy.wiki|hash policies] that control which
of the Hardened-SHA1 or SHA3-256 algorithms is used to name new
artifacts.
* Add the "gshow" and "gcat" subcommands to [/help?cmd=stash|fossil stash].
* Add the [/help?cmd=/juvlist|/juvlist] web page and use it to construct
the [/uv/download.html|Download Page] of the Fossil self-hosting website
using Ajax.
<h2 id='v2_0'>Changes for Version 2.0 (2017-03-03)</h2>
* Use the
[https://github.com/cr-marcstevens/sha1collisiondetection|hardened SHA1]
implementation by Marc Stevens and Dan Shumow.
* Add the ability to read and understand
[./fileformat.wiki#names|artifact names] that are based on SHA3-256
rather than SHA1, but do not actually generate any such names.
* Added the [/help?cmd=sha3sum|sha3sum] command.
* Update the built-in SQLite to version 3.17.0.
<h2 id='v1_37'>Changes for Version 1.37 (2017-01-16)</h2>
* Add checkbox widgets to various web pages. See [/technote/8d18bf27e9|
this technote] for more information. To get the checkboxes to look as
intended, you must update the CSS in your repository and all clones.
* Add the [/help/all|fossil all ui] command
* Add the [/help?cmd=/file|/file] webpage
* Enhance the [/help?cmd=/brlist|/brlist] webpage to make use of branch colors.
|
| ︙ | ︙ | |||
856 857 858 859 860 861 862 |
* Fixes for incremental git import/export.
* Minor security enhancements to
[./encryptedrepos.wiki|encrypted repositories].
* Update the built-in SQLite to version 3.16.2.
* Update the built-in Zlib to version 1.2.11.
| < | | 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 |
* Fixes for incremental git import/export.
* Minor security enhancements to
[./encryptedrepos.wiki|encrypted repositories].
* Update the built-in SQLite to version 3.16.2.
* Update the built-in Zlib to version 1.2.11.
<h2 id='v1_36'>Changes for Version 1.36 (2016-10-24)</h2>
* Add support for [./unvers.wiki|unversioned content],
the [/help?cmd=unversioned|fossil unversioned] command and the
[/help?cmd=/uv|/uv] and [/uvlist] web pages.
* The [/uv/download.html|download page] is moved into
[./unvers.wiki|unversioned content] so that the self-hosting Fossil
websites no longer uses any external content.
|
| ︙ | ︙ | |||
887 888 889 890 891 892 893 |
queries are filled in using HTTP query parameter values.
* Added support for [./childprojects.wiki|child projects] that are
able to pull from their parent but not push.
* Added the -nocomplain option to the TH1 "query" command.
* Added support for the chng=GLOBLIST query parameter on the
[/help?cmd=/timeline|/timeline] webpage.
| < | | 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 |
queries are filled in using HTTP query parameter values.
* Added support for [./childprojects.wiki|child projects] that are
able to pull from their parent but not push.
* Added the -nocomplain option to the TH1 "query" command.
* Added support for the chng=GLOBLIST query parameter on the
[/help?cmd=/timeline|/timeline] webpage.
<h2 id='v1_35'>Changes for Version 1.35 (2016-06-14)</h2>
* Enable symlinks by default on all non-Windows platforms.
* Enhance the [/md_rules|Markdown formatting] so that hyperlinks that begin
with "/" are relative to the root of the Fossil repository.
* Rework the [/help?cmd=/setup_ulist|/setup_list page] (the User List page)
to display all users in a click-to-sort table.
* Fix backslash-octal escape on filenames while importing from git
|
| ︙ | ︙ | |||
931 932 933 934 935 936 937 |
* Add support for [./encryptedrepos.wiki|encrypted Fossil repositories].
* If the FOSSIL_PWREADER environment variable is set, then use the program it
names in place of getpass() to read passwords and passphrases
* Option --baseurl now works on Windows.
* Numerous documentation improvements.
* Update the built-in SQLite to version 3.13.0.
| < | | 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 |
* Add support for [./encryptedrepos.wiki|encrypted Fossil repositories].
* If the FOSSIL_PWREADER environment variable is set, then use the program it
names in place of getpass() to read passwords and passphrases
* Option --baseurl now works on Windows.
* Numerous documentation improvements.
* Update the built-in SQLite to version 3.13.0.
<h2 id='v1_34'>Changes for Version 1.34 (2015-11-02)</h2>
* Make the [/help?cmd=clean|fossil clean] command undoable for files less
than 10MiB.
* Update internal Unicode character tables, used in regular expression
handling, from version 7.0 to 8.0.
* Add the new [/help?cmd=amend|amend] command which is used to modify
tags of a "check-in".
|
| ︙ | ︙ | |||
967 968 969 970 971 972 973 |
* Fix --hard option to [/help?cmd=mv|fossil mv] and [/help?cmd=rm|fossil rm]
to enable them to work properly with certain relative paths.
* Change the mimetype for ".n" and ".man" files to text/plain.
* Display improvements in the [/help?cmd=bisect|fossil bisect chart] command.
* Updated the built-in SQLite to version 3.9.1 and activated JSON1 and FTS5
support (both currently unused within Fossil).
| < | | 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 |
* Fix --hard option to [/help?cmd=mv|fossil mv] and [/help?cmd=rm|fossil rm]
to enable them to work properly with certain relative paths.
* Change the mimetype for ".n" and ".man" files to text/plain.
* Display improvements in the [/help?cmd=bisect|fossil bisect chart] command.
* Updated the built-in SQLite to version 3.9.1 and activated JSON1 and FTS5
support (both currently unused within Fossil).
<h2 id='v1_33'>Changes for Version 1.33 (2015-05-23)</h2>
* Improved fork detection on [/help?cmd=update|fossil update],
[/help?cmd=status|fossil status] and related commands.
* Change the default skin to what used to be called "San Francisco Modern".
* Add the [/repo-tabsize] web page
* Add [/help?cmd=import|fossil import --svn], for importing a subversion
repository into fossil which was exported using "svnadmin dump".
* Add the "--compress-only" option to [/help?cmd=rebuild|fossil rebuild].
|
| ︙ | ︙ | |||
1017 1018 1019 1020 1021 1022 1023 |
* Permit filtering weekday and file [/help?cmd=/reports|reports] by user.
Also ensure the user parameter is preserved when changing types. Add a
field for direct entry of the user name to each applicable report.
* Create parent directories of [/help?cmd=settings|empty-dirs] if they don't
already exist.
* Inhibit timeline links to wiki pages that have been deleted.
| < | < | | 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 |
* Permit filtering weekday and file [/help?cmd=/reports|reports] by user.
Also ensure the user parameter is preserved when changing types. Add a
field for direct entry of the user name to each applicable report.
* Create parent directories of [/help?cmd=settings|empty-dirs] if they don't
already exist.
* Inhibit timeline links to wiki pages that have been deleted.
<h2 id='v1_33'>Changes for Version 1.32 (2015-03-14)</h2>
* When creating a new repository using [/help?cmd=init|fossil init], ensure
that the new repository is fully compatible with historical versions of
Fossil by having a valid manifest as RID 1.
* Anti-aliased rendering of arrowheads on timeline graphs.
* Added vi/less-style key bindings to the --tk diff GUI.
* Documentation updates to fix spellings and changes all "checkins" to
"check-ins".
* Add the --repolist option to server commands such as
[/help?cmd=server|fossil server] or [/help?cmd=http|fossil http].
* Added the "Xekri" skin.
* Enhance the "ln=" query parameter on artifact displays to accept multiple
ranges, separate by spaces (or "+" when URL-encoded).
* Added [/help?cmd=forget|fossil forget] as an alias for
[/help?cmd=rm|fossil rm].
<h2 id='v1_31'>Changes For Version 1.31 (2015-02-23)</h2>
* Change the auxiliary schema by adding columns MLINK.ISAUX and MLINK.PMID
columns to the schema, to support better drawing of file change graphs.
A [/help?cmd=rebuild|fossil rebuild] is recommended but is not required.
so that the new graph drawing logic can work effectively.
* Added [/search|search] over Check-in comments, Documents, Tickets and
Wiki. Disabled by default. The search can be either a full-scan or it
can use an index that is kept up-to-date automatically. The new
|
| ︙ | ︙ | |||
1086 1087 1088 1089 1090 1091 1092 |
* Added the [/mimetype_list] page.
* Added the [/hash-collisions] page.
* Allow the user of Common Table Expressions in the SQL that defaults
ticket reports.
* Break out the components (css, footer, and header) for the
various built-in skins into separate files in the source tree.
| < | | 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 |
* Added the [/mimetype_list] page.
* Added the [/hash-collisions] page.
* Allow the user of Common Table Expressions in the SQL that defaults
ticket reports.
* Break out the components (css, footer, and header) for the
various built-in skins into separate files in the source tree.
<h2 id='v1_30'>Changes For Version 1.30 (2015-01-19)</h2>
* Added the [/help?cmd=bundle|fossil bundle] command.
* Added the [/help?cmd=purge|fossil purge] command.
* Added the [/help?cmd=publish|fossil publish] command.
* Added the [/help?cmd=unpublished|fossil unpublished] command.
* Enhance the [/tree] webpage to show the age of each file with the option
to sort by age.
* Enhance the [/brlist] webpage to show additional information about each branch
|
| ︙ | ︙ | |||
1157 1158 1159 1160 1161 1162 1163 |
diff option in a separate file for easier editing.
* (Internal:) Implement a system of compile-time checks to help ensure
the correctness of printf-style formatting strings.
* Fix CVE-2014-3566, also known as the POODLE SSL 3.0 vulnerability.
* Numerous documentation fixes and improvements.
* Other obscure and minor bug fixes - see the timeline for details.
| < | | 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 |
diff option in a separate file for easier editing.
* (Internal:) Implement a system of compile-time checks to help ensure
the correctness of printf-style formatting strings.
* Fix CVE-2014-3566, also known as the POODLE SSL 3.0 vulnerability.
* Numerous documentation fixes and improvements.
* Other obscure and minor bug fixes - see the timeline for details.
<h2 id='v1_29'>Changes For Version 1.29 (2014-06-12)</h2>
* Add the ability to display content, diffs and annotations for UTF16
text files in the web interface.
* Add the "SaveAs..." and "Invert" buttons
to the graphical diff display that results
from using the --tk option with the [/help/diff | fossil diff] command.
* The [/reports] page now requires Read ("o") permissions. The "byweek"
report now properly propagates the selected year through the event type
|
| ︙ | ︙ |
Changes to www/concepts.wiki.
| ︙ | ︙ | |||
94 95 96 97 98 99 100 | is a duplicate of a remote repository. Communication between repositories is via HTTP. Remote repositories are identified by URL. You can also point a web browser at a repository and get human-readable status, history, and tracking information about the project. | | | 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | is a duplicate of a remote repository. Communication between repositories is via HTTP. Remote repositories are identified by URL. You can also point a web browser at a repository and get human-readable status, history, and tracking information about the project. <h3 id="artifacts">2.1 Identification Of Artifacts</h3> A particular version of a particular file is called an "artifact". Each artifact has a universally unique name which is the <a href="http://en.wikipedia.org/wiki/SHA1">SHA1</a> or <a href="http://en.wikipedia.org/wiki/SHA3">SHA3-256</a> hash of the content of that file expressed as either 40 or 64 characters of lower-case hexadecimal. (See the [./hashpolicy.wiki|hash policy |
| ︙ | ︙ | |||
180 181 182 183 184 185 186 | manifest also contains a check-in comment, the date and time when the check-in was established, who created the check-in, and links to other check-ins from which the current check-in is derived. There is also a couple of checksums used to verify the integrity of the check-in. And the whole manifest might be PGP clearsigned.</p> | < | | 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
manifest also contains a check-in comment, the date and time
when the check-in was established, who created the check-in,
and links to other check-ins from which the current check-in
is derived. There is also a couple of checksums used to verify
the integrity of the check-in. And the whole manifest might
be PGP clearsigned.</p>
<h3 id="keyconc">2.3 Key concepts</h3>
<ul>
<li>A <b>check-in</b> is a set of files arranged
in a hierarchy.</li>
<li>A <b>repository</b> keeps a record of historical check-ins.</li>
<li>Repositories share their changes using <b>push</b>, <b>pull</b>,
<b>sync</b>, and <b>clone</b>.</li>
|
| ︙ | ︙ | |||
245 246 247 248 249 250 251 | fossil help </b></blockquote> In the next section, when we say things like "use the <b>help</b> command" we mean to use the command name "help" as the first token after the name of the Fossil executable, as shown above. | < | | 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 |
fossil help
</b></blockquote>
In the next section, when we say things like "use the <b>help</b>
command" we mean to use the command name "help" as the first
token after the name of the Fossil executable, as shown above.
<h2 id="workflow">4.0 Workflow</h2>
<verbatim type="pikchr float-right">
down
R1: cylinder "Remote" "Repository" fill 0xadd8e6 rad 70%
move 150%
R2: cylinder same "Local" "Repository" fill 0x90ee90
move 120%
|
| ︙ | ︙ |
Changes to www/customskin.md.
1 2 3 4 5 6 7 | # Skinning the Fossil Web Interface The Fossil web interface comes with a pre-configured look and feel. The default look and feel works fine in many situations. However, you may want to change the look and feel (the "skin") of Fossil to better suite your own individual tastes. This document provides background information to aid you in that task. | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # Skinning the Fossil Web Interface The Fossil web interface comes with a pre-configured look and feel. The default look and feel works fine in many situations. However, you may want to change the look and feel (the "skin") of Fossil to better suite your own individual tastes. This document provides background information to aid you in that task. ## <a id="builtin"></a>Built-in Skins Fossil comes with [multiple built-in skins](/skins). If the default skin does not suite your tastes, perhaps one of the other built-in skins will work better. If nothing else, the built-in skins can serve as examples or templates that you can use to develop your own custom skin. The sources to these built-ins can |
| ︙ | ︙ | |||
23 24 25 26 27 28 29 | * footer.txt * header.txt * js.txt Try out the built-in skins by using the --skin option on the [fossil ui](/help?cmd=ui) or [fossil server](/help?cmd=server) commands. | | | 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | * footer.txt * header.txt * js.txt Try out the built-in skins by using the --skin option on the [fossil ui](/help?cmd=ui) or [fossil server](/help?cmd=server) commands. ## <a id="sharing"></a>Sharing Skins The skin of a repository is not part of the versioned state and does not "push" or "pull" like checked-in files. The skin is local to the repository. However, skins can be shared between repositories using the [fossil config](/help?cmd=configuration) command. The "fossil config push skin" command will send the local skin to a remote repository and the "fossil config pull skin" command will import a skin |
| ︙ | ︙ | |||
133 134 135 136 137 138 139 |
Finally, Fossil always adds its own footer (unless overridden)
to close out the generated HTML:
</body>
</html>
| | | | 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
Finally, Fossil always adds its own footer (unless overridden)
to close out the generated HTML:
</body>
</html>
## <a id="mainmenu"></a>Changing the Main Menu Contents
As of Fossil 2.15, the actual text content of the skin’s main menu is no
longer part of the skin proper if you’re using one of the stock skins.
If you look at the Header section of the skin, you’ll find a
`<div class="mainmenu">` element whose contents are set by a short
[TH1](./th1.md) script from the contents of the **Main Menu** section of
the Setup → Configuration screen.
This feature allows the main menu contents to stay the same across
different skins, so you no longer have to reapply menu customizations
when trying different skins.
See the [`capexpr`](./th1.md#capexpr) section of the TH1 docs for help
on interpreting the default contents of this block.
## <a id="override"></a>Overriding the HTML Header and Footer
Notice that the `<html>`, `<head>`, and opening `<body>`
elements at the beginning of the document,
and the closing `</body>` and `</html>` elements at the end are automatically
generated by Fossil. This is recommended.
However, for maximum design flexibility, Fossil allows those elements to be
|
| ︙ | ︙ | |||
314 315 316 317 318 319 320 | put your web browser into developer mode and disable the cache. If you fail to do this, then you might make some change to your skin under development and press "Reload" only to find that the display did not change. After you have finished work your skin, the caches should synchronize with your new design and you can reactivate your web browser's cache and take it out of developer mode. | | | 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 | put your web browser into developer mode and disable the cache. If you fail to do this, then you might make some change to your skin under development and press "Reload" only to find that the display did not change. After you have finished work your skin, the caches should synchronize with your new design and you can reactivate your web browser's cache and take it out of developer mode. ## <a id="headfoot"></a>Header and Footer Processing The `header.txt` and `footer.txt` control files of a skin are the HTML text of the Content Header and Content Footer, except that before being inserted into the output stream, the text is run through a [TH1 interpreter](./th1.md) that might adjust the text as follows: * All text within <th1>...</th1> is omitted from the |
| ︙ | ︙ | |||
346 347 348 349 350 351 352 | As you can see, two TH1 variable substitutions were done. The same TH1 interpreter is used for both the header and the footer and for all scripts contained within them both. Hence, any global TH1 variables that are set by the header are available to the footer. | | | 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 | As you can see, two TH1 variable substitutions were done. The same TH1 interpreter is used for both the header and the footer and for all scripts contained within them both. Hence, any global TH1 variables that are set by the header are available to the footer. ## <a id="menu"></a>Customizing the ≡ Hamburger Menu The menu bar of the default skin has an entry to open a drop-down menu with additional navigation links, represented by the ≡ button (hence the name "hamburger menu"). The Javascript logic to open and close the hamburger menu when the button is clicked is usually handled by a script named "hbmenu.js" that is one of the [built-in resource files](/test-builtin-files) that are part of Fossil. |
| ︙ | ︙ | |||
410 411 412 413 414 415 416 | The custom `data-anim-ms` attribute can be added to the panel element to direct the Javascript logic to override the default menu animation duration of 400 ms. A faster animation duration of 80-200 ms may be preferred for smaller menus. The animation is disabled by setting the attribute to `"0"`. | | | 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 |
The custom `data-anim-ms` attribute can be added to the panel element to direct
the Javascript logic to override the default menu animation duration of 400 ms.
A faster animation duration of 80-200 ms may be preferred for smaller menus. The
animation is disabled by setting the attribute to `"0"`.
## <a id="vars"></a>TH1 Variables
Before expanding the TH1 within the header and footer, Fossil first
initializes a number of TH1 variables to values that depend on
repository settings and the specific page being generated.
* **project_name** - The project_name variable is filled with the
name of the project as configured under the Admin/Configuration
|
| ︙ | ︙ | |||
487 488 489 490 491 492 493 | All of the above are variables in the sense that either the header or the footer is free to change or erase them. But they should probably be treated as constants. New predefined values are likely to be added in future releases of Fossil. | | | 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 |
All of the above are variables in the sense that either the header or the
footer is free to change or erase them. But they should probably be treated
as constants. New predefined values are likely to be added in future
releases of Fossil.
## <a id="procedure"></a>Suggested Skin Customization Procedure
Developers are free, of course, to develop new skins using any method they
want, but the following is a technique that has worked well in the past and
can serve as a starting point for future work:
1. Select a built-in skin that is closest to the desired look. Make
copies of the css, footer, and header into files name "css.txt",
|
| ︙ | ︙ |
Changes to www/defcsp.md.
| ︙ | ︙ | |||
38 39 40 41 42 43 44 |
<pre>
default-src *;
</pre>
The following sections detail the maining of the default CSP setting.
| | | 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<pre>
default-src *;
</pre>
The following sections detail the maining of the default CSP setting.
### <a id="base"></a> default-src 'self' data:
This policy means mixed-origin content isn’t allowed, so you can’t refer
to resources on other web domains. Browsers will ignore a link like the
one in the following Markdown under our default CSP:

|
| ︙ | ︙ | |||
75 76 77 78 79 80 81 | There are many other cases, [covered below](#serving). [b64]: https://en.wikipedia.org/wiki/Base64 [svr]: ./server/ | | | | | 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
There are many other cases, [covered below](#serving).
[b64]: https://en.wikipedia.org/wiki/Base64
[svr]: ./server/
### <a id="img"></a> img-src * data:
As of Fossil 2.15, we don’t restrict the source of inline images at all.
You can pull them in from remote systems as well as pull them from
within the Fossil repository itself, or use `data:` URIs.
If you are certain all images come from only within the repository, you
can close off certain risks — tracking pixels, broken image format
decoders, system dialog box spoofing, etc. — by changing this to
“`img-src 'self'`” possibly followed by “`data:`” if you will also use
`data:` URIs.
### <a id="style"></a> style-src 'self' 'unsafe-inline'
This policy allows CSS information to come from separate files hosted
under the Fossil repo server’s Internet domain. It also allows inline CSS
`<style>` tags within the document text.
The `'unsafe-inline'` declaration allows CSS within individual HTML
elements:
<p style="margin-left: 4em">Indented text.</p>
As the "`unsafe-`" prefix on the name implies, the `'unsafe-inline'`
feature is suboptimal for security. However, there are
a few places in the Fossil-generated HTML that benefit from this
flexibility and the work-arounds are verbose and difficult to maintain.
Furthermore, the harm that can be done with style injections is far
less than the harm possible with injected javascript. And so the
`'unsafe-inline'` compromise is accepted for now, though it might
go away in some future release of Fossil.
### <a id="script"></a> script-src 'self' 'nonce-%s'
This policy disables in-line JavaScript and only allows `<script>`
elements if the `<script>` includes a `nonce` attribute that matches the
one declared by the CSP. That nonce is a large random number, unique for
each HTTP page generated by Fossil, so an attacker cannot guess the
value, so the browser will ignore an attacker’s injected JavaScript.
|
| ︙ | ︙ | |||
152 153 154 155 156 157 158 |
can only be installed by the Fossil server’s system administrator,
this path is also considered safe.
[ext]: ./serverext.wiki
[su]: ./caps/admin-v-setup.md#apsu
| | | 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
can only be installed by the Fossil server’s system administrator,
this path is also considered safe.
[ext]: ./serverext.wiki
[su]: ./caps/admin-v-setup.md#apsu
#### <a id="xss"></a>Cross-Site Scripting via Ordinary User Capabilities
We’re so restrictive about how we treat JavaScript because it can lead
to difficult-to-avoid scripting attacks. If we used the same CSP for
`<script>` tags [as for `<style>` tags](#style), anyone with check-in
rights on your repository could add a JavaScript file to your repository
and then refer to it from other content added to the site. Since
JavaScript code can access any data from any URI served under its same
|
| ︙ | ︙ | |||
212 213 214 215 216 217 218 | through check-ins. [ed]: ./embeddeddoc.wiki [edtf]: ./embeddeddoc.wiki#th1 [hfed]: ./embeddeddoc.wiki#html | | | 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
through check-ins.
[ed]: ./embeddeddoc.wiki
[edtf]: ./embeddeddoc.wiki#th1
[hfed]: ./embeddeddoc.wiki#html
## <a id="serving"></a>Serving Files Within the Limits
There are several ways to serve files within the above restrictions,
avoiding the need to [override the default CSP](#override). In
decreasing order of simplicity and preference:
1. Within [embedded documentation][ed] (only!) you can refer to files
stored in the repo using document-relative file URLs:
|
| ︙ | ︙ | |||
303 304 305 306 307 308 309 | [tkt]: ./tickets.wiki [tn]: ./event.wiki [uu]: /help?cmd=/uv [uv]: ./unvers.wiki [wiki]: ./wikitheory.wiki | | | | 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 | [tkt]: ./tickets.wiki [tn]: ./event.wiki [uu]: /help?cmd=/uv [uv]: ./unvers.wiki [wiki]: ./wikitheory.wiki ## <a id="override"></a>Overriding the Default CSP If you wish to relax the default CSP’s restrictions or to tighten them further, there are multiple ways to accomplish that. The following methods are listed in top-down order to give the simplest and most straightforward method first. Further methods dig down deeper into the stack, which is helpful to understand even if you end up using a higher-level method. ### <a id="cspsetting"></a>The `default-csp` Setting If the [`default-csp` setting](/help?cmd=default-csp) is defined and is not an empty string, its value is injected into the page using [TH1](./th1.md) via one or more of the methods below, depending on the skin you’re using and local configuration. Changing this setting is the easiest way to set a nonstandard CSP on |
| ︙ | ︙ | |||
353 354 355 356 357 358 359 |
2. For more complicated CSPs, the quoting rules for your shell and the
CSP syntax may interact, making it difficult or impossible to set
your desired CSP via the command line. Setting it via the web UI
doesn’t have this problem.
| | | | | 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 |
2. For more complicated CSPs, the quoting rules for your shell and the
CSP syntax may interact, making it difficult or impossible to set
your desired CSP via the command line. Setting it via the web UI
doesn’t have this problem.
### <a id="th1"></a>TH1 Setup Hook
Fossil sets [the TH1 variable `$default_csp`][thvar] from the
`default-csp` setting and uses *that* to inject the value into generated
HTML pages in its stock configuration.
This means that another way you can override this value is to use
the [`th1-setup` hook script](./th1-hooks.md), which runs before TH1
processing happens during skin processing:
$ fossil set th1-setup "set default_csp {default-src 'self'}"
After [the above](#admin-ui), this is the cleanest method.
[thvar]: ./customskin.md#vars
### <a id="csrc"></a>Fossil C Source Code
When you do neither of the above things, Fossil uses
[a hard-coded default](/info?ln=527-530&name=65a555d0d4fb846b).
We tell you about this not to suggest that you hack the Fossil C source
code to change the CSP but simply to document the next step before we
move down-stack.
### <a id="header"></a>Skin Header
[In the normal case](./customskin.md#override), Fossil injects the CSP
retrieved by one of the above methods into the header of all HTML
documents it generates:
```HTML
<head>...
|
| ︙ | ︙ | |||
443 444 445 446 447 448 449 | `$default_csp` variable like the Bootstrap skin does so you can use one of the methods above with your custom skin, so the CSP can vary independently of the skin. [dcinj]: /info?ln=7&name=bef080a6929a3e6f | | | 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 | `$default_csp` variable like the Bootstrap skin does so you can use one of the methods above with your custom skin, so the CSP can vary independently of the skin. [dcinj]: /info?ln=7&name=bef080a6929a3e6f ### <a id="fep"></a>Front-End Proxy If your Fossil repo is behind some sort of HTTP [front-end proxy][svr], the [preferred method][pmcsp] for setting the CSP is via a custom HTTP header, which most HTTP reverse proxy programs allow. Beware that if you have a CSP set via both the HTTP and HTML headers that the two CSPs [merge](https://stackoverflow.com/a/51153816/142454), |
| ︙ | ︙ |
Changes to www/delta_encoder_algorithm.wiki.
| ︙ | ︙ | |||
15 16 17 18 19 20 21 | companion specification titled "<a href="delta_format.wiki">Fossil Delta Format</a>". </p> <p>The algorithm is inspired by <a href="http://samba.anu.edu.au/rsync/">rsync</a>.</p> | | | | | 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | companion specification titled "<a href="delta_format.wiki">Fossil Delta Format</a>". </p> <p>The algorithm is inspired by <a href="http://samba.anu.edu.au/rsync/">rsync</a>.</p> <h2 id="argresparam">1.0 Arguments, Results, and Parameters</h2> <p>The encoder takes two byte-sequences as input, the "original", and the "target", and returns a single byte-sequence containing the "delta" which transforms the original into the target upon its application.</p> <p>Note that the data of a "byte-sequence" includes its length, i.e. the number of bytes contained in the sequence.</p> <p>The algorithm has one parameter named "NHASH", the size of the "sliding window" for the "rolling hash", in bytes. These two terms are explained in the next section. The value of this parameter has to be a power of two for the algorithm to work. For Fossil the value of this parameter is set to "16".</p> <h2 id="operation">2.0 Operation</h2> <p>The algorithm is split into three phases which generate the <a href="delta_format.wiki#header">header</a>, <a href="delta_format.wiki#slist">segment list</a>, and <a href="delta_format.wiki#trailer">trailer</a> of the delta, per its general <a href="delta_format.wiki#structure">structure</a>.</p> <p>The two phases generating header and trailer are not covered here as their implementation trivially follows directly from the specification of the <a href="delta_format.wiki">delta format</a>.</p> <p>This leaves the segment-list. Its generation is done in two phases, a pre-processing step operating on the "original" byte-sequence, followed by the processing of the "target" byte-sequence using the information gathered by the first step.</p> <h3 id="preprocessing">2.1 Preprocessing the original</h3> <p>A major part of the processing of the "target" is to find a range in the "original" which contains the same content as found at the current location in the "target".</p> <p>A naive approach to this would be to search the whole "original" for such content. This however is very inefficient as it would search |
| ︙ | ︙ | |||
81 82 83 84 85 86 87 | computed. </li> <li>A hash table is filled, mapping from the hashes of the chunks to the list of chunk locations having this hash. </li> </ol> | | | 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | computed. </li> <li>A hash table is filled, mapping from the hashes of the chunks to the list of chunk locations having this hash. </li> </ol> <h3 id="processing">2.1 Processing the target</h3> <p>This, the main phase of the encoder, processes the target in a loop from beginning to end. The state of the encoder is captured by two locations, the "base" and the "slide". "base" points to the first byte of the target for which no delta output has been generated yet, and "slide" is the location of the window used to look in the "origin" for commonalities. This window is NHASH bytes long.</p> |
| ︙ | ︙ | |||
192 193 194 195 196 197 198 | </p> <p>If the processing loop left bytes unencoded, i.e. "base" not exactly at the end of the "target", as is possible for both end conditions, then one last insert instruction is emitted to put these bytes into the delta.<p> | | | | | | 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 | </p> <p>If the processing loop left bytes unencoded, i.e. "base" not exactly at the end of the "target", as is possible for both end conditions, then one last insert instruction is emitted to put these bytes into the delta.<p> <h2 id="exceptions">3.0 Exceptions</h2> <p>If the "original" is at most NHASH bytes long no compression of changes is possible, and the segment-list of the delta consists of a single literal which contains the entire "target".</p> <p>This is actually equivalent to the second end condition of the processing loop described in the previous section, just checked before actually entering the loop.</p> <h2 id="rollhash">4.0 The rolling hash</h2> <p>The rolling hash described below and used to compute content signatures was chosen not only for good hashing properties, but also to enable the easy (incremental) recalculation of its value for a sliding window, i.e. where the oldest byte is removed from the window and a new byte is shifted in.<p> <h3 id="rhdef">4.1 Definition</h3> <p>Assuming an array Z of NHASH bytes (indexing starting at 0) the hash V is computed via</p> <p align=center><table><tr><td> <p><img src="encode1.gif" align="center"></p> <p><img src="encode2.gif" align="center"></p> <p><img src="encode3.gif" align="center"></p> </td></tr></table></p> where A and B are unsigned 16-bit integers (hence the <u>mod</u>), and V is a 32-bit unsigned integer with B as MSB, A as LSB. <h3 id="rhincr">4.2 Incremental recalculation</h3> <p>Assuming an array Z of NHASH bytes (indexing starting at 0) with hash V (and components A and B), the dropped byte <img src="encode4.gif" align="center">, and the new byte <img src="encode5.gif" align="center"> , the new hash can be computed incrementally via: </p> |
| ︙ | ︙ |
Changes to www/delta_format.wiki.
| ︙ | ︙ | |||
58 59 60 61 62 63 64 |
Return the size of the output that would result from applying delta D.
* <b>delta_parse(</b><i>D</i>)</b> → This is a table-valued function
that returns one row for the header, for the trailer, and for each segment
in delta D.
| | | | | | 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
Return the size of the output that would result from applying delta D.
* <b>delta_parse(</b><i>D</i>)</b> → This is a table-valued function
that returns one row for the header, for the trailer, and for each segment
in delta D.
<h1 id="structure">2.0 Structure</h1>
<verbatim type="pikchr">
leftmargin = 0.1
box height 50% "Header"
box same "Segments"
box same "Trailer"
</verbatim>
<p>A delta consists of three parts, a "header", a "trailer", and a
"segment-list" between them.</p>
<p>Both header and trailer provide information about the target
helping the decoder, and the segment-list describes how the target can
be constructed from the original.</p>
<h2 id="header">2.1 Header</h2>
<verbatim type="pikchr">
leftmargin = 0.1
box height 50% "Size"
box same "\"\\n\""
</verbatim>
<p>The header consists of a single number followed by a newline
character (ASCII 0x0a). The number is the length of the target in
bytes.</p>
<p>This means that, given a delta, the decoder can compute the size of
the target (and allocate any necessary memory based on that) by simply
reading the first line of the delta and decoding the number found
there. In other words, before it has to decode everything else.</p>
<h2 id="trailer">2.2 Trailer</h2>
<verbatim type="pikchr">
leftmargin = 0.1
box height 50% "Checksum"
box same "\";\""
</verbatim>
<p>The trailer consists of a single number followed by a semicolon (ASCII
0x3b). This number is a checksum of the target and can be used by a
decoder to verify that the delta applied correctly, reconstructing the
target from the original.</p>
<p>The checksum is computed by treating the target as a series of
32-bit integer numbers (MSB first), and summing these up, modulo
2^32-1. A target whose length is not a multiple of 4 is padded with
0-bytes (ASCII 0x00) at the end.</p>
<p>By putting this information at the end of the delta a decoder has
it available immediately after the target has been reconstructed
fully.</p>
<h2 id="slist">2.3 Segment-List</h2>
<verbatim type="pikchr">
leftmargin = 0.1
PART1: [
B1: box height 50% width 15% ""
B2: box same ""
B3: box same ""
"***"
|
| ︙ | ︙ | |||
146 147 148 149 150 151 152 | compression takes place, by encoding the large common parts of original and target in small copy instructions.</p> <p>The target is constructed from beginning to end, with the data generated by each instruction appended after the data of all previous instructions, with no gaps.</p> | | | | | 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
compression takes place, by encoding the large common parts of
original and target in small copy instructions.</p>
<p>The target is constructed from beginning to end, with the data
generated by each instruction appended after the data of all previous
instructions, with no gaps.</p>
<h3 id="insertlit">2.3.1 Insert Literal</h3>
<p>A literal is specified by two elements, the size of the literal in
bytes, and the bytes of the literal itself.</p>
<verbatim type="pikchr">
leftmargin = 0.1
box "Length" height 50%
box "\":\"" same
box "Bytes" same
</verbatim>
<p>The length is written first, followed by a colon character (ASCII
0x3a), followed by the bytes of the literal.</p>
<h3 id="copyrange">2.3.2 Copy Range</h3>
<p>A range to copy is specified by two numbers, the offset of the
first byte in the original to copy, and the size of the range, in
bytes. The size zero is special, its usage indicates that the range
extends to the end of the original.</p>
<verbatim type="pikchr">
leftmargin = 0.1
box "Length" height 50%
box "\"@\"" same
box "Offset" same
box "\",\"" same
</verbatim>
<p>The length is written first, followed by an "at" character (ASCII
0x40), then the offset, followed by a comma (ASCII 0x2c).</p>
<h1 id="intcoding">3.0 Encoding of integers</h1>
<p>
The format currently handles only 32 bit integer numbers. They are
written base-64 encoded, MSB first, and without leading
"0"-characters, except if they are significant (i.e. 0 => "0").
</p>
|
| ︙ | ︙ | |||
205 206 207 208 209 210 211 | the first character, followed by the next 6 bits, and so on until all non-zero bits of the integer are encoded. The minimum number of encoding characters is used. Note that for integers less than 10, the base-64 coding is a ASCII decimal rendering of the number itself. </p> | | | | | 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | the first character, followed by the next 6 bits, and so on until all non-zero bits of the integer are encoded. The minimum number of encoding characters is used. Note that for integers less than 10, the base-64 coding is a ASCII decimal rendering of the number itself. </p> <h1 id="examples">4.0 Examples</h1> <h2 id="examplesint">4.1 Integer encoding</h2> <table border=1> <tr> <th>Value</th> <th>Encoding</th> </tr> <tr> <td>0</td> <td>0</td> </tr> <tr> <td>6246</td> <td>1Xb</td> </tr> <tr> <td>-1101438770</td> <td>2zMM3E</td> </tr> </table> <h2 id="examplesdelta">4.2 Delta encoding</h2> <p>An example of a delta using the specified encoding is:</p> <table border=1><tr><td><pre> 1Xb 4E@0,2:thFN@4C,6:scenda1B@Jd,6:scenda5x@Kt,6:pieces79@Qt,F: Example: eskil~E@Y0,2zMM3E;</pre> </td></tr></table> |
| ︙ | ︙ | |||
304 305 306 307 308 309 310 | * Ticketing interface (expand this bullet) </pre></td></tr></table> | | | 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 | * Ticketing interface (expand this bullet) </pre></td></tr></table> <h1 id="notes">Notes</h1> <ul> <li>Pure text files generate a pure text delta. </li> <li>Binary files generate a delta that may contain some binary data. </li> <li>The delta encoding does not attempt to compress the content. It was considered to be much more sensible to do compression using a separate general-purpose compression library, like <a href="http://www.zlib.net">zlib</a>. </li> </ul> |
Changes to www/embeddeddoc.wiki.
| ︙ | ︙ | |||
46 47 48 49 50 51 52 | The <i><version></i> is the [./checkin_names.wiki|name of a check-in] that contains the embedded document. This might be a hash prefix for the check-in, or it might be the name of a branch or tag, or it might be a timestamp. See the prior link for more possibilities and examples. | | | 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | The <i><version></i> is the [./checkin_names.wiki|name of a check-in] that contains the embedded document. This might be a hash prefix for the check-in, or it might be the name of a branch or tag, or it might be a timestamp. See the prior link for more possibilities and examples. The <i id="ckout"><version></i> can also be the special identifier "<b>ckout</b>". The "<b>ckout</b>" keywords means to pull the documentation file from the local source tree on disk, not from the any check-in. The "<b>ckout</b>" keyword only works when you start your server using the "[/help?cmd=server|fossil server]" or "[/help?cmd=ui|fossil ui]" commands. The "/doc/ckout" URL is intended to show a preview of |
| ︙ | ︙ | |||
96 97 98 99 100 101 102 | [/md_rules | Markdown markup language]. Documentation files ending in ".txt" are plain text. Wiki, markdown, and plain text documentation files are rendered with the standard fossil header and footer added. Most other mimetypes are delivered directly to the requesting web browser without interpretation, additions, or changes. | | | | 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
[/md_rules | Markdown markup language].
Documentation files ending in ".txt" are plain text.
Wiki, markdown, and plain text documentation files
are rendered with the standard fossil header and footer added.
Most other mimetypes are delivered directly to the requesting
web browser without interpretation, additions, or changes.
<h2 id="html">1.1 HTML Rendering With Fossil Headers And Footers</h2>
Files with the mimetype "text/html" (the .html or .htm suffix) are
usually rendered directly to the browser without interpretation.
However, if the file begins with a <div> element like this:
<b><div class='fossil-doc' data-title='<i>Title Text</i>'></b>
Then the standard Fossil header and footer are added to the document
prior to being displayed. The "class='fossil-doc'" attribute is
|
| ︙ | ︙ |
Changes to www/env-opts.md.
| ︙ | ︙ | |||
415 416 417 418 419 420 421 | If the default VFS underneath SQLite is not suitable, an alternative can be selected with either the `--vfs VFSNAME` option or the `FOSSIL_VFS` environment variable. The `--vfs` option takes precedence. | | | 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 | If the default VFS underneath SQLite is not suitable, an alternative can be selected with either the `--vfs VFSNAME` option or the `FOSSIL_VFS` environment variable. The `--vfs` option takes precedence. ### <a id="temp"></a>Temporary File Location Fossil places some temporary files in the checkout directory. Most notably, supporting files related to merge conflicts are placed in the same folder as the merge result. Other temporary files need a different home. The rules for choosing one are complicated. |
| ︙ | ︙ |
Changes to www/faq.tcl.
| ︙ | ︙ | |||
165 166 167 168 169 170 171 |
for {set i 1} {$i<$cnt} {incr i} {
puts "<li><a href=\"#q$i\">[lindex $faq($i) 0]</a></li>"
}
puts {</ol>}
puts {<hr>}
for {set i 1} {$i<$cnt} {incr i} {
| < | | 165 166 167 168 169 170 171 172 173 174 175 176 177 |
for {set i 1} {$i<$cnt} {incr i} {
puts "<li><a href=\"#q$i\">[lindex $faq($i) 0]</a></li>"
}
puts {</ol>}
puts {<hr>}
for {set i 1} {$i<$cnt} {incr i} {
puts "<p id=\"q$i\"><b>($i) [lindex $faq($i) 0]</b></p>\n"
set body [lindex $faq($i) 1]
regsub -all "\n *" [string trim $body] "\n" body
puts "<blockquote>$body</blockquote></li>\n"
}
puts {</ol>}
|
Changes to www/faq.wiki.
1 2 3 | <title>Fossil FAQ</title> <h1 align="center">Frequently Asked Questions</h1> | | < < < | | < < < < | < | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <title>Fossil FAQ</title> <h1 align="center">Frequently Asked Questions</h1> <p>Note: See also <a href="qandc.wiki">Questions and Criticisms</a>. <ol> <li><a href="#q1">What GUIs are available for fossil?</a></li> <li><a href="#q2">What is the difference between a "branch" and a "fork"?</a></li> <li><a href="#q3">How do I create a new branch?</a></li> <li><a href="#q4">How do I tag a check-in?</a></li> <li><a href="#q5">How do I create a private branch that won't get pushed back to the main repository.</a></li> <li><a href="#q6">How can I delete inappropriate content from my fossil repository?</a></li> <li><a href="#q7">How do I make a clone of the fossil self-hosting repository?</a></li> <li><a href="#q8">How do I import or export content from and to other version control systems?</a></li> </ol> <hr> <p id="q1"><b>(1) What GUIs are available for fossil?</b></p> <blockquote>The fossil executable comes with a [./webui.wiki | web-based GUI] built in. Just run: <blockquote> <b>fossil [/help/ui|ui]</b> <i>REPOSITORY-FILENAME</i> </blockquote> And your default web browser should pop up and automatically point to the fossil interface. (Hint: You can omit the <i>REPOSITORY-FILENAME</i> if you are within an open check-out.)</blockquote></li> <p id="q2"><b>(2) What is the difference between a "branch" and a "fork"?</b></p> <blockquote>This is a big question - too big to answer in a FAQ. Please read the <a href="branching.wiki">Branching, Forking, Merging, and Tagging</a> document.</blockquote></li> <p id="q3"><b>(3) How do I create a new branch?</b></p> <blockquote>There are lots of ways: When you are checking in a new change using the <b>[/help/commit|commit]</b> command, you can add the option "--branch <i>BRANCH-NAME</i>" to make the new check-in be the first check-in for a new branch. |
| ︙ | ︙ | |||
67 68 69 70 71 72 73 | the initial check-in of your branch on the timeline and click on its link so that you are on the <b>ci</b> page. Then find the "<b>edit</b>" link (near the "Commands:" label) and click on that. On the "Edit Check-in" page, check the box beside "Branching:" and fill in the name of your new branch to the right and press the "Apply Changes" button.</blockquote></li> | < | | 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | the initial check-in of your branch on the timeline and click on its link so that you are on the <b>ci</b> page. Then find the "<b>edit</b>" link (near the "Commands:" label) and click on that. On the "Edit Check-in" page, check the box beside "Branching:" and fill in the name of your new branch to the right and press the "Apply Changes" button.</blockquote></li> <p id="q4"><b>(4) How do I tag a check-in?</b></p> <blockquote>There are several ways: When you are checking in a new change using the <b>[/help/commit|commit]</b> command, you can add a tag to that check-in using the "--tag <i>TAGNAME</i>" command-line option. You can repeat the --tag option to give a check-in multiple tags. Tags need not be unique. So, |
| ︙ | ︙ | |||
96 97 98 99 100 101 102 | [./webui.wiki | web interface]. First locate the check-in that you what to tag on the timeline, then click on the link to go the detailed information page for that check-in. Then find the "<b>edit</b>" link (near the "Commands:" label) and click on that. There are controls on the edit page that allow new tags to be added and existing tags to be removed.</blockquote></li> | < | | 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | [./webui.wiki | web interface]. First locate the check-in that you what to tag on the timeline, then click on the link to go the detailed information page for that check-in. Then find the "<b>edit</b>" link (near the "Commands:" label) and click on that. There are controls on the edit page that allow new tags to be added and existing tags to be removed.</blockquote></li> <p id="q5"><b>(5) How do I create a private branch that won't get pushed back to the main repository.</b></p> <blockquote>Use the <b>--private</b> command-line option on the <b>commit</b> command. The result will be a check-in which exists on your local repository only and is never pushed to other repositories. All descendants of a private check-in are also private. |
| ︙ | ︙ | |||
121 122 123 124 125 126 127 | as if all the changes that occurred on your private branch occurred in a single check-in. Of course, you can also keep your branch private forever simply by not merging the changes in the private branch back into the trunk. [./private.wiki | Additional information]</blockquote></li> | < | < | < | | 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | as if all the changes that occurred on your private branch occurred in a single check-in. Of course, you can also keep your branch private forever simply by not merging the changes in the private branch back into the trunk. [./private.wiki | Additional information]</blockquote></li> <p id="q6"><b>(6) How can I delete inappropriate content from my fossil repository?</b></p> <blockquote>See the article on [./shunning.wiki | "shunning"] for details.</blockquote></li> <p id="q7"><b>(7) How do I make a clone of the fossil self-hosting repository?</b></p> <blockquote>Any of the following commands should work: <blockquote><pre> fossil [/help/clone|clone] http://fossil-scm.org/ fossil.fossil fossil [/help/clone|clone] http://www2.fossil-scm.org/ fossil.fossil fossil [/help/clone|clone] http://www3.fossil-scm.org/site.cgi fossil.fossil </pre></blockquote> Once you have the repository cloned, you can open a local check-out as follows: <blockquote><pre> mkdir src; cd src; fossil [/help/open|open] ../fossil.fossil </pre></blockquote> Thereafter you should be able to keep your local check-out up to date with the latest code in the public repository by typing: <blockquote><pre> fossil [/help/update|update] </pre></blockquote></blockquote></li> <p id="q8"><b>(8) How do I import or export content from and to other version control systems?</b></p> <blockquote>Please see [./inout.wiki | Import And Export]</blockquote></li> </ol> |
Changes to www/fileformat.wiki.
| ︙ | ︙ | |||
30 31 32 33 34 35 36 | different in separate repositories. The local state is not versioned and is not synchronized with the global state. The local state is not composed of artifacts and is not intended to be enduring. This document is concerned with global state only. Local state is only mentioned here in order to distinguish it from global state. | < | < | | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | different in separate repositories. The local state is not versioned and is not synchronized with the global state. The local state is not composed of artifacts and is not intended to be enduring. This document is concerned with global state only. Local state is only mentioned here in order to distinguish it from global state. <h2 id="names">1.0 Artifact Names</h2> Each artifact in the repository is named by a hash of its content. No prefixes, suffixes, or other information is added to an artifact before the hash is computed. The artifact name is just the (lower-case hexadecimal) hash of the raw artifact. Fossil currently computes artifact names using either SHA1 or SHA3-256. It is relatively easy to add new algorithms in the future, but there are no plans to do so at this time. When referring to artifacts in using tty commands or webpage URLs, it is sufficient to specify a unique prefix for the artifact name. If the input prefix is not unique, Fossil will show an error. Within a structural artifact, however, all references to other artifacts must be the complete hash. Prior to Fossil version 2.0, all names were formed from the SHA1 hash of the artifact. The key innovation in Fossil 2.0 was adding support for alternative hash algorithms. <h2 id="structural">2.0 Structural Artifacts</h2> A structural artifact is an artifact with a particular format that is used to define the relationships between other artifacts in the repository. Fossil recognizes the following kinds of structural artifacts: |
| ︙ | ︙ | |||
98 99 100 101 102 103 104 | is an implementation detail and might change in a future release. For the purpose of this article "file format" means the format of the artifacts, not how the artifacts are stored on disk. It is the artifact format that is intended to be enduring. The specifics of how artifacts are stored on disk, though stable, is not intended to live as long as the artifact format. | < | | 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | is an implementation detail and might change in a future release. For the purpose of this article "file format" means the format of the artifacts, not how the artifacts are stored on disk. It is the artifact format that is intended to be enduring. The specifics of how artifacts are stored on disk, though stable, is not intended to live as long as the artifact format. <h3 id="manifest">2.1 The Manifest</h3> A manifest defines a check-in. A manifest contains a list of artifacts for each file in the project and the corresponding filenames, as well as information such as parent check-ins, the username of the programmer who created the check-in, the date and time when the check-in was created, and any check-in comments associated |
| ︙ | ︙ | |||
254 255 256 257 258 259 260 | clear-signing prefix. The <b>Z</b> card is a sanity check to prove that the manifest is well-formed and consistent. A sample manifest from Fossil itself can be seen [/artifact/28987096ac | here]. | < | | 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 | clear-signing prefix. The <b>Z</b> card is a sanity check to prove that the manifest is well-formed and consistent. A sample manifest from Fossil itself can be seen [/artifact/28987096ac | here]. <h3 id="cluster">2.2 Clusters</h3> A cluster is an artifact that declares the existence of other artifacts. Clusters are used during repository synchronization to help reduce network traffic. As such, clusters are an optimization and may be removed from a repository without loss or damage to the underlying project code. |
| ︙ | ︙ | |||
280 281 282 283 284 285 286 | the <b>Z</b> card of a manifest. The argument to the <b>Z</b> card is the lower-case hexadecimal representation of the MD5 checksum of all prior cards in the cluster. The <b>Z</b> card is required. An example cluster from Fossil can be seen [/artifact/d03dbdd73a2a8 | here]. | < | | 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 | the <b>Z</b> card of a manifest. The argument to the <b>Z</b> card is the lower-case hexadecimal representation of the MD5 checksum of all prior cards in the cluster. The <b>Z</b> card is required. An example cluster from Fossil can be seen [/artifact/d03dbdd73a2a8 | here]. <h3 id="ctrl">2.3 Control Artifacts</h3> Control artifacts are used to assign properties to other artifacts within the repository. Allowed cards in a control artifact are as follows: <blockquote> <b>D</b> <i>time-and-date-stamp</i><br /> |
| ︙ | ︙ | |||
334 335 336 337 338 339 340 | The <b>U</b> card is the name of the user that created the control artifact. The <b>Z</b> card is the usual required artifact checksum. An example control artifact can be seen [/info/9d302ccda8 | here]. | < | | 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 | The <b>U</b> card is the name of the user that created the control artifact. The <b>Z</b> card is the usual required artifact checksum. An example control artifact can be seen [/info/9d302ccda8 | here]. <h3 id="wikichng">2.4 Wiki Pages</h3> A wiki artifact defines a single version of a single wiki page. Wiki artifacts accept the following card types: <blockquote> |
| ︙ | ︙ | |||
378 379 380 381 382 383 384 | of user George Krivov and is not currently used or generated by the implementation. Older versions of Fossil will reject a wiki-page artifact that includes a <b>C</b> card. An example wiki artifact can be seen [/artifact?name=7b2f5fd0e0&txt=1 | here]. | < | | 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 | of user George Krivov and is not currently used or generated by the implementation. Older versions of Fossil will reject a wiki-page artifact that includes a <b>C</b> card. An example wiki artifact can be seen [/artifact?name=7b2f5fd0e0&txt=1 | here]. <h3 id="tktchng">2.5 Ticket Changes</h3> A ticket-change artifact represents a change to a trouble ticket. The following cards are allowed on a ticket change artifact: <blockquote> <b>D</b> <i>time-and-date-stamp</i><br /> <b>J</b> ?<b>+</b>?<i>name</i> ?<i>value</i>?<br /> |
| ︙ | ︙ | |||
424 425 426 427 428 429 430 | on the <b>J</b> card replaces any previous value of the field. The field name and value are both encoded using the character escapes defined for the <b>C</b> card of a manifest. An example ticket-change artifact can be seen [/artifact/91f1ec6af053 | here]. | < | | 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 | on the <b>J</b> card replaces any previous value of the field. The field name and value are both encoded using the character escapes defined for the <b>C</b> card of a manifest. An example ticket-change artifact can be seen [/artifact/91f1ec6af053 | here]. <h3 id="attachment">2.6 Attachments</h3> An attachment artifact associates some other artifact that is the attachment (the source artifact) with a ticket or wiki page or technical note to which the attachment is connected (the target artifact). The following cards are allowed on an attachment artifact: |
| ︙ | ︙ | |||
466 467 468 469 470 471 472 | A single <b>U</b> card gives the name of the user who added the attachment. If an attachment is added anonymously, then the <b>U</b> card may be omitted. The <b>Z</b> card is the usual checksum over the rest of the attachment artifact. The <b>Z</b> card is required. | < | | 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 | A single <b>U</b> card gives the name of the user who added the attachment. If an attachment is added anonymously, then the <b>U</b> card may be omitted. The <b>Z</b> card is the usual checksum over the rest of the attachment artifact. The <b>Z</b> card is required. <h3 id="event">2.7 Technical Notes</h3> A technical note or "technote" artifact (formerly known as an "event" artifact) associates a timeline comment and a page of text (similar to a wiki page) with a point in time. Technotes can be used to record project milestones, release notes, blog entries, process checkpoints, or news articles. The following cards are allowed on an technote artifact: |
| ︙ | ︙ | |||
534 535 536 537 538 539 540 | A single <b>W</b> card provides wiki text for the document associated with the technote. The format of the <b>W</b> card is exactly the same as for a [#wikichng | wiki artifact]. The <b>Z</b> card is the required checksum over the rest of the artifact. | < | | 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 | A single <b>W</b> card provides wiki text for the document associated with the technote. The format of the <b>W</b> card is exactly the same as for a [#wikichng | wiki artifact]. The <b>Z</b> card is the required checksum over the rest of the artifact. <h3 id="forum">2.8 Forum Posts</h3> Forum posts are intended as a mechanism for users and developers to discuss a project. Forum posts are like messages on a mailing list. The following cards are allowed on an forum post artifact: <blockquote> |
| ︙ | ︙ | |||
609 610 611 612 613 614 615 | A single <b>W</b> card provides wiki text for the forum post. The format of the <b>W</b> card is exactly the same as for a [#wikichng | wiki artifact]. The <b>Z</b> card is the required checksum over the rest of the artifact. | < | | 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 | A single <b>W</b> card provides wiki text for the forum post. The format of the <b>W</b> card is exactly the same as for a [#wikichng | wiki artifact]. The <b>Z</b> card is the required checksum over the rest of the artifact. <h2 id="summary">3.0 Card Summary</h2> The following table summarizes the various kinds of cards that appear on Fossil artifacts. A blank entry means that combination of card and artifact is not legal. A number or range of numbers indicates the number of times a card may (or must) appear in the corresponding artifact type. e.g. a value of 1 indicates a required unique card and 1+ indicates that one or more such cards are required. |
| ︙ | ︙ | |||
885 886 887 888 889 890 891 | 4) [#forum | Forum Posts] must have either one H-card or one I-card, not both. 5) [#forum | Forum Post] P-cards may have only a single parent hash. i.e. they may not have merge parents. | < | < | | 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 | 4) [#forum | Forum Posts] must have either one H-card or one I-card, not both. 5) [#forum | Forum Post] P-cards may have only a single parent hash. i.e. they may not have merge parents. <h2 id="addenda">4.0 Addenda</h2> This section contains additional information which may be useful when implementing algorithms described above. <h3 id="outofordercards">4.1 Relaxed Card Ordering Due To An Historical Bug</h3> All cards of a structural artifact should be in lexicographical order. The Fossil implementation verifies this and rejects any structural artifact which has out-of-order cards. Futhermore, when Fossil is generating new structural artifacts, it runs the generated artifact through the parser to confirm that all cards really are in the correct order before committing the transaction. In this way, Fossil prevents |
| ︙ | ︙ |
Changes to www/gitusers.md.
| ︙ | ︙ | |||
714 715 716 717 718 719 720 | There is only one sub-feature of `git rebase` that is philosophically compatible with Fossil yet which currently has no functional equivalent. We cover [this and the workaround for it](#csplit) above. [3]: ./rebaseharm.md | | | 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 | There is only one sub-feature of `git rebase` that is philosophically compatible with Fossil yet which currently has no functional equivalent. We cover [this and the workaround for it](#csplit) above. [3]: ./rebaseharm.md ## <a id="cdiff"></a> Colorized Diffs The graphical diffs in the Fossil web UI and `fossil diff --tk` use color to distinguish insertions, deletions, and replacements, but unlike with `git diff` when the output is to an ANSI X3.64 capable terminal, `fossil diff` does not. There are a few easy ways to add this feature to Fossil, though. |
| ︙ | ︙ | |||
751 752 753 754 755 756 757 | ## <a id="show"></a> Showing Information About Commits While there is no direct equivalent to Git’s “`show`” command, similar functionality may be present in Fossil under other commands: | | | 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 |
## <a id="show"></a> Showing Information About Commits
While there is no direct equivalent to Git’s “`show`” command, similar
functionality may be present in Fossil under other commands:
#### <a id="patch"></a> Show A Patch For A Commit
git show -p COMMIT_ID
…gives much the same output as
fossil diff --checkin COMMIT_ID
|
| ︙ | ︙ | |||
776 777 778 779 780 781 782 |
fossil diff --checkin tip
[devorg]: ./fossil-v-git.wiki#devorg
[LKML]: https://lkml.org/
| | | | 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 |
fossil diff --checkin tip
[devorg]: ./fossil-v-git.wiki#devorg
[LKML]: https://lkml.org/
#### <a id="cmsg"></a> Show A Specific Commit Message
git show -s COMMIT_ID
…is
fossil time -n 1 COMMIT_ID
…or with a shorter, more obvious command, though with more verbose output:
fossil info COMMIT_ID
The `fossil info` command isn’t otherwise a good equivalent to
`git show`; it just overlaps its functionality in some areas. Much of
what’s missing is present in the corresponding [`/info` web
view][infow], though.
#### <a id="dstat"></a> Diff Statistics
Fossil’s closest internal equivalent to commands like
`git show --stat` is:
fossil diff -i --from 2020-04-01 --numstat
The `--numstat` output is a bit cryptic, so we recommend delegating
|
| ︙ | ︙ |
Changes to www/globs.md.
| ︙ | ︙ | |||
280 281 282 283 284 285 286 | settings` commands. That advice does not help you when you are giving one-off glob patterns in `fossil` commands. The remainder of this section gives remedies and workarounds for these problems. | | | 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 | settings` commands. That advice does not help you when you are giving one-off glob patterns in `fossil` commands. The remainder of this section gives remedies and workarounds for these problems. ### <a id="posix"></a>POSIX Systems If you are using Fossil on a system with a POSIX-compatible shell — Linux, macOS, the BSDs, Unix, Cygwin, WSL etc. — the shell may expand the glob patterns before passing the result to the `fossil` executable. Sometimes this is exactly what you want. Consider this command for |
| ︙ | ︙ | |||
367 368 369 370 371 372 373 | above to make sure the right set of files were scheduled for insertion into the repository before checking the changes in. You never want to accidentally check something like a password, an API key, or the private half of a public cryptographic key into Fossil repository that can be read by people who should not have such secrets. | | | 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 | above to make sure the right set of files were scheduled for insertion into the repository before checking the changes in. You never want to accidentally check something like a password, an API key, or the private half of a public cryptographic key into Fossil repository that can be read by people who should not have such secrets. ### <a id="windows"></a>Windows Before we get into Windows-specific details here, beware that this section does not apply to the several Microsoft Windows extensions that provide POSIX semantics to Windows, for which you want to use the advice in [the POSIX section above](#posix) instead: * the ancient and rarely-used [Microsoft POSIX subsystem][mps]; |
| ︙ | ︙ |
Changes to www/inout.wiki.
| ︙ | ︙ | |||
22 23 24 25 26 27 28 | The --git option is not actually required. The git-fast-export file format is currently the only VCS interchange format that Fossil understands. But future versions of Fossil might be enhanced to understand other VCS interchange formats, and so for compatibility, use of the --git option is recommended. | | | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | The --git option is not actually required. The git-fast-export file format is currently the only VCS interchange format that Fossil understands. But future versions of Fossil might be enhanced to understand other VCS interchange formats, and so for compatibility, use of the --git option is recommended. <a id="fx_git"></a> Note that in new imports, Fossil defaults to using the email component of the Git <em>committer</em> (or <em>author</em> if <code>--use-author</code> is passed) to attribute check-ins in the imported repository. Alternatively, the [/help?cmd=import | <code>--attribute</code>] option can be passed to have all commits by a given committer attributed to a desired username. This will create and populate the new <code>fx_git</code> table in the repository database to maintain a record of correspondent usernames and email addresses that can be |
| ︙ | ︙ |
Changes to www/interwiki.md.
| ︙ | ︙ | |||
55 56 57 58 59 60 61 | 3. <b>Wiki Links</b> → An PageName that is not a Path or Hash. The Intermap defines a base URL for each Tag. Path links are appended directly to the URL contained in the Intermap. The Intermap can define additional text to put in between the base URL and the PageName for Hash and Wiki links, respectively. | | | 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 3. <b>Wiki Links</b> → An PageName that is not a Path or Hash. The Intermap defines a base URL for each Tag. Path links are appended directly to the URL contained in the Intermap. The Intermap can define additional text to put in between the base URL and the PageName for Hash and Wiki links, respectively. <a id="intermap"></a> ## Intermap The intermap defines a mapping from interwiki Tags to full URLs. The Intermap can be viewed and managed using the [fossil interwiki][iwiki] command or the [/intermap][imap] webpages. [iwiki]: /help?cmd=interwiki |
| ︙ | ︙ |
Changes to www/makefile.wiki.
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | want to compile the code themselves can use one of the [./build.wiki | existing makefiles]. So must people do not need to be concerned with the build complexities of Fossil. But hard-core developers who desire a deep understanding of how Fossil is put together can benefit from reviewing this article. | < | | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | want to compile the code themselves can use one of the [./build.wiki | existing makefiles]. So must people do not need to be concerned with the build complexities of Fossil. But hard-core developers who desire a deep understanding of how Fossil is put together can benefit from reviewing this article. <h1 id="srctour">2.0 Source Code Tour</h1> The source code for Fossil is found in the [/dir?ci=trunk&name=src | src/] subdirectory of the source tree. The src/ subdirectory contains all code, including the code for the separate preprocessor programs. Each preprocessor program is a separate C program implemented in |
| ︙ | ︙ | |||
169 170 171 172 173 174 175 | </pre></blockquote> At the time of this writing, the "diff.tcl" script (a Tcl/Tk script used to generate implement --tk option on the diff command) is the only resource file processed using mkbuiltin.exe. However, new resources will likely be added using this facility in future versions of Fossil. | < | | 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 | </pre></blockquote> At the time of this writing, the "diff.tcl" script (a Tcl/Tk script used to generate implement --tk option on the diff command) is the only resource file processed using mkbuiltin.exe. However, new resources will likely be added using this facility in future versions of Fossil. <h1 id="preprocessing">4.0 Preprocessing</h1> There are three preprocessors for the Fossil sources. The mkindex and translate preprocessors can be run in any order. The makeheaders preprocessor must be run after translate. <h2>4.1 The mkindex preprocessor</h2> |
| ︙ | ︙ |
Changes to www/mirrortogithub.md.
| ︙ | ︙ | |||
141 142 143 144 145 146 147 |
abovementioned generic address be used.
[attr]: /help?cmd=import
[fxgit]: ./inout.wiki#fx_git
[ui]: /help?cmd=ui
[usercmd]: /help?cmd=user
| | | | 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
abovementioned generic address be used.
[attr]: /help?cmd=import
[fxgit]: ./inout.wiki#fx_git
[ui]: /help?cmd=ui
[usercmd]: /help?cmd=user
## <a id='ex1'></a>Example GitHub Mirrors
As of this writing (2019-03-16) Fossil’s own repository is mirrored
on GitHub at:
>
<https://github.com/drhsqlite/fossil-mirror>
|
| ︙ | ︙ |
Changes to www/mkindex.tcl.
| ︙ | ︙ | |||
166 167 168 169 170 171 172 | <li> <a href='../COPYRIGHT-BSD2.txt'>License</a> <li> <a href='userlinks.wiki'>Miscellaneous Docs for Fossil Users</a> <li> <a href='hacker-howto.wiki'>Fossil Developer's Guide</a> <li> <a href='$ROOT/wiki?name=To+Do+List'>To Do List (Wiki)</a> <li> <a href='http://fossil-scm.org/schimpf-book/home'>Jim Schimpf's book</a> </ul> | < | | 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
<li> <a href='../COPYRIGHT-BSD2.txt'>License</a>
<li> <a href='userlinks.wiki'>Miscellaneous Docs for Fossil Users</a>
<li> <a href='hacker-howto.wiki'>Fossil Developer's Guide</a>
<li> <a href='$ROOT/wiki?name=To+Do+List'>To Do List (Wiki)</a>
<li> <a href='http://fossil-scm.org/schimpf-book/home'>Jim Schimpf's
book</a>
</ul>
<h2 id="pindex">Other Documents:</h2>
<ul>}
foreach entry $permindex {
foreach {title file bold} $entry break
# if {$bold} {set title <b>$title</b>}
if {[string match /* $file]} {set file ../../..$file}
puts $out "<li><a href=\"$file\">$title</a></li>"
}
|
| ︙ | ︙ |
Changes to www/permutedindex.html.
| ︙ | ︙ | |||
15 16 17 18 19 20 21 | <li> <a href='../COPYRIGHT-BSD2.txt'>License</a> <li> <a href='userlinks.wiki'>Miscellaneous Docs for Fossil Users</a> <li> <a href='hacker-howto.wiki'>Fossil Developer's Guide</a> <li> <a href='$ROOT/wiki?name=To+Do+List'>To Do List (Wiki)</a> <li> <a href='http://fossil-scm.org/schimpf-book/home'>Jim Schimpf's book</a> </ul> | < | | 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <li> <a href='../COPYRIGHT-BSD2.txt'>License</a> <li> <a href='userlinks.wiki'>Miscellaneous Docs for Fossil Users</a> <li> <a href='hacker-howto.wiki'>Fossil Developer's Guide</a> <li> <a href='$ROOT/wiki?name=To+Do+List'>To Do List (Wiki)</a> <li> <a href='http://fossil-scm.org/schimpf-book/home'>Jim Schimpf's book</a> </ul> <h2 id="pindex">Other Documents:</h2> <ul> <li><a href="tech_overview.wiki">A Technical Overview Of The Design And Implementation Of Fossil</a></li> <li><a href="serverext.wiki">Adding Extensions To A Fossil Server Using CGI Scripts</a></li> <li><a href="adding_code.wiki">Adding New Features To Fossil</a></li> <li><a href="caps/">Administering User Capabilities</a></li> <li><a href="backup.md">Backing Up a Remote Fossil Repository</a></li> <li><a href="whyusefossil.wiki">Benefits Of Version Control</a></li> |
| ︙ | ︙ |
Changes to www/rebaseharm.md.
| ︙ | ︙ | |||
12 13 14 15 16 17 18 | Most people, even strident advocates of rebase, agree that rebase can cause problems when misused. The Git rebase documentation talks about the [golden rule of rebasing][golden]: never rebase on a public branch. Horror stories of misused rebase abound, and the rebase documentation devotes considerable space toward explaining how to recover from rebase errors and/or misuse. | | | | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | Most people, even strident advocates of rebase, agree that rebase can cause problems when misused. The Git rebase documentation talks about the [golden rule of rebasing][golden]: never rebase on a public branch. Horror stories of misused rebase abound, and the rebase documentation devotes considerable space toward explaining how to recover from rebase errors and/or misuse. ## <a id="cap-loss"></a>2.0 Rebase provides no new capabilities Sometimes sharp and dangerous tools are justified, because they accomplish things that cannot be done otherwise, or at least cannot be done easily. Rebase does not fall into that category, because it provides no new capabilities. ### <a id="orphaning"></a>2.1 A rebase is just a merge with historical references omitted A rebase is really nothing more than a merge (or a series of merges) that deliberately forgets one of the parents of each merge step. To help illustrate this fact, consider the first rebase example from the [Git documentation][gitrebase]. The merge looks like this: |
| ︙ | ︙ | |||
86 87 88 89 90 91 92 | So, another way of thinking about rebase is that it is a kind of merge that intentionally forgets some details in order to not overwhelm the weak history display mechanisms available in Git. Wouldn't it be better, less error-prone, and easier on users to enhance the history display mechanisms in Git so that rebasing for a clean, linear history became unnecessary? | | | 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | So, another way of thinking about rebase is that it is a kind of merge that intentionally forgets some details in order to not overwhelm the weak history display mechanisms available in Git. Wouldn't it be better, less error-prone, and easier on users to enhance the history display mechanisms in Git so that rebasing for a clean, linear history became unnecessary? ### <a id="clean-diffs"></a>2.2 Rebase does not actually provide better feature-branch diffs Another argument, often cited, is that rebasing a feature branch allows one to see just the changes in the feature branch without the concurrent changes in the main line of development. Consider a hypothetical case: ~~~ pikchr toggle |
| ︙ | ︙ | |||
210 211 212 213 214 215 216 | diff is not determined by whether you select C7 or C5\' as the target of the diff, but rather by your choice of the diff source, C2 or C6. So, to help with the problem of viewing changes associated with a feature branch, perhaps what is needed is not rebase but rather better tools to help users identify an appropriate baseline for their diffs. | | | 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 | diff is not determined by whether you select C7 or C5\' as the target of the diff, but rather by your choice of the diff source, C2 or C6. So, to help with the problem of viewing changes associated with a feature branch, perhaps what is needed is not rebase but rather better tools to help users identify an appropriate baseline for their diffs. ## <a id="siloing"></a>3.0 Rebase encourages siloed development The [golden rule of rebasing][golden] is that you should never do it on public branches, so if you are using rebase as intended, that means you are keeping private branches. Or, to put it another way, you are doing siloed development. You are not sharing your intermediate work with collaborators. This is not good for product quality. |
| ︙ | ︙ | |||
249 250 251 252 253 254 255 | Given that, is it better for those many eyeballs to find your problems while they're still isolated on a feature branch, or should that vetting wait until you finally push a collapsed version of a private working branch to the parent repo? Will the many eyeballs even see those errors when they’re intermingled with code implementing some compelling new feature? | | | 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 | Given that, is it better for those many eyeballs to find your problems while they're still isolated on a feature branch, or should that vetting wait until you finally push a collapsed version of a private working branch to the parent repo? Will the many eyeballs even see those errors when they’re intermingled with code implementing some compelling new feature? ## <a id="timestamps"></a>4.0 Rebase causes timestamp confusion Consider the earlier example of rebasing a feature branch: ~~~ pikchr toggle # Copy of second diagram in section 2.2 above scale = 0.8 circle "C0" fit fill white |
| ︙ | ︙ | |||
291 292 293 294 295 296 297 | system clocks, so they are not unique to rebase, but they are very confusing and so best avoided. The other option is to provide new unique timestamps for C3' and C5' but then you lose the information about when those check-ins were originally created, which can make historical analysis of changes more difficult. It might also complicate the legal defense of prior art claims. | | | 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 | system clocks, so they are not unique to rebase, but they are very confusing and so best avoided. The other option is to provide new unique timestamps for C3' and C5' but then you lose the information about when those check-ins were originally created, which can make historical analysis of changes more difficult. It might also complicate the legal defense of prior art claims. ## <a id="lying"></a>5.0 Rebase misrepresents the project history By discarding parentage information, rebase attempts to deceive the reader about how the code actually came together. Git’s rebase feature is more than just an alternative to merging: it also provides mechanisms for changing the project history in order to make editorial changes. Fossil shows that |
| ︙ | ︙ | |||
327 328 329 330 331 332 333 | Git needs rebase because it lacks these annotation facilities. Rather than consider rebase a desirable feature missing in Fossil, ask instead why Git lacks support for making editorial changes to check-ins without modifying history? Wouldn't it be better to fix the version control tool rather than requiring users to fabricate a fictitious project history? | | | | 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 | Git needs rebase because it lacks these annotation facilities. Rather than consider rebase a desirable feature missing in Fossil, ask instead why Git lacks support for making editorial changes to check-ins without modifying history? Wouldn't it be better to fix the version control tool rather than requiring users to fabricate a fictitious project history? ## <a id="collapsing"></a>6.0 Collapsing check-ins throws away valuable information One of the oft-cited advantages of rebasing in Git is that it lets you collapse multiple check-ins down to a single check-in to make the development history “clean.” The intent is that development appear as though every feature were created in a single step: no multi-step evolution, no back-tracking, no false starts, no mistakes. This ignores actual developer psychology: ideas rarely spring forth from fingers to files in faultless finished form. A wish for collapsed, finalized check-ins is a wish for a counterfactual situation. The common counterargument is that collapsed check-ins represent a better world, the ideal we're striving for. What that argument overlooks is that we must throw away valuable information to get there. ### <a id="empathy"></a>6.1 Individual check-ins support mutual understanding Ideally, future developers of our software can understand every feature in it using only context available in the version of the code they start work with. Prior to widespread version control, developers had no choice but to work that way. Pre-existing codebases could only be understood as-is or not at all. Developers in that world had an incentive to develop software that was easy to understand retrospectively, even if |
| ︙ | ︙ | |||
387 388 389 390 391 392 393 | check-in it was a part of — and then to understand the surrounding check-ins as necessary — than it is to understand a 500-line check-in that collapses a whole branch's worth of changes down to a single finished feature. [sdm]: ./fossil-v-git.wiki#durable | | | | | 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 | check-in it was a part of — and then to understand the surrounding check-ins as necessary — than it is to understand a 500-line check-in that collapses a whole branch's worth of changes down to a single finished feature. [sdm]: ./fossil-v-git.wiki#durable ### <a id="bisecting"></a>6.2 Bisecting works better on small check-ins Git lets a developer write a feature in ten check-ins but collapse it down to an eleventh check-in and then deliberately push only that final collapsed check-in to the parent repo. Someone else may then do a bisect that blames the merged check-in as the source of the problem they’re chasing down; they then have to manually work out which of the 10 steps the original developer took to create it to find the source of the actual problem. An equivalent push in Fossil will send all 11 check-ins to the parent repository so that a later investigator doing the same sort of bisect sees the complete check-in history. That bisect will point the investigator at the single original check-in that caused the problem. ### <a id="comments"></a>6.3 Multiple check-ins require multiple check-in comments The more comments you have from a given developer on a given body of code, the more concise documentation you have of that developer's thought process. To resume the bisecting example, a developer trying to work out what the original developer was thinking with a given change will have more success given a check-in comment that explains what the one check-in out of ten blamed by the "bisect" command was trying to accomplish than if they must work that out from the eleventh check-in's comment, which only explains the "clean" version of the collapsed feature. ### <a id="cherrypicking"></a>6.4 Cherry-picks work better with small check-ins While working on a new feature in one branch, you may come across a bug in the pre-existing code that you need to fix in order for work on that feature to proceed. You could choose to switch briefly back to the parent branch, develop the fix there, check it in, then merge the parent back up to the feature branch in order to continue work, but that's distracting. If the fix isn't for a critical bug, fixing it on the |
| ︙ | ︙ | |||
456 457 458 459 460 461 462 | complete. If a support organization must manually disentangle a fix from a feature check-in, they are likely to introduce new bugs on the stable branch. Even if they manage to do their work without error, it takes them more time to do the cherry-pick that way. [rh]: https://en.wikipedia.org/wiki/Red_Hat | | | | 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 | complete. If a support organization must manually disentangle a fix from a feature check-in, they are likely to introduce new bugs on the stable branch. Even if they manage to do their work without error, it takes them more time to do the cherry-pick that way. [rh]: https://en.wikipedia.org/wiki/Red_Hat ### <a id="backouts"></a>6.5 Back-outs also work better with small check-ins The inverse of the cherry-pick merge is the back-out merge. If you push only a collapsed version of a private working branch up to the parent repo, those working from that parent repo cannot automatically back out any of the individual check-ins that went into that private branch. Others must either manually disentangle the problematic part of your merge check-in or back out the entire feature. ## <a id="better-plan"></a>7.0 Cherry-pick merges work better than rebase Perhaps there are some cases where a rebase-like transformation is actually helpful, but those cases are rare, and when they do come up, running a series of cherry-pick merges achieves the same topology with several advantages: 1. In Fossil, cherry-pick merges preserve an honest and clear record |
| ︙ | ︙ | |||
499 500 501 502 503 504 505 |
`git reset --hard` to repair the damage.
3. Cherry-picks keep both the original and the revised check-ins,
so both timestamps are preserved.
[tbc]: ./fossil-v-git.wiki#testing
| | | 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 |
`git reset --hard` to repair the damage.
3. Cherry-picks keep both the original and the revised check-ins,
so both timestamps are preserved.
[tbc]: ./fossil-v-git.wiki#testing
## <a id="conclusion"></a>8.0 Summary and conclusion
Rebasing is an anti-pattern. It is dishonest. It deliberately
omits historical information. It causes problems for collaboration.
And it has no offsetting benefits.
For these reasons, rebase is intentionally and deliberately omitted
from the design of Fossil.
[golden]: https://www.atlassian.com/git/tutorials/merging-vs-rebasing#the-golden-rule-of-rebasing
[gitrebase]: https://git-scm.com/book/en/v2/Git-Branching-Rebasing
[nagappan]: https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-2008-11.pdf
[weinberg]: https://books.google.com/books?id=76dIAAAAMAAJ
|
Changes to www/server/any/stunnel.md.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | that made the request. You can run `stunnel` in one of two modes: socket listener — much like in our [`inetd` doc](./inetd.md) — and as an HTTP reverse proxy. We’ll cover both cases here, separately. | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
that made the request.
You can run `stunnel` in one of two modes: socket listener — much like
in our [`inetd` doc](./inetd.md) — and as an HTTP reverse proxy. We’ll
cover both cases here, separately.
## <a id="sa"></a>Socket Activation
The following `stunnel.conf` configuration configures it to run Fossil
in socket listener mode, launching Fossil only when an HTTPS hit comes
in, then shutting it back down as soon as the transaction is complete:
```dosini
[fossil]
|
| ︙ | ︙ | |||
45 46 47 48 49 50 51 | It is important that the [`fossil http`](/help/http) command in that configuration include the `--https` option to let Fossil know to use “`https://`” instead of “`http://`” in generated hyperlinks. | | | 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | It is important that the [`fossil http`](/help/http) command in that configuration include the `--https` option to let Fossil know to use “`https://`” instead of “`http://`” in generated hyperlinks. ## <a id="proxy"></a>Reverse Proxy You can instead have Fossil running in the background in [standalone HTTP server mode](./none.md), bound to a high random TCP port number on localhost via the `--localhost` and `--port` flags, then configure `stunnel` to reverse proxy public HTTPS connections down to it via HTTP. The configuration is the same as the above except that you drop the |
| ︙ | ︙ | |||
73 74 75 76 77 78 79 |
than in socket listener mode, where the Fossil binary has to be
loaded and re-initialized on each HTTPS hit.
2. The socket listener mode doesn’t work on all platforms that
`stunnel` runs on, particularly [on Windows](../windows/stunnel.md).
*[Return to the top-level Fossil server article.](../)*
| > > | 73 74 75 76 77 78 79 80 81 |
than in socket listener mode, where the Fossil binary has to be
loaded and re-initialized on each HTTPS hit.
2. The socket listener mode doesn’t work on all platforms that
`stunnel` runs on, particularly [on Windows](../windows/stunnel.md).
*[Return to the top-level Fossil server article.](../)*
<div style="height:50em" id="this-space-intentionally-left-blank"></div>
|
Changes to www/server/debian/nginx.md.
| ︙ | ︙ | |||
14 15 16 17 18 19 20 | details depend on the host OS and web stack details. Besides, TLS is widely considered part of the baseline configuration these days. [scgii]: ../any/scgi.md [vps]: https://en.wikipedia.org/wiki/Virtual_private_server | | | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | details depend on the host OS and web stack details. Besides, TLS is widely considered part of the baseline configuration these days. [scgii]: ../any/scgi.md [vps]: https://en.wikipedia.org/wiki/Virtual_private_server ## <a id="benefits"></a>Benefits This scheme is considerably more complicated than the [standalone HTTP server](../any/none.md) and [CGI options](../any/cgi.md). Even with the benefit of this guide and pre-built binary packages, it requires quite a bit of work to set it up. Why should you put up with this complexity? Because it gives many benefits that are difficult or impossible to get with the less complicated options: |
| ︙ | ︙ | |||
57 58 59 60 61 62 63 | world and interior site services like Fossil. It allows Fossil to participate seamlessly as part of a larger web stack. * **Availability** — nginx is already in most operating system binary package repositories, so you don’t need to go out of your way to get it. | | | 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
world and interior site services like Fossil. It allows Fossil to
participate seamlessly as part of a larger web stack.
* **Availability** — nginx is already in most operating system binary
package repositories, so you don’t need to go out of your way to get it.
## <a id="modes"></a>Fossil Service Modes
Fossil provides four major ways to access a repository it’s serving
remotely, three of which are straightforward to use with nginx:
* **HTTP** — Fossil has [a built-in HTTP server](../any/none.md).
While this method is efficient and it’s
possible to use nginx to proxy access to another HTTP server, we
|
| ︙ | ︙ | |||
92 93 94 95 96 97 98 |
without its performance problems.
SCGI it is, then.
[scgip]: https://en.wikipedia.org/wiki/Simple_Common_Gateway_Interface
| | | | | 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
without its performance problems.
SCGI it is, then.
[scgip]: https://en.wikipedia.org/wiki/Simple_Common_Gateway_Interface
## <a id="deps"></a>Installing the Dependencies
The first step is to install some non-default packages we’ll need. SSH into
your server, then say:
$ sudo apt install fossil nginx
You can leave “`fossil`” out of that if you’re building Fossil from
source to get a more up-to-date version than is shipped with the host
OS.
## <a id="scgi"></a>Running Fossil in SCGI Mode
For the following nginx configuration to work, it needs to contact a
Fossil instance speaking the SCGI protocol. There are [many ways](../)
to set that up. For Debian type systems, we recommend
following [our systemd system service guide](service.md).
There are other ways to arrange for Fossil to run as a service backing
nginx, but however you do it, you need to match up the TCP port numbers between it
and those in the nginx configuration below.
## <a id="config"></a>Configuration
On Debian and Ubuntu systems the primary user-level configuration file
for nginx is `/etc/nginx/sites-enabled/default`. I recommend that this
file contain only a list of include statements, one for each site that
server hosts:
include local/example.com
|
| ︙ | ︙ | |||
192 193 194 195 196 197 198 | on a single server. The configuration for `foo.net` is similar. See [the nginx docs](https://nginx.org/en/docs/) for more ideas. | | | 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 | on a single server. The configuration for `foo.net` is similar. See [the nginx docs](https://nginx.org/en/docs/) for more ideas. ## <a id="http"></a>Proxying HTTP Anyway [Above](#modes), we argued that proxying SCGI is a better option than making nginx reinterpret Fossil’s own implementation of HTTP. If you want Fossil to speak HTTP, just [set Fossil up as a standalone server](../any/none.md). And if you want nginx to [provide TLS encryption for Fossil](#tls), proxying HTTP instead of SCGI provides no benefit. |
| ︙ | ︙ | |||
216 217 218 219 220 221 222 | The most common thing people get wrong when hand-rolling a configuration like this is to get the slashes wrong. Fossil is sensitive to this. For instance, Fossil will not collapse double slashes down to a single slash, as some other HTTP servers will. | | | | 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
The most common thing people get wrong when hand-rolling a configuration
like this is to get the slashes wrong. Fossil is sensitive to this. For
instance, Fossil will not collapse double slashes down to a single
slash, as some other HTTP servers will.
## <a id="large-uv"></a> Allowing Large Unversioned Files
By default, nginx only accepts HTTP messages [up to a
meg](http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size)
in size. Fossil chunks its sync protocol such that this is not normally
a problem, but when sending [unversioned content][uv], it uses a single
message for the entire file. Therefore, if you will be storing files
larger than this limit as unversioned content, you need to raise the
limit. Within the `location` block:
# Allow large unversioned file uploads, such as PDFs
client_max_body_size 20M;
[uv]: ../../unvers.wiki
## <a id="fail2ban"></a> Integrating `fail2ban`
One of the nice things that falls out of proxying Fossil behind nginx is
that it makes it easier to configure `fail2ban` to recognize attacks on
Fossil and automatically block them. Fossil logs the sorts of errors we
want to detect, but it does so in places like the repository’s admin
log, a SQL table, which `fail2ban` doesn’t know how to query. By putting
Fossil behind an nginx proxy, we convert these failures to log file
|
| ︙ | ︙ | |||
277 278 279 280 281 282 283 | There’s a [lot more you can do][dof2b], but that gets us out of scope of this guide. [dof2b]: https://www.digitalocean.com/community/tutorials/how-to-protect-an-nginx-server-with-fail2ban-on-ubuntu-14-04 | | | 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 | There’s a [lot more you can do][dof2b], but that gets us out of scope of this guide. [dof2b]: https://www.digitalocean.com/community/tutorials/how-to-protect-an-nginx-server-with-fail2ban-on-ubuntu-14-04 ## <a id="tls"></a> Adding TLS (HTTPS) Support One of the [many ways](../../ssl.wiki) to provide TLS-encrypted HTTP access (a.k.a. HTTPS) to Fossil is to run it behind a web proxy that supports TLS. One such option is nginx on Debian, so we show the details of that here. You can extend this guide to other operating systems by following the |
| ︙ | ︙ |
Changes to www/server/openbsd/fastcgi.md.
| ︙ | ︙ | |||
10 11 12 13 14 15 16 | a single directory within a chroot, and allow `ssh` access to create new repositories remotely. **NOTE:** The following instructions assume an OpenBSD 6.7 installation. [httpd]: https://www.openbsd.org/papers/httpd-asiabsdcon2015.pdf | | | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
a single directory within a chroot, and allow `ssh` access to create
new repositories remotely.
**NOTE:** The following instructions assume an OpenBSD 6.7 installation.
[httpd]: https://www.openbsd.org/papers/httpd-asiabsdcon2015.pdf
## <a id="fslinstall"></a>Install Fossil
Use the OpenBSD package manager `pkg_add` to install Fossil, making sure
to select the statically linked binary.
```console
$ doas pkg_add fossil
quirks-3.325 signed on 2020-06-12T06:24:53Z
|
| ︙ | ︙ | |||
60 61 62 63 64 65 66 |
$ doas mkdir /var/www/htdocs/fsl.domain.tld
$ doas touch /var/www/logs/fossil.log
$ doas chown www /var/www/logs/fossil.log
$ doas chmod 660 /var/www/logs/fossil.log
$ doas chmod 755 /var/www/cgi-bin/scm
```
| | | 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
$ doas mkdir /var/www/htdocs/fsl.domain.tld
$ doas touch /var/www/logs/fossil.log
$ doas chown www /var/www/logs/fossil.log
$ doas chmod 660 /var/www/logs/fossil.log
$ doas chmod 755 /var/www/cgi-bin/scm
```
## <a id="chroot"></a>Setup chroot
Fossil needs both `/dev/random` and `/dev/null`, which aren't accessible
from within the chroot, so need to be constructed; `/var`, however, is
mounted with the `nodev` option. Rather than removing this default
setting, create a small memory filesystem and then mount it on to
`/var/www/dev` with [`mount_mfs(8)`][mfs] so that the `random` and
`null` device files can be created. In order to avoid necessitating a
|
| ︙ | ︙ | |||
106 107 108 109 110 111 112 | user who will push to, pull from, and create repositories. ```console $ doas chown -R user:www /var/www/htdocs/fsl.domain.tld $ doas chmod 770 /var/www/htdocs/fsl.domain.tld ``` | | | 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | user who will push to, pull from, and create repositories. ```console $ doas chown -R user:www /var/www/htdocs/fsl.domain.tld $ doas chmod 770 /var/www/htdocs/fsl.domain.tld ``` ## <a id="httpdconfig"></a>Configure httpd On OpenBSD, [httpd.conf(5)][httpd] is the configuration file for `httpd`. To setup the server to serve all Fossil repositores within the directory specified in the CGI script, and automatically redirect standard HTTP requests to HTTPS—apart from [Let's Encrypt][LE] challenges issued in response to [acme-client(1)][acme] certificate requests—create `/etc/httpd.conf` as a privileged user with the |
| ︙ | ︙ | |||
176 177 178 179 180 181 182 | **NOTE:** If not already in possession of a HTTPS certificate, comment out the `https` server block and proceed to securing a free [Let's Encrypt Certificate](#letsencrypt); otherwise skip to [Start `httpd`](#starthttpd). | | | 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | **NOTE:** If not already in possession of a HTTPS certificate, comment out the `https` server block and proceed to securing a free [Let's Encrypt Certificate](#letsencrypt); otherwise skip to [Start `httpd`](#starthttpd). ## <a id="letsencrypt"></a>Let's Encrypt Certificate In order for `httpd` to serve HTTPS, secure a free certificate from Let's Encrypt using `acme-client`. Before issuing the request, however, ensure you have a zone record for the subdomain with your registrar or nameserver. Then open `/etc/acme-client.conf` as a privileged user to configure the request. |
| ︙ | ︙ | |||
237 238 239 240 241 242 243 | /etc/ssl/private: -r-------- 1 root wheel 3.2K Mar 2 01:31:03 2018 domain.tld.key ``` Make sure to reopen `/etc/httpd.conf` to uncomment the second server block responsible for serving HTTPS requests before proceeding. | | | | 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 |
/etc/ssl/private:
-r-------- 1 root wheel 3.2K Mar 2 01:31:03 2018 domain.tld.key
```
Make sure to reopen `/etc/httpd.conf` to uncomment the second server
block responsible for serving HTTPS requests before proceeding.
## <a id="starthttpd"></a>Start `httpd`
With `httpd` configured to serve Fossil repositories out of
`/var/www/htdocs/fsl.domain.tld`, and the certificates and key in place,
enable and start `slowcgi`—OpenBSD's FastCGI wrapper server that will
execute the above Fossil CGI script—before checking that the syntax of
the `httpd.conf` configuration file is correct, and (re)starting the
server (if still running from requesting a Let's Encrypt certificate).
```console
$ doas rcctl enable slowcgi
$ doas rcctl start slowcgi
slowcgi(ok)
$ doas httpd -vnf /etc/httpd.conf
configuration OK
$ doas rcctl start httpd
httpd(ok)
```
## <a id="clientconfig"></a>Configure Client
To facilitate creating new repositories and pushing them to the server,
add the following function to your `~/.cshrc` or `~/.zprofile` or the
config file for whichever shell you are using on your development box.
```sh
finit() {
|
| ︙ | ︙ |
Changes to www/server/windows/iis.md.
| ︙ | ︙ | |||
41 42 43 44 45 46 47 | instructions](../any/none.md) for further details. For a more robust setup, we recommend that you [install Fossil as a Windows service](./service.md), which will allow Fossil to start at system boot, before anyone has logged in interactively. | | | 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | instructions](../any/none.md) for further details. For a more robust setup, we recommend that you [install Fossil as a Windows service](./service.md), which will allow Fossil to start at system boot, before anyone has logged in interactively. ## <a id="install"></a>Install IIS IIS might not be installed in your system yet, so follow the path appropriate to your host OS. We’ve tested only the latest Microsoft OSes as of the time of this writing, but the basic process should be similar on older OSes. |
| ︙ | ︙ |
Changes to www/server/windows/service.md.
| ︙ | ︙ | |||
44 45 46 47 48 49 50 | If you wish to server a directory of repositories, the `fossil winsrv` command requires a slightly different set of options vs. `fossil server`: ``` fossil winsrv create --repository D:/Path/to/Repos --repolist ``` | | | | 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | If you wish to server a directory of repositories, the `fossil winsrv` command requires a slightly different set of options vs. `fossil server`: ``` fossil winsrv create --repository D:/Path/to/Repos --repolist ``` ### <a id='PowerShell'></a>Advanced service installation using PowerShell As great as `fossil winsrv` is, it does not have one to one reflection of all of the `fossil server` [options](/help?cmd=server). When you need to use some of the more advanced options, such as `--https`, `--skin`, or `--extroot`, you will need to use PowerShell to configure and install the Windows service. PowerShell provides the [New-Service](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/new-service?view=powershell-5.1) |
| ︙ | ︙ |
Changes to www/server/windows/stunnel.md.
| ︙ | ︙ | |||
105 106 107 108 109 110 111 |
Get-ChildItem Cert:\LocalMachine\My | Where{$_.FriendlyName -eq "FriendlyName"} |
Export-PfxCertificate -FilePath fossil-scm.pfx -Password $passwd
```
You will now have your certificate stored as a PFX file.
| | | 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
Get-ChildItem Cert:\LocalMachine\My | Where{$_.FriendlyName -eq "FriendlyName"} |
Export-PfxCertificate -FilePath fossil-scm.pfx -Password $passwd
```
You will now have your certificate stored as a PFX file.
<a id="convert"></a>
### Convert Certificate from PFX to PEM
For this step you will need the openssl tools that were installed with stunnel.
```PowerShell
# Add stunnel\bin directory to path for this session.
$env:PATH += ";${env:ProgramFiles(x86)}\stunnel\bin"
|
| ︙ | ︙ |
Changes to www/sync.wiki.
| ︙ | ︙ | |||
28 29 30 31 32 33 34 | some local state is transferred during a [/help?cmd=clone|clone] in order to initialize the local state of the new repository. Also, an administrator can sync local state using the [/help?cmd=configuration|config push] and [/help?cmd=configuration|config pull] commands. | < | | 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | some local state is transferred during a [/help?cmd=clone|clone] in order to initialize the local state of the new repository. Also, an administrator can sync local state using the [/help?cmd=configuration|config push] and [/help?cmd=configuration|config pull] commands. <h3 id="crdt">1.1 Conflict-Free Replicated Datatypes</h3> <p>The "bag of artifacts" data model used by Fossil Fossil is apparently an implementation of a particular [https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type|Conflict-Free Replicated Datatype (CRDT)] called a "G-Set" or "Grow-only Set". The academic literature on CRDTs only began to appear in about 2011, and |
| ︙ | ︙ |
Changes to www/tech_overview.wiki.
| ︙ | ︙ | |||
103 104 105 106 107 108 109 | <li>The "[/help/stash | stash]" <li>Information needed to "[/help/undo|undo]" or "[/help/redo|redo]" </ul> </td> </tr> </table> | < | < | | 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | <li>The "[/help/stash | stash]" <li>Information needed to "[/help/undo|undo]" or "[/help/redo|redo]" </ul> </td> </tr> </table> <h3 id="configdb">2.1 The Configuration Database</h3> The configuration database holds cross-repository preferences and a list of all repositories for a single user. The [/help/settings | fossil settings] command can be used to specify various operating parameters and preferences for Fossil repositories. Settings can apply to a single repository, or they can apply globally to all repositories for a user. If both a global and a repository value exists for a setting, then the repository-specific value takes precedence. All of the settings have reasonable defaults, and so many users will never need to change them. But if changes to settings are desired, the configuration database provides a way to change settings for all repositories with a single command, rather than having to change the setting individually on each repository. The configuration database also maintains a list of repositories. This list is used by the [/help/all | fossil all] command in order to run various operations such as "sync" or "rebuild" on all repositories managed by a user. <h4 id="configloc">2.1.1 Location Of The Configuration Database</h4> On Unix systems, the configuration database is named by the following algorithm: <blockquote><table border="0"> <tr><td>1. if environment variable FOSSIL_HOME exists <td> → <td>$FOSSIL_HOME/.fossil |
| ︙ | ︙ | |||
327 328 329 330 331 332 333 | The "shun" table in the repository database records the hash values for all shunned artifacts. The shun table can be pushed or pulled using the [/help/config | fossil config] command with the "shun" AREA argument. The shun table is also copied during a [/help/clone | clone]. | < | | 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 | The "shun" table in the repository database records the hash values for all shunned artifacts. The shun table can be pushed or pulled using the [/help/config | fossil config] command with the "shun" AREA argument. The shun table is also copied during a [/help/clone | clone]. <h3 id="localdb">2.3 Checkout Databases</h3> Fossil allows a single repository to have multiple working checkouts. Each working checkout has a single database in its root directory that records the state of that checkout. The checkout database is named "_FOSSIL_" or ".fslckout". The checkout database records information such as the following: |
| ︙ | ︙ |
Changes to www/th1-hooks.md.
| ︙ | ︙ | |||
34 35 36 37 38 39 40 | TH1 Hook Related Variables for Web Pages ---------------------------------------- * web\_name -- _Name of web page being rendered._ * web\_args -- _Current web page arguments._ * web\_flags -- _Bitmask of CMDFLAG values for the web page being rendered._ | | | | | | | | | 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
TH1 Hook Related Variables for Web Pages
----------------------------------------
* web\_name -- _Name of web page being rendered._
* web\_args -- _Current web page arguments._
* web\_flags -- _Bitmask of CMDFLAG values for the web page being rendered._
<a id="cmdReturnCodes"></a>TH1 Hook Related Return Codes for Commands
-----------------------------------------------------------------------
* TH\_OK -- _Command will be executed, notification will be executed._
* TH\_ERROR -- _Command will be skipped, notification will be skipped,
error message will be emitted._
* TH\_BREAK -- _Command will be skipped, notification will be skipped._
* TH\_RETURN -- _Command will be executed, notification will be skipped._
* TH\_CONTINUE -- _Command will be skipped, notification will be executed._
For commands that are not included in the Fossil binary, allowing their
execution will cause the standard "unknown command" error message to be
generated, which will typically exit the process. Therefore, adding a
new command generally requires using the TH_CONTINUE return code.
<a id="webReturnCodes"></a>TH1 Hook Related Return Codes for Web Pages
------------------------------------------------------------------------
* TH\_OK -- _Web page will be rendered, notification will be executed._
* TH\_ERROR -- _Web page will be skipped, notification will be skipped,
error message will be emitted._
* TH\_BREAK -- _Web page will be skipped, notification will be skipped._
* TH\_RETURN -- _Web page will be rendered, notification will be skipped._
* TH\_CONTINUE -- _Web page will be skipped, notification will be executed._
For web pages that are not included in the Fossil binary, allowing their
rendering will cause the standard "Not Found" error message to be generated,
which will cause an HTTP 404 status code to be sent. Therefore, adding a
new web page generally requires using the TH_CONTINUE return code.
<a id="triggerReturnCodes"></a>Triggering TH1 Return Codes from a Script
--------------------------------------------------------------------------
* TH\_OK -- _This is the default return code, nothing special needed._
* TH\_ERROR -- _Use the **error** command._
* TH\_BREAK -- _Use the **break** command._
* TH\_RETURN -- _Use the **return -code 5** command._
* TH\_CONTINUE -- _Use the **continue** command._
<a id="command_hook"></a>TH1 command_hook Procedure
-----------------------------------------------------
* command\_hook
This user-defined procedure, if present, is called just before the
execution of a command. The name of the command being executed will
be stored in the "cmd\_name" global variable. The arguments to the
command being executed will be stored in the "cmd\_args" global variable.
The associated CMDFLAG value will be stored in the "cmd\_flags" global
variable. Before exiting, the procedure should trigger the return
<a href="#cmdReturnCodes">code</a> that corresponds to the desired action
to take next.
<a id="command_notify"></a>TH1 command_notify Procedure
---------------------------------------------------------
* command\_notify
This user-defined procedure, if present, is called just after the
execution of a command. The name of the command being executed will
be stored in the "cmd\_name" global variable. The arguments to the
command being executed will be stored in the "cmd\_args" global variable.
The associated CMDFLAG value will be stored in the "cmd\_flags" global
variable. Before exiting, the procedure should trigger the return
<a href="#cmdReturnCodes">code</a> that corresponds to the desired action
to take next.
<a id="webpage_hook"></a>TH1 webpage_hook Procedure
-----------------------------------------------------
* webpage\_hook
This user-defined procedure, if present, is called just before the
rendering of a web page. The name of the web page being rendered will
be stored in the "web\_name" global variable. The arguments to the
web page being rendered will be stored in the "web\_args" global variable.
The associated CMDFLAG value will be stored in the "web\_flags" global
variable. Before exiting, the procedure should trigger the return
<a href="#webReturnCodes">code</a> that corresponds to the desired action
to take next.
<a id="webpage_notify"></a>TH1 webpage_notify Procedure
---------------------------------------------------------
* webpage\_notify
This user-defined procedure, if present, is called just after the
rendering of a web page. The name of the web page being rendered will
be stored in the "web\_name" global variable. The arguments to the
web page being rendered will be stored in the "web\_args" global variable.
The associated CMDFLAG value will be stored in the "web\_flags" global
variable. Before exiting, the procedure should trigger the return
<a href="#webReturnCodes">code</a> that corresponds to the desired action
to take next.
|
Changes to www/whyusefossil.wiki.
| ︙ | ︙ | |||
35 36 37 38 39 40 41 |
<li>Everyone always has the latest code
<li>Failed disk-drives cause no loss of work
<li>Avoid wasting time doing manual file copying
<li>Avoid human errors during manual backups
</ol>
</ol>
| < | | 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<li>Everyone always has the latest code
<li>Failed disk-drives cause no loss of work
<li>Avoid wasting time doing manual file copying
<li>Avoid human errors during manual backups
</ol>
</ol>
<p id="definitions"><b>II. Definitions</b></p>
<ul>
<li><p><b>Project</b> →
a collection of computer files that serve some common
purpose. Often the project is a software application and the
individual files are source code together with makefiles, scripts, and
"README.txt" files. Other examples of projects include books or
|
| ︙ | ︙ |
Changes to www/wikitheory.wiki.
| ︙ | ︙ | |||
63 64 65 66 67 68 69 | <h2>Bug-reports and check-in comments and Forum messages</h2> The comments on check-ins and the text in the descriptions of bug reports both use wiki formatting. Exactly the same set of formatting rules apply. There is never a need to learn one formatting language for documentation and a different markup for bugs or for check-in comments. | < | | 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | <h2>Bug-reports and check-in comments and Forum messages</h2> The comments on check-ins and the text in the descriptions of bug reports both use wiki formatting. Exactly the same set of formatting rules apply. There is never a need to learn one formatting language for documentation and a different markup for bugs or for check-in comments. <h2 id="assocwiki">Auxiliary notes attached to check-ins or branches</h2> Stand-alone wiki pages with special names "branch/<i>BRANCHNAME</i>" or "checkin/<i>HASH</i>" are associated with the corresponding branch or check-in. The wiki text appears in an "About" section of timelines and info screens. Examples: * [/timeline?r=graph-test-branch] shows the text of the |
| ︙ | ︙ |