542 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			542 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE html>
 | 
						|
<html><head>
 | 
						|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
						|
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
 | 
						|
<link href="sqlite.css" rel="stylesheet">
 | 
						|
<title>Why SQLite Does Not Use Git</title>
 | 
						|
<!-- path= -->
 | 
						|
</head>
 | 
						|
<body>
 | 
						|
<div class=nosearch>
 | 
						|
<a href="index.html">
 | 
						|
<img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0">
 | 
						|
</a>
 | 
						|
<div><!-- IE hack to prevent disappearing logo --></div>
 | 
						|
<div class="tagline desktoponly">
 | 
						|
Small. Fast. Reliable.<br>Choose any three.
 | 
						|
</div>
 | 
						|
<div class="menu mainmenu">
 | 
						|
<ul>
 | 
						|
<li><a href="index.html">Home</a>
 | 
						|
<li class='mobileonly'><a href="javascript:void(0)" onclick='toggle_div("submenu")'>Menu</a>
 | 
						|
<li class='wideonly'><a href='about.html'>About</a>
 | 
						|
<li class='desktoponly'><a href="docs.html">Documentation</a>
 | 
						|
<li class='desktoponly'><a href="download.html">Download</a>
 | 
						|
<li class='wideonly'><a href='copyright.html'>License</a>
 | 
						|
<li class='desktoponly'><a href="support.html">Support</a>
 | 
						|
<li class='desktoponly'><a href="prosupport.html">Purchase</a>
 | 
						|
<li class='search' id='search_menubutton'>
 | 
						|
<a href="javascript:void(0)" onclick='toggle_search()'>Search</a>
 | 
						|
</ul>
 | 
						|
</div>
 | 
						|
<div class="menu submenu" id="submenu">
 | 
						|
<ul>
 | 
						|
<li><a href='about.html'>About</a>
 | 
						|
<li><a href='docs.html'>Documentation</a>
 | 
						|
<li><a href='download.html'>Download</a>
 | 
						|
<li><a href='support.html'>Support</a>
 | 
						|
<li><a href='prosupport.html'>Purchase</a>
 | 
						|
</ul>
 | 
						|
</div>
 | 
						|
<div class="searchmenu" id="searchmenu">
 | 
						|
<form method="GET" action="search">
 | 
						|
<select name="s" id="searchtype">
 | 
						|
<option value="d">Search Documentation</option>
 | 
						|
<option value="c">Search Changelog</option>
 | 
						|
</select>
 | 
						|
<input type="text" name="q" id="searchbox" value="">
 | 
						|
<input type="submit" value="Go">
 | 
						|
</form>
 | 
						|
</div>
 | 
						|
</div>
 | 
						|
<script>
 | 
						|
function toggle_div(nm) {
 | 
						|
var w = document.getElementById(nm);
 | 
						|
if( w.style.display=="block" ){
 | 
						|
w.style.display = "none";
 | 
						|
}else{
 | 
						|
w.style.display = "block";
 | 
						|
}
 | 
						|
}
 | 
						|
function toggle_search() {
 | 
						|
var w = document.getElementById("searchmenu");
 | 
						|
if( w.style.display=="block" ){
 | 
						|
w.style.display = "none";
 | 
						|
} else {
 | 
						|
w.style.display = "block";
 | 
						|
setTimeout(function(){
 | 
						|
document.getElementById("searchbox").focus()
 | 
						|
}, 30);
 | 
						|
}
 | 
						|
}
 | 
						|
function div_off(nm){document.getElementById(nm).style.display="none";}
 | 
						|
window.onbeforeunload = function(e){div_off("submenu");}
 | 
						|
/* Disable the Search feature if we are not operating from CGI, since */
 | 
						|
/* Search is accomplished using CGI and will not work without it. */
 | 
						|
if( !location.origin || !location.origin.match || !location.origin.match(/http/) ){
 | 
						|
document.getElementById("search_menubutton").style.display = "none";
 | 
						|
}
 | 
						|
/* Used by the Hide/Show button beside syntax diagrams, to toggle the */
 | 
						|
