Fossil SCM
Pulled in the navbar and timeline changes.
Commit
bbcb6326c9068b37546503156dc4212ed0c95592
Parent
d8c18fc148f545d…
33 files changed
+126
+85
+2
+10
+1
-1
+3
-2
+90
-23
+4
-3
+2
-11
+73
-47
+2
+34
-1
+11
+5
-1
+23
-1
+2
-1
+10
-3
+130
-22
+146
-5
+5
-4
+131
-172
-231
+190
+2
+2
+6
+2
+2
-1
+24
+2
+2
+2
+463
~
ideas.txt
~
src/bag.c
~
src/checkin.c
~
src/content.c
~
src/db.c
~
src/delta.c
~
src/descendents.c
~
src/info.c
~
src/main.c
~
src/main.mk
~
src/makemake.tcl
~
src/manifest.c
~
src/pqueue.c
~
src/rebuild.c
~
src/schema.c
~
src/setup.c
~
src/style.c
~
src/timeline.c
~
src/wiki.c
~
src/wikiformat.c
~
src/xfer.c
-
test/basic1.test
~
wiki_and_ticket_ideas.txt
~
www/build.html
~
www/concepts.html
~
www/delta_encoder_algorithm.html
~
www/fileformat.html
~
www/index.html
~
www/index.wiki
~
www/pop.html
~
www/quickstart.html
~
www/selfcheck.html
~
www/sync.html
+126
| --- ideas.txt | ||
| +++ ideas.txt | ||
| @@ -1,5 +1,106 @@ | ||
| 1 | +Possible ticket file format: | |
| 2 | + | |
| 3 | + "Ticket" | |
| 4 | + title: TEXT | |
| 5 | + ticketid: TEXT | |
| 6 | + exists-in: BASELINE -- 0 or more | |
| 7 | + fixed-in: BASELINE -- 0 or more | |
| 8 | + tag: TAG -- 0 or more | |
| 9 | + created: DATETIME | |
| 10 | + attachment: FILENAME DESCRIPTION | |
| 11 | + parent: UUID* | |
| 12 | + derived-from: TICKET-FILENAME | |
| 13 | + description: MULTILINE-TEXT | |
| 14 | + remarks: MULTILINE-TEXT | |
| 15 | + | |
| 16 | + * Things handles with tags: | |
| 17 | + created-by | |
| 18 | + assigned-to | |
| 19 | + priority | |
| 20 | + severity | |
| 21 | + target-release | |
| 22 | + status | |
| 23 | + resolution | |
| 24 | + type | |
| 25 | + subsystem | |
| 26 | + | |
| 27 | +Wiki header format: | |
| 28 | + "WikiPage" | |
| 29 | + parent: UUID* | |
| 30 | + title: TEXT | |
| 31 | + pagename: TEXT | |
| 32 | + mode: (readonly|appendonly|readwrite) | |
| 33 | + attachment: UUID name description | |
| 34 | + | |
| 35 | + * Header ends with a blank line. wiki content follows. | |
| 36 | + | |
| 37 | +Cluster format: | |
| 38 | + | |
| 39 | + M+ uuid | |
| 40 | + Z manifest-cksum | |
| 41 | + | |
| 42 | + * Cluster generated in server mode only. | |
| 43 | + * Embargo cluster that reference phantoms or other embargoed clusters. | |
| 44 | + * Never send or ihave an embargoed cluster | |
| 45 | + | |
| 46 | +New sync algorithm based on clusters: | |
| 47 | + | |
| 48 | + * Keep a table of unclustered artifacts. Strive to keep this table | |
| 49 | + less than 100 entries. | |
| 50 | + * Client sends content of unclustered table as ihaves to server | |
| 51 | + * Server builds a new cluster if size of cluster table >100. | |
| 52 | + * Server sends unclustered table to client | |
| 53 | + * Server sends gimme for all unknown ihave received from client | |
| 54 | + * Client sends gimme for all unknown ihave received from server | |
| 55 | + * Previous two steps repeat until no more gimmes | |
| 56 | + | |
| 57 | +Details of new push algorithm: | |
| 58 | + | |
| 59 | + * Table "unsent" contains all files never pushed | |
| 60 | + * TEMP table "wanted" contains files the server does not have | |
| 61 | + Loop: | |
| 62 | + * Client sends login and "push" record | |
| 63 | + * Client sends file message for all files in unsent and removes | |
| 64 | + those files from the table. | |
| 65 | + * Client sends file message for all files in wanted. | |
| 66 | + * Client sends ihave messages for each entry in unclustered | |
| 67 | + ------ | |
| 68 | + * Server receives file message | |
| 69 | + * Server creates phantoms for unknown ihaves | |
| 70 | + * Server sends gimme messages for all phantoms | |
| 71 | + ------ | |
| 72 | + * Client clears its unsent table | |
| 73 | + * For each gimme message add an entry to wanted | |
| 74 | + * Halt if the wanted table is empty | |
| 75 | + | |
| 76 | +Details on new pull algorithm: | |
| 77 | + | |
| 78 | + Loop: | |
| 79 | + * Client sends login and "pull" record | |
| 80 | + * Client sends "prior" message with repository id and max record number | |
| 81 | + * Client sends "gimme" for each phantom | |
| 82 | + -------- | |
| 83 | + * Server creates new clusters to get unclustered size below 100 | |
| 84 | + * If there is "prior" message with repository id that matches this | |
| 85 | + server, then send file messages for all record ids greater than | |
| 86 | + prior | |
| 87 | + * Server sends ihave messages for each entry in unclustered | |
| 88 | + * Server sends maxrid message | |
| 89 | + -------- | |
| 90 | + * Client receives file records | |
| 91 | + * Client creates phantoms for unknown ihaves | |
| 92 | + * If no phantoms exist, record maxrid for the server and halt | |
| 93 | + | |
| 94 | +Need a dephantomize algorithm | |
| 95 | + | |
| 96 | + | |
| 97 | +Auxiliary tables needed for new sync algorithm: | |
| 98 | + | |
| 99 | + * unsent: files that have never been sent to another repository | |
| 100 | + * unclustered: non-phantom files not mentioned by a cluster | |
| 101 | + | |
| 1 | 102 | Random thoughts: |
| 2 | 103 | |
| 3 | 104 | * Changes to manifest to support: |
| 4 | 105 | + Trees of wiki pages and tickets |
| 5 | 106 | + The ability to cap or close a branch |
| @@ -58,10 +159,22 @@ | ||
| 58 | 159 | of a checkin, highlight other checkins that are direct (non-merge) |
| 59 | 160 | descendents and ancestors of the mouseover checkin. |
| 60 | 161 | + Timeline showing individual branches |
| 61 | 162 | + Timeline shows forks and merges |
| 62 | 163 | + Tags shown on timeline (maybe) and in vinfo (surely). |
| 164 | + | |
| 165 | +Features needed: | |
| 166 | + * Means to suppress artifacts | |
| 167 | + * Means to cap a branch | |
| 168 | + * Ticketing | |
| 169 | + + Problem is/is-not expressed in baseline X. | |
| 170 | + + Append comment and zero or more attachments | |
| 171 | + * Modify comments on baselines | |
| 172 | + * Append comments to any artifact | |
| 173 | + * Wiki? | |
| 174 | + | |
| 175 | + | |
| 63 | 176 | |
| 64 | 177 | Extended manifests. |
| 65 | 178 | * normal manifest has: |
| 66 | 179 | C comment |
| 67 | 180 | D date-time |
| @@ -68,10 +181,23 @@ | ||
| 68 | 181 | F* filename uuid |
| 69 | 182 | P uuid ... -- omitted for first manifest |
| 70 | 183 | R repository-md5sum |
| 71 | 184 | U user-login |
| 72 | 185 | Z manifest-checksum |
| 186 | + | |
| 187 | + * Accessory: | |
| 188 | + A uuid|* attachment-uuid description | |
| 189 | + B (+|-)branchtag uuid | |
| 190 | + D date-time | |
| 191 | + E uuid new-comment | |
| 192 | + G uuid appended-remark | |
| 193 | + S repositoryid serial-number | |
| 194 | + U userid | |
| 195 | + V (+|-)versiontag uuid | |
| 196 | + X uuid-to-surpress | |
| 197 | + Z this-file-checksum | |
| 198 | + | |
| 73 | 199 | * Change the comment on a version: -- always a leaf except in cluster |
| 74 | 200 | D date-time |
| 75 | 201 | E new-comment |
| 76 | 202 | P uuid -- baseline whose comment is changed |
| 77 | 203 | U user-login |
| 78 | 204 | |
| 79 | 205 | ADDED src/bag.c |
| --- ideas.txt | |
| +++ ideas.txt | |
| @@ -1,5 +1,106 @@ | |
| 1 | Random thoughts: |
| 2 | |
| 3 | * Changes to manifest to support: |
| 4 | + Trees of wiki pages and tickets |
| 5 | + The ability to cap or close a branch |
| @@ -58,10 +159,22 @@ | |
| 58 | of a checkin, highlight other checkins that are direct (non-merge) |
| 59 | descendents and ancestors of the mouseover checkin. |
| 60 | + Timeline showing individual branches |
| 61 | + Timeline shows forks and merges |
| 62 | + Tags shown on timeline (maybe) and in vinfo (surely). |
| 63 | |
| 64 | Extended manifests. |
| 65 | * normal manifest has: |
| 66 | C comment |
| 67 | D date-time |
| @@ -68,10 +181,23 @@ | |
| 68 | F* filename uuid |
| 69 | P uuid ... -- omitted for first manifest |
| 70 | R repository-md5sum |
| 71 | U user-login |
| 72 | Z manifest-checksum |
| 73 | * Change the comment on a version: -- always a leaf except in cluster |
| 74 | D date-time |
| 75 | E new-comment |
| 76 | P uuid -- baseline whose comment is changed |
| 77 | U user-login |
| 78 | |
| 79 | DDED src/bag.c |
| --- ideas.txt | |
| +++ ideas.txt | |
| @@ -1,5 +1,106 @@ | |
| 1 | Possible ticket file format: |
| 2 | |
| 3 | "Ticket" |
| 4 | title: TEXT |
| 5 | ticketid: TEXT |
| 6 | exists-in: BASELINE -- 0 or more |
| 7 | fixed-in: BASELINE -- 0 or more |
| 8 | tag: TAG -- 0 or more |
| 9 | created: DATETIME |
| 10 | attachment: FILENAME DESCRIPTION |
| 11 | parent: UUID* |
| 12 | derived-from: TICKET-FILENAME |
| 13 | description: MULTILINE-TEXT |
| 14 | remarks: MULTILINE-TEXT |
| 15 | |
| 16 | * Things handles with tags: |
| 17 | created-by |
| 18 | assigned-to |
| 19 | priority |
| 20 | severity |
| 21 | target-release |
| 22 | status |
| 23 | resolution |
| 24 | type |
| 25 | subsystem |
| 26 | |
| 27 | Wiki header format: |
| 28 | "WikiPage" |
| 29 | parent: UUID* |
| 30 | title: TEXT |
| 31 | pagename: TEXT |
| 32 | mode: (readonly|appendonly|readwrite) |
| 33 | attachment: UUID name description |
| 34 | |
| 35 | * Header ends with a blank line. wiki content follows. |
| 36 | |
| 37 | Cluster format: |
| 38 | |
| 39 | M+ uuid |
| 40 | Z manifest-cksum |
| 41 | |
| 42 | * Cluster generated in server mode only. |
| 43 | * Embargo cluster that reference phantoms or other embargoed clusters. |
| 44 | * Never send or ihave an embargoed cluster |
| 45 | |
| 46 | New sync algorithm based on clusters: |
| 47 | |
| 48 | * Keep a table of unclustered artifacts. Strive to keep this table |
| 49 | less than 100 entries. |
| 50 | * Client sends content of unclustered table as ihaves to server |
| 51 | * Server builds a new cluster if size of cluster table >100. |
| 52 | * Server sends unclustered table to client |
| 53 | * Server sends gimme for all unknown ihave received from client |
| 54 | * Client sends gimme for all unknown ihave received from server |
| 55 | * Previous two steps repeat until no more gimmes |
| 56 | |
| 57 | Details of new push algorithm: |
| 58 | |
| 59 | * Table "unsent" contains all files never pushed |
| 60 | * TEMP table "wanted" contains files the server does not have |
| 61 | Loop: |
| 62 | * Client sends login and "push" record |
| 63 | * Client sends file message for all files in unsent and removes |
| 64 | those files from the table. |
| 65 | * Client sends file message for all files in wanted. |
| 66 | * Client sends ihave messages for each entry in unclustered |
| 67 | ------ |
| 68 | * Server receives file message |
| 69 | * Server creates phantoms for unknown ihaves |
| 70 | * Server sends gimme messages for all phantoms |
| 71 | ------ |
| 72 | * Client clears its unsent table |
| 73 | * For each gimme message add an entry to wanted |
| 74 | * Halt if the wanted table is empty |
| 75 | |
| 76 | Details on new pull algorithm: |
| 77 | |
| 78 | Loop: |
| 79 | * Client sends login and "pull" record |
| 80 | * Client sends "prior" message with repository id and max record number |
| 81 | * Client sends "gimme" for each phantom |
| 82 | -------- |
| 83 | * Server creates new clusters to get unclustered size below 100 |
| 84 | * If there is "prior" message with repository id that matches this |
| 85 | server, then send file messages for all record ids greater than |
| 86 | prior |
| 87 | * Server sends ihave messages for each entry in unclustered |
| 88 | * Server sends maxrid message |
| 89 | -------- |
| 90 | * Client receives file records |
| 91 | * Client creates phantoms for unknown ihaves |
| 92 | * If no phantoms exist, record maxrid for the server and halt |
| 93 | |
| 94 | Need a dephantomize algorithm |
| 95 | |
| 96 | |
| 97 | Auxiliary tables needed for new sync algorithm: |
| 98 | |
| 99 | * unsent: files that have never been sent to another repository |
| 100 | * unclustered: non-phantom files not mentioned by a cluster |
| 101 | |
| 102 | Random thoughts: |
| 103 | |
| 104 | * Changes to manifest to support: |
| 105 | + Trees of wiki pages and tickets |
| 106 | + The ability to cap or close a branch |
| @@ -58,10 +159,22 @@ | |
| 159 | of a checkin, highlight other checkins that are direct (non-merge) |
| 160 | descendents and ancestors of the mouseover checkin. |
| 161 | + Timeline showing individual branches |
| 162 | + Timeline shows forks and merges |
| 163 | + Tags shown on timeline (maybe) and in vinfo (surely). |
| 164 | |
| 165 | Features needed: |
| 166 | * Means to suppress artifacts |
| 167 | * Means to cap a branch |
| 168 | * Ticketing |
| 169 | + Problem is/is-not expressed in baseline X. |
| 170 | + Append comment and zero or more attachments |
| 171 | * Modify comments on baselines |
| 172 | * Append comments to any artifact |
| 173 | * Wiki? |
| 174 | |
| 175 | |
| 176 | |
| 177 | Extended manifests. |
| 178 | * normal manifest has: |
| 179 | C comment |
| 180 | D date-time |
| @@ -68,10 +181,23 @@ | |
| 181 | F* filename uuid |
| 182 | P uuid ... -- omitted for first manifest |
| 183 | R repository-md5sum |
| 184 | U user-login |
| 185 | Z manifest-checksum |
| 186 | |
| 187 | * Accessory: |
| 188 | A uuid|* attachment-uuid description |
| 189 | B (+|-)branchtag uuid |
| 190 | D date-time |
| 191 | E uuid new-comment |
| 192 | G uuid appended-remark |
| 193 | S repositoryid serial-number |
| 194 | U userid |
| 195 | V (+|-)versiontag uuid |
| 196 | X uuid-to-surpress |
| 197 | Z this-file-checksum |
| 198 | |
| 199 | * Change the comment on a version: -- always a leaf except in cluster |
| 200 | D date-time |
| 201 | E new-comment |
| 202 | P uuid -- baseline whose comment is changed |
| 203 | U user-login |
| 204 | |
| 205 | DDED src/bag.c |
+85
| --- a/src/bag.c | ||
| +++ b/src/bag.c | ||
| @@ -0,0 +1,85 @@ | ||
| 1 | +/* | |
| 2 | +** Copyright (c) 2007 D. /* | |
| 3 | +** Copyright (c) 2007 D.i/* | |
| 4 | +** Copyright (c) 2007 D. Richard Hipp | |
| 5 | +** | |
| 6 | +** This program is free software; you can redGNU General Public | |
| 7 | +** License version 2 as published by the Free Software Foundation. | |
| 8 | +**lified BSD License (also | |
| 9 | +** known as the "2-Clause License" or "FreeBSD LicWITHOUT ANY WARRANTYhope that it wiMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 10 | +** General Public License for more details. | |
| 11 | +** | |
| 12 | +** You should have received a copy of the GNU General Public | |
| 13 | +** License along with this library; if not, write to the | |
| 14 | +** Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
| 15 | +** Boston, MA 02111-1307, USACopyright (c) 2007 D. /* | |
| 16 | +** Copyright (c) 2007 D.i/* | |
| 17 | +** Copyright (c) 2007 D. Richard Hipp | |
| 18 | +** | |
| 19 | +** This program is free software; you can redistribute it and/or | |
| 20 | +** modify it under the terms of the Simplified BSD License (also | |
| 21 | +** known as the "2-Clause License" or "FreeBSD License".) | |
| 22 | + | |
| 23 | +** This program is distributed in the hope that it will be useful, | |
| 24 | +** but without any warranty; without even the implied warranty of | |
| 25 | +** merchantability or fitness for a particular purpose. | |
| 26 | +** | |
| 27 | +** Author contact information: | |
| 28 | +** [email protected] | |
| 29 | +** http://www.hwaci.co entry. | |
| 30 | +** | |
| 31 | +** When an entry is deleted, its value is changedi/* | |
| 32 | +** Copyright (c) 2007 D. Richard Hipp | |
| 33 | +** | |
| 34 | +** This program is free software; you can redistribute it and/or | |
| 35 | +** modify it under the terms of the Simplified BSD License (also | |
| 36 | +** known as the "2-Clause License" or "FreeBSD License".) | |
| 37 | + | |
| 38 | +** This program is distributed in the hope that it will be useful, | |
| 39 | +** but without any warranty; without even the implied warranty of | |
| 40 | +** merchantability or fitness for a particular purpose. | |
| 41 | +** | |
| 42 | +** Author contact information: | |
| 43 | +** [email protected]" or "FreeBSD License".) | |
| 44 | + | |
| 45 | +** This program is distributed in the hoprchantability or fitness for a particular purpose. | |
| 46 | +** | |
| 47 | +** Author contact information: | |
| 48 | +** [email protected] | |
| 49 | +** http://www.hwaci.com/drh/ | |
| 50 | +** | |
| 51 | +******************************************************************************* | |
| 52 | +** | |
| 53 | +** This file contains code used to implement a "bag" of integers. | |
| 54 | +** A bag is an unordered collection without duplicates. In this | |
| 55 | +**} | |
| 56 | + }nclude <assert.h> | |
| 57 | + | |
| 58 | + | |
| 59 | +#if INTERFACE | |
| 60 | +/* | |
| 61 | +** An integer can appear in the bag at most once. | |
| 62 | +** Integers must be positive. | |
| 63 | +** | |
| 64 | +** On a hash collision, search continues to the next slot in the array, | |
| 65 | +** looping back to the beginning of the array when we reach the end. | |
| 66 | +** The search stops when a match is found or upon encountering bag_resize(p, p->cnt*2eted, its value is changedi==0 ){ | |
| 67 | +plicates. In this | |
| 68 | +** the terms of the cense (also | |
| 69 | +** known as the "2-Clause License" or "FreeBSD License".) | |
| 70 | + | |
| 71 | +** This program is distributed in the hope that it will be useful, | |
| 72 | +** but without any warranty; without even the implied warranty of | |
| 73 | +** merchantability or fitness for a particular purpose. | |
| 74 | +** | |
| 75 | +** Author contact information: | |
| 76 | +** [email protected] | |
| 77 | +** http://www.hwaci.com/drh/ | |
| 78 | +** | |
| 79 | +***************************************/* | |
| 80 | +** Copyright (c) 2007 D. /* | |
| 81 | +** Copyright (c) 2007 D.i/* | |
| 82 | +** Copyright (c) 2007 D. Richard Hipp | |
| 83 | +** | |
| 84 | +** This program is free software; you can redistribute it and/or | |
| 85 | +** modify it under the terms of the Simplified BSD License p->a[h] = -1;sz>2 |
| --- a/src/bag.c | |
| +++ b/src/bag.c | |
| @@ -0,0 +1,85 @@ | |
| --- a/src/bag.c | |
| +++ b/src/bag.c | |
| @@ -0,0 +1,85 @@ | |
| 1 | /* |
| 2 | ** Copyright (c) 2007 D. /* |
| 3 | ** Copyright (c) 2007 D.i/* |
| 4 | ** Copyright (c) 2007 D. Richard Hipp |
| 5 | ** |
| 6 | ** This program is free software; you can redGNU General Public |
| 7 | ** License version 2 as published by the Free Software Foundation. |
| 8 | **lified BSD License (also |
| 9 | ** known as the "2-Clause License" or "FreeBSD LicWITHOUT ANY WARRANTYhope that it wiMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 10 | ** General Public License for more details. |
| 11 | ** |
| 12 | ** You should have received a copy of the GNU General Public |
| 13 | ** License along with this library; if not, write to the |
| 14 | ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
| 15 | ** Boston, MA 02111-1307, USACopyright (c) 2007 D. /* |
| 16 | ** Copyright (c) 2007 D.i/* |
| 17 | ** Copyright (c) 2007 D. Richard Hipp |
| 18 | ** |
| 19 | ** This program is free software; you can redistribute it and/or |
| 20 | ** modify it under the terms of the Simplified BSD License (also |
| 21 | ** known as the "2-Clause License" or "FreeBSD License".) |
| 22 | |
| 23 | ** This program is distributed in the hope that it will be useful, |
| 24 | ** but without any warranty; without even the implied warranty of |
| 25 | ** merchantability or fitness for a particular purpose. |
| 26 | ** |
| 27 | ** Author contact information: |
| 28 | ** [email protected] |
| 29 | ** http://www.hwaci.co entry. |
| 30 | ** |
| 31 | ** When an entry is deleted, its value is changedi/* |
| 32 | ** Copyright (c) 2007 D. Richard Hipp |
| 33 | ** |
| 34 | ** This program is free software; you can redistribute it and/or |
| 35 | ** modify it under the terms of the Simplified BSD License (also |
| 36 | ** known as the "2-Clause License" or "FreeBSD License".) |
| 37 | |
| 38 | ** This program is distributed in the hope that it will be useful, |
| 39 | ** but without any warranty; without even the implied warranty of |
| 40 | ** merchantability or fitness for a particular purpose. |
| 41 | ** |
| 42 | ** Author contact information: |
| 43 | ** [email protected]" or "FreeBSD License".) |
| 44 | |
| 45 | ** This program is distributed in the hoprchantability or fitness for a particular purpose. |
| 46 | ** |
| 47 | ** Author contact information: |
| 48 | ** [email protected] |
| 49 | ** http://www.hwaci.com/drh/ |
| 50 | ** |
| 51 | ******************************************************************************* |
| 52 | ** |
| 53 | ** This file contains code used to implement a "bag" of integers. |
| 54 | ** A bag is an unordered collection without duplicates. In this |
| 55 | **} |
| 56 | }nclude <assert.h> |
| 57 | |
| 58 | |
| 59 | #if INTERFACE |
| 60 | /* |
| 61 | ** An integer can appear in the bag at most once. |
| 62 | ** Integers must be positive. |
| 63 | ** |
| 64 | ** On a hash collision, search continues to the next slot in the array, |
| 65 | ** looping back to the beginning of the array when we reach the end. |
| 66 | ** The search stops when a match is found or upon encountering bag_resize(p, p->cnt*2eted, its value is changedi==0 ){ |
| 67 | plicates. In this |
| 68 | ** the terms of the cense (also |
| 69 | ** known as the "2-Clause License" or "FreeBSD License".) |
| 70 | |
| 71 | ** This program is distributed in the hope that it will be useful, |
| 72 | ** but without any warranty; without even the implied warranty of |
| 73 | ** merchantability or fitness for a particular purpose. |
| 74 | ** |
| 75 | ** Author contact information: |
| 76 | ** [email protected] |
| 77 | ** http://www.hwaci.com/drh/ |
| 78 | ** |
| 79 | ***************************************/* |
| 80 | ** Copyright (c) 2007 D. /* |
| 81 | ** Copyright (c) 2007 D.i/* |
| 82 | ** Copyright (c) 2007 D. Richard Hipp |
| 83 | ** |
| 84 | ** This program is free software; you can redistribute it and/or |
| 85 | ** modify it under the terms of the Simplified BSD License p->a[h] = -1;sz>2 |
+2
| --- src/checkin.c | ||
| +++ src/checkin.c | ||
| @@ -391,10 +391,11 @@ | ||
| 391 | 391 | nrid = content_put(&content, 0, 0); |
| 392 | 392 | if( rid>0 ){ |
| 393 | 393 | content_deltify(rid, nrid, 0); |
| 394 | 394 | } |
| 395 | 395 | db_multi_exec("UPDATE vfile SET mrid=%d, rid=%d WHERE id=%d", nrid,nrid,id); |
| 396 | + db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid); | |
| 396 | 397 | } |
| 397 | 398 | db_finalize(&q); |
| 398 | 399 | |
| 399 | 400 | /* Create the manifest */ |
| 400 | 401 | blob_zero(&manifest); |
| @@ -451,10 +452,11 @@ | ||
| 451 | 452 | free(zManifestFile); |
| 452 | 453 | nvid = content_put(&manifest, 0, 0); |
| 453 | 454 | if( nvid==0 ){ |
| 454 | 455 | fossil_panic("trouble committing manifest: %s", g.zErrMsg); |
| 455 | 456 | } |
| 457 | + db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nvid); | |
| 456 | 458 | manifest_crosslink(nvid, &manifest); |
| 457 | 459 | content_deltify(vid, nvid, 0); |
| 458 | 460 | zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", nvid); |
| 459 | 461 | printf("New_Version: %s\n", zUuid); |
| 460 | 462 | zManifestFile = mprintf("%smanifest.uuid", g.zLocalRoot); |
| 461 | 463 |
| --- src/checkin.c | |
| +++ src/checkin.c | |
| @@ -391,10 +391,11 @@ | |
| 391 | nrid = content_put(&content, 0, 0); |
| 392 | if( rid>0 ){ |
| 393 | content_deltify(rid, nrid, 0); |
| 394 | } |
| 395 | db_multi_exec("UPDATE vfile SET mrid=%d, rid=%d WHERE id=%d", nrid,nrid,id); |
| 396 | } |
| 397 | db_finalize(&q); |
| 398 | |
| 399 | /* Create the manifest */ |
| 400 | blob_zero(&manifest); |
| @@ -451,10 +452,11 @@ | |
| 451 | free(zManifestFile); |
| 452 | nvid = content_put(&manifest, 0, 0); |
| 453 | if( nvid==0 ){ |
| 454 | fossil_panic("trouble committing manifest: %s", g.zErrMsg); |
| 455 | } |
| 456 | manifest_crosslink(nvid, &manifest); |
| 457 | content_deltify(vid, nvid, 0); |
| 458 | zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", nvid); |
| 459 | printf("New_Version: %s\n", zUuid); |
| 460 | zManifestFile = mprintf("%smanifest.uuid", g.zLocalRoot); |
| 461 |
| --- src/checkin.c | |
| +++ src/checkin.c | |
| @@ -391,10 +391,11 @@ | |
| 391 | nrid = content_put(&content, 0, 0); |
| 392 | if( rid>0 ){ |
| 393 | content_deltify(rid, nrid, 0); |
| 394 | } |
| 395 | db_multi_exec("UPDATE vfile SET mrid=%d, rid=%d WHERE id=%d", nrid,nrid,id); |
| 396 | db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nrid); |
| 397 | } |
| 398 | db_finalize(&q); |
| 399 | |
| 400 | /* Create the manifest */ |
| 401 | blob_zero(&manifest); |
| @@ -451,10 +452,11 @@ | |
| 452 | free(zManifestFile); |
| 453 | nvid = content_put(&manifest, 0, 0); |
| 454 | if( nvid==0 ){ |
| 455 | fossil_panic("trouble committing manifest: %s", g.zErrMsg); |
| 456 | } |
| 457 | db_multi_exec("INSERT OR IGNORE INTO unsent VALUES(%d)", nvid); |
| 458 | manifest_crosslink(nvid, &manifest); |
| 459 | content_deltify(vid, nvid, 0); |
| 460 | zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", nvid); |
| 461 | printf("New_Version: %s\n", zUuid); |
| 462 | zManifestFile = mprintf("%smanifest.uuid", g.zLocalRoot); |
| 463 |
+10
| --- src/content.c | ||
| +++ src/content.c | ||
| @@ -154,10 +154,12 @@ | ||
| 154 | 154 | int size; |
| 155 | 155 | int rid; |
| 156 | 156 | Stmt s1; |
| 157 | 157 | Blob cmpr; |
| 158 | 158 | Blob hash; |
| 159 | + int markAsUnclustered = 0; | |
| 160 | + | |
| 159 | 161 | assert( g.repositoryOpen ); |
| 160 | 162 | if( pBlob && srcId==0 ){ |
| 161 | 163 | sha1sum_blob(pBlob, &hash); |
| 162 | 164 | }else{ |
| 163 | 165 | blob_init(&hash, zUuid, -1); |
| @@ -183,10 +185,11 @@ | ||
| 183 | 185 | db_end_transaction(0); |
| 184 | 186 | return rid; |
| 185 | 187 | } |
| 186 | 188 | }else{ |
| 187 | 189 | rid = 0; /* No entry with the same UUID currently exists */ |
| 190 | + markAsUnclustered = 1; | |
| 188 | 191 | } |
| 189 | 192 | db_finalize(&s1); |
| 190 | 193 | |
| 191 | 194 | /* Construct a received-from ID if we do not already have one */ |
| 192 | 195 | if( g.rcvid==0 && pBlob!=0 ){ |
| @@ -234,10 +237,17 @@ | ||
| 234 | 237 | ** really a delta. Record this fact in the delta table. |
| 235 | 238 | */ |
| 236 | 239 | if( srcId ){ |
| 237 | 240 | db_multi_exec("REPLACE INTO delta(rid,srcid) VALUES(%d,%d)", rid, srcId); |
| 238 | 241 | } |
| 242 | + | |
| 243 | + /* Add the element to the unclustered table if has never been | |
| 244 | + ** previously seen. | |
| 245 | + */ | |
| 246 | + if( markAsUnclustered ){ | |
| 247 | + db_multi_exec("INSERT OR IGNORE INTO unclustered VALUES(%d)", rid); | |
| 248 | + } | |
| 239 | 249 | |
| 240 | 250 | /* Finish the transaction and cleanup */ |
| 241 | 251 | db_finalize(&s1); |
| 242 | 252 | db_end_transaction(0); |
| 243 | 253 | blob_reset(&hash); |
| 244 | 254 |
| --- src/content.c | |
| +++ src/content.c | |
| @@ -154,10 +154,12 @@ | |
| 154 | int size; |
| 155 | int rid; |
| 156 | Stmt s1; |
| 157 | Blob cmpr; |
| 158 | Blob hash; |
| 159 | assert( g.repositoryOpen ); |
| 160 | if( pBlob && srcId==0 ){ |
| 161 | sha1sum_blob(pBlob, &hash); |
| 162 | }else{ |
| 163 | blob_init(&hash, zUuid, -1); |
| @@ -183,10 +185,11 @@ | |
| 183 | db_end_transaction(0); |
| 184 | return rid; |
| 185 | } |
| 186 | }else{ |
| 187 | rid = 0; /* No entry with the same UUID currently exists */ |
| 188 | } |
| 189 | db_finalize(&s1); |
| 190 | |
| 191 | /* Construct a received-from ID if we do not already have one */ |
| 192 | if( g.rcvid==0 && pBlob!=0 ){ |
| @@ -234,10 +237,17 @@ | |
| 234 | ** really a delta. Record this fact in the delta table. |
| 235 | */ |
| 236 | if( srcId ){ |
| 237 | db_multi_exec("REPLACE INTO delta(rid,srcid) VALUES(%d,%d)", rid, srcId); |
| 238 | } |
| 239 | |
| 240 | /* Finish the transaction and cleanup */ |
| 241 | db_finalize(&s1); |
| 242 | db_end_transaction(0); |
| 243 | blob_reset(&hash); |
| 244 |
| --- src/content.c | |
| +++ src/content.c | |
| @@ -154,10 +154,12 @@ | |
| 154 | int size; |
| 155 | int rid; |
| 156 | Stmt s1; |
| 157 | Blob cmpr; |
| 158 | Blob hash; |
| 159 | int markAsUnclustered = 0; |
| 160 | |
| 161 | assert( g.repositoryOpen ); |
| 162 | if( pBlob && srcId==0 ){ |
| 163 | sha1sum_blob(pBlob, &hash); |
| 164 | }else{ |
| 165 | blob_init(&hash, zUuid, -1); |
| @@ -183,10 +185,11 @@ | |
| 185 | db_end_transaction(0); |
| 186 | return rid; |
| 187 | } |
| 188 | }else{ |
| 189 | rid = 0; /* No entry with the same UUID currently exists */ |
| 190 | markAsUnclustered = 1; |
| 191 | } |
| 192 | db_finalize(&s1); |
| 193 | |
| 194 | /* Construct a received-from ID if we do not already have one */ |
| 195 | if( g.rcvid==0 && pBlob!=0 ){ |
| @@ -234,10 +237,17 @@ | |
| 237 | ** really a delta. Record this fact in the delta table. |
| 238 | */ |
| 239 | if( srcId ){ |
| 240 | db_multi_exec("REPLACE INTO delta(rid,srcid) VALUES(%d,%d)", rid, srcId); |
| 241 | } |
| 242 | |
| 243 | /* Add the element to the unclustered table if has never been |
| 244 | ** previously seen. |
| 245 | */ |
| 246 | if( markAsUnclustered ){ |
| 247 | db_multi_exec("INSERT OR IGNORE INTO unclustered VALUES(%d)", rid); |
| 248 | } |
| 249 | |
| 250 | /* Finish the transaction and cleanup */ |
| 251 | db_finalize(&s1); |
| 252 | db_end_transaction(0); |
| 253 | blob_reset(&hash); |
| 254 |
M
src/db.c
+1
-1
| --- src/db.c | ||
| +++ src/db.c | ||
| @@ -257,11 +257,11 @@ | ||
| 257 | 257 | return sqlite3_column_double(pStmt->pStmt, N); |
| 258 | 258 | } |
| 259 | 259 | const char *db_column_text(Stmt *pStmt, int N){ |
| 260 | 260 | return (char*)sqlite3_column_text(pStmt->pStmt, N); |
| 261 | 261 | } |
| 262 | -const char *db_column_malloc(Stmt *pStmt, int N){ | |
| 262 | +char *db_column_malloc(Stmt *pStmt, int N){ | |
| 263 | 263 | return mprintf("%s", db_column_text(pStmt, N)); |
| 264 | 264 | } |
| 265 | 265 | void db_column_blob(Stmt *pStmt, int N, Blob *pBlob){ |
| 266 | 266 | blob_append(pBlob, sqlite3_column_blob(pStmt->pStmt, N), |
| 267 | 267 | sqlite3_column_bytes(pStmt->pStmt, N)); |
| 268 | 268 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -257,11 +257,11 @@ | |
| 257 | return sqlite3_column_double(pStmt->pStmt, N); |
| 258 | } |
| 259 | const char *db_column_text(Stmt *pStmt, int N){ |
| 260 | return (char*)sqlite3_column_text(pStmt->pStmt, N); |
| 261 | } |
| 262 | const char *db_column_malloc(Stmt *pStmt, int N){ |
| 263 | return mprintf("%s", db_column_text(pStmt, N)); |
| 264 | } |
| 265 | void db_column_blob(Stmt *pStmt, int N, Blob *pBlob){ |
| 266 | blob_append(pBlob, sqlite3_column_blob(pStmt->pStmt, N), |
| 267 | sqlite3_column_bytes(pStmt->pStmt, N)); |
| 268 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -257,11 +257,11 @@ | |
| 257 | return sqlite3_column_double(pStmt->pStmt, N); |
| 258 | } |
| 259 | const char *db_column_text(Stmt *pStmt, int N){ |
| 260 | return (char*)sqlite3_column_text(pStmt->pStmt, N); |
| 261 | } |
| 262 | char *db_column_malloc(Stmt *pStmt, int N){ |
| 263 | return mprintf("%s", db_column_text(pStmt, N)); |
| 264 | } |
| 265 | void db_column_blob(Stmt *pStmt, int N, Blob *pBlob){ |
| 266 | blob_append(pBlob, sqlite3_column_blob(pStmt->pStmt, N), |
| 267 | sqlite3_column_bytes(pStmt->pStmt, N)); |
| 268 |
+3
-2
| --- src/delta.c | ||
| +++ src/delta.c | ||
| @@ -340,15 +340,16 @@ | ||
| 340 | 340 | hash_init(&h, &zOut[base]); |
| 341 | 341 | i = 0; /* Trying to match a landmark against zOut[base+i] */ |
| 342 | 342 | bestCnt = 0; |
| 343 | 343 | while( 1 ){ |
| 344 | 344 | int hv; |
| 345 | + int limit = 250; | |
| 345 | 346 | |
| 346 | 347 | hv = hash_32bit(&h) & (MX_LANDMARK-1); |
| 347 | 348 | DEBUG2( printf("LOOKING: %4d [%s]\n", base+i, print16(&zOut[base+i])); ) |
| 348 | 349 | iBlock = landmark[hv]; |
| 349 | - while( iBlock>=0 ){ | |
| 350 | + while( iBlock>=0 && (limit--)>0 ){ | |
| 350 | 351 | /* |
| 351 | 352 | ** The hash window has identified a potential match against |
| 352 | 353 | ** landmark block iBlock. But we need to investigate further. |
| 353 | 354 | ** |
| 354 | 355 | ** Look for a region in zOut that matches zSrc. Anchor the search |
| @@ -404,11 +405,11 @@ | ||
| 404 | 405 | } |
| 405 | 406 | |
| 406 | 407 | /* We have a copy command that does not cause the delta to be larger |
| 407 | 408 | ** than a literal insert. So add the copy command to the delta. |
| 408 | 409 | */ |
| 409 | - if( bestCnt>0 && base+i>=bestOfst+NHASH ){ | |
| 410 | + if( bestCnt>0 ){ | |
| 410 | 411 | if( bestLitsz>0 ){ |
| 411 | 412 | /* Add an insert command before the copy */ |
| 412 | 413 | putInt(bestLitsz,&zDelta); |
| 413 | 414 | *(zDelta++) = ':'; |
| 414 | 415 | memcpy(zDelta, &zOut[base], bestLitsz); |
| 415 | 416 |
| --- src/delta.c | |
| +++ src/delta.c | |
| @@ -340,15 +340,16 @@ | |
| 340 | hash_init(&h, &zOut[base]); |
| 341 | i = 0; /* Trying to match a landmark against zOut[base+i] */ |
| 342 | bestCnt = 0; |
| 343 | while( 1 ){ |
| 344 | int hv; |
| 345 | |
| 346 | hv = hash_32bit(&h) & (MX_LANDMARK-1); |
| 347 | DEBUG2( printf("LOOKING: %4d [%s]\n", base+i, print16(&zOut[base+i])); ) |
| 348 | iBlock = landmark[hv]; |
| 349 | while( iBlock>=0 ){ |
| 350 | /* |
| 351 | ** The hash window has identified a potential match against |
| 352 | ** landmark block iBlock. But we need to investigate further. |
| 353 | ** |
| 354 | ** Look for a region in zOut that matches zSrc. Anchor the search |
| @@ -404,11 +405,11 @@ | |
| 404 | } |
| 405 | |
| 406 | /* We have a copy command that does not cause the delta to be larger |
| 407 | ** than a literal insert. So add the copy command to the delta. |
| 408 | */ |
| 409 | if( bestCnt>0 && base+i>=bestOfst+NHASH ){ |
| 410 | if( bestLitsz>0 ){ |
| 411 | /* Add an insert command before the copy */ |
| 412 | putInt(bestLitsz,&zDelta); |
| 413 | *(zDelta++) = ':'; |
| 414 | memcpy(zDelta, &zOut[base], bestLitsz); |
| 415 |
| --- src/delta.c | |
| +++ src/delta.c | |
| @@ -340,15 +340,16 @@ | |
| 340 | hash_init(&h, &zOut[base]); |
| 341 | i = 0; /* Trying to match a landmark against zOut[base+i] */ |
| 342 | bestCnt = 0; |
| 343 | while( 1 ){ |
| 344 | int hv; |
| 345 | int limit = 250; |
| 346 | |
| 347 | hv = hash_32bit(&h) & (MX_LANDMARK-1); |
| 348 | DEBUG2( printf("LOOKING: %4d [%s]\n", base+i, print16(&zOut[base+i])); ) |
| 349 | iBlock = landmark[hv]; |
| 350 | while( iBlock>=0 && (limit--)>0 ){ |
| 351 | /* |
| 352 | ** The hash window has identified a potential match against |
| 353 | ** landmark block iBlock. But we need to investigate further. |
| 354 | ** |
| 355 | ** Look for a region in zOut that matches zSrc. Anchor the search |
| @@ -404,11 +405,11 @@ | |
| 405 | } |
| 406 | |
| 407 | /* We have a copy command that does not cause the delta to be larger |
| 408 | ** than a literal insert. So add the copy command to the delta. |
| 409 | */ |
| 410 | if( bestCnt>0 ){ |
| 411 | if( bestLitsz>0 ){ |
| 412 | /* Add an insert command before the copy */ |
| 413 | putInt(bestLitsz,&zDelta); |
| 414 | *(zDelta++) = ':'; |
| 415 | memcpy(zDelta, &zOut[base], bestLitsz); |
| 416 |
+90
-23
| --- src/descendents.c | ||
| +++ src/descendents.c | ||
| @@ -30,40 +30,105 @@ | ||
| 30 | 30 | |
| 31 | 31 | |
| 32 | 32 | /* |
| 33 | 33 | ** Create a temporary table named "leaves" if it does not |
| 34 | 34 | ** already exist. Load this table with the RID of all |
| 35 | -** versions that are leaves are which are decended from | |
| 35 | +** versions that are leaves which are decended from | |
| 36 | 36 | ** version iBase. |
| 37 | 37 | */ |
| 38 | 38 | void compute_leaves(int iBase){ |
| 39 | - int generation = 0; | |
| 40 | - int chngCnt = 0; | |
| 39 | + Bag seen; /* Descendents seen */ | |
| 40 | + Bag pending; /* Unpropagated descendents */ | |
| 41 | 41 | |
| 42 | 42 | db_multi_exec( |
| 43 | 43 | "CREATE TEMP TABLE IF NOT EXISTS leaves(" |
| 44 | - " rid INTEGER PRIMARY KEY," | |
| 45 | - " generation INTEGER" | |
| 44 | + " rid INTEGER PRIMARY KEY" | |
| 46 | 45 | ");" |
| 47 | 46 | "DELETE FROM leaves;" |
| 48 | - "INSERT INTO leaves VALUES(%d,0);", | |
| 49 | - iBase | |
| 50 | - ); | |
| 51 | - do{ | |
| 52 | - db_multi_exec( | |
| 53 | - "INSERT OR IGNORE INTO leaves(rid,generation) " | |
| 54 | - "SELECT cid, %d FROM plink" | |
| 55 | - " WHERE pid IN (SELECT rid FROM leaves WHERE generation=%d)", | |
| 56 | - generation+1, generation | |
| 57 | - ); | |
| 58 | - generation++; | |
| 59 | - chngCnt = db_changes(); | |
| 60 | - }while( chngCnt>0 ); | |
| 61 | - db_multi_exec( | |
| 62 | - "DELETE FROM leaves" | |
| 63 | - " WHERE EXISTS(SELECT 1 FROM plink WHERE pid=rid)" | |
| 64 | - ); | |
| 47 | + ); | |
| 48 | + bag_init(&seen); | |
| 49 | + bag_init(&pending); | |
| 50 | + bag_insert(&pending, iBase); | |
| 51 | + while( bag_count(&pending) ){ | |
| 52 | + int rid = bag_first(&pending); | |
| 53 | + int cnt = 0; | |
| 54 | + Stmt q; | |
| 55 | + bag_remove(&pending, rid); | |
| 56 | + db_prepare(&q, "SELECT cid FROM plink WHERE pid=%d", rid); | |
| 57 | + while( db_step(&q)==SQLITE_ROW ){ | |
| 58 | + int cid = db_column_int(&q, 0); | |
| 59 | + if( bag_insert(&seen, cid) ){ | |
| 60 | + bag_insert(&pending, cid); | |
| 61 | + } | |
| 62 | + cnt++; | |
| 63 | + } | |
| 64 | + db_finalize(&q); | |
| 65 | + if( cnt==0 ){ | |
| 66 | + db_multi_exec("INSERT INTO leaves VALUES(%d)", rid); | |
| 67 | + } | |
| 68 | + } | |
| 69 | + bag_clear(&pending); | |
| 70 | + bag_clear(&seen); | |
| 71 | +} | |
| 72 | + | |
| 73 | +/* | |
| 74 | +** Load the record ID rid and up to N-1 closest ancestors into | |
| 75 | +** the "ok" table. | |
| 76 | +*/ | |
| 77 | +void compute_ancestors(int rid, int N){ | |
| 78 | + Bag seen; | |
| 79 | + PQueue queue; | |
| 80 | + bag_init(&seen); | |
| 81 | + pqueue_init(&queue); | |
| 82 | + bag_insert(&seen, rid); | |
| 83 | + pqueue_insert(&queue, rid, 0.0); | |
| 84 | + while( (N--)>0 && (rid = pqueue_extract(&queue))!=0 ){ | |
| 85 | + Stmt q; | |
| 86 | + db_multi_exec("INSERT OR IGNORE INTO ok VALUES(%d)", rid); | |
| 87 | + db_prepare(&q, | |
| 88 | + "SELECT a.pid, b.mtime FROM plink a LEFT JOIN plink b ON b.cid=a.pid" | |
| 89 | + " WHERE a.cid=%d", rid | |
| 90 | + ); | |
| 91 | + while( db_step(&q)==SQLITE_ROW ){ | |
| 92 | + int pid = db_column_int(&q, 0); | |
| 93 | + double mtime = db_column_double(&q, 1); | |
| 94 | + if( bag_insert(&seen, pid) ){ | |
| 95 | + pqueue_insert(&queue, pid, -mtime); | |
| 96 | + } | |
| 97 | + } | |
| 98 | + db_finalize(&q); | |
| 99 | + } | |
| 100 | + bag_clear(&seen); | |
| 101 | + pqueue_clear(&queue); | |
| 102 | +} | |
| 103 | + | |
| 104 | +/* | |
| 105 | +** Load the record ID rid and up to N-1 closest descendents into | |
| 106 | +** the "ok" table. | |
| 107 | +*/ | |
| 108 | +void compute_descendents(int rid, int N){ | |
| 109 | + Bag seen; | |
| 110 | + PQueue queue; | |
| 111 | + bag_init(&seen); | |
| 112 | + pqueue_init(&queue); | |
| 113 | + bag_insert(&seen, rid); | |
| 114 | + pqueue_insert(&queue, rid, 0.0); | |
| 115 | + while( (N--)>0 && (rid = pqueue_extract(&queue))!=0 ){ | |
| 116 | + Stmt q; | |
| 117 | + db_multi_exec("INSERT OR IGNORE INTO ok VALUES(%d)", rid); | |
| 118 | + db_prepare(&q,"SELECT cid, mtime FROM plink WHERE pid=%d", rid); | |
| 119 | + while( db_step(&q)==SQLITE_ROW ){ | |
| 120 | + int pid = db_column_int(&q, 0); | |
| 121 | + double mtime = db_column_double(&q, 1); | |
| 122 | + if( bag_insert(&seen, pid) ){ | |
| 123 | + pqueue_insert(&queue, pid, mtime); | |
| 124 | + } | |
| 125 | + } | |
| 126 | + db_finalize(&q); | |
| 127 | + } | |
| 128 | + bag_clear(&seen); | |
| 129 | + pqueue_clear(&queue); | |
| 65 | 130 | } |
| 66 | 131 | |
| 67 | 132 | /* |
| 68 | 133 | ** COMMAND: leaves |
| 69 | 134 | ** |
| @@ -117,12 +182,13 @@ | ||
| 117 | 182 | ); |
| 118 | 183 | print_timeline(&q, 20); |
| 119 | 184 | db_finalize(&q); |
| 120 | 185 | } |
| 121 | 186 | |
| 187 | +#if 0 | |
| 122 | 188 | /* |
| 123 | -** WEBPAGE: leaves | |
| 189 | +** WEB PAGE: leaves | |
| 124 | 190 | ** |
| 125 | 191 | ** Find leaves of all branches. |
| 126 | 192 | */ |
| 127 | 193 | void branches_page(void){ |
| 128 | 194 | Stmt q; |
| @@ -148,5 +214,6 @@ | ||
| 148 | 214 | @ function xout(id){ |
| 149 | 215 | @ } |
| 150 | 216 | @ </script> |
| 151 | 217 | style_footer(); |
| 152 | 218 | } |
| 219 | +#endif | |
| 153 | 220 |
| --- src/descendents.c | |
| +++ src/descendents.c | |
| @@ -30,40 +30,105 @@ | |
| 30 | |
| 31 | |
| 32 | /* |
| 33 | ** Create a temporary table named "leaves" if it does not |
| 34 | ** already exist. Load this table with the RID of all |
| 35 | ** versions that are leaves are which are decended from |
| 36 | ** version iBase. |
| 37 | */ |
| 38 | void compute_leaves(int iBase){ |
| 39 | int generation = 0; |
| 40 | int chngCnt = 0; |
| 41 | |
| 42 | db_multi_exec( |
| 43 | "CREATE TEMP TABLE IF NOT EXISTS leaves(" |
| 44 | " rid INTEGER PRIMARY KEY," |
| 45 | " generation INTEGER" |
| 46 | ");" |
| 47 | "DELETE FROM leaves;" |
| 48 | "INSERT INTO leaves VALUES(%d,0);", |
| 49 | iBase |
| 50 | ); |
| 51 | do{ |
| 52 | db_multi_exec( |
| 53 | "INSERT OR IGNORE INTO leaves(rid,generation) " |
| 54 | "SELECT cid, %d FROM plink" |
| 55 | " WHERE pid IN (SELECT rid FROM leaves WHERE generation=%d)", |
| 56 | generation+1, generation |
| 57 | ); |
| 58 | generation++; |
| 59 | chngCnt = db_changes(); |
| 60 | }while( chngCnt>0 ); |
| 61 | db_multi_exec( |
| 62 | "DELETE FROM leaves" |
| 63 | " WHERE EXISTS(SELECT 1 FROM plink WHERE pid=rid)" |
| 64 | ); |
| 65 | } |
| 66 | |
| 67 | /* |
| 68 | ** COMMAND: leaves |
| 69 | ** |
| @@ -117,12 +182,13 @@ | |
| 117 | ); |
| 118 | print_timeline(&q, 20); |
| 119 | db_finalize(&q); |
| 120 | } |
| 121 | |
| 122 | /* |
| 123 | ** WEBPAGE: leaves |
| 124 | ** |
| 125 | ** Find leaves of all branches. |
| 126 | */ |
| 127 | void branches_page(void){ |
| 128 | Stmt q; |
| @@ -148,5 +214,6 @@ | |
| 148 | @ function xout(id){ |
| 149 | @ } |
| 150 | @ </script> |
| 151 | style_footer(); |
| 152 | } |
| 153 |
| --- src/descendents.c | |
| +++ src/descendents.c | |
| @@ -30,40 +30,105 @@ | |
| 30 | |
| 31 | |
| 32 | /* |
| 33 | ** Create a temporary table named "leaves" if it does not |
| 34 | ** already exist. Load this table with the RID of all |
| 35 | ** versions that are leaves which are decended from |
| 36 | ** version iBase. |
| 37 | */ |
| 38 | void compute_leaves(int iBase){ |
| 39 | Bag seen; /* Descendents seen */ |
| 40 | Bag pending; /* Unpropagated descendents */ |
| 41 | |
| 42 | db_multi_exec( |
| 43 | "CREATE TEMP TABLE IF NOT EXISTS leaves(" |
| 44 | " rid INTEGER PRIMARY KEY" |
| 45 | ");" |
| 46 | "DELETE FROM leaves;" |
| 47 | ); |
| 48 | bag_init(&seen); |
| 49 | bag_init(&pending); |
| 50 | bag_insert(&pending, iBase); |
| 51 | while( bag_count(&pending) ){ |
| 52 | int rid = bag_first(&pending); |
| 53 | int cnt = 0; |
| 54 | Stmt q; |
| 55 | bag_remove(&pending, rid); |
| 56 | db_prepare(&q, "SELECT cid FROM plink WHERE pid=%d", rid); |
| 57 | while( db_step(&q)==SQLITE_ROW ){ |
| 58 | int cid = db_column_int(&q, 0); |
| 59 | if( bag_insert(&seen, cid) ){ |
| 60 | bag_insert(&pending, cid); |
| 61 | } |
| 62 | cnt++; |
| 63 | } |
| 64 | db_finalize(&q); |
| 65 | if( cnt==0 ){ |
| 66 | db_multi_exec("INSERT INTO leaves VALUES(%d)", rid); |
| 67 | } |
| 68 | } |
| 69 | bag_clear(&pending); |
| 70 | bag_clear(&seen); |
| 71 | } |
| 72 | |
| 73 | /* |
| 74 | ** Load the record ID rid and up to N-1 closest ancestors into |
| 75 | ** the "ok" table. |
| 76 | */ |
| 77 | void compute_ancestors(int rid, int N){ |
| 78 | Bag seen; |
| 79 | PQueue queue; |
| 80 | bag_init(&seen); |
| 81 | pqueue_init(&queue); |
| 82 | bag_insert(&seen, rid); |
| 83 | pqueue_insert(&queue, rid, 0.0); |
| 84 | while( (N--)>0 && (rid = pqueue_extract(&queue))!=0 ){ |
| 85 | Stmt q; |
| 86 | db_multi_exec("INSERT OR IGNORE INTO ok VALUES(%d)", rid); |
| 87 | db_prepare(&q, |
| 88 | "SELECT a.pid, b.mtime FROM plink a LEFT JOIN plink b ON b.cid=a.pid" |
| 89 | " WHERE a.cid=%d", rid |
| 90 | ); |
| 91 | while( db_step(&q)==SQLITE_ROW ){ |
| 92 | int pid = db_column_int(&q, 0); |
| 93 | double mtime = db_column_double(&q, 1); |
| 94 | if( bag_insert(&seen, pid) ){ |
| 95 | pqueue_insert(&queue, pid, -mtime); |
| 96 | } |
| 97 | } |
| 98 | db_finalize(&q); |
| 99 | } |
| 100 | bag_clear(&seen); |
| 101 | pqueue_clear(&queue); |
| 102 | } |
| 103 | |
| 104 | /* |
| 105 | ** Load the record ID rid and up to N-1 closest descendents into |
| 106 | ** the "ok" table. |
| 107 | */ |
| 108 | void compute_descendents(int rid, int N){ |
| 109 | Bag seen; |
| 110 | PQueue queue; |
| 111 | bag_init(&seen); |
| 112 | pqueue_init(&queue); |
| 113 | bag_insert(&seen, rid); |
| 114 | pqueue_insert(&queue, rid, 0.0); |
| 115 | while( (N--)>0 && (rid = pqueue_extract(&queue))!=0 ){ |
| 116 | Stmt q; |
| 117 | db_multi_exec("INSERT OR IGNORE INTO ok VALUES(%d)", rid); |
| 118 | db_prepare(&q,"SELECT cid, mtime FROM plink WHERE pid=%d", rid); |
| 119 | while( db_step(&q)==SQLITE_ROW ){ |
| 120 | int pid = db_column_int(&q, 0); |
| 121 | double mtime = db_column_double(&q, 1); |
| 122 | if( bag_insert(&seen, pid) ){ |
| 123 | pqueue_insert(&queue, pid, mtime); |
| 124 | } |
| 125 | } |
| 126 | db_finalize(&q); |
| 127 | } |
| 128 | bag_clear(&seen); |
| 129 | pqueue_clear(&queue); |
| 130 | } |
| 131 | |
| 132 | /* |
| 133 | ** COMMAND: leaves |
| 134 | ** |
| @@ -117,12 +182,13 @@ | |
| 182 | ); |
| 183 | print_timeline(&q, 20); |
| 184 | db_finalize(&q); |
| 185 | } |
| 186 | |
| 187 | #if 0 |
| 188 | /* |
| 189 | ** WEB PAGE: leaves |
| 190 | ** |
| 191 | ** Find leaves of all branches. |
| 192 | */ |
| 193 | void branches_page(void){ |
| 194 | Stmt q; |
| @@ -148,5 +214,6 @@ | |
| 214 | @ function xout(id){ |
| 215 | @ } |
| 216 | @ </script> |
| 217 | style_footer(); |
| 218 | } |
| 219 | #endif |
| 220 |
+4
-3
| --- src/info.c | ||
| +++ src/info.c | ||
| @@ -211,11 +211,10 @@ | ||
| 211 | 211 | " event.user, event.comment" |
| 212 | 212 | " FROM leaves, plink, blob, event" |
| 213 | 213 | " WHERE plink.cid=leaves.rid" |
| 214 | 214 | " AND blob.rid=leaves.rid" |
| 215 | 215 | " AND event.objid=leaves.rid" |
| 216 | - " AND +generation>0" | |
| 217 | 216 | " ORDER BY event.mtime DESC" |
| 218 | 217 | ); |
| 219 | 218 | while( db_step(&q)==SQLITE_ROW ){ |
| 220 | 219 | const char *zUuid = db_column_text(&q, 0); |
| 221 | 220 | const char *zDate = db_column_text(&q, 1); |
| @@ -536,12 +535,14 @@ | ||
| 536 | 535 | style_footer(); |
| 537 | 536 | } |
| 538 | 537 | |
| 539 | 538 | /* |
| 540 | 539 | ** WEBPAGE: fview |
| 541 | -** | |
| 542 | -** Show the complete content of a file identified by g.zExtra | |
| 540 | +** URL: /fview/UUID | |
| 541 | +** | |
| 542 | +** Show the complete content of a file identified by UUID | |
| 543 | +** as preformatted text. | |
| 543 | 544 | */ |
| 544 | 545 | void fview_page(void){ |
| 545 | 546 | int rid; |
| 546 | 547 | Blob content; |
| 547 | 548 | |
| 548 | 549 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -211,11 +211,10 @@ | |
| 211 | " event.user, event.comment" |
| 212 | " FROM leaves, plink, blob, event" |
| 213 | " WHERE plink.cid=leaves.rid" |
| 214 | " AND blob.rid=leaves.rid" |
| 215 | " AND event.objid=leaves.rid" |
| 216 | " AND +generation>0" |
| 217 | " ORDER BY event.mtime DESC" |
| 218 | ); |
| 219 | while( db_step(&q)==SQLITE_ROW ){ |
| 220 | const char *zUuid = db_column_text(&q, 0); |
| 221 | const char *zDate = db_column_text(&q, 1); |
| @@ -536,12 +535,14 @@ | |
| 536 | style_footer(); |
| 537 | } |
| 538 | |
| 539 | /* |
| 540 | ** WEBPAGE: fview |
| 541 | ** |
| 542 | ** Show the complete content of a file identified by g.zExtra |
| 543 | */ |
| 544 | void fview_page(void){ |
| 545 | int rid; |
| 546 | Blob content; |
| 547 | |
| 548 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -211,11 +211,10 @@ | |
| 211 | " event.user, event.comment" |
| 212 | " FROM leaves, plink, blob, event" |
| 213 | " WHERE plink.cid=leaves.rid" |
| 214 | " AND blob.rid=leaves.rid" |
| 215 | " AND event.objid=leaves.rid" |
| 216 | " ORDER BY event.mtime DESC" |
| 217 | ); |
| 218 | while( db_step(&q)==SQLITE_ROW ){ |
| 219 | const char *zUuid = db_column_text(&q, 0); |
| 220 | const char *zDate = db_column_text(&q, 1); |
| @@ -536,12 +535,14 @@ | |
| 535 | style_footer(); |
| 536 | } |
| 537 | |
| 538 | /* |
| 539 | ** WEBPAGE: fview |
| 540 | ** URL: /fview/UUID |
| 541 | ** |
| 542 | ** Show the complete content of a file identified by UUID |
| 543 | ** as preformatted text. |
| 544 | */ |
| 545 | void fview_page(void){ |
| 546 | int rid; |
| 547 | Blob content; |
| 548 | |
| 549 |
+2
-11
| --- src/main.c | ||
| +++ src/main.c | ||
| @@ -339,11 +339,11 @@ | ||
| 339 | 339 | printf("\n"); |
| 340 | 340 | } |
| 341 | 341 | } |
| 342 | 342 | |
| 343 | 343 | /* |
| 344 | -** COMMAND: commands | |
| 344 | +** COM MAND: commands | |
| 345 | 345 | ** |
| 346 | 346 | ** Usage: %fossil commands |
| 347 | 347 | ** List all supported commands. |
| 348 | 348 | */ |
| 349 | 349 | void cmd_cmd_list(void){ |
| @@ -385,10 +385,11 @@ | ||
| 385 | 385 | int rc, idx; |
| 386 | 386 | const char *z; |
| 387 | 387 | if( g.argc!=3 ){ |
| 388 | 388 | printf("Usage: %s help COMMAND.\nAvailable COMMANDs:\n", g.argv[0]); |
| 389 | 389 | cmd_cmd_list(); |
| 390 | + printf("You are running fossil baseline " MANIFEST_UUID "\n"); | |
| 390 | 391 | return; |
| 391 | 392 | } |
| 392 | 393 | rc = name_search(g.argv[2], aCommand, count(aCommand), &idx); |
| 393 | 394 | if( rc==1 ){ |
| 394 | 395 | fossil_fatal("unknown command: %s", g.argv[2]); |
| @@ -410,20 +411,10 @@ | ||
| 410 | 411 | } |
| 411 | 412 | } |
| 412 | 413 | putchar('\n'); |
| 413 | 414 | } |
| 414 | 415 | |
| 415 | -/* | |
| 416 | -** COMMAND: baseline | |
| 417 | -** | |
| 418 | -** Show the baseline number of the source code from which this | |
| 419 | -** fossil executable was generated. | |
| 420 | -*/ | |
| 421 | -void baseline_cmd(void){ | |
| 422 | - printf("%s\n", MANIFEST_UUID); | |
| 423 | -} | |
| 424 | - | |
| 425 | 416 | /* |
| 426 | 417 | ** RSS feeds need to reference absolute URLs so we need to calculate |
| 427 | 418 | ** the base URL onto which we add components. This is basically |
| 428 | 419 | ** cgi_redirect() stripped down and always returning an absolute URL. |
| 429 | 420 | */ |
| 430 | 421 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -339,11 +339,11 @@ | |
| 339 | printf("\n"); |
| 340 | } |
| 341 | } |
| 342 | |
| 343 | /* |
| 344 | ** COMMAND: commands |
| 345 | ** |
| 346 | ** Usage: %fossil commands |
| 347 | ** List all supported commands. |
| 348 | */ |
| 349 | void cmd_cmd_list(void){ |
| @@ -385,10 +385,11 @@ | |
| 385 | int rc, idx; |
| 386 | const char *z; |
| 387 | if( g.argc!=3 ){ |
| 388 | printf("Usage: %s help COMMAND.\nAvailable COMMANDs:\n", g.argv[0]); |
| 389 | cmd_cmd_list(); |
| 390 | return; |
| 391 | } |
| 392 | rc = name_search(g.argv[2], aCommand, count(aCommand), &idx); |
| 393 | if( rc==1 ){ |
| 394 | fossil_fatal("unknown command: %s", g.argv[2]); |
| @@ -410,20 +411,10 @@ | |
| 410 | } |
| 411 | } |
| 412 | putchar('\n'); |
| 413 | } |
| 414 | |
| 415 | /* |
| 416 | ** COMMAND: baseline |
| 417 | ** |
| 418 | ** Show the baseline number of the source code from which this |
| 419 | ** fossil executable was generated. |
| 420 | */ |
| 421 | void baseline_cmd(void){ |
| 422 | printf("%s\n", MANIFEST_UUID); |
| 423 | } |
| 424 | |
| 425 | /* |
| 426 | ** RSS feeds need to reference absolute URLs so we need to calculate |
| 427 | ** the base URL onto which we add components. This is basically |
| 428 | ** cgi_redirect() stripped down and always returning an absolute URL. |
| 429 | */ |
| 430 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -339,11 +339,11 @@ | |
| 339 | printf("\n"); |
| 340 | } |
| 341 | } |
| 342 | |
| 343 | /* |
| 344 | ** COM MAND: commands |
| 345 | ** |
| 346 | ** Usage: %fossil commands |
| 347 | ** List all supported commands. |
| 348 | */ |
| 349 | void cmd_cmd_list(void){ |
| @@ -385,10 +385,11 @@ | |
| 385 | int rc, idx; |
| 386 | const char *z; |
| 387 | if( g.argc!=3 ){ |
| 388 | printf("Usage: %s help COMMAND.\nAvailable COMMANDs:\n", g.argv[0]); |
| 389 | cmd_cmd_list(); |
| 390 | printf("You are running fossil baseline " MANIFEST_UUID "\n"); |
| 391 | return; |
| 392 | } |
| 393 | rc = name_search(g.argv[2], aCommand, count(aCommand), &idx); |
| 394 | if( rc==1 ){ |
| 395 | fossil_fatal("unknown command: %s", g.argv[2]); |
| @@ -410,20 +411,10 @@ | |
| 411 | } |
| 412 | } |
| 413 | putchar('\n'); |
| 414 | } |
| 415 | |
| 416 | /* |
| 417 | ** RSS feeds need to reference absolute URLs so we need to calculate |
| 418 | ** the base URL onto which we add components. This is basically |
| 419 | ** cgi_redirect() stripped down and always returning an absolute URL. |
| 420 | */ |
| 421 |
+73
-47
| --- src/main.mk | ||
| +++ src/main.mk | ||
| @@ -12,10 +12,11 @@ | ||
| 12 | 12 | XTCC = $(TCC) $(CFLAGS) -I. -I$(SRCDIR) |
| 13 | 13 | |
| 14 | 14 | |
| 15 | 15 | SRC = \ |
| 16 | 16 | $(SRCDIR)/add.c \ |
| 17 | + $(SRCDIR)/bag.c \ | |
| 17 | 18 | $(SRCDIR)/blob.c \ |
| 18 | 19 | $(SRCDIR)/cgi.c \ |
| 19 | 20 | $(SRCDIR)/checkin.c \ |
| 20 | 21 | $(SRCDIR)/checkout.c \ |
| 21 | 22 | $(SRCDIR)/clearsign.c \ |
| @@ -39,10 +40,11 @@ | ||
| 39 | 40 | $(SRCDIR)/md5.c \ |
| 40 | 41 | $(SRCDIR)/merge.c \ |
| 41 | 42 | $(SRCDIR)/merge3.c \ |
| 42 | 43 | $(SRCDIR)/name.c \ |
| 43 | 44 | $(SRCDIR)/pivot.c \ |
| 45 | + $(SRCDIR)/pqueue.c \ | |
| 44 | 46 | $(SRCDIR)/printf.c \ |
| 45 | 47 | $(SRCDIR)/rebuild.c \ |
| 46 | 48 | $(SRCDIR)/schema.c \ |
| 47 | 49 | $(SRCDIR)/setup.c \ |
| 48 | 50 | $(SRCDIR)/sha1.c \ |
| @@ -59,10 +61,11 @@ | ||
| 59 | 61 | $(SRCDIR)/xfer.c \ |
| 60 | 62 | $(SRCDIR)/zip.c |
| 61 | 63 | |
| 62 | 64 | TRANS_SRC = \ |
| 63 | 65 | add_.c \ |
| 66 | + bag_.c \ | |
| 64 | 67 | blob_.c \ |
| 65 | 68 | cgi_.c \ |
| 66 | 69 | checkin_.c \ |
| 67 | 70 | checkout_.c \ |
| 68 | 71 | clearsign_.c \ |
| @@ -86,10 +89,11 @@ | ||
| 86 | 89 | md5_.c \ |
| 87 | 90 | merge_.c \ |
| 88 | 91 | merge3_.c \ |
| 89 | 92 | name_.c \ |
| 90 | 93 | pivot_.c \ |
| 94 | + pqueue_.c \ | |
| 91 | 95 | printf_.c \ |
| 92 | 96 | rebuild_.c \ |
| 93 | 97 | schema_.c \ |
| 94 | 98 | setup_.c \ |
| 95 | 99 | sha1_.c \ |
| @@ -106,10 +110,11 @@ | ||
| 106 | 110 | xfer_.c \ |
| 107 | 111 | zip_.c |
| 108 | 112 | |
| 109 | 113 | OBJ = \ |
| 110 | 114 | add.o \ |
| 115 | + bag.o \ | |
| 111 | 116 | blob.o \ |
| 112 | 117 | cgi.o \ |
| 113 | 118 | checkin.o \ |
| 114 | 119 | checkout.o \ |
| 115 | 120 | clearsign.o \ |
| @@ -133,10 +138,11 @@ | ||
| 133 | 138 | md5.o \ |
| 134 | 139 | merge.o \ |
| 135 | 140 | merge3.o \ |
| 136 | 141 | name.o \ |
| 137 | 142 | pivot.o \ |
| 143 | + pqueue.o \ | |
| 138 | 144 | printf.o \ |
| 139 | 145 | rebuild.o \ |
| 140 | 146 | schema.o \ |
| 141 | 147 | setup.o \ |
| 142 | 148 | sha1.o \ |
| @@ -184,14 +190,14 @@ | ||
| 184 | 190 | $(TCC) -o $(APPNAME) $(OBJ) sqlite3.o $(LIB) |
| 185 | 191 | |
| 186 | 192 | clean: |
| 187 | 193 | rm -f *.o *_.c $(APPNAME) VERSION.h |
| 188 | 194 | rm -f translate makeheaders mkindex page_index.h headers |
| 189 | - rm -f add.h blob.h cgi.h checkin.h checkout.h clearsign.h clone.h comformat.h construct.h content.h db.h delta.h deltacmd.h descendents.h diff.h diffcmd.h encode.h file.h http.h info.h login.h main.h manifest.h md5.h merge.h merge3.h name.h pivot.h printf.h rebuild.h schema.h setup.h sha1.h style.h sync.h timeline.h update.h url.h user.h verify.h vfile.h wiki.h wikiformat.h xfer.h zip.h | |
| 195 | + rm -f add.h bag.h blob.h cgi.h checkin.h checkout.h clearsign.h clone.h comformat.h construct.h content.h db.h delta.h deltacmd.h descendents.h diff.h diffcmd.h encode.h file.h http.h info.h login.h main.h manifest.h md5.h merge.h merge3.h name.h pivot.h pqueue.h printf.h rebuild.h schema.h setup.h sha1.h style.h sync.h timeline.h update.h url.h user.h verify.h vfile.h wiki.h wikiformat.h xfer.h zip.h | |
| 190 | 196 | |
| 191 | 197 | headers: makeheaders mkindex $(TRANS_SRC) ./VERSION.h |
| 192 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 198 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 193 | 199 | ./mkindex $(TRANS_SRC) >page_index.h |
| 194 | 200 | touch headers |
| 195 | 201 | |
| 196 | 202 | add_.c: $(SRCDIR)/add.c $(SRCDIR)/VERSION translate |
| 197 | 203 | ./translate $(SRCDIR)/add.c | sed -f $(SRCDIR)/VERSION >add_.c |
| @@ -198,451 +204,471 @@ | ||
| 198 | 204 | |
| 199 | 205 | add.o: add_.c add.h $(SRCDIR)/config.h |
| 200 | 206 | $(XTCC) -o add.o -c add_.c |
| 201 | 207 | |
| 202 | 208 | add.h: makeheaders |
| 203 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 209 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 210 | + touch headers | |
| 211 | + | |
| 212 | +bag_.c: $(SRCDIR)/bag.c $(SRCDIR)/VERSION translate | |
| 213 | + ./translate $(SRCDIR)/bag.c | sed -f $(SRCDIR)/VERSION >bag_.c | |
| 214 | + | |
| 215 | +bag.o: bag_.c bag.h $(SRCDIR)/config.h | |
| 216 | + $(XTCC) -o bag.o -c bag_.c | |
| 217 | + | |
| 218 | +bag.h: makeheaders | |
| 219 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 204 | 220 | touch headers |
| 205 | 221 | |
| 206 | 222 | blob_.c: $(SRCDIR)/blob.c $(SRCDIR)/VERSION translate |
| 207 | 223 | ./translate $(SRCDIR)/blob.c | sed -f $(SRCDIR)/VERSION >blob_.c |
| 208 | 224 | |
| 209 | 225 | blob.o: blob_.c blob.h $(SRCDIR)/config.h |
| 210 | 226 | $(XTCC) -o blob.o -c blob_.c |
| 211 | 227 | |
| 212 | 228 | blob.h: makeheaders |
| 213 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 229 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 214 | 230 | touch headers |
| 215 | 231 | |
| 216 | 232 | cgi_.c: $(SRCDIR)/cgi.c $(SRCDIR)/VERSION translate |
| 217 | 233 | ./translate $(SRCDIR)/cgi.c | sed -f $(SRCDIR)/VERSION >cgi_.c |
| 218 | 234 | |
| 219 | 235 | cgi.o: cgi_.c cgi.h $(SRCDIR)/config.h |
| 220 | 236 | $(XTCC) -o cgi.o -c cgi_.c |
| 221 | 237 | |
| 222 | 238 | cgi.h: makeheaders |
| 223 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 239 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 224 | 240 | touch headers |
| 225 | 241 | |
| 226 | 242 | checkin_.c: $(SRCDIR)/checkin.c $(SRCDIR)/VERSION translate |
| 227 | 243 | ./translate $(SRCDIR)/checkin.c | sed -f $(SRCDIR)/VERSION >checkin_.c |
| 228 | 244 | |
| 229 | 245 | checkin.o: checkin_.c checkin.h $(SRCDIR)/config.h |
| 230 | 246 | $(XTCC) -o checkin.o -c checkin_.c |
| 231 | 247 | |
| 232 | 248 | checkin.h: makeheaders |
| 233 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 249 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 234 | 250 | touch headers |
| 235 | 251 | |
| 236 | 252 | checkout_.c: $(SRCDIR)/checkout.c $(SRCDIR)/VERSION translate |
| 237 | 253 | ./translate $(SRCDIR)/checkout.c | sed -f $(SRCDIR)/VERSION >checkout_.c |
| 238 | 254 | |
| 239 | 255 | checkout.o: checkout_.c checkout.h $(SRCDIR)/config.h |
| 240 | 256 | $(XTCC) -o checkout.o -c checkout_.c |
| 241 | 257 | |
| 242 | 258 | checkout.h: makeheaders |
| 243 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 259 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 244 | 260 | touch headers |
| 245 | 261 | |
| 246 | 262 | clearsign_.c: $(SRCDIR)/clearsign.c $(SRCDIR)/VERSION translate |
| 247 | 263 | ./translate $(SRCDIR)/clearsign.c | sed -f $(SRCDIR)/VERSION >clearsign_.c |
| 248 | 264 | |
| 249 | 265 | clearsign.o: clearsign_.c clearsign.h $(SRCDIR)/config.h |
| 250 | 266 | $(XTCC) -o clearsign.o -c clearsign_.c |
| 251 | 267 | |
| 252 | 268 | clearsign.h: makeheaders |
| 253 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 269 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 254 | 270 | touch headers |
| 255 | 271 | |
| 256 | 272 | clone_.c: $(SRCDIR)/clone.c $(SRCDIR)/VERSION translate |
| 257 | 273 | ./translate $(SRCDIR)/clone.c | sed -f $(SRCDIR)/VERSION >clone_.c |
| 258 | 274 | |
| 259 | 275 | clone.o: clone_.c clone.h $(SRCDIR)/config.h |
| 260 | 276 | $(XTCC) -o clone.o -c clone_.c |
| 261 | 277 | |
| 262 | 278 | clone.h: makeheaders |
| 263 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 279 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 264 | 280 | touch headers |
| 265 | 281 | |
| 266 | 282 | comformat_.c: $(SRCDIR)/comformat.c $(SRCDIR)/VERSION translate |
| 267 | 283 | ./translate $(SRCDIR)/comformat.c | sed -f $(SRCDIR)/VERSION >comformat_.c |
| 268 | 284 | |
| 269 | 285 | comformat.o: comformat_.c comformat.h $(SRCDIR)/config.h |
| 270 | 286 | $(XTCC) -o comformat.o -c comformat_.c |
| 271 | 287 | |
| 272 | 288 | comformat.h: makeheaders |
| 273 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 289 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 274 | 290 | touch headers |
| 275 | 291 | |
| 276 | 292 | construct_.c: $(SRCDIR)/construct.c $(SRCDIR)/VERSION translate |
| 277 | 293 | ./translate $(SRCDIR)/construct.c | sed -f $(SRCDIR)/VERSION >construct_.c |
| 278 | 294 | |
| 279 | 295 | construct.o: construct_.c construct.h $(SRCDIR)/config.h |
| 280 | 296 | $(XTCC) -o construct.o -c construct_.c |
| 281 | 297 | |
| 282 | 298 | construct.h: makeheaders |
| 283 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 299 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 284 | 300 | touch headers |
| 285 | 301 | |
| 286 | 302 | content_.c: $(SRCDIR)/content.c $(SRCDIR)/VERSION translate |
| 287 | 303 | ./translate $(SRCDIR)/content.c | sed -f $(SRCDIR)/VERSION >content_.c |
| 288 | 304 | |
| 289 | 305 | content.o: content_.c content.h $(SRCDIR)/config.h |
| 290 | 306 | $(XTCC) -o content.o -c content_.c |
| 291 | 307 | |
| 292 | 308 | content.h: makeheaders |
| 293 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 309 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 294 | 310 | touch headers |
| 295 | 311 | |
| 296 | 312 | db_.c: $(SRCDIR)/db.c $(SRCDIR)/VERSION translate |
| 297 | 313 | ./translate $(SRCDIR)/db.c | sed -f $(SRCDIR)/VERSION >db_.c |
| 298 | 314 | |
| 299 | 315 | db.o: db_.c db.h $(SRCDIR)/config.h |
| 300 | 316 | $(XTCC) -o db.o -c db_.c |
| 301 | 317 | |
| 302 | 318 | db.h: makeheaders |
| 303 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 319 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 304 | 320 | touch headers |
| 305 | 321 | |
| 306 | 322 | delta_.c: $(SRCDIR)/delta.c $(SRCDIR)/VERSION translate |
| 307 | 323 | ./translate $(SRCDIR)/delta.c | sed -f $(SRCDIR)/VERSION >delta_.c |
| 308 | 324 | |
| 309 | 325 | delta.o: delta_.c delta.h $(SRCDIR)/config.h |
| 310 | 326 | $(XTCC) -o delta.o -c delta_.c |
| 311 | 327 | |
| 312 | 328 | delta.h: makeheaders |
| 313 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 329 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 314 | 330 | touch headers |
| 315 | 331 | |
| 316 | 332 | deltacmd_.c: $(SRCDIR)/deltacmd.c $(SRCDIR)/VERSION translate |
| 317 | 333 | ./translate $(SRCDIR)/deltacmd.c | sed -f $(SRCDIR)/VERSION >deltacmd_.c |
| 318 | 334 | |
| 319 | 335 | deltacmd.o: deltacmd_.c deltacmd.h $(SRCDIR)/config.h |
| 320 | 336 | $(XTCC) -o deltacmd.o -c deltacmd_.c |
| 321 | 337 | |
| 322 | 338 | deltacmd.h: makeheaders |
| 323 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 339 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 324 | 340 | touch headers |
| 325 | 341 | |
| 326 | 342 | descendents_.c: $(SRCDIR)/descendents.c $(SRCDIR)/VERSION translate |
| 327 | 343 | ./translate $(SRCDIR)/descendents.c | sed -f $(SRCDIR)/VERSION >descendents_.c |
| 328 | 344 | |
| 329 | 345 | descendents.o: descendents_.c descendents.h $(SRCDIR)/config.h |
| 330 | 346 | $(XTCC) -o descendents.o -c descendents_.c |
| 331 | 347 | |
| 332 | 348 | descendents.h: makeheaders |
| 333 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 349 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 334 | 350 | touch headers |
| 335 | 351 | |
| 336 | 352 | diff_.c: $(SRCDIR)/diff.c $(SRCDIR)/VERSION translate |
| 337 | 353 | ./translate $(SRCDIR)/diff.c | sed -f $(SRCDIR)/VERSION >diff_.c |
| 338 | 354 | |
| 339 | 355 | diff.o: diff_.c diff.h $(SRCDIR)/config.h |
| 340 | 356 | $(XTCC) -o diff.o -c diff_.c |
| 341 | 357 | |
| 342 | 358 | diff.h: makeheaders |
| 343 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 359 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 344 | 360 | touch headers |
| 345 | 361 | |
| 346 | 362 | diffcmd_.c: $(SRCDIR)/diffcmd.c $(SRCDIR)/VERSION translate |
| 347 | 363 | ./translate $(SRCDIR)/diffcmd.c | sed -f $(SRCDIR)/VERSION >diffcmd_.c |
| 348 | 364 | |
| 349 | 365 | diffcmd.o: diffcmd_.c diffcmd.h $(SRCDIR)/config.h |
| 350 | 366 | $(XTCC) -o diffcmd.o -c diffcmd_.c |
| 351 | 367 | |
| 352 | 368 | diffcmd.h: makeheaders |
| 353 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 369 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 354 | 370 | touch headers |
| 355 | 371 | |
| 356 | 372 | encode_.c: $(SRCDIR)/encode.c $(SRCDIR)/VERSION translate |
| 357 | 373 | ./translate $(SRCDIR)/encode.c | sed -f $(SRCDIR)/VERSION >encode_.c |
| 358 | 374 | |
| 359 | 375 | encode.o: encode_.c encode.h $(SRCDIR)/config.h |
| 360 | 376 | $(XTCC) -o encode.o -c encode_.c |
| 361 | 377 | |
| 362 | 378 | encode.h: makeheaders |
| 363 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 379 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 364 | 380 | touch headers |
| 365 | 381 | |
| 366 | 382 | file_.c: $(SRCDIR)/file.c $(SRCDIR)/VERSION translate |
| 367 | 383 | ./translate $(SRCDIR)/file.c | sed -f $(SRCDIR)/VERSION >file_.c |
| 368 | 384 | |
| 369 | 385 | file.o: file_.c file.h $(SRCDIR)/config.h |
| 370 | 386 | $(XTCC) -o file.o -c file_.c |
| 371 | 387 | |
| 372 | 388 | file.h: makeheaders |
| 373 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 389 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 374 | 390 | touch headers |
| 375 | 391 | |
| 376 | 392 | http_.c: $(SRCDIR)/http.c $(SRCDIR)/VERSION translate |
| 377 | 393 | ./translate $(SRCDIR)/http.c | sed -f $(SRCDIR)/VERSION >http_.c |
| 378 | 394 | |
| 379 | 395 | http.o: http_.c http.h $(SRCDIR)/config.h |
| 380 | 396 | $(XTCC) -o http.o -c http_.c |
| 381 | 397 | |
| 382 | 398 | http.h: makeheaders |
| 383 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 399 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 384 | 400 | touch headers |
| 385 | 401 | |
| 386 | 402 | info_.c: $(SRCDIR)/info.c $(SRCDIR)/VERSION translate |
| 387 | 403 | ./translate $(SRCDIR)/info.c | sed -f $(SRCDIR)/VERSION >info_.c |
| 388 | 404 | |
| 389 | 405 | info.o: info_.c info.h $(SRCDIR)/config.h |
| 390 | 406 | $(XTCC) -o info.o -c info_.c |
| 391 | 407 | |
| 392 | 408 | info.h: makeheaders |
| 393 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 409 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 394 | 410 | touch headers |
| 395 | 411 | |
| 396 | 412 | login_.c: $(SRCDIR)/login.c $(SRCDIR)/VERSION translate |
| 397 | 413 | ./translate $(SRCDIR)/login.c | sed -f $(SRCDIR)/VERSION >login_.c |
| 398 | 414 | |
| 399 | 415 | login.o: login_.c login.h $(SRCDIR)/config.h |
| 400 | 416 | $(XTCC) -o login.o -c login_.c |
| 401 | 417 | |
| 402 | 418 | login.h: makeheaders |
| 403 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 419 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 404 | 420 | touch headers |
| 405 | 421 | |
| 406 | 422 | main_.c: $(SRCDIR)/main.c $(SRCDIR)/VERSION translate |
| 407 | 423 | ./translate $(SRCDIR)/main.c | sed -f $(SRCDIR)/VERSION >main_.c |
| 408 | 424 | |
| 409 | 425 | main.o: main_.c main.h page_index.h $(SRCDIR)/config.h |
| 410 | 426 | $(XTCC) -o main.o -c main_.c |
| 411 | 427 | |
| 412 | 428 | main.h: makeheaders |
| 413 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 429 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 414 | 430 | touch headers |
| 415 | 431 | |
| 416 | 432 | manifest_.c: $(SRCDIR)/manifest.c $(SRCDIR)/VERSION translate |
| 417 | 433 | ./translate $(SRCDIR)/manifest.c | sed -f $(SRCDIR)/VERSION >manifest_.c |
| 418 | 434 | |
| 419 | 435 | manifest.o: manifest_.c manifest.h $(SRCDIR)/config.h |
| 420 | 436 | $(XTCC) -o manifest.o -c manifest_.c |
| 421 | 437 | |
| 422 | 438 | manifest.h: makeheaders |
| 423 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 439 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 424 | 440 | touch headers |
| 425 | 441 | |
| 426 | 442 | md5_.c: $(SRCDIR)/md5.c $(SRCDIR)/VERSION translate |
| 427 | 443 | ./translate $(SRCDIR)/md5.c | sed -f $(SRCDIR)/VERSION >md5_.c |
| 428 | 444 | |
| 429 | 445 | md5.o: md5_.c md5.h $(SRCDIR)/config.h |
| 430 | 446 | $(XTCC) -o md5.o -c md5_.c |
| 431 | 447 | |
| 432 | 448 | md5.h: makeheaders |
| 433 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 449 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 434 | 450 | touch headers |
| 435 | 451 | |
| 436 | 452 | merge_.c: $(SRCDIR)/merge.c $(SRCDIR)/VERSION translate |
| 437 | 453 | ./translate $(SRCDIR)/merge.c | sed -f $(SRCDIR)/VERSION >merge_.c |
| 438 | 454 | |
| 439 | 455 | merge.o: merge_.c merge.h $(SRCDIR)/config.h |
| 440 | 456 | $(XTCC) -o merge.o -c merge_.c |
| 441 | 457 | |
| 442 | 458 | merge.h: makeheaders |
| 443 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 459 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 444 | 460 | touch headers |
| 445 | 461 | |
| 446 | 462 | merge3_.c: $(SRCDIR)/merge3.c $(SRCDIR)/VERSION translate |
| 447 | 463 | ./translate $(SRCDIR)/merge3.c | sed -f $(SRCDIR)/VERSION >merge3_.c |
| 448 | 464 | |
| 449 | 465 | merge3.o: merge3_.c merge3.h $(SRCDIR)/config.h |
| 450 | 466 | $(XTCC) -o merge3.o -c merge3_.c |
| 451 | 467 | |
| 452 | 468 | merge3.h: makeheaders |
| 453 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 469 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 454 | 470 | touch headers |
| 455 | 471 | |
| 456 | 472 | name_.c: $(SRCDIR)/name.c $(SRCDIR)/VERSION translate |
| 457 | 473 | ./translate $(SRCDIR)/name.c | sed -f $(SRCDIR)/VERSION >name_.c |
| 458 | 474 | |
| 459 | 475 | name.o: name_.c name.h $(SRCDIR)/config.h |
| 460 | 476 | $(XTCC) -o name.o -c name_.c |
| 461 | 477 | |
| 462 | 478 | name.h: makeheaders |
| 463 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 479 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 464 | 480 | touch headers |
| 465 | 481 | |
| 466 | 482 | pivot_.c: $(SRCDIR)/pivot.c $(SRCDIR)/VERSION translate |
| 467 | 483 | ./translate $(SRCDIR)/pivot.c | sed -f $(SRCDIR)/VERSION >pivot_.c |
| 468 | 484 | |
| 469 | 485 | pivot.o: pivot_.c pivot.h $(SRCDIR)/config.h |
| 470 | 486 | $(XTCC) -o pivot.o -c pivot_.c |
| 471 | 487 | |
| 472 | 488 | pivot.h: makeheaders |
| 473 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 489 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 490 | + touch headers | |
| 491 | + | |
| 492 | +pqueue_.c: $(SRCDIR)/pqueue.c $(SRCDIR)/VERSION translate | |
| 493 | + ./translate $(SRCDIR)/pqueue.c | sed -f $(SRCDIR)/VERSION >pqueue_.c | |
| 494 | + | |
| 495 | +pqueue.o: pqueue_.c pqueue.h $(SRCDIR)/config.h | |
| 496 | + $(XTCC) -o pqueue.o -c pqueue_.c | |
| 497 | + | |
| 498 | +pqueue.h: makeheaders | |
| 499 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 474 | 500 | touch headers |
| 475 | 501 | |
| 476 | 502 | printf_.c: $(SRCDIR)/printf.c $(SRCDIR)/VERSION translate |
| 477 | 503 | ./translate $(SRCDIR)/printf.c | sed -f $(SRCDIR)/VERSION >printf_.c |
| 478 | 504 | |
| 479 | 505 | printf.o: printf_.c printf.h $(SRCDIR)/config.h |
| 480 | 506 | $(XTCC) -o printf.o -c printf_.c |
| 481 | 507 | |
| 482 | 508 | printf.h: makeheaders |
| 483 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 509 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 484 | 510 | touch headers |
| 485 | 511 | |
| 486 | 512 | rebuild_.c: $(SRCDIR)/rebuild.c $(SRCDIR)/VERSION translate |
| 487 | 513 | ./translate $(SRCDIR)/rebuild.c | sed -f $(SRCDIR)/VERSION >rebuild_.c |
| 488 | 514 | |
| 489 | 515 | rebuild.o: rebuild_.c rebuild.h $(SRCDIR)/config.h |
| 490 | 516 | $(XTCC) -o rebuild.o -c rebuild_.c |
| 491 | 517 | |
| 492 | 518 | rebuild.h: makeheaders |
| 493 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 519 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 494 | 520 | touch headers |
| 495 | 521 | |
| 496 | 522 | schema_.c: $(SRCDIR)/schema.c $(SRCDIR)/VERSION translate |
| 497 | 523 | ./translate $(SRCDIR)/schema.c | sed -f $(SRCDIR)/VERSION >schema_.c |
| 498 | 524 | |
| 499 | 525 | schema.o: schema_.c schema.h $(SRCDIR)/config.h |
| 500 | 526 | $(XTCC) -o schema.o -c schema_.c |
| 501 | 527 | |
| 502 | 528 | schema.h: makeheaders |
| 503 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 529 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 504 | 530 | touch headers |
| 505 | 531 | |
| 506 | 532 | setup_.c: $(SRCDIR)/setup.c $(SRCDIR)/VERSION translate |
| 507 | 533 | ./translate $(SRCDIR)/setup.c | sed -f $(SRCDIR)/VERSION >setup_.c |
| 508 | 534 | |
| 509 | 535 | setup.o: setup_.c setup.h $(SRCDIR)/config.h |
| 510 | 536 | $(XTCC) -o setup.o -c setup_.c |
| 511 | 537 | |
| 512 | 538 | setup.h: makeheaders |
| 513 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 539 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 514 | 540 | touch headers |
| 515 | 541 | |
| 516 | 542 | sha1_.c: $(SRCDIR)/sha1.c $(SRCDIR)/VERSION translate |
| 517 | 543 | ./translate $(SRCDIR)/sha1.c | sed -f $(SRCDIR)/VERSION >sha1_.c |
| 518 | 544 | |
| 519 | 545 | sha1.o: sha1_.c sha1.h $(SRCDIR)/config.h |
| 520 | 546 | $(XTCC) -o sha1.o -c sha1_.c |
| 521 | 547 | |
| 522 | 548 | sha1.h: makeheaders |
| 523 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 549 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 524 | 550 | touch headers |
| 525 | 551 | |
| 526 | 552 | style_.c: $(SRCDIR)/style.c $(SRCDIR)/VERSION translate |
| 527 | 553 | ./translate $(SRCDIR)/style.c | sed -f $(SRCDIR)/VERSION >style_.c |
| 528 | 554 | |
| 529 | 555 | style.o: style_.c style.h $(SRCDIR)/config.h |
| 530 | 556 | $(XTCC) -o style.o -c style_.c |
| 531 | 557 | |
| 532 | 558 | style.h: makeheaders |
| 533 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 559 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 534 | 560 | touch headers |
| 535 | 561 | |
| 536 | 562 | sync_.c: $(SRCDIR)/sync.c $(SRCDIR)/VERSION translate |
| 537 | 563 | ./translate $(SRCDIR)/sync.c | sed -f $(SRCDIR)/VERSION >sync_.c |
| 538 | 564 | |
| 539 | 565 | sync.o: sync_.c sync.h $(SRCDIR)/config.h |
| 540 | 566 | $(XTCC) -o sync.o -c sync_.c |
| 541 | 567 | |
| 542 | 568 | sync.h: makeheaders |
| 543 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 569 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 544 | 570 | touch headers |
| 545 | 571 | |
| 546 | 572 | timeline_.c: $(SRCDIR)/timeline.c $(SRCDIR)/VERSION translate |
| 547 | 573 | ./translate $(SRCDIR)/timeline.c | sed -f $(SRCDIR)/VERSION >timeline_.c |
| 548 | 574 | |
| 549 | 575 | timeline.o: timeline_.c timeline.h $(SRCDIR)/config.h |
| 550 | 576 | $(XTCC) -o timeline.o -c timeline_.c |
| 551 | 577 | |
| 552 | 578 | timeline.h: makeheaders |
| 553 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 579 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 554 | 580 | touch headers |
| 555 | 581 | |
| 556 | 582 | update_.c: $(SRCDIR)/update.c $(SRCDIR)/VERSION translate |
| 557 | 583 | ./translate $(SRCDIR)/update.c | sed -f $(SRCDIR)/VERSION >update_.c |
| 558 | 584 | |
| 559 | 585 | update.o: update_.c update.h $(SRCDIR)/config.h |
| 560 | 586 | $(XTCC) -o update.o -c update_.c |
| 561 | 587 | |
| 562 | 588 | update.h: makeheaders |
| 563 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 589 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 564 | 590 | touch headers |
| 565 | 591 | |
| 566 | 592 | url_.c: $(SRCDIR)/url.c $(SRCDIR)/VERSION translate |
| 567 | 593 | ./translate $(SRCDIR)/url.c | sed -f $(SRCDIR)/VERSION >url_.c |
| 568 | 594 | |
| 569 | 595 | url.o: url_.c url.h $(SRCDIR)/config.h |
| 570 | 596 | $(XTCC) -o url.o -c url_.c |
| 571 | 597 | |
| 572 | 598 | url.h: makeheaders |
| 573 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 599 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 574 | 600 | touch headers |
| 575 | 601 | |
| 576 | 602 | user_.c: $(SRCDIR)/user.c $(SRCDIR)/VERSION translate |
| 577 | 603 | ./translate $(SRCDIR)/user.c | sed -f $(SRCDIR)/VERSION >user_.c |
| 578 | 604 | |
| 579 | 605 | user.o: user_.c user.h $(SRCDIR)/config.h |
| 580 | 606 | $(XTCC) -o user.o -c user_.c |
| 581 | 607 | |
| 582 | 608 | user.h: makeheaders |
| 583 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 609 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 584 | 610 | touch headers |
| 585 | 611 | |
| 586 | 612 | verify_.c: $(SRCDIR)/verify.c $(SRCDIR)/VERSION translate |
| 587 | 613 | ./translate $(SRCDIR)/verify.c | sed -f $(SRCDIR)/VERSION >verify_.c |
| 588 | 614 | |
| 589 | 615 | verify.o: verify_.c verify.h $(SRCDIR)/config.h |
| 590 | 616 | $(XTCC) -o verify.o -c verify_.c |
| 591 | 617 | |
| 592 | 618 | verify.h: makeheaders |
| 593 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 619 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 594 | 620 | touch headers |
| 595 | 621 | |
| 596 | 622 | vfile_.c: $(SRCDIR)/vfile.c $(SRCDIR)/VERSION translate |
| 597 | 623 | ./translate $(SRCDIR)/vfile.c | sed -f $(SRCDIR)/VERSION >vfile_.c |
| 598 | 624 | |
| 599 | 625 | vfile.o: vfile_.c vfile.h $(SRCDIR)/config.h |
| 600 | 626 | $(XTCC) -o vfile.o -c vfile_.c |
| 601 | 627 | |
| 602 | 628 | vfile.h: makeheaders |
| 603 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 629 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 604 | 630 | touch headers |
| 605 | 631 | |
| 606 | 632 | wiki_.c: $(SRCDIR)/wiki.c $(SRCDIR)/VERSION translate |
| 607 | 633 | ./translate $(SRCDIR)/wiki.c | sed -f $(SRCDIR)/VERSION >wiki_.c |
| 608 | 634 | |
| 609 | 635 | wiki.o: wiki_.c wiki.h $(SRCDIR)/config.h |
| 610 | 636 | $(XTCC) -o wiki.o -c wiki_.c |
| 611 | 637 | |
| 612 | 638 | wiki.h: makeheaders |
| 613 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 639 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 614 | 640 | touch headers |
| 615 | 641 | |
| 616 | 642 | wikiformat_.c: $(SRCDIR)/wikiformat.c $(SRCDIR)/VERSION translate |
| 617 | 643 | ./translate $(SRCDIR)/wikiformat.c | sed -f $(SRCDIR)/VERSION >wikiformat_.c |
| 618 | 644 | |
| 619 | 645 | wikiformat.o: wikiformat_.c wikiformat.h $(SRCDIR)/config.h |
| 620 | 646 | $(XTCC) -o wikiformat.o -c wikiformat_.c |
| 621 | 647 | |
| 622 | 648 | wikiformat.h: makeheaders |
| 623 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 649 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 624 | 650 | touch headers |
| 625 | 651 | |
| 626 | 652 | xfer_.c: $(SRCDIR)/xfer.c $(SRCDIR)/VERSION translate |
| 627 | 653 | ./translate $(SRCDIR)/xfer.c | sed -f $(SRCDIR)/VERSION >xfer_.c |
| 628 | 654 | |
| 629 | 655 | xfer.o: xfer_.c xfer.h $(SRCDIR)/config.h |
| 630 | 656 | $(XTCC) -o xfer.o -c xfer_.c |
| 631 | 657 | |
| 632 | 658 | xfer.h: makeheaders |
| 633 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 659 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 634 | 660 | touch headers |
| 635 | 661 | |
| 636 | 662 | zip_.c: $(SRCDIR)/zip.c $(SRCDIR)/VERSION translate |
| 637 | 663 | ./translate $(SRCDIR)/zip.c | sed -f $(SRCDIR)/VERSION >zip_.c |
| 638 | 664 | |
| 639 | 665 | zip.o: zip_.c zip.h $(SRCDIR)/config.h |
| 640 | 666 | $(XTCC) -o zip.o -c zip_.c |
| 641 | 667 | |
| 642 | 668 | zip.h: makeheaders |
| 643 | - ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 669 | + ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h | |
| 644 | 670 | touch headers |
| 645 | 671 | |
| 646 | 672 | sqlite3.o: $(SRCDIR)/sqlite3.c |
| 647 | 673 | $(XTCC) -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_PRIVATE= -DTHREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -c $(SRCDIR)/sqlite3.c -o sqlite3.o |
| 648 | 674 | |
| 649 | 675 |
| --- src/main.mk | |
| +++ src/main.mk | |
| @@ -12,10 +12,11 @@ | |
| 12 | XTCC = $(TCC) $(CFLAGS) -I. -I$(SRCDIR) |
| 13 | |
| 14 | |
| 15 | SRC = \ |
| 16 | $(SRCDIR)/add.c \ |
| 17 | $(SRCDIR)/blob.c \ |
| 18 | $(SRCDIR)/cgi.c \ |
| 19 | $(SRCDIR)/checkin.c \ |
| 20 | $(SRCDIR)/checkout.c \ |
| 21 | $(SRCDIR)/clearsign.c \ |
| @@ -39,10 +40,11 @@ | |
| 39 | $(SRCDIR)/md5.c \ |
| 40 | $(SRCDIR)/merge.c \ |
| 41 | $(SRCDIR)/merge3.c \ |
| 42 | $(SRCDIR)/name.c \ |
| 43 | $(SRCDIR)/pivot.c \ |
| 44 | $(SRCDIR)/printf.c \ |
| 45 | $(SRCDIR)/rebuild.c \ |
| 46 | $(SRCDIR)/schema.c \ |
| 47 | $(SRCDIR)/setup.c \ |
| 48 | $(SRCDIR)/sha1.c \ |
| @@ -59,10 +61,11 @@ | |
| 59 | $(SRCDIR)/xfer.c \ |
| 60 | $(SRCDIR)/zip.c |
| 61 | |
| 62 | TRANS_SRC = \ |
| 63 | add_.c \ |
| 64 | blob_.c \ |
| 65 | cgi_.c \ |
| 66 | checkin_.c \ |
| 67 | checkout_.c \ |
| 68 | clearsign_.c \ |
| @@ -86,10 +89,11 @@ | |
| 86 | md5_.c \ |
| 87 | merge_.c \ |
| 88 | merge3_.c \ |
| 89 | name_.c \ |
| 90 | pivot_.c \ |
| 91 | printf_.c \ |
| 92 | rebuild_.c \ |
| 93 | schema_.c \ |
| 94 | setup_.c \ |
| 95 | sha1_.c \ |
| @@ -106,10 +110,11 @@ | |
| 106 | xfer_.c \ |
| 107 | zip_.c |
| 108 | |
| 109 | OBJ = \ |
| 110 | add.o \ |
| 111 | blob.o \ |
| 112 | cgi.o \ |
| 113 | checkin.o \ |
| 114 | checkout.o \ |
| 115 | clearsign.o \ |
| @@ -133,10 +138,11 @@ | |
| 133 | md5.o \ |
| 134 | merge.o \ |
| 135 | merge3.o \ |
| 136 | name.o \ |
| 137 | pivot.o \ |
| 138 | printf.o \ |
| 139 | rebuild.o \ |
| 140 | schema.o \ |
| 141 | setup.o \ |
| 142 | sha1.o \ |
| @@ -184,14 +190,14 @@ | |
| 184 | $(TCC) -o $(APPNAME) $(OBJ) sqlite3.o $(LIB) |
| 185 | |
| 186 | clean: |
| 187 | rm -f *.o *_.c $(APPNAME) VERSION.h |
| 188 | rm -f translate makeheaders mkindex page_index.h headers |
| 189 | rm -f add.h blob.h cgi.h checkin.h checkout.h clearsign.h clone.h comformat.h construct.h content.h db.h delta.h deltacmd.h descendents.h diff.h diffcmd.h encode.h file.h http.h info.h login.h main.h manifest.h md5.h merge.h merge3.h name.h pivot.h printf.h rebuild.h schema.h setup.h sha1.h style.h sync.h timeline.h update.h url.h user.h verify.h vfile.h wiki.h wikiformat.h xfer.h zip.h |
| 190 | |
| 191 | headers: makeheaders mkindex $(TRANS_SRC) ./VERSION.h |
| 192 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 193 | ./mkindex $(TRANS_SRC) >page_index.h |
| 194 | touch headers |
| 195 | |
| 196 | add_.c: $(SRCDIR)/add.c $(SRCDIR)/VERSION translate |
| 197 | ./translate $(SRCDIR)/add.c | sed -f $(SRCDIR)/VERSION >add_.c |
| @@ -198,451 +204,471 @@ | |
| 198 | |
| 199 | add.o: add_.c add.h $(SRCDIR)/config.h |
| 200 | $(XTCC) -o add.o -c add_.c |
| 201 | |
| 202 | add.h: makeheaders |
| 203 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 204 | touch headers |
| 205 | |
| 206 | blob_.c: $(SRCDIR)/blob.c $(SRCDIR)/VERSION translate |
| 207 | ./translate $(SRCDIR)/blob.c | sed -f $(SRCDIR)/VERSION >blob_.c |
| 208 | |
| 209 | blob.o: blob_.c blob.h $(SRCDIR)/config.h |
| 210 | $(XTCC) -o blob.o -c blob_.c |
| 211 | |
| 212 | blob.h: makeheaders |
| 213 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 214 | touch headers |
| 215 | |
| 216 | cgi_.c: $(SRCDIR)/cgi.c $(SRCDIR)/VERSION translate |
| 217 | ./translate $(SRCDIR)/cgi.c | sed -f $(SRCDIR)/VERSION >cgi_.c |
| 218 | |
| 219 | cgi.o: cgi_.c cgi.h $(SRCDIR)/config.h |
| 220 | $(XTCC) -o cgi.o -c cgi_.c |
| 221 | |
| 222 | cgi.h: makeheaders |
| 223 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 224 | touch headers |
| 225 | |
| 226 | checkin_.c: $(SRCDIR)/checkin.c $(SRCDIR)/VERSION translate |
| 227 | ./translate $(SRCDIR)/checkin.c | sed -f $(SRCDIR)/VERSION >checkin_.c |
| 228 | |
| 229 | checkin.o: checkin_.c checkin.h $(SRCDIR)/config.h |
| 230 | $(XTCC) -o checkin.o -c checkin_.c |
| 231 | |
| 232 | checkin.h: makeheaders |
| 233 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 234 | touch headers |
| 235 | |
| 236 | checkout_.c: $(SRCDIR)/checkout.c $(SRCDIR)/VERSION translate |
| 237 | ./translate $(SRCDIR)/checkout.c | sed -f $(SRCDIR)/VERSION >checkout_.c |
| 238 | |
| 239 | checkout.o: checkout_.c checkout.h $(SRCDIR)/config.h |
| 240 | $(XTCC) -o checkout.o -c checkout_.c |
| 241 | |
| 242 | checkout.h: makeheaders |
| 243 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 244 | touch headers |
| 245 | |
| 246 | clearsign_.c: $(SRCDIR)/clearsign.c $(SRCDIR)/VERSION translate |
| 247 | ./translate $(SRCDIR)/clearsign.c | sed -f $(SRCDIR)/VERSION >clearsign_.c |
| 248 | |
| 249 | clearsign.o: clearsign_.c clearsign.h $(SRCDIR)/config.h |
| 250 | $(XTCC) -o clearsign.o -c clearsign_.c |
| 251 | |
| 252 | clearsign.h: makeheaders |
| 253 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 254 | touch headers |
| 255 | |
| 256 | clone_.c: $(SRCDIR)/clone.c $(SRCDIR)/VERSION translate |
| 257 | ./translate $(SRCDIR)/clone.c | sed -f $(SRCDIR)/VERSION >clone_.c |
| 258 | |
| 259 | clone.o: clone_.c clone.h $(SRCDIR)/config.h |
| 260 | $(XTCC) -o clone.o -c clone_.c |
| 261 | |
| 262 | clone.h: makeheaders |
| 263 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 264 | touch headers |
| 265 | |
| 266 | comformat_.c: $(SRCDIR)/comformat.c $(SRCDIR)/VERSION translate |
| 267 | ./translate $(SRCDIR)/comformat.c | sed -f $(SRCDIR)/VERSION >comformat_.c |
| 268 | |
| 269 | comformat.o: comformat_.c comformat.h $(SRCDIR)/config.h |
| 270 | $(XTCC) -o comformat.o -c comformat_.c |
| 271 | |
| 272 | comformat.h: makeheaders |
| 273 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 274 | touch headers |
| 275 | |
| 276 | construct_.c: $(SRCDIR)/construct.c $(SRCDIR)/VERSION translate |
| 277 | ./translate $(SRCDIR)/construct.c | sed -f $(SRCDIR)/VERSION >construct_.c |
| 278 | |
| 279 | construct.o: construct_.c construct.h $(SRCDIR)/config.h |
| 280 | $(XTCC) -o construct.o -c construct_.c |
| 281 | |
| 282 | construct.h: makeheaders |
| 283 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 284 | touch headers |
| 285 | |
| 286 | content_.c: $(SRCDIR)/content.c $(SRCDIR)/VERSION translate |
| 287 | ./translate $(SRCDIR)/content.c | sed -f $(SRCDIR)/VERSION >content_.c |
| 288 | |
| 289 | content.o: content_.c content.h $(SRCDIR)/config.h |
| 290 | $(XTCC) -o content.o -c content_.c |
| 291 | |
| 292 | content.h: makeheaders |
| 293 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 294 | touch headers |
| 295 | |
| 296 | db_.c: $(SRCDIR)/db.c $(SRCDIR)/VERSION translate |
| 297 | ./translate $(SRCDIR)/db.c | sed -f $(SRCDIR)/VERSION >db_.c |
| 298 | |
| 299 | db.o: db_.c db.h $(SRCDIR)/config.h |
| 300 | $(XTCC) -o db.o -c db_.c |
| 301 | |
| 302 | db.h: makeheaders |
| 303 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 304 | touch headers |
| 305 | |
| 306 | delta_.c: $(SRCDIR)/delta.c $(SRCDIR)/VERSION translate |
| 307 | ./translate $(SRCDIR)/delta.c | sed -f $(SRCDIR)/VERSION >delta_.c |
| 308 | |
| 309 | delta.o: delta_.c delta.h $(SRCDIR)/config.h |
| 310 | $(XTCC) -o delta.o -c delta_.c |
| 311 | |
| 312 | delta.h: makeheaders |
| 313 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 314 | touch headers |
| 315 | |
| 316 | deltacmd_.c: $(SRCDIR)/deltacmd.c $(SRCDIR)/VERSION translate |
| 317 | ./translate $(SRCDIR)/deltacmd.c | sed -f $(SRCDIR)/VERSION >deltacmd_.c |
| 318 | |
| 319 | deltacmd.o: deltacmd_.c deltacmd.h $(SRCDIR)/config.h |
| 320 | $(XTCC) -o deltacmd.o -c deltacmd_.c |
| 321 | |
| 322 | deltacmd.h: makeheaders |
| 323 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 324 | touch headers |
| 325 | |
| 326 | descendents_.c: $(SRCDIR)/descendents.c $(SRCDIR)/VERSION translate |
| 327 | ./translate $(SRCDIR)/descendents.c | sed -f $(SRCDIR)/VERSION >descendents_.c |
| 328 | |
| 329 | descendents.o: descendents_.c descendents.h $(SRCDIR)/config.h |
| 330 | $(XTCC) -o descendents.o -c descendents_.c |
| 331 | |
| 332 | descendents.h: makeheaders |
| 333 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 334 | touch headers |
| 335 | |
| 336 | diff_.c: $(SRCDIR)/diff.c $(SRCDIR)/VERSION translate |
| 337 | ./translate $(SRCDIR)/diff.c | sed -f $(SRCDIR)/VERSION >diff_.c |
| 338 | |
| 339 | diff.o: diff_.c diff.h $(SRCDIR)/config.h |
| 340 | $(XTCC) -o diff.o -c diff_.c |
| 341 | |
| 342 | diff.h: makeheaders |
| 343 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 344 | touch headers |
| 345 | |
| 346 | diffcmd_.c: $(SRCDIR)/diffcmd.c $(SRCDIR)/VERSION translate |
| 347 | ./translate $(SRCDIR)/diffcmd.c | sed -f $(SRCDIR)/VERSION >diffcmd_.c |
| 348 | |
| 349 | diffcmd.o: diffcmd_.c diffcmd.h $(SRCDIR)/config.h |
| 350 | $(XTCC) -o diffcmd.o -c diffcmd_.c |
| 351 | |
| 352 | diffcmd.h: makeheaders |
| 353 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 354 | touch headers |
| 355 | |
| 356 | encode_.c: $(SRCDIR)/encode.c $(SRCDIR)/VERSION translate |
| 357 | ./translate $(SRCDIR)/encode.c | sed -f $(SRCDIR)/VERSION >encode_.c |
| 358 | |
| 359 | encode.o: encode_.c encode.h $(SRCDIR)/config.h |
| 360 | $(XTCC) -o encode.o -c encode_.c |
| 361 | |
| 362 | encode.h: makeheaders |
| 363 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 364 | touch headers |
| 365 | |
| 366 | file_.c: $(SRCDIR)/file.c $(SRCDIR)/VERSION translate |
| 367 | ./translate $(SRCDIR)/file.c | sed -f $(SRCDIR)/VERSION >file_.c |
| 368 | |
| 369 | file.o: file_.c file.h $(SRCDIR)/config.h |
| 370 | $(XTCC) -o file.o -c file_.c |
| 371 | |
| 372 | file.h: makeheaders |
| 373 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 374 | touch headers |
| 375 | |
| 376 | http_.c: $(SRCDIR)/http.c $(SRCDIR)/VERSION translate |
| 377 | ./translate $(SRCDIR)/http.c | sed -f $(SRCDIR)/VERSION >http_.c |
| 378 | |
| 379 | http.o: http_.c http.h $(SRCDIR)/config.h |
| 380 | $(XTCC) -o http.o -c http_.c |
| 381 | |
| 382 | http.h: makeheaders |
| 383 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 384 | touch headers |
| 385 | |
| 386 | info_.c: $(SRCDIR)/info.c $(SRCDIR)/VERSION translate |
| 387 | ./translate $(SRCDIR)/info.c | sed -f $(SRCDIR)/VERSION >info_.c |
| 388 | |
| 389 | info.o: info_.c info.h $(SRCDIR)/config.h |
| 390 | $(XTCC) -o info.o -c info_.c |
| 391 | |
| 392 | info.h: makeheaders |
| 393 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 394 | touch headers |
| 395 | |
| 396 | login_.c: $(SRCDIR)/login.c $(SRCDIR)/VERSION translate |
| 397 | ./translate $(SRCDIR)/login.c | sed -f $(SRCDIR)/VERSION >login_.c |
| 398 | |
| 399 | login.o: login_.c login.h $(SRCDIR)/config.h |
| 400 | $(XTCC) -o login.o -c login_.c |
| 401 | |
| 402 | login.h: makeheaders |
| 403 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 404 | touch headers |
| 405 | |
| 406 | main_.c: $(SRCDIR)/main.c $(SRCDIR)/VERSION translate |
| 407 | ./translate $(SRCDIR)/main.c | sed -f $(SRCDIR)/VERSION >main_.c |
| 408 | |
| 409 | main.o: main_.c main.h page_index.h $(SRCDIR)/config.h |
| 410 | $(XTCC) -o main.o -c main_.c |
| 411 | |
| 412 | main.h: makeheaders |
| 413 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 414 | touch headers |
| 415 | |
| 416 | manifest_.c: $(SRCDIR)/manifest.c $(SRCDIR)/VERSION translate |
| 417 | ./translate $(SRCDIR)/manifest.c | sed -f $(SRCDIR)/VERSION >manifest_.c |
| 418 | |
| 419 | manifest.o: manifest_.c manifest.h $(SRCDIR)/config.h |
| 420 | $(XTCC) -o manifest.o -c manifest_.c |
| 421 | |
| 422 | manifest.h: makeheaders |
| 423 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 424 | touch headers |
| 425 | |
| 426 | md5_.c: $(SRCDIR)/md5.c $(SRCDIR)/VERSION translate |
| 427 | ./translate $(SRCDIR)/md5.c | sed -f $(SRCDIR)/VERSION >md5_.c |
| 428 | |
| 429 | md5.o: md5_.c md5.h $(SRCDIR)/config.h |
| 430 | $(XTCC) -o md5.o -c md5_.c |
| 431 | |
| 432 | md5.h: makeheaders |
| 433 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 434 | touch headers |
| 435 | |
| 436 | merge_.c: $(SRCDIR)/merge.c $(SRCDIR)/VERSION translate |
| 437 | ./translate $(SRCDIR)/merge.c | sed -f $(SRCDIR)/VERSION >merge_.c |
| 438 | |
| 439 | merge.o: merge_.c merge.h $(SRCDIR)/config.h |
| 440 | $(XTCC) -o merge.o -c merge_.c |
| 441 | |
| 442 | merge.h: makeheaders |
| 443 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 444 | touch headers |
| 445 | |
| 446 | merge3_.c: $(SRCDIR)/merge3.c $(SRCDIR)/VERSION translate |
| 447 | ./translate $(SRCDIR)/merge3.c | sed -f $(SRCDIR)/VERSION >merge3_.c |
| 448 | |
| 449 | merge3.o: merge3_.c merge3.h $(SRCDIR)/config.h |
| 450 | $(XTCC) -o merge3.o -c merge3_.c |
| 451 | |
| 452 | merge3.h: makeheaders |
| 453 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 454 | touch headers |
| 455 | |
| 456 | name_.c: $(SRCDIR)/name.c $(SRCDIR)/VERSION translate |
| 457 | ./translate $(SRCDIR)/name.c | sed -f $(SRCDIR)/VERSION >name_.c |
| 458 | |
| 459 | name.o: name_.c name.h $(SRCDIR)/config.h |
| 460 | $(XTCC) -o name.o -c name_.c |
| 461 | |
| 462 | name.h: makeheaders |
| 463 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 464 | touch headers |
| 465 | |
| 466 | pivot_.c: $(SRCDIR)/pivot.c $(SRCDIR)/VERSION translate |
| 467 | ./translate $(SRCDIR)/pivot.c | sed -f $(SRCDIR)/VERSION >pivot_.c |
| 468 | |
| 469 | pivot.o: pivot_.c pivot.h $(SRCDIR)/config.h |
| 470 | $(XTCC) -o pivot.o -c pivot_.c |
| 471 | |
| 472 | pivot.h: makeheaders |
| 473 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 474 | touch headers |
| 475 | |
| 476 | printf_.c: $(SRCDIR)/printf.c $(SRCDIR)/VERSION translate |
| 477 | ./translate $(SRCDIR)/printf.c | sed -f $(SRCDIR)/VERSION >printf_.c |
| 478 | |
| 479 | printf.o: printf_.c printf.h $(SRCDIR)/config.h |
| 480 | $(XTCC) -o printf.o -c printf_.c |
| 481 | |
| 482 | printf.h: makeheaders |
| 483 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 484 | touch headers |
| 485 | |
| 486 | rebuild_.c: $(SRCDIR)/rebuild.c $(SRCDIR)/VERSION translate |
| 487 | ./translate $(SRCDIR)/rebuild.c | sed -f $(SRCDIR)/VERSION >rebuild_.c |
| 488 | |
| 489 | rebuild.o: rebuild_.c rebuild.h $(SRCDIR)/config.h |
| 490 | $(XTCC) -o rebuild.o -c rebuild_.c |
| 491 | |
| 492 | rebuild.h: makeheaders |
| 493 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 494 | touch headers |
| 495 | |
| 496 | schema_.c: $(SRCDIR)/schema.c $(SRCDIR)/VERSION translate |
| 497 | ./translate $(SRCDIR)/schema.c | sed -f $(SRCDIR)/VERSION >schema_.c |
| 498 | |
| 499 | schema.o: schema_.c schema.h $(SRCDIR)/config.h |
| 500 | $(XTCC) -o schema.o -c schema_.c |
| 501 | |
| 502 | schema.h: makeheaders |
| 503 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 504 | touch headers |
| 505 | |
| 506 | setup_.c: $(SRCDIR)/setup.c $(SRCDIR)/VERSION translate |
| 507 | ./translate $(SRCDIR)/setup.c | sed -f $(SRCDIR)/VERSION >setup_.c |
| 508 | |
| 509 | setup.o: setup_.c setup.h $(SRCDIR)/config.h |
| 510 | $(XTCC) -o setup.o -c setup_.c |
| 511 | |
| 512 | setup.h: makeheaders |
| 513 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 514 | touch headers |
| 515 | |
| 516 | sha1_.c: $(SRCDIR)/sha1.c $(SRCDIR)/VERSION translate |
| 517 | ./translate $(SRCDIR)/sha1.c | sed -f $(SRCDIR)/VERSION >sha1_.c |
| 518 | |
| 519 | sha1.o: sha1_.c sha1.h $(SRCDIR)/config.h |
| 520 | $(XTCC) -o sha1.o -c sha1_.c |
| 521 | |
| 522 | sha1.h: makeheaders |
| 523 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 524 | touch headers |
| 525 | |
| 526 | style_.c: $(SRCDIR)/style.c $(SRCDIR)/VERSION translate |
| 527 | ./translate $(SRCDIR)/style.c | sed -f $(SRCDIR)/VERSION >style_.c |
| 528 | |
| 529 | style.o: style_.c style.h $(SRCDIR)/config.h |
| 530 | $(XTCC) -o style.o -c style_.c |
| 531 | |
| 532 | style.h: makeheaders |
| 533 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 534 | touch headers |
| 535 | |
| 536 | sync_.c: $(SRCDIR)/sync.c $(SRCDIR)/VERSION translate |
| 537 | ./translate $(SRCDIR)/sync.c | sed -f $(SRCDIR)/VERSION >sync_.c |
| 538 | |
| 539 | sync.o: sync_.c sync.h $(SRCDIR)/config.h |
| 540 | $(XTCC) -o sync.o -c sync_.c |
| 541 | |
| 542 | sync.h: makeheaders |
| 543 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 544 | touch headers |
| 545 | |
| 546 | timeline_.c: $(SRCDIR)/timeline.c $(SRCDIR)/VERSION translate |
| 547 | ./translate $(SRCDIR)/timeline.c | sed -f $(SRCDIR)/VERSION >timeline_.c |
| 548 | |
| 549 | timeline.o: timeline_.c timeline.h $(SRCDIR)/config.h |
| 550 | $(XTCC) -o timeline.o -c timeline_.c |
| 551 | |
| 552 | timeline.h: makeheaders |
| 553 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 554 | touch headers |
| 555 | |
| 556 | update_.c: $(SRCDIR)/update.c $(SRCDIR)/VERSION translate |
| 557 | ./translate $(SRCDIR)/update.c | sed -f $(SRCDIR)/VERSION >update_.c |
| 558 | |
| 559 | update.o: update_.c update.h $(SRCDIR)/config.h |
| 560 | $(XTCC) -o update.o -c update_.c |
| 561 | |
| 562 | update.h: makeheaders |
| 563 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 564 | touch headers |
| 565 | |
| 566 | url_.c: $(SRCDIR)/url.c $(SRCDIR)/VERSION translate |
| 567 | ./translate $(SRCDIR)/url.c | sed -f $(SRCDIR)/VERSION >url_.c |
| 568 | |
| 569 | url.o: url_.c url.h $(SRCDIR)/config.h |
| 570 | $(XTCC) -o url.o -c url_.c |
| 571 | |
| 572 | url.h: makeheaders |
| 573 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 574 | touch headers |
| 575 | |
| 576 | user_.c: $(SRCDIR)/user.c $(SRCDIR)/VERSION translate |
| 577 | ./translate $(SRCDIR)/user.c | sed -f $(SRCDIR)/VERSION >user_.c |
| 578 | |
| 579 | user.o: user_.c user.h $(SRCDIR)/config.h |
| 580 | $(XTCC) -o user.o -c user_.c |
| 581 | |
| 582 | user.h: makeheaders |
| 583 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 584 | touch headers |
| 585 | |
| 586 | verify_.c: $(SRCDIR)/verify.c $(SRCDIR)/VERSION translate |
| 587 | ./translate $(SRCDIR)/verify.c | sed -f $(SRCDIR)/VERSION >verify_.c |
| 588 | |
| 589 | verify.o: verify_.c verify.h $(SRCDIR)/config.h |
| 590 | $(XTCC) -o verify.o -c verify_.c |
| 591 | |
| 592 | verify.h: makeheaders |
| 593 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 594 | touch headers |
| 595 | |
| 596 | vfile_.c: $(SRCDIR)/vfile.c $(SRCDIR)/VERSION translate |
| 597 | ./translate $(SRCDIR)/vfile.c | sed -f $(SRCDIR)/VERSION >vfile_.c |
| 598 | |
| 599 | vfile.o: vfile_.c vfile.h $(SRCDIR)/config.h |
| 600 | $(XTCC) -o vfile.o -c vfile_.c |
| 601 | |
| 602 | vfile.h: makeheaders |
| 603 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 604 | touch headers |
| 605 | |
| 606 | wiki_.c: $(SRCDIR)/wiki.c $(SRCDIR)/VERSION translate |
| 607 | ./translate $(SRCDIR)/wiki.c | sed -f $(SRCDIR)/VERSION >wiki_.c |
| 608 | |
| 609 | wiki.o: wiki_.c wiki.h $(SRCDIR)/config.h |
| 610 | $(XTCC) -o wiki.o -c wiki_.c |
| 611 | |
| 612 | wiki.h: makeheaders |
| 613 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 614 | touch headers |
| 615 | |
| 616 | wikiformat_.c: $(SRCDIR)/wikiformat.c $(SRCDIR)/VERSION translate |
| 617 | ./translate $(SRCDIR)/wikiformat.c | sed -f $(SRCDIR)/VERSION >wikiformat_.c |
| 618 | |
| 619 | wikiformat.o: wikiformat_.c wikiformat.h $(SRCDIR)/config.h |
| 620 | $(XTCC) -o wikiformat.o -c wikiformat_.c |
| 621 | |
| 622 | wikiformat.h: makeheaders |
| 623 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 624 | touch headers |
| 625 | |
| 626 | xfer_.c: $(SRCDIR)/xfer.c $(SRCDIR)/VERSION translate |
| 627 | ./translate $(SRCDIR)/xfer.c | sed -f $(SRCDIR)/VERSION >xfer_.c |
| 628 | |
| 629 | xfer.o: xfer_.c xfer.h $(SRCDIR)/config.h |
| 630 | $(XTCC) -o xfer.o -c xfer_.c |
| 631 | |
| 632 | xfer.h: makeheaders |
| 633 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 634 | touch headers |
| 635 | |
| 636 | zip_.c: $(SRCDIR)/zip.c $(SRCDIR)/VERSION translate |
| 637 | ./translate $(SRCDIR)/zip.c | sed -f $(SRCDIR)/VERSION >zip_.c |
| 638 | |
| 639 | zip.o: zip_.c zip.h $(SRCDIR)/config.h |
| 640 | $(XTCC) -o zip.o -c zip_.c |
| 641 | |
| 642 | zip.h: makeheaders |
| 643 | ./makeheaders add_.c:add.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 644 | touch headers |
| 645 | |
| 646 | sqlite3.o: $(SRCDIR)/sqlite3.c |
| 647 | $(XTCC) -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_PRIVATE= -DTHREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -c $(SRCDIR)/sqlite3.c -o sqlite3.o |
| 648 | |
| 649 |
| --- src/main.mk | |
| +++ src/main.mk | |
| @@ -12,10 +12,11 @@ | |
| 12 | XTCC = $(TCC) $(CFLAGS) -I. -I$(SRCDIR) |
| 13 | |
| 14 | |
| 15 | SRC = \ |
| 16 | $(SRCDIR)/add.c \ |
| 17 | $(SRCDIR)/bag.c \ |
| 18 | $(SRCDIR)/blob.c \ |
| 19 | $(SRCDIR)/cgi.c \ |
| 20 | $(SRCDIR)/checkin.c \ |
| 21 | $(SRCDIR)/checkout.c \ |
| 22 | $(SRCDIR)/clearsign.c \ |
| @@ -39,10 +40,11 @@ | |
| 40 | $(SRCDIR)/md5.c \ |
| 41 | $(SRCDIR)/merge.c \ |
| 42 | $(SRCDIR)/merge3.c \ |
| 43 | $(SRCDIR)/name.c \ |
| 44 | $(SRCDIR)/pivot.c \ |
| 45 | $(SRCDIR)/pqueue.c \ |
| 46 | $(SRCDIR)/printf.c \ |
| 47 | $(SRCDIR)/rebuild.c \ |
| 48 | $(SRCDIR)/schema.c \ |
| 49 | $(SRCDIR)/setup.c \ |
| 50 | $(SRCDIR)/sha1.c \ |
| @@ -59,10 +61,11 @@ | |
| 61 | $(SRCDIR)/xfer.c \ |
| 62 | $(SRCDIR)/zip.c |
| 63 | |
| 64 | TRANS_SRC = \ |
| 65 | add_.c \ |
| 66 | bag_.c \ |
| 67 | blob_.c \ |
| 68 | cgi_.c \ |
| 69 | checkin_.c \ |
| 70 | checkout_.c \ |
| 71 | clearsign_.c \ |
| @@ -86,10 +89,11 @@ | |
| 89 | md5_.c \ |
| 90 | merge_.c \ |
| 91 | merge3_.c \ |
| 92 | name_.c \ |
| 93 | pivot_.c \ |
| 94 | pqueue_.c \ |
| 95 | printf_.c \ |
| 96 | rebuild_.c \ |
| 97 | schema_.c \ |
| 98 | setup_.c \ |
| 99 | sha1_.c \ |
| @@ -106,10 +110,11 @@ | |
| 110 | xfer_.c \ |
| 111 | zip_.c |
| 112 | |
| 113 | OBJ = \ |
| 114 | add.o \ |
| 115 | bag.o \ |
| 116 | blob.o \ |
| 117 | cgi.o \ |
| 118 | checkin.o \ |
| 119 | checkout.o \ |
| 120 | clearsign.o \ |
| @@ -133,10 +138,11 @@ | |
| 138 | md5.o \ |
| 139 | merge.o \ |
| 140 | merge3.o \ |
| 141 | name.o \ |
| 142 | pivot.o \ |
| 143 | pqueue.o \ |
| 144 | printf.o \ |
| 145 | rebuild.o \ |
| 146 | schema.o \ |
| 147 | setup.o \ |
| 148 | sha1.o \ |
| @@ -184,14 +190,14 @@ | |
| 190 | $(TCC) -o $(APPNAME) $(OBJ) sqlite3.o $(LIB) |
| 191 | |
| 192 | clean: |
| 193 | rm -f *.o *_.c $(APPNAME) VERSION.h |
| 194 | rm -f translate makeheaders mkindex page_index.h headers |
| 195 | rm -f add.h bag.h blob.h cgi.h checkin.h checkout.h clearsign.h clone.h comformat.h construct.h content.h db.h delta.h deltacmd.h descendents.h diff.h diffcmd.h encode.h file.h http.h info.h login.h main.h manifest.h md5.h merge.h merge3.h name.h pivot.h pqueue.h printf.h rebuild.h schema.h setup.h sha1.h style.h sync.h timeline.h update.h url.h user.h verify.h vfile.h wiki.h wikiformat.h xfer.h zip.h |
| 196 | |
| 197 | headers: makeheaders mkindex $(TRANS_SRC) ./VERSION.h |
| 198 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 199 | ./mkindex $(TRANS_SRC) >page_index.h |
| 200 | touch headers |
| 201 | |
| 202 | add_.c: $(SRCDIR)/add.c $(SRCDIR)/VERSION translate |
| 203 | ./translate $(SRCDIR)/add.c | sed -f $(SRCDIR)/VERSION >add_.c |
| @@ -198,451 +204,471 @@ | |
| 204 | |
| 205 | add.o: add_.c add.h $(SRCDIR)/config.h |
| 206 | $(XTCC) -o add.o -c add_.c |
| 207 | |
| 208 | add.h: makeheaders |
| 209 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 210 | touch headers |
| 211 | |
| 212 | bag_.c: $(SRCDIR)/bag.c $(SRCDIR)/VERSION translate |
| 213 | ./translate $(SRCDIR)/bag.c | sed -f $(SRCDIR)/VERSION >bag_.c |
| 214 | |
| 215 | bag.o: bag_.c bag.h $(SRCDIR)/config.h |
| 216 | $(XTCC) -o bag.o -c bag_.c |
| 217 | |
| 218 | bag.h: makeheaders |
| 219 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 220 | touch headers |
| 221 | |
| 222 | blob_.c: $(SRCDIR)/blob.c $(SRCDIR)/VERSION translate |
| 223 | ./translate $(SRCDIR)/blob.c | sed -f $(SRCDIR)/VERSION >blob_.c |
| 224 | |
| 225 | blob.o: blob_.c blob.h $(SRCDIR)/config.h |
| 226 | $(XTCC) -o blob.o -c blob_.c |
| 227 | |
| 228 | blob.h: makeheaders |
| 229 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 230 | touch headers |
| 231 | |
| 232 | cgi_.c: $(SRCDIR)/cgi.c $(SRCDIR)/VERSION translate |
| 233 | ./translate $(SRCDIR)/cgi.c | sed -f $(SRCDIR)/VERSION >cgi_.c |
| 234 | |
| 235 | cgi.o: cgi_.c cgi.h $(SRCDIR)/config.h |
| 236 | $(XTCC) -o cgi.o -c cgi_.c |
| 237 | |
| 238 | cgi.h: makeheaders |
| 239 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 240 | touch headers |
| 241 | |
| 242 | checkin_.c: $(SRCDIR)/checkin.c $(SRCDIR)/VERSION translate |
| 243 | ./translate $(SRCDIR)/checkin.c | sed -f $(SRCDIR)/VERSION >checkin_.c |
| 244 | |
| 245 | checkin.o: checkin_.c checkin.h $(SRCDIR)/config.h |
| 246 | $(XTCC) -o checkin.o -c checkin_.c |
| 247 | |
| 248 | checkin.h: makeheaders |
| 249 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 250 | touch headers |
| 251 | |
| 252 | checkout_.c: $(SRCDIR)/checkout.c $(SRCDIR)/VERSION translate |
| 253 | ./translate $(SRCDIR)/checkout.c | sed -f $(SRCDIR)/VERSION >checkout_.c |
| 254 | |
| 255 | checkout.o: checkout_.c checkout.h $(SRCDIR)/config.h |
| 256 | $(XTCC) -o checkout.o -c checkout_.c |
| 257 | |
| 258 | checkout.h: makeheaders |
| 259 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 260 | touch headers |
| 261 | |
| 262 | clearsign_.c: $(SRCDIR)/clearsign.c $(SRCDIR)/VERSION translate |
| 263 | ./translate $(SRCDIR)/clearsign.c | sed -f $(SRCDIR)/VERSION >clearsign_.c |
| 264 | |
| 265 | clearsign.o: clearsign_.c clearsign.h $(SRCDIR)/config.h |
| 266 | $(XTCC) -o clearsign.o -c clearsign_.c |
| 267 | |
| 268 | clearsign.h: makeheaders |
| 269 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 270 | touch headers |
| 271 | |
| 272 | clone_.c: $(SRCDIR)/clone.c $(SRCDIR)/VERSION translate |
| 273 | ./translate $(SRCDIR)/clone.c | sed -f $(SRCDIR)/VERSION >clone_.c |
| 274 | |
| 275 | clone.o: clone_.c clone.h $(SRCDIR)/config.h |
| 276 | $(XTCC) -o clone.o -c clone_.c |
| 277 | |
| 278 | clone.h: makeheaders |
| 279 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 280 | touch headers |
| 281 | |
| 282 | comformat_.c: $(SRCDIR)/comformat.c $(SRCDIR)/VERSION translate |
| 283 | ./translate $(SRCDIR)/comformat.c | sed -f $(SRCDIR)/VERSION >comformat_.c |
| 284 | |
| 285 | comformat.o: comformat_.c comformat.h $(SRCDIR)/config.h |
| 286 | $(XTCC) -o comformat.o -c comformat_.c |
| 287 | |
| 288 | comformat.h: makeheaders |
| 289 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 290 | touch headers |
| 291 | |
| 292 | construct_.c: $(SRCDIR)/construct.c $(SRCDIR)/VERSION translate |
| 293 | ./translate $(SRCDIR)/construct.c | sed -f $(SRCDIR)/VERSION >construct_.c |
| 294 | |
| 295 | construct.o: construct_.c construct.h $(SRCDIR)/config.h |
| 296 | $(XTCC) -o construct.o -c construct_.c |
| 297 | |
| 298 | construct.h: makeheaders |
| 299 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 300 | touch headers |
| 301 | |
| 302 | content_.c: $(SRCDIR)/content.c $(SRCDIR)/VERSION translate |
| 303 | ./translate $(SRCDIR)/content.c | sed -f $(SRCDIR)/VERSION >content_.c |
| 304 | |
| 305 | content.o: content_.c content.h $(SRCDIR)/config.h |
| 306 | $(XTCC) -o content.o -c content_.c |
| 307 | |
| 308 | content.h: makeheaders |
| 309 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 310 | touch headers |
| 311 | |
| 312 | db_.c: $(SRCDIR)/db.c $(SRCDIR)/VERSION translate |
| 313 | ./translate $(SRCDIR)/db.c | sed -f $(SRCDIR)/VERSION >db_.c |
| 314 | |
| 315 | db.o: db_.c db.h $(SRCDIR)/config.h |
| 316 | $(XTCC) -o db.o -c db_.c |
| 317 | |
| 318 | db.h: makeheaders |
| 319 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 320 | touch headers |
| 321 | |
| 322 | delta_.c: $(SRCDIR)/delta.c $(SRCDIR)/VERSION translate |
| 323 | ./translate $(SRCDIR)/delta.c | sed -f $(SRCDIR)/VERSION >delta_.c |
| 324 | |
| 325 | delta.o: delta_.c delta.h $(SRCDIR)/config.h |
| 326 | $(XTCC) -o delta.o -c delta_.c |
| 327 | |
| 328 | delta.h: makeheaders |
| 329 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 330 | touch headers |
| 331 | |
| 332 | deltacmd_.c: $(SRCDIR)/deltacmd.c $(SRCDIR)/VERSION translate |
| 333 | ./translate $(SRCDIR)/deltacmd.c | sed -f $(SRCDIR)/VERSION >deltacmd_.c |
| 334 | |
| 335 | deltacmd.o: deltacmd_.c deltacmd.h $(SRCDIR)/config.h |
| 336 | $(XTCC) -o deltacmd.o -c deltacmd_.c |
| 337 | |
| 338 | deltacmd.h: makeheaders |
| 339 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 340 | touch headers |
| 341 | |
| 342 | descendents_.c: $(SRCDIR)/descendents.c $(SRCDIR)/VERSION translate |
| 343 | ./translate $(SRCDIR)/descendents.c | sed -f $(SRCDIR)/VERSION >descendents_.c |
| 344 | |
| 345 | descendents.o: descendents_.c descendents.h $(SRCDIR)/config.h |
| 346 | $(XTCC) -o descendents.o -c descendents_.c |
| 347 | |
| 348 | descendents.h: makeheaders |
| 349 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 350 | touch headers |
| 351 | |
| 352 | diff_.c: $(SRCDIR)/diff.c $(SRCDIR)/VERSION translate |
| 353 | ./translate $(SRCDIR)/diff.c | sed -f $(SRCDIR)/VERSION >diff_.c |
| 354 | |
| 355 | diff.o: diff_.c diff.h $(SRCDIR)/config.h |
| 356 | $(XTCC) -o diff.o -c diff_.c |
| 357 | |
| 358 | diff.h: makeheaders |
| 359 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 360 | touch headers |
| 361 | |
| 362 | diffcmd_.c: $(SRCDIR)/diffcmd.c $(SRCDIR)/VERSION translate |
| 363 | ./translate $(SRCDIR)/diffcmd.c | sed -f $(SRCDIR)/VERSION >diffcmd_.c |
| 364 | |
| 365 | diffcmd.o: diffcmd_.c diffcmd.h $(SRCDIR)/config.h |
| 366 | $(XTCC) -o diffcmd.o -c diffcmd_.c |
| 367 | |
| 368 | diffcmd.h: makeheaders |
| 369 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 370 | touch headers |
| 371 | |
| 372 | encode_.c: $(SRCDIR)/encode.c $(SRCDIR)/VERSION translate |
| 373 | ./translate $(SRCDIR)/encode.c | sed -f $(SRCDIR)/VERSION >encode_.c |
| 374 | |
| 375 | encode.o: encode_.c encode.h $(SRCDIR)/config.h |
| 376 | $(XTCC) -o encode.o -c encode_.c |
| 377 | |
| 378 | encode.h: makeheaders |
| 379 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 380 | touch headers |
| 381 | |
| 382 | file_.c: $(SRCDIR)/file.c $(SRCDIR)/VERSION translate |
| 383 | ./translate $(SRCDIR)/file.c | sed -f $(SRCDIR)/VERSION >file_.c |
| 384 | |
| 385 | file.o: file_.c file.h $(SRCDIR)/config.h |
| 386 | $(XTCC) -o file.o -c file_.c |
| 387 | |
| 388 | file.h: makeheaders |
| 389 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 390 | touch headers |
| 391 | |
| 392 | http_.c: $(SRCDIR)/http.c $(SRCDIR)/VERSION translate |
| 393 | ./translate $(SRCDIR)/http.c | sed -f $(SRCDIR)/VERSION >http_.c |
| 394 | |
| 395 | http.o: http_.c http.h $(SRCDIR)/config.h |
| 396 | $(XTCC) -o http.o -c http_.c |
| 397 | |
| 398 | http.h: makeheaders |
| 399 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 400 | touch headers |
| 401 | |
| 402 | info_.c: $(SRCDIR)/info.c $(SRCDIR)/VERSION translate |
| 403 | ./translate $(SRCDIR)/info.c | sed -f $(SRCDIR)/VERSION >info_.c |
| 404 | |
| 405 | info.o: info_.c info.h $(SRCDIR)/config.h |
| 406 | $(XTCC) -o info.o -c info_.c |
| 407 | |
| 408 | info.h: makeheaders |
| 409 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 410 | touch headers |
| 411 | |
| 412 | login_.c: $(SRCDIR)/login.c $(SRCDIR)/VERSION translate |
| 413 | ./translate $(SRCDIR)/login.c | sed -f $(SRCDIR)/VERSION >login_.c |
| 414 | |
| 415 | login.o: login_.c login.h $(SRCDIR)/config.h |
| 416 | $(XTCC) -o login.o -c login_.c |
| 417 | |
| 418 | login.h: makeheaders |
| 419 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 420 | touch headers |
| 421 | |
| 422 | main_.c: $(SRCDIR)/main.c $(SRCDIR)/VERSION translate |
| 423 | ./translate $(SRCDIR)/main.c | sed -f $(SRCDIR)/VERSION >main_.c |
| 424 | |
| 425 | main.o: main_.c main.h page_index.h $(SRCDIR)/config.h |
| 426 | $(XTCC) -o main.o -c main_.c |
| 427 | |
| 428 | main.h: makeheaders |
| 429 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 430 | touch headers |
| 431 | |
| 432 | manifest_.c: $(SRCDIR)/manifest.c $(SRCDIR)/VERSION translate |
| 433 | ./translate $(SRCDIR)/manifest.c | sed -f $(SRCDIR)/VERSION >manifest_.c |
| 434 | |
| 435 | manifest.o: manifest_.c manifest.h $(SRCDIR)/config.h |
| 436 | $(XTCC) -o manifest.o -c manifest_.c |
| 437 | |
| 438 | manifest.h: makeheaders |
| 439 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 440 | touch headers |
| 441 | |
| 442 | md5_.c: $(SRCDIR)/md5.c $(SRCDIR)/VERSION translate |
| 443 | ./translate $(SRCDIR)/md5.c | sed -f $(SRCDIR)/VERSION >md5_.c |
| 444 | |
| 445 | md5.o: md5_.c md5.h $(SRCDIR)/config.h |
| 446 | $(XTCC) -o md5.o -c md5_.c |
| 447 | |
| 448 | md5.h: makeheaders |
| 449 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 450 | touch headers |
| 451 | |
| 452 | merge_.c: $(SRCDIR)/merge.c $(SRCDIR)/VERSION translate |
| 453 | ./translate $(SRCDIR)/merge.c | sed -f $(SRCDIR)/VERSION >merge_.c |
| 454 | |
| 455 | merge.o: merge_.c merge.h $(SRCDIR)/config.h |
| 456 | $(XTCC) -o merge.o -c merge_.c |
| 457 | |
| 458 | merge.h: makeheaders |
| 459 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 460 | touch headers |
| 461 | |
| 462 | merge3_.c: $(SRCDIR)/merge3.c $(SRCDIR)/VERSION translate |
| 463 | ./translate $(SRCDIR)/merge3.c | sed -f $(SRCDIR)/VERSION >merge3_.c |
| 464 | |
| 465 | merge3.o: merge3_.c merge3.h $(SRCDIR)/config.h |
| 466 | $(XTCC) -o merge3.o -c merge3_.c |
| 467 | |
| 468 | merge3.h: makeheaders |
| 469 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 470 | touch headers |
| 471 | |
| 472 | name_.c: $(SRCDIR)/name.c $(SRCDIR)/VERSION translate |
| 473 | ./translate $(SRCDIR)/name.c | sed -f $(SRCDIR)/VERSION >name_.c |
| 474 | |
| 475 | name.o: name_.c name.h $(SRCDIR)/config.h |
| 476 | $(XTCC) -o name.o -c name_.c |
| 477 | |
| 478 | name.h: makeheaders |
| 479 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 480 | touch headers |
| 481 | |
| 482 | pivot_.c: $(SRCDIR)/pivot.c $(SRCDIR)/VERSION translate |
| 483 | ./translate $(SRCDIR)/pivot.c | sed -f $(SRCDIR)/VERSION >pivot_.c |
| 484 | |
| 485 | pivot.o: pivot_.c pivot.h $(SRCDIR)/config.h |
| 486 | $(XTCC) -o pivot.o -c pivot_.c |
| 487 | |
| 488 | pivot.h: makeheaders |
| 489 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 490 | touch headers |
| 491 | |
| 492 | pqueue_.c: $(SRCDIR)/pqueue.c $(SRCDIR)/VERSION translate |
| 493 | ./translate $(SRCDIR)/pqueue.c | sed -f $(SRCDIR)/VERSION >pqueue_.c |
| 494 | |
| 495 | pqueue.o: pqueue_.c pqueue.h $(SRCDIR)/config.h |
| 496 | $(XTCC) -o pqueue.o -c pqueue_.c |
| 497 | |
| 498 | pqueue.h: makeheaders |
| 499 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 500 | touch headers |
| 501 | |
| 502 | printf_.c: $(SRCDIR)/printf.c $(SRCDIR)/VERSION translate |
| 503 | ./translate $(SRCDIR)/printf.c | sed -f $(SRCDIR)/VERSION >printf_.c |
| 504 | |
| 505 | printf.o: printf_.c printf.h $(SRCDIR)/config.h |
| 506 | $(XTCC) -o printf.o -c printf_.c |
| 507 | |
| 508 | printf.h: makeheaders |
| 509 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 510 | touch headers |
| 511 | |
| 512 | rebuild_.c: $(SRCDIR)/rebuild.c $(SRCDIR)/VERSION translate |
| 513 | ./translate $(SRCDIR)/rebuild.c | sed -f $(SRCDIR)/VERSION >rebuild_.c |
| 514 | |
| 515 | rebuild.o: rebuild_.c rebuild.h $(SRCDIR)/config.h |
| 516 | $(XTCC) -o rebuild.o -c rebuild_.c |
| 517 | |
| 518 | rebuild.h: makeheaders |
| 519 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 520 | touch headers |
| 521 | |
| 522 | schema_.c: $(SRCDIR)/schema.c $(SRCDIR)/VERSION translate |
| 523 | ./translate $(SRCDIR)/schema.c | sed -f $(SRCDIR)/VERSION >schema_.c |
| 524 | |
| 525 | schema.o: schema_.c schema.h $(SRCDIR)/config.h |
| 526 | $(XTCC) -o schema.o -c schema_.c |
| 527 | |
| 528 | schema.h: makeheaders |
| 529 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 530 | touch headers |
| 531 | |
| 532 | setup_.c: $(SRCDIR)/setup.c $(SRCDIR)/VERSION translate |
| 533 | ./translate $(SRCDIR)/setup.c | sed -f $(SRCDIR)/VERSION >setup_.c |
| 534 | |
| 535 | setup.o: setup_.c setup.h $(SRCDIR)/config.h |
| 536 | $(XTCC) -o setup.o -c setup_.c |
| 537 | |
| 538 | setup.h: makeheaders |
| 539 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 540 | touch headers |
| 541 | |
| 542 | sha1_.c: $(SRCDIR)/sha1.c $(SRCDIR)/VERSION translate |
| 543 | ./translate $(SRCDIR)/sha1.c | sed -f $(SRCDIR)/VERSION >sha1_.c |
| 544 | |
| 545 | sha1.o: sha1_.c sha1.h $(SRCDIR)/config.h |
| 546 | $(XTCC) -o sha1.o -c sha1_.c |
| 547 | |
| 548 | sha1.h: makeheaders |
| 549 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 550 | touch headers |
| 551 | |
| 552 | style_.c: $(SRCDIR)/style.c $(SRCDIR)/VERSION translate |
| 553 | ./translate $(SRCDIR)/style.c | sed -f $(SRCDIR)/VERSION >style_.c |
| 554 | |
| 555 | style.o: style_.c style.h $(SRCDIR)/config.h |
| 556 | $(XTCC) -o style.o -c style_.c |
| 557 | |
| 558 | style.h: makeheaders |
| 559 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 560 | touch headers |
| 561 | |
| 562 | sync_.c: $(SRCDIR)/sync.c $(SRCDIR)/VERSION translate |
| 563 | ./translate $(SRCDIR)/sync.c | sed -f $(SRCDIR)/VERSION >sync_.c |
| 564 | |
| 565 | sync.o: sync_.c sync.h $(SRCDIR)/config.h |
| 566 | $(XTCC) -o sync.o -c sync_.c |
| 567 | |
| 568 | sync.h: makeheaders |
| 569 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 570 | touch headers |
| 571 | |
| 572 | timeline_.c: $(SRCDIR)/timeline.c $(SRCDIR)/VERSION translate |
| 573 | ./translate $(SRCDIR)/timeline.c | sed -f $(SRCDIR)/VERSION >timeline_.c |
| 574 | |
| 575 | timeline.o: timeline_.c timeline.h $(SRCDIR)/config.h |
| 576 | $(XTCC) -o timeline.o -c timeline_.c |
| 577 | |
| 578 | timeline.h: makeheaders |
| 579 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 580 | touch headers |
| 581 | |
| 582 | update_.c: $(SRCDIR)/update.c $(SRCDIR)/VERSION translate |
| 583 | ./translate $(SRCDIR)/update.c | sed -f $(SRCDIR)/VERSION >update_.c |
| 584 | |
| 585 | update.o: update_.c update.h $(SRCDIR)/config.h |
| 586 | $(XTCC) -o update.o -c update_.c |
| 587 | |
| 588 | update.h: makeheaders |
| 589 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 590 | touch headers |
| 591 | |
| 592 | url_.c: $(SRCDIR)/url.c $(SRCDIR)/VERSION translate |
| 593 | ./translate $(SRCDIR)/url.c | sed -f $(SRCDIR)/VERSION >url_.c |
| 594 | |
| 595 | url.o: url_.c url.h $(SRCDIR)/config.h |
| 596 | $(XTCC) -o url.o -c url_.c |
| 597 | |
| 598 | url.h: makeheaders |
| 599 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 600 | touch headers |
| 601 | |
| 602 | user_.c: $(SRCDIR)/user.c $(SRCDIR)/VERSION translate |
| 603 | ./translate $(SRCDIR)/user.c | sed -f $(SRCDIR)/VERSION >user_.c |
| 604 | |
| 605 | user.o: user_.c user.h $(SRCDIR)/config.h |
| 606 | $(XTCC) -o user.o -c user_.c |
| 607 | |
| 608 | user.h: makeheaders |
| 609 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 610 | touch headers |
| 611 | |
| 612 | verify_.c: $(SRCDIR)/verify.c $(SRCDIR)/VERSION translate |
| 613 | ./translate $(SRCDIR)/verify.c | sed -f $(SRCDIR)/VERSION >verify_.c |
| 614 | |
| 615 | verify.o: verify_.c verify.h $(SRCDIR)/config.h |
| 616 | $(XTCC) -o verify.o -c verify_.c |
| 617 | |
| 618 | verify.h: makeheaders |
| 619 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 620 | touch headers |
| 621 | |
| 622 | vfile_.c: $(SRCDIR)/vfile.c $(SRCDIR)/VERSION translate |
| 623 | ./translate $(SRCDIR)/vfile.c | sed -f $(SRCDIR)/VERSION >vfile_.c |
| 624 | |
| 625 | vfile.o: vfile_.c vfile.h $(SRCDIR)/config.h |
| 626 | $(XTCC) -o vfile.o -c vfile_.c |
| 627 | |
| 628 | vfile.h: makeheaders |
| 629 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 630 | touch headers |
| 631 | |
| 632 | wiki_.c: $(SRCDIR)/wiki.c $(SRCDIR)/VERSION translate |
| 633 | ./translate $(SRCDIR)/wiki.c | sed -f $(SRCDIR)/VERSION >wiki_.c |
| 634 | |
| 635 | wiki.o: wiki_.c wiki.h $(SRCDIR)/config.h |
| 636 | $(XTCC) -o wiki.o -c wiki_.c |
| 637 | |
| 638 | wiki.h: makeheaders |
| 639 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 640 | touch headers |
| 641 | |
| 642 | wikiformat_.c: $(SRCDIR)/wikiformat.c $(SRCDIR)/VERSION translate |
| 643 | ./translate $(SRCDIR)/wikiformat.c | sed -f $(SRCDIR)/VERSION >wikiformat_.c |
| 644 | |
| 645 | wikiformat.o: wikiformat_.c wikiformat.h $(SRCDIR)/config.h |
| 646 | $(XTCC) -o wikiformat.o -c wikiformat_.c |
| 647 | |
| 648 | wikiformat.h: makeheaders |
| 649 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 650 | touch headers |
| 651 | |
| 652 | xfer_.c: $(SRCDIR)/xfer.c $(SRCDIR)/VERSION translate |
| 653 | ./translate $(SRCDIR)/xfer.c | sed -f $(SRCDIR)/VERSION >xfer_.c |
| 654 | |
| 655 | xfer.o: xfer_.c xfer.h $(SRCDIR)/config.h |
| 656 | $(XTCC) -o xfer.o -c xfer_.c |
| 657 | |
| 658 | xfer.h: makeheaders |
| 659 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 660 | touch headers |
| 661 | |
| 662 | zip_.c: $(SRCDIR)/zip.c $(SRCDIR)/VERSION translate |
| 663 | ./translate $(SRCDIR)/zip.c | sed -f $(SRCDIR)/VERSION >zip_.c |
| 664 | |
| 665 | zip.o: zip_.c zip.h $(SRCDIR)/config.h |
| 666 | $(XTCC) -o zip.o -c zip_.c |
| 667 | |
| 668 | zip.h: makeheaders |
| 669 | ./makeheaders add_.c:add.h bag_.c:bag.h blob_.c:blob.h cgi_.c:cgi.h checkin_.c:checkin.h checkout_.c:checkout.h clearsign_.c:clearsign.h clone_.c:clone.h comformat_.c:comformat.h construct_.c:construct.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendents_.c:descendents.h diff_.c:diff.h diffcmd_.c:diffcmd.h encode_.c:encode.h file_.c:file.h http_.c:http.h info_.c:info.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h schema_.c:schema.h setup_.c:setup.h sha1_.c:sha1.h style_.c:style.h sync_.c:sync.h timeline_.c:timeline.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)/sqlite3.h ./VERSION.h |
| 670 | touch headers |
| 671 | |
| 672 | sqlite3.o: $(SRCDIR)/sqlite3.c |
| 673 | $(XTCC) -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_PRIVATE= -DTHREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -c $(SRCDIR)/sqlite3.c -o sqlite3.o |
| 674 | |
| 675 |
+2
| --- src/makemake.tcl | ||
| +++ src/makemake.tcl | ||
| @@ -5,10 +5,11 @@ | ||
| 5 | 5 | |
| 6 | 6 | # Basenames of all source files: |
| 7 | 7 | # |
| 8 | 8 | set src { |
| 9 | 9 | add |
| 10 | + bag | |
| 10 | 11 | blob |
| 11 | 12 | cgi |
| 12 | 13 | checkin |
| 13 | 14 | checkout |
| 14 | 15 | clearsign |
| @@ -32,10 +33,11 @@ | ||
| 32 | 33 | md5 |
| 33 | 34 | merge |
| 34 | 35 | merge3 |
| 35 | 36 | name |
| 36 | 37 | pivot |
| 38 | + pqueue | |
| 37 | 39 | printf |
| 38 | 40 | rebuild |
| 39 | 41 | schema |
| 40 | 42 | setup |
| 41 | 43 | sha1 |
| 42 | 44 |
| --- src/makemake.tcl | |
| +++ src/makemake.tcl | |
| @@ -5,10 +5,11 @@ | |
| 5 | |
| 6 | # Basenames of all source files: |
| 7 | # |
| 8 | set src { |
| 9 | add |
| 10 | blob |
| 11 | cgi |
| 12 | checkin |
| 13 | checkout |
| 14 | clearsign |
| @@ -32,10 +33,11 @@ | |
| 32 | md5 |
| 33 | merge |
| 34 | merge3 |
| 35 | name |
| 36 | pivot |
| 37 | printf |
| 38 | rebuild |
| 39 | schema |
| 40 | setup |
| 41 | sha1 |
| 42 |
| --- src/makemake.tcl | |
| +++ src/makemake.tcl | |
| @@ -5,10 +5,11 @@ | |
| 5 | |
| 6 | # Basenames of all source files: |
| 7 | # |
| 8 | set src { |
| 9 | add |
| 10 | bag |
| 11 | blob |
| 12 | cgi |
| 13 | checkin |
| 14 | checkout |
| 15 | clearsign |
| @@ -32,10 +33,11 @@ | |
| 33 | md5 |
| 34 | merge |
| 35 | merge3 |
| 36 | name |
| 37 | pivot |
| 38 | pqueue |
| 39 | printf |
| 40 | rebuild |
| 41 | schema |
| 42 | setup |
| 43 | sha1 |
| 44 |
+34
-1
| --- src/manifest.c | ||
| +++ src/manifest.c | ||
| @@ -27,11 +27,11 @@ | ||
| 27 | 27 | #include "manifest.h" |
| 28 | 28 | #include <assert.h> |
| 29 | 29 | |
| 30 | 30 | #if INTERFACE |
| 31 | 31 | /* |
| 32 | -** A parsed manifest | |
| 32 | +** A parsed manifest or cluster. | |
| 33 | 33 | */ |
| 34 | 34 | struct Manifest { |
| 35 | 35 | Blob content; /* The original content blob */ |
| 36 | 36 | char *zComment; /* Decoded comment */ |
| 37 | 37 | double rDate; /* Time in the "D" line */ |
| @@ -44,10 +44,13 @@ | ||
| 44 | 44 | char *zUuid; /* UUID of the file */ |
| 45 | 45 | } *aFile; |
| 46 | 46 | int nParent; /* Number of parents */ |
| 47 | 47 | int nParentAlloc; /* Slots allocated in azParent[] */ |
| 48 | 48 | char **azParent; /* UUIDs of parents */ |
| 49 | + int nCChild; /* Number of cluster children */ | |
| 50 | + int nCChildAlloc; /* Number of closts allocated in azCChild[] */ | |
| 51 | + char **azCChild; /* UUIDs of referenced objects in a cluster */ | |
| 49 | 52 | }; |
| 50 | 53 | #endif |
| 51 | 54 | |
| 52 | 55 | |
| 53 | 56 | /* |
| @@ -55,10 +58,11 @@ | ||
| 55 | 58 | */ |
| 56 | 59 | void manifest_clear(Manifest *p){ |
| 57 | 60 | blob_reset(&p->content); |
| 58 | 61 | free(p->aFile); |
| 59 | 62 | free(p->azParent); |
| 63 | + free(p->azCChild); | |
| 60 | 64 | memset(p, 0, sizeof(*p)); |
| 61 | 65 | } |
| 62 | 66 | |
| 63 | 67 | /* |
| 64 | 68 | ** Parse a manifest blob into a Manifest object. The Manifest |
| @@ -140,10 +144,28 @@ | ||
| 140 | 144 | if( p->rDate!=0.0 ) goto manifest_syntax_error; |
| 141 | 145 | if( blob_token(&line, &a1)==0 ) goto manifest_syntax_error; |
| 142 | 146 | if( blob_token(&line, &a2)!=0 ) goto manifest_syntax_error; |
| 143 | 147 | zDate = blob_terminate(&a1); |
| 144 | 148 | p->rDate = db_double(0.0, "SELECT julianday(%Q)", zDate); |
| 149 | + }else if( z[0]=='M' ){ | |
| 150 | + char *zUuid; | |
| 151 | + md5sum_step_text(blob_buffer(&line), blob_size(&line)); | |
| 152 | + if( blob_token(&line, &a1)==0 ) goto manifest_syntax_error; | |
| 153 | + zUuid = blob_terminate(&a1); | |
| 154 | + if( blob_size(&a1)!=UUID_SIZE ) goto manifest_syntax_error; | |
| 155 | + if( !validate16(zUuid, UUID_SIZE) ) goto manifest_syntax_error; | |
| 156 | + if( p->nCChild>=p->nCChildAlloc ){ | |
| 157 | + p->nCChildAlloc = p->nCChildAlloc*2 + 10; | |
| 158 | + p->azCChild = | |
| 159 | + realloc(p->azCChild, p->nCChildAlloc*sizeof(p->azCChild[0]) ); | |
| 160 | + if( p->azCChild==0 ) fossil_panic("out of memory"); | |
| 161 | + } | |
| 162 | + i = p->nCChild++; | |
| 163 | + p->azCChild[i] = zUuid; | |
| 164 | + if( i>0 && strcmp(p->azCChild[i-1], zUuid)>=0 ){ | |
| 165 | + goto manifest_syntax_error; | |
| 166 | + } | |
| 145 | 167 | }else if( z[0]=='U' ){ |
| 146 | 168 | md5sum_step_text(blob_buffer(&line), blob_size(&line)); |
| 147 | 169 | if( p->zUser!=0 ) goto manifest_syntax_error; |
| 148 | 170 | if( blob_token(&line, &a1)==0 ) goto manifest_syntax_error; |
| 149 | 171 | if( blob_token(&line, &a2)!=0 ) goto manifest_syntax_error; |
| @@ -291,10 +313,14 @@ | ||
| 291 | 313 | |
| 292 | 314 | /* |
| 293 | 315 | ** Scan record rid/pContent to see if it is a manifest. If |
| 294 | 316 | ** it is a manifest, then populate the mlink, plink, |
| 295 | 317 | ** filename, and event tables with cross-reference information. |
| 318 | +** | |
| 319 | +** (Later:) Also check to see if pContent is a cluster. If it | |
| 320 | +** is a cluster then remove all referenced elements from the | |
| 321 | +** unclustered table and create phantoms for any unknown elements. | |
| 296 | 322 | */ |
| 297 | 323 | int manifest_crosslink(int rid, Blob *pContent){ |
| 298 | 324 | int i; |
| 299 | 325 | Manifest m; |
| 300 | 326 | Stmt q; |
| @@ -321,10 +347,17 @@ | ||
| 321 | 347 | db_multi_exec( |
| 322 | 348 | "INSERT INTO event(type,mtime,objid,user,comment)" |
| 323 | 349 | "VALUES('ci',%.17g,%d,%Q,%Q)", |
| 324 | 350 | m.rDate, rid, m.zUser, m.zComment |
| 325 | 351 | ); |
| 352 | + } | |
| 353 | + for(i=0; i<m.nCChild; i++){ | |
| 354 | + int rid; | |
| 355 | + rid = uuid_to_rid(m.azCChild[i], 1); | |
| 356 | + if( rid>0 ){ | |
| 357 | + db_multi_exec("DELETE FROM unclustered WHERE rid=%d", rid); | |
| 358 | + } | |
| 326 | 359 | } |
| 327 | 360 | db_end_transaction(0); |
| 328 | 361 | manifest_clear(&m); |
| 329 | 362 | return 1; |
| 330 | 363 | } |
| 331 | 364 | |
| 332 | 365 | ADDED src/pqueue.c |
| --- src/manifest.c | |
| +++ src/manifest.c | |
| @@ -27,11 +27,11 @@ | |
| 27 | #include "manifest.h" |
| 28 | #include <assert.h> |
| 29 | |
| 30 | #if INTERFACE |
| 31 | /* |
| 32 | ** A parsed manifest |
| 33 | */ |
| 34 | struct Manifest { |
| 35 | Blob content; /* The original content blob */ |
| 36 | char *zComment; /* Decoded comment */ |
| 37 | double rDate; /* Time in the "D" line */ |
| @@ -44,10 +44,13 @@ | |
| 44 | char *zUuid; /* UUID of the file */ |
| 45 | } *aFile; |
| 46 | int nParent; /* Number of parents */ |
| 47 | int nParentAlloc; /* Slots allocated in azParent[] */ |
| 48 | char **azParent; /* UUIDs of parents */ |
| 49 | }; |
| 50 | #endif |
| 51 | |
| 52 | |
| 53 | /* |
| @@ -55,10 +58,11 @@ | |
| 55 | */ |
| 56 | void manifest_clear(Manifest *p){ |
| 57 | blob_reset(&p->content); |
| 58 | free(p->aFile); |
| 59 | free(p->azParent); |
| 60 | memset(p, 0, sizeof(*p)); |
| 61 | } |
| 62 | |
| 63 | /* |
| 64 | ** Parse a manifest blob into a Manifest object. The Manifest |
| @@ -140,10 +144,28 @@ | |
| 140 | if( p->rDate!=0.0 ) goto manifest_syntax_error; |
| 141 | if( blob_token(&line, &a1)==0 ) goto manifest_syntax_error; |
| 142 | if( blob_token(&line, &a2)!=0 ) goto manifest_syntax_error; |
| 143 | zDate = blob_terminate(&a1); |
| 144 | p->rDate = db_double(0.0, "SELECT julianday(%Q)", zDate); |
| 145 | }else if( z[0]=='U' ){ |
| 146 | md5sum_step_text(blob_buffer(&line), blob_size(&line)); |
| 147 | if( p->zUser!=0 ) goto manifest_syntax_error; |
| 148 | if( blob_token(&line, &a1)==0 ) goto manifest_syntax_error; |
| 149 | if( blob_token(&line, &a2)!=0 ) goto manifest_syntax_error; |
| @@ -291,10 +313,14 @@ | |
| 291 | |
| 292 | /* |
| 293 | ** Scan record rid/pContent to see if it is a manifest. If |
| 294 | ** it is a manifest, then populate the mlink, plink, |
| 295 | ** filename, and event tables with cross-reference information. |
| 296 | */ |
| 297 | int manifest_crosslink(int rid, Blob *pContent){ |
| 298 | int i; |
| 299 | Manifest m; |
| 300 | Stmt q; |
| @@ -321,10 +347,17 @@ | |
| 321 | db_multi_exec( |
| 322 | "INSERT INTO event(type,mtime,objid,user,comment)" |
| 323 | "VALUES('ci',%.17g,%d,%Q,%Q)", |
| 324 | m.rDate, rid, m.zUser, m.zComment |
| 325 | ); |
| 326 | } |
| 327 | db_end_transaction(0); |
| 328 | manifest_clear(&m); |
| 329 | return 1; |
| 330 | } |
| 331 | |
| 332 | DDED src/pqueue.c |
| --- src/manifest.c | |
| +++ src/manifest.c | |
| @@ -27,11 +27,11 @@ | |
| 27 | #include "manifest.h" |
| 28 | #include <assert.h> |
| 29 | |
| 30 | #if INTERFACE |
| 31 | /* |
| 32 | ** A parsed manifest or cluster. |
| 33 | */ |
| 34 | struct Manifest { |
| 35 | Blob content; /* The original content blob */ |
| 36 | char *zComment; /* Decoded comment */ |
| 37 | double rDate; /* Time in the "D" line */ |
| @@ -44,10 +44,13 @@ | |
| 44 | char *zUuid; /* UUID of the file */ |
| 45 | } *aFile; |
| 46 | int nParent; /* Number of parents */ |
| 47 | int nParentAlloc; /* Slots allocated in azParent[] */ |
| 48 | char **azParent; /* UUIDs of parents */ |
| 49 | int nCChild; /* Number of cluster children */ |
| 50 | int nCChildAlloc; /* Number of closts allocated in azCChild[] */ |
| 51 | char **azCChild; /* UUIDs of referenced objects in a cluster */ |
| 52 | }; |
| 53 | #endif |
| 54 | |
| 55 | |
| 56 | /* |
| @@ -55,10 +58,11 @@ | |
| 58 | */ |
| 59 | void manifest_clear(Manifest *p){ |
| 60 | blob_reset(&p->content); |
| 61 | free(p->aFile); |
| 62 | free(p->azParent); |
| 63 | free(p->azCChild); |
| 64 | memset(p, 0, sizeof(*p)); |
| 65 | } |
| 66 | |
| 67 | /* |
| 68 | ** Parse a manifest blob into a Manifest object. The Manifest |
| @@ -140,10 +144,28 @@ | |
| 144 | if( p->rDate!=0.0 ) goto manifest_syntax_error; |
| 145 | if( blob_token(&line, &a1)==0 ) goto manifest_syntax_error; |
| 146 | if( blob_token(&line, &a2)!=0 ) goto manifest_syntax_error; |
| 147 | zDate = blob_terminate(&a1); |
| 148 | p->rDate = db_double(0.0, "SELECT julianday(%Q)", zDate); |
| 149 | }else if( z[0]=='M' ){ |
| 150 | char *zUuid; |
| 151 | md5sum_step_text(blob_buffer(&line), blob_size(&line)); |
| 152 | if( blob_token(&line, &a1)==0 ) goto manifest_syntax_error; |
| 153 | zUuid = blob_terminate(&a1); |
| 154 | if( blob_size(&a1)!=UUID_SIZE ) goto manifest_syntax_error; |
| 155 | if( !validate16(zUuid, UUID_SIZE) ) goto manifest_syntax_error; |
| 156 | if( p->nCChild>=p->nCChildAlloc ){ |
| 157 | p->nCChildAlloc = p->nCChildAlloc*2 + 10; |
| 158 | p->azCChild = |
| 159 | realloc(p->azCChild, p->nCChildAlloc*sizeof(p->azCChild[0]) ); |
| 160 | if( p->azCChild==0 ) fossil_panic("out of memory"); |
| 161 | } |
| 162 | i = p->nCChild++; |
| 163 | p->azCChild[i] = zUuid; |
| 164 | if( i>0 && strcmp(p->azCChild[i-1], zUuid)>=0 ){ |
| 165 | goto manifest_syntax_error; |
| 166 | } |
| 167 | }else if( z[0]=='U' ){ |
| 168 | md5sum_step_text(blob_buffer(&line), blob_size(&line)); |
| 169 | if( p->zUser!=0 ) goto manifest_syntax_error; |
| 170 | if( blob_token(&line, &a1)==0 ) goto manifest_syntax_error; |
| 171 | if( blob_token(&line, &a2)!=0 ) goto manifest_syntax_error; |
| @@ -291,10 +313,14 @@ | |
| 313 | |
| 314 | /* |
| 315 | ** Scan record rid/pContent to see if it is a manifest. If |
| 316 | ** it is a manifest, then populate the mlink, plink, |
| 317 | ** filename, and event tables with cross-reference information. |
| 318 | ** |
| 319 | ** (Later:) Also check to see if pContent is a cluster. If it |
| 320 | ** is a cluster then remove all referenced elements from the |
| 321 | ** unclustered table and create phantoms for any unknown elements. |
| 322 | */ |
| 323 | int manifest_crosslink(int rid, Blob *pContent){ |
| 324 | int i; |
| 325 | Manifest m; |
| 326 | Stmt q; |
| @@ -321,10 +347,17 @@ | |
| 347 | db_multi_exec( |
| 348 | "INSERT INTO event(type,mtime,objid,user,comment)" |
| 349 | "VALUES('ci',%.17g,%d,%Q,%Q)", |
| 350 | m.rDate, rid, m.zUser, m.zComment |
| 351 | ); |
| 352 | } |
| 353 | for(i=0; i<m.nCChild; i++){ |
| 354 | int rid; |
| 355 | rid = uuid_to_rid(m.azCChild[i], 1); |
| 356 | if( rid>0 ){ |
| 357 | db_multi_exec("DELETE FROM unclustered WHERE rid=%d", rid); |
| 358 | } |
| 359 | } |
| 360 | db_end_transaction(0); |
| 361 | manifest_clear(&m); |
| 362 | return 1; |
| 363 | } |
| 364 | |
| 365 | DDED src/pqueue.c |
+11
| --- a/src/pqueue.c | ||
| +++ b/src/pqueue.c | ||
| @@ -0,0 +1,11 @@ | ||
| 1 | +/* | |
| 2 | +** CopyrigGNU General Public | |
| 3 | +** License version 2 as published by the Free Software Foundation. | |
| 4 | +**WITHOUT ANY WARRANTYMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 5 | +** General Public License for more details. | |
| 6 | +** | |
| 7 | +** You should have received a copy of the GNU General Public | |
| 8 | +** License along with this library; if not, write to the | |
| 9 | +** Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
| 10 | +** Boston, MA 02111-1307, USACopyrig/* | |
| 11 | +** Copyrig |
| --- a/src/pqueue.c | |
| +++ b/src/pqueue.c | |
| @@ -0,0 +1,11 @@ | |
| --- a/src/pqueue.c | |
| +++ b/src/pqueue.c | |
| @@ -0,0 +1,11 @@ | |
| 1 | /* |
| 2 | ** CopyrigGNU General Public |
| 3 | ** License version 2 as published by the Free Software Foundation. |
| 4 | **WITHOUT ANY WARRANTYMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 5 | ** General Public License for more details. |
| 6 | ** |
| 7 | ** You should have received a copy of the GNU General Public |
| 8 | ** License along with this library; if not, write to the |
| 9 | ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
| 10 | ** Boston, MA 02111-1307, USACopyrig/* |
| 11 | ** Copyrig |
+5
-1
| --- src/rebuild.c | ||
| +++ src/rebuild.c | ||
| @@ -52,10 +52,14 @@ | ||
| 52 | 52 | db_multi_exec("DROP TABLE %Q", zTable); |
| 53 | 53 | free(zTable); |
| 54 | 54 | } |
| 55 | 55 | db_multi_exec(zRepositorySchema2); |
| 56 | 56 | |
| 57 | + db_multi_exec("INSERT INTO unclustered SELECT rid FROM blob"); | |
| 58 | + db_multi_exec( | |
| 59 | + "DELETE FROM config WHERE name IN ('remote-code', 'remote-maxid')" | |
| 60 | + ); | |
| 57 | 61 | db_prepare(&s, "SELECT rid, size FROM blob"); |
| 58 | 62 | while( db_step(&s)==SQLITE_ROW ){ |
| 59 | 63 | int rid = db_column_int(&s, 0); |
| 60 | 64 | int size = db_column_int(&s, 1); |
| 61 | 65 | if( size>=0 ){ |
| @@ -62,11 +66,11 @@ | ||
| 62 | 66 | Blob content; |
| 63 | 67 | content_get(rid, &content); |
| 64 | 68 | manifest_crosslink(rid, &content); |
| 65 | 69 | blob_reset(&content); |
| 66 | 70 | }else{ |
| 67 | - db_multi_exec("INSERT INTO phantom VALUES(%d)", rid); | |
| 71 | + db_multi_exec("INSERT OR IGNORE INTO phantom VALUES(%d)", rid); | |
| 68 | 72 | } |
| 69 | 73 | } |
| 70 | 74 | return errCnt; |
| 71 | 75 | } |
| 72 | 76 | |
| 73 | 77 |
| --- src/rebuild.c | |
| +++ src/rebuild.c | |
| @@ -52,10 +52,14 @@ | |
| 52 | db_multi_exec("DROP TABLE %Q", zTable); |
| 53 | free(zTable); |
| 54 | } |
| 55 | db_multi_exec(zRepositorySchema2); |
| 56 | |
| 57 | db_prepare(&s, "SELECT rid, size FROM blob"); |
| 58 | while( db_step(&s)==SQLITE_ROW ){ |
| 59 | int rid = db_column_int(&s, 0); |
| 60 | int size = db_column_int(&s, 1); |
| 61 | if( size>=0 ){ |
| @@ -62,11 +66,11 @@ | |
| 62 | Blob content; |
| 63 | content_get(rid, &content); |
| 64 | manifest_crosslink(rid, &content); |
| 65 | blob_reset(&content); |
| 66 | }else{ |
| 67 | db_multi_exec("INSERT INTO phantom VALUES(%d)", rid); |
| 68 | } |
| 69 | } |
| 70 | return errCnt; |
| 71 | } |
| 72 | |
| 73 |
| --- src/rebuild.c | |
| +++ src/rebuild.c | |
| @@ -52,10 +52,14 @@ | |
| 52 | db_multi_exec("DROP TABLE %Q", zTable); |
| 53 | free(zTable); |
| 54 | } |
| 55 | db_multi_exec(zRepositorySchema2); |
| 56 | |
| 57 | db_multi_exec("INSERT INTO unclustered SELECT rid FROM blob"); |
| 58 | db_multi_exec( |
| 59 | "DELETE FROM config WHERE name IN ('remote-code', 'remote-maxid')" |
| 60 | ); |
| 61 | db_prepare(&s, "SELECT rid, size FROM blob"); |
| 62 | while( db_step(&s)==SQLITE_ROW ){ |
| 63 | int rid = db_column_int(&s, 0); |
| 64 | int size = db_column_int(&s, 1); |
| 65 | if( size>=0 ){ |
| @@ -62,11 +66,11 @@ | |
| 66 | Blob content; |
| 67 | content_get(rid, &content); |
| 68 | manifest_crosslink(rid, &content); |
| 69 | blob_reset(&content); |
| 70 | }else{ |
| 71 | db_multi_exec("INSERT OR IGNORE INTO phantom VALUES(%d)", rid); |
| 72 | } |
| 73 | } |
| 74 | return errCnt; |
| 75 | } |
| 76 | |
| 77 |
+23
-1
| --- src/schema.c | ||
| +++ src/schema.c | ||
| @@ -162,15 +162,37 @@ | ||
| 162 | 162 | @ comment TEXT |
| 163 | 163 | @ ); |
| 164 | 164 | @ CREATE INDEX event_i1 ON event(mtime); |
| 165 | 165 | @ CREATE INDEX event_i2 ON event(objid); |
| 166 | 166 | @ |
| 167 | -@ -- A record of phantoms | |
| 167 | +@ -- A record of phantoms. A phantom is a record for which we know the | |
| 168 | +@ -- UUID but we do not (yet) know the file content. | |
| 168 | 169 | @ -- |
| 169 | 170 | @ CREATE TABLE phantom( |
| 170 | 171 | @ rid INTEGER PRIMARY KEY -- Record ID of the phantom |
| 171 | 172 | @ ); |
| 173 | +@ | |
| 174 | +@ -- Unclustered records. An unclustered record is a record (including | |
| 175 | +@ -- a cluster records themselves) that is not mentioned by some other | |
| 176 | +@ -- cluster. | |
| 177 | +@ -- | |
| 178 | +@ -- Phantoms are usually included in the unclustered table. A new cluster | |
| 179 | +@ -- will never be created that contains a phantom. But another repository | |
| 180 | +@ -- might send us a cluster that contains entries that are phantoms to | |
| 181 | +@ -- us. | |
| 182 | +@ -- | |
| 183 | +@ CREATE TABLE unclustered( | |
| 184 | +@ rid INTEGER PRIMARY KEY -- Record ID of the unclustered file | |
| 185 | +@ ); | |
| 186 | +@ | |
| 187 | +@ -- Records which have never been pushed to another server. This is | |
| 188 | +@ -- used to reduce push operations to a single HTTP request in the | |
| 189 | +@ -- common case when one repository only talks to a single server. | |
| 190 | +@ -- | |
| 191 | +@ CREATE TABLE unsent( | |
| 192 | +@ rid INTEGER PRIMARY KEY -- Record ID of the phantom | |
| 193 | +@ ); | |
| 172 | 194 | @ |
| 173 | 195 | @ -- Aggregated ticket information |
| 174 | 196 | @ -- |
| 175 | 197 | @ CREATE TABLE tkt( |
| 176 | 198 | @ tktid INTEGER PRIMARY KEY, -- Internal ticket ID |
| 177 | 199 |
| --- src/schema.c | |
| +++ src/schema.c | |
| @@ -162,15 +162,37 @@ | |
| 162 | @ comment TEXT |
| 163 | @ ); |
| 164 | @ CREATE INDEX event_i1 ON event(mtime); |
| 165 | @ CREATE INDEX event_i2 ON event(objid); |
| 166 | @ |
| 167 | @ -- A record of phantoms |
| 168 | @ -- |
| 169 | @ CREATE TABLE phantom( |
| 170 | @ rid INTEGER PRIMARY KEY -- Record ID of the phantom |
| 171 | @ ); |
| 172 | @ |
| 173 | @ -- Aggregated ticket information |
| 174 | @ -- |
| 175 | @ CREATE TABLE tkt( |
| 176 | @ tktid INTEGER PRIMARY KEY, -- Internal ticket ID |
| 177 |
| --- src/schema.c | |
| +++ src/schema.c | |
| @@ -162,15 +162,37 @@ | |
| 162 | @ comment TEXT |
| 163 | @ ); |
| 164 | @ CREATE INDEX event_i1 ON event(mtime); |
| 165 | @ CREATE INDEX event_i2 ON event(objid); |
| 166 | @ |
| 167 | @ -- A record of phantoms. A phantom is a record for which we know the |
| 168 | @ -- UUID but we do not (yet) know the file content. |
| 169 | @ -- |
| 170 | @ CREATE TABLE phantom( |
| 171 | @ rid INTEGER PRIMARY KEY -- Record ID of the phantom |
| 172 | @ ); |
| 173 | @ |
| 174 | @ -- Unclustered records. An unclustered record is a record (including |
| 175 | @ -- a cluster records themselves) that is not mentioned by some other |
| 176 | @ -- cluster. |
| 177 | @ -- |
| 178 | @ -- Phantoms are usually included in the unclustered table. A new cluster |
| 179 | @ -- will never be created that contains a phantom. But another repository |
| 180 | @ -- might send us a cluster that contains entries that are phantoms to |
| 181 | @ -- us. |
| 182 | @ -- |
| 183 | @ CREATE TABLE unclustered( |
| 184 | @ rid INTEGER PRIMARY KEY -- Record ID of the unclustered file |
| 185 | @ ); |
| 186 | @ |
| 187 | @ -- Records which have never been pushed to another server. This is |
| 188 | @ -- used to reduce push operations to a single HTTP request in the |
| 189 | @ -- common case when one repository only talks to a single server. |
| 190 | @ -- |
| 191 | @ CREATE TABLE unsent( |
| 192 | @ rid INTEGER PRIMARY KEY -- Record ID of the phantom |
| 193 | @ ); |
| 194 | @ |
| 195 | @ -- Aggregated ticket information |
| 196 | @ -- |
| 197 | @ CREATE TABLE tkt( |
| 198 | @ tktid INTEGER PRIMARY KEY, -- Internal ticket ID |
| 199 |
+2
-1
| --- src/setup.c | ||
| +++ src/setup.c | ||
| @@ -520,11 +520,12 @@ | ||
| 520 | 520 | |
| 521 | 521 | @ <hr> |
| 522 | 522 | entry_attribute("Home page", 60, "homepage", "hp", ""); |
| 523 | 523 | @ <p>The name of a wiki file that is the homepage for the website. |
| 524 | 524 | @ The home page is the page that is displayed by the "Home" link |
| 525 | - @ at the top of this screen.</p> | |
| 525 | + @ at the top of this screen. Omit the path and the ".wiki" | |
| 526 | + @ suffix. </p> | |
| 526 | 527 | |
| 527 | 528 | entry_attribute("Ticket subdirectory", 60, "ticket-subdir", "tsd", ""); |
| 528 | 529 | @ <p>A subdirectory in the file hierarchy that contains all trouble |
| 529 | 530 | @ tickets. Leave this blank to disable ticketing. Tickets text |
| 530 | 531 | @ files within this subdirectory containing a particular format |
| 531 | 532 |
| --- src/setup.c | |
| +++ src/setup.c | |
| @@ -520,11 +520,12 @@ | |
| 520 | |
| 521 | @ <hr> |
| 522 | entry_attribute("Home page", 60, "homepage", "hp", ""); |
| 523 | @ <p>The name of a wiki file that is the homepage for the website. |
| 524 | @ The home page is the page that is displayed by the "Home" link |
| 525 | @ at the top of this screen.</p> |
| 526 | |
| 527 | entry_attribute("Ticket subdirectory", 60, "ticket-subdir", "tsd", ""); |
| 528 | @ <p>A subdirectory in the file hierarchy that contains all trouble |
| 529 | @ tickets. Leave this blank to disable ticketing. Tickets text |
| 530 | @ files within this subdirectory containing a particular format |
| 531 |
| --- src/setup.c | |
| +++ src/setup.c | |
| @@ -520,11 +520,12 @@ | |
| 520 | |
| 521 | @ <hr> |
| 522 | entry_attribute("Home page", 60, "homepage", "hp", ""); |
| 523 | @ <p>The name of a wiki file that is the homepage for the website. |
| 524 | @ The home page is the page that is displayed by the "Home" link |
| 525 | @ at the top of this screen. Omit the path and the ".wiki" |
| 526 | @ suffix. </p> |
| 527 | |
| 528 | entry_attribute("Ticket subdirectory", 60, "ticket-subdir", "tsd", ""); |
| 529 | @ <p>A subdirectory in the file hierarchy that contains all trouble |
| 530 | @ tickets. Leave this blank to disable ticketing. Tickets text |
| 531 | @ files within this subdirectory containing a particular format |
| 532 |
+10
-3
| --- src/style.c | ||
| +++ src/style.c | ||
| @@ -133,13 +133,20 @@ | ||
| 133 | 133 | ** WEBPAGE: index |
| 134 | 134 | ** WEBPAGE: home |
| 135 | 135 | ** WEBPAGE: not_found |
| 136 | 136 | */ |
| 137 | 137 | void page_index(void){ |
| 138 | - style_header("Main Title Page"); | |
| 139 | - @ This will become the title page | |
| 140 | - style_footer(); | |
| 138 | + char *zHome = db_get("homepage", 0); | |
| 139 | + if( zHome ){ | |
| 140 | + g.zExtra = zHome; | |
| 141 | + g.okRdWiki = 1; | |
| 142 | + wiki_page(); | |
| 143 | + }else{ | |
| 144 | + style_header("Main Title Page"); | |
| 145 | + @ No homepage configured for this server | |
| 146 | + style_footer(); | |
| 147 | + } | |
| 141 | 148 | } |
| 142 | 149 | |
| 143 | 150 | /* |
| 144 | 151 | ** WEBPAGE: test_env |
| 145 | 152 | */ |
| 146 | 153 |
| --- src/style.c | |
| +++ src/style.c | |
| @@ -133,13 +133,20 @@ | |
| 133 | ** WEBPAGE: index |
| 134 | ** WEBPAGE: home |
| 135 | ** WEBPAGE: not_found |
| 136 | */ |
| 137 | void page_index(void){ |
| 138 | style_header("Main Title Page"); |
| 139 | @ This will become the title page |
| 140 | style_footer(); |
| 141 | } |
| 142 | |
| 143 | /* |
| 144 | ** WEBPAGE: test_env |
| 145 | */ |
| 146 |
| --- src/style.c | |
| +++ src/style.c | |
| @@ -133,13 +133,20 @@ | |
| 133 | ** WEBPAGE: index |
| 134 | ** WEBPAGE: home |
| 135 | ** WEBPAGE: not_found |
| 136 | */ |
| 137 | void page_index(void){ |
| 138 | char *zHome = db_get("homepage", 0); |
| 139 | if( zHome ){ |
| 140 | g.zExtra = zHome; |
| 141 | g.okRdWiki = 1; |
| 142 | wiki_page(); |
| 143 | }else{ |
| 144 | style_header("Main Title Page"); |
| 145 | @ No homepage configured for this server |
| 146 | style_footer(); |
| 147 | } |
| 148 | } |
| 149 | |
| 150 | /* |
| 151 | ** WEBPAGE: test_env |
| 152 | */ |
| 153 |
+130
-22
| --- src/timeline.c | ||
| +++ src/timeline.c | ||
| @@ -22,10 +22,11 @@ | ||
| 22 | 22 | ******************************************************************************* |
| 23 | 23 | ** |
| 24 | 24 | ** This file contains code to implement the timeline web page |
| 25 | 25 | ** |
| 26 | 26 | */ |
| 27 | +#include <string.h> | |
| 27 | 28 | #include "config.h" |
| 28 | 29 | #include "timeline.h" |
| 29 | 30 | |
| 30 | 31 | /* |
| 31 | 32 | ** Generate a hyperlink to a version. |
| @@ -87,24 +88,37 @@ | ||
| 87 | 88 | ** 6. Number of parents |
| 88 | 89 | ** 7. True if is a leaf |
| 89 | 90 | */ |
| 90 | 91 | void www_print_timeline( |
| 91 | 92 | Stmt *pQuery, |
| 92 | - char *zLastDate, | |
| 93 | + int *pFirstEvent, | |
| 94 | + int *pLastEvent, | |
| 93 | 95 | int (*xCallback)(int, Blob*), |
| 94 | 96 | Blob *pArg |
| 95 | 97 | ){ |
| 96 | 98 | char zPrevDate[20]; |
| 99 | + int cnt = 0; | |
| 97 | 100 | zPrevDate[0] = 0; |
| 101 | + db_multi_exec( | |
| 102 | + "CREATE TEMP TABLE IF NOT EXISTS seen(rid INTEGER PRIMARY KEY);" | |
| 103 | + "DELETE FROM seen;" | |
| 104 | + ); | |
| 98 | 105 | @ <table cellspacing=0 border=0 cellpadding=0> |
| 99 | 106 | while( db_step(pQuery)==SQLITE_ROW ){ |
| 100 | 107 | int rid = db_column_int(pQuery, 0); |
| 101 | 108 | const char *zUuid = db_column_text(pQuery, 1); |
| 102 | 109 | int nPChild = db_column_int(pQuery, 5); |
| 103 | 110 | int nParent = db_column_int(pQuery, 6); |
| 104 | 111 | int isLeaf = db_column_int(pQuery, 7); |
| 105 | 112 | const char *zDate = db_column_text(pQuery, 2); |
| 113 | + if( cnt==0 && pFirstEvent ){ | |
| 114 | + *pFirstEvent = rid; | |
| 115 | + } | |
| 116 | + if( pLastEvent ){ | |
| 117 | + *pLastEvent = rid; | |
| 118 | + } | |
| 119 | + db_multi_exec("INSERT OR IGNORE INTO seen VALUES(%d)", rid); | |
| 106 | 120 | if( xCallback ){ |
| 107 | 121 | xCallback(rid, pArg); |
| 108 | 122 | } |
| 109 | 123 | if( memcmp(zDate, zPrevDate, 10) ){ |
| 110 | 124 | sprintf(zPrevDate, "%.10s", zDate); |
| @@ -132,13 +146,10 @@ | ||
| 132 | 146 | if( isLeaf ){ |
| 133 | 147 | @ <b>Leaf</b> |
| 134 | 148 | } |
| 135 | 149 | @ %h(db_column_text(pQuery,3)) |
| 136 | 150 | @ (by %h(db_column_text(pQuery,4)))</td></tr> |
| 137 | - if( zLastDate ){ | |
| 138 | - strcpy(zLastDate, zDate); | |
| 139 | - } | |
| 140 | 151 | } |
| 141 | 152 | @ </table> |
| 142 | 153 | } |
| 143 | 154 | |
| 144 | 155 | /* |
| @@ -172,18 +183,33 @@ | ||
| 172 | 183 | return 0; |
| 173 | 184 | } |
| 174 | 185 | |
| 175 | 186 | /* |
| 176 | 187 | ** WEBPAGE: timeline |
| 188 | +** | |
| 189 | +** Query parameters: | |
| 190 | +** | |
| 191 | +** d=STARTDATE date in iso8601 notation. dflt: newest event | |
| 192 | +** n=INTEGER number of events to show. dflt: 25 | |
| 193 | +** e=INTEGER starting event id. dflt: nil | |
| 194 | +** u=NAME show only events from user. dflt: nil | |
| 195 | +** a show events after and including. dflt: false | |
| 196 | +** r show only related events. dflt: false | |
| 177 | 197 | */ |
| 178 | 198 | void page_timeline(void){ |
| 179 | 199 | Stmt q; |
| 180 | 200 | char *zSQL; |
| 181 | 201 | Blob scriptInit; |
| 182 | 202 | char zDate[100]; |
| 183 | 203 | const char *zStart = P("d"); |
| 184 | - int nEntry = atoi(PD("n","25")); | |
| 204 | + int nEntry = atoi(PD("n","20")); | |
| 205 | + const char *zUser = P("u"); | |
| 206 | + int objid = atoi(PD("e","0")); | |
| 207 | + int relatedEvents = P("r")!=0; | |
| 208 | + int afterFlag = P("a")!=0; | |
| 209 | + int firstEvent; | |
| 210 | + int lastEvent; | |
| 185 | 211 | |
| 186 | 212 | /* To view the timeline, must have permission to read project data. |
| 187 | 213 | */ |
| 188 | 214 | login_check_credentials(); |
| 189 | 215 | if( !g.okRead ){ login_needed(); return; } |
| @@ -202,23 +228,46 @@ | ||
| 202 | 228 | " (SELECT count(*) FROM plink WHERE cid=blob.rid)," |
| 203 | 229 | " NOT EXISTS (SELECT 1 FROM plink WHERE pid=blob.rid)" |
| 204 | 230 | " FROM event, blob" |
| 205 | 231 | " WHERE event.type='ci' AND blob.rid=event.objid" |
| 206 | 232 | ); |
| 233 | + if( zUser ){ | |
| 234 | + zSQL = mprintf("%z AND event.user=%Q", zSQL, zUser); | |
| 235 | + } | |
| 236 | + if( objid ){ | |
| 237 | + char *z = db_text(0, "SELECT datetime(event.mtime) FROM event" | |
| 238 | + " WHERE objid=%d", objid); | |
| 239 | + if( z ){ | |
| 240 | + zStart = z; | |
| 241 | + } | |
| 242 | + } | |
| 207 | 243 | if( zStart ){ |
| 208 | 244 | while( isspace(zStart[0]) ){ zStart++; } |
| 209 | 245 | if( zStart[0] ){ |
| 210 | - zSQL = mprintf("%z AND event.mtime<=julianday(%Q, 'localtime')", | |
| 211 | - zSQL, zStart); | |
| 246 | + zSQL = mprintf("%z AND event.mtime %s julianday(%Q, 'localtime')", | |
| 247 | + zSQL, afterFlag ? ">=" : "<=", zStart); | |
| 248 | + } | |
| 249 | + } | |
| 250 | + if( relatedEvents && objid ){ | |
| 251 | + db_multi_exec( | |
| 252 | + "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY)" | |
| 253 | + ); | |
| 254 | + if( afterFlag ){ | |
| 255 | + compute_descendents(objid, nEntry); | |
| 256 | + }else{ | |
| 257 | + compute_ancestors(objid, nEntry); | |
| 212 | 258 | } |
| 259 | + zSQL = mprintf("%z AND event.objid IN ok", zSQL); | |
| 213 | 260 | } |
| 214 | 261 | zSQL = mprintf("%z ORDER BY event.mtime DESC LIMIT %d", zSQL, nEntry); |
| 215 | 262 | db_prepare(&q, zSQL); |
| 216 | 263 | free(zSQL); |
| 217 | 264 | zDate[0] = 0; |
| 218 | 265 | blob_zero(&scriptInit); |
| 219 | - www_print_timeline(&q, zDate, save_parentage_javascript, &scriptInit); | |
| 266 | + zDate[0] = 0; | |
| 267 | + www_print_timeline(&q, &firstEvent, &lastEvent, | |
| 268 | + save_parentage_javascript, &scriptInit); | |
| 220 | 269 | db_finalize(&q); |
| 221 | 270 | if( zStart==0 ){ |
| 222 | 271 | zStart = zDate; |
| 223 | 272 | } |
| 224 | 273 | @ <script> |
| @@ -350,48 +399,107 @@ | ||
| 350 | 399 | |
| 351 | 400 | |
| 352 | 401 | /* |
| 353 | 402 | ** COMMAND: timeline |
| 354 | 403 | ** |
| 355 | -** Usage: %fossil timeline ?DATETIME? ?-n|--count N? | |
| 404 | +** Usage: %fossil timeline ?WHEN? ?UUID|DATETIME? ?-n|--count N? | |
| 356 | 405 | ** |
| 357 | 406 | ** Print a summary of activity going backwards in date and time |
| 358 | 407 | ** specified or from the current date and time if no arguments |
| 359 | -** are given. Show as many as N (default 20) check-ins. | |
| 408 | +** are given. Show as many as N (default 20) check-ins. The | |
| 409 | +** WHEN argument can be any unique abbreviation of one of these | |
| 410 | +** keywords: | |
| 411 | +** | |
| 412 | +** before | |
| 413 | +** after | |
| 414 | +** descendents | children | |
| 415 | +** ancestors | parents | |
| 360 | 416 | ** |
| 361 | -** The date and time should be in the ISO8601 format. For | |
| 362 | -** examples: "2007-08-18 07:21:21". The time may be omitted. | |
| 363 | -** Times are according to the local timezone. | |
| 417 | +** The UUID can be any unique prefix of 4 characters or more. | |
| 418 | +** The DATETIME should be in the ISO8601 format. For | |
| 419 | +** examples: "2007-08-18 07:21:21". You can also say "current" | |
| 420 | +** for the current version or "now" for the current time. | |
| 364 | 421 | */ |
| 365 | 422 | void timeline_cmd(void){ |
| 366 | 423 | Stmt q; |
| 367 | - int n; | |
| 424 | + int n, k; | |
| 368 | 425 | const char *zCount; |
| 426 | + char *zOrigin; | |
| 369 | 427 | char *zDate; |
| 428 | + char *zSQL; | |
| 429 | + int objid = 0; | |
| 430 | + Blob uuid; | |
| 431 | + int mode = 1 ; /* 1: before 2:after 3:children 4:parents */ | |
| 370 | 432 | db_find_and_open_repository(); |
| 371 | 433 | zCount = find_option("n","count",1); |
| 372 | 434 | if( zCount ){ |
| 373 | 435 | n = atoi(zCount); |
| 374 | 436 | }else{ |
| 375 | 437 | n = 20; |
| 376 | 438 | } |
| 377 | - if( g.argc!=2 && g.argc!=3 ){ | |
| 378 | - usage("YYYY-MM-DDtHH:MM:SS"); | |
| 439 | + if( g.argc==4 ){ | |
| 440 | + k = strlen(g.argv[2]); | |
| 441 | + if( strncmp(g.argv[2],"before",k)==0 ){ | |
| 442 | + mode = 1; | |
| 443 | + }else if( strncmp(g.argv[2],"after",k)==0 && k>1 ){ | |
| 444 | + mode = 2; | |
| 445 | + }else if( strncmp(g.argv[2],"descendents",k)==0 ){ | |
| 446 | + mode = 3; | |
| 447 | + }else if( strncmp(g.argv[2],"children",k)==0 ){ | |
| 448 | + mode = 3; | |
| 449 | + }else if( strncmp(g.argv[2],"ancestors",k)==0 && k>1 ){ | |
| 450 | + mode = 4; | |
| 451 | + }else if( strncmp(g.argv[2],"parents",k)==0 ){ | |
| 452 | + mode = 4; | |
| 453 | + }else{ | |
| 454 | + usage("?WHEN? ?UUID|DATETIME?"); | |
| 455 | + } | |
| 456 | + zOrigin = g.argv[3]; | |
| 457 | + }else if( g.argc==3 ){ | |
| 458 | + zOrigin = g.argv[2]; | |
| 459 | + }else{ | |
| 460 | + zOrigin = "now"; | |
| 379 | 461 | } |
| 380 | - if( g.argc==3 ){ | |
| 381 | - zDate = g.argv[2]; | |
| 462 | + k = strlen(zOrigin); | |
| 463 | + blob_zero(&uuid); | |
| 464 | + blob_append(&uuid, zOrigin, -1); | |
| 465 | + if( strcmp(zOrigin, "now")==0 ){ | |
| 466 | + if( mode==3 || mode==4 ){ | |
| 467 | + fossil_fatal("cannot compute descendents or ancestors of a date"); | |
| 468 | + } | |
| 469 | + zDate = mprintf("(SELECT julianday('now','utc'))"); | |
| 470 | + }else if( strncmp(zOrigin, "current", k)==0 ){ | |
| 471 | + objid = db_lget_int("checkout",0); | |
| 472 | + zDate = mprintf("(SELECT mtime FROM plink WHERE cid=%d)", objid); | |
| 473 | + }else if( name_to_uuid(&uuid, 0)==0 ){ | |
| 474 | + objid = db_int(0, "SELECT rid FROM blob WHERE uuid=%B", &uuid); | |
| 475 | + zDate = mprintf("(SELECT mtime FROM plink WHERE cid=%d)", objid); | |
| 382 | 476 | }else{ |
| 383 | - zDate = "now"; | |
| 477 | + if( mode==3 || mode==4 ){ | |
| 478 | + fossil_fatal("cannot compute descendents or ancestors of a date"); | |
| 479 | + } | |
| 480 | + zDate = mprintf("(SELECT julianday(%Q, 'utc'))", zOrigin); | |
| 384 | 481 | } |
| 385 | - db_prepare(&q, | |
| 482 | + zSQL = mprintf( | |
| 386 | 483 | "SELECT blob.rid, uuid, datetime(event.mtime,'localtime')," |
| 387 | 484 | " comment || ' (by ' || user || ')'," |
| 388 | 485 | " (SELECT count(*) FROM plink WHERE pid=blob.rid AND isprim)," |
| 389 | 486 | " (SELECT count(*) FROM plink WHERE cid=blob.rid)" |
| 390 | 487 | " FROM event, blob" |
| 391 | 488 | " WHERE event.type='ci' AND blob.rid=event.objid" |
| 392 | - " AND event.mtime<=(SELECT julianday(%Q,'utc'))" | |
| 393 | - " ORDER BY event.mtime DESC", zDate | |
| 489 | + " AND event.mtime %s %s", | |
| 490 | + (mode==1 || mode==4) ? "<=" : ">=", zDate | |
| 394 | 491 | ); |
| 492 | + if( mode==3 || mode==4 ){ | |
| 493 | + db_multi_exec("CREATE TEMP TABLE ok(rid INTEGER PRIMARY KEY)"); | |
| 494 | + if( mode==3 ){ | |
| 495 | + compute_descendents(objid, n); | |
| 496 | + }else{ | |
| 497 | + compute_ancestors(objid, n); | |
| 498 | + } | |
| 499 | + zSQL = mprintf("%z AND blob.rid IN ok", zSQL); | |
| 500 | + } | |
| 501 | + zSQL = mprintf("%z ORDER BY event.mtime DESC", zSQL); | |
| 502 | + db_prepare(&q, zSQL); | |
| 395 | 503 | print_timeline(&q, n); |
| 396 | 504 | db_finalize(&q); |
| 397 | 505 | } |
| 398 | 506 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -22,10 +22,11 @@ | |
| 22 | ******************************************************************************* |
| 23 | ** |
| 24 | ** This file contains code to implement the timeline web page |
| 25 | ** |
| 26 | */ |
| 27 | #include "config.h" |
| 28 | #include "timeline.h" |
| 29 | |
| 30 | /* |
| 31 | ** Generate a hyperlink to a version. |
| @@ -87,24 +88,37 @@ | |
| 87 | ** 6. Number of parents |
| 88 | ** 7. True if is a leaf |
| 89 | */ |
| 90 | void www_print_timeline( |
| 91 | Stmt *pQuery, |
| 92 | char *zLastDate, |
| 93 | int (*xCallback)(int, Blob*), |
| 94 | Blob *pArg |
| 95 | ){ |
| 96 | char zPrevDate[20]; |
| 97 | zPrevDate[0] = 0; |
| 98 | @ <table cellspacing=0 border=0 cellpadding=0> |
| 99 | while( db_step(pQuery)==SQLITE_ROW ){ |
| 100 | int rid = db_column_int(pQuery, 0); |
| 101 | const char *zUuid = db_column_text(pQuery, 1); |
| 102 | int nPChild = db_column_int(pQuery, 5); |
| 103 | int nParent = db_column_int(pQuery, 6); |
| 104 | int isLeaf = db_column_int(pQuery, 7); |
| 105 | const char *zDate = db_column_text(pQuery, 2); |
| 106 | if( xCallback ){ |
| 107 | xCallback(rid, pArg); |
| 108 | } |
| 109 | if( memcmp(zDate, zPrevDate, 10) ){ |
| 110 | sprintf(zPrevDate, "%.10s", zDate); |
| @@ -132,13 +146,10 @@ | |
| 132 | if( isLeaf ){ |
| 133 | @ <b>Leaf</b> |
| 134 | } |
| 135 | @ %h(db_column_text(pQuery,3)) |
| 136 | @ (by %h(db_column_text(pQuery,4)))</td></tr> |
| 137 | if( zLastDate ){ |
| 138 | strcpy(zLastDate, zDate); |
| 139 | } |
| 140 | } |
| 141 | @ </table> |
| 142 | } |
| 143 | |
| 144 | /* |
| @@ -172,18 +183,33 @@ | |
| 172 | return 0; |
| 173 | } |
| 174 | |
| 175 | /* |
| 176 | ** WEBPAGE: timeline |
| 177 | */ |
| 178 | void page_timeline(void){ |
| 179 | Stmt q; |
| 180 | char *zSQL; |
| 181 | Blob scriptInit; |
| 182 | char zDate[100]; |
| 183 | const char *zStart = P("d"); |
| 184 | int nEntry = atoi(PD("n","25")); |
| 185 | |
| 186 | /* To view the timeline, must have permission to read project data. |
| 187 | */ |
| 188 | login_check_credentials(); |
| 189 | if( !g.okRead ){ login_needed(); return; } |
| @@ -202,23 +228,46 @@ | |
| 202 | " (SELECT count(*) FROM plink WHERE cid=blob.rid)," |
| 203 | " NOT EXISTS (SELECT 1 FROM plink WHERE pid=blob.rid)" |
| 204 | " FROM event, blob" |
| 205 | " WHERE event.type='ci' AND blob.rid=event.objid" |
| 206 | ); |
| 207 | if( zStart ){ |
| 208 | while( isspace(zStart[0]) ){ zStart++; } |
| 209 | if( zStart[0] ){ |
| 210 | zSQL = mprintf("%z AND event.mtime<=julianday(%Q, 'localtime')", |
| 211 | zSQL, zStart); |
| 212 | } |
| 213 | } |
| 214 | zSQL = mprintf("%z ORDER BY event.mtime DESC LIMIT %d", zSQL, nEntry); |
| 215 | db_prepare(&q, zSQL); |
| 216 | free(zSQL); |
| 217 | zDate[0] = 0; |
| 218 | blob_zero(&scriptInit); |
| 219 | www_print_timeline(&q, zDate, save_parentage_javascript, &scriptInit); |
| 220 | db_finalize(&q); |
| 221 | if( zStart==0 ){ |
| 222 | zStart = zDate; |
| 223 | } |
| 224 | @ <script> |
| @@ -350,48 +399,107 @@ | |
| 350 | |
| 351 | |
| 352 | /* |
| 353 | ** COMMAND: timeline |
| 354 | ** |
| 355 | ** Usage: %fossil timeline ?DATETIME? ?-n|--count N? |
| 356 | ** |
| 357 | ** Print a summary of activity going backwards in date and time |
| 358 | ** specified or from the current date and time if no arguments |
| 359 | ** are given. Show as many as N (default 20) check-ins. |
| 360 | ** |
| 361 | ** The date and time should be in the ISO8601 format. For |
| 362 | ** examples: "2007-08-18 07:21:21". The time may be omitted. |
| 363 | ** Times are according to the local timezone. |
| 364 | */ |
| 365 | void timeline_cmd(void){ |
| 366 | Stmt q; |
| 367 | int n; |
| 368 | const char *zCount; |
| 369 | char *zDate; |
| 370 | db_find_and_open_repository(); |
| 371 | zCount = find_option("n","count",1); |
| 372 | if( zCount ){ |
| 373 | n = atoi(zCount); |
| 374 | }else{ |
| 375 | n = 20; |
| 376 | } |
| 377 | if( g.argc!=2 && g.argc!=3 ){ |
| 378 | usage("YYYY-MM-DDtHH:MM:SS"); |
| 379 | } |
| 380 | if( g.argc==3 ){ |
| 381 | zDate = g.argv[2]; |
| 382 | }else{ |
| 383 | zDate = "now"; |
| 384 | } |
| 385 | db_prepare(&q, |
| 386 | "SELECT blob.rid, uuid, datetime(event.mtime,'localtime')," |
| 387 | " comment || ' (by ' || user || ')'," |
| 388 | " (SELECT count(*) FROM plink WHERE pid=blob.rid AND isprim)," |
| 389 | " (SELECT count(*) FROM plink WHERE cid=blob.rid)" |
| 390 | " FROM event, blob" |
| 391 | " WHERE event.type='ci' AND blob.rid=event.objid" |
| 392 | " AND event.mtime<=(SELECT julianday(%Q,'utc'))" |
| 393 | " ORDER BY event.mtime DESC", zDate |
| 394 | ); |
| 395 | print_timeline(&q, n); |
| 396 | db_finalize(&q); |
| 397 | } |
| 398 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -22,10 +22,11 @@ | |
| 22 | ******************************************************************************* |
| 23 | ** |
| 24 | ** This file contains code to implement the timeline web page |
| 25 | ** |
| 26 | */ |
| 27 | #include <string.h> |
| 28 | #include "config.h" |
| 29 | #include "timeline.h" |
| 30 | |
| 31 | /* |
| 32 | ** Generate a hyperlink to a version. |
| @@ -87,24 +88,37 @@ | |
| 88 | ** 6. Number of parents |
| 89 | ** 7. True if is a leaf |
| 90 | */ |
| 91 | void www_print_timeline( |
| 92 | Stmt *pQuery, |
| 93 | int *pFirstEvent, |
| 94 | int *pLastEvent, |
| 95 | int (*xCallback)(int, Blob*), |
| 96 | Blob *pArg |
| 97 | ){ |
| 98 | char zPrevDate[20]; |
| 99 | int cnt = 0; |
| 100 | zPrevDate[0] = 0; |
| 101 | db_multi_exec( |
| 102 | "CREATE TEMP TABLE IF NOT EXISTS seen(rid INTEGER PRIMARY KEY);" |
| 103 | "DELETE FROM seen;" |
| 104 | ); |
| 105 | @ <table cellspacing=0 border=0 cellpadding=0> |
| 106 | while( db_step(pQuery)==SQLITE_ROW ){ |
| 107 | int rid = db_column_int(pQuery, 0); |
| 108 | const char *zUuid = db_column_text(pQuery, 1); |
| 109 | int nPChild = db_column_int(pQuery, 5); |
| 110 | int nParent = db_column_int(pQuery, 6); |
| 111 | int isLeaf = db_column_int(pQuery, 7); |
| 112 | const char *zDate = db_column_text(pQuery, 2); |
| 113 | if( cnt==0 && pFirstEvent ){ |
| 114 | *pFirstEvent = rid; |
| 115 | } |
| 116 | if( pLastEvent ){ |
| 117 | *pLastEvent = rid; |
| 118 | } |
| 119 | db_multi_exec("INSERT OR IGNORE INTO seen VALUES(%d)", rid); |
| 120 | if( xCallback ){ |
| 121 | xCallback(rid, pArg); |
| 122 | } |
| 123 | if( memcmp(zDate, zPrevDate, 10) ){ |
| 124 | sprintf(zPrevDate, "%.10s", zDate); |
| @@ -132,13 +146,10 @@ | |
| 146 | if( isLeaf ){ |
| 147 | @ <b>Leaf</b> |
| 148 | } |
| 149 | @ %h(db_column_text(pQuery,3)) |
| 150 | @ (by %h(db_column_text(pQuery,4)))</td></tr> |
| 151 | } |
| 152 | @ </table> |
| 153 | } |
| 154 | |
| 155 | /* |
| @@ -172,18 +183,33 @@ | |
| 183 | return 0; |
| 184 | } |
| 185 | |
| 186 | /* |
| 187 | ** WEBPAGE: timeline |
| 188 | ** |
| 189 | ** Query parameters: |
| 190 | ** |
| 191 | ** d=STARTDATE date in iso8601 notation. dflt: newest event |
| 192 | ** n=INTEGER number of events to show. dflt: 25 |
| 193 | ** e=INTEGER starting event id. dflt: nil |
| 194 | ** u=NAME show only events from user. dflt: nil |
| 195 | ** a show events after and including. dflt: false |
| 196 | ** r show only related events. dflt: false |
| 197 | */ |
| 198 | void page_timeline(void){ |
| 199 | Stmt q; |
| 200 | char *zSQL; |
| 201 | Blob scriptInit; |
| 202 | char zDate[100]; |
| 203 | const char *zStart = P("d"); |
| 204 | int nEntry = atoi(PD("n","20")); |
| 205 | const char *zUser = P("u"); |
| 206 | int objid = atoi(PD("e","0")); |
| 207 | int relatedEvents = P("r")!=0; |
| 208 | int afterFlag = P("a")!=0; |
| 209 | int firstEvent; |
| 210 | int lastEvent; |
| 211 | |
| 212 | /* To view the timeline, must have permission to read project data. |
| 213 | */ |
| 214 | login_check_credentials(); |
| 215 | if( !g.okRead ){ login_needed(); return; } |
| @@ -202,23 +228,46 @@ | |
| 228 | " (SELECT count(*) FROM plink WHERE cid=blob.rid)," |
| 229 | " NOT EXISTS (SELECT 1 FROM plink WHERE pid=blob.rid)" |
| 230 | " FROM event, blob" |
| 231 | " WHERE event.type='ci' AND blob.rid=event.objid" |
| 232 | ); |
| 233 | if( zUser ){ |
| 234 | zSQL = mprintf("%z AND event.user=%Q", zSQL, zUser); |
| 235 | } |
| 236 | if( objid ){ |
| 237 | char *z = db_text(0, "SELECT datetime(event.mtime) FROM event" |
| 238 | " WHERE objid=%d", objid); |
| 239 | if( z ){ |
| 240 | zStart = z; |
| 241 | } |
| 242 | } |
| 243 | if( zStart ){ |
| 244 | while( isspace(zStart[0]) ){ zStart++; } |
| 245 | if( zStart[0] ){ |
| 246 | zSQL = mprintf("%z AND event.mtime %s julianday(%Q, 'localtime')", |
| 247 | zSQL, afterFlag ? ">=" : "<=", zStart); |
| 248 | } |
| 249 | } |
| 250 | if( relatedEvents && objid ){ |
| 251 | db_multi_exec( |
| 252 | "CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY)" |
| 253 | ); |
| 254 | if( afterFlag ){ |
| 255 | compute_descendents(objid, nEntry); |
| 256 | }else{ |
| 257 | compute_ancestors(objid, nEntry); |
| 258 | } |
| 259 | zSQL = mprintf("%z AND event.objid IN ok", zSQL); |
| 260 | } |
| 261 | zSQL = mprintf("%z ORDER BY event.mtime DESC LIMIT %d", zSQL, nEntry); |
| 262 | db_prepare(&q, zSQL); |
| 263 | free(zSQL); |
| 264 | zDate[0] = 0; |
| 265 | blob_zero(&scriptInit); |
| 266 | zDate[0] = 0; |
| 267 | www_print_timeline(&q, &firstEvent, &lastEvent, |
| 268 | save_parentage_javascript, &scriptInit); |
| 269 | db_finalize(&q); |
| 270 | if( zStart==0 ){ |
| 271 | zStart = zDate; |
| 272 | } |
| 273 | @ <script> |
| @@ -350,48 +399,107 @@ | |
| 399 | |
| 400 | |
| 401 | /* |
| 402 | ** COMMAND: timeline |
| 403 | ** |
| 404 | ** Usage: %fossil timeline ?WHEN? ?UUID|DATETIME? ?-n|--count N? |
| 405 | ** |
| 406 | ** Print a summary of activity going backwards in date and time |
| 407 | ** specified or from the current date and time if no arguments |
| 408 | ** are given. Show as many as N (default 20) check-ins. The |
| 409 | ** WHEN argument can be any unique abbreviation of one of these |
| 410 | ** keywords: |
| 411 | ** |
| 412 | ** before |
| 413 | ** after |
| 414 | ** descendents | children |
| 415 | ** ancestors | parents |
| 416 | ** |
| 417 | ** The UUID can be any unique prefix of 4 characters or more. |
| 418 | ** The DATETIME should be in the ISO8601 format. For |
| 419 | ** examples: "2007-08-18 07:21:21". You can also say "current" |
| 420 | ** for the current version or "now" for the current time. |
| 421 | */ |
| 422 | void timeline_cmd(void){ |
| 423 | Stmt q; |
| 424 | int n, k; |
| 425 | const char *zCount; |
| 426 | char *zOrigin; |
| 427 | char *zDate; |
| 428 | char *zSQL; |
| 429 | int objid = 0; |
| 430 | Blob uuid; |
| 431 | int mode = 1 ; /* 1: before 2:after 3:children 4:parents */ |
| 432 | db_find_and_open_repository(); |
| 433 | zCount = find_option("n","count",1); |
| 434 | if( zCount ){ |
| 435 | n = atoi(zCount); |
| 436 | }else{ |
| 437 | n = 20; |
| 438 | } |
| 439 | if( g.argc==4 ){ |
| 440 | k = strlen(g.argv[2]); |
| 441 | if( strncmp(g.argv[2],"before",k)==0 ){ |
| 442 | mode = 1; |
| 443 | }else if( strncmp(g.argv[2],"after",k)==0 && k>1 ){ |
| 444 | mode = 2; |
| 445 | }else if( strncmp(g.argv[2],"descendents",k)==0 ){ |
| 446 | mode = 3; |
| 447 | }else if( strncmp(g.argv[2],"children",k)==0 ){ |
| 448 | mode = 3; |
| 449 | }else if( strncmp(g.argv[2],"ancestors",k)==0 && k>1 ){ |
| 450 | mode = 4; |
| 451 | }else if( strncmp(g.argv[2],"parents",k)==0 ){ |
| 452 | mode = 4; |
| 453 | }else{ |
| 454 | usage("?WHEN? ?UUID|DATETIME?"); |
| 455 | } |
| 456 | zOrigin = g.argv[3]; |
| 457 | }else if( g.argc==3 ){ |
| 458 | zOrigin = g.argv[2]; |
| 459 | }else{ |
| 460 | zOrigin = "now"; |
| 461 | } |
| 462 | k = strlen(zOrigin); |
| 463 | blob_zero(&uuid); |
| 464 | blob_append(&uuid, zOrigin, -1); |
| 465 | if( strcmp(zOrigin, "now")==0 ){ |
| 466 | if( mode==3 || mode==4 ){ |
| 467 | fossil_fatal("cannot compute descendents or ancestors of a date"); |
| 468 | } |
| 469 | zDate = mprintf("(SELECT julianday('now','utc'))"); |
| 470 | }else if( strncmp(zOrigin, "current", k)==0 ){ |
| 471 | objid = db_lget_int("checkout",0); |
| 472 | zDate = mprintf("(SELECT mtime FROM plink WHERE cid=%d)", objid); |
| 473 | }else if( name_to_uuid(&uuid, 0)==0 ){ |
| 474 | objid = db_int(0, "SELECT rid FROM blob WHERE uuid=%B", &uuid); |
| 475 | zDate = mprintf("(SELECT mtime FROM plink WHERE cid=%d)", objid); |
| 476 | }else{ |
| 477 | if( mode==3 || mode==4 ){ |
| 478 | fossil_fatal("cannot compute descendents or ancestors of a date"); |
| 479 | } |
| 480 | zDate = mprintf("(SELECT julianday(%Q, 'utc'))", zOrigin); |
| 481 | } |
| 482 | zSQL = mprintf( |
| 483 | "SELECT blob.rid, uuid, datetime(event.mtime,'localtime')," |
| 484 | " comment || ' (by ' || user || ')'," |
| 485 | " (SELECT count(*) FROM plink WHERE pid=blob.rid AND isprim)," |
| 486 | " (SELECT count(*) FROM plink WHERE cid=blob.rid)" |
| 487 | " FROM event, blob" |
| 488 | " WHERE event.type='ci' AND blob.rid=event.objid" |
| 489 | " AND event.mtime %s %s", |
| 490 | (mode==1 || mode==4) ? "<=" : ">=", zDate |
| 491 | ); |
| 492 | if( mode==3 || mode==4 ){ |
| 493 | db_multi_exec("CREATE TEMP TABLE ok(rid INTEGER PRIMARY KEY)"); |
| 494 | if( mode==3 ){ |
| 495 | compute_descendents(objid, n); |
| 496 | }else{ |
| 497 | compute_ancestors(objid, n); |
| 498 | } |
| 499 | zSQL = mprintf("%z AND blob.rid IN ok", zSQL); |
| 500 | } |
| 501 | zSQL = mprintf("%z ORDER BY event.mtime DESC", zSQL); |
| 502 | db_prepare(&q, zSQL); |
| 503 | print_timeline(&q, n); |
| 504 | db_finalize(&q); |
| 505 | } |
| 506 |
+146
-5
| --- src/wiki.c | ||
| +++ src/wiki.c | ||
| @@ -25,20 +25,161 @@ | ||
| 25 | 25 | */ |
| 26 | 26 | #include <assert.h> |
| 27 | 27 | #include "config.h" |
| 28 | 28 | #include "wiki.h" |
| 29 | 29 | |
| 30 | + | |
| 31 | +/* | |
| 32 | +** Create a fake replicate of the "vfile" table as a TEMP table | |
| 33 | +** using the manifest identified by manid. | |
| 34 | +*/ | |
| 35 | +static void create_fake_vfile(int manid){ | |
| 36 | + static const char zVfileDef[] = | |
| 37 | + @ CREATE TEMP TABLE vfile( | |
| 38 | + @ id INTEGER PRIMARY KEY, -- ID of the checked out file | |
| 39 | + @ vid INTEGER REFERENCES blob, -- The version this file is part of. | |
| 40 | + @ chnged INT DEFAULT 0, -- 0:unchnged 1:edited 2:m-chng 3:m-add | |
| 41 | + @ deleted BOOLEAN DEFAULT 0, -- True if deleted | |
| 42 | + @ rid INTEGER, -- Originally from this repository record | |
| 43 | + @ mrid INTEGER, -- Based on this record due to a merge | |
| 44 | + @ pathname TEXT, -- Full pathname | |
| 45 | + @ UNIQUE(pathname,vid) | |
| 46 | + @ ); | |
| 47 | + ; | |
| 48 | + db_multi_exec(zVfileDef); | |
| 49 | + load_vfile_from_rid(manid); | |
| 50 | +} | |
| 51 | + | |
| 52 | +/* | |
| 53 | +** Locate the wiki page with the name zPageName and render it. | |
| 54 | +*/ | |
| 55 | +static void locate_and_render_wikipage(const char *zPageName){ | |
| 56 | + Stmt q; | |
| 57 | + int id = 0; | |
| 58 | + int rid = 0; | |
| 59 | + int chnged = 0; | |
| 60 | + char *zPathname = 0; | |
| 61 | + db_prepare(&q, | |
| 62 | + "SELECT id, rid, chnged, pathname FROM vfile" | |
| 63 | + " WHERE (pathname='%q.wiki' OR pathname LIKE '%%/%q.wiki')" | |
| 64 | + " AND NOT deleted", zPageName, zPageName | |
| 65 | + ); | |
| 66 | + if( db_step(&q)==SQLITE_ROW ){ | |
| 67 | + id = db_column_int(&q, 0); | |
| 68 | + rid = db_column_int(&q, 1); | |
| 69 | + chnged = db_column_int(&q, 2); | |
| 70 | + if( chnged || rid==0 ){ | |
| 71 | + zPathname = db_column_malloc(&q, 3); | |
| 72 | + } | |
| 73 | + } | |
| 74 | + db_finalize(&q); | |
| 75 | + if( id ){ | |
| 76 | + Blob page, src; | |
| 77 | + char *zTitle = "wiki"; | |
| 78 | + char *z; | |
| 79 | + blob_zero(&src); | |
| 80 | + if( zPathname ){ | |
| 81 | + zPathname = mprintf("%s/%z", g.zLocalRoot, zPathname); | |
| 82 | + blob_read_from_file(&src, zPathname); | |
| 83 | + free(zPathname); | |
| 84 | + }else{ | |
| 85 | + content_get(rid, &src); | |
| 86 | + } | |
| 87 | + | |
| 88 | + /* The wiki page content is now in src. Check to see if | |
| 89 | + ** there is a <readonly/> or <appendonly/> element at the | |
| 90 | + ** beginning of the content. | |
| 91 | + */ | |
| 92 | + z = blob_str(&src); | |
| 93 | + while( isspace(*z) ) z++; | |
| 94 | + if( strncmp(z, "<readonly/>", 11)==0 ){ | |
| 95 | + z += 11; | |
| 96 | + }else if( strncmp(z, "<appendonly/>", 13)==0 ){ | |
| 97 | + z += 13; | |
| 98 | + } | |
| 99 | + | |
| 100 | + /* Check for <title>...</title> markup and remove it if present. */ | |
| 101 | + while( isspace(*z) ) z++; | |
| 102 | + if( strncmp(z, "<title>", 7)==0 ){ | |
| 103 | + int i; | |
| 104 | + for(i=7; z[i] && z[i]!='<'; i++){} | |
| 105 | + if( z[i]=='<' && strncmp(&z[i], "</title>", 8)==0 ){ | |
| 106 | + zTitle = htmlize(&z[7], i-7); | |
| 107 | + z = &z[i+8]; | |
| 108 | + } | |
| 109 | + } | |
| 110 | + | |
| 111 | + /* Render the page */ | |
| 112 | + style_header(zTitle); | |
| 113 | + blob_init(&page, z, -1); | |
| 114 | + wiki_convert(&page, cgi_output_blob(), WIKI_HTML); | |
| 115 | + blob_reset(&src); | |
| 116 | + }else{ | |
| 117 | + style_header("Unknown Wiki Page"); | |
| 118 | + @ The wiki page "%h(zPageName)" does not exist. | |
| 119 | + } | |
| 120 | + style_footer(); | |
| 121 | +} | |
| 122 | + | |
| 30 | 123 | /* |
| 31 | 124 | ** WEBPAGE: wiki |
| 125 | +** URL: /wiki/PAGENAME | |
| 32 | 126 | ** |
| 33 | -** Render the wiki page that is named after the /wiki/ part of | |
| 34 | -** the url. | |
| 127 | +** If the local database is available (which only happens if run | |
| 128 | +** as "server" instead of "cgi" or "http") then the file is taken | |
| 129 | +** from the local checkout. If there is no local checkout, then | |
| 130 | +** the content is taken from the "head" baseline. | |
| 35 | 131 | */ |
| 36 | 132 | void wiki_page(void){ |
| 37 | - style_header("Wiki"); | |
| 38 | - @ extra=%h(g.zExtra) | |
| 39 | - style_footer(); | |
| 133 | + login_check_credentials(); | |
| 134 | + if( !g.okRdWiki ){ login_needed(); return; } | |
| 135 | + if( !g.localOpen ){ | |
| 136 | + int headid = db_int(0, | |
| 137 | + "SELECT cid FROM plink ORDER BY mtime DESC LIMIT 1" | |
| 138 | + ); | |
| 139 | + create_fake_vfile(headid); | |
| 140 | + } | |
| 141 | + locate_and_render_wikipage(g.zExtra); | |
| 142 | +} | |
| 143 | + | |
| 144 | +/* | |
| 145 | +** The g.zExtra value is of the form UUID/otherstuff. | |
| 146 | +** Extract the UUID and convert it to a record id. Leave | |
| 147 | +** g.zExtra holding just otherstuff. If UUID does not exist | |
| 148 | +** or is malformed, return 0 and leave g.zExtra unchanged. | |
| 149 | +*/ | |
| 150 | +int extract_uuid_from_url(void){ | |
| 151 | + int i, rid; | |
| 152 | + Blob uuid; | |
| 153 | + for(i=0; g.zExtra[i] && g.zExtra[i]!='/'; i++){} | |
| 154 | + blob_zero(&uuid); | |
| 155 | + blob_append(&uuid, g.zExtra, i); | |
| 156 | + rid = name_to_uuid(&uuid, 0); | |
| 157 | + blob_reset(&uuid); | |
| 158 | + if( rid ){ | |
| 159 | + while( g.zExtra[i]=='/' ){ i++; } | |
| 160 | + g.zExtra = &g.zExtra[i]; | |
| 161 | + } | |
| 162 | + return rid; | |
| 163 | +} | |
| 164 | + | |
| 165 | +/* | |
| 166 | +** WEBPAGE: bwiki | |
| 167 | +** URL: /bwiki/UUID/PAGENAME | |
| 168 | +** | |
| 169 | +** UUID specifies a baseline. Render the wiki page PAGENAME as | |
| 170 | +** it appears in that baseline. | |
| 171 | +*/ | |
| 172 | +void bwiki_page(void){ | |
| 173 | + int headid; | |
| 174 | + login_check_credentials(); | |
| 175 | + if( !g.okRdWiki || !g.okHistory ){ login_needed(); return; } | |
| 176 | + headid = extract_uuid_from_url(); | |
| 177 | + if( headid ){ | |
| 178 | + create_fake_vfile(headid); | |
| 179 | + } | |
| 180 | + locate_and_render_wikipage(g.zExtra); | |
| 40 | 181 | } |
| 41 | 182 | |
| 42 | 183 | /* |
| 43 | 184 | ** WEBPAGE: ambiguous |
| 44 | 185 | ** |
| 45 | 186 |
| --- src/wiki.c | |
| +++ src/wiki.c | |
| @@ -25,20 +25,161 @@ | |
| 25 | */ |
| 26 | #include <assert.h> |
| 27 | #include "config.h" |
| 28 | #include "wiki.h" |
| 29 | |
| 30 | /* |
| 31 | ** WEBPAGE: wiki |
| 32 | ** |
| 33 | ** Render the wiki page that is named after the /wiki/ part of |
| 34 | ** the url. |
| 35 | */ |
| 36 | void wiki_page(void){ |
| 37 | style_header("Wiki"); |
| 38 | @ extra=%h(g.zExtra) |
| 39 | style_footer(); |
| 40 | } |
| 41 | |
| 42 | /* |
| 43 | ** WEBPAGE: ambiguous |
| 44 | ** |
| 45 |
| --- src/wiki.c | |
| +++ src/wiki.c | |
| @@ -25,20 +25,161 @@ | |
| 25 | */ |
| 26 | #include <assert.h> |
| 27 | #include "config.h" |
| 28 | #include "wiki.h" |
| 29 | |
| 30 | |
| 31 | /* |
| 32 | ** Create a fake replicate of the "vfile" table as a TEMP table |
| 33 | ** using the manifest identified by manid. |
| 34 | */ |
| 35 | static void create_fake_vfile(int manid){ |
| 36 | static const char zVfileDef[] = |
| 37 | @ CREATE TEMP TABLE vfile( |
| 38 | @ id INTEGER PRIMARY KEY, -- ID of the checked out file |
| 39 | @ vid INTEGER REFERENCES blob, -- The version this file is part of. |
| 40 | @ chnged INT DEFAULT 0, -- 0:unchnged 1:edited 2:m-chng 3:m-add |
| 41 | @ deleted BOOLEAN DEFAULT 0, -- True if deleted |
| 42 | @ rid INTEGER, -- Originally from this repository record |
| 43 | @ mrid INTEGER, -- Based on this record due to a merge |
| 44 | @ pathname TEXT, -- Full pathname |
| 45 | @ UNIQUE(pathname,vid) |
| 46 | @ ); |
| 47 | ; |
| 48 | db_multi_exec(zVfileDef); |
| 49 | load_vfile_from_rid(manid); |
| 50 | } |
| 51 | |
| 52 | /* |
| 53 | ** Locate the wiki page with the name zPageName and render it. |
| 54 | */ |
| 55 | static void locate_and_render_wikipage(const char *zPageName){ |
| 56 | Stmt q; |
| 57 | int id = 0; |
| 58 | int rid = 0; |
| 59 | int chnged = 0; |
| 60 | char *zPathname = 0; |
| 61 | db_prepare(&q, |
| 62 | "SELECT id, rid, chnged, pathname FROM vfile" |
| 63 | " WHERE (pathname='%q.wiki' OR pathname LIKE '%%/%q.wiki')" |
| 64 | " AND NOT deleted", zPageName, zPageName |
| 65 | ); |
| 66 | if( db_step(&q)==SQLITE_ROW ){ |
| 67 | id = db_column_int(&q, 0); |
| 68 | rid = db_column_int(&q, 1); |
| 69 | chnged = db_column_int(&q, 2); |
| 70 | if( chnged || rid==0 ){ |
| 71 | zPathname = db_column_malloc(&q, 3); |
| 72 | } |
| 73 | } |
| 74 | db_finalize(&q); |
| 75 | if( id ){ |
| 76 | Blob page, src; |
| 77 | char *zTitle = "wiki"; |
| 78 | char *z; |
| 79 | blob_zero(&src); |
| 80 | if( zPathname ){ |
| 81 | zPathname = mprintf("%s/%z", g.zLocalRoot, zPathname); |
| 82 | blob_read_from_file(&src, zPathname); |
| 83 | free(zPathname); |
| 84 | }else{ |
| 85 | content_get(rid, &src); |
| 86 | } |
| 87 | |
| 88 | /* The wiki page content is now in src. Check to see if |
| 89 | ** there is a <readonly/> or <appendonly/> element at the |
| 90 | ** beginning of the content. |
| 91 | */ |
| 92 | z = blob_str(&src); |
| 93 | while( isspace(*z) ) z++; |
| 94 | if( strncmp(z, "<readonly/>", 11)==0 ){ |
| 95 | z += 11; |
| 96 | }else if( strncmp(z, "<appendonly/>", 13)==0 ){ |
| 97 | z += 13; |
| 98 | } |
| 99 | |
| 100 | /* Check for <title>...</title> markup and remove it if present. */ |
| 101 | while( isspace(*z) ) z++; |
| 102 | if( strncmp(z, "<title>", 7)==0 ){ |
| 103 | int i; |
| 104 | for(i=7; z[i] && z[i]!='<'; i++){} |
| 105 | if( z[i]=='<' && strncmp(&z[i], "</title>", 8)==0 ){ |
| 106 | zTitle = htmlize(&z[7], i-7); |
| 107 | z = &z[i+8]; |
| 108 | } |
| 109 | } |
| 110 | |
| 111 | /* Render the page */ |
| 112 | style_header(zTitle); |
| 113 | blob_init(&page, z, -1); |
| 114 | wiki_convert(&page, cgi_output_blob(), WIKI_HTML); |
| 115 | blob_reset(&src); |
| 116 | }else{ |
| 117 | style_header("Unknown Wiki Page"); |
| 118 | @ The wiki page "%h(zPageName)" does not exist. |
| 119 | } |
| 120 | style_footer(); |
| 121 | } |
| 122 | |
| 123 | /* |
| 124 | ** WEBPAGE: wiki |
| 125 | ** URL: /wiki/PAGENAME |
| 126 | ** |
| 127 | ** If the local database is available (which only happens if run |
| 128 | ** as "server" instead of "cgi" or "http") then the file is taken |
| 129 | ** from the local checkout. If there is no local checkout, then |
| 130 | ** the content is taken from the "head" baseline. |
| 131 | */ |
| 132 | void wiki_page(void){ |
| 133 | login_check_credentials(); |
| 134 | if( !g.okRdWiki ){ login_needed(); return; } |
| 135 | if( !g.localOpen ){ |
| 136 | int headid = db_int(0, |
| 137 | "SELECT cid FROM plink ORDER BY mtime DESC LIMIT 1" |
| 138 | ); |
| 139 | create_fake_vfile(headid); |
| 140 | } |
| 141 | locate_and_render_wikipage(g.zExtra); |
| 142 | } |
| 143 | |
| 144 | /* |
| 145 | ** The g.zExtra value is of the form UUID/otherstuff. |
| 146 | ** Extract the UUID and convert it to a record id. Leave |
| 147 | ** g.zExtra holding just otherstuff. If UUID does not exist |
| 148 | ** or is malformed, return 0 and leave g.zExtra unchanged. |
| 149 | */ |
| 150 | int extract_uuid_from_url(void){ |
| 151 | int i, rid; |
| 152 | Blob uuid; |
| 153 | for(i=0; g.zExtra[i] && g.zExtra[i]!='/'; i++){} |
| 154 | blob_zero(&uuid); |
| 155 | blob_append(&uuid, g.zExtra, i); |
| 156 | rid = name_to_uuid(&uuid, 0); |
| 157 | blob_reset(&uuid); |
| 158 | if( rid ){ |
| 159 | while( g.zExtra[i]=='/' ){ i++; } |
| 160 | g.zExtra = &g.zExtra[i]; |
| 161 | } |
| 162 | return rid; |
| 163 | } |
| 164 | |
| 165 | /* |
| 166 | ** WEBPAGE: bwiki |
| 167 | ** URL: /bwiki/UUID/PAGENAME |
| 168 | ** |
| 169 | ** UUID specifies a baseline. Render the wiki page PAGENAME as |
| 170 | ** it appears in that baseline. |
| 171 | */ |
| 172 | void bwiki_page(void){ |
| 173 | int headid; |
| 174 | login_check_credentials(); |
| 175 | if( !g.okRdWiki || !g.okHistory ){ login_needed(); return; } |
| 176 | headid = extract_uuid_from_url(); |
| 177 | if( headid ){ |
| 178 | create_fake_vfile(headid); |
| 179 | } |
| 180 | locate_and_render_wikipage(g.zExtra); |
| 181 | } |
| 182 | |
| 183 | /* |
| 184 | ** WEBPAGE: ambiguous |
| 185 | ** |
| 186 |
+5
-4
| --- src/wikiformat.c | ||
| +++ src/wikiformat.c | ||
| @@ -319,10 +319,11 @@ | ||
| 319 | 319 | if( z[n]!='>' && !isspace(z[n]) ) return 0; |
| 320 | 320 | while( z[n] && (z[n]!='>' || inparen) ){ |
| 321 | 321 | if( z[n]=='"' ){ |
| 322 | 322 | inparen = !inparen; |
| 323 | 323 | } |
| 324 | + n++; | |
| 324 | 325 | } |
| 325 | 326 | if( z[n]!='>' ) return 0; |
| 326 | 327 | return n+1; |
| 327 | 328 | } |
| 328 | 329 | |
| @@ -712,14 +713,14 @@ | ||
| 712 | 713 | /* TBD */ |
| 713 | 714 | } |
| 714 | 715 | |
| 715 | 716 | /* |
| 716 | 717 | ** Resolve a hyperlink. The argument is the content of the [...] |
| 717 | -** in the wiki. Append the URL to the given blob. | |
| 718 | +** in the wiki. Append the URL to the output of the Renderer. | |
| 718 | 719 | */ |
| 719 | -static void resolveHyperlink(const char *zTarget, Blob *pOut){ | |
| 720 | - blob_appendf(pOut, "http://www.fossil-scm.org/test-%T", zTarget); | |
| 720 | +static void resolveHyperlink(const char *zTarget, Renderer *p){ | |
| 721 | + blob_appendf(p->pOut, "http://www.fossil-scm.org/test-%T", zTarget); | |
| 721 | 722 | } |
| 722 | 723 | |
| 723 | 724 | /* |
| 724 | 725 | ** Check to see if the given parsed markup is the correct |
| 725 | 726 | ** </verbatim> tag. |
| @@ -804,11 +805,11 @@ | ||
| 804 | 805 | zDisplay = zTarget; |
| 805 | 806 | }else{ |
| 806 | 807 | while( isspace(*zDisplay) ) zDisplay++; |
| 807 | 808 | } |
| 808 | 809 | blob_append(p->pOut, "<a href=\"", -1); |
| 809 | - resolveHyperlink(zTarget, p->pOut); | |
| 810 | + resolveHyperlink(zTarget, p); | |
| 810 | 811 | blob_append(p->pOut, "\">", -1); |
| 811 | 812 | savedState = p->state; |
| 812 | 813 | p->state &= ~ALLOW_WIKI; |
| 813 | 814 | p->state |= FONT_MARKUP_ONLY; |
| 814 | 815 | wiki_render(p, zDisplay); |
| 815 | 816 |
| --- src/wikiformat.c | |
| +++ src/wikiformat.c | |
| @@ -319,10 +319,11 @@ | |
| 319 | if( z[n]!='>' && !isspace(z[n]) ) return 0; |
| 320 | while( z[n] && (z[n]!='>' || inparen) ){ |
| 321 | if( z[n]=='"' ){ |
| 322 | inparen = !inparen; |
| 323 | } |
| 324 | } |
| 325 | if( z[n]!='>' ) return 0; |
| 326 | return n+1; |
| 327 | } |
| 328 | |
| @@ -712,14 +713,14 @@ | |
| 712 | /* TBD */ |
| 713 | } |
| 714 | |
| 715 | /* |
| 716 | ** Resolve a hyperlink. The argument is the content of the [...] |
| 717 | ** in the wiki. Append the URL to the given blob. |
| 718 | */ |
| 719 | static void resolveHyperlink(const char *zTarget, Blob *pOut){ |
| 720 | blob_appendf(pOut, "http://www.fossil-scm.org/test-%T", zTarget); |
| 721 | } |
| 722 | |
| 723 | /* |
| 724 | ** Check to see if the given parsed markup is the correct |
| 725 | ** </verbatim> tag. |
| @@ -804,11 +805,11 @@ | |
| 804 | zDisplay = zTarget; |
| 805 | }else{ |
| 806 | while( isspace(*zDisplay) ) zDisplay++; |
| 807 | } |
| 808 | blob_append(p->pOut, "<a href=\"", -1); |
| 809 | resolveHyperlink(zTarget, p->pOut); |
| 810 | blob_append(p->pOut, "\">", -1); |
| 811 | savedState = p->state; |
| 812 | p->state &= ~ALLOW_WIKI; |
| 813 | p->state |= FONT_MARKUP_ONLY; |
| 814 | wiki_render(p, zDisplay); |
| 815 |
| --- src/wikiformat.c | |
| +++ src/wikiformat.c | |
| @@ -319,10 +319,11 @@ | |
| 319 | if( z[n]!='>' && !isspace(z[n]) ) return 0; |
| 320 | while( z[n] && (z[n]!='>' || inparen) ){ |
| 321 | if( z[n]=='"' ){ |
| 322 | inparen = !inparen; |
| 323 | } |
| 324 | n++; |
| 325 | } |
| 326 | if( z[n]!='>' ) return 0; |
| 327 | return n+1; |
| 328 | } |
| 329 | |
| @@ -712,14 +713,14 @@ | |
| 713 | /* TBD */ |
| 714 | } |
| 715 | |
| 716 | /* |
| 717 | ** Resolve a hyperlink. The argument is the content of the [...] |
| 718 | ** in the wiki. Append the URL to the output of the Renderer. |
| 719 | */ |
| 720 | static void resolveHyperlink(const char *zTarget, Renderer *p){ |
| 721 | blob_appendf(p->pOut, "http://www.fossil-scm.org/test-%T", zTarget); |
| 722 | } |
| 723 | |
| 724 | /* |
| 725 | ** Check to see if the given parsed markup is the correct |
| 726 | ** </verbatim> tag. |
| @@ -804,11 +805,11 @@ | |
| 805 | zDisplay = zTarget; |
| 806 | }else{ |
| 807 | while( isspace(*zDisplay) ) zDisplay++; |
| 808 | } |
| 809 | blob_append(p->pOut, "<a href=\"", -1); |
| 810 | resolveHyperlink(zTarget, p); |
| 811 | blob_append(p->pOut, "\">", -1); |
| 812 | savedState = p->state; |
| 813 | p->state &= ~ALLOW_WIKI; |
| 814 | p->state |= FONT_MARKUP_ONLY; |
| 815 | wiki_render(p, zDisplay); |
| 816 |
+131
-172
| --- src/xfer.c | ||
| +++ src/xfer.c | ||
| @@ -234,105 +234,11 @@ | ||
| 234 | 234 | remote_has(rid); |
| 235 | 235 | blob_reset(&uuid); |
| 236 | 236 | } |
| 237 | 237 | |
| 238 | 238 | /* |
| 239 | -** Send the file identified by mid and pUuid. If that file happens | |
| 240 | -** to be a manifest, then also send all of the associated content | |
| 241 | -** files for that manifest. If the file is not a manifest, then this | |
| 242 | -** routine is the equivalent of send_file(). | |
| 243 | -*/ | |
| 244 | -static void send_manifest(Xfer *pXfer, int mid, Blob *pUuid, int srcId){ | |
| 245 | - Stmt q2; | |
| 246 | - send_file(pXfer, mid, pUuid, srcId); | |
| 247 | - db_prepare(&q2, | |
| 248 | - "SELECT pid, uuid, fid FROM mlink, blob" | |
| 249 | - " WHERE rid=fid AND mid=%d", | |
| 250 | - mid | |
| 251 | - ); | |
| 252 | - while( db_step(&q2)==SQLITE_ROW ){ | |
| 253 | - int pid, fid; | |
| 254 | - Blob uuid; | |
| 255 | - pid = db_column_int(&q2, 0); | |
| 256 | - db_ephemeral_blob(&q2, 1, &uuid); | |
| 257 | - fid = db_column_int(&q2, 2); | |
| 258 | - send_file(pXfer, fid, &uuid, pid); | |
| 259 | - } | |
| 260 | - db_finalize(&q2); | |
| 261 | -} | |
| 262 | - | |
| 263 | -/* | |
| 264 | -** This routine runs when either client or server is notified that | |
| 265 | -** the other side thinks rid is a leaf manifest. If we hold | |
| 266 | -** children of rid, then send them over to the other side. | |
| 267 | -*/ | |
| 268 | -static void leaf_response(Xfer *pXfer, int rid){ | |
| 269 | - Stmt q1; | |
| 270 | - db_prepare(&q1, | |
| 271 | - "SELECT cid, uuid FROM plink, blob" | |
| 272 | - " WHERE blob.rid=plink.cid" | |
| 273 | - " AND plink.pid=%d", | |
| 274 | - rid | |
| 275 | - ); | |
| 276 | - while( db_step(&q1)==SQLITE_ROW ){ | |
| 277 | - Blob uuid; | |
| 278 | - int cid; | |
| 279 | - | |
| 280 | - cid = db_column_int(&q1, 0); | |
| 281 | - db_ephemeral_blob(&q1, 1, &uuid); | |
| 282 | - send_manifest(pXfer, cid, &uuid, rid); | |
| 283 | - if( blob_size(pXfer->pOut)<pXfer->mxSend ){ | |
| 284 | - leaf_response(pXfer, cid); | |
| 285 | - } | |
| 286 | - } | |
| 287 | -} | |
| 288 | - | |
| 289 | -/* | |
| 290 | -** Sent a leaf message for every leaf. | |
| 291 | -*/ | |
| 292 | -static void send_leaves(Xfer *pXfer){ | |
| 293 | - Stmt q; | |
| 294 | - db_prepare(&q, | |
| 295 | - "SELECT uuid FROM blob WHERE rid IN" | |
| 296 | - " (SELECT cid FROM plink EXCEPT SELECT pid FROM plink)" | |
| 297 | - ); | |
| 298 | - while( db_step(&q)==SQLITE_ROW ){ | |
| 299 | - const char *zUuid = db_column_text(&q, 0); | |
| 300 | - blob_appendf(pXfer->pOut, "leaf %s\n", zUuid); | |
| 301 | - } | |
| 302 | - db_finalize(&q); | |
| 303 | -} | |
| 304 | - | |
| 305 | -/* | |
| 306 | -** Sent leaf content for every leaf that is not found in the | |
| 307 | -** onremote table. This is intended to send leaf content for | |
| 308 | -** every leaf that is unknown on the remote end. | |
| 309 | -** | |
| 310 | -** In addition, we might send "igot" messages for a few generations of | |
| 311 | -** parents of the unknown leaves. This will speed the transmission | |
| 312 | -** of new branches. | |
| 313 | -*/ | |
| 314 | -static void send_unknown_leaf_content(Xfer *pXfer){ | |
| 315 | - Stmt q1; | |
| 316 | - db_prepare(&q1, | |
| 317 | - "SELECT rid, uuid FROM blob WHERE rid IN" | |
| 318 | - " (SELECT cid FROM plink EXCEPT SELECT pid FROM plink)" | |
| 319 | - " AND NOT EXISTS(SELECT 1 FROM onremote WHERE rid=blob.rid)" | |
| 320 | - ); | |
| 321 | - while( db_step(&q1)==SQLITE_ROW ){ | |
| 322 | - Blob uuid; | |
| 323 | - int cid; | |
| 324 | - | |
| 325 | - cid = db_column_int(&q1, 0); | |
| 326 | - db_ephemeral_blob(&q1, 1, &uuid); | |
| 327 | - send_manifest(pXfer, cid, &uuid, 0); | |
| 328 | - } | |
| 329 | - db_finalize(&q1); | |
| 330 | -} | |
| 331 | - | |
| 332 | -/* | |
| 333 | -** Sen a gimme message for every phantom. | |
| 239 | +** Send a gimme message for every phantom. | |
| 334 | 240 | */ |
| 335 | 241 | static void request_phantoms(Xfer *pXfer){ |
| 336 | 242 | Stmt q; |
| 337 | 243 | db_prepare(&q, "SELECT uuid FROM phantom JOIN blob USING(rid)"); |
| 338 | 244 | while( db_step(&q)==SQLITE_ROW ){ |
| @@ -396,10 +302,77 @@ | ||
| 396 | 302 | } |
| 397 | 303 | } |
| 398 | 304 | db_reset(&q); |
| 399 | 305 | } |
| 400 | 306 | |
| 307 | +/* | |
| 308 | +** Send the content of all files in the unsent table. | |
| 309 | +** | |
| 310 | +** This is really just an optimization. If you clear the | |
| 311 | +** unsent table, all the right files will still get transferred. | |
| 312 | +** It just might require an extra round trip or two. | |
| 313 | +*/ | |
| 314 | +static void send_unsent(Xfer *pXfer){ | |
| 315 | + Stmt q; | |
| 316 | + db_prepare(&q, "SELECT rid FROM unsent"); | |
| 317 | + while( db_step(&q)==SQLITE_ROW ){ | |
| 318 | + int rid = db_column_int(&q, 0); | |
| 319 | + send_file(pXfer, rid, 0, 0); | |
| 320 | + } | |
| 321 | + db_finalize(&q); | |
| 322 | + db_multi_exec("DELETE FROM unsent"); | |
| 323 | +} | |
| 324 | + | |
| 325 | +/* | |
| 326 | +** Check to see if the number of unclustered entries is greater than | |
| 327 | +** 100 and if it is, form a new cluster. Unclustered phantoms do not | |
| 328 | +** count toward the 100 total. And phantoms are never added to a new | |
| 329 | +** cluster. | |
| 330 | +*/ | |
| 331 | +static void create_cluster(void){ | |
| 332 | + Blob cluster, cksum; | |
| 333 | + Stmt q; | |
| 334 | + int nUncl; | |
| 335 | + nUncl = db_int(0, "SELECT count(*) FROM unclustered" | |
| 336 | + " WHERE NOT EXISTS(SELECT 1 FROM phantom" | |
| 337 | + " WHERE rid=unclustered.rid)"); | |
| 338 | + if( nUncl<100 ){ | |
| 339 | + return; | |
| 340 | + } | |
| 341 | + blob_zero(&cluster); | |
| 342 | + db_prepare(&q, "SELECT uuid FROM unclustered, blob" | |
| 343 | + " WHERE NOT EXISTS(SELECT 1 FROM phantom" | |
| 344 | + " WHERE rid!=unclustered.rid)" | |
| 345 | + " AND unclustered.rid=blob.rid" | |
| 346 | + " ORDER BY 1"); | |
| 347 | + while( db_step(&q)==SQLITE_ROW ){ | |
| 348 | + blob_appendf(&cluster, "M %s\n", db_column_text(&q, 0)); | |
| 349 | + } | |
| 350 | + db_finalize(&q); | |
| 351 | + md5sum_blob(&cluster, &cksum); | |
| 352 | + blob_appendf(&cluster, "Z %b\n", &cksum); | |
| 353 | + blob_reset(&cksum); | |
| 354 | + db_multi_exec("DELETE FROM unclustered"); | |
| 355 | + content_put(&cluster, 0, 0); | |
| 356 | + blob_reset(&cluster); | |
| 357 | +} | |
| 358 | + | |
| 359 | +/* | |
| 360 | +** Send an igot message for every entry in unclustered table. | |
| 361 | +** Return the number of messages sent. | |
| 362 | +*/ | |
| 363 | +static int send_unclustered(Xfer *pXfer){ | |
| 364 | + Stmt q; | |
| 365 | + int cnt = 0; | |
| 366 | + db_prepare(&q, "SELECT uuid FROM unclustered JOIN blob USING(rid)"); | |
| 367 | + while( db_step(&q)==SQLITE_ROW ){ | |
| 368 | + blob_appendf(pXfer->pOut, "igot %s\n", db_column_text(&q, 0)); | |
| 369 | + cnt++; | |
| 370 | + } | |
| 371 | + db_finalize(&q); | |
| 372 | + return cnt; | |
| 373 | +} | |
| 401 | 374 | |
| 402 | 375 | /* |
| 403 | 376 | ** If this variable is set, disable login checks. Used for debugging |
| 404 | 377 | ** only. |
| 405 | 378 | */ |
| @@ -454,22 +427,20 @@ | ||
| 454 | 427 | } |
| 455 | 428 | }else |
| 456 | 429 | |
| 457 | 430 | /* gimme UUID |
| 458 | 431 | ** |
| 459 | - ** Client is requesting a file. If the file is a manifest, | |
| 460 | - ** the server can assume that the client also needs all content | |
| 461 | - ** files associated with that manifest. | |
| 432 | + ** Client is requesting a file. Send it. | |
| 462 | 433 | */ |
| 463 | 434 | if( blob_eq(&xfer.aToken[0], "gimme") |
| 464 | 435 | && xfer.nToken==2 |
| 465 | 436 | && blob_is_uuid(&xfer.aToken[1]) |
| 466 | 437 | ){ |
| 467 | 438 | if( isPull ){ |
| 468 | 439 | int rid = rid_from_uuid(&xfer.aToken[1], 0); |
| 469 | 440 | if( rid ){ |
| 470 | - send_manifest(&xfer, rid, &xfer.aToken[1], 0); | |
| 441 | + send_file(&xfer, rid, &xfer.aToken[1], 0); | |
| 471 | 442 | } |
| 472 | 443 | } |
| 473 | 444 | }else |
| 474 | 445 | |
| 475 | 446 | /* igot UUID |
| @@ -484,32 +455,10 @@ | ||
| 484 | 455 | rid_from_uuid(&xfer.aToken[1], 1); |
| 485 | 456 | } |
| 486 | 457 | }else |
| 487 | 458 | |
| 488 | 459 | |
| 489 | - /* leaf UUID | |
| 490 | - ** | |
| 491 | - ** Client announces that it has a particular manifest. If | |
| 492 | - ** the server has children of this leaf, then send those | |
| 493 | - ** children back to the client. If the server lacks this | |
| 494 | - ** leaf, request it. | |
| 495 | - */ | |
| 496 | - if( xfer.nToken==2 | |
| 497 | - && blob_eq(&xfer.aToken[0], "leaf") | |
| 498 | - && blob_is_uuid(&xfer.aToken[1]) | |
| 499 | - ){ | |
| 500 | - int rid = rid_from_uuid(&xfer.aToken[1], 0); | |
| 501 | - if( rid ){ | |
| 502 | - remote_has(rid); | |
| 503 | - if( isPull ){ | |
| 504 | - leaf_response(&xfer, rid); | |
| 505 | - } | |
| 506 | - }else if( isPush ){ | |
| 507 | - content_put(0, blob_str(&xfer.aToken[1]), 0); | |
| 508 | - } | |
| 509 | - }else | |
| 510 | - | |
| 511 | 460 | /* pull SERVERCODE PROJECTCODE |
| 512 | 461 | ** push SERVERCODE PROJECTCODE |
| 513 | 462 | ** |
| 514 | 463 | ** The client wants either send or receive. The server should |
| 515 | 464 | ** verify that the project code matches and that the server code |
| @@ -557,38 +506,28 @@ | ||
| 557 | 506 | cgi_reset_content(); |
| 558 | 507 | @ error not\sauthorized\sto\swrite |
| 559 | 508 | nErr++; |
| 560 | 509 | break; |
| 561 | 510 | } |
| 562 | - send_leaves(&xfer); | |
| 563 | 511 | isPush = 1; |
| 564 | 512 | } |
| 565 | 513 | }else |
| 566 | 514 | |
| 567 | 515 | /* clone |
| 568 | 516 | ** |
| 569 | 517 | ** The client knows nothing. Tell all. |
| 570 | 518 | */ |
| 571 | 519 | if( blob_eq(&xfer.aToken[0], "clone") ){ |
| 572 | - int rootid; | |
| 573 | 520 | login_check_credentials(); |
| 574 | 521 | if( !g.okClone ){ |
| 575 | 522 | cgi_reset_content(); |
| 576 | 523 | @ error not\sauthorized\sto\sclone |
| 577 | 524 | nErr++; |
| 578 | 525 | break; |
| 579 | 526 | } |
| 580 | 527 | isPull = 1; |
| 581 | 528 | @ push %s(db_get("server-code", "x")) %s(db_get("project-code", "x")) |
| 582 | - rootid = db_int(0, | |
| 583 | - "SELECT pid FROM plink AS a" | |
| 584 | - " WHERE NOT EXISTS(SELECT 1 FROM plink WHERE cid=a.pid)" | |
| 585 | - ); | |
| 586 | - if( rootid ){ | |
| 587 | - send_file(&xfer, rootid, 0, -1); | |
| 588 | - leaf_response(&xfer, rootid); | |
| 589 | - } | |
| 590 | 529 | }else |
| 591 | 530 | |
| 592 | 531 | /* login USER NONCE SIGNATURE |
| 593 | 532 | ** |
| 594 | 533 | ** Check for a valid login. This has to happen before anything else. |
| @@ -601,10 +540,31 @@ | ||
| 601 | 540 | g.okRead = g.okWrite = 1; |
| 602 | 541 | }else{ |
| 603 | 542 | check_login(&xfer.aToken[1], &xfer.aToken[2], &xfer.aToken[3]); |
| 604 | 543 | } |
| 605 | 544 | }else |
| 545 | + | |
| 546 | + /* cookie TEXT | |
| 547 | + ** | |
| 548 | + ** A cookie contains a arbitrary-length argument that is server-defined. | |
| 549 | + ** The argument must be encoded so as not to contain any whitespace. | |
| 550 | + ** The server can optionally send a cookie to the client. The client | |
| 551 | + ** might then return the same cookie back to the server on its next | |
| 552 | + ** communication. The cookie might record information that helps | |
| 553 | + ** the server optimize a push or pull. | |
| 554 | + ** | |
| 555 | + ** The client is not required to return a cookie. So the server | |
| 556 | + ** must not depend on the cookie. The cookie should be an optimization | |
| 557 | + ** only. The client might also send a cookie that came from a different | |
| 558 | + ** server. So the server must be prepared to distinguish its own cookie | |
| 559 | + ** from cookies originating from other servers. The client might send | |
| 560 | + ** back several different cookies to the server. The server should be | |
| 561 | + ** prepared to sift through the cookies and pick the one that it wants. | |
| 562 | + */ | |
| 563 | + if( blob_eq(&xfer.aToken[0], "cookie") && xfer.nToken==2 ){ | |
| 564 | + /* Process the cookie */ | |
| 565 | + }else | |
| 606 | 566 | |
| 607 | 567 | /* Unknown message |
| 608 | 568 | */ |
| 609 | 569 | { |
| 610 | 570 | cgi_reset_content(); |
| @@ -614,11 +574,12 @@ | ||
| 614 | 574 | } |
| 615 | 575 | if( isPush ){ |
| 616 | 576 | request_phantoms(&xfer); |
| 617 | 577 | } |
| 618 | 578 | if( isPull ){ |
| 619 | - send_unknown_leaf_content(&xfer); | |
| 579 | + create_cluster(); | |
| 580 | + send_unclustered(&xfer); | |
| 620 | 581 | } |
| 621 | 582 | db_end_transaction(0); |
| 622 | 583 | } |
| 623 | 584 | |
| 624 | 585 | /* |
| @@ -668,10 +629,11 @@ | ||
| 668 | 629 | const char *zSCode = db_get("server-code", "x"); |
| 669 | 630 | const char *zPCode = db_get("project-code", 0); |
| 670 | 631 | int nMsg = 0; /* Number of messages sent or received */ |
| 671 | 632 | int nCycle = 0; /* Number of round trips to the server */ |
| 672 | 633 | int nFileSend = 0; |
| 634 | + const char *zCookie; /* Server cookie */ | |
| 673 | 635 | Blob send; /* Text we are sending to the server */ |
| 674 | 636 | Blob recv; /* Reply we got back from the server */ |
| 675 | 637 | Xfer xfer; /* Transfer data */ |
| 676 | 638 | |
| 677 | 639 | memset(&xfer, 0, sizeof(xfer)); |
| @@ -711,16 +673,27 @@ | ||
| 711 | 673 | |
| 712 | 674 | |
| 713 | 675 | while( go ){ |
| 714 | 676 | int newPhantom = 0; |
| 715 | 677 | |
| 678 | + /* Send make the most recently received cookie. Let the server | |
| 679 | + ** figure out if this is a cookie that it cares about. | |
| 680 | + */ | |
| 681 | + zCookie = db_get("cookie", 0); | |
| 682 | + if( zCookie ){ | |
| 683 | + blob_appendf(&send, "cookie %s\n", zCookie); | |
| 684 | + } | |
| 685 | + | |
| 716 | 686 | /* Generate gimme messages for phantoms and leaf messages |
| 717 | 687 | ** for all leaves. |
| 718 | 688 | */ |
| 719 | 689 | if( pullFlag ){ |
| 720 | 690 | request_phantoms(&xfer); |
| 721 | - send_leaves(&xfer); | |
| 691 | + } | |
| 692 | + if( pushFlag ){ | |
| 693 | + send_unsent(&xfer); | |
| 694 | + nMsg += send_unclustered(&xfer); | |
| 722 | 695 | } |
| 723 | 696 | |
| 724 | 697 | /* Exchange messages with the server */ |
| 725 | 698 | nFileSend = xfer.nFileSent + xfer.nDeltaSent; |
| 726 | 699 | printf("Send: %10d bytes, %3d messages, %3d files (%d+%d)\n", |
| @@ -742,11 +715,10 @@ | ||
| 742 | 715 | } |
| 743 | 716 | if( pushFlag ){ |
| 744 | 717 | blob_appendf(&send, "push %s %s\n", zSCode, zPCode); |
| 745 | 718 | nMsg++; |
| 746 | 719 | } |
| 747 | - | |
| 748 | 720 | |
| 749 | 721 | /* Process the reply that came back from the server */ |
| 750 | 722 | while( blob_line(&recv, &xfer.line) ){ |
| 751 | 723 | if( blob_buffer(&xfer.line)[0]=='#' ){ |
| 752 | 724 | continue; |
| @@ -773,11 +745,11 @@ | ||
| 773 | 745 | && blob_is_uuid(&xfer.aToken[1]) |
| 774 | 746 | ){ |
| 775 | 747 | nMsg++; |
| 776 | 748 | if( pushFlag ){ |
| 777 | 749 | int rid = rid_from_uuid(&xfer.aToken[1], 0); |
| 778 | - send_manifest(&xfer, rid, &xfer.aToken[1], 0); | |
| 750 | + send_file(&xfer, rid, &xfer.aToken[1], 0); | |
| 779 | 751 | } |
| 780 | 752 | }else |
| 781 | 753 | |
| 782 | 754 | /* igot UUID |
| 783 | 755 | ** |
| @@ -805,34 +777,10 @@ | ||
| 805 | 777 | } |
| 806 | 778 | remote_has(rid); |
| 807 | 779 | }else |
| 808 | 780 | |
| 809 | 781 | |
| 810 | - /* leaf UUID | |
| 811 | - ** | |
| 812 | - ** Server announces that it has a particular manifest. Send | |
| 813 | - ** any children of this leaf that we have if we are pushing. | |
| 814 | - ** Make the leaf a phantom if we are pulling. Remember that the | |
| 815 | - ** remote end has the specified UUID. | |
| 816 | - */ | |
| 817 | - if( xfer.nToken==2 | |
| 818 | - && blob_eq(&xfer.aToken[0], "leaf") | |
| 819 | - && blob_is_uuid(&xfer.aToken[1]) | |
| 820 | - ){ | |
| 821 | - int rid = rid_from_uuid(&xfer.aToken[1], 0); | |
| 822 | - nMsg++; | |
| 823 | - if( pushFlag && rid ){ | |
| 824 | - leaf_response(&xfer, rid); | |
| 825 | - } | |
| 826 | - if( pullFlag && rid==0 ){ | |
| 827 | - rid = content_put(0, blob_str(&xfer.aToken[1]), 0); | |
| 828 | - newPhantom = 1; | |
| 829 | - } | |
| 830 | - remote_has(rid); | |
| 831 | - }else | |
| 832 | - | |
| 833 | - | |
| 834 | 782 | /* push SERVERCODE PRODUCTCODE |
| 835 | 783 | ** |
| 836 | 784 | ** Should only happen in response to a clone. This message tells |
| 837 | 785 | ** the client what product to use for the new database. |
| 838 | 786 | */ |
| @@ -853,10 +801,23 @@ | ||
| 853 | 801 | cloneFlag = 0; |
| 854 | 802 | pullFlag = 1; |
| 855 | 803 | blob_appendf(&send, "pull %s %s\n", zSCode, zPCode); |
| 856 | 804 | nMsg++; |
| 857 | 805 | }else |
| 806 | + | |
| 807 | + /* cookie TEXT | |
| 808 | + ** | |
| 809 | + ** The server might include a cookie in its reply. The client | |
| 810 | + ** should remember this cookie and send it back to the server | |
| 811 | + ** in its next query. | |
| 812 | + ** | |
| 813 | + ** Each cookie received overwrites the prior cookie from the | |
| 814 | + ** same server. | |
| 815 | + */ | |
| 816 | + if( blob_eq(&xfer.aToken[0], "cookie") && xfer.nToken==2 ){ | |
| 817 | + db_set("cookie", blob_str(&xfer.aToken[1])); | |
| 818 | + }else | |
| 858 | 819 | |
| 859 | 820 | /* error MESSAGE |
| 860 | 821 | ** |
| 861 | 822 | ** Report an error |
| 862 | 823 | */ |
| @@ -881,27 +842,25 @@ | ||
| 881 | 842 | blob_size(&recv), nMsg, |
| 882 | 843 | xfer.nFileRcvd + xfer.nDeltaRcvd + xfer.nDanglingFile, |
| 883 | 844 | xfer.nFileRcvd, xfer.nDeltaRcvd, xfer.nDanglingFile); |
| 884 | 845 | |
| 885 | 846 | blob_reset(&recv); |
| 847 | + nCycle++; | |
| 848 | + go = 0; | |
| 849 | + | |
| 850 | + /* If we received one or more files on the previous exchange but | |
| 851 | + ** there are still phantoms, then go another round. | |
| 852 | + */ | |
| 853 | + if( (xfer.nFileRcvd+xfer.nDeltaRcvd+xfer.nDanglingFile>0 || newPhantom) | |
| 854 | + && db_exists("SELECT 1 FROM phantom") | |
| 855 | + ){ | |
| 856 | + go = 1; | |
| 857 | + } | |
| 886 | 858 | nMsg = 0; |
| 887 | 859 | xfer.nFileRcvd = 0; |
| 888 | 860 | xfer.nDeltaRcvd = 0; |
| 889 | 861 | xfer.nDanglingFile = 0; |
| 890 | - nCycle++; | |
| 891 | - go = 0; | |
| 892 | - | |
| 893 | - /* If we have received one or more files on this cycle or if | |
| 894 | - ** we have received information that has caused us to create | |
| 895 | - ** new phantoms and we have one or more phantoms, then go for | |
| 896 | - ** another round | |
| 897 | - */ | |
| 898 | - if( (xfer.nFileRcvd+xfer.nDeltaRcvd+xfer.nDanglingFile>0 || newPhantom) | |
| 899 | - && db_exists("SELECT 1 FROM phantom") | |
| 900 | - ){ | |
| 901 | - go = 1; | |
| 902 | - } | |
| 903 | 862 | |
| 904 | 863 | /* If we have one or more files queued to send, then go |
| 905 | 864 | ** another round |
| 906 | 865 | */ |
| 907 | 866 | if( xfer.nFileSent+xfer.nDeltaSent>0 ){ |
| 908 | 867 | |
| 909 | 868 | DELETED test/basic1.test |
| 910 | 869 | ADDED wiki_and_ticket_ideas.txt |
| --- src/xfer.c | |
| +++ src/xfer.c | |
| @@ -234,105 +234,11 @@ | |
| 234 | remote_has(rid); |
| 235 | blob_reset(&uuid); |
| 236 | } |
| 237 | |
| 238 | /* |
| 239 | ** Send the file identified by mid and pUuid. If that file happens |
| 240 | ** to be a manifest, then also send all of the associated content |
| 241 | ** files for that manifest. If the file is not a manifest, then this |
| 242 | ** routine is the equivalent of send_file(). |
| 243 | */ |
| 244 | static void send_manifest(Xfer *pXfer, int mid, Blob *pUuid, int srcId){ |
| 245 | Stmt q2; |
| 246 | send_file(pXfer, mid, pUuid, srcId); |
| 247 | db_prepare(&q2, |
| 248 | "SELECT pid, uuid, fid FROM mlink, blob" |
| 249 | " WHERE rid=fid AND mid=%d", |
| 250 | mid |
| 251 | ); |
| 252 | while( db_step(&q2)==SQLITE_ROW ){ |
| 253 | int pid, fid; |
| 254 | Blob uuid; |
| 255 | pid = db_column_int(&q2, 0); |
| 256 | db_ephemeral_blob(&q2, 1, &uuid); |
| 257 | fid = db_column_int(&q2, 2); |
| 258 | send_file(pXfer, fid, &uuid, pid); |
| 259 | } |
| 260 | db_finalize(&q2); |
| 261 | } |
| 262 | |
| 263 | /* |
| 264 | ** This routine runs when either client or server is notified that |
| 265 | ** the other side thinks rid is a leaf manifest. If we hold |
| 266 | ** children of rid, then send them over to the other side. |
| 267 | */ |
| 268 | static void leaf_response(Xfer *pXfer, int rid){ |
| 269 | Stmt q1; |
| 270 | db_prepare(&q1, |
| 271 | "SELECT cid, uuid FROM plink, blob" |
| 272 | " WHERE blob.rid=plink.cid" |
| 273 | " AND plink.pid=%d", |
| 274 | rid |
| 275 | ); |
| 276 | while( db_step(&q1)==SQLITE_ROW ){ |
| 277 | Blob uuid; |
| 278 | int cid; |
| 279 | |
| 280 | cid = db_column_int(&q1, 0); |
| 281 | db_ephemeral_blob(&q1, 1, &uuid); |
| 282 | send_manifest(pXfer, cid, &uuid, rid); |
| 283 | if( blob_size(pXfer->pOut)<pXfer->mxSend ){ |
| 284 | leaf_response(pXfer, cid); |
| 285 | } |
| 286 | } |
| 287 | } |
| 288 | |
| 289 | /* |
| 290 | ** Sent a leaf message for every leaf. |
| 291 | */ |
| 292 | static void send_leaves(Xfer *pXfer){ |
| 293 | Stmt q; |
| 294 | db_prepare(&q, |
| 295 | "SELECT uuid FROM blob WHERE rid IN" |
| 296 | " (SELECT cid FROM plink EXCEPT SELECT pid FROM plink)" |
| 297 | ); |
| 298 | while( db_step(&q)==SQLITE_ROW ){ |
| 299 | const char *zUuid = db_column_text(&q, 0); |
| 300 | blob_appendf(pXfer->pOut, "leaf %s\n", zUuid); |
| 301 | } |
| 302 | db_finalize(&q); |
| 303 | } |
| 304 | |
| 305 | /* |
| 306 | ** Sent leaf content for every leaf that is not found in the |
| 307 | ** onremote table. This is intended to send leaf content for |
| 308 | ** every leaf that is unknown on the remote end. |
| 309 | ** |
| 310 | ** In addition, we might send "igot" messages for a few generations of |
| 311 | ** parents of the unknown leaves. This will speed the transmission |
| 312 | ** of new branches. |
| 313 | */ |
| 314 | static void send_unknown_leaf_content(Xfer *pXfer){ |
| 315 | Stmt q1; |
| 316 | db_prepare(&q1, |
| 317 | "SELECT rid, uuid FROM blob WHERE rid IN" |
| 318 | " (SELECT cid FROM plink EXCEPT SELECT pid FROM plink)" |
| 319 | " AND NOT EXISTS(SELECT 1 FROM onremote WHERE rid=blob.rid)" |
| 320 | ); |
| 321 | while( db_step(&q1)==SQLITE_ROW ){ |
| 322 | Blob uuid; |
| 323 | int cid; |
| 324 | |
| 325 | cid = db_column_int(&q1, 0); |
| 326 | db_ephemeral_blob(&q1, 1, &uuid); |
| 327 | send_manifest(pXfer, cid, &uuid, 0); |
| 328 | } |
| 329 | db_finalize(&q1); |
| 330 | } |
| 331 | |
| 332 | /* |
| 333 | ** Sen a gimme message for every phantom. |
| 334 | */ |
| 335 | static void request_phantoms(Xfer *pXfer){ |
| 336 | Stmt q; |
| 337 | db_prepare(&q, "SELECT uuid FROM phantom JOIN blob USING(rid)"); |
| 338 | while( db_step(&q)==SQLITE_ROW ){ |
| @@ -396,10 +302,77 @@ | |
| 396 | } |
| 397 | } |
| 398 | db_reset(&q); |
| 399 | } |
| 400 | |
| 401 | |
| 402 | /* |
| 403 | ** If this variable is set, disable login checks. Used for debugging |
| 404 | ** only. |
| 405 | */ |
| @@ -454,22 +427,20 @@ | |
| 454 | } |
| 455 | }else |
| 456 | |
| 457 | /* gimme UUID |
| 458 | ** |
| 459 | ** Client is requesting a file. If the file is a manifest, |
| 460 | ** the server can assume that the client also needs all content |
| 461 | ** files associated with that manifest. |
| 462 | */ |
| 463 | if( blob_eq(&xfer.aToken[0], "gimme") |
| 464 | && xfer.nToken==2 |
| 465 | && blob_is_uuid(&xfer.aToken[1]) |
| 466 | ){ |
| 467 | if( isPull ){ |
| 468 | int rid = rid_from_uuid(&xfer.aToken[1], 0); |
| 469 | if( rid ){ |
| 470 | send_manifest(&xfer, rid, &xfer.aToken[1], 0); |
| 471 | } |
| 472 | } |
| 473 | }else |
| 474 | |
| 475 | /* igot UUID |
| @@ -484,32 +455,10 @@ | |
| 484 | rid_from_uuid(&xfer.aToken[1], 1); |
| 485 | } |
| 486 | }else |
| 487 | |
| 488 | |
| 489 | /* leaf UUID |
| 490 | ** |
| 491 | ** Client announces that it has a particular manifest. If |
| 492 | ** the server has children of this leaf, then send those |
| 493 | ** children back to the client. If the server lacks this |
| 494 | ** leaf, request it. |
| 495 | */ |
| 496 | if( xfer.nToken==2 |
| 497 | && blob_eq(&xfer.aToken[0], "leaf") |
| 498 | && blob_is_uuid(&xfer.aToken[1]) |
| 499 | ){ |
| 500 | int rid = rid_from_uuid(&xfer.aToken[1], 0); |
| 501 | if( rid ){ |
| 502 | remote_has(rid); |
| 503 | if( isPull ){ |
| 504 | leaf_response(&xfer, rid); |
| 505 | } |
| 506 | }else if( isPush ){ |
| 507 | content_put(0, blob_str(&xfer.aToken[1]), 0); |
| 508 | } |
| 509 | }else |
| 510 | |
| 511 | /* pull SERVERCODE PROJECTCODE |
| 512 | ** push SERVERCODE PROJECTCODE |
| 513 | ** |
| 514 | ** The client wants either send or receive. The server should |
| 515 | ** verify that the project code matches and that the server code |
| @@ -557,38 +506,28 @@ | |
| 557 | cgi_reset_content(); |
| 558 | @ error not\sauthorized\sto\swrite |
| 559 | nErr++; |
| 560 | break; |
| 561 | } |
| 562 | send_leaves(&xfer); |
| 563 | isPush = 1; |
| 564 | } |
| 565 | }else |
| 566 | |
| 567 | /* clone |
| 568 | ** |
| 569 | ** The client knows nothing. Tell all. |
| 570 | */ |
| 571 | if( blob_eq(&xfer.aToken[0], "clone") ){ |
| 572 | int rootid; |
| 573 | login_check_credentials(); |
| 574 | if( !g.okClone ){ |
| 575 | cgi_reset_content(); |
| 576 | @ error not\sauthorized\sto\sclone |
| 577 | nErr++; |
| 578 | break; |
| 579 | } |
| 580 | isPull = 1; |
| 581 | @ push %s(db_get("server-code", "x")) %s(db_get("project-code", "x")) |
| 582 | rootid = db_int(0, |
| 583 | "SELECT pid FROM plink AS a" |
| 584 | " WHERE NOT EXISTS(SELECT 1 FROM plink WHERE cid=a.pid)" |
| 585 | ); |
| 586 | if( rootid ){ |
| 587 | send_file(&xfer, rootid, 0, -1); |
| 588 | leaf_response(&xfer, rootid); |
| 589 | } |
| 590 | }else |
| 591 | |
| 592 | /* login USER NONCE SIGNATURE |
| 593 | ** |
| 594 | ** Check for a valid login. This has to happen before anything else. |
| @@ -601,10 +540,31 @@ | |
| 601 | g.okRead = g.okWrite = 1; |
| 602 | }else{ |
| 603 | check_login(&xfer.aToken[1], &xfer.aToken[2], &xfer.aToken[3]); |
| 604 | } |
| 605 | }else |
| 606 | |
| 607 | /* Unknown message |
| 608 | */ |
| 609 | { |
| 610 | cgi_reset_content(); |
| @@ -614,11 +574,12 @@ | |
| 614 | } |
| 615 | if( isPush ){ |
| 616 | request_phantoms(&xfer); |
| 617 | } |
| 618 | if( isPull ){ |
| 619 | send_unknown_leaf_content(&xfer); |
| 620 | } |
| 621 | db_end_transaction(0); |
| 622 | } |
| 623 | |
| 624 | /* |
| @@ -668,10 +629,11 @@ | |
| 668 | const char *zSCode = db_get("server-code", "x"); |
| 669 | const char *zPCode = db_get("project-code", 0); |
| 670 | int nMsg = 0; /* Number of messages sent or received */ |
| 671 | int nCycle = 0; /* Number of round trips to the server */ |
| 672 | int nFileSend = 0; |
| 673 | Blob send; /* Text we are sending to the server */ |
| 674 | Blob recv; /* Reply we got back from the server */ |
| 675 | Xfer xfer; /* Transfer data */ |
| 676 | |
| 677 | memset(&xfer, 0, sizeof(xfer)); |
| @@ -711,16 +673,27 @@ | |
| 711 | |
| 712 | |
| 713 | while( go ){ |
| 714 | int newPhantom = 0; |
| 715 | |
| 716 | /* Generate gimme messages for phantoms and leaf messages |
| 717 | ** for all leaves. |
| 718 | */ |
| 719 | if( pullFlag ){ |
| 720 | request_phantoms(&xfer); |
| 721 | send_leaves(&xfer); |
| 722 | } |
| 723 | |
| 724 | /* Exchange messages with the server */ |
| 725 | nFileSend = xfer.nFileSent + xfer.nDeltaSent; |
| 726 | printf("Send: %10d bytes, %3d messages, %3d files (%d+%d)\n", |
| @@ -742,11 +715,10 @@ | |
| 742 | } |
| 743 | if( pushFlag ){ |
| 744 | blob_appendf(&send, "push %s %s\n", zSCode, zPCode); |
| 745 | nMsg++; |
| 746 | } |
| 747 | |
| 748 | |
| 749 | /* Process the reply that came back from the server */ |
| 750 | while( blob_line(&recv, &xfer.line) ){ |
| 751 | if( blob_buffer(&xfer.line)[0]=='#' ){ |
| 752 | continue; |
| @@ -773,11 +745,11 @@ | |
| 773 | && blob_is_uuid(&xfer.aToken[1]) |
| 774 | ){ |
| 775 | nMsg++; |
| 776 | if( pushFlag ){ |
| 777 | int rid = rid_from_uuid(&xfer.aToken[1], 0); |
| 778 | send_manifest(&xfer, rid, &xfer.aToken[1], 0); |
| 779 | } |
| 780 | }else |
| 781 | |
| 782 | /* igot UUID |
| 783 | ** |
| @@ -805,34 +777,10 @@ | |
| 805 | } |
| 806 | remote_has(rid); |
| 807 | }else |
| 808 | |
| 809 | |
| 810 | /* leaf UUID |
| 811 | ** |
| 812 | ** Server announces that it has a particular manifest. Send |
| 813 | ** any children of this leaf that we have if we are pushing. |
| 814 | ** Make the leaf a phantom if we are pulling. Remember that the |
| 815 | ** remote end has the specified UUID. |
| 816 | */ |
| 817 | if( xfer.nToken==2 |
| 818 | && blob_eq(&xfer.aToken[0], "leaf") |
| 819 | && blob_is_uuid(&xfer.aToken[1]) |
| 820 | ){ |
| 821 | int rid = rid_from_uuid(&xfer.aToken[1], 0); |
| 822 | nMsg++; |
| 823 | if( pushFlag && rid ){ |
| 824 | leaf_response(&xfer, rid); |
| 825 | } |
| 826 | if( pullFlag && rid==0 ){ |
| 827 | rid = content_put(0, blob_str(&xfer.aToken[1]), 0); |
| 828 | newPhantom = 1; |
| 829 | } |
| 830 | remote_has(rid); |
| 831 | }else |
| 832 | |
| 833 | |
| 834 | /* push SERVERCODE PRODUCTCODE |
| 835 | ** |
| 836 | ** Should only happen in response to a clone. This message tells |
| 837 | ** the client what product to use for the new database. |
| 838 | */ |
| @@ -853,10 +801,23 @@ | |
| 853 | cloneFlag = 0; |
| 854 | pullFlag = 1; |
| 855 | blob_appendf(&send, "pull %s %s\n", zSCode, zPCode); |
| 856 | nMsg++; |
| 857 | }else |
| 858 | |
| 859 | /* error MESSAGE |
| 860 | ** |
| 861 | ** Report an error |
| 862 | */ |
| @@ -881,27 +842,25 @@ | |
| 881 | blob_size(&recv), nMsg, |
| 882 | xfer.nFileRcvd + xfer.nDeltaRcvd + xfer.nDanglingFile, |
| 883 | xfer.nFileRcvd, xfer.nDeltaRcvd, xfer.nDanglingFile); |
| 884 | |
| 885 | blob_reset(&recv); |
| 886 | nMsg = 0; |
| 887 | xfer.nFileRcvd = 0; |
| 888 | xfer.nDeltaRcvd = 0; |
| 889 | xfer.nDanglingFile = 0; |
| 890 | nCycle++; |
| 891 | go = 0; |
| 892 | |
| 893 | /* If we have received one or more files on this cycle or if |
| 894 | ** we have received information that has caused us to create |
| 895 | ** new phantoms and we have one or more phantoms, then go for |
| 896 | ** another round |
| 897 | */ |
| 898 | if( (xfer.nFileRcvd+xfer.nDeltaRcvd+xfer.nDanglingFile>0 || newPhantom) |
| 899 | && db_exists("SELECT 1 FROM phantom") |
| 900 | ){ |
| 901 | go = 1; |
| 902 | } |
| 903 | |
| 904 | /* If we have one or more files queued to send, then go |
| 905 | ** another round |
| 906 | */ |
| 907 | if( xfer.nFileSent+xfer.nDeltaSent>0 ){ |
| 908 | |
| 909 | ELETED test/basic1.test |
| 910 | DDED wiki_and_ticket_ideas.txt |
| --- src/xfer.c | |
| +++ src/xfer.c | |
| @@ -234,105 +234,11 @@ | |
| 234 | remote_has(rid); |
| 235 | blob_reset(&uuid); |
| 236 | } |
| 237 | |
| 238 | /* |
| 239 | ** Send a gimme message for every phantom. |
| 240 | */ |
| 241 | static void request_phantoms(Xfer *pXfer){ |
| 242 | Stmt q; |
| 243 | db_prepare(&q, "SELECT uuid FROM phantom JOIN blob USING(rid)"); |
| 244 | while( db_step(&q)==SQLITE_ROW ){ |
| @@ -396,10 +302,77 @@ | |
| 302 | } |
| 303 | } |
| 304 | db_reset(&q); |
| 305 | } |
| 306 | |
| 307 | /* |
| 308 | ** Send the content of all files in the unsent table. |
| 309 | ** |
| 310 | ** This is really just an optimization. If you clear the |
| 311 | ** unsent table, all the right files will still get transferred. |
| 312 | ** It just might require an extra round trip or two. |
| 313 | */ |
| 314 | static void send_unsent(Xfer *pXfer){ |
| 315 | Stmt q; |
| 316 | db_prepare(&q, "SELECT rid FROM unsent"); |
| 317 | while( db_step(&q)==SQLITE_ROW ){ |
| 318 | int rid = db_column_int(&q, 0); |
| 319 | send_file(pXfer, rid, 0, 0); |
| 320 | } |
| 321 | db_finalize(&q); |
| 322 | db_multi_exec("DELETE FROM unsent"); |
| 323 | } |
| 324 | |
| 325 | /* |
| 326 | ** Check to see if the number of unclustered entries is greater than |
| 327 | ** 100 and if it is, form a new cluster. Unclustered phantoms do not |
| 328 | ** count toward the 100 total. And phantoms are never added to a new |
| 329 | ** cluster. |
| 330 | */ |
| 331 | static void create_cluster(void){ |
| 332 | Blob cluster, cksum; |
| 333 | Stmt q; |
| 334 | int nUncl; |
| 335 | nUncl = db_int(0, "SELECT count(*) FROM unclustered" |
| 336 | " WHERE NOT EXISTS(SELECT 1 FROM phantom" |
| 337 | " WHERE rid=unclustered.rid)"); |
| 338 | if( nUncl<100 ){ |
| 339 | return; |
| 340 | } |
| 341 | blob_zero(&cluster); |
| 342 | db_prepare(&q, "SELECT uuid FROM unclustered, blob" |
| 343 | " WHERE NOT EXISTS(SELECT 1 FROM phantom" |
| 344 | " WHERE rid!=unclustered.rid)" |
| 345 | " AND unclustered.rid=blob.rid" |
| 346 | " ORDER BY 1"); |
| 347 | while( db_step(&q)==SQLITE_ROW ){ |
| 348 | blob_appendf(&cluster, "M %s\n", db_column_text(&q, 0)); |
| 349 | } |
| 350 | db_finalize(&q); |
| 351 | md5sum_blob(&cluster, &cksum); |
| 352 | blob_appendf(&cluster, "Z %b\n", &cksum); |
| 353 | blob_reset(&cksum); |
| 354 | db_multi_exec("DELETE FROM unclustered"); |
| 355 | content_put(&cluster, 0, 0); |
| 356 | blob_reset(&cluster); |
| 357 | } |
| 358 | |
| 359 | /* |
| 360 | ** Send an igot message for every entry in unclustered table. |
| 361 | ** Return the number of messages sent. |
| 362 | */ |
| 363 | static int send_unclustered(Xfer *pXfer){ |
| 364 | Stmt q; |
| 365 | int cnt = 0; |
| 366 | db_prepare(&q, "SELECT uuid FROM unclustered JOIN blob USING(rid)"); |
| 367 | while( db_step(&q)==SQLITE_ROW ){ |
| 368 | blob_appendf(pXfer->pOut, "igot %s\n", db_column_text(&q, 0)); |
| 369 | cnt++; |
| 370 | } |
| 371 | db_finalize(&q); |
| 372 | return cnt; |
| 373 | } |
| 374 | |
| 375 | /* |
| 376 | ** If this variable is set, disable login checks. Used for debugging |
| 377 | ** only. |
| 378 | */ |
| @@ -454,22 +427,20 @@ | |
| 427 | } |
| 428 | }else |
| 429 | |
| 430 | /* gimme UUID |
| 431 | ** |
| 432 | ** Client is requesting a file. Send it. |
| 433 | */ |
| 434 | if( blob_eq(&xfer.aToken[0], "gimme") |
| 435 | && xfer.nToken==2 |
| 436 | && blob_is_uuid(&xfer.aToken[1]) |
| 437 | ){ |
| 438 | if( isPull ){ |
| 439 | int rid = rid_from_uuid(&xfer.aToken[1], 0); |
| 440 | if( rid ){ |
| 441 | send_file(&xfer, rid, &xfer.aToken[1], 0); |
| 442 | } |
| 443 | } |
| 444 | }else |
| 445 | |
| 446 | /* igot UUID |
| @@ -484,32 +455,10 @@ | |
| 455 | rid_from_uuid(&xfer.aToken[1], 1); |
| 456 | } |
| 457 | }else |
| 458 | |
| 459 | |
| 460 | /* pull SERVERCODE PROJECTCODE |
| 461 | ** push SERVERCODE PROJECTCODE |
| 462 | ** |
| 463 | ** The client wants either send or receive. The server should |
| 464 | ** verify that the project code matches and that the server code |
| @@ -557,38 +506,28 @@ | |
| 506 | cgi_reset_content(); |
| 507 | @ error not\sauthorized\sto\swrite |
| 508 | nErr++; |
| 509 | break; |
| 510 | } |
| 511 | isPush = 1; |
| 512 | } |
| 513 | }else |
| 514 | |
| 515 | /* clone |
| 516 | ** |
| 517 | ** The client knows nothing. Tell all. |
| 518 | */ |
| 519 | if( blob_eq(&xfer.aToken[0], "clone") ){ |
| 520 | login_check_credentials(); |
| 521 | if( !g.okClone ){ |
| 522 | cgi_reset_content(); |
| 523 | @ error not\sauthorized\sto\sclone |
| 524 | nErr++; |
| 525 | break; |
| 526 | } |
| 527 | isPull = 1; |
| 528 | @ push %s(db_get("server-code", "x")) %s(db_get("project-code", "x")) |
| 529 | }else |
| 530 | |
| 531 | /* login USER NONCE SIGNATURE |
| 532 | ** |
| 533 | ** Check for a valid login. This has to happen before anything else. |
| @@ -601,10 +540,31 @@ | |
| 540 | g.okRead = g.okWrite = 1; |
| 541 | }else{ |
| 542 | check_login(&xfer.aToken[1], &xfer.aToken[2], &xfer.aToken[3]); |
| 543 | } |
| 544 | }else |
| 545 | |
| 546 | /* cookie TEXT |
| 547 | ** |
| 548 | ** A cookie contains a arbitrary-length argument that is server-defined. |
| 549 | ** The argument must be encoded so as not to contain any whitespace. |
| 550 | ** The server can optionally send a cookie to the client. The client |
| 551 | ** might then return the same cookie back to the server on its next |
| 552 | ** communication. The cookie might record information that helps |
| 553 | ** the server optimize a push or pull. |
| 554 | ** |
| 555 | ** The client is not required to return a cookie. So the server |
| 556 | ** must not depend on the cookie. The cookie should be an optimization |
| 557 | ** only. The client might also send a cookie that came from a different |
| 558 | ** server. So the server must be prepared to distinguish its own cookie |
| 559 | ** from cookies originating from other servers. The client might send |
| 560 | ** back several different cookies to the server. The server should be |
| 561 | ** prepared to sift through the cookies and pick the one that it wants. |
| 562 | */ |
| 563 | if( blob_eq(&xfer.aToken[0], "cookie") && xfer.nToken==2 ){ |
| 564 | /* Process the cookie */ |
| 565 | }else |
| 566 | |
| 567 | /* Unknown message |
| 568 | */ |
| 569 | { |
| 570 | cgi_reset_content(); |
| @@ -614,11 +574,12 @@ | |
| 574 | } |
| 575 | if( isPush ){ |
| 576 | request_phantoms(&xfer); |
| 577 | } |
| 578 | if( isPull ){ |
| 579 | create_cluster(); |
| 580 | send_unclustered(&xfer); |
| 581 | } |
| 582 | db_end_transaction(0); |
| 583 | } |
| 584 | |
| 585 | /* |
| @@ -668,10 +629,11 @@ | |
| 629 | const char *zSCode = db_get("server-code", "x"); |
| 630 | const char *zPCode = db_get("project-code", 0); |
| 631 | int nMsg = 0; /* Number of messages sent or received */ |
| 632 | int nCycle = 0; /* Number of round trips to the server */ |
| 633 | int nFileSend = 0; |
| 634 | const char *zCookie; /* Server cookie */ |
| 635 | Blob send; /* Text we are sending to the server */ |
| 636 | Blob recv; /* Reply we got back from the server */ |
| 637 | Xfer xfer; /* Transfer data */ |
| 638 | |
| 639 | memset(&xfer, 0, sizeof(xfer)); |
| @@ -711,16 +673,27 @@ | |
| 673 | |
| 674 | |
| 675 | while( go ){ |
| 676 | int newPhantom = 0; |
| 677 | |
| 678 | /* Send make the most recently received cookie. Let the server |
| 679 | ** figure out if this is a cookie that it cares about. |
| 680 | */ |
| 681 | zCookie = db_get("cookie", 0); |
| 682 | if( zCookie ){ |
| 683 | blob_appendf(&send, "cookie %s\n", zCookie); |
| 684 | } |
| 685 | |
| 686 | /* Generate gimme messages for phantoms and leaf messages |
| 687 | ** for all leaves. |
| 688 | */ |
| 689 | if( pullFlag ){ |
| 690 | request_phantoms(&xfer); |
| 691 | } |
| 692 | if( pushFlag ){ |
| 693 | send_unsent(&xfer); |
| 694 | nMsg += send_unclustered(&xfer); |
| 695 | } |
| 696 | |
| 697 | /* Exchange messages with the server */ |
| 698 | nFileSend = xfer.nFileSent + xfer.nDeltaSent; |
| 699 | printf("Send: %10d bytes, %3d messages, %3d files (%d+%d)\n", |
| @@ -742,11 +715,10 @@ | |
| 715 | } |
| 716 | if( pushFlag ){ |
| 717 | blob_appendf(&send, "push %s %s\n", zSCode, zPCode); |
| 718 | nMsg++; |
| 719 | } |
| 720 | |
| 721 | /* Process the reply that came back from the server */ |
| 722 | while( blob_line(&recv, &xfer.line) ){ |
| 723 | if( blob_buffer(&xfer.line)[0]=='#' ){ |
| 724 | continue; |
| @@ -773,11 +745,11 @@ | |
| 745 | && blob_is_uuid(&xfer.aToken[1]) |
| 746 | ){ |
| 747 | nMsg++; |
| 748 | if( pushFlag ){ |
| 749 | int rid = rid_from_uuid(&xfer.aToken[1], 0); |
| 750 | send_file(&xfer, rid, &xfer.aToken[1], 0); |
| 751 | } |
| 752 | }else |
| 753 | |
| 754 | /* igot UUID |
| 755 | ** |
| @@ -805,34 +777,10 @@ | |
| 777 | } |
| 778 | remote_has(rid); |
| 779 | }else |
| 780 | |
| 781 | |
| 782 | /* push SERVERCODE PRODUCTCODE |
| 783 | ** |
| 784 | ** Should only happen in response to a clone. This message tells |
| 785 | ** the client what product to use for the new database. |
| 786 | */ |
| @@ -853,10 +801,23 @@ | |
| 801 | cloneFlag = 0; |
| 802 | pullFlag = 1; |
| 803 | blob_appendf(&send, "pull %s %s\n", zSCode, zPCode); |
| 804 | nMsg++; |
| 805 | }else |
| 806 | |
| 807 | /* cookie TEXT |
| 808 | ** |
| 809 | ** The server might include a cookie in its reply. The client |
| 810 | ** should remember this cookie and send it back to the server |
| 811 | ** in its next query. |
| 812 | ** |
| 813 | ** Each cookie received overwrites the prior cookie from the |
| 814 | ** same server. |
| 815 | */ |
| 816 | if( blob_eq(&xfer.aToken[0], "cookie") && xfer.nToken==2 ){ |
| 817 | db_set("cookie", blob_str(&xfer.aToken[1])); |
| 818 | }else |
| 819 | |
| 820 | /* error MESSAGE |
| 821 | ** |
| 822 | ** Report an error |
| 823 | */ |
| @@ -881,27 +842,25 @@ | |
| 842 | blob_size(&recv), nMsg, |
| 843 | xfer.nFileRcvd + xfer.nDeltaRcvd + xfer.nDanglingFile, |
| 844 | xfer.nFileRcvd, xfer.nDeltaRcvd, xfer.nDanglingFile); |
| 845 | |
| 846 | blob_reset(&recv); |
| 847 | nCycle++; |
| 848 | go = 0; |
| 849 | |
| 850 | /* If we received one or more files on the previous exchange but |
| 851 | ** there are still phantoms, then go another round. |
| 852 | */ |
| 853 | if( (xfer.nFileRcvd+xfer.nDeltaRcvd+xfer.nDanglingFile>0 || newPhantom) |
| 854 | && db_exists("SELECT 1 FROM phantom") |
| 855 | ){ |
| 856 | go = 1; |
| 857 | } |
| 858 | nMsg = 0; |
| 859 | xfer.nFileRcvd = 0; |
| 860 | xfer.nDeltaRcvd = 0; |
| 861 | xfer.nDanglingFile = 0; |
| 862 | |
| 863 | /* If we have one or more files queued to send, then go |
| 864 | ** another round |
| 865 | */ |
| 866 | if( xfer.nFileSent+xfer.nDeltaSent>0 ){ |
| 867 | |
| 868 | ELETED test/basic1.test |
| 869 | DDED wiki_and_ticket_ideas.txt |
D
test/basic1.test
-231
| --- a/test/basic1.test | ||
| +++ b/test/basic1.test | ||
| @@ -1,231 +0,0 @@ | ||
| 1 | -# | |
| 2 | -# Copyright (c) 2006 D. Richard Hipp | |
| 3 | -# | |
| 4 | -# This program is free software; you can redistribute it and/or | |
| 5 | -# modify it under the terms of the GNU General Public | |
| 6 | -# License version 2 as published by the Free Software Foundation. | |
| 7 | -# | |
| 8 | -# This program is distributed in the hope that it will be useful, | |
| 9 | -# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 10 | -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 11 | -# General Public License for more details. | |
| 12 | -# | |
| 13 | -# You should have received a copy of the GNU General Public | |
| 14 | -# License along with this library; if not, write to the | |
| 15 | -# Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
| 16 | -# Boston, MA 02111-1307, USA. | |
| 17 | -# | |
| 18 | -# Author contact information: | |
| 19 | -# [email protected] | |
| 20 | -# http://www.hwaci.com/drh/ | |
| 21 | -# | |
| 22 | -############################################################################ | |
| 23 | -# | |
| 24 | -# Tests of the basic check-in/check-out facility | |
| 25 | -# | |
| 26 | - | |
| 27 | -# Construct a repository named "r1". Connect to this | |
| 28 | -# repository from subdirectory "testdir". Initialize the | |
| 29 | -# repository with the source code files to fossil. | |
| 30 | -# | |
| 31 | -# The initial (empty) version is $root. The version with | |
| 32 | -# the source code files in it is $v1. | |
| 33 | -# | |
| 34 | -set srcdir [file dir $testdir]/src | |
| 35 | -file delete -force r1 | |
| 36 | -file delete -force FOSSIL | |
| 37 | -file delete -force testdir | |
| 38 | -file mkdir testdir | |
| 39 | -cd testdir | |
| 40 | -fossil init ../r1 | |
| 41 | -fossil connect ../r1 | |
| 42 | -set root [lindex $RESULT 0] | |
| 43 | -set srcfilelist {} | |
| 44 | -foreach f [lsort [glob $srcdir/*]] { | |
| 45 | - set tail [file tail $f] | |
| 46 | - file copy $f $tail | |
| 47 | - lappend srcfilelist $tail | |
| 48 | -} | |
| 49 | -eval fossil add $srcfilelist | |
| 50 | -fossil commit -m {first checkin} | |
| 51 | -set v1 [lindex $RESULT 0] | |
| 52 | -fossil leaves root | |
| 53 | -test basic1-1.1 {[expr {$v1==[lindex $RESULT 2]}]} | |
| 54 | -fossil changes | |
| 55 | -test basic1-1.2 {$RESULT==""} | |
| 56 | -foreach f $srcfilelist { | |
| 57 | - test basic1-1.3.$f {[same_file $srcdir/$f $f]} | |
| 58 | -} | |
| 59 | -fossil co $root | |
| 60 | -fossil changes | |
| 61 | -test basic1-1.4 {$RESULT==""} | |
| 62 | -foreach f $srcfilelist { | |
| 63 | - test basic1-1.5.$f {![file exists $f]} | |
| 64 | -} | |
| 65 | -fossil co $v1 | |
| 66 | -fossil changes | |
| 67 | -test basic1-1.6 {$RESULT==""} | |
| 68 | -foreach f $srcfilelist { | |
| 69 | - test basic1-1.7.$f {[same_file $srcdir/$f $f]} | |
| 70 | -} | |
| 71 | - | |
| 72 | -# Make random changes to 4 source code files and commit those | |
| 73 | -# changes. Store the new version number in $v2 | |
| 74 | -# | |
| 75 | -set changesinv2 [lrange $srcfilelist 3 6] | |
| 76 | -set i 0 | |
| 77 | -foreach f $changesinv2 { | |
| 78 | - set x [read_file $f] | |
| 79 | - incr i | |
| 80 | - expr {srand(1000+$i)} | |
| 81 | - set y [random_changes $x 4 4 0 0.1] | |
| 82 | - write_file $f $y | |
| 83 | -} | |
| 84 | -file mkdir copyofv2 | |
| 85 | -foreach f $srcfilelist { | |
| 86 | - file copy $f copyofv2/$f | |
| 87 | -} | |
| 88 | -fossil changes | |
| 89 | -set clist {} | |
| 90 | -foreach {op file} $RESULT { | |
| 91 | - test basic1-2.1-$file {$op=="edited:"} | |
| 92 | - lappend clist $file | |
| 93 | -} | |
| 94 | -test basic1-2.2 {[lsort $clist]==[lsort $changesinv2]} | |
| 95 | -fossil commit -m 'second commit' | |
| 96 | -set v2 [lindex $RESULT 0] | |
| 97 | -fossil changes | |
| 98 | -test basic1-2.3 {$RESULT==""} | |
| 99 | -foreach f $srcfilelist { | |
| 100 | - test basic1-2.4-$f {[same_file $f copyofv2/$f]} | |
| 101 | -} | |
| 102 | -fossil checkout $v1 | |
| 103 | -fossil changes | |
| 104 | -test basic1-2.5 {$RESULT==""} | |
| 105 | -foreach f $srcfilelist { | |
| 106 | - test basic1-2.6-$f {[same_file $f $srcdir/$f]} | |
| 107 | -} | |
| 108 | -fossil checkout $root | |
| 109 | -foreach f $srcfilelist { | |
| 110 | - test basic1-2.7-$f {![file exists $f]} | |
| 111 | -} | |
| 112 | -fossil checkout $v2 | |
| 113 | -foreach f $srcfilelist { | |
| 114 | - test basic1-2.8-$f {[same_file $f copyofv2/$f]} | |
| 115 | -} | |
| 116 | - | |
| 117 | -# Starting with version $v1, make changes to 4 other files. | |
| 118 | -# 2 of the files that are changed overlap with the changes | |
| 119 | -# in $v2. Call these new changes $v3. $v3 is a fork. | |
| 120 | -# | |
| 121 | -fossil checkout $v1 | |
| 122 | -set changesinv3 [lrange $srcfilelist 5 8] | |
| 123 | -set i 0 | |
| 124 | -foreach f $changesinv3 { | |
| 125 | - set x [read_file $f] | |
| 126 | - incr i | |
| 127 | - expr {srand(2000+$i)} | |
| 128 | - set y [random_changes $x 4 4 2 0.1] | |
| 129 | - write_file $f $y | |
| 130 | -} | |
| 131 | -file mkdir copyofv3 | |
| 132 | -foreach f $srcfilelist { | |
| 133 | - file copy $f copyofv3/$f | |
| 134 | -} | |
| 135 | -fossil manifest | |
| 136 | -set clist {} | |
| 137 | -set alllist {} | |
| 138 | -foreach {op file} $RESULT { | |
| 139 | - test basic1-3.1-$file {$op=="edited:" || $op=="unchanged:"} | |
| 140 | - lappend alllist $file | |
| 141 | - if {$op=="edited:"} {lappend clist $file} | |
| 142 | -} | |
| 143 | -test basic1-3.2 {[lsort $clist]==[lsort $changesinv3]} | |
| 144 | -test basic1-3.3 {[lsort $alllist]==[lsort $srcfilelist]} | |
| 145 | -fossil commit -m {fork the main branch} | |
| 146 | -set v3 [lindex $RESULT 0] | |
| 147 | -fossil changes | |
| 148 | -test basic1-3.4 {$RESULT==""} | |
| 149 | -foreach f $srcfilelist { | |
| 150 | - test basic1-3.5-$f {[same_file $f copyofv3/$f]} | |
| 151 | -} | |
| 152 | -fossil co $v1 | |
| 153 | -fossil changes | |
| 154 | -test basic1-3.5 {$RESULT==""} | |
| 155 | -foreach f $srcfilelist { | |
| 156 | - test basic1-3.6-$f {[same_file $f $srcdir/$f]} | |
| 157 | -} | |
| 158 | -fossil co $v2 | |
| 159 | -fossil changes | |
| 160 | -test basic1-3.7 {$RESULT==""} | |
| 161 | -foreach f $srcfilelist { | |
| 162 | - test basic1-3.8-$f {[same_file $f copyofv2/$f]} | |
| 163 | -} | |
| 164 | -fossil co $v3 | |
| 165 | -fossil changes | |
| 166 | -test basic1-3.8 {$RESULT==""} | |
| 167 | -foreach f $srcfilelist { | |
| 168 | - test basic1-3.9-$f {[same_file $f copyofv3/$f]} | |
| 169 | -} | |
| 170 | -fossil leaves root | |
| 171 | -test basic1-3.10 {[lindex $RESULT 2]==$v3} | |
| 172 | -test basic1-3.11 {[lindex $RESULT 5]==$v2} | |
| 173 | - | |
| 174 | -# Now we will merge $v2 and $v3 to produce $v4. $v3 is currently | |
| 175 | -# in the working tree. | |
| 176 | -# | |
| 177 | -file mkdir copyofv4 | |
| 178 | -foreach f $srcfilelist { | |
| 179 | - file copy copyofv3/$f copyofv4/$f | |
| 180 | -} | |
| 181 | -set i 0 | |
| 182 | -foreach f $changesinv2 { | |
| 183 | - set x [read_file $f] | |
| 184 | - incr i | |
| 185 | - expr {srand(1000+$i)} | |
| 186 | - set y [random_changes $x 4 4 0 0.1] | |
| 187 | - write_file copyofv4/$f $y | |
| 188 | -} | |
| 189 | -fossil merge $v2 | |
| 190 | -foreach f $srcfilelist { | |
| 191 | - test basic1-4.1-$f {[same_file $f copyofv4/$f]} | |
| 192 | -} | |
| 193 | -fossil changes | |
| 194 | -set clist {} | |
| 195 | -foreach {op file} $RESULT { | |
| 196 | - test basic1-4.2-$file {$op=="edited:"} | |
| 197 | - lappend clist $file | |
| 198 | -} | |
| 199 | -test basic1-4.3 {[lsort $clist]==[lsort $changesinv2]} | |
| 200 | -fossil commit -m {first merge} | |
| 201 | -set v4 [lindex $RESULT 0] | |
| 202 | -foreach f $srcfilelist { | |
| 203 | - test basic1-4.4-$f {[same_file $f copyofv4/$f]} | |
| 204 | -} | |
| 205 | -fossil leaves root | |
| 206 | -test basic1-4.5 {[llength $RESULT]==3} | |
| 207 | -test basic1-4.6 {[lindex $RESULT 2]==$v4} | |
| 208 | -fossil co $v1 | |
| 209 | -fossil changes | |
| 210 | -test basic1-4.7 {$RESULT==""} | |
| 211 | -foreach f $srcfilelist { | |
| 212 | - test basic1-4.8-$f {[same_file $f $srcdir/$f]} | |
| 213 | -} | |
| 214 | -fossil co $v2 | |
| 215 | -fossil changes | |
| 216 | -test basic1-4.9 {$RESULT==""} | |
| 217 | -foreach f $srcfilelist { | |
| 218 | - test basic1-4.10-$f {[same_file $f copyofv2/$f]} | |
| 219 | -} | |
| 220 | -fossil co $v3 | |
| 221 | -fossil changes | |
| 222 | -test basic1-4.11 {$RESULT==""} | |
| 223 | -foreach f $srcfilelist { | |
| 224 | - test basic1-4.12-$f {[same_file $f copyofv3/$f]} | |
| 225 | -} | |
| 226 | -fossil co $v4 | |
| 227 | -fossil changes | |
| 228 | -test basic1-4.13 {$RESULT==""} | |
| 229 | -foreach f $srcfilelist { | |
| 230 | - test basic1-4.14-$f {[same_file $f copyofv4/$f]} | |
| 231 | -} |
| --- a/test/basic1.test | |
| +++ b/test/basic1.test | |
| @@ -1,231 +0,0 @@ | |
| 1 | # |
| 2 | # Copyright (c) 2006 D. Richard Hipp |
| 3 | # |
| 4 | # This program is free software; you can redistribute it and/or |
| 5 | # modify it under the terms of the GNU General Public |
| 6 | # License version 2 as published by the Free Software Foundation. |
| 7 | # |
| 8 | # This program is distributed in the hope that it will be useful, |
| 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 11 | # General Public License for more details. |
| 12 | # |
| 13 | # You should have received a copy of the GNU General Public |
| 14 | # License along with this library; if not, write to the |
| 15 | # Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
| 16 | # Boston, MA 02111-1307, USA. |
| 17 | # |
| 18 | # Author contact information: |
| 19 | # [email protected] |
| 20 | # http://www.hwaci.com/drh/ |
| 21 | # |
| 22 | ############################################################################ |
| 23 | # |
| 24 | # Tests of the basic check-in/check-out facility |
| 25 | # |
| 26 | |
| 27 | # Construct a repository named "r1". Connect to this |
| 28 | # repository from subdirectory "testdir". Initialize the |
| 29 | # repository with the source code files to fossil. |
| 30 | # |
| 31 | # The initial (empty) version is $root. The version with |
| 32 | # the source code files in it is $v1. |
| 33 | # |
| 34 | set srcdir [file dir $testdir]/src |
| 35 | file delete -force r1 |
| 36 | file delete -force FOSSIL |
| 37 | file delete -force testdir |
| 38 | file mkdir testdir |
| 39 | cd testdir |
| 40 | fossil init ../r1 |
| 41 | fossil connect ../r1 |
| 42 | set root [lindex $RESULT 0] |
| 43 | set srcfilelist {} |
| 44 | foreach f [lsort [glob $srcdir/*]] { |
| 45 | set tail [file tail $f] |
| 46 | file copy $f $tail |
| 47 | lappend srcfilelist $tail |
| 48 | } |
| 49 | eval fossil add $srcfilelist |
| 50 | fossil commit -m {first checkin} |
| 51 | set v1 [lindex $RESULT 0] |
| 52 | fossil leaves root |
| 53 | test basic1-1.1 {[expr {$v1==[lindex $RESULT 2]}]} |
| 54 | fossil changes |
| 55 | test basic1-1.2 {$RESULT==""} |
| 56 | foreach f $srcfilelist { |
| 57 | test basic1-1.3.$f {[same_file $srcdir/$f $f]} |
| 58 | } |
| 59 | fossil co $root |
| 60 | fossil changes |
| 61 | test basic1-1.4 {$RESULT==""} |
| 62 | foreach f $srcfilelist { |
| 63 | test basic1-1.5.$f {![file exists $f]} |
| 64 | } |
| 65 | fossil co $v1 |
| 66 | fossil changes |
| 67 | test basic1-1.6 {$RESULT==""} |
| 68 | foreach f $srcfilelist { |
| 69 | test basic1-1.7.$f {[same_file $srcdir/$f $f]} |
| 70 | } |
| 71 | |
| 72 | # Make random changes to 4 source code files and commit those |
| 73 | # changes. Store the new version number in $v2 |
| 74 | # |
| 75 | set changesinv2 [lrange $srcfilelist 3 6] |
| 76 | set i 0 |
| 77 | foreach f $changesinv2 { |
| 78 | set x [read_file $f] |
| 79 | incr i |
| 80 | expr {srand(1000+$i)} |
| 81 | set y [random_changes $x 4 4 0 0.1] |
| 82 | write_file $f $y |
| 83 | } |
| 84 | file mkdir copyofv2 |
| 85 | foreach f $srcfilelist { |
| 86 | file copy $f copyofv2/$f |
| 87 | } |
| 88 | fossil changes |
| 89 | set clist {} |
| 90 | foreach {op file} $RESULT { |
| 91 | test basic1-2.1-$file {$op=="edited:"} |
| 92 | lappend clist $file |
| 93 | } |
| 94 | test basic1-2.2 {[lsort $clist]==[lsort $changesinv2]} |
| 95 | fossil commit -m 'second commit' |
| 96 | set v2 [lindex $RESULT 0] |
| 97 | fossil changes |
| 98 | test basic1-2.3 {$RESULT==""} |
| 99 | foreach f $srcfilelist { |
| 100 | test basic1-2.4-$f {[same_file $f copyofv2/$f]} |
| 101 | } |
| 102 | fossil checkout $v1 |
| 103 | fossil changes |
| 104 | test basic1-2.5 {$RESULT==""} |
| 105 | foreach f $srcfilelist { |
| 106 | test basic1-2.6-$f {[same_file $f $srcdir/$f]} |
| 107 | } |
| 108 | fossil checkout $root |
| 109 | foreach f $srcfilelist { |
| 110 | test basic1-2.7-$f {![file exists $f]} |
| 111 | } |
| 112 | fossil checkout $v2 |
| 113 | foreach f $srcfilelist { |
| 114 | test basic1-2.8-$f {[same_file $f copyofv2/$f]} |
| 115 | } |
| 116 | |
| 117 | # Starting with version $v1, make changes to 4 other files. |
| 118 | # 2 of the files that are changed overlap with the changes |
| 119 | # in $v2. Call these new changes $v3. $v3 is a fork. |
| 120 | # |
| 121 | fossil checkout $v1 |
| 122 | set changesinv3 [lrange $srcfilelist 5 8] |
| 123 | set i 0 |
| 124 | foreach f $changesinv3 { |
| 125 | set x [read_file $f] |
| 126 | incr i |
| 127 | expr {srand(2000+$i)} |
| 128 | set y [random_changes $x 4 4 2 0.1] |
| 129 | write_file $f $y |
| 130 | } |
| 131 | file mkdir copyofv3 |
| 132 | foreach f $srcfilelist { |
| 133 | file copy $f copyofv3/$f |
| 134 | } |
| 135 | fossil manifest |
| 136 | set clist {} |
| 137 | set alllist {} |
| 138 | foreach {op file} $RESULT { |
| 139 | test basic1-3.1-$file {$op=="edited:" || $op=="unchanged:"} |
| 140 | lappend alllist $file |
| 141 | if {$op=="edited:"} {lappend clist $file} |
| 142 | } |
| 143 | test basic1-3.2 {[lsort $clist]==[lsort $changesinv3]} |
| 144 | test basic1-3.3 {[lsort $alllist]==[lsort $srcfilelist]} |
| 145 | fossil commit -m {fork the main branch} |
| 146 | set v3 [lindex $RESULT 0] |
| 147 | fossil changes |
| 148 | test basic1-3.4 {$RESULT==""} |
| 149 | foreach f $srcfilelist { |
| 150 | test basic1-3.5-$f {[same_file $f copyofv3/$f]} |
| 151 | } |
| 152 | fossil co $v1 |
| 153 | fossil changes |
| 154 | test basic1-3.5 {$RESULT==""} |
| 155 | foreach f $srcfilelist { |
| 156 | test basic1-3.6-$f {[same_file $f $srcdir/$f]} |
| 157 | } |
| 158 | fossil co $v2 |
| 159 | fossil changes |
| 160 | test basic1-3.7 {$RESULT==""} |
| 161 | foreach f $srcfilelist { |
| 162 | test basic1-3.8-$f {[same_file $f copyofv2/$f]} |
| 163 | } |
| 164 | fossil co $v3 |
| 165 | fossil changes |
| 166 | test basic1-3.8 {$RESULT==""} |
| 167 | foreach f $srcfilelist { |
| 168 | test basic1-3.9-$f {[same_file $f copyofv3/$f]} |
| 169 | } |
| 170 | fossil leaves root |
| 171 | test basic1-3.10 {[lindex $RESULT 2]==$v3} |
| 172 | test basic1-3.11 {[lindex $RESULT 5]==$v2} |
| 173 | |
| 174 | # Now we will merge $v2 and $v3 to produce $v4. $v3 is currently |
| 175 | # in the working tree. |
| 176 | # |
| 177 | file mkdir copyofv4 |
| 178 | foreach f $srcfilelist { |
| 179 | file copy copyofv3/$f copyofv4/$f |
| 180 | } |
| 181 | set i 0 |
| 182 | foreach f $changesinv2 { |
| 183 | set x [read_file $f] |
| 184 | incr i |
| 185 | expr {srand(1000+$i)} |
| 186 | set y [random_changes $x 4 4 0 0.1] |
| 187 | write_file copyofv4/$f $y |
| 188 | } |
| 189 | fossil merge $v2 |
| 190 | foreach f $srcfilelist { |
| 191 | test basic1-4.1-$f {[same_file $f copyofv4/$f]} |
| 192 | } |
| 193 | fossil changes |
| 194 | set clist {} |
| 195 | foreach {op file} $RESULT { |
| 196 | test basic1-4.2-$file {$op=="edited:"} |
| 197 | lappend clist $file |
| 198 | } |
| 199 | test basic1-4.3 {[lsort $clist]==[lsort $changesinv2]} |
| 200 | fossil commit -m {first merge} |
| 201 | set v4 [lindex $RESULT 0] |
| 202 | foreach f $srcfilelist { |
| 203 | test basic1-4.4-$f {[same_file $f copyofv4/$f]} |
| 204 | } |
| 205 | fossil leaves root |
| 206 | test basic1-4.5 {[llength $RESULT]==3} |
| 207 | test basic1-4.6 {[lindex $RESULT 2]==$v4} |
| 208 | fossil co $v1 |
| 209 | fossil changes |
| 210 | test basic1-4.7 {$RESULT==""} |
| 211 | foreach f $srcfilelist { |
| 212 | test basic1-4.8-$f {[same_file $f $srcdir/$f]} |
| 213 | } |
| 214 | fossil co $v2 |
| 215 | fossil changes |
| 216 | test basic1-4.9 {$RESULT==""} |
| 217 | foreach f $srcfilelist { |
| 218 | test basic1-4.10-$f {[same_file $f copyofv2/$f]} |
| 219 | } |
| 220 | fossil co $v3 |
| 221 | fossil changes |
| 222 | test basic1-4.11 {$RESULT==""} |
| 223 | foreach f $srcfilelist { |
| 224 | test basic1-4.12-$f {[same_file $f copyofv3/$f]} |
| 225 | } |
| 226 | fossil co $v4 |
| 227 | fossil changes |
| 228 | test basic1-4.13 {$RESULT==""} |
| 229 | foreach f $srcfilelist { |
| 230 | test basic1-4.14-$f {[same_file $f copyofv4/$f]} |
| 231 | } |
| --- a/test/basic1.test | |
| +++ b/test/basic1.test | |
| @@ -1,231 +0,0 @@ | |
+190
| --- a/wiki_and_ticket_ideas.txt | ||
| +++ b/wiki_and_ticket_ideas.txt | ||
| @@ -0,0 +1,190 @@ | ||
| 1 | +Thoughts On How To Implement Wiki And Tickets In Fossil | |
| 2 | + | |
| 3 | +The crux of the problem of wiki and tickets is not how | |
| 4 | +to render the information. There are countless other | |
| 5 | +wiki and ticket systems that have explored this territory. | |
| 6 | +We have a lot of experience rendering wiki and writing | |
| 7 | +ticketing systems and we know how that part works. The | |
| 8 | +hard part about doing wiki and tickets in Fossil is | |
| 9 | +figuring how how to synchronize the wiki and tickets | |
| 10 | +across different repositories. | |
| 11 | + | |
| 12 | +There are a number of approaches: | |
| 13 | + | |
| 14 | +(1) Don't synchronize. Write a traditional wiki and ticket | |
| 15 | + system that lives on a single repository. Fossil will | |
| 16 | + sync the source tree from one repository to another but | |
| 17 | + the wiki and tickets live in separate tables of the | |
| 18 | + database stay on a single repository. | |
| 19 | + | |
| 20 | +(2) Make each wiki pages and each ticket a file in the source | |
| 21 | + tree. Each change to a wiki page or ticket creates a new | |
| 22 | + baseline. Actually, wiki and ticket changes could cluster | |
| 23 | + so that each new baseline contained multiple wiki and | |
| 24 | + ticket changes, but any isolated wiki or ticket change | |
| 25 | + still requires a new baseline. | |
| 26 | + | |
| 27 | +(3) Store each wiki page and ticket as a separate branch of | |
| 28 | + the source tree that forks at the very root of the tree. | |
| 29 | + Every change to a wiki page or ticket still requires a | |
| 30 | + new baseline, but the baseline consists of single file | |
| 31 | + change and is thus quite compact and easy to manage. | |
| 32 | + | |
| 33 | +(4) Other synchronization methods. We could treat the wiki | |
| 34 | + and/or tickets as a completely separate system with its | |
| 35 | + on synchronization protocol that just happens to live in | |
| 36 | + the same executable and use the same database as the | |
| 37 | + source tree sync mechanism. | |
| 38 | + | |
| 39 | +(5) Hybrid approaches. One can combine any of the previous | |
| 40 | + four approaches to wiki and ticket synchronization to | |
| 41 | + generate a hybrid. | |
| 42 | + | |
| 43 | +The advantage of (1) is that it is simple and direct and | |
| 44 | +easy to implement. We already know how to do wiki and tickets | |
| 45 | +on a single server with a database. CVSTrac is a good example | |
| 46 | +of these and there are countless other excellent examples. | |
| 47 | +Method (1) also keeps the wiki and tickets distinct from the | |
| 48 | +source files. The problem with (1) is that you cannot take | |
| 49 | +the wiki or tickets with your for disconnected operation. | |
| 50 | +Well, maybe you could pull down a complete copy of the wiki | |
| 51 | +and ticket tables to carry with you on the airplane, but even | |
| 52 | +then you would not be able to make changes and then later | |
| 53 | +synchronize those changes with the main repository. | |
| 54 | + | |
| 55 | +Method (2) makes each wiki page and each ticket a separate | |
| 56 | +file in the source tree. This means that the existing versioning | |
| 57 | +and synchronization logic is unchanged. And the repository | |
| 58 | +file format is simple and easy to describe. (The simplicity | |
| 59 | +of the file format is an important feature for my intended | |
| 60 | +use of Fossil. The ability to reconstruct a baseline from | |
| 61 | +raw artifacts with no special software is an important though | |
| 62 | +not well described feature of Fossil.) Having wiki and tickets | |
| 63 | +readily at hand also gives the interesting possibility of editing | |
| 64 | +tickets and especially wiki using your favorite text editor, | |
| 65 | +rather than having to use an often clunky web interface. | |
| 66 | +The web interface is still provided, of course, but if the | |
| 67 | +wiki source text is there in a file in front of you, how much | |
| 68 | +easier it would be to edit it using emacs or vi. | |
| 69 | + | |
| 70 | +Among the disadvantages of (2) is that it greatly increases | |
| 71 | +the number of files in the source tree because of the added | |
| 72 | +wiki and tickets. The SQLite project, for example, currently | |
| 73 | +has about 560 files in the tree. But there are around 2600 | |
| 74 | +tickets and 120 wiki pages. If we remove tickets that are | |
| 75 | +closed we can get down to around 800 tickets. And if I were | |
| 76 | +more aggressive about closing tickets, that number might be | |
| 77 | +lower. But there are still more tickets than there are source | |
| 78 | +files. The number of wiki pages is not that great, but on | |
| 79 | +the other hand the SQLite wiki is not active like the Tcl/Tk | |
| 80 | +wiki. | |
| 81 | + | |
| 82 | +Another disadvantage of (2) is that you cannot add a ticket | |
| 83 | +or fix a ticket on a baseline after the baseline is created. | |
| 84 | +To add or fix a ticket, you have to create a new baseline. | |
| 85 | +That means that if a bug is discovered in a baseline after its | |
| 86 | +release, you cannot add the ticket to the baseline in which | |
| 87 | +the bug was found; you have to put the ticket in a follow-on | |
| 88 | +baseline. This seems weird. Perhaps some additional processing | |
| 89 | +inside of fossil can identify when tickets are added to subsequent | |
| 90 | +baselines and tag prior baselines accordingly. On the other hand, | |
| 91 | +because tickets are part of the baseline, tickets fixed in one | |
| 92 | +branch remain open in parallel branches until fixed separately | |
| 93 | +there, as they should be. | |
| 94 | + | |
| 95 | +Any interesting question with method (2) is what baseline to | |
| 96 | +use for displaying wiki and tickets on the web interface. | |
| 97 | +Clearly the display should use a leaf baseline. But the | |
| 98 | +project might have several peer branches each with their | |
| 99 | +own leaves. Which leaf should be used to display the wiki | |
| 100 | +and tickets? Is there an interface that allows the user to | |
| 101 | +browse through wiki and tickets from prior baselines? | |
| 102 | + | |
| 103 | +The third method solves the many-files problem of method (2). | |
| 104 | +In (3), each wiki page and ever ticket becomes a separate | |
| 105 | +branch of the baseline change hierarchy. So the number of | |
| 106 | +files in the source tree remains small. The problem here is | |
| 107 | +the number of branches in the baseline hierarchy explodes. | |
| 108 | +The amount of network traffic used by the synchronization | |
| 109 | +protocol (and to some degree the amount of CPU time) is | |
| 110 | +proportional to the number of leaves in the baseline hierarchy. | |
| 111 | +If every wiki page and every ticket is in its own tree with | |
| 112 | +at least one leaf, then suddenly the project goes from have | |
| 113 | +a 6 or 12 leaves to having thousands. The synchronization | |
| 114 | +protocol would have to be enhanced to deal with this. I have | |
| 115 | +outlined ways of doing this, but they involve more complex | |
| 116 | +file format and more complicated wire protocols. My assessment | |
| 117 | +is that this approach is not consistent with simplicity. | |
| 118 | + | |
| 119 | +In the list above, I mention methods (4) and (5) mostly as a | |
| 120 | +way of showing that the list of (1) through (3) does not intend | |
| 121 | +to be exhaustive. One can certainly devise variations on | |
| 122 | +methods (1) through (3) to accomplish the same thing. And there | |
| 123 | +might be other techniques that I have not thought of yet. | |
| 124 | + | |
| 125 | +I have been vacillating between methods (1), (2), and (3) for | |
| 126 | +months. As of this writing, I am leaning toward (2) with | |
| 127 | +careful attention to the ticket interpreter within Fossil so | |
| 128 | +that when a ticket in a later baseline is written against an | |
| 129 | +earlier baseline, a link is established in the database so that | |
| 130 | +the later ticket is displayed with the earlier baseline. (The | |
| 131 | +details are still sketchy.) Scaling is still an issue. But | |
| 132 | +for the kinds of projects that Fossil is intended, I do not | |
| 133 | +expect the number of wiki pages or tickets to become excessive. | |
| 134 | +Fossil is not intended to be a replacement for the tcler's wiki | |
| 135 | +or for wikipedia. Fossil is designed to be a convenient and | |
| 136 | +self-contained CM system for an SQLite-sized project. Just | |
| 137 | +as SQLite is not intended to replace Oracle, so Fossil is not | |
| 138 | +intended to replace the server farm at a Web 2.0 startup. | |
| 139 | + | |
| 140 | +------------- 2007-08-02 --------------- | |
| 141 | + | |
| 142 | +Wiki and tickets need not be handled in the same way. Method | |
| 143 | +(1) is disadvantageous to tickets since we what to be able to | |
| 144 | +carry tickets with us, and modify them, while working offline. | |
| 145 | +But the need to modify wiki offline is not nearly as acute. | |
| 146 | +Hence consideration should be given to implementations that | |
| 147 | +use different methods for handling tickets and wiki. | |
| 148 | + | |
| 149 | +Another hybrid method worth consideration is to place | |
| 150 | +baselines of wiki and/or tickets in the source tree but | |
| 151 | +allow overlays or deltas to be entered on a per-server | |
| 152 | +basis. The overlays or deltas are not synchronized between | |
| 153 | +servers. But one can take a "snapshot" of the overlays/deltas | |
| 154 | +to create a new source tree baseline which could then be | |
| 155 | +synchronized and used and/or modified offline. Let us call | |
| 156 | +refer to this new methods as (6). Here are the details: | |
| 157 | + | |
| 158 | + * Tickets or wiki or both are stored as part of the tree | |
| 159 | + as described in method (2). | |
| 160 | + | |
| 161 | + * Web-based changes to wiki or tickets are not written back | |
| 162 | + into the tree but are instead stored locally in a cache | |
| 163 | + of exceptions or overlays. | |
| 164 | + | |
| 165 | + * When the web interface goes to look for a ticket or a | |
| 166 | + wiki it consults its local cache first and then if not | |
| 167 | + found there, a designated baseline. | |
| 168 | + | |
| 169 | + * The cache of changes is not synchronized by the push, | |
| 170 | + pull, or sync commands. It is local to the repository | |
| 171 | + on which it is entered. | |
| 172 | + | |
| 173 | + * A button on the web interface (invoked by users with | |
| 174 | + appropriate privileges) takes all locally cached changes | |
| 175 | + and adds them to the tree in a new baseline. | |
| 176 | + | |
| 177 | + * Locally cached changes are against a specific baseline. | |
| 178 | + That specific baseline is used as backup if a page or | |
| 179 | + ticket request is not found in the local cache. If the | |
| 180 | + backing baseline is changed, the local cache automatically | |
| 181 | + merges in the differences in wiki or tickets between | |
| 182 | + the old and new baselines. | |
| 183 | + | |
| 184 | +This approach still leaves the many-files problem. In SQLite, | |
| 185 | +there are about 500 source files and about 3000 different ticket | |
| 186 | +and wiki page titles. But if the wiki isn't that big and if | |
| 187 | +tickets are removed from baselines after they have been closed | |
| 188 | +for 30 days or longer and if tickets are dealt with aggressively, | |
| 189 | +there perhaps the many-files problem won't be such a big deal. | |
| 190 | + |
| --- a/wiki_and_ticket_ideas.txt | |
| +++ b/wiki_and_ticket_ideas.txt | |
| @@ -0,0 +1,190 @@ | |
| --- a/wiki_and_ticket_ideas.txt | |
| +++ b/wiki_and_ticket_ideas.txt | |
| @@ -0,0 +1,190 @@ | |
| 1 | Thoughts On How To Implement Wiki And Tickets In Fossil |
| 2 | |
| 3 | The crux of the problem of wiki and tickets is not how |
| 4 | to render the information. There are countless other |
| 5 | wiki and ticket systems that have explored this territory. |
| 6 | We have a lot of experience rendering wiki and writing |
| 7 | ticketing systems and we know how that part works. The |
| 8 | hard part about doing wiki and tickets in Fossil is |
| 9 | figuring how how to synchronize the wiki and tickets |
| 10 | across different repositories. |
| 11 | |
| 12 | There are a number of approaches: |
| 13 | |
| 14 | (1) Don't synchronize. Write a traditional wiki and ticket |
| 15 | system that lives on a single repository. Fossil will |
| 16 | sync the source tree from one repository to another but |
| 17 | the wiki and tickets live in separate tables of the |
| 18 | database stay on a single repository. |
| 19 | |
| 20 | (2) Make each wiki pages and each ticket a file in the source |
| 21 | tree. Each change to a wiki page or ticket creates a new |
| 22 | baseline. Actually, wiki and ticket changes could cluster |
| 23 | so that each new baseline contained multiple wiki and |
| 24 | ticket changes, but any isolated wiki or ticket change |
| 25 | still requires a new baseline. |
| 26 | |
| 27 | (3) Store each wiki page and ticket as a separate branch of |
| 28 | the source tree that forks at the very root of the tree. |
| 29 | Every change to a wiki page or ticket still requires a |
| 30 | new baseline, but the baseline consists of single file |
| 31 | change and is thus quite compact and easy to manage. |
| 32 | |
| 33 | (4) Other synchronization methods. We could treat the wiki |
| 34 | and/or tickets as a completely separate system with its |
| 35 | on synchronization protocol that just happens to live in |
| 36 | the same executable and use the same database as the |
| 37 | source tree sync mechanism. |
| 38 | |
| 39 | (5) Hybrid approaches. One can combine any of the previous |
| 40 | four approaches to wiki and ticket synchronization to |
| 41 | generate a hybrid. |
| 42 | |
| 43 | The advantage of (1) is that it is simple and direct and |
| 44 | easy to implement. We already know how to do wiki and tickets |
| 45 | on a single server with a database. CVSTrac is a good example |
| 46 | of these and there are countless other excellent examples. |
| 47 | Method (1) also keeps the wiki and tickets distinct from the |
| 48 | source files. The problem with (1) is that you cannot take |
| 49 | the wiki or tickets with your for disconnected operation. |
| 50 | Well, maybe you could pull down a complete copy of the wiki |
| 51 | and ticket tables to carry with you on the airplane, but even |
| 52 | then you would not be able to make changes and then later |
| 53 | synchronize those changes with the main repository. |
| 54 | |
| 55 | Method (2) makes each wiki page and each ticket a separate |
| 56 | file in the source tree. This means that the existing versioning |
| 57 | and synchronization logic is unchanged. And the repository |
| 58 | file format is simple and easy to describe. (The simplicity |
| 59 | of the file format is an important feature for my intended |
| 60 | use of Fossil. The ability to reconstruct a baseline from |
| 61 | raw artifacts with no special software is an important though |
| 62 | not well described feature of Fossil.) Having wiki and tickets |
| 63 | readily at hand also gives the interesting possibility of editing |
| 64 | tickets and especially wiki using your favorite text editor, |
| 65 | rather than having to use an often clunky web interface. |
| 66 | The web interface is still provided, of course, but if the |
| 67 | wiki source text is there in a file in front of you, how much |
| 68 | easier it would be to edit it using emacs or vi. |
| 69 | |
| 70 | Among the disadvantages of (2) is that it greatly increases |
| 71 | the number of files in the source tree because of the added |
| 72 | wiki and tickets. The SQLite project, for example, currently |
| 73 | has about 560 files in the tree. But there are around 2600 |
| 74 | tickets and 120 wiki pages. If we remove tickets that are |
| 75 | closed we can get down to around 800 tickets. And if I were |
| 76 | more aggressive about closing tickets, that number might be |
| 77 | lower. But there are still more tickets than there are source |
| 78 | files. The number of wiki pages is not that great, but on |
| 79 | the other hand the SQLite wiki is not active like the Tcl/Tk |
| 80 | wiki. |
| 81 | |
| 82 | Another disadvantage of (2) is that you cannot add a ticket |
| 83 | or fix a ticket on a baseline after the baseline is created. |
| 84 | To add or fix a ticket, you have to create a new baseline. |
| 85 | That means that if a bug is discovered in a baseline after its |
| 86 | release, you cannot add the ticket to the baseline in which |
| 87 | the bug was found; you have to put the ticket in a follow-on |
| 88 | baseline. This seems weird. Perhaps some additional processing |
| 89 | inside of fossil can identify when tickets are added to subsequent |
| 90 | baselines and tag prior baselines accordingly. On the other hand, |
| 91 | because tickets are part of the baseline, tickets fixed in one |
| 92 | branch remain open in parallel branches until fixed separately |
| 93 | there, as they should be. |
| 94 | |
| 95 | Any interesting question with method (2) is what baseline to |
| 96 | use for displaying wiki and tickets on the web interface. |
| 97 | Clearly the display should use a leaf baseline. But the |
| 98 | project might have several peer branches each with their |
| 99 | own leaves. Which leaf should be used to display the wiki |
| 100 | and tickets? Is there an interface that allows the user to |
| 101 | browse through wiki and tickets from prior baselines? |
| 102 | |
| 103 | The third method solves the many-files problem of method (2). |
| 104 | In (3), each wiki page and ever ticket becomes a separate |
| 105 | branch of the baseline change hierarchy. So the number of |
| 106 | files in the source tree remains small. The problem here is |
| 107 | the number of branches in the baseline hierarchy explodes. |
| 108 | The amount of network traffic used by the synchronization |
| 109 | protocol (and to some degree the amount of CPU time) is |
| 110 | proportional to the number of leaves in the baseline hierarchy. |
| 111 | If every wiki page and every ticket is in its own tree with |
| 112 | at least one leaf, then suddenly the project goes from have |
| 113 | a 6 or 12 leaves to having thousands. The synchronization |
| 114 | protocol would have to be enhanced to deal with this. I have |
| 115 | outlined ways of doing this, but they involve more complex |
| 116 | file format and more complicated wire protocols. My assessment |
| 117 | is that this approach is not consistent with simplicity. |
| 118 | |
| 119 | In the list above, I mention methods (4) and (5) mostly as a |
| 120 | way of showing that the list of (1) through (3) does not intend |
| 121 | to be exhaustive. One can certainly devise variations on |
| 122 | methods (1) through (3) to accomplish the same thing. And there |
| 123 | might be other techniques that I have not thought of yet. |
| 124 | |
| 125 | I have been vacillating between methods (1), (2), and (3) for |
| 126 | months. As of this writing, I am leaning toward (2) with |
| 127 | careful attention to the ticket interpreter within Fossil so |
| 128 | that when a ticket in a later baseline is written against an |
| 129 | earlier baseline, a link is established in the database so that |
| 130 | the later ticket is displayed with the earlier baseline. (The |
| 131 | details are still sketchy.) Scaling is still an issue. But |
| 132 | for the kinds of projects that Fossil is intended, I do not |
| 133 | expect the number of wiki pages or tickets to become excessive. |
| 134 | Fossil is not intended to be a replacement for the tcler's wiki |
| 135 | or for wikipedia. Fossil is designed to be a convenient and |
| 136 | self-contained CM system for an SQLite-sized project. Just |
| 137 | as SQLite is not intended to replace Oracle, so Fossil is not |
| 138 | intended to replace the server farm at a Web 2.0 startup. |
| 139 | |
| 140 | ------------- 2007-08-02 --------------- |
| 141 | |
| 142 | Wiki and tickets need not be handled in the same way. Method |
| 143 | (1) is disadvantageous to tickets since we what to be able to |
| 144 | carry tickets with us, and modify them, while working offline. |
| 145 | But the need to modify wiki offline is not nearly as acute. |
| 146 | Hence consideration should be given to implementations that |
| 147 | use different methods for handling tickets and wiki. |
| 148 | |
| 149 | Another hybrid method worth consideration is to place |
| 150 | baselines of wiki and/or tickets in the source tree but |
| 151 | allow overlays or deltas to be entered on a per-server |
| 152 | basis. The overlays or deltas are not synchronized between |
| 153 | servers. But one can take a "snapshot" of the overlays/deltas |
| 154 | to create a new source tree baseline which could then be |
| 155 | synchronized and used and/or modified offline. Let us call |
| 156 | refer to this new methods as (6). Here are the details: |
| 157 | |
| 158 | * Tickets or wiki or both are stored as part of the tree |
| 159 | as described in method (2). |
| 160 | |
| 161 | * Web-based changes to wiki or tickets are not written back |
| 162 | into the tree but are instead stored locally in a cache |
| 163 | of exceptions or overlays. |
| 164 | |
| 165 | * When the web interface goes to look for a ticket or a |
| 166 | wiki it consults its local cache first and then if not |
| 167 | found there, a designated baseline. |
| 168 | |
| 169 | * The cache of changes is not synchronized by the push, |
| 170 | pull, or sync commands. It is local to the repository |
| 171 | on which it is entered. |
| 172 | |
| 173 | * A button on the web interface (invoked by users with |
| 174 | appropriate privileges) takes all locally cached changes |
| 175 | and adds them to the tree in a new baseline. |
| 176 | |
| 177 | * Locally cached changes are against a specific baseline. |
| 178 | That specific baseline is used as backup if a page or |
| 179 | ticket request is not found in the local cache. If the |
| 180 | backing baseline is changed, the local cache automatically |
| 181 | merges in the differences in wiki or tickets between |
| 182 | the old and new baselines. |
| 183 | |
| 184 | This approach still leaves the many-files problem. In SQLite, |
| 185 | there are about 500 source files and about 3000 different ticket |
| 186 | and wiki page titles. But if the wiki isn't that big and if |
| 187 | tickets are removed from baselines after they have been closed |
| 188 | for 30 days or longer and if tickets are dealt with aggressively, |
| 189 | there perhaps the many-files problem won't be such a big deal. |
| 190 |
+2
| --- www/build.html | ||
| +++ www/build.html | ||
| @@ -1,9 +1,11 @@ | ||
| 1 | 1 | <html> |
| 2 | 2 | <title>Building And Installing Fossil</title> |
| 3 | 3 | </head> |
| 4 | 4 | <body bgcolor="white"> |
| 5 | +<p>[ <a href="index.html">Index</a> ]</p> | |
| 6 | +<hr> | |
| 5 | 7 | <h1>Installing Fossil</h1> |
| 6 | 8 | |
| 7 | 9 | <p>This page describes how to build and install Fossil. The |
| 8 | 10 | whole process is designed to be very easy.</p> |
| 9 | 11 | |
| 10 | 12 |
| --- www/build.html | |
| +++ www/build.html | |
| @@ -1,9 +1,11 @@ | |
| 1 | <html> |
| 2 | <title>Building And Installing Fossil</title> |
| 3 | </head> |
| 4 | <body bgcolor="white"> |
| 5 | <h1>Installing Fossil</h1> |
| 6 | |
| 7 | <p>This page describes how to build and install Fossil. The |
| 8 | whole process is designed to be very easy.</p> |
| 9 | |
| 10 |
| --- www/build.html | |
| +++ www/build.html | |
| @@ -1,9 +1,11 @@ | |
| 1 | <html> |
| 2 | <title>Building And Installing Fossil</title> |
| 3 | </head> |
| 4 | <body bgcolor="white"> |
| 5 | <p>[ <a href="index.html">Index</a> ]</p> |
| 6 | <hr> |
| 7 | <h1>Installing Fossil</h1> |
| 8 | |
| 9 | <p>This page describes how to build and install Fossil. The |
| 10 | whole process is designed to be very easy.</p> |
| 11 | |
| 12 |
+2
| --- www/concepts.html | ||
| +++ www/concepts.html | ||
| @@ -1,10 +1,12 @@ | ||
| 1 | 1 | <html> |
| 2 | 2 | <head> |
| 3 | 3 | <title>Fossil Concepts</title> |
| 4 | 4 | </head> |
| 5 | 5 | <body bgcolor="white"> |
| 6 | +<p>[ <a href="index.html">Index</a> ]</p> | |
| 7 | +<hr> | |
| 6 | 8 | <h1 align="center"> |
| 7 | 9 | Fossil Concepts |
| 8 | 10 | </h1> |
| 9 | 11 | |
| 10 | 12 | <h2>1.0 Introduction</h2> |
| 11 | 13 |
| --- www/concepts.html | |
| +++ www/concepts.html | |
| @@ -1,10 +1,12 @@ | |
| 1 | <html> |
| 2 | <head> |
| 3 | <title>Fossil Concepts</title> |
| 4 | </head> |
| 5 | <body bgcolor="white"> |
| 6 | <h1 align="center"> |
| 7 | Fossil Concepts |
| 8 | </h1> |
| 9 | |
| 10 | <h2>1.0 Introduction</h2> |
| 11 |
| --- www/concepts.html | |
| +++ www/concepts.html | |
| @@ -1,10 +1,12 @@ | |
| 1 | <html> |
| 2 | <head> |
| 3 | <title>Fossil Concepts</title> |
| 4 | </head> |
| 5 | <body bgcolor="white"> |
| 6 | <p>[ <a href="index.html">Index</a> ]</p> |
| 7 | <hr> |
| 8 | <h1 align="center"> |
| 9 | Fossil Concepts |
| 10 | </h1> |
| 11 | |
| 12 | <h2>1.0 Introduction</h2> |
| 13 |
| --- www/delta_encoder_algorithm.html | ||
| +++ www/delta_encoder_algorithm.html | ||
| @@ -129,10 +129,16 @@ | ||
| 129 | 129 | the "origin". This search is constrained on the side of the "target" |
| 130 | 130 | by the "base" (backward search), and the end of the "target" (forward |
| 131 | 131 | search), and on the side of the "origin" by the beginning and end of |
| 132 | 132 | the "origin", respectively.</p> |
| 133 | 133 | |
| 134 | +<p>There are input files for which the hash chains generated by the | |
| 135 | +pre-processing step can become very long, leading to long search times | |
| 136 | +and affecting the performance of the delta generator. To limit the | |
| 137 | +effect such long chains can have the actual search for candidates is | |
| 138 | +bounded, looking at most N candidates. Currently N is set to 250.</p> | |
| 139 | + | |
| 134 | 140 | <p>From the ranges for all the candidates the best (= largest) common |
| 135 | 141 | range is taken and it is determined how many bytes are needed to |
| 136 | 142 | encode the bytes between the "base" and the end of that range. If the |
| 137 | 143 | range extended back to the "base" then this can be done in a single |
| 138 | 144 | copy instruction. Otherwise, i.e if there is a gap between the "base" |
| 139 | 145 |
| --- www/delta_encoder_algorithm.html | |
| +++ www/delta_encoder_algorithm.html | |
| @@ -129,10 +129,16 @@ | |
| 129 | the "origin". This search is constrained on the side of the "target" |
| 130 | by the "base" (backward search), and the end of the "target" (forward |
| 131 | search), and on the side of the "origin" by the beginning and end of |
| 132 | the "origin", respectively.</p> |
| 133 | |
| 134 | <p>From the ranges for all the candidates the best (= largest) common |
| 135 | range is taken and it is determined how many bytes are needed to |
| 136 | encode the bytes between the "base" and the end of that range. If the |
| 137 | range extended back to the "base" then this can be done in a single |
| 138 | copy instruction. Otherwise, i.e if there is a gap between the "base" |
| 139 |
| --- www/delta_encoder_algorithm.html | |
| +++ www/delta_encoder_algorithm.html | |
| @@ -129,10 +129,16 @@ | |
| 129 | the "origin". This search is constrained on the side of the "target" |
| 130 | by the "base" (backward search), and the end of the "target" (forward |
| 131 | search), and on the side of the "origin" by the beginning and end of |
| 132 | the "origin", respectively.</p> |
| 133 | |
| 134 | <p>There are input files for which the hash chains generated by the |
| 135 | pre-processing step can become very long, leading to long search times |
| 136 | and affecting the performance of the delta generator. To limit the |
| 137 | effect such long chains can have the actual search for candidates is |
| 138 | bounded, looking at most N candidates. Currently N is set to 250.</p> |
| 139 | |
| 140 | <p>From the ranges for all the candidates the best (= largest) common |
| 141 | range is taken and it is determined how many bytes are needed to |
| 142 | encode the bytes between the "base" and the end of that range. If the |
| 143 | range extended back to the "base" then this can be done in a single |
| 144 | copy instruction. Otherwise, i.e if there is a gap between the "base" |
| 145 |
+2
| --- www/fileformat.html | ||
| +++ www/fileformat.html | ||
| @@ -1,10 +1,12 @@ | ||
| 1 | 1 | <html> |
| 2 | 2 | <head> |
| 3 | 3 | <title>Fossil File Format</title> |
| 4 | 4 | </head> |
| 5 | 5 | <body bgcolor="white"> |
| 6 | +<p>[ <a href="index.html">Index</a> ]</p> | |
| 7 | +<hr> | |
| 6 | 8 | <h1 align="center"> |
| 7 | 9 | Fossil File Formats |
| 8 | 10 | </h1> |
| 9 | 11 | |
| 10 | 12 | <p> |
| 11 | 13 |
| --- www/fileformat.html | |
| +++ www/fileformat.html | |
| @@ -1,10 +1,12 @@ | |
| 1 | <html> |
| 2 | <head> |
| 3 | <title>Fossil File Format</title> |
| 4 | </head> |
| 5 | <body bgcolor="white"> |
| 6 | <h1 align="center"> |
| 7 | Fossil File Formats |
| 8 | </h1> |
| 9 | |
| 10 | <p> |
| 11 |
| --- www/fileformat.html | |
| +++ www/fileformat.html | |
| @@ -1,10 +1,12 @@ | |
| 1 | <html> |
| 2 | <head> |
| 3 | <title>Fossil File Format</title> |
| 4 | </head> |
| 5 | <body bgcolor="white"> |
| 6 | <p>[ <a href="index.html">Index</a> ]</p> |
| 7 | <hr> |
| 8 | <h1 align="center"> |
| 9 | Fossil File Formats |
| 10 | </h1> |
| 11 | |
| 12 | <p> |
| 13 |
+2
-1
| --- www/index.html | ||
| +++ www/index.html | ||
| @@ -81,18 +81,19 @@ | ||
| 81 | 81 | |
| 82 | 82 | <ul> |
| 83 | 83 | <li>The <a href="concepts.html">concepts</b> behind fossil</li> |
| 84 | 84 | <li><a href="build.html">Building And Installing</a></li> |
| 85 | 85 | <li><a href="quickstart.html">Quick Start</a> guide to using fossil |
| 86 | -<li><a href="pop.html">Principals Of Operation</a></li> | |
| 86 | +<li><a href="pop.html">Principles Of Operation</a></li> | |
| 87 | 87 | <li>The <a href="selfcheck.html">automatic self-check</a> mechanism |
| 88 | 88 | helps insure project integrity.</li> |
| 89 | 89 | <li>The <a href="fileformat.html">file format</a> used by every content |
| 90 | 90 | file stored in the repository.</li> |
| 91 | 91 | <li>The <a href="delta_format.html">format of deltas</a> used to |
| 92 | 92 | efficiently store changes between file revisions.</li> |
| 93 | 93 | <li>The <a href="delta_encoder_algorithm.html">encoder algorithm</a> used to |
| 94 | 94 | efficiently generate deltas.</li> |
| 95 | +<li>The <a href="sync.html">synchronization protocol</a>. | |
| 95 | 96 | </ul> |
| 96 | 97 | |
| 97 | 98 | </body> |
| 98 | 99 | </html> |
| 99 | 100 | |
| 100 | 101 | ADDED www/index.wiki |
| --- www/index.html | |
| +++ www/index.html | |
| @@ -81,18 +81,19 @@ | |
| 81 | |
| 82 | <ul> |
| 83 | <li>The <a href="concepts.html">concepts</b> behind fossil</li> |
| 84 | <li><a href="build.html">Building And Installing</a></li> |
| 85 | <li><a href="quickstart.html">Quick Start</a> guide to using fossil |
| 86 | <li><a href="pop.html">Principals Of Operation</a></li> |
| 87 | <li>The <a href="selfcheck.html">automatic self-check</a> mechanism |
| 88 | helps insure project integrity.</li> |
| 89 | <li>The <a href="fileformat.html">file format</a> used by every content |
| 90 | file stored in the repository.</li> |
| 91 | <li>The <a href="delta_format.html">format of deltas</a> used to |
| 92 | efficiently store changes between file revisions.</li> |
| 93 | <li>The <a href="delta_encoder_algorithm.html">encoder algorithm</a> used to |
| 94 | efficiently generate deltas.</li> |
| 95 | </ul> |
| 96 | |
| 97 | </body> |
| 98 | </html> |
| 99 | |
| 100 | DDED www/index.wiki |
| --- www/index.html | |
| +++ www/index.html | |
| @@ -81,18 +81,19 @@ | |
| 81 | |
| 82 | <ul> |
| 83 | <li>The <a href="concepts.html">concepts</b> behind fossil</li> |
| 84 | <li><a href="build.html">Building And Installing</a></li> |
| 85 | <li><a href="quickstart.html">Quick Start</a> guide to using fossil |
| 86 | <li><a href="pop.html">Principles Of Operation</a></li> |
| 87 | <li>The <a href="selfcheck.html">automatic self-check</a> mechanism |
| 88 | helps insure project integrity.</li> |
| 89 | <li>The <a href="fileformat.html">file format</a> used by every content |
| 90 | file stored in the repository.</li> |
| 91 | <li>The <a href="delta_format.html">format of deltas</a> used to |
| 92 | efficiently store changes between file revisions.</li> |
| 93 | <li>The <a href="delta_encoder_algorithm.html">encoder algorithm</a> used to |
| 94 | efficiently generate deltas.</li> |
| 95 | <li>The <a href="sync.html">synchronization protocol</a>. |
| 96 | </ul> |
| 97 | |
| 98 | </body> |
| 99 | </html> |
| 100 | |
| 101 | DDED www/index.wiki |
+24
| --- a/www/index.wiki | ||
| +++ b/www/index.wiki | ||
| @@ -0,0 +1,24 @@ | ||
| 1 | +<title>Fossil SCM Homepage</title> | |
| 2 | + | |
| 3 | +This is a preliminary homepage for a new software configuration | |
| 4 | +management system cal2,3p1ECc;historical source codeincluded in a fossil-scm.hwaci.cominetd</a>file format is trival requires in] as "anonymous [./login The integration of <a href="http://wiki.org/wiki.cgi?WhatIsWiki">Wiki</a> | |
| 5 | +and the ability to safely support anonymous check-in are features | |
| 6 | +<h2</a>. | |
| 7 | +Fossil attempts to beh1il - A Software Configuration Management System</h1> | |
| 8 | + | |
| 9 | +<p> | |
| 10 | +This is a preliminary homepage for a new software configuration | |
| 11 | +management sys<h1>Fossil - A Sofi, along thwiki">self-hosting | |
| 12 | + fossil wiki</a>, capable of hosting static pages and communitOthk,2: | |
| 13 | +(v@Sli>There is a | |
| 14 | +html | |
| 15 | +or bothhtmlhe massesTheing and wiki, along thwiki">self-hosting | |
| 16 | + fossil wiki</a>, capable of hosting static pages and communitOthk,2: | |
| 17 | +(v@Sli>Therh2 is a | |
| 18 | +htmlh2re is a | |
| 19 | +htmlhtmlhtmlhtmlhtmlguration Management System<h1>htmlhtml">Principalation Management System<<h1>htmlhtml<h1>Fossil - A Software Configuration Management System</h1> | |
| 20 | + | |
| 21 | +<p> | |
| 22 | +This is a preliminary homepage for a new software configuration | |
| 23 | +management system cal2,3p1ECc;historical source codeincluded in a | |
| 24 | + Confi |
| --- a/www/index.wiki | |
| +++ b/www/index.wiki | |
| @@ -0,0 +1,24 @@ | |
| --- a/www/index.wiki | |
| +++ b/www/index.wiki | |
| @@ -0,0 +1,24 @@ | |
| 1 | <title>Fossil SCM Homepage</title> |
| 2 | |
| 3 | This is a preliminary homepage for a new software configuration |
| 4 | management system cal2,3p1ECc;historical source codeincluded in a fossil-scm.hwaci.cominetd</a>file format is trival requires in] as "anonymous [./login The integration of <a href="http://wiki.org/wiki.cgi?WhatIsWiki">Wiki</a> |
| 5 | and the ability to safely support anonymous check-in are features |
| 6 | <h2</a>. |
| 7 | Fossil attempts to beh1il - A Software Configuration Management System</h1> |
| 8 | |
| 9 | <p> |
| 10 | This is a preliminary homepage for a new software configuration |
| 11 | management sys<h1>Fossil - A Sofi, along thwiki">self-hosting |
| 12 | fossil wiki</a>, capable of hosting static pages and communitOthk,2: |
| 13 | (v@Sli>There is a |
| 14 | html |
| 15 | or bothhtmlhe massesTheing and wiki, along thwiki">self-hosting |
| 16 | fossil wiki</a>, capable of hosting static pages and communitOthk,2: |
| 17 | (v@Sli>Therh2 is a |
| 18 | htmlh2re is a |
| 19 | htmlhtmlhtmlhtmlhtmlguration Management System<h1>htmlhtml">Principalation Management System<<h1>htmlhtml<h1>Fossil - A Software Configuration Management System</h1> |
| 20 | |
| 21 | <p> |
| 22 | This is a preliminary homepage for a new software configuration |
| 23 | management system cal2,3p1ECc;historical source codeincluded in a |
| 24 | Confi |
+2
| --- www/pop.html | ||
| +++ www/pop.html | ||
| @@ -1,10 +1,12 @@ | ||
| 1 | 1 | <html> |
| 2 | 2 | <head> |
| 3 | 3 | <title>Fossil - Principles of Operation</title> |
| 4 | 4 | </head> |
| 5 | 5 | <body bgcolor="white"> |
| 6 | +<p>[ <a href="index.html">Index</a> ]</p> | |
| 7 | +<hr> | |
| 6 | 8 | <h1>Principles Of Operation</h1> |
| 7 | 9 | |
| 8 | 10 | <p> |
| 9 | 11 | This page attempts to define the foundational principals upon |
| 10 | 12 | which Fossil is built. |
| 11 | 13 |
| --- www/pop.html | |
| +++ www/pop.html | |
| @@ -1,10 +1,12 @@ | |
| 1 | <html> |
| 2 | <head> |
| 3 | <title>Fossil - Principles of Operation</title> |
| 4 | </head> |
| 5 | <body bgcolor="white"> |
| 6 | <h1>Principles Of Operation</h1> |
| 7 | |
| 8 | <p> |
| 9 | This page attempts to define the foundational principals upon |
| 10 | which Fossil is built. |
| 11 |
| --- www/pop.html | |
| +++ www/pop.html | |
| @@ -1,10 +1,12 @@ | |
| 1 | <html> |
| 2 | <head> |
| 3 | <title>Fossil - Principles of Operation</title> |
| 4 | </head> |
| 5 | <body bgcolor="white"> |
| 6 | <p>[ <a href="index.html">Index</a> ]</p> |
| 7 | <hr> |
| 8 | <h1>Principles Of Operation</h1> |
| 9 | |
| 10 | <p> |
| 11 | This page attempts to define the foundational principals upon |
| 12 | which Fossil is built. |
| 13 |
+2
| --- www/quickstart.html | ||
| +++ www/quickstart.html | ||
| @@ -1,8 +1,10 @@ | ||
| 1 | 1 | <html> |
| 2 | 2 | <title>Fossil - Quick Start</title> |
| 3 | 3 | <body bgcolor="white"> |
| 4 | +<p>[ <a href="index.html">Index</a> ]</p> | |
| 5 | +<hr> | |
| 4 | 6 | <h1 align="center">Fossil Quick Start</h1> |
| 5 | 7 | |
| 6 | 8 | <p>This is a guide to get you started using fossil quickly |
| 7 | 9 | and painlessly.</p> |
| 8 | 10 | |
| 9 | 11 |
| --- www/quickstart.html | |
| +++ www/quickstart.html | |
| @@ -1,8 +1,10 @@ | |
| 1 | <html> |
| 2 | <title>Fossil - Quick Start</title> |
| 3 | <body bgcolor="white"> |
| 4 | <h1 align="center">Fossil Quick Start</h1> |
| 5 | |
| 6 | <p>This is a guide to get you started using fossil quickly |
| 7 | and painlessly.</p> |
| 8 | |
| 9 |
| --- www/quickstart.html | |
| +++ www/quickstart.html | |
| @@ -1,8 +1,10 @@ | |
| 1 | <html> |
| 2 | <title>Fossil - Quick Start</title> |
| 3 | <body bgcolor="white"> |
| 4 | <p>[ <a href="index.html">Index</a> ]</p> |
| 5 | <hr> |
| 6 | <h1 align="center">Fossil Quick Start</h1> |
| 7 | |
| 8 | <p>This is a guide to get you started using fossil quickly |
| 9 | and painlessly.</p> |
| 10 | |
| 11 |
+2
| --- www/selfcheck.html | ||
| +++ www/selfcheck.html | ||
| @@ -1,10 +1,12 @@ | ||
| 1 | 1 | <html> |
| 2 | 2 | <head> |
| 3 | 3 | <title>Fossil Repository Integrity Self-Checks</title> |
| 4 | 4 | </head> |
| 5 | 5 | <body bgcolor="white"> |
| 6 | +<p>[ <a href="index.html">Index</a> ]</p> | |
| 7 | +<hr> | |
| 6 | 8 | <h1 align="center"> |
| 7 | 9 | Fossil Repository Integrity Self-Checks |
| 8 | 10 | </h1> |
| 9 | 11 | |
| 10 | 12 | <p> |
| 11 | 13 | |
| 12 | 14 | ADDED www/sync.html |
| --- www/selfcheck.html | |
| +++ www/selfcheck.html | |
| @@ -1,10 +1,12 @@ | |
| 1 | <html> |
| 2 | <head> |
| 3 | <title>Fossil Repository Integrity Self-Checks</title> |
| 4 | </head> |
| 5 | <body bgcolor="white"> |
| 6 | <h1 align="center"> |
| 7 | Fossil Repository Integrity Self-Checks |
| 8 | </h1> |
| 9 | |
| 10 | <p> |
| 11 | |
| 12 | DDED www/sync.html |
| --- www/selfcheck.html | |
| +++ www/selfcheck.html | |
| @@ -1,10 +1,12 @@ | |
| 1 | <html> |
| 2 | <head> |
| 3 | <title>Fossil Repository Integrity Self-Checks</title> |
| 4 | </head> |
| 5 | <body bgcolor="white"> |
| 6 | <p>[ <a href="index.html">Index</a> ]</p> |
| 7 | <hr> |
| 8 | <h1 align="center"> |
| 9 | Fossil Repository Integrity Self-Checks |
| 10 | </h1> |
| 11 | |
| 12 | <p> |
| 13 | |
| 14 | DDED www/sync.html |
+463
| --- a/www/sync.html | ||
| +++ b/www/sync.html | ||
| @@ -0,0 +1,463 @@ | ||
| 1 | +<html> | |
| 2 | +<head> | |
| 3 | +<title>The Fossil Sync Protocol</title> | |
| 4 | +</head> | |
| 5 | +<body bgcolor="white"> | |
| 6 | +<p>[ <a href="index.html">Index</a> ]</p> | |
| 7 | +<hr> | |
| 8 | +<h1 align="center">The Fossil Sync Protocol</h1> | |
| 9 | + | |
| 10 | +<p>Fossil supports commands <b>push</b>, <b>pull</b>, and <b>sync</b> | |
| 11 | +for transferring information from one repository to another. The | |
| 12 | +command is run on the client repository. A URL for the server repository | |
| 13 | +is specified as part of the command. This document describes what happens | |
| 14 | +behind the scenes in order to synchronize the information on the two | |
| 15 | +repositories.</p> | |
| 16 | + | |
| 17 | +<h2>1.0 Transport</h2> | |
| 18 | + | |
| 19 | +<p>All communication between client and server is via HTTP requests. | |
| 20 | +The server is listening for incoming HTTP requests. The client | |
| 21 | +issues one or more HTTP requests and receives replies for each | |
| 22 | +request.</p> | |
| 23 | + | |
| 24 | +<p>The server might be running as an independent server | |
| 25 | +using the <b>server</b> command, or it might be launched from | |
| 26 | +inetd or xinetd using the <b>http</b> command. Or the server might | |
| 27 | +be launched from CGI. The details of how the server is configured | |
| 28 | +to "listen" for incoming HTTP requests is immaterial. The important | |
| 29 | +point is that the server is listening for requests and the client | |
| 30 | +is the issuer of the requests.</p> | |
| 31 | + | |
| 32 | +<p>A single push, pull, or sync might involve multiple HTTP requests. | |
| 33 | +The client maintains state between all requests. But on the server | |
| 34 | +side, each request is independent. The server does not preserve | |
| 35 | +any information about the client from one request to the next.</p> | |
| 36 | + | |
| 37 | +<h3>1.1 Server Identification</h3> | |
| 38 | + | |
| 39 | +<p>The server is identified by a URL argument that accompanies the | |
| 40 | +push, pull, or sync command on the client. (As a convenience to | |
| 41 | +users, the URL can be omitted on the client command and the same URL | |
| 42 | +from the most recent push, pull, or sync will be reused. This saves | |
| 43 | +typing in the common case where the client does multiple syncs to | |
| 44 | +the same server.)</p> | |
| 45 | + | |
| 46 | +<p>The client modifies the URL by appending the method name "<b>/xfer</b>" | |
| 47 | +to the end. For example, if the URL specified on the client command | |
| 48 | +line is</p> | |
| 49 | + | |
| 50 | +<blockquote> | |
| 51 | +http://fossil-scm.hwaci.com/fossil | |
| 52 | +</blockquote> | |
| 53 | + | |
| 54 | +<p>Then the URL that is really used to do the synchronization will | |
| 55 | +be:</p> | |
| 56 | + | |
| 57 | +<blockquote> | |
| 58 | +http://fossil-scm.hwaci.com/fossil/xfer | |
| 59 | +</blockquote> | |
| 60 | + | |
| 61 | +<h3>1.2 HTTP Request Format</h3> | |
| 62 | + | |
| 63 | +<p>The client always sends a POST request to the server. The | |
| 64 | +general format of the POST request is as follows:</p> | |
| 65 | + | |
| 66 | +<blockquote><pre> | |
| 67 | +POST /fossil/xfer HTTP/1.0 | |
| 68 | +Host: fossil-scm.hwaci.com:80 | |
| 69 | +Content-Type: application/x-fossil | |
| 70 | +Content-Length: 4216 | |
| 71 | + | |
| 72 | +<i>content...</i> | |
| 73 | +</pre></blockquote> | |
| 74 | + | |
| 75 | +<p>In the example above, the pathname given after the POST keyword | |
| 76 | +on the first line is a copy of the URL pathname. The Host: parameter | |
| 77 | +is also taken from the URL. The content type is always either | |
| 78 | +"application/x-fossil" or "application/x-fossil-debug". The "x-fossil" | |
| 79 | +content type is the default. The only difference is that "x-fossil" | |
| 80 | +content is compressed using zlib whereas "x-fossil-debug" is sent | |
| 81 | +uncompressed.</p> | |
| 82 | + | |
| 83 | +<p>A typical reply from the server might look something like this:</p> | |
| 84 | + | |
| 85 | +<blockquote><pre> | |
| 86 | +HTTP/1.0 200 OK | |
| 87 | +Date: Mon, 10 Sep 2007 12:21:01 GMT | |
| 88 | +Connection: close | |
| 89 | +Cache-control: private | |
| 90 | +Content-Type: application/x-fossil; charset=US-ASCII | |
| 91 | +Content-Length: 265 | |
| 92 | + | |
| 93 | +<i>content...</i> | |
| 94 | +</pre></blockquote> | |
| 95 | + | |
| 96 | +<p>The content type of the reply is always the same as the content type | |
| 97 | +of the request.</p> | |
| 98 | + | |
| 99 | +<h2>2.0 Fossil Synchronization Content</h2> | |
| 100 | + | |
| 101 | +<p>A synchronization request between a client and server consists of | |
| 102 | +one or more HTTP requests as described in the previous section. This | |
| 103 | +section details the "x-fossil" content type.</p> | |
| 104 | + | |
| 105 | +<h3>2.1 Line-oriented Format</h3> | |
| 106 | + | |
| 107 | +<p>The x-fossil content type consists of zero or more "cards". Cards | |
| 108 | +are separate by the newline character ("\n"). Leading and trailing | |
| 109 | +whitespace on a card is ignored. Blank cards are ignored.</p> | |
| 110 | + | |
| 111 | +<p>Each card is divided into zero or more space separated tokens. | |
| 112 | +The first token on each card is the operator. Subsequent tokens | |
| 113 | +are arguments. The set of operators understood by servers is slightly | |
| 114 | +different from the operators understood by clients, though the two | |
| 115 | +are very similar.</p> | |
| 116 | + | |
| 117 | +<h3>2.2 Login Cards</h3> | |
| 118 | + | |
| 119 | +<p>Every message from client to server begins with one or more login | |
| 120 | +cards. Each login card has the following format:</p> | |
| 121 | + | |
| 122 | +<blockquote> | |
| 123 | +<b>login</b> <i>userid nonce signature</i> | |
| 124 | +</blockquote> | |
| 125 | + | |
| 126 | +<p>The userid is the name of the user that is requesting service | |
| 127 | +froma random oerminates the login card. The sicatenation of the nonce and the users password.</p> | |
| 128 | + | |
| 129 | +<p>For each login card, thehas never before been used. It then checks the | |
| 130 | +ssage. It then checks the signasignature matches. If everything | |
| 131 | +checks out, then the client is granted all privileges of the | |
| 132 | +specified user.</p> | |
| 133 | + | |
| 134 | +<p>Privileges are cumulative. There can be multiple successful | |
| 135 | +login cards. The session privileges are the bit-wise OR of the | |
| 136 | +privileges of each individual login.</p> | |
| 137 | + | |
| 138 | +<h3>2.3 File Cards</h3> | |
| 139 | + | |
| 140 | +<p>Repository content records or files are transferred using | |
| 141 | +a "file" card. File cards come in two different formats depending | |
| 142 | +on whether the file is sent directly or as a delta from some | |
| 143 | +other file.</p> | |
| 144 | + | |
| 145 | +<blockquote> | |
| 146 | +<b>file</b> <i>uuid size</i> <b>\n</b> <i>content</i><br> | |
| 147 | +<b>file</b> <i>uuid delta-uuid size</i> <b>\n</b> <i>content</i> | |
| 148 | +</blockquote> | |
| 149 | + | |
| 150 | +<p>File cards are different from all other cards in that they | |
| 151 | +followed by in-line "payload" data. The content of the file | |
| 152 | +or the file delta consists of the first <i>size</i> bytes of the | |
| 153 | +x-fossil content that immediately follow the newline that | |
| 154 | +terminates the file card. No other cards have this characteristic. | |
| 155 | +</p> | |
| 156 | + | |
| 157 | +<p>The first argument of a file card is the UUID of the file that | |
| 158 | +is being transferred. The UUID is the lower-case hexadecimal | |
| 159 | +representation of the SHA1 hash of the entire file content. | |
| 160 | +The last argument of the file card is the number of bytes of | |
| 161 | +payload that immediately follow the file card. If the file | |
| 162 | +card has only two arguments, that means the payload is the | |
| 163 | +complete content of the file. If the file card has three | |
| 164 | +arguments, then the payload is a delta and second argument is | |
| 165 | +the UUID of another file that is the source of the delta.</p> | |
| 166 | + | |
| 167 | +<p>File cards are sent in both directions: client to server and | |
| 168 | +server to client. A delta might be sent before the source of | |
| 169 | +the delta, so both client and server should remember deltas | |
| 170 | +and be able to apply them when their source arrives.</p> | |
| 171 | + | |
| 172 | +<h3>2.4 Push and Pull Cards</h3> | |
| 173 | + | |
| 174 | +<p>Among of the first cards in a client-to-server message are | |
| 175 | +the push and pull cards. The push card tell the server that | |
| 176 | +the client is pushing content. The pull card tell the server | |
| 177 | +that the client wants to pull content. In the event of a sync, | |
| 178 | +both cards are sent. The format is as follows:</p> | |
| 179 | + | |
| 180 | +<blockquote> | |
| 181 | +<b>push</b> <i>servercode projectcode</i><br> | |
| 182 | +<b>pull</b> <i>servercode projectcode</i> | |
| 183 | +</blockquote> | |
| 184 | + | |
| 185 | +<p>The <i>servercode</i> argument is the repository ID for the | |
| 186 | +client. The server will only allow the transaction to proceed | |
| 187 | +if the servercode is different from its own servercode. This | |
| 188 | +prevents a sync-loop. The <i>projectcode</i> is the identifier | |
| 189 | +of the software project that the client repository contains. | |
| 190 | +The projectcode for the client and server must match in order | |
| 191 | +for the transaction to proceed.</p> | |
| 192 | + | |
| 193 | +<p>The server will also send a push card back to the client | |
| 194 | +during a clone. This is how the client determines what project | |
| 195 | +code to put in the new repository it is constructing.</p> | |
| 196 | + | |
| 197 | +<h3>2.5 Clone Cards</h3> | |
| 198 | + | |
| 199 | +<p>A clone card works like a pull card in that it is sent from | |
| 200 | +client to server in order to tell the server that the client | |
| 201 | +wants to pull content. But unlike the pull card, the clone | |
| 202 | +card has no arguments.</p> | |
| 203 | + | |
| 204 | +<blockquote> | |
| 205 | +<b>clone</b> | |
| 206 | +</blockquote> | |
| 207 | + | |
| 208 | +<p>In response to a clone message, the server also sends the client | |
| 209 | +a push message so that the client can discover the projectcode for | |
| 210 | +this project.</p> | |
| 211 | + | |
| 212 | +<h3>2.6 Igot Cards</h3> | |
| 213 | + | |
| 214 | +<p>An igot card can be sent from either client to server or from | |
| 215 | +server to client in order to indicate that the sender holds a copy | |
| 216 | +of a particular file. The format is:</p> | |
| 217 | + | |
| 218 | +<blockquote> | |
| 219 | +<b>igot</b> <i>uuid</i> | |
| 220 | +</blockquote> | |
| 221 | + | |
| 222 | +<p>The argument of the igot card is the UUID of the file that | |
| 223 | +the sender possesses. | |
| 224 | +The receiver of an igot card will typically check to see if | |
| 225 | +it also holds the same file and if not it will request the file | |
| 226 | +using a gimme card in either the reply or in the next message.</p> | |
| 227 | + | |
| 228 | +<h3>2.7 Gimme Cards</h3> | |
| 229 | + | |
| 230 | +<p>A gimme card is sent from either client to server or from server | |
| 231 | +to client. The gimme card asks the receiver to send a particular | |
| 232 | +file back to the sender. The format of a gimme card is this:</p> | |
| 233 | + | |
| 234 | +<blockquote> | |
| 235 | +<b>gimme</b> <i>uuid</i> | |
| 236 | +</blockquote> | |
| 237 | + | |
| 238 | +<p>The argument to the gimme card is the UUID of the file that | |
| 239 | +the sender wants. The receiver will typically respond to a | |
| 240 | +gimme card by sending a file card in its reply or in the next | |
| 241 | +message.</p> | |
| 242 | + | |
| 243 | +<h3>2.8 Cookie Cards</h3> | |
| 244 | + | |
| 245 | +<p>A cookie card can be used by a server to record a small amount | |
| 246 | +of state information on a client. The server sends a cookie to the | |
| 247 | +client. The client sends the same cookie back to the server on | |
| 248 | +its next request. The cookie card has a single argument which | |
| 249 | +is its payload.</p> | |
| 250 | + | |
| 251 | +<blockquote> | |
| 252 | +<b>cookie</b> <i>payload</i> | |
| 253 | +</blockquote> | |
| 254 | + | |
| 255 | +<p>The client is not required to return the cookie to the server on | |
| 256 | +its next request. Or the client might send a cookie from a different | |
| 257 | +server on the next request. So the server must not depend on the | |
| 258 | +cookie and the server must structure the cookie payload in such | |
| 259 | +a way that it can tell if the cookie it sees is its own cookie or | |
| 260 | +a cookie from another server. (Typically the server will embed | |
| 261 | +its servercode as part of the cookie.)</p> | |
| 262 | + | |
| 263 | +<h3>2.9 Error Cards</h3> | |
| 264 | + | |
| 265 | +<p>If the server discovers anything wrong with a request, it generates | |
| 266 | +an error card in its reply. When the client sees the error card, | |
| 267 | +it displays an error message to the user and aborts the sync | |
| 268 | +operation. An error card looks like this:</p> | |
| 269 | + | |
| 270 | +<blockquote> | |
| 271 | +<b>error</b> <i>error-message</i> | |
| 272 | +</blockquote> | |
| 273 | + | |
| 274 | +<p>The error message is English text that is encoded in order to | |
| 275 | +be a single token. | |
| 276 | +A space (ASCII 0x20) is represented as "\s" (ASCII 0x5C, 0x73). A | |
| 277 | +newline (ASCII 0x0a) is "\n" (ASCII 0x6C, x6E). A backslash | |
| 278 | +(ASCII 0x5C) is represented as two backslashes "\\". Apart from | |
| 279 | +space and newline, no other whitespace characters nor any | |
| 280 | +unprintable characters are allowed in | |
| 281 | +the error message.</p> | |
| 282 | + | |
| 283 | +<h3>2.10 Unknown Cards</h3> | |
| 284 | + | |
| 285 | +<p>If either the client or the server sees a card that is not | |
| 286 | +described above, then it generates an error and aborts.</p> | |
| 287 | + | |
| 288 | +<h2>3.0 Phantoms And Clusters</h2> | |
| 289 | + | |
| 290 | +<p>When a repository knows that a file exists and knows the UUID of | |
| 291 | +that file, but it does not know the file content, then it stores that | |
| 292 | +file as a "phantom". A repository will typically create a phantom when | |
| 293 | +it receives an igot card for a file that it does not hold or when it | |
| 294 | +receives a file card that references a delta source that it does not | |
| 295 | +hold. When a server is generating its reply or when a client is | |
| 296 | +generating a new request, it will usually send gimme cards for every | |
| 297 | +phantom that it holds.</p> | |
| 298 | + | |
| 299 | +<p>A cluster is a special file that tells of the existence of other | |
| 300 | +files. Any file in the repository that follows the syntactic rules | |
| 301 | +of a cluster is considered a cluster.</p> | |
| 302 | + | |
| 303 | +<p>A cluster is a line oriented file. Each line of a cluster | |
| 304 | +is a card. The cards are separated by the newline ("\n") character. | |
| 305 | +Each card consists of a single character card type, a space, and a | |
| 306 | +single argument. No extra whitespace and no trailing or leading | |
| 307 | +whitespace is allowed. All cards in the cluster must occur in | |
| 308 | +strict lexicographical order.</p> | |
| 309 | + | |
| 310 | +<p>A cluster consists of one or more "M" cards followed by a single | |
| 311 | +"Z" card. Each M card holds an argument which is a UUID for a file | |
| 312 | +in the repository. The Z card has a single argument which is the | |
| 313 | +lower-case hexadecimal representation of the MD5 checksum of all | |
| 314 | +preceding M cards up to and included the newline character that | |
| 315 | +occurred just before the Z that starts the Z card.</p> | |
| 316 | + | |
| 317 | +<p>Any file that does not match the specifications of a cluster | |
| 318 | +exactly is not a cluster. There must be no extra whitespace in | |
| 319 | +the file. There must be one or more M cards. There must be a | |
| 320 | +single Z card with a correct MD5 checksum. And all cards must | |
| 321 | +be in strict lexicographical order.</p> | |
| 322 | + | |
| 323 | +<h3>3.1 The Unclustered Table</h3> | |
| 324 | + | |
| 325 | +<p>Every repository maintains a table named "<b>unclustered</b>" | |
| 326 | +which records the identity of every file and phantom it holds that is not | |
| 327 | +mentioned in a cluster. The entries in the unclustered table can | |
| 328 | +be thought of as leaves on a tree of files. Some of the unclustered | |
| 329 | +files will be clusters. Those clusters may contain other clusters, | |
| 330 | +which might contain still more clusters, and so forth. Beginning | |
| 331 | +with the files in the unclustered table, one can follow the chain | |
| 332 | +of clusters to find every file in the repository.</p> | |
| 333 | + | |
| 334 | +<h2>4.0 Synchronization Strategies</h2> | |
| 335 | + | |
| 336 | +<h3>4.1 Pull</h3> | |
| 337 | + | |
| 338 | +<p>A typical pull operation proceeds as shown below. Details | |
| 339 | +of the actual implementation may very slightly but the gist of | |
| 340 | +a pull is captured in the following steps:</p> | |
| 341 | + | |
| 342 | +<ol> | |
| 343 | +<li>The client sends login and pull cards. | |
| 344 | +<li>The client sends a cookie card if it has previously received a cookie. | |
| 345 | +<li>The client sends gimme cards for every phantom that it holds. | |
| 346 | +<hr> | |
| 347 | +<li>The server checks the login password and rejects the session if | |
| 348 | +the user does not have permission to pull. | |
| 349 | +<li>If the number entries in the unclustered table on the server is | |
| 350 | +greater than 100, then the server constructs a new cluster file to | |
| 351 | +cover all those unclustered entries. | |
| 352 | +<li>The server sends file cards for every gimme card it received | |
| 353 | +from the client. | |
| 354 | +<li>The server sends ihave cards for every file in its unclustered | |
| 355 | +table that is not a phantom. | |
| 356 | +<hr> | |
| 357 | +<li>The client adds the content of file cards to its repository. | |
| 358 | +<li>The client creates a phantom for every ihave card in the server reply | |
| 359 | +that mentions a file that the client does not possess. | |
| 360 | +<li>The client creates a phantom for the delta source of file cards when | |
| 361 | +the delta source is a file that the client does not possess. | |
| 362 | +</ol> | |
| 363 | + | |
| 364 | +<p>These ten steps represent a single HTTP round-trip request. | |
| 365 | +The first three steps are the processing that occurs on the client | |
| 366 | +to generate the request. The middle four steps are processing | |
| 367 | +that occurs on the server to interpret the request and generate a | |
| 368 | +reply. And the last three steps are the processing that the | |
| 369 | +client does to interpret the reply.</p> | |
| 370 | + | |
| 371 | +<p>During a pull, the client will keep sending HTTP requests | |
| 372 | +until it holds all files that exist on the server.</p> | |
| 373 | + | |
| 374 | +<p>Note that the server tries | |
| 375 | +to limit the size of its reply message to something reasonable | |
| 376 | +(usually about 1MB) so that it might stop sending file cards as | |
| 377 | +described in step (6) if the reply becomes too large.</p> | |
| 378 | + | |
| 379 | +<p>Step (5) is the only way in which new clusters can be created. | |
| 380 | +By only creating clusters on the server, we hope to minimize the | |
| 381 | +amount of overlap between clusters in the common configuration where | |
| 382 | +there is a single server and many clients. The same synchronization | |
| 383 | +protocol will continue to work even if there are multiple servers | |
| 384 | +or if servers and clients sometimes change roles. The only negative | |
| 385 | +effects of these unusual arrangements is that more than the minimum | |
| 386 | +number of clusters might be generated.</p> | |
| 387 | + | |
| 388 | +<h3>4.2 Push</h3> | |
| 389 | + | |
| 390 | +<p>A typical push operation proceeds roughly as shown below. As | |
| 391 | +with a pull, the actual implementation may vary slightly.</p> | |
| 392 | + | |
| 393 | +<ol> | |
| 394 | +<li>The client sends login and push cards. | |
| 395 | +<li>The client sends file cards for any files that it holds that have | |
| 396 | +never before been pushed - files that come from local check-ins. | |
| 397 | +<li>If this is the second or later cycle in a push, then the | |
| 398 | +client sends file cards for any gimme cards that the server sent | |
| 399 | +in the previous cycle. | |
| 400 | +<li>The client sends igot cards for every file in its unclustered table | |
| 401 | +that is not a phantom. | |
| 402 | +<hr> | |
| 403 | +<li>The server checks the login and push cards and issues an error if | |
| 404 | +anything is amiss. | |
| 405 | +<li>The server accepts file cards from the client and adds those files | |
| 406 | +to its repository. | |
| 407 | +<li>The server creates phantoms for igot cards that mention files it | |
| 408 | +does not possess or for file cards that mention delta source files that | |
| 409 | +it does not possess. | |
| 410 | +<li>The server issues gimme cards for all phantoms. | |
| 411 | +<hr> | |
| 412 | +<li>The client remembers the gimme cards from the server so that it | |
| 413 | +can generate file cards in reply on the next cycle. | |
| 414 | +</ol> | |
| 415 | + | |
| 416 | +<p>As with a pull, the steps of a push operation repeat until the | |
| 417 | +server knows all files that exist on the client. Also, as with | |
| 418 | +pull, the client attempts to keep the size of the request from | |
| 419 | +growing too large by suppressing file cards once the | |
| 420 | +size of the request reaches 1MB.</p> | |
| 421 | + | |
| 422 | +<h3>4.3 Sync</h3> | |
| 423 | + | |
| 424 | +<p>A sync is just a pull and a push that happen at the same time. | |
| 425 | +The first three steps of a pull are combined with the first five steps | |
| 426 | +of a push. Steps (4) through (7) of a pull are combined with steps | |
| 427 | +(5) through (8) of a push. And steps (8) through (10) of a pull | |
| 428 | +are combined with step (9) of a push.</p> | |
| 429 | + | |
| 430 | +<h2>5.0 Summary</h2> | |
| 431 | + | |
| 432 | +<p>Here are the key points of the synchronization protocol:</p> | |
| 433 | + | |
| 434 | +<ol> | |
| 435 | +<li>The client sends one or more PUSH HTTP requests to the server. | |
| 436 | + The request and reply content type is "application/x-fossil". | |
| 437 | +<li>HTTP request content is compressed using zlib. | |
| 438 | +<li>The content of request and reply consists of cards with one | |
| 439 | + card per line. | |
| 440 | +<li>Card formats are: | |
| 441 | + <ul> | |
| 442 | + <li> <b>login</b> <i>userid nonce signature</i> | |
| 443 | + <li> <b>push</b> <i>servercode projectcode</i> | |
| 444 | + <li> <b>pull</b> <i>servercode projectcode</i> | |
| 445 | + <li> <b>clone</b> | |
| 446 | + <li> <b>file</b> <i>uuid size</i> <b>\n</b> <i>content</i> | |
| 447 | + <li> <b>file</b> <i>uuid delta-uuid size</i> <b>\n</b> <i>content</i> | |
| 448 | + <li> <b>igot</b> <i>uuid</i> | |
| 449 | + <li> <b>gimme</b> <i>uuid</i> | |
| 450 | + <li> <b>cookie</b> <i>cookie-text</i> | |
| 451 | + <li> <b>error</b> <i>error-message</i> | |
| 452 | + </ul> | |
| 453 | +<li>Phantoms are files that a repository knows exist but does not possess. | |
| 454 | +<li>Clusters are files that contain the UUIDs of other files. | |
| 455 | +<li>Clusters are created automatically on the server during a pull. | |
| 456 | +<li>Repositories keep track of all files that are not named in any | |
| 457 | +cluster and send igot messages for those files. | |
| 458 | +<li>Repositories keep track of all the phantoms they hold and send | |
| 459 | +gimme messages for those files. | |
| 460 | +</ol> | |
| 461 | + | |
| 462 | +</body> | |
| 463 | +</html> |
| --- a/www/sync.html | |
| +++ b/www/sync.html | |
| @@ -0,0 +1,463 @@ | |
| --- a/www/sync.html | |
| +++ b/www/sync.html | |
| @@ -0,0 +1,463 @@ | |
| 1 | <html> |
| 2 | <head> |
| 3 | <title>The Fossil Sync Protocol</title> |
| 4 | </head> |
| 5 | <body bgcolor="white"> |
| 6 | <p>[ <a href="index.html">Index</a> ]</p> |
| 7 | <hr> |
| 8 | <h1 align="center">The Fossil Sync Protocol</h1> |
| 9 | |
| 10 | <p>Fossil supports commands <b>push</b>, <b>pull</b>, and <b>sync</b> |
| 11 | for transferring information from one repository to another. The |
| 12 | command is run on the client repository. A URL for the server repository |
| 13 | is specified as part of the command. This document describes what happens |
| 14 | behind the scenes in order to synchronize the information on the two |
| 15 | repositories.</p> |
| 16 | |
| 17 | <h2>1.0 Transport</h2> |
| 18 | |
| 19 | <p>All communication between client and server is via HTTP requests. |
| 20 | The server is listening for incoming HTTP requests. The client |
| 21 | issues one or more HTTP requests and receives replies for each |
| 22 | request.</p> |
| 23 | |
| 24 | <p>The server might be running as an independent server |
| 25 | using the <b>server</b> command, or it might be launched from |
| 26 | inetd or xinetd using the <b>http</b> command. Or the server might |
| 27 | be launched from CGI. The details of how the server is configured |
| 28 | to "listen" for incoming HTTP requests is immaterial. The important |
| 29 | point is that the server is listening for requests and the client |
| 30 | is the issuer of the requests.</p> |
| 31 | |
| 32 | <p>A single push, pull, or sync might involve multiple HTTP requests. |
| 33 | The client maintains state between all requests. But on the server |
| 34 | side, each request is independent. The server does not preserve |
| 35 | any information about the client from one request to the next.</p> |
| 36 | |
| 37 | <h3>1.1 Server Identification</h3> |
| 38 | |
| 39 | <p>The server is identified by a URL argument that accompanies the |
| 40 | push, pull, or sync command on the client. (As a convenience to |
| 41 | users, the URL can be omitted on the client command and the same URL |
| 42 | from the most recent push, pull, or sync will be reused. This saves |
| 43 | typing in the common case where the client does multiple syncs to |
| 44 | the same server.)</p> |
| 45 | |
| 46 | <p>The client modifies the URL by appending the method name "<b>/xfer</b>" |
| 47 | to the end. For example, if the URL specified on the client command |
| 48 | line is</p> |
| 49 | |
| 50 | <blockquote> |
| 51 | http://fossil-scm.hwaci.com/fossil |
| 52 | </blockquote> |
| 53 | |
| 54 | <p>Then the URL that is really used to do the synchronization will |
| 55 | be:</p> |
| 56 | |
| 57 | <blockquote> |
| 58 | http://fossil-scm.hwaci.com/fossil/xfer |
| 59 | </blockquote> |
| 60 | |
| 61 | <h3>1.2 HTTP Request Format</h3> |
| 62 | |
| 63 | <p>The client always sends a POST request to the server. The |
| 64 | general format of the POST request is as follows:</p> |
| 65 | |
| 66 | <blockquote><pre> |
| 67 | POST /fossil/xfer HTTP/1.0 |
| 68 | Host: fossil-scm.hwaci.com:80 |
| 69 | Content-Type: application/x-fossil |
| 70 | Content-Length: 4216 |
| 71 | |
| 72 | <i>content...</i> |
| 73 | </pre></blockquote> |
| 74 | |
| 75 | <p>In the example above, the pathname given after the POST keyword |
| 76 | on the first line is a copy of the URL pathname. The Host: parameter |
| 77 | is also taken from the URL. The content type is always either |
| 78 | "application/x-fossil" or "application/x-fossil-debug". The "x-fossil" |
| 79 | content type is the default. The only difference is that "x-fossil" |
| 80 | content is compressed using zlib whereas "x-fossil-debug" is sent |
| 81 | uncompressed.</p> |
| 82 | |
| 83 | <p>A typical reply from the server might look something like this:</p> |
| 84 | |
| 85 | <blockquote><pre> |
| 86 | HTTP/1.0 200 OK |
| 87 | Date: Mon, 10 Sep 2007 12:21:01 GMT |
| 88 | Connection: close |
| 89 | Cache-control: private |
| 90 | Content-Type: application/x-fossil; charset=US-ASCII |
| 91 | Content-Length: 265 |
| 92 | |
| 93 | <i>content...</i> |
| 94 | </pre></blockquote> |
| 95 | |
| 96 | <p>The content type of the reply is always the same as the content type |
| 97 | of the request.</p> |
| 98 | |
| 99 | <h2>2.0 Fossil Synchronization Content</h2> |
| 100 | |
| 101 | <p>A synchronization request between a client and server consists of |
| 102 | one or more HTTP requests as described in the previous section. This |
| 103 | section details the "x-fossil" content type.</p> |
| 104 | |
| 105 | <h3>2.1 Line-oriented Format</h3> |
| 106 | |
| 107 | <p>The x-fossil content type consists of zero or more "cards". Cards |
| 108 | are separate by the newline character ("\n"). Leading and trailing |
| 109 | whitespace on a card is ignored. Blank cards are ignored.</p> |
| 110 | |
| 111 | <p>Each card is divided into zero or more space separated tokens. |
| 112 | The first token on each card is the operator. Subsequent tokens |
| 113 | are arguments. The set of operators understood by servers is slightly |
| 114 | different from the operators understood by clients, though the two |
| 115 | are very similar.</p> |
| 116 | |
| 117 | <h3>2.2 Login Cards</h3> |
| 118 | |
| 119 | <p>Every message from client to server begins with one or more login |
| 120 | cards. Each login card has the following format:</p> |
| 121 | |
| 122 | <blockquote> |
| 123 | <b>login</b> <i>userid nonce signature</i> |
| 124 | </blockquote> |
| 125 | |
| 126 | <p>The userid is the name of the user that is requesting service |
| 127 | froma random oerminates the login card. The sicatenation of the nonce and the users password.</p> |
| 128 | |
| 129 | <p>For each login card, thehas never before been used. It then checks the |
| 130 | ssage. It then checks the signasignature matches. If everything |
| 131 | checks out, then the client is granted all privileges of the |
| 132 | specified user.</p> |
| 133 | |
| 134 | <p>Privileges are cumulative. There can be multiple successful |
| 135 | login cards. The session privileges are the bit-wise OR of the |
| 136 | privileges of each individual login.</p> |
| 137 | |
| 138 | <h3>2.3 File Cards</h3> |
| 139 | |
| 140 | <p>Repository content records or files are transferred using |
| 141 | a "file" card. File cards come in two different formats depending |
| 142 | on whether the file is sent directly or as a delta from some |
| 143 | other file.</p> |
| 144 | |
| 145 | <blockquote> |
| 146 | <b>file</b> <i>uuid size</i> <b>\n</b> <i>content</i><br> |
| 147 | <b>file</b> <i>uuid delta-uuid size</i> <b>\n</b> <i>content</i> |
| 148 | </blockquote> |
| 149 | |
| 150 | <p>File cards are different from all other cards in that they |
| 151 | followed by in-line "payload" data. The content of the file |
| 152 | or the file delta consists of the first <i>size</i> bytes of the |
| 153 | x-fossil content that immediately follow the newline that |
| 154 | terminates the file card. No other cards have this characteristic. |
| 155 | </p> |
| 156 | |
| 157 | <p>The first argument of a file card is the UUID of the file that |
| 158 | is being transferred. The UUID is the lower-case hexadecimal |
| 159 | representation of the SHA1 hash of the entire file content. |
| 160 | The last argument of the file card is the number of bytes of |
| 161 | payload that immediately follow the file card. If the file |
| 162 | card has only two arguments, that means the payload is the |
| 163 | complete content of the file. If the file card has three |
| 164 | arguments, then the payload is a delta and second argument is |
| 165 | the UUID of another file that is the source of the delta.</p> |
| 166 | |
| 167 | <p>File cards are sent in both directions: client to server and |
| 168 | server to client. A delta might be sent before the source of |
| 169 | the delta, so both client and server should remember deltas |
| 170 | and be able to apply them when their source arrives.</p> |
| 171 | |
| 172 | <h3>2.4 Push and Pull Cards</h3> |
| 173 | |
| 174 | <p>Among of the first cards in a client-to-server message are |
| 175 | the push and pull cards. The push card tell the server that |
| 176 | the client is pushing content. The pull card tell the server |
| 177 | that the client wants to pull content. In the event of a sync, |
| 178 | both cards are sent. The format is as follows:</p> |
| 179 | |
| 180 | <blockquote> |
| 181 | <b>push</b> <i>servercode projectcode</i><br> |
| 182 | <b>pull</b> <i>servercode projectcode</i> |
| 183 | </blockquote> |
| 184 | |
| 185 | <p>The <i>servercode</i> argument is the repository ID for the |
| 186 | client. The server will only allow the transaction to proceed |
| 187 | if the servercode is different from its own servercode. This |
| 188 | prevents a sync-loop. The <i>projectcode</i> is the identifier |
| 189 | of the software project that the client repository contains. |
| 190 | The projectcode for the client and server must match in order |
| 191 | for the transaction to proceed.</p> |
| 192 | |
| 193 | <p>The server will also send a push card back to the client |
| 194 | during a clone. This is how the client determines what project |
| 195 | code to put in the new repository it is constructing.</p> |
| 196 | |
| 197 | <h3>2.5 Clone Cards</h3> |
| 198 | |
| 199 | <p>A clone card works like a pull card in that it is sent from |
| 200 | client to server in order to tell the server that the client |
| 201 | wants to pull content. But unlike the pull card, the clone |
| 202 | card has no arguments.</p> |
| 203 | |
| 204 | <blockquote> |
| 205 | <b>clone</b> |
| 206 | </blockquote> |
| 207 | |
| 208 | <p>In response to a clone message, the server also sends the client |
| 209 | a push message so that the client can discover the projectcode for |
| 210 | this project.</p> |
| 211 | |
| 212 | <h3>2.6 Igot Cards</h3> |
| 213 | |
| 214 | <p>An igot card can be sent from either client to server or from |
| 215 | server to client in order to indicate that the sender holds a copy |
| 216 | of a particular file. The format is:</p> |
| 217 | |
| 218 | <blockquote> |
| 219 | <b>igot</b> <i>uuid</i> |
| 220 | </blockquote> |
| 221 | |
| 222 | <p>The argument of the igot card is the UUID of the file that |
| 223 | the sender possesses. |
| 224 | The receiver of an igot card will typically check to see if |
| 225 | it also holds the same file and if not it will request the file |
| 226 | using a gimme card in either the reply or in the next message.</p> |
| 227 | |
| 228 | <h3>2.7 Gimme Cards</h3> |
| 229 | |
| 230 | <p>A gimme card is sent from either client to server or from server |
| 231 | to client. The gimme card asks the receiver to send a particular |
| 232 | file back to the sender. The format of a gimme card is this:</p> |
| 233 | |
| 234 | <blockquote> |
| 235 | <b>gimme</b> <i>uuid</i> |
| 236 | </blockquote> |
| 237 | |
| 238 | <p>The argument to the gimme card is the UUID of the file that |
| 239 | the sender wants. The receiver will typically respond to a |
| 240 | gimme card by sending a file card in its reply or in the next |
| 241 | message.</p> |
| 242 | |
| 243 | <h3>2.8 Cookie Cards</h3> |
| 244 | |
| 245 | <p>A cookie card can be used by a server to record a small amount |
| 246 | of state information on a client. The server sends a cookie to the |
| 247 | client. The client sends the same cookie back to the server on |
| 248 | its next request. The cookie card has a single argument which |
| 249 | is its payload.</p> |
| 250 | |
| 251 | <blockquote> |
| 252 | <b>cookie</b> <i>payload</i> |
| 253 | </blockquote> |
| 254 | |
| 255 | <p>The client is not required to return the cookie to the server on |
| 256 | its next request. Or the client might send a cookie from a different |
| 257 | server on the next request. So the server must not depend on the |
| 258 | cookie and the server must structure the cookie payload in such |
| 259 | a way that it can tell if the cookie it sees is its own cookie or |
| 260 | a cookie from another server. (Typically the server will embed |
| 261 | its servercode as part of the cookie.)</p> |
| 262 | |
| 263 | <h3>2.9 Error Cards</h3> |
| 264 | |
| 265 | <p>If the server discovers anything wrong with a request, it generates |
| 266 | an error card in its reply. When the client sees the error card, |
| 267 | it displays an error message to the user and aborts the sync |
| 268 | operation. An error card looks like this:</p> |
| 269 | |
| 270 | <blockquote> |
| 271 | <b>error</b> <i>error-message</i> |
| 272 | </blockquote> |
| 273 | |
| 274 | <p>The error message is English text that is encoded in order to |
| 275 | be a single token. |
| 276 | A space (ASCII 0x20) is represented as "\s" (ASCII 0x5C, 0x73). A |
| 277 | newline (ASCII 0x0a) is "\n" (ASCII 0x6C, x6E). A backslash |
| 278 | (ASCII 0x5C) is represented as two backslashes "\\". Apart from |
| 279 | space and newline, no other whitespace characters nor any |
| 280 | unprintable characters are allowed in |
| 281 | the error message.</p> |
| 282 | |
| 283 | <h3>2.10 Unknown Cards</h3> |
| 284 | |
| 285 | <p>If either the client or the server sees a card that is not |
| 286 | described above, then it generates an error and aborts.</p> |
| 287 | |
| 288 | <h2>3.0 Phantoms And Clusters</h2> |
| 289 | |
| 290 | <p>When a repository knows that a file exists and knows the UUID of |
| 291 | that file, but it does not know the file content, then it stores that |
| 292 | file as a "phantom". A repository will typically create a phantom when |
| 293 | it receives an igot card for a file that it does not hold or when it |
| 294 | receives a file card that references a delta source that it does not |
| 295 | hold. When a server is generating its reply or when a client is |
| 296 | generating a new request, it will usually send gimme cards for every |
| 297 | phantom that it holds.</p> |
| 298 | |
| 299 | <p>A cluster is a special file that tells of the existence of other |
| 300 | files. Any file in the repository that follows the syntactic rules |
| 301 | of a cluster is considered a cluster.</p> |
| 302 | |
| 303 | <p>A cluster is a line oriented file. Each line of a cluster |
| 304 | is a card. The cards are separated by the newline ("\n") character. |
| 305 | Each card consists of a single character card type, a space, and a |
| 306 | single argument. No extra whitespace and no trailing or leading |
| 307 | whitespace is allowed. All cards in the cluster must occur in |
| 308 | strict lexicographical order.</p> |
| 309 | |
| 310 | <p>A cluster consists of one or more "M" cards followed by a single |
| 311 | "Z" card. Each M card holds an argument which is a UUID for a file |
| 312 | in the repository. The Z card has a single argument which is the |
| 313 | lower-case hexadecimal representation of the MD5 checksum of all |
| 314 | preceding M cards up to and included the newline character that |
| 315 | occurred just before the Z that starts the Z card.</p> |
| 316 | |
| 317 | <p>Any file that does not match the specifications of a cluster |
| 318 | exactly is not a cluster. There must be no extra whitespace in |
| 319 | the file. There must be one or more M cards. There must be a |
| 320 | single Z card with a correct MD5 checksum. And all cards must |
| 321 | be in strict lexicographical order.</p> |
| 322 | |
| 323 | <h3>3.1 The Unclustered Table</h3> |
| 324 | |
| 325 | <p>Every repository maintains a table named "<b>unclustered</b>" |
| 326 | which records the identity of every file and phantom it holds that is not |
| 327 | mentioned in a cluster. The entries in the unclustered table can |
| 328 | be thought of as leaves on a tree of files. Some of the unclustered |
| 329 | files will be clusters. Those clusters may contain other clusters, |
| 330 | which might contain still more clusters, and so forth. Beginning |
| 331 | with the files in the unclustered table, one can follow the chain |
| 332 | of clusters to find every file in the repository.</p> |
| 333 | |
| 334 | <h2>4.0 Synchronization Strategies</h2> |
| 335 | |
| 336 | <h3>4.1 Pull</h3> |
| 337 | |
| 338 | <p>A typical pull operation proceeds as shown below. Details |
| 339 | of the actual implementation may very slightly but the gist of |
| 340 | a pull is captured in the following steps:</p> |
| 341 | |
| 342 | <ol> |
| 343 | <li>The client sends login and pull cards. |
| 344 | <li>The client sends a cookie card if it has previously received a cookie. |
| 345 | <li>The client sends gimme cards for every phantom that it holds. |
| 346 | <hr> |
| 347 | <li>The server checks the login password and rejects the session if |
| 348 | the user does not have permission to pull. |
| 349 | <li>If the number entries in the unclustered table on the server is |
| 350 | greater than 100, then the server constructs a new cluster file to |
| 351 | cover all those unclustered entries. |
| 352 | <li>The server sends file cards for every gimme card it received |
| 353 | from the client. |
| 354 | <li>The server sends ihave cards for every file in its unclustered |
| 355 | table that is not a phantom. |
| 356 | <hr> |
| 357 | <li>The client adds the content of file cards to its repository. |
| 358 | <li>The client creates a phantom for every ihave card in the server reply |
| 359 | that mentions a file that the client does not possess. |
| 360 | <li>The client creates a phantom for the delta source of file cards when |
| 361 | the delta source is a file that the client does not possess. |
| 362 | </ol> |
| 363 | |
| 364 | <p>These ten steps represent a single HTTP round-trip request. |
| 365 | The first three steps are the processing that occurs on the client |
| 366 | to generate the request. The middle four steps are processing |
| 367 | that occurs on the server to interpret the request and generate a |
| 368 | reply. And the last three steps are the processing that the |
| 369 | client does to interpret the reply.</p> |
| 370 | |
| 371 | <p>During a pull, the client will keep sending HTTP requests |
| 372 | until it holds all files that exist on the server.</p> |
| 373 | |
| 374 | <p>Note that the server tries |
| 375 | to limit the size of its reply message to something reasonable |
| 376 | (usually about 1MB) so that it might stop sending file cards as |
| 377 | described in step (6) if the reply becomes too large.</p> |
| 378 | |
| 379 | <p>Step (5) is the only way in which new clusters can be created. |
| 380 | By only creating clusters on the server, we hope to minimize the |
| 381 | amount of overlap between clusters in the common configuration where |
| 382 | there is a single server and many clients. The same synchronization |
| 383 | protocol will continue to work even if there are multiple servers |
| 384 | or if servers and clients sometimes change roles. The only negative |
| 385 | effects of these unusual arrangements is that more than the minimum |
| 386 | number of clusters might be generated.</p> |
| 387 | |
| 388 | <h3>4.2 Push</h3> |
| 389 | |
| 390 | <p>A typical push operation proceeds roughly as shown below. As |
| 391 | with a pull, the actual implementation may vary slightly.</p> |
| 392 | |
| 393 | <ol> |
| 394 | <li>The client sends login and push cards. |
| 395 | <li>The client sends file cards for any files that it holds that have |
| 396 | never before been pushed - files that come from local check-ins. |
| 397 | <li>If this is the second or later cycle in a push, then the |
| 398 | client sends file cards for any gimme cards that the server sent |
| 399 | in the previous cycle. |
| 400 | <li>The client sends igot cards for every file in its unclustered table |
| 401 | that is not a phantom. |
| 402 | <hr> |
| 403 | <li>The server checks the login and push cards and issues an error if |
| 404 | anything is amiss. |
| 405 | <li>The server accepts file cards from the client and adds those files |
| 406 | to its repository. |
| 407 | <li>The server creates phantoms for igot cards that mention files it |
| 408 | does not possess or for file cards that mention delta source files that |
| 409 | it does not possess. |
| 410 | <li>The server issues gimme cards for all phantoms. |
| 411 | <hr> |
| 412 | <li>The client remembers the gimme cards from the server so that it |
| 413 | can generate file cards in reply on the next cycle. |
| 414 | </ol> |
| 415 | |
| 416 | <p>As with a pull, the steps of a push operation repeat until the |
| 417 | server knows all files that exist on the client. Also, as with |
| 418 | pull, the client attempts to keep the size of the request from |
| 419 | growing too large by suppressing file cards once the |
| 420 | size of the request reaches 1MB.</p> |
| 421 | |
| 422 | <h3>4.3 Sync</h3> |
| 423 | |
| 424 | <p>A sync is just a pull and a push that happen at the same time. |
| 425 | The first three steps of a pull are combined with the first five steps |
| 426 | of a push. Steps (4) through (7) of a pull are combined with steps |
| 427 | (5) through (8) of a push. And steps (8) through (10) of a pull |
| 428 | are combined with step (9) of a push.</p> |
| 429 | |
| 430 | <h2>5.0 Summary</h2> |
| 431 | |
| 432 | <p>Here are the key points of the synchronization protocol:</p> |
| 433 | |
| 434 | <ol> |
| 435 | <li>The client sends one or more PUSH HTTP requests to the server. |
| 436 | The request and reply content type is "application/x-fossil". |
| 437 | <li>HTTP request content is compressed using zlib. |
| 438 | <li>The content of request and reply consists of cards with one |
| 439 | card per line. |
| 440 | <li>Card formats are: |
| 441 | <ul> |
| 442 | <li> <b>login</b> <i>userid nonce signature</i> |
| 443 | <li> <b>push</b> <i>servercode projectcode</i> |
| 444 | <li> <b>pull</b> <i>servercode projectcode</i> |
| 445 | <li> <b>clone</b> |
| 446 | <li> <b>file</b> <i>uuid size</i> <b>\n</b> <i>content</i> |
| 447 | <li> <b>file</b> <i>uuid delta-uuid size</i> <b>\n</b> <i>content</i> |
| 448 | <li> <b>igot</b> <i>uuid</i> |
| 449 | <li> <b>gimme</b> <i>uuid</i> |
| 450 | <li> <b>cookie</b> <i>cookie-text</i> |
| 451 | <li> <b>error</b> <i>error-message</i> |
| 452 | </ul> |
| 453 | <li>Phantoms are files that a repository knows exist but does not possess. |
| 454 | <li>Clusters are files that contain the UUIDs of other files. |
| 455 | <li>Clusters are created automatically on the server during a pull. |
| 456 | <li>Repositories keep track of all files that are not named in any |
| 457 | cluster and send igot messages for those files. |
| 458 | <li>Repositories keep track of all the phantoms they hold and send |
| 459 | gimme messages for those files. |
| 460 | </ol> |
| 461 | |
| 462 | </body> |
| 463 | </html> |