Fossil SCM
Replace some usage of <center> tags with align="center" attributes.
Commit
fcfaae37dcbf82a1f49fc3972dabc93dea98f03c
Parent
243fc6c2467988f…
7 files changed
+3
-4
+10
-10
+1
-3
+23
-23
+1
-1
+9
-9
+18
-19
+3
-4
| --- src/user.c | ||
| +++ src/user.c | ||
| @@ -540,15 +540,14 @@ | ||
| 540 | 540 | style_submenu_element("Newer", "Newer entries", |
| 541 | 541 | "%s/access_log?o=%d&n=%d&y=%d", g.zTop, skip>=n ? skip-n : 0, |
| 542 | 542 | n, y); |
| 543 | 543 | } |
| 544 | 544 | rc = db_prepare_ignore_error(&q, "%s", blob_sql_text(&sql)); |
| 545 | - @ <center> | |
| 546 | 545 | fLogEnabled = db_get_boolean("access-log", 0); |
| 547 | - @ <div>Access logging is %s(fLogEnabled?"on":"off"). | |
| 546 | + @ <div align="center">Access logging is %s(fLogEnabled?"on":"off"). | |
| 548 | 547 | @ (Change this on the <a href="setup_settings">settings</a> page.)</div> |
| 549 | - @ <table border="1" cellpadding="5" id='logtable'> | |
| 548 | + @ <table border="1" cellpadding="5" id="logtable" align="center"> | |
| 550 | 549 | @ <thead><tr><th width="33%%">Date</th><th width="34%%">User</th> |
| 551 | 550 | @ <th width="33%%">IP Address</th></tr></thead><tbody> |
| 552 | 551 | while( rc==SQLITE_OK && db_step(&q)==SQLITE_ROW ){ |
| 553 | 552 | const char *zName = db_column_text(&q, 0); |
| 554 | 553 | const char *zIP = db_column_text(&q, 1); |
| @@ -569,11 +568,11 @@ | ||
| 569 | 568 | } |
| 570 | 569 | if( skip>0 || cnt>n ){ |
| 571 | 570 | style_submenu_element("All", "All entries", |
| 572 | 571 | "%s/access_log?n=10000000", g.zTop); |
| 573 | 572 | } |
| 574 | - @ </tbody></table></center> | |
| 573 | + @ </tbody></table> | |
| 575 | 574 | db_finalize(&q); |
| 576 | 575 | @ <hr /> |
| 577 | 576 | @ <form method="post" action="%s(g.zTop)/access_log"> |
| 578 | 577 | @ <label><input type="checkbox" name="delold"> |
| 579 | 578 | @ Delete all but the most recent 200 entries</input></label> |
| 580 | 579 |
| --- src/user.c | |
| +++ src/user.c | |
| @@ -540,15 +540,14 @@ | |
| 540 | style_submenu_element("Newer", "Newer entries", |
| 541 | "%s/access_log?o=%d&n=%d&y=%d", g.zTop, skip>=n ? skip-n : 0, |
| 542 | n, y); |
| 543 | } |
| 544 | rc = db_prepare_ignore_error(&q, "%s", blob_sql_text(&sql)); |
| 545 | @ <center> |
| 546 | fLogEnabled = db_get_boolean("access-log", 0); |
| 547 | @ <div>Access logging is %s(fLogEnabled?"on":"off"). |
| 548 | @ (Change this on the <a href="setup_settings">settings</a> page.)</div> |
| 549 | @ <table border="1" cellpadding="5" id='logtable'> |
| 550 | @ <thead><tr><th width="33%%">Date</th><th width="34%%">User</th> |
| 551 | @ <th width="33%%">IP Address</th></tr></thead><tbody> |
| 552 | while( rc==SQLITE_OK && db_step(&q)==SQLITE_ROW ){ |
| 553 | const char *zName = db_column_text(&q, 0); |
| 554 | const char *zIP = db_column_text(&q, 1); |
| @@ -569,11 +568,11 @@ | |
| 569 | } |
| 570 | if( skip>0 || cnt>n ){ |
| 571 | style_submenu_element("All", "All entries", |
| 572 | "%s/access_log?n=10000000", g.zTop); |
| 573 | } |
| 574 | @ </tbody></table></center> |
| 575 | db_finalize(&q); |
| 576 | @ <hr /> |
| 577 | @ <form method="post" action="%s(g.zTop)/access_log"> |
| 578 | @ <label><input type="checkbox" name="delold"> |
| 579 | @ Delete all but the most recent 200 entries</input></label> |
| 580 |
| --- src/user.c | |
| +++ src/user.c | |
| @@ -540,15 +540,14 @@ | |
| 540 | style_submenu_element("Newer", "Newer entries", |
| 541 | "%s/access_log?o=%d&n=%d&y=%d", g.zTop, skip>=n ? skip-n : 0, |
| 542 | n, y); |
| 543 | } |
| 544 | rc = db_prepare_ignore_error(&q, "%s", blob_sql_text(&sql)); |
| 545 | fLogEnabled = db_get_boolean("access-log", 0); |
| 546 | @ <div align="center">Access logging is %s(fLogEnabled?"on":"off"). |
| 547 | @ (Change this on the <a href="setup_settings">settings</a> page.)</div> |
| 548 | @ <table border="1" cellpadding="5" id="logtable" align="center"> |
| 549 | @ <thead><tr><th width="33%%">Date</th><th width="34%%">User</th> |
| 550 | @ <th width="33%%">IP Address</th></tr></thead><tbody> |
| 551 | while( rc==SQLITE_OK && db_step(&q)==SQLITE_ROW ){ |
| 552 | const char *zName = db_column_text(&q, 0); |
| 553 | const char *zIP = db_column_text(&q, 1); |
| @@ -569,11 +568,11 @@ | |
| 568 | } |
| 569 | if( skip>0 || cnt>n ){ |
| 570 | style_submenu_element("All", "All entries", |
| 571 | "%s/access_log?n=10000000", g.zTop); |
| 572 | } |
| 573 | @ </tbody></table> |
| 574 | db_finalize(&q); |
| 575 | @ <hr /> |
| 576 | @ <form method="post" action="%s(g.zTop)/access_log"> |
| 577 | @ <label><input type="checkbox" name="delold"> |
| 578 | @ Delete all but the most recent 200 entries</input></label> |
| 579 |
+10
-10
| --- www/branching.wiki | ||
| +++ www/branching.wiki | ||
| @@ -2,15 +2,15 @@ | ||
| 2 | 2 | <h2>Background</h2> |
| 3 | 3 | |
| 4 | 4 | In a simple and perfect world, the development of a project would proceed |
| 5 | 5 | linearly, as shown in figure 1. |
| 6 | 6 | |
| 7 | -<center><table border=1 cellpadding=10 hspace=10 vspace=10> | |
| 7 | +<table border=1 cellpadding=10 hspace=10 vspace=10 align="center"> | |
| 8 | 8 | <tr><td align="center"> |
| 9 | 9 | <img src="branch01.gif" width=280 height=68><br> |
| 10 | 10 | Figure 1 |
| 11 | -</td></tr></table></center> | |
| 11 | +</td></tr></table> | |
| 12 | 12 | |
| 13 | 13 | Each circle represents a check-in. For the sake of clarity, the check-ins |
| 14 | 14 | are given small consecutive numbers. In a real system, of course, the |
| 15 | 15 | check-in numbers would be 40-character SHA1 hashes since it is not possible |
| 16 | 16 | to allocate collision-free sequential numbers in a distributed system. |
| @@ -38,15 +38,15 @@ | ||
| 38 | 38 | |
| 39 | 39 | Alas, reality often interferes with the simple linear development of a |
| 40 | 40 | project. Suppose two programmers make independent modifications to check-in 2. |
| 41 | 41 | After both changes are committed, the check-in graph looks like figure 2: |
| 42 | 42 | |
| 43 | -<center><table border=1 cellpadding=10 hspace=10 vspace=10> | |
| 43 | +<table border=1 cellpadding=10 hspace=10 vspace=10 align="center"> | |
| 44 | 44 | <tr><td align="center"> |
| 45 | 45 | <img src="branch02.gif" width=210 height=140><br> |
| 46 | 46 | Figure 2 |
| 47 | -</td></tr></table></center> | |
| 47 | +</td></tr></table> | |
| 48 | 48 | |
| 49 | 49 | The graph in figure 2 has two leaves: check-ins 3 and 4. Check-in 2 has |
| 50 | 50 | two children, check-ins 3 and 4. We call this state a <i>fork</i>. |
| 51 | 51 | |
| 52 | 52 | Fossil tries to prevent forks. Suppose two programmers named Alice and |
| @@ -77,15 +77,15 @@ | ||
| 77 | 77 | To resolve this situation, Alice can use the fossil <b>merge</b> command |
| 78 | 78 | to merge in Bob's changes in her local copy of check-in 3. Then she |
| 79 | 79 | can commit the results as check-in 5. This results in a DAG as shown |
| 80 | 80 | in figure 3. |
| 81 | 81 | |
| 82 | -<center><table border=1 cellpadding=10 hspace=10 vspace=10> | |
| 82 | +<table border=1 cellpadding=10 hspace=10 vspace=10 align="center"> | |
| 83 | 83 | <tr><td align="center"> |
| 84 | 84 | <img src="branch03.gif" width=282 height=152><br> |
| 85 | 85 | Figure 3 |
| 86 | -</td></tr></table></center> | |
| 86 | +</td></tr></table> | |
| 87 | 87 | |
| 88 | 88 | Check-in 5 is a child of check-in 3 because it was created by editing |
| 89 | 89 | check-in 3. But check-in 5 also inherits the changes from check-in 4 by |
| 90 | 90 | virtue of the merge. So we say that check-in 5 is a <i>merge child</i> |
| 91 | 91 | of check-in 4 and that it is a <i>direct child</i> of check-in 3. |
| @@ -124,15 +124,15 @@ | ||
| 124 | 124 | When multiple leaves are desirable, we call this <i>branching</i> |
| 125 | 125 | instead of <i>forking</i>. |
| 126 | 126 | Figure 4 shows an example of a project where there are two branches, one |
| 127 | 127 | for development work and another for testing. |
| 128 | 128 | |
| 129 | -<center><table border=1 cellpadding=10 hspace=10 vspace=10> | |
| 129 | +<table border=1 cellpadding=10 hspace=10 vspace=10 align="center"> | |
| 130 | 130 | <tr><td align="center"> |
| 131 | 131 | <img src="branch04.gif" width=426 height=123><br> |
| 132 | 132 | Figure 4 |
| 133 | -</td></tr></table></center> | |
| 133 | +</td></tr></table> | |
| 134 | 134 | |
| 135 | 135 | The hypothetical scenario of figure 4 is this: The project starts and |
| 136 | 136 | progresses to a point where (at check-in 2) |
| 137 | 137 | it is ready to enter testing for its first release. |
| 138 | 138 | In a real project, of course, there might be hundreds or thousands of |
| @@ -164,15 +164,15 @@ | ||
| 164 | 164 | |
| 165 | 165 | Tags and properties are used in fossil to help express the intent, and |
| 166 | 166 | thus to distinguish between forks and branches. Figure 5 shows the |
| 167 | 167 | same scenario as figure 4 but with tags and properties added: |
| 168 | 168 | |
| 169 | -<center><table border=1 cellpadding=10 hspace=10 vspace=10> | |
| 169 | +<table border=1 cellpadding=10 hspace=10 vspace=10 align="center"> | |
| 170 | 170 | <tr><td align="center"> |
| 171 | 171 | <img src="branch05.gif" width=485 height=177><br> |
| 172 | 172 | Figure 5 |
| 173 | -</td></tr></table></center> | |
| 173 | +</td></tr></table> | |
| 174 | 174 | |
| 175 | 175 | A <i>tag</i> is a name that is attached to a check-in. A |
| 176 | 176 | <i>property</i> is a name/value pair. Internally, fossil implements |
| 177 | 177 | tags as properties with a NULL value. So, tags and properties really |
| 178 | 178 | are much the same thing, and henceforth we will use the word "tag" |
| 179 | 179 |
| --- www/branching.wiki | |
| +++ www/branching.wiki | |
| @@ -2,15 +2,15 @@ | |
| 2 | <h2>Background</h2> |
| 3 | |
| 4 | In a simple and perfect world, the development of a project would proceed |
| 5 | linearly, as shown in figure 1. |
| 6 | |
| 7 | <center><table border=1 cellpadding=10 hspace=10 vspace=10> |
| 8 | <tr><td align="center"> |
| 9 | <img src="branch01.gif" width=280 height=68><br> |
| 10 | Figure 1 |
| 11 | </td></tr></table></center> |
| 12 | |
| 13 | Each circle represents a check-in. For the sake of clarity, the check-ins |
| 14 | are given small consecutive numbers. In a real system, of course, the |
| 15 | check-in numbers would be 40-character SHA1 hashes since it is not possible |
| 16 | to allocate collision-free sequential numbers in a distributed system. |
| @@ -38,15 +38,15 @@ | |
| 38 | |
| 39 | Alas, reality often interferes with the simple linear development of a |
| 40 | project. Suppose two programmers make independent modifications to check-in 2. |
| 41 | After both changes are committed, the check-in graph looks like figure 2: |
| 42 | |
| 43 | <center><table border=1 cellpadding=10 hspace=10 vspace=10> |
| 44 | <tr><td align="center"> |
| 45 | <img src="branch02.gif" width=210 height=140><br> |
| 46 | Figure 2 |
| 47 | </td></tr></table></center> |
| 48 | |
| 49 | The graph in figure 2 has two leaves: check-ins 3 and 4. Check-in 2 has |
| 50 | two children, check-ins 3 and 4. We call this state a <i>fork</i>. |
| 51 | |
| 52 | Fossil tries to prevent forks. Suppose two programmers named Alice and |
| @@ -77,15 +77,15 @@ | |
| 77 | To resolve this situation, Alice can use the fossil <b>merge</b> command |
| 78 | to merge in Bob's changes in her local copy of check-in 3. Then she |
| 79 | can commit the results as check-in 5. This results in a DAG as shown |
| 80 | in figure 3. |
| 81 | |
| 82 | <center><table border=1 cellpadding=10 hspace=10 vspace=10> |
| 83 | <tr><td align="center"> |
| 84 | <img src="branch03.gif" width=282 height=152><br> |
| 85 | Figure 3 |
| 86 | </td></tr></table></center> |
| 87 | |
| 88 | Check-in 5 is a child of check-in 3 because it was created by editing |
| 89 | check-in 3. But check-in 5 also inherits the changes from check-in 4 by |
| 90 | virtue of the merge. So we say that check-in 5 is a <i>merge child</i> |
| 91 | of check-in 4 and that it is a <i>direct child</i> of check-in 3. |
| @@ -124,15 +124,15 @@ | |
| 124 | When multiple leaves are desirable, we call this <i>branching</i> |
| 125 | instead of <i>forking</i>. |
| 126 | Figure 4 shows an example of a project where there are two branches, one |
| 127 | for development work and another for testing. |
| 128 | |
| 129 | <center><table border=1 cellpadding=10 hspace=10 vspace=10> |
| 130 | <tr><td align="center"> |
| 131 | <img src="branch04.gif" width=426 height=123><br> |
| 132 | Figure 4 |
| 133 | </td></tr></table></center> |
| 134 | |
| 135 | The hypothetical scenario of figure 4 is this: The project starts and |
| 136 | progresses to a point where (at check-in 2) |
| 137 | it is ready to enter testing for its first release. |
| 138 | In a real project, of course, there might be hundreds or thousands of |
| @@ -164,15 +164,15 @@ | |
| 164 | |
| 165 | Tags and properties are used in fossil to help express the intent, and |
| 166 | thus to distinguish between forks and branches. Figure 5 shows the |
| 167 | same scenario as figure 4 but with tags and properties added: |
| 168 | |
| 169 | <center><table border=1 cellpadding=10 hspace=10 vspace=10> |
| 170 | <tr><td align="center"> |
| 171 | <img src="branch05.gif" width=485 height=177><br> |
| 172 | Figure 5 |
| 173 | </td></tr></table></center> |
| 174 | |
| 175 | A <i>tag</i> is a name that is attached to a check-in. A |
| 176 | <i>property</i> is a name/value pair. Internally, fossil implements |
| 177 | tags as properties with a NULL value. So, tags and properties really |
| 178 | are much the same thing, and henceforth we will use the word "tag" |
| 179 |
| --- www/branching.wiki | |
| +++ www/branching.wiki | |
| @@ -2,15 +2,15 @@ | |
| 2 | <h2>Background</h2> |
| 3 | |
| 4 | In a simple and perfect world, the development of a project would proceed |
| 5 | linearly, as shown in figure 1. |
| 6 | |
| 7 | <table border=1 cellpadding=10 hspace=10 vspace=10 align="center"> |
| 8 | <tr><td align="center"> |
| 9 | <img src="branch01.gif" width=280 height=68><br> |
| 10 | Figure 1 |
| 11 | </td></tr></table> |
| 12 | |
| 13 | Each circle represents a check-in. For the sake of clarity, the check-ins |
| 14 | are given small consecutive numbers. In a real system, of course, the |
| 15 | check-in numbers would be 40-character SHA1 hashes since it is not possible |
| 16 | to allocate collision-free sequential numbers in a distributed system. |
| @@ -38,15 +38,15 @@ | |
| 38 | |
| 39 | Alas, reality often interferes with the simple linear development of a |
| 40 | project. Suppose two programmers make independent modifications to check-in 2. |
| 41 | After both changes are committed, the check-in graph looks like figure 2: |
| 42 | |
| 43 | <table border=1 cellpadding=10 hspace=10 vspace=10 align="center"> |
| 44 | <tr><td align="center"> |
| 45 | <img src="branch02.gif" width=210 height=140><br> |
| 46 | Figure 2 |
| 47 | </td></tr></table> |
| 48 | |
| 49 | The graph in figure 2 has two leaves: check-ins 3 and 4. Check-in 2 has |
| 50 | two children, check-ins 3 and 4. We call this state a <i>fork</i>. |
| 51 | |
| 52 | Fossil tries to prevent forks. Suppose two programmers named Alice and |
| @@ -77,15 +77,15 @@ | |
| 77 | To resolve this situation, Alice can use the fossil <b>merge</b> command |
| 78 | to merge in Bob's changes in her local copy of check-in 3. Then she |
| 79 | can commit the results as check-in 5. This results in a DAG as shown |
| 80 | in figure 3. |
| 81 | |
| 82 | <table border=1 cellpadding=10 hspace=10 vspace=10 align="center"> |
| 83 | <tr><td align="center"> |
| 84 | <img src="branch03.gif" width=282 height=152><br> |
| 85 | Figure 3 |
| 86 | </td></tr></table> |
| 87 | |
| 88 | Check-in 5 is a child of check-in 3 because it was created by editing |
| 89 | check-in 3. But check-in 5 also inherits the changes from check-in 4 by |
| 90 | virtue of the merge. So we say that check-in 5 is a <i>merge child</i> |
| 91 | of check-in 4 and that it is a <i>direct child</i> of check-in 3. |
| @@ -124,15 +124,15 @@ | |
| 124 | When multiple leaves are desirable, we call this <i>branching</i> |
| 125 | instead of <i>forking</i>. |
| 126 | Figure 4 shows an example of a project where there are two branches, one |
| 127 | for development work and another for testing. |
| 128 | |
| 129 | <table border=1 cellpadding=10 hspace=10 vspace=10 align="center"> |
| 130 | <tr><td align="center"> |
| 131 | <img src="branch04.gif" width=426 height=123><br> |
| 132 | Figure 4 |
| 133 | </td></tr></table> |
| 134 | |
| 135 | The hypothetical scenario of figure 4 is this: The project starts and |
| 136 | progresses to a point where (at check-in 2) |
| 137 | it is ready to enter testing for its first release. |
| 138 | In a real project, of course, there might be hundreds or thousands of |
| @@ -164,15 +164,15 @@ | |
| 164 | |
| 165 | Tags and properties are used in fossil to help express the intent, and |
| 166 | thus to distinguish between forks and branches. Figure 5 shows the |
| 167 | same scenario as figure 4 but with tags and properties added: |
| 168 | |
| 169 | <table border=1 cellpadding=10 hspace=10 vspace=10 align="center"> |
| 170 | <tr><td align="center"> |
| 171 | <img src="branch05.gif" width=485 height=177><br> |
| 172 | Figure 5 |
| 173 | </td></tr></table> |
| 174 | |
| 175 | A <i>tag</i> is a name that is attached to a check-in. A |
| 176 | <i>property</i> is a name/value pair. Internally, fossil implements |
| 177 | tags as properties with a NULL value. So, tags and properties really |
| 178 | are much the same thing, and henceforth we will use the word "tag" |
| 179 |
+1
-3
| --- www/copyright-release.html | ||
| +++ www/copyright-release.html | ||
| @@ -74,12 +74,11 @@ | ||
| 74 | 74 | |
| 75 | 75 | <p>By filling in the following information and signing your name, |
| 76 | 76 | you agree to be bound by all of the terms |
| 77 | 77 | set forth in this agreement. Please print clearly.</p> |
| 78 | 78 | |
| 79 | -<center> | |
| 80 | -<p><table width="80%" border="1" cellpadding="0" cellspacing="0"> | |
| 79 | +<p><table width="80%" border="1" cellpadding="0" cellspacing="0" align="center"> | |
| 81 | 80 | <tr><td width="20%" valign="top">Your name & email:</td><td width="80%"> |
| 82 | 81 | |
| 83 | 82 | <!-- Replace this line with your name and email --> <p> |
| 84 | 83 | |
| 85 | 84 | </td></tr> |
| @@ -95,14 +94,13 @@ | ||
| 95 | 94 | |
| 96 | 95 | </td></tr> |
| 97 | 96 | <tr><td valign="top">Signature:</td><td> <p> </td></tr> |
| 98 | 97 | <tr><td valign="top">Date:</td><td> <p> </td></tr> |
| 99 | 98 | </table> |
| 100 | -</center> | |
| 101 | 99 | |
| 102 | 100 | <p>Send completed forms to: |
| 103 | 101 | <blockquote> |
| 104 | 102 | Hipp, Wyrick & Company, Inc.<br> |
| 105 | 103 | 6200 Maple Cove Lane<br> |
| 106 | 104 | Charlotte, NC 28269-1086<br> |
| 107 | 105 | USA |
| 108 | 106 | </p> |
| 109 | 107 |
| --- www/copyright-release.html | |
| +++ www/copyright-release.html | |
| @@ -74,12 +74,11 @@ | |
| 74 | |
| 75 | <p>By filling in the following information and signing your name, |
| 76 | you agree to be bound by all of the terms |
| 77 | set forth in this agreement. Please print clearly.</p> |
| 78 | |
| 79 | <center> |
| 80 | <p><table width="80%" border="1" cellpadding="0" cellspacing="0"> |
| 81 | <tr><td width="20%" valign="top">Your name & email:</td><td width="80%"> |
| 82 | |
| 83 | <!-- Replace this line with your name and email --> <p> |
| 84 | |
| 85 | </td></tr> |
| @@ -95,14 +94,13 @@ | |
| 95 | |
| 96 | </td></tr> |
| 97 | <tr><td valign="top">Signature:</td><td> <p> </td></tr> |
| 98 | <tr><td valign="top">Date:</td><td> <p> </td></tr> |
| 99 | </table> |
| 100 | </center> |
| 101 | |
| 102 | <p>Send completed forms to: |
| 103 | <blockquote> |
| 104 | Hipp, Wyrick & Company, Inc.<br> |
| 105 | 6200 Maple Cove Lane<br> |
| 106 | Charlotte, NC 28269-1086<br> |
| 107 | USA |
| 108 | </p> |
| 109 |
| --- www/copyright-release.html | |
| +++ www/copyright-release.html | |
| @@ -74,12 +74,11 @@ | |
| 74 | |
| 75 | <p>By filling in the following information and signing your name, |
| 76 | you agree to be bound by all of the terms |
| 77 | set forth in this agreement. Please print clearly.</p> |
| 78 | |
| 79 | <p><table width="80%" border="1" cellpadding="0" cellspacing="0" align="center"> |
| 80 | <tr><td width="20%" valign="top">Your name & email:</td><td width="80%"> |
| 81 | |
| 82 | <!-- Replace this line with your name and email --> <p> |
| 83 | |
| 84 | </td></tr> |
| @@ -95,14 +94,13 @@ | |
| 94 | |
| 95 | </td></tr> |
| 96 | <tr><td valign="top">Signature:</td><td> <p> </td></tr> |
| 97 | <tr><td valign="top">Date:</td><td> <p> </td></tr> |
| 98 | </table> |
| 99 | |
| 100 | <p>Send completed forms to: |
| 101 | <blockquote> |
| 102 | Hipp, Wyrick & Company, Inc.<br> |
| 103 | 6200 Maple Cove Lane<br> |
| 104 | Charlotte, NC 28269-1086<br> |
| 105 | USA |
| 106 | </p> |
| 107 |
+23
-23
| --- www/fossil-v-git.wiki | ||
| +++ www/fossil-v-git.wiki | ||
| @@ -19,11 +19,11 @@ | ||
| 19 | 19 | wiki, tickets, or tech-notes, so those elements will not transfer when |
| 20 | 20 | exporting from Fossil to Git.</i></small> |
| 21 | 21 | |
| 22 | 22 | <h2>2.0 Executive Summary:</h2> |
| 23 | 23 | |
| 24 | -<blockquote><center><table border=1 cellpadding=5> | |
| 24 | +<blockquote><table border=1 cellpadding=5 align=center> | |
| 25 | 25 | <tr><th width="50%">GIT</th><th width="50%">FOSSIL</th></tr> |
| 26 | 26 | <tr><td>File versioning only</td> |
| 27 | 27 | <td>Versioning, Tickets, Wiki, and Technotes</td></tr> |
| 28 | 28 | <tr><td>Ad-hoc, pile-of-files key/value database</td> |
| 29 | 29 | <td>Relational SQL database</td></tr> |
| @@ -34,11 +34,11 @@ | ||
| 34 | 34 | <tr><td>One check-out per repository</td> |
| 35 | 35 | <td>Many check-outs per repository</td></tr> |
| 36 | 36 | <tr><td>Remembers what you should have done</td> |
| 37 | 37 | <td>Remembers what you actually did</td></tr> |
| 38 | 38 | <tr><td>GPL</td><td>BSD</td></tr> |
| 39 | -</table></center></blockquote> | |
| 39 | +</table></blockquote> | |
| 40 | 40 | |
| 41 | 41 | <h2>3.0 Discussion</h2> |
| 42 | 42 | |
| 43 | 43 | <h3>3.1 Feature Set</h3> |
| 44 | 44 | |
| @@ -58,11 +58,11 @@ | ||
| 58 | 58 | |
| 59 | 59 | For developers who choose to self-host projects (rather than using a |
| 60 | 60 | 3rd-party service such as GitHub) Fossil is much easier to set up, since |
| 61 | 61 | the stand-alone Fossil executable together with a 2-line CGI script |
| 62 | 62 | suffice to instantiate a full-featured developer website. To accomplish |
| 63 | -the same using Git requires locating, installing, configuring, integrating, | |
| 63 | +the same using Git requires locating, installing, configuring, integrating, | |
| 64 | 64 | and managing a wide assortment of separate tools. Standing up a developer |
| 65 | 65 | website using Fossil can be done in minutes, whereas doing the same using |
| 66 | 66 | Git requires hours or days. |
| 67 | 67 | |
| 68 | 68 | <h3>3.2 Database</h3> |
| @@ -69,13 +69,13 @@ | ||
| 69 | 69 | |
| 70 | 70 | The baseline data structures for Fossil and Git are the same (modulo |
| 71 | 71 | formatting details). Both systems store check-ins as immutable |
| 72 | 72 | objects referencing their immediate ancestors and named by their SHA1 hash. |
| 73 | 73 | |
| 74 | -The difference is that Git stores its objects as individual files | |
| 74 | +The difference is that Git stores its objects as individual files | |
| 75 | 75 | in the ".git" folder or compressed into |
| 76 | -bespoke "pack-files", whereas Fossil stores its objects in a | |
| 76 | +bespoke "pack-files", whereas Fossil stores its objects in a | |
| 77 | 77 | relational ([https://www.sqlite.org/|SQLite]) database file. To put it |
| 78 | 78 | another way, Git uses an ad-hoc pile-of-files key/value database whereas |
| 79 | 79 | Fossil uses a proven, general-purpose SQL database. This |
| 80 | 80 | difference is more than an implementation detail. It |
| 81 | 81 | has important consequences. |
| @@ -87,13 +87,13 @@ | ||
| 87 | 87 | GitHub provide this capability. With Git, if you are looking at some |
| 88 | 88 | historical check-in then you cannot ask |
| 89 | 89 | "what came next" or "what are the children of this check-in". |
| 90 | 90 | |
| 91 | 91 | Fossil, on the other hand, parses essential information about check-ins |
| 92 | -(parents, children, committers, comments, files changed, etc.) | |
| 93 | -into a relational database that can be easily | |
| 94 | -queried using concise SQL statements to find both ancestors and | |
| 92 | +(parents, children, committers, comments, files changed, etc.) | |
| 93 | +into a relational database that can be easily | |
| 94 | +queried using concise SQL statements to find both ancestors and | |
| 95 | 95 | descendents of a check-in. |
| 96 | 96 | |
| 97 | 97 | Leaf check-ins in Git that lack a "ref" become "detached", making them |
| 98 | 98 | difficult to locate and subject to garbage collection. This |
| 99 | 99 | "detached head" problem has caused untold grief for countless |
| @@ -100,11 +100,11 @@ | ||
| 100 | 100 | Git users. With Fossil, all check-ins are easily located using |
| 101 | 101 | a variety of attributes (parents, children, committer, date, full-text |
| 102 | 102 | search of the check-in comment) and so detached heads are simply not possible. |
| 103 | 103 | |
| 104 | 104 | The ease with which check-ins can be located and queried in Fossil |
| 105 | -has resulted in a huge variety of reports and status screens | |
| 105 | +has resulted in a huge variety of reports and status screens | |
| 106 | 106 | ([./webpage-ex.md|examples]) that show project state |
| 107 | 107 | in ways that help developers |
| 108 | 108 | maintain enhanced awareness and comprehension |
| 109 | 109 | and avoid errors. |
| 110 | 110 | |
| @@ -112,11 +112,11 @@ | ||
| 112 | 112 | |
| 113 | 113 | Fossil and Git promote different development styles. Git promotes a |
| 114 | 114 | "bazaar" development style in which numerous anonymous developers make |
| 115 | 115 | small and sometimes haphazard contributions. Fossil |
| 116 | 116 | promotes a "cathedral" development model in which the project is |
| 117 | -closely supervised by an highly engaged architect and implemented by | |
| 117 | +closely supervised by an highly engaged architect and implemented by | |
| 118 | 118 | a clique of developers. |
| 119 | 119 | |
| 120 | 120 | Nota Bene: This is not to say that Git cannot be used for cathedral-style |
| 121 | 121 | development or that Fossil cannot be used for bazaar-style development. |
| 122 | 122 | They can be. But those modes are not their design intent nor the their |
| @@ -164,27 +164,27 @@ | ||
| 164 | 164 | Git consists of many small tools, each doing one small part of the job, |
| 165 | 165 | which can be recombined (by experts) to perform powerful operations. |
| 166 | 166 | Git has a lot of complexity and many dependencies and requires an "installer" |
| 167 | 167 | script or program to get it running. |
| 168 | 168 | |
| 169 | -Fossil is a single self-contained stand-alone executable with hardly | |
| 170 | -any dependencies. Fossil can be (and often is) run inside a | |
| 169 | +Fossil is a single self-contained stand-alone executable with hardly | |
| 170 | +any dependencies. Fossil can be (and often is) run inside a | |
| 171 | 171 | minimally configured chroot jail. To install Fossil, |
| 172 | 172 | one merely puts the executable on $PATH. |
| 173 | 173 | |
| 174 | -The designer of Git says that the unix philosophy is to have lots of | |
| 175 | -small tools that collaborate to get the job done. The designer of | |
| 176 | -Fossil says that the unix philosophy is "it just works". Both | |
| 177 | -individuals have written their DVCSes to reflect their own view | |
| 174 | +The designer of Git says that the unix philosophy is to have lots of | |
| 175 | +small tools that collaborate to get the job done. The designer of | |
| 176 | +Fossil says that the unix philosophy is "it just works". Both | |
| 177 | +individuals have written their DVCSes to reflect their own view | |
| 178 | 178 | of the "unix philosophy". |
| 179 | 179 | |
| 180 | 180 | <h3>3.6 One vs. Many Check-outs per Repository</h3> |
| 181 | 181 | |
| 182 | 182 | A "repository" in Git is a pile-of-files in the ".git" subdirectory |
| 183 | 183 | of a single check-out. The check-out and the repository are inseperable. |
| 184 | 184 | |
| 185 | -With Fossil, a "repository" is a single SQLite database file | |
| 185 | +With Fossil, a "repository" is a single SQLite database file | |
| 186 | 186 | that can be stored anywhere. There |
| 187 | 187 | can be multiple active check-outs from the same repository, perhaps |
| 188 | 188 | open on different branches or on different snapshots of the same branch. |
| 189 | 189 | Long-running tests or builds can be running in one check-out while |
| 190 | 190 | changes are being committed in another. |
| @@ -201,27 +201,27 @@ | ||
| 201 | 201 | |
| 202 | 202 | Fossil, in contrast, puts more emphasis on recording exactly what happened, |
| 203 | 203 | including all of the messy errors, dead-ends, experimental branches, and |
| 204 | 204 | so forth. One might argue that this |
| 205 | 205 | makes the history of a Fossil project "messy". But another point of view |
| 206 | -is that this makes the history "accurate". In actual practice, the | |
| 206 | +is that this makes the history "accurate". In actual practice, the | |
| 207 | 207 | superior reporting tools available in Fossil mean that the added "mess" |
| 208 | 208 | is not a factor. |
| 209 | 209 | |
| 210 | 210 | One commentator has mused that Git records history according to |
| 211 | 211 | the victors, whereas Fossil records history as it actually happened. |
| 212 | 212 | |
| 213 | 213 | <h3>3.8 GPL vs. BSD</h3> |
| 214 | 214 | |
| 215 | -Git is covered by the GPL license whereas Fossil is covered by | |
| 215 | +Git is covered by the GPL license whereas Fossil is covered by | |
| 216 | 216 | a two-clause BSD license. |
| 217 | 217 | |
| 218 | 218 | Consider the difference between GPL and BSD licenses: GPL is designed |
| 219 | 219 | to make writing easier at the expense of making reading harder. BSD is |
| 220 | 220 | designed to make reading easier and the expense of making writing harder. |
| 221 | 221 | |
| 222 | -To a first approximation, the GPL license grants the right to read | |
| 222 | +To a first approximation, the GPL license grants the right to read | |
| 223 | 223 | source code to anyone who promises to give back enhancements. In other |
| 224 | 224 | words, the act of reading GPL source code (a prerequiste for making changes) |
| 225 | 225 | implies acceptance of the license which requires updates to be contributed |
| 226 | 226 | back under the same license. (The details are more complex, but the |
| 227 | 227 | foregoing captures the essence of the idea.) A big advantage of the GPL |
| @@ -249,11 +249,11 @@ | ||
| 249 | 249 | <h2>4.0 Missing Features</h2> |
| 250 | 250 | |
| 251 | 251 | Most of the capabilities found in Git are also available in Fossil and |
| 252 | 252 | the other way around. For example, both systems have local check-outs, |
| 253 | 253 | remote repositories, push/pull/sync, bisect capabilities, and a "stash". |
| 254 | -Both systems store project history as a directed acyclic graph (DAG) | |
| 254 | +Both systems store project history as a directed acyclic graph (DAG) | |
| 255 | 255 | of immutable check-in objects. |
| 256 | 256 | |
| 257 | 257 | But there are a few capabilities in one system that are missing from the |
| 258 | 258 | other. |
| 259 | 259 | |
| @@ -271,16 +271,16 @@ | ||
| 271 | 271 | Git only provides versioning of source code. Fossil strives to provide |
| 272 | 272 | other related configuration management services as well. |
| 273 | 273 | |
| 274 | 274 | * <b>Named branches</b> |
| 275 | 275 | |
| 276 | - Branches in Fossil have persistent names that are propagated | |
| 276 | + Branches in Fossil have persistent names that are propagated | |
| 277 | 277 | to collaborators via [/help?cmd=push|push] and [/help?cmd=pull|pull]. |
| 278 | 278 | All developers see the same name on the same branch. Git, in contrast, |
| 279 | 279 | uses only local branch names, so developers working on the |
| 280 | 280 | same project can (and frequently do) use a different name for the |
| 281 | - same branch. | |
| 281 | + same branch. | |
| 282 | 282 | |
| 283 | 283 | * <b>The [/help?cmd=all|fossil all] command</b> |
| 284 | 284 | |
| 285 | 285 | Fossil keeps track of all repositories and check-outs and allows |
| 286 | 286 | operations over all of them with a single command. For example, in |
| 287 | 287 |
| --- www/fossil-v-git.wiki | |
| +++ www/fossil-v-git.wiki | |
| @@ -19,11 +19,11 @@ | |
| 19 | wiki, tickets, or tech-notes, so those elements will not transfer when |
| 20 | exporting from Fossil to Git.</i></small> |
| 21 | |
| 22 | <h2>2.0 Executive Summary:</h2> |
| 23 | |
| 24 | <blockquote><center><table border=1 cellpadding=5> |
| 25 | <tr><th width="50%">GIT</th><th width="50%">FOSSIL</th></tr> |
| 26 | <tr><td>File versioning only</td> |
| 27 | <td>Versioning, Tickets, Wiki, and Technotes</td></tr> |
| 28 | <tr><td>Ad-hoc, pile-of-files key/value database</td> |
| 29 | <td>Relational SQL database</td></tr> |
| @@ -34,11 +34,11 @@ | |
| 34 | <tr><td>One check-out per repository</td> |
| 35 | <td>Many check-outs per repository</td></tr> |
| 36 | <tr><td>Remembers what you should have done</td> |
| 37 | <td>Remembers what you actually did</td></tr> |
| 38 | <tr><td>GPL</td><td>BSD</td></tr> |
| 39 | </table></center></blockquote> |
| 40 | |
| 41 | <h2>3.0 Discussion</h2> |
| 42 | |
| 43 | <h3>3.1 Feature Set</h3> |
| 44 | |
| @@ -58,11 +58,11 @@ | |
| 58 | |
| 59 | For developers who choose to self-host projects (rather than using a |
| 60 | 3rd-party service such as GitHub) Fossil is much easier to set up, since |
| 61 | the stand-alone Fossil executable together with a 2-line CGI script |
| 62 | suffice to instantiate a full-featured developer website. To accomplish |
| 63 | the same using Git requires locating, installing, configuring, integrating, |
| 64 | and managing a wide assortment of separate tools. Standing up a developer |
| 65 | website using Fossil can be done in minutes, whereas doing the same using |
| 66 | Git requires hours or days. |
| 67 | |
| 68 | <h3>3.2 Database</h3> |
| @@ -69,13 +69,13 @@ | |
| 69 | |
| 70 | The baseline data structures for Fossil and Git are the same (modulo |
| 71 | formatting details). Both systems store check-ins as immutable |
| 72 | objects referencing their immediate ancestors and named by their SHA1 hash. |
| 73 | |
| 74 | The difference is that Git stores its objects as individual files |
| 75 | in the ".git" folder or compressed into |
| 76 | bespoke "pack-files", whereas Fossil stores its objects in a |
| 77 | relational ([https://www.sqlite.org/|SQLite]) database file. To put it |
| 78 | another way, Git uses an ad-hoc pile-of-files key/value database whereas |
| 79 | Fossil uses a proven, general-purpose SQL database. This |
| 80 | difference is more than an implementation detail. It |
| 81 | has important consequences. |
| @@ -87,13 +87,13 @@ | |
| 87 | GitHub provide this capability. With Git, if you are looking at some |
| 88 | historical check-in then you cannot ask |
| 89 | "what came next" or "what are the children of this check-in". |
| 90 | |
| 91 | Fossil, on the other hand, parses essential information about check-ins |
| 92 | (parents, children, committers, comments, files changed, etc.) |
| 93 | into a relational database that can be easily |
| 94 | queried using concise SQL statements to find both ancestors and |
| 95 | descendents of a check-in. |
| 96 | |
| 97 | Leaf check-ins in Git that lack a "ref" become "detached", making them |
| 98 | difficult to locate and subject to garbage collection. This |
| 99 | "detached head" problem has caused untold grief for countless |
| @@ -100,11 +100,11 @@ | |
| 100 | Git users. With Fossil, all check-ins are easily located using |
| 101 | a variety of attributes (parents, children, committer, date, full-text |
| 102 | search of the check-in comment) and so detached heads are simply not possible. |
| 103 | |
| 104 | The ease with which check-ins can be located and queried in Fossil |
| 105 | has resulted in a huge variety of reports and status screens |
| 106 | ([./webpage-ex.md|examples]) that show project state |
| 107 | in ways that help developers |
| 108 | maintain enhanced awareness and comprehension |
| 109 | and avoid errors. |
| 110 | |
| @@ -112,11 +112,11 @@ | |
| 112 | |
| 113 | Fossil and Git promote different development styles. Git promotes a |
| 114 | "bazaar" development style in which numerous anonymous developers make |
| 115 | small and sometimes haphazard contributions. Fossil |
| 116 | promotes a "cathedral" development model in which the project is |
| 117 | closely supervised by an highly engaged architect and implemented by |
| 118 | a clique of developers. |
| 119 | |
| 120 | Nota Bene: This is not to say that Git cannot be used for cathedral-style |
| 121 | development or that Fossil cannot be used for bazaar-style development. |
| 122 | They can be. But those modes are not their design intent nor the their |
| @@ -164,27 +164,27 @@ | |
| 164 | Git consists of many small tools, each doing one small part of the job, |
| 165 | which can be recombined (by experts) to perform powerful operations. |
| 166 | Git has a lot of complexity and many dependencies and requires an "installer" |
| 167 | script or program to get it running. |
| 168 | |
| 169 | Fossil is a single self-contained stand-alone executable with hardly |
| 170 | any dependencies. Fossil can be (and often is) run inside a |
| 171 | minimally configured chroot jail. To install Fossil, |
| 172 | one merely puts the executable on $PATH. |
| 173 | |
| 174 | The designer of Git says that the unix philosophy is to have lots of |
| 175 | small tools that collaborate to get the job done. The designer of |
| 176 | Fossil says that the unix philosophy is "it just works". Both |
| 177 | individuals have written their DVCSes to reflect their own view |
| 178 | of the "unix philosophy". |
| 179 | |
| 180 | <h3>3.6 One vs. Many Check-outs per Repository</h3> |
| 181 | |
| 182 | A "repository" in Git is a pile-of-files in the ".git" subdirectory |
| 183 | of a single check-out. The check-out and the repository are inseperable. |
| 184 | |
| 185 | With Fossil, a "repository" is a single SQLite database file |
| 186 | that can be stored anywhere. There |
| 187 | can be multiple active check-outs from the same repository, perhaps |
| 188 | open on different branches or on different snapshots of the same branch. |
| 189 | Long-running tests or builds can be running in one check-out while |
| 190 | changes are being committed in another. |
| @@ -201,27 +201,27 @@ | |
| 201 | |
| 202 | Fossil, in contrast, puts more emphasis on recording exactly what happened, |
| 203 | including all of the messy errors, dead-ends, experimental branches, and |
| 204 | so forth. One might argue that this |
| 205 | makes the history of a Fossil project "messy". But another point of view |
| 206 | is that this makes the history "accurate". In actual practice, the |
| 207 | superior reporting tools available in Fossil mean that the added "mess" |
| 208 | is not a factor. |
| 209 | |
| 210 | One commentator has mused that Git records history according to |
| 211 | the victors, whereas Fossil records history as it actually happened. |
| 212 | |
| 213 | <h3>3.8 GPL vs. BSD</h3> |
| 214 | |
| 215 | Git is covered by the GPL license whereas Fossil is covered by |
| 216 | a two-clause BSD license. |
| 217 | |
| 218 | Consider the difference between GPL and BSD licenses: GPL is designed |
| 219 | to make writing easier at the expense of making reading harder. BSD is |
| 220 | designed to make reading easier and the expense of making writing harder. |
| 221 | |
| 222 | To a first approximation, the GPL license grants the right to read |
| 223 | source code to anyone who promises to give back enhancements. In other |
| 224 | words, the act of reading GPL source code (a prerequiste for making changes) |
| 225 | implies acceptance of the license which requires updates to be contributed |
| 226 | back under the same license. (The details are more complex, but the |
| 227 | foregoing captures the essence of the idea.) A big advantage of the GPL |
| @@ -249,11 +249,11 @@ | |
| 249 | <h2>4.0 Missing Features</h2> |
| 250 | |
| 251 | Most of the capabilities found in Git are also available in Fossil and |
| 252 | the other way around. For example, both systems have local check-outs, |
| 253 | remote repositories, push/pull/sync, bisect capabilities, and a "stash". |
| 254 | Both systems store project history as a directed acyclic graph (DAG) |
| 255 | of immutable check-in objects. |
| 256 | |
| 257 | But there are a few capabilities in one system that are missing from the |
| 258 | other. |
| 259 | |
| @@ -271,16 +271,16 @@ | |
| 271 | Git only provides versioning of source code. Fossil strives to provide |
| 272 | other related configuration management services as well. |
| 273 | |
| 274 | * <b>Named branches</b> |
| 275 | |
| 276 | Branches in Fossil have persistent names that are propagated |
| 277 | to collaborators via [/help?cmd=push|push] and [/help?cmd=pull|pull]. |
| 278 | All developers see the same name on the same branch. Git, in contrast, |
| 279 | uses only local branch names, so developers working on the |
| 280 | same project can (and frequently do) use a different name for the |
| 281 | same branch. |
| 282 | |
| 283 | * <b>The [/help?cmd=all|fossil all] command</b> |
| 284 | |
| 285 | Fossil keeps track of all repositories and check-outs and allows |
| 286 | operations over all of them with a single command. For example, in |
| 287 |
| --- www/fossil-v-git.wiki | |
| +++ www/fossil-v-git.wiki | |
| @@ -19,11 +19,11 @@ | |
| 19 | wiki, tickets, or tech-notes, so those elements will not transfer when |
| 20 | exporting from Fossil to Git.</i></small> |
| 21 | |
| 22 | <h2>2.0 Executive Summary:</h2> |
| 23 | |
| 24 | <blockquote><table border=1 cellpadding=5 align=center> |
| 25 | <tr><th width="50%">GIT</th><th width="50%">FOSSIL</th></tr> |
| 26 | <tr><td>File versioning only</td> |
| 27 | <td>Versioning, Tickets, Wiki, and Technotes</td></tr> |
| 28 | <tr><td>Ad-hoc, pile-of-files key/value database</td> |
| 29 | <td>Relational SQL database</td></tr> |
| @@ -34,11 +34,11 @@ | |
| 34 | <tr><td>One check-out per repository</td> |
| 35 | <td>Many check-outs per repository</td></tr> |
| 36 | <tr><td>Remembers what you should have done</td> |
| 37 | <td>Remembers what you actually did</td></tr> |
| 38 | <tr><td>GPL</td><td>BSD</td></tr> |
| 39 | </table></blockquote> |
| 40 | |
| 41 | <h2>3.0 Discussion</h2> |
| 42 | |
| 43 | <h3>3.1 Feature Set</h3> |
| 44 | |
| @@ -58,11 +58,11 @@ | |
| 58 | |
| 59 | For developers who choose to self-host projects (rather than using a |
| 60 | 3rd-party service such as GitHub) Fossil is much easier to set up, since |
| 61 | the stand-alone Fossil executable together with a 2-line CGI script |
| 62 | suffice to instantiate a full-featured developer website. To accomplish |
| 63 | the same using Git requires locating, installing, configuring, integrating, |
| 64 | and managing a wide assortment of separate tools. Standing up a developer |
| 65 | website using Fossil can be done in minutes, whereas doing the same using |
| 66 | Git requires hours or days. |
| 67 | |
| 68 | <h3>3.2 Database</h3> |
| @@ -69,13 +69,13 @@ | |
| 69 | |
| 70 | The baseline data structures for Fossil and Git are the same (modulo |
| 71 | formatting details). Both systems store check-ins as immutable |
| 72 | objects referencing their immediate ancestors and named by their SHA1 hash. |
| 73 | |
| 74 | The difference is that Git stores its objects as individual files |
| 75 | in the ".git" folder or compressed into |
| 76 | bespoke "pack-files", whereas Fossil stores its objects in a |
| 77 | relational ([https://www.sqlite.org/|SQLite]) database file. To put it |
| 78 | another way, Git uses an ad-hoc pile-of-files key/value database whereas |
| 79 | Fossil uses a proven, general-purpose SQL database. This |
| 80 | difference is more than an implementation detail. It |
| 81 | has important consequences. |
| @@ -87,13 +87,13 @@ | |
| 87 | GitHub provide this capability. With Git, if you are looking at some |
| 88 | historical check-in then you cannot ask |
| 89 | "what came next" or "what are the children of this check-in". |
| 90 | |
| 91 | Fossil, on the other hand, parses essential information about check-ins |
| 92 | (parents, children, committers, comments, files changed, etc.) |
| 93 | into a relational database that can be easily |
| 94 | queried using concise SQL statements to find both ancestors and |
| 95 | descendents of a check-in. |
| 96 | |
| 97 | Leaf check-ins in Git that lack a "ref" become "detached", making them |
| 98 | difficult to locate and subject to garbage collection. This |
| 99 | "detached head" problem has caused untold grief for countless |
| @@ -100,11 +100,11 @@ | |
| 100 | Git users. With Fossil, all check-ins are easily located using |
| 101 | a variety of attributes (parents, children, committer, date, full-text |
| 102 | search of the check-in comment) and so detached heads are simply not possible. |
| 103 | |
| 104 | The ease with which check-ins can be located and queried in Fossil |
| 105 | has resulted in a huge variety of reports and status screens |
| 106 | ([./webpage-ex.md|examples]) that show project state |
| 107 | in ways that help developers |
| 108 | maintain enhanced awareness and comprehension |
| 109 | and avoid errors. |
| 110 | |
| @@ -112,11 +112,11 @@ | |
| 112 | |
| 113 | Fossil and Git promote different development styles. Git promotes a |
| 114 | "bazaar" development style in which numerous anonymous developers make |
| 115 | small and sometimes haphazard contributions. Fossil |
| 116 | promotes a "cathedral" development model in which the project is |
| 117 | closely supervised by an highly engaged architect and implemented by |
| 118 | a clique of developers. |
| 119 | |
| 120 | Nota Bene: This is not to say that Git cannot be used for cathedral-style |
| 121 | development or that Fossil cannot be used for bazaar-style development. |
| 122 | They can be. But those modes are not their design intent nor the their |
| @@ -164,27 +164,27 @@ | |
| 164 | Git consists of many small tools, each doing one small part of the job, |
| 165 | which can be recombined (by experts) to perform powerful operations. |
| 166 | Git has a lot of complexity and many dependencies and requires an "installer" |
| 167 | script or program to get it running. |
| 168 | |
| 169 | Fossil is a single self-contained stand-alone executable with hardly |
| 170 | any dependencies. Fossil can be (and often is) run inside a |
| 171 | minimally configured chroot jail. To install Fossil, |
| 172 | one merely puts the executable on $PATH. |
| 173 | |
| 174 | The designer of Git says that the unix philosophy is to have lots of |
| 175 | small tools that collaborate to get the job done. The designer of |
| 176 | Fossil says that the unix philosophy is "it just works". Both |
| 177 | individuals have written their DVCSes to reflect their own view |
| 178 | of the "unix philosophy". |
| 179 | |
| 180 | <h3>3.6 One vs. Many Check-outs per Repository</h3> |
| 181 | |
| 182 | A "repository" in Git is a pile-of-files in the ".git" subdirectory |
| 183 | of a single check-out. The check-out and the repository are inseperable. |
| 184 | |
| 185 | With Fossil, a "repository" is a single SQLite database file |
| 186 | that can be stored anywhere. There |
| 187 | can be multiple active check-outs from the same repository, perhaps |
| 188 | open on different branches or on different snapshots of the same branch. |
| 189 | Long-running tests or builds can be running in one check-out while |
| 190 | changes are being committed in another. |
| @@ -201,27 +201,27 @@ | |
| 201 | |
| 202 | Fossil, in contrast, puts more emphasis on recording exactly what happened, |
| 203 | including all of the messy errors, dead-ends, experimental branches, and |
| 204 | so forth. One might argue that this |
| 205 | makes the history of a Fossil project "messy". But another point of view |
| 206 | is that this makes the history "accurate". In actual practice, the |
| 207 | superior reporting tools available in Fossil mean that the added "mess" |
| 208 | is not a factor. |
| 209 | |
| 210 | One commentator has mused that Git records history according to |
| 211 | the victors, whereas Fossil records history as it actually happened. |
| 212 | |
| 213 | <h3>3.8 GPL vs. BSD</h3> |
| 214 | |
| 215 | Git is covered by the GPL license whereas Fossil is covered by |
| 216 | a two-clause BSD license. |
| 217 | |
| 218 | Consider the difference between GPL and BSD licenses: GPL is designed |
| 219 | to make writing easier at the expense of making reading harder. BSD is |
| 220 | designed to make reading easier and the expense of making writing harder. |
| 221 | |
| 222 | To a first approximation, the GPL license grants the right to read |
| 223 | source code to anyone who promises to give back enhancements. In other |
| 224 | words, the act of reading GPL source code (a prerequiste for making changes) |
| 225 | implies acceptance of the license which requires updates to be contributed |
| 226 | back under the same license. (The details are more complex, but the |
| 227 | foregoing captures the essence of the idea.) A big advantage of the GPL |
| @@ -249,11 +249,11 @@ | |
| 249 | <h2>4.0 Missing Features</h2> |
| 250 | |
| 251 | Most of the capabilities found in Git are also available in Fossil and |
| 252 | the other way around. For example, both systems have local check-outs, |
| 253 | remote repositories, push/pull/sync, bisect capabilities, and a "stash". |
| 254 | Both systems store project history as a directed acyclic graph (DAG) |
| 255 | of immutable check-in objects. |
| 256 | |
| 257 | But there are a few capabilities in one system that are missing from the |
| 258 | other. |
| 259 | |
| @@ -271,16 +271,16 @@ | |
| 271 | Git only provides versioning of source code. Fossil strives to provide |
| 272 | other related configuration management services as well. |
| 273 | |
| 274 | * <b>Named branches</b> |
| 275 | |
| 276 | Branches in Fossil have persistent names that are propagated |
| 277 | to collaborators via [/help?cmd=push|push] and [/help?cmd=pull|pull]. |
| 278 | All developers see the same name on the same branch. Git, in contrast, |
| 279 | uses only local branch names, so developers working on the |
| 280 | same project can (and frequently do) use a different name for the |
| 281 | same branch. |
| 282 | |
| 283 | * <b>The [/help?cmd=all|fossil all] command</b> |
| 284 | |
| 285 | Fossil keeps track of all repositories and check-outs and allows |
| 286 | operations over all of them with a single command. For example, in |
| 287 |
+1
-1
| --- www/index.wiki | ||
| +++ www/index.wiki | ||
| @@ -18,11 +18,11 @@ | ||
| 18 | 18 | <ul> |
| 19 | 19 | <li> [http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/fossil-users | sign-up] |
| 20 | 20 | <li> [http://www.mail-archive.com/[email protected] | archives] |
| 21 | 21 | </ul> |
| 22 | 22 | </ul> |
| 23 | -<center><img src="fossil3.gif"></center> | |
| 23 | +<img src="fossil3.gif" align="center"> | |
| 24 | 24 | </div> |
| 25 | 25 | |
| 26 | 26 | <p>Fossil is a simple, high-reliability, distributed software configuration |
| 27 | 27 | management system with these advanced features: |
| 28 | 28 | |
| 29 | 29 |
| --- www/index.wiki | |
| +++ www/index.wiki | |
| @@ -18,11 +18,11 @@ | |
| 18 | <ul> |
| 19 | <li> [http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/fossil-users | sign-up] |
| 20 | <li> [http://www.mail-archive.com/[email protected] | archives] |
| 21 | </ul> |
| 22 | </ul> |
| 23 | <center><img src="fossil3.gif"></center> |
| 24 | </div> |
| 25 | |
| 26 | <p>Fossil is a simple, high-reliability, distributed software configuration |
| 27 | management system with these advanced features: |
| 28 | |
| 29 |
| --- www/index.wiki | |
| +++ www/index.wiki | |
| @@ -18,11 +18,11 @@ | |
| 18 | <ul> |
| 19 | <li> [http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/fossil-users | sign-up] |
| 20 | <li> [http://www.mail-archive.com/[email protected] | archives] |
| 21 | </ul> |
| 22 | </ul> |
| 23 | <img src="fossil3.gif" align="center"> |
| 24 | </div> |
| 25 | |
| 26 | <p>Fossil is a simple, high-reliability, distributed software configuration |
| 27 | management system with these advanced features: |
| 28 | |
| 29 |
+9
-9
| --- www/sync.wiki | ||
| +++ www/sync.wiki | ||
| @@ -15,11 +15,11 @@ | ||
| 15 | 15 | Synchronization is simply the process of sharing artifacts between |
| 16 | 16 | servers so that all servers have copies of all artifacts. Because |
| 17 | 17 | artifacts are unordered, the order in which artifacts are received |
| 18 | 18 | at a server is inconsequential. It is assumed that the SHA1 hashes |
| 19 | 19 | of artifacts are unique - that every artifact has a different SHA1 hash. |
| 20 | -To a first approximation, synchronization proceeds by sharing lists | |
| 20 | +To a first approximation, synchronization proceeds by sharing lists | |
| 21 | 21 | SHA1 hashes of available artifacts, then sharing those artifacts that |
| 22 | 22 | are not found on one side or the other of the connection. In practice, |
| 23 | 23 | a repository might contain millions of artifacts. The list of |
| 24 | 24 | SHA1 hashes for this many artifacts can be large. So optimizations are |
| 25 | 25 | employed that usually reduce the number of SHA1 hashes that need to be |
| @@ -150,11 +150,11 @@ | ||
| 150 | 150 | terminates the login card. The signature is the SHA1 hash of |
| 151 | 151 | the concatenation of the nonce and the users password.</p> |
| 152 | 152 | |
| 153 | 153 | <p>For each login card, the server looks up the user and verifies |
| 154 | 154 | that the nonce matches the SHA1 hash of the remainder of the |
| 155 | -message. It then checks the signature hash to make sure the | |
| 155 | +message. It then checks the signature hash to make sure the | |
| 156 | 156 | signature matches. If everything |
| 157 | 157 | checks out, then the client is granted all privileges of the |
| 158 | 158 | specified user.</p> |
| 159 | 159 | |
| 160 | 160 | <p>Privileges are cumulative. There can be multiple successful |
| @@ -162,11 +162,11 @@ | ||
| 162 | 162 | privileges of each individual login.</p> |
| 163 | 163 | |
| 164 | 164 | <h3>3.3 File and Compressed File Cards</h3> |
| 165 | 165 | |
| 166 | 166 | <p>Artifacts are transferred using either "file" cards, or "cfile" cards. |
| 167 | -(The name "file" card comes from the fact that most artifacts correspond to | |
| 167 | +(The name "file" card comes from the fact that most artifacts correspond to | |
| 168 | 168 | files, and "cfile" is just a compressed file.) |
| 169 | 169 | </p> |
| 170 | 170 | |
| 171 | 171 | <h4>3.3.1 File Cards</h4> |
| 172 | 172 | |
| @@ -230,11 +230,11 @@ | ||
| 230 | 230 | artifact. If the cfile card has four arguments, then the payload is a |
| 231 | 231 | delta and the second argument is the ID of another artifact that is the |
| 232 | 232 | source of the delta and the third argument is the original size of the |
| 233 | 233 | delta artifact.</p> |
| 234 | 234 | |
| 235 | -<p>Unlike file cards, cfile cards are only sent in one direction during a | |
| 235 | +<p>Unlike file cards, cfile cards are only sent in one direction during a | |
| 236 | 236 | clone from server to client for clone protocol version "3" or greater.</p> |
| 237 | 237 | |
| 238 | 238 | <h3>3.4 Push and Pull Cards</h3> |
| 239 | 239 | |
| 240 | 240 | <p>Among the first cards in a client-to-server message are |
| @@ -385,11 +385,11 @@ | ||
| 385 | 385 | </blockquote> |
| 386 | 386 | |
| 387 | 387 | <p>As of [/timeline?r=trunk&c=2015-03-19+03%3A57%3A46&n=20|2015-03-19], the configuration-name must be one of the |
| 388 | 388 | following values: |
| 389 | 389 | |
| 390 | -<center><table border=0> | |
| 390 | +<table border=0 align="center"> | |
| 391 | 391 | <tr><td valign="top"> |
| 392 | 392 | <ul> |
| 393 | 393 | <li> css |
| 394 | 394 | <li> header |
| 395 | 395 | <li> footer |
| @@ -436,11 +436,11 @@ | ||
| 436 | 436 | <li> @reportfmt |
| 437 | 437 | <li> @user |
| 438 | 438 | <li> @concealed |
| 439 | 439 | <li> @shun |
| 440 | 440 | </ul></td></tr> |
| 441 | -</table></center> | |
| 441 | +</table> | |
| 442 | 442 | |
| 443 | 443 | <p>New configuration-names are likely to be added in future releases of |
| 444 | 444 | Fossil. If the server receives a configuration-name that it does not |
| 445 | 445 | understand, the entire reqconfig card is silently ignored. The reqconfig |
| 446 | 446 | card might also be ignored if the user lacks sufficient privilege to |
| @@ -453,11 +453,11 @@ | ||
| 453 | 453 | The value of the configuration item is returned to the client using a |
| 454 | 454 | "config" card. |
| 455 | 455 | |
| 456 | 456 | <p>If the configuration-name begins with "@", that refers to a class of |
| 457 | 457 | values instead of a single value. The content of these configuration items |
| 458 | -is returned in a "config" card that contains pure SQL text that is | |
| 458 | +is returned in a "config" card that contains pure SQL text that is | |
| 459 | 459 | intended to be evaluated by the client. |
| 460 | 460 | |
| 461 | 461 | <p>The @user and @concealed configuration items contain sensitive information |
| 462 | 462 | and are ignored for clients without sufficient privilege. |
| 463 | 463 | |
| @@ -491,11 +491,11 @@ | ||
| 491 | 491 | </blockquote> |
| 492 | 492 | |
| 493 | 493 | <p>The error message is English text that is encoded in order to |
| 494 | 494 | be a single token. |
| 495 | 495 | A space (ASCII 0x20) is represented as "\s" (ASCII 0x5C, 0x73). A |
| 496 | -newline (ASCII 0x0a) is "\n" (ASCII 0x6C, x6E). A backslash | |
| 496 | +newline (ASCII 0x0a) is "\n" (ASCII 0x6C, x6E). A backslash | |
| 497 | 497 | (ASCII 0x5C) is represented as two backslashes "\\". Apart from |
| 498 | 498 | space and newline, no other whitespace characters nor any |
| 499 | 499 | unprintable characters are allowed in |
| 500 | 500 | the error message.</p> |
| 501 | 501 | |
| @@ -658,11 +658,11 @@ | ||
| 658 | 658 | <ol> |
| 659 | 659 | <li>The client sends one or more PUSH HTTP requests to the server. |
| 660 | 660 | The request and reply content type is "application/x-fossil". |
| 661 | 661 | <li>HTTP request content is compressed using zlib. |
| 662 | 662 | <li>The content of request and reply consists of cards with one |
| 663 | - card per line. | |
| 663 | + card per line. | |
| 664 | 664 | <li>Card formats are: |
| 665 | 665 | <ul> |
| 666 | 666 | <li> <b>login</b> <i>userid nonce signature</i> |
| 667 | 667 | <li> <b>push</b> <i>servercode projectcode</i> |
| 668 | 668 | <li> <b>pull</b> <i>servercode projectcode</i> |
| 669 | 669 |
| --- www/sync.wiki | |
| +++ www/sync.wiki | |
| @@ -15,11 +15,11 @@ | |
| 15 | Synchronization is simply the process of sharing artifacts between |
| 16 | servers so that all servers have copies of all artifacts. Because |
| 17 | artifacts are unordered, the order in which artifacts are received |
| 18 | at a server is inconsequential. It is assumed that the SHA1 hashes |
| 19 | of artifacts are unique - that every artifact has a different SHA1 hash. |
| 20 | To a first approximation, synchronization proceeds by sharing lists |
| 21 | SHA1 hashes of available artifacts, then sharing those artifacts that |
| 22 | are not found on one side or the other of the connection. In practice, |
| 23 | a repository might contain millions of artifacts. The list of |
| 24 | SHA1 hashes for this many artifacts can be large. So optimizations are |
| 25 | employed that usually reduce the number of SHA1 hashes that need to be |
| @@ -150,11 +150,11 @@ | |
| 150 | terminates the login card. The signature is the SHA1 hash of |
| 151 | the concatenation of the nonce and the users password.</p> |
| 152 | |
| 153 | <p>For each login card, the server looks up the user and verifies |
| 154 | that the nonce matches the SHA1 hash of the remainder of the |
| 155 | message. It then checks the signature hash to make sure the |
| 156 | signature matches. If everything |
| 157 | checks out, then the client is granted all privileges of the |
| 158 | specified user.</p> |
| 159 | |
| 160 | <p>Privileges are cumulative. There can be multiple successful |
| @@ -162,11 +162,11 @@ | |
| 162 | privileges of each individual login.</p> |
| 163 | |
| 164 | <h3>3.3 File and Compressed File Cards</h3> |
| 165 | |
| 166 | <p>Artifacts are transferred using either "file" cards, or "cfile" cards. |
| 167 | (The name "file" card comes from the fact that most artifacts correspond to |
| 168 | files, and "cfile" is just a compressed file.) |
| 169 | </p> |
| 170 | |
| 171 | <h4>3.3.1 File Cards</h4> |
| 172 | |
| @@ -230,11 +230,11 @@ | |
| 230 | artifact. If the cfile card has four arguments, then the payload is a |
| 231 | delta and the second argument is the ID of another artifact that is the |
| 232 | source of the delta and the third argument is the original size of the |
| 233 | delta artifact.</p> |
| 234 | |
| 235 | <p>Unlike file cards, cfile cards are only sent in one direction during a |
| 236 | clone from server to client for clone protocol version "3" or greater.</p> |
| 237 | |
| 238 | <h3>3.4 Push and Pull Cards</h3> |
| 239 | |
| 240 | <p>Among the first cards in a client-to-server message are |
| @@ -385,11 +385,11 @@ | |
| 385 | </blockquote> |
| 386 | |
| 387 | <p>As of [/timeline?r=trunk&c=2015-03-19+03%3A57%3A46&n=20|2015-03-19], the configuration-name must be one of the |
| 388 | following values: |
| 389 | |
| 390 | <center><table border=0> |
| 391 | <tr><td valign="top"> |
| 392 | <ul> |
| 393 | <li> css |
| 394 | <li> header |
| 395 | <li> footer |
| @@ -436,11 +436,11 @@ | |
| 436 | <li> @reportfmt |
| 437 | <li> @user |
| 438 | <li> @concealed |
| 439 | <li> @shun |
| 440 | </ul></td></tr> |
| 441 | </table></center> |
| 442 | |
| 443 | <p>New configuration-names are likely to be added in future releases of |
| 444 | Fossil. If the server receives a configuration-name that it does not |
| 445 | understand, the entire reqconfig card is silently ignored. The reqconfig |
| 446 | card might also be ignored if the user lacks sufficient privilege to |
| @@ -453,11 +453,11 @@ | |
| 453 | The value of the configuration item is returned to the client using a |
| 454 | "config" card. |
| 455 | |
| 456 | <p>If the configuration-name begins with "@", that refers to a class of |
| 457 | values instead of a single value. The content of these configuration items |
| 458 | is returned in a "config" card that contains pure SQL text that is |
| 459 | intended to be evaluated by the client. |
| 460 | |
| 461 | <p>The @user and @concealed configuration items contain sensitive information |
| 462 | and are ignored for clients without sufficient privilege. |
| 463 | |
| @@ -491,11 +491,11 @@ | |
| 491 | </blockquote> |
| 492 | |
| 493 | <p>The error message is English text that is encoded in order to |
| 494 | be a single token. |
| 495 | A space (ASCII 0x20) is represented as "\s" (ASCII 0x5C, 0x73). A |
| 496 | newline (ASCII 0x0a) is "\n" (ASCII 0x6C, x6E). A backslash |
| 497 | (ASCII 0x5C) is represented as two backslashes "\\". Apart from |
| 498 | space and newline, no other whitespace characters nor any |
| 499 | unprintable characters are allowed in |
| 500 | the error message.</p> |
| 501 | |
| @@ -658,11 +658,11 @@ | |
| 658 | <ol> |
| 659 | <li>The client sends one or more PUSH HTTP requests to the server. |
| 660 | The request and reply content type is "application/x-fossil". |
| 661 | <li>HTTP request content is compressed using zlib. |
| 662 | <li>The content of request and reply consists of cards with one |
| 663 | card per line. |
| 664 | <li>Card formats are: |
| 665 | <ul> |
| 666 | <li> <b>login</b> <i>userid nonce signature</i> |
| 667 | <li> <b>push</b> <i>servercode projectcode</i> |
| 668 | <li> <b>pull</b> <i>servercode projectcode</i> |
| 669 |
| --- www/sync.wiki | |
| +++ www/sync.wiki | |
| @@ -15,11 +15,11 @@ | |
| 15 | Synchronization is simply the process of sharing artifacts between |
| 16 | servers so that all servers have copies of all artifacts. Because |
| 17 | artifacts are unordered, the order in which artifacts are received |
| 18 | at a server is inconsequential. It is assumed that the SHA1 hashes |
| 19 | of artifacts are unique - that every artifact has a different SHA1 hash. |
| 20 | To a first approximation, synchronization proceeds by sharing lists |
| 21 | SHA1 hashes of available artifacts, then sharing those artifacts that |
| 22 | are not found on one side or the other of the connection. In practice, |
| 23 | a repository might contain millions of artifacts. The list of |
| 24 | SHA1 hashes for this many artifacts can be large. So optimizations are |
| 25 | employed that usually reduce the number of SHA1 hashes that need to be |
| @@ -150,11 +150,11 @@ | |
| 150 | terminates the login card. The signature is the SHA1 hash of |
| 151 | the concatenation of the nonce and the users password.</p> |
| 152 | |
| 153 | <p>For each login card, the server looks up the user and verifies |
| 154 | that the nonce matches the SHA1 hash of the remainder of the |
| 155 | message. It then checks the signature hash to make sure the |
| 156 | signature matches. If everything |
| 157 | checks out, then the client is granted all privileges of the |
| 158 | specified user.</p> |
| 159 | |
| 160 | <p>Privileges are cumulative. There can be multiple successful |
| @@ -162,11 +162,11 @@ | |
| 162 | privileges of each individual login.</p> |
| 163 | |
| 164 | <h3>3.3 File and Compressed File Cards</h3> |
| 165 | |
| 166 | <p>Artifacts are transferred using either "file" cards, or "cfile" cards. |
| 167 | (The name "file" card comes from the fact that most artifacts correspond to |
| 168 | files, and "cfile" is just a compressed file.) |
| 169 | </p> |
| 170 | |
| 171 | <h4>3.3.1 File Cards</h4> |
| 172 | |
| @@ -230,11 +230,11 @@ | |
| 230 | artifact. If the cfile card has four arguments, then the payload is a |
| 231 | delta and the second argument is the ID of another artifact that is the |
| 232 | source of the delta and the third argument is the original size of the |
| 233 | delta artifact.</p> |
| 234 | |
| 235 | <p>Unlike file cards, cfile cards are only sent in one direction during a |
| 236 | clone from server to client for clone protocol version "3" or greater.</p> |
| 237 | |
| 238 | <h3>3.4 Push and Pull Cards</h3> |
| 239 | |
| 240 | <p>Among the first cards in a client-to-server message are |
| @@ -385,11 +385,11 @@ | |
| 385 | </blockquote> |
| 386 | |
| 387 | <p>As of [/timeline?r=trunk&c=2015-03-19+03%3A57%3A46&n=20|2015-03-19], the configuration-name must be one of the |
| 388 | following values: |
| 389 | |
| 390 | <table border=0 align="center"> |
| 391 | <tr><td valign="top"> |
| 392 | <ul> |
| 393 | <li> css |
| 394 | <li> header |
| 395 | <li> footer |
| @@ -436,11 +436,11 @@ | |
| 436 | <li> @reportfmt |
| 437 | <li> @user |
| 438 | <li> @concealed |
| 439 | <li> @shun |
| 440 | </ul></td></tr> |
| 441 | </table> |
| 442 | |
| 443 | <p>New configuration-names are likely to be added in future releases of |
| 444 | Fossil. If the server receives a configuration-name that it does not |
| 445 | understand, the entire reqconfig card is silently ignored. The reqconfig |
| 446 | card might also be ignored if the user lacks sufficient privilege to |
| @@ -453,11 +453,11 @@ | |
| 453 | The value of the configuration item is returned to the client using a |
| 454 | "config" card. |
| 455 | |
| 456 | <p>If the configuration-name begins with "@", that refers to a class of |
| 457 | values instead of a single value. The content of these configuration items |
| 458 | is returned in a "config" card that contains pure SQL text that is |
| 459 | intended to be evaluated by the client. |
| 460 | |
| 461 | <p>The @user and @concealed configuration items contain sensitive information |
| 462 | and are ignored for clients without sufficient privilege. |
| 463 | |
| @@ -491,11 +491,11 @@ | |
| 491 | </blockquote> |
| 492 | |
| 493 | <p>The error message is English text that is encoded in order to |
| 494 | be a single token. |
| 495 | A space (ASCII 0x20) is represented as "\s" (ASCII 0x5C, 0x73). A |
| 496 | newline (ASCII 0x0a) is "\n" (ASCII 0x6C, x6E). A backslash |
| 497 | (ASCII 0x5C) is represented as two backslashes "\\". Apart from |
| 498 | space and newline, no other whitespace characters nor any |
| 499 | unprintable characters are allowed in |
| 500 | the error message.</p> |
| 501 | |
| @@ -658,11 +658,11 @@ | |
| 658 | <ol> |
| 659 | <li>The client sends one or more PUSH HTTP requests to the server. |
| 660 | The request and reply content type is "application/x-fossil". |
| 661 | <li>HTTP request content is compressed using zlib. |
| 662 | <li>The content of request and reply consists of cards with one |
| 663 | card per line. |
| 664 | <li>Card formats are: |
| 665 | <ul> |
| 666 | <li> <b>login</b> <i>userid nonce signature</i> |
| 667 | <li> <b>push</b> <i>servercode projectcode</i> |
| 668 | <li> <b>pull</b> <i>servercode projectcode</i> |
| 669 |
+18
-19
| --- www/tech_overview.wiki | ||
| +++ www/tech_overview.wiki | ||
| @@ -5,12 +5,12 @@ | ||
| 5 | 5 | |
| 6 | 6 | <h2>1.0 Introduction</h2> |
| 7 | 7 | |
| 8 | 8 | At its lowest level, a Fossil repository consists of an unordered set |
| 9 | 9 | of immutable "artifacts". You might think of these artifacts as "files", |
| 10 | -since in many cases the artifacts are exactly that. | |
| 11 | -But other "control artifacts" | |
| 10 | +since in many cases the artifacts are exactly that. | |
| 11 | +But other "control artifacts" | |
| 12 | 12 | are also included in the mix. These control artifacts define the relationships |
| 13 | 13 | between artifacts - which files go together to form a particular |
| 14 | 14 | version of the project, who checked in that version and when, what was |
| 15 | 15 | the check-in comment, what wiki pages are included with the project, what |
| 16 | 16 | are the edit histories of each wiki page, what bug reports or tickets are |
| @@ -17,21 +17,21 @@ | ||
| 17 | 17 | included, who contributed to the evolution of each ticket, and so forth. |
| 18 | 18 | This low-level file format is called the "global state" of |
| 19 | 19 | the repository, since this is the information that is synced to peer |
| 20 | 20 | repositories using push and pull operations. The low-level file format |
| 21 | 21 | is also called "enduring" since it is intended to last for many years. |
| 22 | -The details of the low-level, enduring, global file format | |
| 22 | +The details of the low-level, enduring, global file format | |
| 23 | 23 | are [./fileformat.wiki | described separately]. |
| 24 | 24 | |
| 25 | 25 | This article is about how Fossil is currently implemented. Instead of |
| 26 | 26 | dealing with vague abstractions of "enduring file formats" as the |
| 27 | 27 | [./fileformat.wiki | other document] does, this article provides |
| 28 | -some detail on how Fossil actually stores information on disk. | |
| 28 | +some detail on how Fossil actually stores information on disk. | |
| 29 | 29 | |
| 30 | 30 | <h2>2.0 Three Databases</h2> |
| 31 | 31 | |
| 32 | -Fossil stores state information in | |
| 32 | +Fossil stores state information in | |
| 33 | 33 | [http://www.sqlite.org/ | SQLite] database files. |
| 34 | 34 | SQLite keeps an entire relational database, including multiple tables and |
| 35 | 35 | indices, in a single disk file. The SQLite library allows the database |
| 36 | 36 | files to be efficiently queried and updated using the industry-standard |
| 37 | 37 | SQL language. SQLite updates are atomic, so even in the event of |
| @@ -46,11 +46,11 @@ | ||
| 46 | 46 | </ol> |
| 47 | 47 | |
| 48 | 48 | The configuration database is a one-per-user database that holds |
| 49 | 49 | global configuration information used by Fossil. There is one |
| 50 | 50 | repository database per project. The repository database is the |
| 51 | -file that people are normally referring to when they say | |
| 51 | +file that people are normally referring to when they say | |
| 52 | 52 | "a Fossil repository". The checkout database is found in the working |
| 53 | 53 | checkout for a project and contains state information that is unique |
| 54 | 54 | to that working checkout. |
| 55 | 55 | |
| 56 | 56 | Fossil does not always use all three database files. The web interface, |
| @@ -65,11 +65,11 @@ | ||
| 65 | 65 | SQLite's [http://www.sqlite.org/lang_attach.html | ATTACH] command. |
| 66 | 66 | |
| 67 | 67 | The chart below provides a quick summary of how each of these |
| 68 | 68 | database files are used by Fossil, with detailed discussion following. |
| 69 | 69 | |
| 70 | -<center><table border="1" width="80%" cellpadding="0"> | |
| 70 | +<table border="1" width="80%" cellpadding="0" align="center"> | |
| 71 | 71 | <tr> |
| 72 | 72 | <td width="33%" valign="top"> |
| 73 | 73 | <h3 align="center">Configuration Database<br>"~/.fossil"</h3> |
| 74 | 74 | <ul> |
| 75 | 75 | <li>Global [/help/setting |settings] |
| @@ -103,11 +103,10 @@ | ||
| 103 | 103 | <li>Information needed to "[/help/undo|undo]" or "[/help/redo|redo]" |
| 104 | 104 | </ul> |
| 105 | 105 | </td> |
| 106 | 106 | </tr> |
| 107 | 107 | </table> |
| 108 | -</center> | |
| 109 | 108 | |
| 110 | 109 | <h3>2.1 The Configuration Database</h3> |
| 111 | 110 | |
| 112 | 111 | The configuration database holds cross-repository preferences and a list of all |
| 113 | 112 | repositories for a single user. |
| @@ -135,11 +134,11 @@ | ||
| 135 | 134 | You can override this default location by defining the environment |
| 136 | 135 | variable FOSSIL_HOME pointing to an appropriate (writable) directory. |
| 137 | 136 | |
| 138 | 137 | <h3>2.2 Repository Databases</h3> |
| 139 | 138 | |
| 140 | -The repository database is the file that is commonly referred to as | |
| 139 | +The repository database is the file that is commonly referred to as | |
| 141 | 140 | "the repository". This is because the repository database contains, |
| 142 | 141 | among other things, the complete revision, ticket, and wiki history for |
| 143 | 142 | a project. It is customary to name the repository database after then |
| 144 | 143 | name of the project, with a ".fossil" suffix. For example, the repository |
| 145 | 144 | database for the self-hosting Fossil repository is called "fossil.fossil" |
| @@ -146,11 +145,11 @@ | ||
| 146 | 145 | and the repository database for SQLite is called "sqlite.fossil". |
| 147 | 146 | |
| 148 | 147 | <h4>2.2.1 Global Project State</h4> |
| 149 | 148 | |
| 150 | 149 | The bulk of the repository database (typically 75 to 85%) consists |
| 151 | -of the artifacts that comprise the | |
| 150 | +of the artifacts that comprise the | |
| 152 | 151 | [./fileformat.wiki | enduring, global, shared state] of the project. |
| 153 | 152 | The artifacts are stored as BLOBs, compressed using |
| 154 | 153 | [http://www.zlib.net/ | zlib compression] and, where applicable, |
| 155 | 154 | using [./delta_encoder_algorithm.wiki | delta compression]. |
| 156 | 155 | The combination of zlib and delta compression results in a considerable |
| @@ -160,26 +159,26 @@ | ||
| 160 | 159 | 32 MB of space in the repository database, for a compression ratio |
| 161 | 160 | of about 64:1. The average size of a content BLOB in the database |
| 162 | 161 | is around 500 bytes. |
| 163 | 162 | |
| 164 | 163 | Note that the zlib and delta compression is not an inherent part of the |
| 165 | -Fossil file format; it is just an optimization. | |
| 164 | +Fossil file format; it is just an optimization. | |
| 166 | 165 | The enduring file format for Fossil is the unordered |
| 167 | 166 | set of artifacts. The compression techniques are just a detail of |
| 168 | 167 | how the current implementation of Fossil happens to store these artifacts |
| 169 | 168 | efficiently on disk. |
| 170 | 169 | |
| 171 | 170 | All of the original uncompressed and undeltaed artifacts can be extracted |
| 172 | -from a Fossil repository database using | |
| 171 | +from a Fossil repository database using | |
| 173 | 172 | the [/help/deconstruct | fossil deconstruct] |
| 174 | 173 | command. Individual artifacts can be extracted using the |
| 175 | 174 | [/help/artifact | fossil artifact] command. |
| 176 | 175 | When accessing the repository database using raw SQL and the |
| 177 | 176 | [/help/sqlite3 | fossil sql] command, the extension function |
| 178 | 177 | "<tt>content()</tt>" with a single argument which is the SHA1 hash |
| 179 | 178 | of an artifact will return the complete undeleted and uncompressed |
| 180 | -content of that artifact. | |
| 179 | +content of that artifact. | |
| 181 | 180 | |
| 182 | 181 | Going the other way, the [/help/reconstruct | fossil reconstruct] |
| 183 | 182 | command will scan a directory hierarchy and add all files found to |
| 184 | 183 | a new repository database. The [/help/import | fossil import] command |
| 185 | 184 | works by reading the input git-fast-export stream and using it to construct |
| @@ -225,11 +224,11 @@ | ||
| 225 | 224 | by [/help/sync | fossil sync]. That is because it is entirely reasonable |
| 226 | 225 | that two different websites for the same project might have completely |
| 227 | 226 | different display preferences and user communities. One instance of the |
| 228 | 227 | project might be a fork of the other, for example, which pulls from the |
| 229 | 228 | other but never pushes and extends the project in ways that the keepers of |
| 230 | -the other website disapprove of. | |
| 229 | +the other website disapprove of. | |
| 231 | 230 | |
| 232 | 231 | Display and processing information includes the following: |
| 233 | 232 | |
| 234 | 233 | * The name and description of the project |
| 235 | 234 | * The CSS file, header, and footer used by all web pages |
| @@ -242,31 +241,31 @@ | ||
| 242 | 241 | global values defined in the per-user configuration database. |
| 243 | 242 | |
| 244 | 243 | Though the display and processing preferences do not move between |
| 245 | 244 | repository instances using [/help/sync | fossil sync], this information |
| 246 | 245 | can be shared between repositories using the |
| 247 | -[/help/config | fossil config push] and | |
| 246 | +[/help/config | fossil config push] and | |
| 248 | 247 | [/help/config | fossil config pull] commands. |
| 249 | 248 | The display and processing information is also copied into new |
| 250 | 249 | repositories when they are created using |
| 251 | 250 | [/help/clone | fossil clone]. |
| 252 | 251 | |
| 253 | 252 | <h4>2.2.4 User Credentials And Privileges</h4> |
| 254 | 253 | |
| 255 | 254 | Just because two development teams are collaborating on a project and allow |
| 256 | -push and/or pull between their repositories does not mean that they | |
| 255 | +push and/or pull between their repositories does not mean that they | |
| 257 | 256 | trust each other enough to share passwords and access privileges. |
| 258 | 257 | Hence the names and emails and passwords and privileges of users are |
| 259 | 258 | considered private information that is kept locally in each repository. |
| 260 | 259 | |
| 261 | 260 | Each repository database has a table holding the username, privileges, |
| 262 | 261 | and login credentials for users authorized to interact with that particular |
| 263 | -database. In addition, there is a table named "concealed" that maps the | |
| 262 | +database. In addition, there is a table named "concealed" that maps the | |
| 264 | 263 | SHA1 hash of each users email address back into their true email address. |
| 265 | 264 | The concealed table allows just the SHA1 hash of email addresses to |
| 266 | 265 | be stored in tickets, and thus prevents actual email addresses from falling |
| 267 | -into the hands of spammers who happen to clone the repository. | |
| 266 | +into the hands of spammers who happen to clone the repository. | |
| 268 | 267 | |
| 269 | 268 | The content of the user and concealed tables can be pushed and pulled using the |
| 270 | 269 | [/help/config | fossil config push] and |
| 271 | 270 | [/help/config | fossil config pull] commands with the "user" and |
| 272 | 271 | "email" as the AREA argument, but only if you have administrative |
| @@ -278,11 +277,11 @@ | ||
| 278 | 277 | project - is intended to be an append-only database. In other words, |
| 279 | 278 | new artifacts can be added but artifacts can never be removed. But |
| 280 | 279 | it sometimes happens that inappropriate content is mistakenly or |
| 281 | 280 | maliciously added to a repository. The only way to get rid of |
| 282 | 281 | the undesired content is to [./shunning.wiki | "shun"] it. |
| 283 | -The "shun" table in the repository database records the SHA1 hash of | |
| 282 | +The "shun" table in the repository database records the SHA1 hash of | |
| 284 | 283 | all shunned artifacts. |
| 285 | 284 | |
| 286 | 285 | The shun table can be pushed or pulled using |
| 287 | 286 | the [/help/config | fossil config] command with the "shun" AREA argument. |
| 288 | 287 | The shun table is also copied during a [/help/clone | clone]. |
| 289 | 288 |
| --- www/tech_overview.wiki | |
| +++ www/tech_overview.wiki | |
| @@ -5,12 +5,12 @@ | |
| 5 | |
| 6 | <h2>1.0 Introduction</h2> |
| 7 | |
| 8 | At its lowest level, a Fossil repository consists of an unordered set |
| 9 | of immutable "artifacts". You might think of these artifacts as "files", |
| 10 | since in many cases the artifacts are exactly that. |
| 11 | But other "control artifacts" |
| 12 | are also included in the mix. These control artifacts define the relationships |
| 13 | between artifacts - which files go together to form a particular |
| 14 | version of the project, who checked in that version and when, what was |
| 15 | the check-in comment, what wiki pages are included with the project, what |
| 16 | are the edit histories of each wiki page, what bug reports or tickets are |
| @@ -17,21 +17,21 @@ | |
| 17 | included, who contributed to the evolution of each ticket, and so forth. |
| 18 | This low-level file format is called the "global state" of |
| 19 | the repository, since this is the information that is synced to peer |
| 20 | repositories using push and pull operations. The low-level file format |
| 21 | is also called "enduring" since it is intended to last for many years. |
| 22 | The details of the low-level, enduring, global file format |
| 23 | are [./fileformat.wiki | described separately]. |
| 24 | |
| 25 | This article is about how Fossil is currently implemented. Instead of |
| 26 | dealing with vague abstractions of "enduring file formats" as the |
| 27 | [./fileformat.wiki | other document] does, this article provides |
| 28 | some detail on how Fossil actually stores information on disk. |
| 29 | |
| 30 | <h2>2.0 Three Databases</h2> |
| 31 | |
| 32 | Fossil stores state information in |
| 33 | [http://www.sqlite.org/ | SQLite] database files. |
| 34 | SQLite keeps an entire relational database, including multiple tables and |
| 35 | indices, in a single disk file. The SQLite library allows the database |
| 36 | files to be efficiently queried and updated using the industry-standard |
| 37 | SQL language. SQLite updates are atomic, so even in the event of |
| @@ -46,11 +46,11 @@ | |
| 46 | </ol> |
| 47 | |
| 48 | The configuration database is a one-per-user database that holds |
| 49 | global configuration information used by Fossil. There is one |
| 50 | repository database per project. The repository database is the |
| 51 | file that people are normally referring to when they say |
| 52 | "a Fossil repository". The checkout database is found in the working |
| 53 | checkout for a project and contains state information that is unique |
| 54 | to that working checkout. |
| 55 | |
| 56 | Fossil does not always use all three database files. The web interface, |
| @@ -65,11 +65,11 @@ | |
| 65 | SQLite's [http://www.sqlite.org/lang_attach.html | ATTACH] command. |
| 66 | |
| 67 | The chart below provides a quick summary of how each of these |
| 68 | database files are used by Fossil, with detailed discussion following. |
| 69 | |
| 70 | <center><table border="1" width="80%" cellpadding="0"> |
| 71 | <tr> |
| 72 | <td width="33%" valign="top"> |
| 73 | <h3 align="center">Configuration Database<br>"~/.fossil"</h3> |
| 74 | <ul> |
| 75 | <li>Global [/help/setting |settings] |
| @@ -103,11 +103,10 @@ | |
| 103 | <li>Information needed to "[/help/undo|undo]" or "[/help/redo|redo]" |
| 104 | </ul> |
| 105 | </td> |
| 106 | </tr> |
| 107 | </table> |
| 108 | </center> |
| 109 | |
| 110 | <h3>2.1 The Configuration Database</h3> |
| 111 | |
| 112 | The configuration database holds cross-repository preferences and a list of all |
| 113 | repositories for a single user. |
| @@ -135,11 +134,11 @@ | |
| 135 | You can override this default location by defining the environment |
| 136 | variable FOSSIL_HOME pointing to an appropriate (writable) directory. |
| 137 | |
| 138 | <h3>2.2 Repository Databases</h3> |
| 139 | |
| 140 | The repository database is the file that is commonly referred to as |
| 141 | "the repository". This is because the repository database contains, |
| 142 | among other things, the complete revision, ticket, and wiki history for |
| 143 | a project. It is customary to name the repository database after then |
| 144 | name of the project, with a ".fossil" suffix. For example, the repository |
| 145 | database for the self-hosting Fossil repository is called "fossil.fossil" |
| @@ -146,11 +145,11 @@ | |
| 146 | and the repository database for SQLite is called "sqlite.fossil". |
| 147 | |
| 148 | <h4>2.2.1 Global Project State</h4> |
| 149 | |
| 150 | The bulk of the repository database (typically 75 to 85%) consists |
| 151 | of the artifacts that comprise the |
| 152 | [./fileformat.wiki | enduring, global, shared state] of the project. |
| 153 | The artifacts are stored as BLOBs, compressed using |
| 154 | [http://www.zlib.net/ | zlib compression] and, where applicable, |
| 155 | using [./delta_encoder_algorithm.wiki | delta compression]. |
| 156 | The combination of zlib and delta compression results in a considerable |
| @@ -160,26 +159,26 @@ | |
| 160 | 32 MB of space in the repository database, for a compression ratio |
| 161 | of about 64:1. The average size of a content BLOB in the database |
| 162 | is around 500 bytes. |
| 163 | |
| 164 | Note that the zlib and delta compression is not an inherent part of the |
| 165 | Fossil file format; it is just an optimization. |
| 166 | The enduring file format for Fossil is the unordered |
| 167 | set of artifacts. The compression techniques are just a detail of |
| 168 | how the current implementation of Fossil happens to store these artifacts |
| 169 | efficiently on disk. |
| 170 | |
| 171 | All of the original uncompressed and undeltaed artifacts can be extracted |
| 172 | from a Fossil repository database using |
| 173 | the [/help/deconstruct | fossil deconstruct] |
| 174 | command. Individual artifacts can be extracted using the |
| 175 | [/help/artifact | fossil artifact] command. |
| 176 | When accessing the repository database using raw SQL and the |
| 177 | [/help/sqlite3 | fossil sql] command, the extension function |
| 178 | "<tt>content()</tt>" with a single argument which is the SHA1 hash |
| 179 | of an artifact will return the complete undeleted and uncompressed |
| 180 | content of that artifact. |
| 181 | |
| 182 | Going the other way, the [/help/reconstruct | fossil reconstruct] |
| 183 | command will scan a directory hierarchy and add all files found to |
| 184 | a new repository database. The [/help/import | fossil import] command |
| 185 | works by reading the input git-fast-export stream and using it to construct |
| @@ -225,11 +224,11 @@ | |
| 225 | by [/help/sync | fossil sync]. That is because it is entirely reasonable |
| 226 | that two different websites for the same project might have completely |
| 227 | different display preferences and user communities. One instance of the |
| 228 | project might be a fork of the other, for example, which pulls from the |
| 229 | other but never pushes and extends the project in ways that the keepers of |
| 230 | the other website disapprove of. |
| 231 | |
| 232 | Display and processing information includes the following: |
| 233 | |
| 234 | * The name and description of the project |
| 235 | * The CSS file, header, and footer used by all web pages |
| @@ -242,31 +241,31 @@ | |
| 242 | global values defined in the per-user configuration database. |
| 243 | |
| 244 | Though the display and processing preferences do not move between |
| 245 | repository instances using [/help/sync | fossil sync], this information |
| 246 | can be shared between repositories using the |
| 247 | [/help/config | fossil config push] and |
| 248 | [/help/config | fossil config pull] commands. |
| 249 | The display and processing information is also copied into new |
| 250 | repositories when they are created using |
| 251 | [/help/clone | fossil clone]. |
| 252 | |
| 253 | <h4>2.2.4 User Credentials And Privileges</h4> |
| 254 | |
| 255 | Just because two development teams are collaborating on a project and allow |
| 256 | push and/or pull between their repositories does not mean that they |
| 257 | trust each other enough to share passwords and access privileges. |
| 258 | Hence the names and emails and passwords and privileges of users are |
| 259 | considered private information that is kept locally in each repository. |
| 260 | |
| 261 | Each repository database has a table holding the username, privileges, |
| 262 | and login credentials for users authorized to interact with that particular |
| 263 | database. In addition, there is a table named "concealed" that maps the |
| 264 | SHA1 hash of each users email address back into their true email address. |
| 265 | The concealed table allows just the SHA1 hash of email addresses to |
| 266 | be stored in tickets, and thus prevents actual email addresses from falling |
| 267 | into the hands of spammers who happen to clone the repository. |
| 268 | |
| 269 | The content of the user and concealed tables can be pushed and pulled using the |
| 270 | [/help/config | fossil config push] and |
| 271 | [/help/config | fossil config pull] commands with the "user" and |
| 272 | "email" as the AREA argument, but only if you have administrative |
| @@ -278,11 +277,11 @@ | |
| 278 | project - is intended to be an append-only database. In other words, |
| 279 | new artifacts can be added but artifacts can never be removed. But |
| 280 | it sometimes happens that inappropriate content is mistakenly or |
| 281 | maliciously added to a repository. The only way to get rid of |
| 282 | the undesired content is to [./shunning.wiki | "shun"] it. |
| 283 | The "shun" table in the repository database records the SHA1 hash of |
| 284 | all shunned artifacts. |
| 285 | |
| 286 | The shun table can be pushed or pulled using |
| 287 | the [/help/config | fossil config] command with the "shun" AREA argument. |
| 288 | The shun table is also copied during a [/help/clone | clone]. |
| 289 |
| --- www/tech_overview.wiki | |
| +++ www/tech_overview.wiki | |
| @@ -5,12 +5,12 @@ | |
| 5 | |
| 6 | <h2>1.0 Introduction</h2> |
| 7 | |
| 8 | At its lowest level, a Fossil repository consists of an unordered set |
| 9 | of immutable "artifacts". You might think of these artifacts as "files", |
| 10 | since in many cases the artifacts are exactly that. |
| 11 | But other "control artifacts" |
| 12 | are also included in the mix. These control artifacts define the relationships |
| 13 | between artifacts - which files go together to form a particular |
| 14 | version of the project, who checked in that version and when, what was |
| 15 | the check-in comment, what wiki pages are included with the project, what |
| 16 | are the edit histories of each wiki page, what bug reports or tickets are |
| @@ -17,21 +17,21 @@ | |
| 17 | included, who contributed to the evolution of each ticket, and so forth. |
| 18 | This low-level file format is called the "global state" of |
| 19 | the repository, since this is the information that is synced to peer |
| 20 | repositories using push and pull operations. The low-level file format |
| 21 | is also called "enduring" since it is intended to last for many years. |
| 22 | The details of the low-level, enduring, global file format |
| 23 | are [./fileformat.wiki | described separately]. |
| 24 | |
| 25 | This article is about how Fossil is currently implemented. Instead of |
| 26 | dealing with vague abstractions of "enduring file formats" as the |
| 27 | [./fileformat.wiki | other document] does, this article provides |
| 28 | some detail on how Fossil actually stores information on disk. |
| 29 | |
| 30 | <h2>2.0 Three Databases</h2> |
| 31 | |
| 32 | Fossil stores state information in |
| 33 | [http://www.sqlite.org/ | SQLite] database files. |
| 34 | SQLite keeps an entire relational database, including multiple tables and |
| 35 | indices, in a single disk file. The SQLite library allows the database |
| 36 | files to be efficiently queried and updated using the industry-standard |
| 37 | SQL language. SQLite updates are atomic, so even in the event of |
| @@ -46,11 +46,11 @@ | |
| 46 | </ol> |
| 47 | |
| 48 | The configuration database is a one-per-user database that holds |
| 49 | global configuration information used by Fossil. There is one |
| 50 | repository database per project. The repository database is the |
| 51 | file that people are normally referring to when they say |
| 52 | "a Fossil repository". The checkout database is found in the working |
| 53 | checkout for a project and contains state information that is unique |
| 54 | to that working checkout. |
| 55 | |
| 56 | Fossil does not always use all three database files. The web interface, |
| @@ -65,11 +65,11 @@ | |
| 65 | SQLite's [http://www.sqlite.org/lang_attach.html | ATTACH] command. |
| 66 | |
| 67 | The chart below provides a quick summary of how each of these |
| 68 | database files are used by Fossil, with detailed discussion following. |
| 69 | |
| 70 | <table border="1" width="80%" cellpadding="0" align="center"> |
| 71 | <tr> |
| 72 | <td width="33%" valign="top"> |
| 73 | <h3 align="center">Configuration Database<br>"~/.fossil"</h3> |
| 74 | <ul> |
| 75 | <li>Global [/help/setting |settings] |
| @@ -103,11 +103,10 @@ | |
| 103 | <li>Information needed to "[/help/undo|undo]" or "[/help/redo|redo]" |
| 104 | </ul> |
| 105 | </td> |
| 106 | </tr> |
| 107 | </table> |
| 108 | |
| 109 | <h3>2.1 The Configuration Database</h3> |
| 110 | |
| 111 | The configuration database holds cross-repository preferences and a list of all |
| 112 | repositories for a single user. |
| @@ -135,11 +134,11 @@ | |
| 134 | You can override this default location by defining the environment |
| 135 | variable FOSSIL_HOME pointing to an appropriate (writable) directory. |
| 136 | |
| 137 | <h3>2.2 Repository Databases</h3> |
| 138 | |
| 139 | The repository database is the file that is commonly referred to as |
| 140 | "the repository". This is because the repository database contains, |
| 141 | among other things, the complete revision, ticket, and wiki history for |
| 142 | a project. It is customary to name the repository database after then |
| 143 | name of the project, with a ".fossil" suffix. For example, the repository |
| 144 | database for the self-hosting Fossil repository is called "fossil.fossil" |
| @@ -146,11 +145,11 @@ | |
| 145 | and the repository database for SQLite is called "sqlite.fossil". |
| 146 | |
| 147 | <h4>2.2.1 Global Project State</h4> |
| 148 | |
| 149 | The bulk of the repository database (typically 75 to 85%) consists |
| 150 | of the artifacts that comprise the |
| 151 | [./fileformat.wiki | enduring, global, shared state] of the project. |
| 152 | The artifacts are stored as BLOBs, compressed using |
| 153 | [http://www.zlib.net/ | zlib compression] and, where applicable, |
| 154 | using [./delta_encoder_algorithm.wiki | delta compression]. |
| 155 | The combination of zlib and delta compression results in a considerable |
| @@ -160,26 +159,26 @@ | |
| 159 | 32 MB of space in the repository database, for a compression ratio |
| 160 | of about 64:1. The average size of a content BLOB in the database |
| 161 | is around 500 bytes. |
| 162 | |
| 163 | Note that the zlib and delta compression is not an inherent part of the |
| 164 | Fossil file format; it is just an optimization. |
| 165 | The enduring file format for Fossil is the unordered |
| 166 | set of artifacts. The compression techniques are just a detail of |
| 167 | how the current implementation of Fossil happens to store these artifacts |
| 168 | efficiently on disk. |
| 169 | |
| 170 | All of the original uncompressed and undeltaed artifacts can be extracted |
| 171 | from a Fossil repository database using |
| 172 | the [/help/deconstruct | fossil deconstruct] |
| 173 | command. Individual artifacts can be extracted using the |
| 174 | [/help/artifact | fossil artifact] command. |
| 175 | When accessing the repository database using raw SQL and the |
| 176 | [/help/sqlite3 | fossil sql] command, the extension function |
| 177 | "<tt>content()</tt>" with a single argument which is the SHA1 hash |
| 178 | of an artifact will return the complete undeleted and uncompressed |
| 179 | content of that artifact. |
| 180 | |
| 181 | Going the other way, the [/help/reconstruct | fossil reconstruct] |
| 182 | command will scan a directory hierarchy and add all files found to |
| 183 | a new repository database. The [/help/import | fossil import] command |
| 184 | works by reading the input git-fast-export stream and using it to construct |
| @@ -225,11 +224,11 @@ | |
| 224 | by [/help/sync | fossil sync]. That is because it is entirely reasonable |
| 225 | that two different websites for the same project might have completely |
| 226 | different display preferences and user communities. One instance of the |
| 227 | project might be a fork of the other, for example, which pulls from the |
| 228 | other but never pushes and extends the project in ways that the keepers of |
| 229 | the other website disapprove of. |
| 230 | |
| 231 | Display and processing information includes the following: |
| 232 | |
| 233 | * The name and description of the project |
| 234 | * The CSS file, header, and footer used by all web pages |
| @@ -242,31 +241,31 @@ | |
| 241 | global values defined in the per-user configuration database. |
| 242 | |
| 243 | Though the display and processing preferences do not move between |
| 244 | repository instances using [/help/sync | fossil sync], this information |
| 245 | can be shared between repositories using the |
| 246 | [/help/config | fossil config push] and |
| 247 | [/help/config | fossil config pull] commands. |
| 248 | The display and processing information is also copied into new |
| 249 | repositories when they are created using |
| 250 | [/help/clone | fossil clone]. |
| 251 | |
| 252 | <h4>2.2.4 User Credentials And Privileges</h4> |
| 253 | |
| 254 | Just because two development teams are collaborating on a project and allow |
| 255 | push and/or pull between their repositories does not mean that they |
| 256 | trust each other enough to share passwords and access privileges. |
| 257 | Hence the names and emails and passwords and privileges of users are |
| 258 | considered private information that is kept locally in each repository. |
| 259 | |
| 260 | Each repository database has a table holding the username, privileges, |
| 261 | and login credentials for users authorized to interact with that particular |
| 262 | database. In addition, there is a table named "concealed" that maps the |
| 263 | SHA1 hash of each users email address back into their true email address. |
| 264 | The concealed table allows just the SHA1 hash of email addresses to |
| 265 | be stored in tickets, and thus prevents actual email addresses from falling |
| 266 | into the hands of spammers who happen to clone the repository. |
| 267 | |
| 268 | The content of the user and concealed tables can be pushed and pulled using the |
| 269 | [/help/config | fossil config push] and |
| 270 | [/help/config | fossil config pull] commands with the "user" and |
| 271 | "email" as the AREA argument, but only if you have administrative |
| @@ -278,11 +277,11 @@ | |
| 277 | project - is intended to be an append-only database. In other words, |
| 278 | new artifacts can be added but artifacts can never be removed. But |
| 279 | it sometimes happens that inappropriate content is mistakenly or |
| 280 | maliciously added to a repository. The only way to get rid of |
| 281 | the undesired content is to [./shunning.wiki | "shun"] it. |
| 282 | The "shun" table in the repository database records the SHA1 hash of |
| 283 | all shunned artifacts. |
| 284 | |
| 285 | The shun table can be pushed or pulled using |
| 286 | the [/help/config | fossil config] command with the "shun" AREA argument. |
| 287 | The shun table is also copied during a [/help/clone | clone]. |
| 288 |