function hideorshow(btn,obj){
 | 
						|
var x = document.getElementById(obj);
 | 
						|
var b = document.getElementById(btn);
 | 
						|
if( x.style.display!='none' ){
 | 
						|
x.style.display = 'none';
 | 
						|
b.innerHTML='show';
 | 
						|
}else{
 | 
						|
x.style.display = '';
 | 
						|
b.innerHTML='hide';
 | 
						|
}
 | 
						|
return false;
 | 
						|
}
 | 
						|
</script>
 | 
						|
</div>
 | 
						|
<div class=fancy>
 | 
						|
<div class=nosearch>
 | 
						|
<div class="fancy_title">
 | 
						|
Why SQLite Does Not Use Git
 | 
						|
</div>
 | 
						|
<div class="fancy_toc">
 | 
						|
<a onclick="toggle_toc()">
 | 
						|
<span class="fancy_toc_mark" id="toc_mk">►</span>
 | 
						|
Table Of Contents
 | 
						|
</a>
 | 
						|
<div id="toc_sub"><div class="fancy-toc1"><a href="#introduction">1. Introduction</a></div>
 | 
						|
<div class="fancy-toc2"><a href="#edits">1.1. Edits</a></div>
 | 
						|
<div class="fancy-toc1"><a href="#a_few_reasons_why_sqlite_does_not_use_git">2. A Few Reasons Why SQLite Does Not Use Git</a></div>
 | 
						|
<div class="fancy-toc2"><a href="#git_does_not_provide_good_situational_awareness">2.1. Git does not provide good situational awareness</a></div>
 | 
						|
<div class="fancy-toc2"><a href="#git_makes_it_difficult_to_find_successors_descendents_of_a_check_in">2.2. Git makes it difficult to find successors (descendents)
 | 
						|
of a check-in</a></div>
 | 
						|
<div class="fancy-toc2"><a href="#the_mental_model_for_git_is_needlessly_complex">2.3. The mental model for Git is needlessly complex</a></div>
 | 
						|
<div class="fancy-toc2"><a href="#git_does_not_track_historical_branch_names">2.4. Git does not track historical branch names</a></div>
 | 
						|
<div class="fancy-toc2"><a href="#git_requires_more_administrative_support">2.5. Git requires more administrative support</a></div>
 | 
						|
<div class="fancy-toc2"><a href="#git_provides_a_poor_user_experience">2.6. Git provides a poor user experience</a></div>
 | 
						|
<div class="fancy-toc1"><a href="#a_git_user_s_guide_to_accessing_sqlite_source_code">3. A Git-User's Guide To Accessing SQLite Source Code</a></div>
 | 
						|
<div class="fancy-toc2"><a href="#the_official_github_mirror">3.1. The Official GitHub Mirror</a></div>
 | 
						|
<div class="fancy-toc2"><a href="#web_access">3.2. Web Access</a></div>
 | 
						|
<div class="fancy-toc2"><a href="#fossil_access">3.3. Fossil Access</a></div>
 | 
						|
<div class="fancy-toc2"><a href="#verifying_source_code_integrity">3.4. Verifying Source Code Integrity</a></div>
 | 
						|
<div class="fancy-toc1"><a href="#see_also">4. See Also</a></div>
 | 
						|
</div>
 | 
						|
</div>
 | 
						|
<script>
 | 
						|
function toggle_toc(){
 | 
						|
var sub = document.getElementById("toc_sub")
 | 
						|
var mk = document.getElementById("toc_mk")
 | 
						|
if( sub.style.display!="block" ){
 | 
						|
sub.style.display = "block";
 | 
						|
mk.innerHTML = "▼";
 | 
						|
} else {
 | 
						|
sub.style.display = "none";
 | 
						|
mk.innerHTML = "►";
 | 
						|
}
 | 
						|
}
 | 
						|
</script>
 | 
						|
</div>
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
<h1 id="introduction"><span>1. </span>Introduction</h1>
 | 
						|
 | 
						|
