Fossil SCM

Merge trunk changes into the chat-markdown branch.

drh 2021-09-20 12:14 chat-markdown merge
Commit 807b8d9bf44a14830be601eac67833aada26ad487784dab1cc46e2aacbd71edb
+2 -1
--- src/diff.c
+++ src/diff.c
@@ -2881,11 +2881,12 @@
28812881
if( find_option("invert",0,0)!=0 ) diffFlags |= DIFF_INVERT;
28822882
if( find_option("brief",0,0)!=0 ) diffFlags |= DIFF_BRIEF;
28832883
if( find_option("internal","i",0)==0
28842884
&& (diffFlags & (DIFF_HTML|DIFF_TCL|DIFF_DEBUG|DIFF_JSON))==0
28852885
){
2886
- pCfg->zDiffCmd = diff_command_external(isGDiff);
2886
+ pCfg->zDiffCmd = find_option("command", 0, 1);
2887
+ if( pCfg->zDiffCmd==0 ) pCfg->zDiffCmd = diff_command_external(isGDiff);
28872888
if( pCfg->zDiffCmd ){
28882889
const char *zDiffBinary;
28892890
pCfg->zBinGlob = diff_get_binary_glob();
28902891
zDiffBinary = find_option("diff-binary", 0, 1);
28912892
if( zDiffBinary ){
28922893
--- src/diff.c
+++ src/diff.c
@@ -2881,11 +2881,12 @@
2881 if( find_option("invert",0,0)!=0 ) diffFlags |= DIFF_INVERT;
2882 if( find_option("brief",0,0)!=0 ) diffFlags |= DIFF_BRIEF;
2883 if( find_option("internal","i",0)==0
2884 && (diffFlags & (DIFF_HTML|DIFF_TCL|DIFF_DEBUG|DIFF_JSON))==0
2885 ){
2886 pCfg->zDiffCmd = diff_command_external(isGDiff);
 
2887 if( pCfg->zDiffCmd ){
2888 const char *zDiffBinary;
2889 pCfg->zBinGlob = diff_get_binary_glob();
2890 zDiffBinary = find_option("diff-binary", 0, 1);
2891 if( zDiffBinary ){
2892
--- src/diff.c
+++ src/diff.c
@@ -2881,11 +2881,12 @@
2881 if( find_option("invert",0,0)!=0 ) diffFlags |= DIFF_INVERT;
2882 if( find_option("brief",0,0)!=0 ) diffFlags |= DIFF_BRIEF;
2883 if( find_option("internal","i",0)==0
2884 && (diffFlags & (DIFF_HTML|DIFF_TCL|DIFF_DEBUG|DIFF_JSON))==0
2885 ){
2886 pCfg->zDiffCmd = find_option("command", 0, 1);
2887 if( pCfg->zDiffCmd==0 ) pCfg->zDiffCmd = diff_command_external(isGDiff);
2888 if( pCfg->zDiffCmd ){
2889 const char *zDiffBinary;
2890 pCfg->zBinGlob = diff_get_binary_glob();
2891 zDiffBinary = find_option("diff-binary", 0, 1);
2892 if( zDiffBinary ){
2893
--- src/fossil.diff.js
+++ src/fossil.diff.js
@@ -106,109 +106,10 @@
106106
getLHS ? 1 : (isSplit ? 4 : 2)
107107
)+')');
108108
const m = f.rx[getStart ? 'start' : 'end'].exec(td.innerText);
109109
return m ? +m[1] : undefined/*"shouldn't happen"*/;
110110
};
111
-
112
- /**
113
- Fetches /jchunk for the given TR element then replaces the TR's
114
- contents with data from the result of that request.
115
- */
116
- const fetchTrChunk = function(tr){
117
- if(tr.dataset.xfer /* already being fetched */) return;
118
- const table = tr.parentElement.parentElement;
119
- const hash = table.dataset.lefthash;
120
- if(!hash) return;
121
- const isSbs = table.classList.contains('splitdiff')/*else udiff*/;
122
- tr.dataset.xfer = 1 /* sentinel against multiple concurrent ajax requests */;
123
- const lineTo = +tr.dataset.endln;
124
- var lineFrom = +tr.dataset.startln;
125
- /* TODO: for the time being, for simplicity, we'll read the whole
126
- [startln, endln] chunk. "Later on" we'll maybe want to read it in
127
- chunks of, say, 20 lines or so, adjusting lineFrom to be 1 if it would
128
- be less than 1. */
129
- Diff.fetchArtifactChunk({
130
- urlParams:{
131
- name: hash,
132
- from: lineFrom,
133
- to: lineTo
134
- },
135
- aftersend: function(){
136
- delete tr.dataset.xfer;
137
- Diff.config.chunkFetch.aftersend.apply(
138
- this, Array.prototype.slice.call(arguments,0)
139
- );
140
- },
141
- onload: function(result){
142
- //console.debug("Chunk result: ",result);
143
- /* Replace content of tr.diffskip with the fetches result.
144
- When we refactor this to load in smaller chunks, we'll instead
145
- need to keep this skipper in place and:
146
-
147
- - Add a new TR above or above it, as apropriate.
148
-
149
- - Change the TR.dataset.startln/endln values to account for
150
- the just-fetched set.
151
- */
152
- D.clearElement(tr);
153
- const cols = [], preCode = [D.pre()], preLines = [D.pre(), D.pre()];
154
- if(isSbs){
155
- cols.push(D.addClass(D.td(tr), 'diffln', 'difflnl'));
156
- cols.push(D.addClass(D.td(tr), 'difftxt', 'difftxtl'));
157
- cols.push(D.addClass(D.td(tr), 'diffsep'));
158
- cols.push(D.addClass(D.td(tr), 'diffln', 'difflnr'));
159
- cols.push(D.addClass(D.td(tr), 'difftxt', 'difftxtr'));
160
- D.append(cols[0], preLines[0]);
161
- D.append(cols[1], preCode[0]);
162
- D.append(cols[3], preLines[1]);
163
- preCode.push(D.pre());
164
- D.append(cols[4], preCode[1]);
165
- }else{
166
- cols.push(D.addClass(D.td(tr), 'diffln', 'difflnl'));
167
- cols.push(D.addClass(D.td(tr), 'diffln', 'difflnr'));
168
- cols.push(D.addClass(D.td(tr), 'diffsep'));
169
- cols.push(D.addClass(D.td(tr), 'difftxt', 'difftxtu'));
170
- D.append(cols[0], preLines[0]);
171
- D.append(cols[1], preLines[1]);
172
- D.append(cols[3], preCode[0]);
173
- }
174
- let lineno = [], i;
175
- for( i = lineFrom; i <= lineTo; ++i ){
176
- lineno.push(i);
177
- }
178
- preLines[0].append(lineno.join('\n')+'\n');
179
- if(1){
180
- const code = result.join('\n')+'\n';
181
- preCode.forEach((e)=>e.innerText = code);
182
- }
183
- //console.debug("Updated TR",tr);
184
- Diff.initTableDiff(table).checkTableWidth(true);
185
- /*
186
- Reminders to self during development:
187
-
188
- SBS diff col layout:
189
- <td.diffln.difflnl><pre>...LHS line numbers...</pre></td>
190
- <td.difftxt.difftxtl><pre>...code lines...</pre></td>
191
- <td.diffsep>empty for this case (common lines)</td>
192
- <td.diffln.difflnr><pre>...RHS line numbers...</pre></td>
193
- <td.difftxt.difftxtr><pre>...dupe of col 2</pre></td>
194
-
195
- Unified diff col layout:
196
- <td.diffln.difflnl><pre>LHS line numbers</pre></td>
197
- <td.diffln.difflnr><pre>RHS line numbers</pre></td>
198
- <td.diffsep>empty in this case (common lines)</td>
199
- <td.difftxt.difftxtu><pre>code line</pre></td>
200
-
201
- C-side TODOs:
202
-
203
- - If we have that data readily available, it would be a big
204
- help (simplify our line calculations) if we stored the line
205
- number ranges in all elements which have that state handy.
206
- */
207
- }
208
- });
209
- };
210111
211112
/**
212113
Installs chunk-loading controls into TR.diffskip element tr.
213114
Each instance corresponds to a single TR.diffskip element.
214115
215116
--- src/fossil.diff.js
+++ src/fossil.diff.js
@@ -106,109 +106,10 @@
106 getLHS ? 1 : (isSplit ? 4 : 2)
107 )+')');
108 const m = f.rx[getStart ? 'start' : 'end'].exec(td.innerText);
109 return m ? +m[1] : undefined/*"shouldn't happen"*/;
110 };
111
112 /**
113 Fetches /jchunk for the given TR element then replaces the TR's
114 contents with data from the result of that request.
115 */
116 const fetchTrChunk = function(tr){
117 if(tr.dataset.xfer /* already being fetched */) return;
118 const table = tr.parentElement.parentElement;
119 const hash = table.dataset.lefthash;
120 if(!hash) return;
121 const isSbs = table.classList.contains('splitdiff')/*else udiff*/;
122 tr.dataset.xfer = 1 /* sentinel against multiple concurrent ajax requests */;
123 const lineTo = +tr.dataset.endln;
124 var lineFrom = +tr.dataset.startln;
125 /* TODO: for the time being, for simplicity, we'll read the whole
126 [startln, endln] chunk. "Later on" we'll maybe want to read it in
127 chunks of, say, 20 lines or so, adjusting lineFrom to be 1 if it would
128 be less than 1. */
129 Diff.fetchArtifactChunk({
130 urlParams:{
131 name: hash,
132 from: lineFrom,
133 to: lineTo
134 },
135 aftersend: function(){
136 delete tr.dataset.xfer;
137 Diff.config.chunkFetch.aftersend.apply(
138 this, Array.prototype.slice.call(arguments,0)
139 );
140 },
141 onload: function(result){
142 //console.debug("Chunk result: ",result);
143 /* Replace content of tr.diffskip with the fetches result.
144 When we refactor this to load in smaller chunks, we'll instead
145 need to keep this skipper in place and:
146
147 - Add a new TR above or above it, as apropriate.
148
149 - Change the TR.dataset.startln/endln values to account for
150 the just-fetched set.
151 */
152 D.clearElement(tr);
153 const cols = [], preCode = [D.pre()], preLines = [D.pre(), D.pre()];
154 if(isSbs){
155 cols.push(D.addClass(D.td(tr), 'diffln', 'difflnl'));
156 cols.push(D.addClass(D.td(tr), 'difftxt', 'difftxtl'));
157 cols.push(D.addClass(D.td(tr), 'diffsep'));
158 cols.push(D.addClass(D.td(tr), 'diffln', 'difflnr'));
159 cols.push(D.addClass(D.td(tr), 'difftxt', 'difftxtr'));
160 D.append(cols[0], preLines[0]);
161 D.append(cols[1], preCode[0]);
162 D.append(cols[3], preLines[1]);
163 preCode.push(D.pre());
164 D.append(cols[4], preCode[1]);
165 }else{
166 cols.push(D.addClass(D.td(tr), 'diffln', 'difflnl'));
167 cols.push(D.addClass(D.td(tr), 'diffln', 'difflnr'));
168 cols.push(D.addClass(D.td(tr), 'diffsep'));
169 cols.push(D.addClass(D.td(tr), 'difftxt', 'difftxtu'));
170 D.append(cols[0], preLines[0]);
171 D.append(cols[1], preLines[1]);
172 D.append(cols[3], preCode[0]);
173 }
174 let lineno = [], i;
175 for( i = lineFrom; i <= lineTo; ++i ){
176 lineno.push(i);
177 }
178 preLines[0].append(lineno.join('\n')+'\n');
179 if(1){
180 const code = result.join('\n')+'\n';
181 preCode.forEach((e)=>e.innerText = code);
182 }
183 //console.debug("Updated TR",tr);
184 Diff.initTableDiff(table).checkTableWidth(true);
185 /*
186 Reminders to self during development:
187
188 SBS diff col layout:
189 <td.diffln.difflnl><pre>...LHS line numbers...</pre></td>
190 <td.difftxt.difftxtl><pre>...code lines...</pre></td>
191 <td.diffsep>empty for this case (common lines)</td>
192 <td.diffln.difflnr><pre>...RHS line numbers...</pre></td>
193 <td.difftxt.difftxtr><pre>...dupe of col 2</pre></td>
194
195 Unified diff col layout:
196 <td.diffln.difflnl><pre>LHS line numbers</pre></td>
197 <td.diffln.difflnr><pre>RHS line numbers</pre></td>
198 <td.diffsep>empty in this case (common lines)</td>
199 <td.difftxt.difftxtu><pre>code line</pre></td>
200
201 C-side TODOs:
202
203 - If we have that data readily available, it would be a big
204 help (simplify our line calculations) if we stored the line
205 number ranges in all elements which have that state handy.
206 */
207 }
208 });
209 };
210
211 /**
212 Installs chunk-loading controls into TR.diffskip element tr.
213 Each instance corresponds to a single TR.diffskip element.
214
215
--- src/fossil.diff.js
+++ src/fossil.diff.js
@@ -106,109 +106,10 @@
106 getLHS ? 1 : (isSplit ? 4 : 2)
107 )+')');
108 const m = f.rx[getStart ? 'start' : 'end'].exec(td.innerText);
109 return m ? +m[1] : undefined/*"shouldn't happen"*/;
110 };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
112 /**
113 Installs chunk-loading controls into TR.diffskip element tr.
114 Each instance corresponds to a single TR.diffskip element.
115
116
--- src/fossil.page.fileedit.js
+++ src/fossil.page.fileedit.js
@@ -732,22 +732,24 @@
732732
P.e.taEditor.blur(/*force change event, if needed*/);
733733
P.tabs.switchToTab(P.e.tabs.preview);
734734
if(!P.e.cbAutoPreview.checked){/* If NOT in auto-preview mode, trigger an update. */
735735
P.preview();
736736
}
737
+ return false;
737738
}
738739
}, false);
739740
// If we're in the preview tab, have ctrl-enter switch back to the editor.
740741
document.body.addEventListener('keydown',function(ev){
741742
if(ev.ctrlKey && 13 === ev.keyCode){
742743
if(currentTab === P.e.tabs.preview){
743
- //ev.preventDefault();
744
- //ev.stopPropagation();
744
+ ev.preventDefault();
745
+ ev.stopPropagation();
745746
P.tabs.switchToTab(P.e.tabs.content);
746747
P.e.taEditor.focus(/*doesn't work for client-supplied editor widget!
747748
And it's slow as molasses for long docs, as focus()
748749
forces a document reflow.*/);
750
+ return false;
749751
}
750752
}
751753
}, true);
752754
753755
F.connectPagePreviewers(
754756
--- src/fossil.page.fileedit.js
+++ src/fossil.page.fileedit.js
@@ -732,22 +732,24 @@
732 P.e.taEditor.blur(/*force change event, if needed*/);
733 P.tabs.switchToTab(P.e.tabs.preview);
734 if(!P.e.cbAutoPreview.checked){/* If NOT in auto-preview mode, trigger an update. */
735 P.preview();
736 }
 
737 }
738 }, false);
739 // If we're in the preview tab, have ctrl-enter switch back to the editor.
740 document.body.addEventListener('keydown',function(ev){
741 if(ev.ctrlKey && 13 === ev.keyCode){
742 if(currentTab === P.e.tabs.preview){
743 //ev.preventDefault();
744 //ev.stopPropagation();
745 P.tabs.switchToTab(P.e.tabs.content);
746 P.e.taEditor.focus(/*doesn't work for client-supplied editor widget!
747 And it's slow as molasses for long docs, as focus()
748 forces a document reflow.*/);
 
749 }
750 }
751 }, true);
752
753 F.connectPagePreviewers(
754
--- src/fossil.page.fileedit.js
+++ src/fossil.page.fileedit.js
@@ -732,22 +732,24 @@
732 P.e.taEditor.blur(/*force change event, if needed*/);
733 P.tabs.switchToTab(P.e.tabs.preview);
734 if(!P.e.cbAutoPreview.checked){/* If NOT in auto-preview mode, trigger an update. */
735 P.preview();
736 }
737 return false;
738 }
739 }, false);
740 // If we're in the preview tab, have ctrl-enter switch back to the editor.
741 document.body.addEventListener('keydown',function(ev){
742 if(ev.ctrlKey && 13 === ev.keyCode){
743 if(currentTab === P.e.tabs.preview){
744 ev.preventDefault();
745 ev.stopPropagation();
746 P.tabs.switchToTab(P.e.tabs.content);
747 P.e.taEditor.focus(/*doesn't work for client-supplied editor widget!
748 And it's slow as molasses for long docs, as focus()
749 forces a document reflow.*/);
750 return false;
751 }
752 }
753 }, true);
754
755 F.connectPagePreviewers(
756
--- src/fossil.page.pikchrshow.js
+++ src/fossil.page.pikchrshow.js
@@ -100,11 +100,16 @@
100100
P.e.markupAlignWrapper );
101101
102102
////////////////////////////////////////////////////////////
103103
// Trigger preview on Ctrl-Enter.
104104
P.e.taContent.addEventListener('keydown',function(ev){
105
- if(ev.ctrlKey && 13 === ev.keyCode) P.preview();
105
+ if(ev.ctrlKey && 13 === ev.keyCode){
106
+ ev.preventDefault();
107
+ ev.stopPropagation();
108
+ P.preview();
109
+ return false;
110
+ }
106111
}, false);
107112
108113
////////////////////////////////////////////////////////////
109114
// Setup clipboard-copy of markup/SVG...
110115
F.copyButton(P.e.previewCopyButton, {copyFromElement: P.e.taPreviewText});
111116
--- src/fossil.page.pikchrshow.js
+++ src/fossil.page.pikchrshow.js
@@ -100,11 +100,16 @@
100 P.e.markupAlignWrapper );
101
102 ////////////////////////////////////////////////////////////
103 // Trigger preview on Ctrl-Enter.
104 P.e.taContent.addEventListener('keydown',function(ev){
105 if(ev.ctrlKey && 13 === ev.keyCode) P.preview();
 
 
 
 
 
106 }, false);
107
108 ////////////////////////////////////////////////////////////
109 // Setup clipboard-copy of markup/SVG...
110 F.copyButton(P.e.previewCopyButton, {copyFromElement: P.e.taPreviewText});
111
--- src/fossil.page.pikchrshow.js
+++ src/fossil.page.pikchrshow.js
@@ -100,11 +100,16 @@
100 P.e.markupAlignWrapper );
101
102 ////////////////////////////////////////////////////////////
103 // Trigger preview on Ctrl-Enter.
104 P.e.taContent.addEventListener('keydown',function(ev){
105 if(ev.ctrlKey && 13 === ev.keyCode){
106 ev.preventDefault();
107 ev.stopPropagation();
108 P.preview();
109 return false;
110 }
111 }, false);
112
113 ////////////////////////////////////////////////////////////
114 // Setup clipboard-copy of markup/SVG...
115 F.copyButton(P.e.previewCopyButton, {copyFromElement: P.e.taPreviewText});
116
--- src/fossil.page.wikiedit.js
+++ src/fossil.page.wikiedit.js
@@ -928,17 +928,18 @@
928928
}, false);
929929
// If we're in the preview tab, have ctrl-enter switch back to the editor.
930930
document.body.addEventListener('keydown',function(ev){
931931
if(ev.ctrlKey && 13 === ev.keyCode){
932932
if(currentTab === P.e.tabs.preview){
933
- //ev.preventDefault();
934
- //ev.stopPropagation();
933
+ ev.preventDefault();
934
+ ev.stopPropagation();
935935
P.tabs.switchToTab(P.e.tabs.content);
936936
P.e.taEditor.focus(/*doesn't work for client-supplied editor widget!
937937
And it's slow as molasses for long docs, as focus()
938938
forces a document reflow. */);
939939
//console.debug("BODY ctrl-enter");
940
+ return false;
940941
}
941942
}
942943
}, true);
943944
944945
F.connectPagePreviewers(
945946
--- src/fossil.page.wikiedit.js
+++ src/fossil.page.wikiedit.js
@@ -928,17 +928,18 @@
928 }, false);
929 // If we're in the preview tab, have ctrl-enter switch back to the editor.
930 document.body.addEventListener('keydown',function(ev){
931 if(ev.ctrlKey && 13 === ev.keyCode){
932 if(currentTab === P.e.tabs.preview){
933 //ev.preventDefault();
934 //ev.stopPropagation();
935 P.tabs.switchToTab(P.e.tabs.content);
936 P.e.taEditor.focus(/*doesn't work for client-supplied editor widget!
937 And it's slow as molasses for long docs, as focus()
938 forces a document reflow. */);
939 //console.debug("BODY ctrl-enter");
 
940 }
941 }
942 }, true);
943
944 F.connectPagePreviewers(
945
--- src/fossil.page.wikiedit.js
+++ src/fossil.page.wikiedit.js
@@ -928,17 +928,18 @@
928 }, false);
929 // If we're in the preview tab, have ctrl-enter switch back to the editor.
930 document.body.addEventListener('keydown',function(ev){
931 if(ev.ctrlKey && 13 === ev.keyCode){
932 if(currentTab === P.e.tabs.preview){
933 ev.preventDefault();
934 ev.stopPropagation();
935 P.tabs.switchToTab(P.e.tabs.content);
936 P.e.taEditor.focus(/*doesn't work for client-supplied editor widget!
937 And it's slow as molasses for long docs, as focus()
938 forces a document reflow. */);
939 //console.debug("BODY ctrl-enter");
940 return false;
941 }
942 }
943 }, true);
944
945 F.connectPagePreviewers(
946
+1 -2
--- www/mkindex.tcl
+++ www/mkindex.tcl
@@ -165,12 +165,11 @@
165165
<li> <a href='build.wiki'>Compiling and installing Fossil</a>
166166
<li> <a href='../COPYRIGHT-BSD2.txt'>License</a>
167167
<li> <a href='userlinks.wiki'>Miscellaneous Docs for Fossil Users</a>
168168
<li> <a href='hacker-howto.wiki'>Fossil Developer's Guide</a>
169169
<li> <a href='$ROOT/wiki?name=To+Do+List'>To Do List (Wiki)</a>
170
-<li> <a href='http://fossil-scm.org/schimpf-book/home'>Jim Schimpf's
171
-book</a>
170
+<li> <a href='http://fossil-scm.org/fossil-book/home'>Fossil book</a>
172171
</ul>
173172
<h2 id="pindex">Other Documents:</h2>
174173
<ul>}
175174
foreach entry $permindex {
176175
foreach {title file bold} $entry break
177176
--- www/mkindex.tcl
+++ www/mkindex.tcl
@@ -165,12 +165,11 @@
165 <li> <a href='build.wiki'>Compiling and installing Fossil</a>
166 <li> <a href='../COPYRIGHT-BSD2.txt'>License</a>
167 <li> <a href='userlinks.wiki'>Miscellaneous Docs for Fossil Users</a>
168 <li> <a href='hacker-howto.wiki'>Fossil Developer's Guide</a>
169 <li> <a href='$ROOT/wiki?name=To+Do+List'>To Do List (Wiki)</a>
170 <li> <a href='http://fossil-scm.org/schimpf-book/home'>Jim Schimpf's
171 book</a>
172 </ul>
173 <h2 id="pindex">Other Documents:</h2>
174 <ul>}
175 foreach entry $permindex {
176 foreach {title file bold} $entry break
177
--- www/mkindex.tcl
+++ www/mkindex.tcl
@@ -165,12 +165,11 @@
165 <li> <a href='build.wiki'>Compiling and installing Fossil</a>
166 <li> <a href='../COPYRIGHT-BSD2.txt'>License</a>
167 <li> <a href='userlinks.wiki'>Miscellaneous Docs for Fossil Users</a>
168 <li> <a href='hacker-howto.wiki'>Fossil Developer's Guide</a>
169 <li> <a href='$ROOT/wiki?name=To+Do+List'>To Do List (Wiki)</a>
170 <li> <a href='http://fossil-scm.org/fossil-book/home'>Fossil book</a>
 
171 </ul>
172 <h2 id="pindex">Other Documents:</h2>
173 <ul>}
174 foreach entry $permindex {
175 foreach {title file bold} $entry break
176
--- www/permutedindex.html
+++ www/permutedindex.html
@@ -14,12 +14,11 @@
1414
<li> <a href='build.wiki'>Compiling and installing Fossil</a>
1515
<li> <a href='../COPYRIGHT-BSD2.txt'>License</a>
1616
<li> <a href='userlinks.wiki'>Miscellaneous Docs for Fossil Users</a>
1717
<li> <a href='hacker-howto.wiki'>Fossil Developer's Guide</a>
1818
<li> <a href='$ROOT/wiki?name=To+Do+List'>To Do List (Wiki)</a>
19
-<li> <a href='http://fossil-scm.org/schimpf-book/home'>Jim Schimpf's
20
-book</a>
19
+<li> <a href='http://fossil-scm.org/fossil-book/home'>Fossil book</a>
2120
</ul>
2221
<h2 id="pindex">Other Documents:</h2>
2322
<ul>
2423
<li><a href="tech_overview.wiki">A Technical Overview Of The Design And Implementation Of Fossil</a></li>
2524
<li><a href="serverext.wiki">Adding Extensions To A Fossil Server Using CGI Scripts</a></li>
2625
--- www/permutedindex.html
+++ www/permutedindex.html
@@ -14,12 +14,11 @@
14 <li> <a href='build.wiki'>Compiling and installing Fossil</a>
15 <li> <a href='../COPYRIGHT-BSD2.txt'>License</a>
16 <li> <a href='userlinks.wiki'>Miscellaneous Docs for Fossil Users</a>
17 <li> <a href='hacker-howto.wiki'>Fossil Developer's Guide</a>
18 <li> <a href='$ROOT/wiki?name=To+Do+List'>To Do List (Wiki)</a>
19 <li> <a href='http://fossil-scm.org/schimpf-book/home'>Jim Schimpf's
20 book</a>
21 </ul>
22 <h2 id="pindex">Other Documents:</h2>
23 <ul>
24 <li><a href="tech_overview.wiki">A Technical Overview Of The Design And Implementation Of Fossil</a></li>
25 <li><a href="serverext.wiki">Adding Extensions To A Fossil Server Using CGI Scripts</a></li>
26
--- www/permutedindex.html
+++ www/permutedindex.html
@@ -14,12 +14,11 @@
14 <li> <a href='build.wiki'>Compiling and installing Fossil</a>
15 <li> <a href='../COPYRIGHT-BSD2.txt'>License</a>
16 <li> <a href='userlinks.wiki'>Miscellaneous Docs for Fossil Users</a>
17 <li> <a href='hacker-howto.wiki'>Fossil Developer's Guide</a>
18 <li> <a href='$ROOT/wiki?name=To+Do+List'>To Do List (Wiki)</a>
19 <li> <a href='http://fossil-scm.org/fossil-book/home'>Fossil book</a>
 
20 </ul>
21 <h2 id="pindex">Other Documents:</h2>
22 <ul>
23 <li><a href="tech_overview.wiki">A Technical Overview Of The Design And Implementation Of Fossil</a></li>
24 <li><a href="serverext.wiki">Adding Extensions To A Fossil Server Using CGI Scripts</a></li>
25

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button