| ︙ | | | ︙ | |
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
<tr><td>File versioning only</td>
<td>VCS, tickets, wiki, docs, notes, forum, UI,
[https://en.wikipedia.org/wiki/Role-based_access_control|RBAC]</td></tr>
<tr><td>Sprawling, incoherent, and inefficient</td>
<td>Self-contained and efficient</td></tr>
<tr><td>Ad-hoc pile-of-files key/value database</td>
<td>Relational SQL database</td></tr>
<tr><td>Bazaar-style development</td><td>Cathedral-style development</td></tr>
<tr><td>Designed for Linux kernel development</td>
<td>Designed for SQLite development</td></tr>
<tr><td>Many contributors</td>
<td>Select contributors</td></tr>
<tr><td>Focus on individual branches</td>
<td>Focus on the entire tree of changes</td></tr>
|
>
|
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
<tr><td>File versioning only</td>
<td>VCS, tickets, wiki, docs, notes, forum, UI,
[https://en.wikipedia.org/wiki/Role-based_access_control|RBAC]</td></tr>
<tr><td>Sprawling, incoherent, and inefficient</td>
<td>Self-contained and efficient</td></tr>
<tr><td>Ad-hoc pile-of-files key/value database</td>
<td>Relational SQL database</td></tr>
<tr><td>Portable to POSIX systems only</td><td>Runs just about anywhere</td></tr>
<tr><td>Bazaar-style development</td><td>Cathedral-style development</td></tr>
<tr><td>Designed for Linux kernel development</td>
<td>Designed for SQLite development</td></tr>
<tr><td>Many contributors</td>
<td>Select contributors</td></tr>
<tr><td>Focus on individual branches</td>
<td>Focus on the entire tree of changes</td></tr>
|
| ︙ | | | ︙ | |
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
|
Git's source code. If you clone Fossil's self-hosting repository, you
get the entire Fossil website — source code, documentation, ticket
history, and so forth.² That means you get a copy of this very article
and all of its historical versions, plus the same for all of the other
public content on this site.
<h3 id="efficient" name="effective">2.2 Efficient and Effective</h3>
Git is actually a collection of many small tools, each doing one small
part of the job, which can be recombined (by experts) to perform
powerful operations. Git has a lot of complexity and many dependencies,
so that most people end up installing it via some kind of package
manager, simply because these problems are best delegated to people
skilled in the creation of binary softare packages.
Fossil is a single self-contained stand-alone executable with hardly any
dependencies. Fossil can be (and often is) run inside a minimally
configured [https://en.wikipedia.org/wiki/Chroot|chroot jail]. To
install Fossil, one merely puts the executable somewhere in the
<tt>$PATH</tt>.
This difference is especially stark on Windows: you need to drag along a
Cygwin or MSYS environment to get Git running on Windows due to all of
its third-party dependencies. Installing Fossil on Windows is the same
as installing it on every other OS: download the executable and drop it
in the <tt>%PATH%</tt> somewhere.
Some say that Git more closely adheres to the Unix philosophy,
summarized as "many small tools, loosely joined," but we have many
examples of other successful Unix software that violates that principle
to good effect, from Apache to Python to ZFS. We can infer from that
that this is not an absolute principle of good software design.
Sometimes "many features, tightly-coupled" works better. What actually
matters is effectiveness and efficiency. We believe Fossil achieves
this.
Git fails on efficiency once you add to it all of the third-party
software needed to give it a Fossil-equivalent feature set. Consider
[https://about.gitlab.com/|Gitlab], a third-party extension to Git
wrapping it in many features, making int roughly Fossil-equivalent,
though [https://docs.gitlab.com/ee/install/requirements.html|much more
resource hungry] and hence more costly to run than the equivalent
Fossil setup. Gitlab's requirements are tolerable when you're dedicating
a local rack server or blade to it, since that's about the smallest
thing you could call a "server" these days, but when you go to host that
in the cloud, you can expect to pay about 8⨉ as much to comfortably host
Gitlab as for Fossil. This difference is largely due to basic
technology choices: Ruby and PostgreSQL vs C and SQLite.
The Fossil project itself is [./selfhost.wiki|hosted on a very small
VPS], and we've received many reports on the Fossil forum about people
successfully hosting Fossil service on bare-bones $5/month VPS hosts,
spare Raspberry Pi boards, and other small hosts.
|
|
|
|
>
|
<
<
<
<
<
<
<
|
|
|
|
|
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
|
Git's source code. If you clone Fossil's self-hosting repository, you
get the entire Fossil website — source code, documentation, ticket
history, and so forth.² That means you get a copy of this very article
and all of its historical versions, plus the same for all of the other
public content on this site.
<h3 id="efficient" name="effective">2.2 Efficient</h3>
Git is actually a collection of many small tools, each doing one small
part of the job, which can be recombined (by experts) to perform
powerful operations. Git has a lot of complexity and many dependencies,
so that most people end up installing it via some kind of package
manager, simply because these problems are best delegated to people
skilled in the creation of binary softare packages.
Fossil is a single self-contained stand-alone executable with hardly any
dependencies. Fossil can be run inside a minimally configured
[https://en.wikipedia.org/wiki/Chroot|chroot jail], from a Windows
memory stick, off a Raspberry Pi with a tiny SD card, etc. To install
Fossil, one merely puts the executable somewhere in the <tt>$PATH</tt>.
Some say that Git more closely adheres to the Unix philosophy,
summarized as "many small tools, loosely joined," but we have many
examples of other successful Unix software that violates that principle
to good effect, from Apache to Python to ZFS. We can infer from that
that this is not an absolute principle of good software design.
Sometimes "many features, tightly-coupled" works better. What actually
matters is effectiveness and efficiency. We believe Fossil achieves
this.
Git fails on efficiency once you add to it all of the third-party
software needed to give it a Fossil-equivalent feature set. Consider
[https://about.gitlab.com/|GitLab], a third-party extension to Git
wrapping it in many features, making it roughly Fossil-equivalent,
though [https://docs.gitlab.com/ee/install/requirements.html|much more
resource hungry] and hence more costly to run than the equivalent
Fossil setup. GitLab's requirements are tolerable when you're dedicating
a local rack server or blade to it, since that's about the smallest
thing you could call a "server" these days, but when you go to host that
in the cloud, you can expect to pay about 8⨉ as much to comfortably host
GitLab as for Fossil. This difference is largely due to basic
technology choices: Ruby and PostgreSQL vs C and SQLite.
The Fossil project itself is [./selfhost.wiki|hosted on a very small
VPS], and we've received many reports on the Fossil forum about people
successfully hosting Fossil service on bare-bones $5/month VPS hosts,
spare Raspberry Pi boards, and other small hosts.
|
| ︙ | | | ︙ | |
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
|
has resulted in a huge variety of reports and status screens
([./webpage-ex.md|examples]) that show project state
in ways that help developers
maintain enhanced awareness and comprehension
and avoid errors.
<h3 id="vs-linux">2.4 Linux vs. SQLite</h3>
Fossil and Git promote different development styles because each one was
specifically designed to support the creator's main software
development project: [https://en.wikipedia.org/wiki/Linus_Torvalds|Linus
Torvalds] designed Git to support development of
[https://www.kernel.org/|the Linux kernel], and
[https://en.wikipedia.org/wiki/D._Richard_Hipp|D. Richard Hipp] designed
Fossil to support the development of [https://sqlite.org/|SQLite].
Both projects must rank high on any objective list of "most
important FOSS projects," yet these two projects are almost entirely unlike
one another. So, too, are these two DVCSes.
In the following sections, we will explain how four key differences
between Linux and SQLite dictated the design of each DVCS's low-friction
usage path.
When deciding between these two DVCSes, you should ask yourself, "Is my
project more like Linux or more like SQLite?"
<h4 id="devorg">2.4.1 Development Organization</h4>
Eric S. Raymond's seminal essay-turned-book
"[https://en.wikipedia.org/wiki/The_Cathedral_and_the_Bazaar|The
Cathedral and the Bazaar]" details the two major development
organization styles found in
[https://en.wikipedia.org/wiki/Free_and_open-source_software|FOSS]
projects. As it happens, Linux and SQLite fall on opposite sides of this
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
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
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
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
|
has resulted in a huge variety of reports and status screens
([./webpage-ex.md|examples]) that show project state
in ways that help developers
maintain enhanced awareness and comprehension
and avoid errors.
<h3 id="portable">2.4 Portable</h3>
Fossil is largely written in ISO C, almost purely conforming to the
original 1989 standard. We make very little use of
[https://en.wikipedia.org/wiki/C99|C99], and even less of
[https://en.wikipedia.org/wiki/C11_(C_standard_revision)|C11]. Fossil
does make use of POSIX and Windows APIs where necessary, but it's about
as portable as you can ask given that ISO C doesn't define all of the
facilities Fossil needs to do its thing. (Network sockets, file locking,
etc.) There are certainly well-known platforms Fossil hasn't been ported
to yet, but that's most likely due to lack of interest rather than
inherent difficulties in doing the port. We believe the most stringent
limit on its portability is that it assumes at least a 32-bit CPU and
several megs of flat-addressed memory.³ Fossil isn't quite as
[https://www.sqlite.org/custombuild.html|portable as SQLite], but it's
close.
About half of the code in Fossil is actually an embedded copy of the
current version of SQLite. Much of what is Fossil-specific after you set
SQLite itself aside is SQL code calling into SQLite. The number of lines
of SQL code in Fossil isn't large by percentage, but since SQL is such
an expressive, declarative language, it has an outsized contribution to
Fossil's user-visible functionality.
Fossil also makes good use of JavaScript for its web UI, and there's a
fair bit of use of the [https://en.wikipedia.org/wiki/Tcl|Tcl] and
[https://www.fossil-scm.org/xfer/doc/trunk/www/th1.md|TH1] scripting
languages. These do not hamper Fossil's portability, since they are also
all quite portable technologies themselves.
Git is largely portable only to POSIX platforms. About half its code is
POSIX C, and about a third of it is POSIX shell code. There's also
quite a lot of Perl, Tcl, and Python code in Git. Although these
technologies are quite portable within the sphere of POSIX OSes, they're
quite foreign to Windows, which is why the so-called "Git for Windows"
distributions (both [https://git-scm.com/download/win|first-party] and
[https://gitforwindows.org/|third-party]) are actually an
[http://mingw.org/wiki/msys|MSYS POSIX portability environment] bundled
with all of the Git stuff, because it would be too painful to port Git
natively to Windows. Git is a foreign citizen on Windows, speaking to it
only through a translator.
While Fossil does lean toward POSIX norms when given a choice — LF-only
line endings are treated as first-class citizens over CR+LF, for example
— the Windows build of Fossil is truly native.
The third-party extensions to Git tend to follow this same pattern.
[http://mingw.org/wiki/msys|GitLab isn't portable to Windows at all],
for example. For that matter, GitLab isn't even officially supported on
macOS, the BSDs, or uncommon Linuxes!
<h3 id="vs-linux">2.5 Linux vs. SQLite</h3>
Fossil and Git promote different development styles because each one was
specifically designed to support the creator's main software
development project: [https://en.wikipedia.org/wiki/Linus_Torvalds|Linus
Torvalds] designed Git to support development of
[https://www.kernel.org/|the Linux kernel], and
[https://en.wikipedia.org/wiki/D._Richard_Hipp|D. Richard Hipp] designed
Fossil to support the development of [https://sqlite.org/|SQLite].
Both projects must rank high on any objective list of "most
important FOSS projects," yet these two projects are almost entirely unlike
one another. So, too, are these two DVCSes.
In the following sections, we will explain how four key differences
between Linux and SQLite dictated the design of each DVCS's low-friction
usage path.
When deciding between these two DVCSes, you should ask yourself, "Is my
project more like Linux or more like SQLite?"
<h4 id="devorg">2.5.1 Development Organization</h4>
Eric S. Raymond's seminal essay-turned-book
"[https://en.wikipedia.org/wiki/The_Cathedral_and_the_Bazaar|The
Cathedral and the Bazaar]" details the two major development
organization styles found in
[https://en.wikipedia.org/wiki/Free_and_open-source_software|FOSS]
projects. As it happens, Linux and SQLite fall on opposite sides of this
|
| ︙ | | | ︙ | |
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
|
<li><p><b>No easy drive-by contributions:</b> Git
[https://www.git-scm.com/docs/git-request-pull|pull requests] offer
a low-friction path to accepting
[https://www.jonobacon.com/2012/07/25/building-strong-community-structural-integrity/|drive-by
contributions]. Fossil's closest equivalent is its unique
[/help?cmd=bundle|bundle] feature, which requires higher engagement
than firing off a PR.³ This difference comes directly from the
initial designed purpose for each tool: the SQLite project doesn't
accept outside contributions from previously-unknown developers, but
the Linux kernel does.</p></li>
<li><p><b>No rebasing:</b> When your local repo clone syncs changes
up to its parent, those changes are sent exactly as they were
committed locally. [#history|There is no rebasing mechanism in
|
|
|
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
|
<li><p><b>No easy drive-by contributions:</b> Git
[https://www.git-scm.com/docs/git-request-pull|pull requests] offer
a low-friction path to accepting
[https://www.jonobacon.com/2012/07/25/building-strong-community-structural-integrity/|drive-by
contributions]. Fossil's closest equivalent is its unique
[/help?cmd=bundle|bundle] feature, which requires higher engagement
than firing off a PR.⁴ This difference comes directly from the
initial designed purpose for each tool: the SQLite project doesn't
accept outside contributions from previously-unknown developers, but
the Linux kernel does.</p></li>
<li><p><b>No rebasing:</b> When your local repo clone syncs changes
up to its parent, those changes are sent exactly as they were
committed locally. [#history|There is no rebasing mechanism in
|
| ︙ | | | ︙ | |
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
|
mental picture of what is happening, leading to better situational
awareness.
Each DVCS can be used in the opposite style, but doing so works against
their low-friction paths.
<h4 id="scale">2.4.2 Scale</h4>
The Linux kernel has a far bigger developer community than that of
SQLite: there are thousands and thousands of contributors to Linux, most
of whom do not know each others names. These thousands are responsible
for producing roughly 89⨉ more code than is in SQLite. (10.7
[https://en.wikipedia.org/wiki/Source_lines_of_code|MLOC] vs. 0.12 MLOC
according to [https://dwheeler.com/sloccount/|SLOCCount].) The Linux
|
|
|
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
|
mental picture of what is happening, leading to better situational
awareness.
Each DVCS can be used in the opposite style, but doing so works against
their low-friction paths.
<h4 id="scale">2.5.2 Scale</h4>
The Linux kernel has a far bigger developer community than that of
SQLite: there are thousands and thousands of contributors to Linux, most
of whom do not know each others names. These thousands are responsible
for producing roughly 89⨉ more code than is in SQLite. (10.7
[https://en.wikipedia.org/wiki/Source_lines_of_code|MLOC] vs. 0.12 MLOC
according to [https://dwheeler.com/sloccount/|SLOCCount].) The Linux
|
| ︙ | | | ︙ | |
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
|
software configuration management problems or D. Richard Hipp scale
problems when choosing your DVCS. An
[https://en.wikipedia.org/wiki/Impact_wrench|automotive air impact
wrench] running at 8000 RPM driving an M8 socket-cap bolt at 16 cm/s is
not the best way to hang a picture on the living room wall.
<h4 id="contrib">2.4.3 Accepting Contributions</h4>
As of this writing, Git has received about 4.5⨉ as many commits as
Fossil resulting in about 2.5⨉ as many lines of source code. The line
count excludes tests and in-tree third-party dependencies. It does not
exclude the default GUI for each, since it's integral for Fossil, so we
count the size of <tt>gitk</tt> in this.
|
|
|
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
|
software configuration management problems or D. Richard Hipp scale
problems when choosing your DVCS. An
[https://en.wikipedia.org/wiki/Impact_wrench|automotive air impact
wrench] running at 8000 RPM driving an M8 socket-cap bolt at 16 cm/s is
not the best way to hang a picture on the living room wall.
<h4 id="contrib">2.5.3 Accepting Contributions</h4>
As of this writing, Git has received about 4.5⨉ as many commits as
Fossil resulting in about 2.5⨉ as many lines of source code. The line
count excludes tests and in-tree third-party dependencies. It does not
exclude the default GUI for each, since it's integral for Fossil, so we
count the size of <tt>gitk</tt> in this.
|
| ︙ | | | ︙ | |
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
|
trunk.
The end result is that Fossil more closely adheres to
[https://en.wikipedia.org/wiki/Principle_of_least_astonishment|the
principle of least astonishment] than Git does.
<h4 id="branches">2.4.4 Individual Branches vs. The Entire Change History</h4>
Both Fossil and Git store history as a directed acyclic graph (DAG)
of changes, but Git tends to focus more on individual branches of
the DAG, whereas Fossil puts more emphasis on the entire DAG.
For example, the default "sync" behavior in Git is to only sync
a single branch, whereas with Fossil the only sync option it to
|
|
|
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
|
trunk.
The end result is that Fossil more closely adheres to
[https://en.wikipedia.org/wiki/Principle_of_least_astonishment|the
principle of least astonishment] than Git does.
<h4 id="branches">2.5.4 Individual Branches vs. The Entire Change History</h4>
Both Fossil and Git store history as a directed acyclic graph (DAG)
of changes, but Git tends to focus more on individual branches of
the DAG, whereas Fossil puts more emphasis on the entire DAG.
For example, the default "sync" behavior in Git is to only sync
a single branch, whereas with Fossil the only sync option it to
|
| ︙ | | | ︙ | |
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
|
well. But Fossil was written for the cathedral-style SQLite project
with just a handful of active committers. Seeing all
changes on all branches all at once helps keep the whole team
up-to-date with what everybody else is doing, resulting in a more
tightly focused and cohesive implementation.
<h3 id="checkouts">2.5 One vs. Many Check-outs per Repository</h3>
A "repository" in Git is a pile-of-files in the ".git" subdirectory
of a single check-out. The check-out and the repository are located
together in the filesystem.
With Fossil, a "repository" is a single SQLite database file
that can be stored anywhere. There
|
|
|
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
|
well. But Fossil was written for the cathedral-style SQLite project
with just a handful of active committers. Seeing all
changes on all branches all at once helps keep the whole team
up-to-date with what everybody else is doing, resulting in a more
tightly focused and cohesive implementation.
<h3 id="checkouts">2.6 One vs. Many Check-outs per Repository</h3>
A "repository" in Git is a pile-of-files in the ".git" subdirectory
of a single check-out. The check-out and the repository are located
together in the filesystem.
With Fossil, a "repository" is a single SQLite database file
that can be stored anywhere. There
|
| ︙ | | | ︙ | |
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
|
means every working check-out tree is treated equally. It's common in
Fossil to have a check-out tree for each major working branch so that
you can switch branches with a "cd" command rather than replace the
current working file set with a different file set by updating in place,
as Git prefers.
<h3 id="history">2.6 What you should have done vs. What you actually did</h3>
Git puts a lot of emphasis on maintaining
a "clean" check-in history. Extraneous and experimental branches by
individual developers often never make it into the main repository. And
branches are often rebased before being pushed, to make
it appear as if development had been linear. Git strives to record what
the development of a project should have looked like had there been no
|
|
|
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
|
means every working check-out tree is treated equally. It's common in
Fossil to have a check-out tree for each major working branch so that
you can switch branches with a "cd" command rather than replace the
current working file set with a different file set by updating in place,
as Git prefers.
<h3 id="history">2.7 What you should have done vs. What you actually did</h3>
Git puts a lot of emphasis on maintaining
a "clean" check-in history. Extraneous and experimental branches by
individual developers often never make it into the main repository. And
branches are often rebased before being pushed, to make
it appear as if development had been linear. Git strives to record what
the development of a project should have looked like had there been no
|
| ︙ | | | ︙ | |
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
|
[/doc/trunk/www/shunning.wiki|shunning mechanism], but it has strict
limitations that prevent global history rewrites.
One commentator characterized Git as recording history according to
the victors, whereas Fossil records history as it actually happened.
<h3 id="hash">2.7 Hash Algorithm: SHA-3 vs SHA-2 vs SHA-1</h3>
Fossil started out using 160-bit SHA-1 hashes to identify check-ins,
just as in Git. That changed in early 2017 when news of the
[https://shattered.io/|SHAttered attack] broke, demonstrating that SHA-1
collisions were now practical to create. Two weeks later, the creator of
Fossil delivered a new release allowing a clean migration to
[https://en.wikipedia.org/wiki/SHA-3|256-bit SHA-3] with
|
|
|
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
|
[/doc/trunk/www/shunning.wiki|shunning mechanism], but it has strict
limitations that prevent global history rewrites.
One commentator characterized Git as recording history according to
the victors, whereas Fossil records history as it actually happened.
<h3 id="hash">2.8 Hash Algorithm: SHA-3 vs SHA-2 vs SHA-1</h3>
Fossil started out using 160-bit SHA-1 hashes to identify check-ins,
just as in Git. That changed in early 2017 when news of the
[https://shattered.io/|SHAttered attack] broke, demonstrating that SHA-1
collisions were now practical to create. Two weeks later, the creator of
Fossil delivered a new release allowing a clean migration to
[https://en.wikipedia.org/wiki/SHA-3|256-bit SHA-3] with
|
| ︙ | | | ︙ | |
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
|
you add the "-u" option. (See "[./aboutdownload.wiki|How the
Download Page Works]" for details.) There may also be some purely
static elements of the web site served via D. Richard Hipp's own
lightweight web server,
<tt>[https://sqlite.org/docsrc/doc/trunk/misc/althttpd.md|althttpd]</tt>,
which is configured as a front end to Fossil running in CGI mode on
these sites.
<li><p>Both Fossil and Git support
[https://en.wikipedia.org/wiki/Patch_(Unix)|<tt>patch(1)</tt>
files], a common way to allow drive-by contributions, but it's a
lossy contribution path for both systems. Unlike Git PRs and Fossil
bundles, patch files collapse mulitple checkins together, they don't
include check-in comments, and they cannot encode changes made above
the individual file content layer: you lose branching decisisions,
tag changes, file renames, and more when using patch files.</p></li>
</ol></i></small>
|
>
>
>
>
|
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
|
you add the "-u" option. (See "[./aboutdownload.wiki|How the
Download Page Works]" for details.) There may also be some purely
static elements of the web site served via D. Richard Hipp's own
lightweight web server,
<tt>[https://sqlite.org/docsrc/doc/trunk/misc/althttpd.md|althttpd]</tt>,
which is configured as a front end to Fossil running in CGI mode on
these sites.
<li><p>We have yet to hear from someone who has ported Fossil to
[https://en.wikipedia.org/wiki/Z/OS|z/OS], for example, though it
should be quite possible.
<li><p>Both Fossil and Git support
[https://en.wikipedia.org/wiki/Patch_(Unix)|<tt>patch(1)</tt>
files], a common way to allow drive-by contributions, but it's a
lossy contribution path for both systems. Unlike Git PRs and Fossil
bundles, patch files collapse mulitple checkins together, they don't
include check-in comments, and they cannot encode changes made above
the individual file content layer: you lose branching decisisions,
tag changes, file renames, and more when using patch files.</p></li>
</ol></i></small>
|