<p>
 | 
						|
SQLite does not use the
 | 
						|
<a href="https://git-scm.org">Git</a> version control system.
 | 
						|
SQLite uses
 | 
						|
<a href="https://fossil-scm.org/">Fossil</a> instead, which is a
 | 
						|
version control system that was specifically designed
 | 
						|
and written to support SQLite.
 | 
						|
 | 
						|
</p><p>
 | 
						|
People often wonder why SQLite does not use the
 | 
						|
<a href="https://git-scm.org">Git</a> version control system like everybody
 | 
						|
else.
 | 
						|
This article attempts to answer that question.  Also,
 | 
						|
in <a href="#getthecode">section 3</a>, 
 | 
						|
this article provides hints to Git users
 | 
						|
about how they can easily access the SQLite source code.
 | 
						|
 | 
						|
</p><p>
 | 
						|
This article is <u>not</u> a comparison between Fossil
 | 
						|
and Git.  See
 | 
						|
<a href="https://fossil-scm.org/fossil/doc/trunk/www/fossil-v-git.wiki">https://fossil-scm.org/fossil/doc/trunk/www/fossil-v-git.wiki</a>
 | 
						|
for one comparison of the two systems.  There are others as
 | 
						|
well.
 | 
						|
 | 
						|
</p><p>
 | 
						|
This article is <u>not</u> advocating that you switch your projects
 | 
						|
away from Git.  You can use whatever version control system you want.
 | 
						|
If you are perfectly happy with Git, then by all means keep using
 | 
						|
Git.  But, if you are wondering if there isn't something better,
 | 
						|
then maybe try to understand the perspectives presented below.
 | 
						|
Use the insights thus obtained to find or write a different and
 | 
						|
better version control system, or to just make
 | 
						|
improvements to Git itself.
 | 
						|
 | 
						|
</p><h2 id="edits"><span>1.1. </span>Edits</h2>
 | 
						|
 | 
						|
<p>
 | 
						|
This article has been revised multiple times in an attempt
 | 
						|
to improve clarity, address concerns and misgivings,
 | 
						|
and to fix errors identified on
 | 
						|
<a href="https://news.ycombinator.com/item?id=16806114">Hacker News</a>,
 | 
						|
<a href="https://www.reddit.com/r/programming/comments/8c2niw/why_sqlite_does_not_use_git/">Reddit</a>
 | 
						|
and
 | 
						|
<a href="https://lobste.rs/s/slcntl/why_sqlite_does_not_use_git">Lobsters</a>.
 | 
						|
The complete edit history can be seen at
 | 
						|
<a href="https://sqlite.org/docsrc/finfo/pages/whynotgit.in">https://sqlite.org/docsrc/finfo/pages/whynotgit.in</a>.
 | 
						|
(Usage hint: Click on any two nodes of the graph for a diff.)
 | 
						|
 | 
						|
</p><h1 id="a_few_reasons_why_sqlite_does_not_use_git"><span>2. </span>A Few Reasons Why SQLite Does Not Use Git</h1>
 | 
						|
 | 
						|
<h2 id="git_does_not_provide_good_situational_awareness"><span>2.1. </span>Git does not provide good situational awareness</h2>
 | 
						|
 | 
						|
<p>
 | 
						|
When I want to see what has been happening on SQLite (or any of
 | 
						|
about a dozen other projects that I work on) I visit the
 | 
						|
<a href="https://sqlite.org/src/timeline">timeline</a> and in a single
 | 
						|
screen I can see a quick summary of all the latest changes,
 | 
						|
on all branches.
 | 
						|
In a few clicks, I can drill down to see as much detail as I
 | 
						|
want.  I can even do this from a phone.
 | 
						|
 | 
						|
</p><p>
 | 
						|
GitHub and GitLab offer nothing comparable.  The closest I have
 | 
						|
found is the <a href="https://github.com/sqlite/sqlite/network">network</a>,
 | 
						|
which is slow to render (unless it is already cached), does not 
 | 
						|
offer nearly as much details, and scarcely works on mobile.
 | 
						|
The <a href="https://github.com/sqlite/sqlite/commits/master">commits</a> view
 | 
						|
of GitHub provides more detail, renders quickly,
 | 
						|
and works on mobile, but only shows a single branch at a time,
 | 
						|
so I cannot easily know if I've seen all of the recent changes.
 | 
						|
And even if GitHub/GitLab did offer better interfaces, both are
 | 
						|
third-party services.  They are not a core part of Git.  Hence,
 | 
						|
using them introduces yet another dependency into the project.
 | 
						|
 | 
						|
</p><p>
 | 
						|
I am told that Git users commonly install third-party graphical
 | 
						|
viewers for Git, many of which do a better job of showing recent 
 | 
						|
activity on the project.  That is great, but these are still
 | 
						|
more third-party applications that must be installed and
 | 
						|
managed separately.  Many are platform-specific.  (One of the
 | 
						|
better ones, <a href="https://gitup.co/">GitUp</a>, only works on Mac, for
 | 
						|
example.)  All require that you first sync your local repository
 | 
						|
then bring up their graphical interface on your desktop.  And
 | 
						|
even with all that, I still cannot see what I typically want to 
 | 
						|
see without multiple clicks.  Checking on project status from
 | 
						|
a phone while away from the office is not an option.
 | 
						|
 | 
						|
</p><h2 id="git_makes_it_difficult_to_find_successors_descendents_of_a_check_in"><span>2.2. </span>Git makes it difficult to find successors (descendents)
 | 
						|
of a check-in</h2>
 | 
						|
 | 
						|
<p>
 | 
						|
Git allows you to go backwards in time easily.  Given the latest
 | 
						|
check-in on a branch, Git lets you see all the ancestors of that
 | 
						|
check-in.  But Git makes it difficult to move in the other
 | 
						|
direction.  Given some historical check-in, it is quite challenging
 | 
						|
in Git to find out what came next.  It can be done, but it is sufficiently
 | 
						|
difficult that people rarely do it.  Common interfaces for Git,
 | 
						|
such as GitHub, do not support the ability.
 | 
						|
 | 
						|
</p><p>It is not impossible to find the descendents of a check-in
 | 
						|
in Git.  It is merely difficult.  For example,
 | 
						|
there is a 
 | 
						|
<a href="https://stackoverflow.com/questions/27960605/find-all-the-direct-descendants-of-a-given-commit#27962018">stackoverflow page</a>
 | 
						|
showing the command sequence for finding the descendents of a check-in
 | 
						|
in unix:
 | 
						|
 | 
						|
</p><div class="codeblock"><pre>git rev-list --all --parents | grep ".\{40\}.*<parent_sha1>.*" | awk '{print $1}'
 | 
						|
</parent_sha1>
 | 
						|
</pre></div>
 | 
						|
 | 
						|
<p>
 | 
						|
This command sequence is a lot to memorize and type.  (One would want
 | 
						|
to create a bash alias or short shell script if it were used frequently.)
 | 
						|
Furthermore, it is not quite the same thing.  The command above gives
 | 
						|
one a list of descendents without showing the branching structure, which
 | 
						|
is important for understanding what happened.
 | 
						|
In contrast, Fossil offers displays such as
 | 
						|
<a href="https://sqlite.org/src/timeline?d=8a439a6dda390d74&n=15">https://sqlite.org/src/timeline?d=8a439a6dda390d74&n=15</a>, which
 | 
						|
is a tremendous help in analyzing the aftermath of historical changes.
 | 
						|
 | 
						|
</p><p>
 | 
						|
And it is not really about just finding the descendents of a check-in
 | 
						|
from time to time.  The fact that descendents are readily available in
 | 
						|
Fossil means that the information pervades the web pages provided by
 | 
						|
Fossil.  One example: Every Fossil check-in information page
 | 
						|
(<a href="https://www.sqlite.org/src/info/ec7addc87f97bcff">example</a>) shows
 | 
						|
a small "Context" graph of the immediate predecessor and successors 
 | 
						|
to that check-in.  This helps the user maintain better situational
 | 
						|
awareness, and it provides useful capabilities, such as the ability
 | 
						|
click forward to the next check-in in sequence.  Another example:
 | 
						|
Fossil easily shows the context around a specific check-in
 | 
						|
(<a href="https://www.sqlite.org/src/timeline?c=2018-03-16&n=10">example</a>)
 | 
						|
which again helps to promote situational awareness and a deeper
 | 
						|
understanding of what is happening in the code.
 | 
						|
 | 
						|
</p><p>
 | 
						|
All of the above is possible with Git, given the right extensions
 | 
						|
and tools and using the right commands.  But it is not easy to do,
 | 
						|
and so it rarely gets done.  Consequently, developers have less awareness
 | 
						|
of what is happening in the code.
 | 
						|
 | 
						|
</p><h2 id="the_mental_model_for_git_is_needlessly_complex"><span>2.3. </span>The mental model for Git is needlessly complex</h2>
 | 
						|
 | 
						|
<p>
 | 
						|
The complexity of Git
 | 
						|
distracts attention from the software under development.  A user of Git
 | 
						|
needs to keep all of the following in mind:
 | 
						|
</p><ol type="'a'">
 | 
						|
<li> The working directory
 | 
						|
</li><li> The "index" or staging area
 | 
						|
</li><li> The local head
 | 
						|
</li><li> The local copy of the remote head
 | 
						|
</li><li> The actual remote head
 | 
						|
</li></ol>
 | 
						|
<p>
 | 
						|
Git commands (and/or options on commands) for moving and
 | 
						|
comparing content between all of these locations. 
 | 
						|
 | 
						|
</p><p>In contrast,
 | 
						|
Fossil users only need to think about their working directory and
 | 
						|
the check-in they are working on.  That is 60% less distraction.
 | 
						|
Every developer has a finite number of brain-cycles.  Fossil
 | 
						|
requires fewer brain-cycles to operate, thus freeing up 
 | 
						|
intellectual resources to focus on the software under development.
 | 
						|
 | 
						|
</p><p>One user of both Git and Fossil
 | 
						|
<a href="https://news.ycombinator.com/item?id=16806955">writes in HN</a>:
 | 
						|
 | 
						|
</p><blockquote><i>
 | 
						|
Fossil gives me peace of mind that I have everything ... synced to 
 | 
						|
the server with a single command....
 | 
						|
I never get this peace of mind with git.
 | 
						|
</i></blockquote>
 | 
						|
 | 
						|
<h2 id="git_does_not_track_historical_branch_names"><span>2.4. </span>Git does not track historical branch names</h2>
 | 
						|
 | 
						|
<p>
 | 
						|
Git keeps the complete DAG of the check-in sequence.  But branch
 | 
						|
tags are local information that is not synced and not retained
 | 
						|
once a branch closes.
 | 
						|
This makes review of historical
 | 
						|
branches tedious.
 | 
						|
 | 
						|
</p><p>
 | 
						|
As an example, suppose someone (perhaps a customer) asks you:
 | 
						|
"What ever became of that 'prefer-coroutine-sort-subquery' branch
 | 
						|
from two years ago?"
 | 
						|
You might try to answer the query by consulting the history in
 | 
						|
your version control system, thusly:
 | 
						|
 | 
						|
</p><ul>
 | 
						|
<li><b>GitHub:</b> <a href="https://github.com/sqlite/sqlite/commits/prefer-coroutine-sort-subquery">https://github.com/sqlite/sqlite/commits/prefer-coroutine-sort-subquery</a>
 | 
						|
</li><li><b>Fossil:</b> <a href="https://sqlite.org/src/timeline?r=prefer-coroutine-sort-subquery">https://sqlite.org/src/timeline?r=prefer-coroutine-sort-subquery</a>
 | 
						|
</li></ul>
 | 
						|
 | 
						|
<p>
 | 
						|
The Fossil view clearly shows that the branch was eventually merged back into
 | 
						|
trunk.  It shows where the branch started, and it shows two occasions where changes
 | 
						|
on trunk were merged into the branch.  GitHub shows none of this.  In fact, the
 | 
						|
GitHub display is mostly useless in trying to figure out what happened.
 | 
						|
 | 
						|
</p><p>
 | 
						|
Many readers have recommended various third-party GUIs for Git that
 | 
						|
might do a better job of showing historical development activity.  Maybe
 | 
						|
some of them do work better than native Git and/or GitHub, though they
 | 
						|
will all be hampered by the fact that Git does not preserve historical
 | 
						|
branch names across syncs.  And even if those other tools are better,
 | 
						|
the fact that it is necessary to go to a third-party tool to get the information
 | 
						|
desired does not speak well of the core system.
 | 
						|
 | 
						|
</p><h2 id="git_requires_more_administrative_support"><span>2.5. </span>Git requires more administrative support</h2>
 | 
						|
 | 
						|
<p>
 | 
						|
Git is complex software.
 | 
						|
One needs an installer of some kind to put Git on a developer
 | 
						|
workstation, or to upgrade to a newer version of Git.
 | 
						|
Setting up a Git server is non-trivial, and so most users
 | 
						|
have to use a third-party service such as GitHub or GitLab,
 | 
						|
and thus introduce additional (unnecessary) dependencies
 | 
						|
into the project.
 | 
						|
 | 
						|
</p><p>
 | 
						|
In contrast, Fossil is a single standalone binary which is
 | 
						|
installed by putting it on $PATH.  That one binary contains all
 | 
						|
the functionality of core Git and also GitHub and/or GitLab.  It
 | 
						|
manages a community server with wiki, bug tracking, and forums, 
 | 
						|
provides packaged downloads for consumers, login managements, 
 | 
						|
and so forth, with no extra software required.
 | 
						|
 | 
						|
</p><p>
 | 
						|
Less administration means that programmers spend more time working
 | 
						|
on the software (SQLite in this case) and less time fussing with
 | 
						|
the version control system.
 | 
						|
 | 
						|
</p><h2 id="git_provides_a_poor_user_experience"><span>2.6. </span>Git provides a poor user experience</h2>
 | 
						|
 | 
						|
<p>The following <a href="https://xkcd.com/1597/">https://xkcd.com/1597/</a> cartoon is an
 | 
						|
exaggeration, yet hits close to home:
 | 
						|
 | 
						|
</p><p>
 | 
						|
<img src="https://www.fossil-scm.org/fossil/doc/trunk/www/xkcd-git.gif">
 | 
						|
 | 
						|
</p><p>Let's be real.  Few people seriously dispute that Git provides
 | 
						|
a suboptimal user experience.  A lot of 
 | 
						|
the underlying implementation shows through into the user
 | 
						|
interface.  The interface is so bad that there is even a
 | 
						|
parody site that generates
 | 
						|
<a href="https://git-man-page-generator.lokaltog.net/">fake git man pages</a>.
 | 
						|
 | 
						|
</p><p>Designing software is hard.  It takes a lot of focus.
 | 
						|
A good version control system should provide the developer with
 | 
						|
assistance, not frustration.  Git has gotten better in this
 | 
						|
regard over the past decade, but it still has a long way to go.
 | 
						|
 | 
						|
<a name="getthecode"></a>
 | 
						|
</p><h1 id="a_git_user_s_guide_to_accessing_sqlite_source_code"><span>3. </span>A Git-User's Guide To Accessing SQLite Source Code</h1>
 | 
						|
 | 
						|
<p>
 | 
						|
If you are a devoted Git user, you can still easily access SQLite.  
 | 
						|
This section gives some hints on how to do so.
 | 
						|
 | 
						|
</p><h2 id="the_official_github_mirror"><span>3.1. </span>The Official GitHub Mirror</h2>
 | 
						|
 | 
						|
<p>
 | 
						|
As of 2019-03-20, there is now an 
 | 
						|
<a href="https://github.com/sqlite/sqlite">official Git mirror</a> of the
 | 
						|
SQLite sources on GitHub.
 | 
						|
 | 
						|
</p><p>The mirror is an incremental export of the 
 | 
						|
<a href="https://sqlite.org/src/timeline">canonical Fossil repository</a> for
 | 
						|
SQLite.  A cron-job updates the GitHub repository once an hour.
 | 
						|
This is a one-way, read-only code mirror.  No pull requests or 
 | 
						|
changes are accepted via GitHub.  The GitHub repository merely copies
 | 
						|
the content from the Fossil repository.  All changes are input via
 | 
						|
Fossil.
 | 
						|
 | 
						|
</p><p>
 | 
						|
The hashes that identify check-ins and files on the Git mirror are
 | 
						|
different from the hashes in Fossil.  There are many reasons for
 | 
						|
this, chief among them that Fossil uses a SHA3-256 hash whereas
 | 
						|
Git uses a SHA1 hash.  During export, the original Fossil hash for
 | 
						|
each check-in is added as a footer to check-in comments.  To avoid
 | 
						|
confusion, always use the original Fossil hash, not the Git hash,
 | 
						|
when referring to SQLite check-ins.
 | 
						|
 | 
						|
</p><h2 id="web_access"><span>3.2. </span>Web Access</h2>
 | 
						|
 | 
						|
<p>
 | 
						|
The <a href="https://sqlite.org/src/timeline">SQLite Fossil Repository</a> contains links
 | 
						|
for downloading  a Tarball, ZIP Archive, or <a href="sqlar.html">SQLite Archive</a> for any
 | 
						|
historical version of SQLite.  The URLs for these downloads are
 | 
						|
simple and can be incorporated easily into automated tools.  The format is:
 | 
						|
 | 
						|
</p><blockquote>
 | 
						|
<tt>https://sqlite.org/src/tarball/</tt><i>VERSION</i><tt>/sqlite.tar.gz</tt>
 | 
						|
</blockquote>
 | 
						|
 | 
						|
<p>
 | 
						|
Simply replace <i>VERSION</i> with some description of the version to be
 | 
						|
downloaded.  The <i>VERSION</i> can be a prefix of the cryptographic hash
 | 
						|
name of a specific check-in, or the name of a branch (in which case the
 | 
						|
most recent version of the branch is fetched) or a tag for a specific
 | 
						|
check-in like "version-3.23.1":
 | 
						|
 | 
						|
</p><blockquote>
 | 
						|
<tt>https://sqlite.org/src/tarball/version-3.23.1/sqlite.tar.gz</tt>
 | 
						|
</blockquote>
 | 
						|
 | 
						|
 | 
						|
<p>To get the latest release, use "release"
 | 
						|
for <i>VERSION</i>, like this:
 | 
						|
 | 
						|
</p><blockquote>
 | 
						|
<tt>https://sqlite.org/src/tarball/release/sqlite.tar.gz</tt>
 | 
						|
</blockquote>
 | 
						|
 | 
						|
<p>
 | 
						|
To get the latest trunk check-in, us "trunk" for <i>VERSION</i>:
 | 
						|
 | 
						|
</p><blockquote>
 | 
						|
<tt>https://sqlite.org/src/tarball/trunk/sqlite.tar.gz</tt>
 | 
						|
</blockquote>
 | 
						|
 | 
						|
<p>
 | 
						|
And so forth.
 | 
						|
For ZIP archives and SQLite Archives, simply change the "/tarball/" element
 | 
						|
into either "/zip/" or "/sqlar/", and maybe also change the name of the
 | 
						|
download file to have a ".zip" or ".sqlar" suffix.
 | 
						|
 | 
						|
</p><h2 id="fossil_access"><span>3.3. </span>Fossil Access</h2>
 | 
						|
 | 
						|
<p>
 | 
						|
Fossil is easy to install and use.  Here are the steps for unix.
 | 
						|
(Windows is similar.)
 | 
						|
 | 
						|
</p><ol>
 | 
						|
<li>
 | 
						|
Download the self-contained Fossil executable from
 | 
						|
<a href="https://fossil-scm.org/fossil/uv/download.html">https://fossil-scm.org/fossil/uv/download.html</a> and put the executable
 | 
						|
somewhere on your $PATH.
 | 
						|
</li><li><tt>mkdir ~/fossils</tt>
 | 
						|
</li><li><tt>fossil clone https://sqlite.org/src ~/fossils/sqlite.fossil</tt>
 | 
						|
</li><li><tt>mkdir ~/sqlite; cd ~/sqlite</tt>
 | 
						|
</li><li><tt>fossil open ~/fossils/sqlite.fossil</tt>
 | 
						|
</li></ol>
 | 
						|
 | 
						|
<p>
 | 
						|
At this point you are ready to type "<tt>./configure; make</tt>"
 | 
						|
(or on Windows with MSVC, "<tt>nmake /f Makefile.msc</tt>").
 | 
						|
 | 
						|
</p><p>
 | 
						|
To change your checkout to a different version of Fossil use
 | 
						|
the "update" command:
 | 
						|
 | 
						|
</p><blockquote>
 | 
						|
<tt>fossil update </tt><i>VERSION</i>
 | 
						|
</blockquote>
 | 
						|
 | 
						|
<p>
 | 
						|
Use "trunk" for <i>VERSION</i> to get the latest trunk version of SQLite.
 | 
						|
Or use a prefix of a cryptographic hash name, or the name of some branch
 | 
						|
or tag.  See
 | 
						|
<a href="https://fossil-scm.org/fossil/doc/trunk/www/checkin_names.wiki">https://fossil-scm.org/fossil/doc/trunk/www/checkin_names.wiki</a> for more
 | 
						|
suggestions on what names can be used for <i>VERSION</i>.
 | 
						|
 | 
						|
</p><p>
 | 
						|
Use the "<tt>fossil ui</tt>" command from within the ~/sqlite checkout to
 | 
						|
bring up a local copy of the website.
 | 
						|
 | 
						|
</p><p>
 | 
						|
Additional documentation on Fossil can be found at
 | 
						|
<a href="https://fossil-scm.org/fossil/doc/trunk/www/permutedindex.html">https://fossil-scm.org/fossil/doc/trunk/www/permutedindex.html</a>
 | 
						|
 | 
						|
</p><p>
 | 
						|
Do not be afraid to explore and experiment.
 | 
						|
Without a log-in you won't be able to
 | 
						|
push back any changes you make, so you cannot damage the project.
 | 
						|
 | 
						|
</p><h2 id="verifying_source_code_integrity"><span>3.4. </span>Verifying Source Code Integrity</h2>
 | 
						|
 | 
						|
<p>
 | 
						|
If you need to verify that the SQLite source code that you have is
 | 
						|
authentic and has not been modified in any way (perhaps by an adversary)
 | 
						|
that can be done using a few simple command-line tools.  At the root 
 | 
						|
of the SQLite source tree is a file named "manifest".  The manifest 
 | 
						|
file contains the name of every other file in the source tree together 
 | 
						|
with either a SHA1 or SHA3-256 hash for that file.  (SHA1 is used for
 | 
						|
older files and SHA3-256 for newer files.)  You can write a
 | 
						|
script to extract these hashes and verify them against the source code 
 | 
						|
files.  The hash name for the check-in is just the SHA3-256 hash of the
 | 
						|
"manifest" file itself.
 | 
						|
 | 
						|
</p><h1 id="see_also"><span>4. </span>See Also</h1>
 | 
						|
 | 
						|
<p>Other pages that talk about Fossil and Git include:
 | 
						|
</p><ul>
 | 
						|
<li><p><a href="https://fossil-scm.org/fossil/doc/trunk/www/fossil-v-git.wiki">Fossil vs. Git</a>
 | 
						|
</p></li><li><p><a href="https://www.fossil-scm.org/fossil/doc/trunk/www/quotes.wiki">What others say about Fossil and Git</a>
 | 
						|
</p></li></ul>
 | 
						|
 |