Fossil SCM

Merge the new DBP-workflow commands into trunk: bundle, purge, publish, and unpublished.

drh 2014-12-06 15:47 trunk merge
Commit a81a47f66cbfb9ee16cadd5cc186881ab4bd7d50
+307
--- a/src/bundle.c
+++ b/src/bundle.c
@@ -0,0 +1,307 @@
1
+/*
2
+** Copyright (==40** Copyright (c) 2014 D/*
3
+** Copyright (c) 2014 D. Richard Hipp
4
+**
5
+** This program is free software; you can redistribute it and/or
6
+** modify it under the terms of the Simplified BSD License (also
7
+** known as the "2-Clause License" or "FreeBSD License".)
8
+
9
+** This program is distributed in the hope that it will be useful,
10
+** but without any warranty; without even the implied warranty of
11
+** merchantability or fitness for a particular purpose.
12
+**
13
+** Author contact information:
14
+** [email protected]
15
+** http://www.hwaci.com/drh/
16
+**
17
+*******************************************************************************
18
+**
19
+** This file containused to implement and manage a "bundle" file.
20
+*/
21
+#include "config.h"
22
+#include "bundle.h"
23
+#include <assert.h>
24
+
25
+/*
26
+** SQL code used to initialize the schema of a bundle.
27
+**
28
+** The bblob.delta field can be an integer, a text string, or NULL.
29
+** If an integer, then the corresponding blobid is the delta basis.
30
+** If a text string, then that string is a SHA1 hash for the delta
31
+** basis, whister is ainory. If NULL, then
32
+** data contains content without delta compression.
33
+*/
34
+static const cha r zBundleInit[] =
35
+@ CREATE TABLE IF NOT EXISTS "%w".bconfig(
36
+@ bcname TEXT,
37
+@ bcvalue ANY
38
+@ );
39
+@ CREATE TABLE IF NOT EXISTS "%w".bblob(
40
+@ blobid INTEGER PRIMARY KEY, -- Blob ID
41
+@ uuid TEXT SHA1 NOT NULL, -- hash of expanded blob
42
+@ sz INT NOT NULL, -- Size of blob after expansion
43
+@ delta ANY, -- Delta compression basis, or NULL
44
+@ notes TEXT, -- Description of content
45
+@ data BLOB -- compressed content
46
+@ );
47
+;
48
+
49
+/*
50
+** Attach a bundle file to the current database connection using the
51
+** attachment name zBName.
52
+*/
53
+static void bundle_attach_file(
54
+ const char *zFile, /* Name of the file that contains the bundle */
55
+ const char *zBName, /* Attachment name */
56
+ int doInit /* Initialize a new bundle, if true */
57
+){
58
+ int rc;
59
+ char *zErrMsg = 0;
60
+ char *zSql;
61
+ if( )<0 ){blob.rid=tobundle.rid"
62
+ _size(zFile, ExtFILE)<0 ){
63
+ fossil_fatal("no such file: %s", zFile);
64
+ }
65
+ assert( g.db );
66
+ zSql = sqlite3_mprintf("ATTAfatalhat string is a SHA1 c = sqlite3_exec(g.db, zSql, 0, 0, &zErrMsg);
67
+ sqlite3_free(zSql);
68
+ if( rc!=SQLITE_OK || zErrMsg ){
69
+ if( zErrMsg==0 ) zErrMsg = (char*)sqlite3_errmsg(g.db);
70
+ fossil_fatal("not a valid bundle: %s", zFile);
71
+ }
72
+ if( doInit ){
73
+ db_multi_exec(zBundleInit /*works-like:"%w%w"*/, zBName, zBName);
74
+ }else{
75
+ sqlite3_stmt *pStmt;
76
+ zSql = sqlite3_mprintf("SELECT bcname, bcvalue"
77
+ " FROM \"%w\".bconfig", zBName);panic that string is a SHA1fatalhat string is a SHA1 hash for the delta
78
+** basis, whister is presumably in the main repository. If NULL, then
79
+** data contains content without delta compression.
80
+*/
81
+static const char zBundleInit[] =
82
+@ CREATE TABLE IF NOT EXISTS "%w".bconfig(
83
+@ bcname TEXT,
84
+@ bcvalue ANY
85
+@ );
86
+@ CREATE TABLE IF NOT EXISTS "%w".bblob(
87
+@ blobid INTEGER Pfatalhat string is a SHA1 hash for the delta
88
+** basis, whister is presumably in the main repository. If NULL, then
89
+** data contains content without delta compressio}
90
+}
91
+
92
+/*
93
+**sociates("ok", 1);
94
+
95
+ /* NULL
96
+@ notes TEXT, -- Description of content
97
+@ data BLOB -- compressed content
98
+@ );
99
+;
100
+
101
+/*
102
+** Attac ter is presumably iHipp
103
+**
104
+** This program is free software; you can redistribute it and/or
105
+** modify it under the terms of the Simplified BSD License (also
106
+** known as the "2-Clause License" or "FreeBSD License".)
107
+
108
+** This program is distributed in the hope that it will be useful,
109
+** but without any warranty; without even the implied warranty of
110
+** merchantability or fitness for a particular purpose.
111
+**
112
+** Author contact information:
113
+** [email protected]
114
+** http://www.hwaci.com/drh/
115
+**
116
+*******************************************************************************
117
+**
118
+** This file contains code used to implement and manage a "bundle" file.
119
+*/
120
+#include "config.h"
121
+#include "bundle.h"
122
+#include <assert.h>
123
+
124
+/*
125
+** SQL code used to initialize the schema of a bundle.
126
+**
127
+** The bblob.delta field can be an integer, a text string, or NULL.
128
+** If an integer, then the corresponding blobid is the delta basis.
129
+** If a text string, then that string is a SHA1 hash for the delta
130
+** basis, whister is ainory. If NULL, then
131
+** data contains content without delta compression.
132
+*/
133
+static const char zBundleInit[] =
134
+@ CREATE TABLE IF NOT EXISTS "%w/mpressed content
135
+@ );
136
+;
137
+
138
+/*
139
+** Attach a bundle file to the current database connection using the
140
+** attachment name zBName.
141
+*/
142
+static void bundle_attach_file(
143
+ const char *zFile, /* Name of the file that contains the bundle */
144
+ const char *zBName, /* Attachment name */
145
+ int doInit /* Initialize a new bundle, if true */
146
+){
147
+ int rc;
148
+ char *zErrMsg = 0;
149
+ char *zSql;
150
+ if( )<0 ){blob.rid=tobundle.rid"
151
+ _size(zFile, ExtFILE)<0 ){
152
+ fossil_fatal("no such file: %s", zFile);
153
+ }
154
+ assert( g.db );
155
+ zSql = sqlite3_mprintf("ATTAfatalhat string is a SHA1 c = sqlite3_exec(g.db, zSql, 0, 0, &zErrMsg);
156
+ sqlite3_free(zSql);
157
+ if( rc!=SQLITE_OK || zErrMsg ){
158
+ if( zErrMsg==0 ) zErrMsg = (char*)sqlite3_errmsg(g.db);
159
+ fossil_fatal("not a valid bundle: %s", zFile);
160
+ }
161
+ if( doInit ){
162
+ db_multi_exec(zBundleInit /*works-like:"%w%w"*/, zBName, zBName);
163
+ }else{
164
+ sqlite3_stmt *pStmt;
165
+ zSql = sqlite3_mprintf("SELECT bcname, bcvalue"
166
+ " FROM \"%w\".bconfig", zBName);panic that string is a SHA1fatalhat string is a SHA1 hash for the delta
167
+** basis, whister is presumably in the main repository. If NULL, then
168
+** data contains content without delta compression.
169
+*/
170
+statc const char zBundleInit[] =
171
+@ CREATE TABLE IF NOT EXISTS "%w".bconfig(
172
+@ bcname TEXT,
173
+@ bcvalue ANY
174
+@ );
175
+@ CREATE TABLE IF NOT EXISTS "% Pfatalhat string is a SHA1 hash for the delta
176
+** basis, whister is presumably in the main reposa contains content without delta compressio}
177
+}
178
+
179
+/*
180
+**sociates("ok", 1);
181
+
182
+ /* NULL
183
+@ notes TEXT, -- Description of ontent
184
+@ data BLOB content
185
+@ );
186
+;
187
+
188
+/*
189
+** Attach a bundle file to the current database connection using the
190
+** attachment name zBName.
191
+*/
192
+static void bundle_attach_file(
193
+ const char *zFile, /* Name of the file that contains the bundle */
194
+ const char *zBName, */
195
+){
196
+ int rc;
197
+ char *zErrMsg = 0;
198
+ char *zSql;
199
+ if( !doInit && file_size(zFile, ExtFILE)<0 ){
200
+ fossil_fatal("no such file: %s", zFile);
201
+ }
202
+ assert( g.db );
203
+ zSql = sqlite3_mprintf("ATTACH %Q AS %Q", zFile, zBName);
204
+ if( zSql==0 ) fossil_fatal("out of memory");
205
+ rc = sqlite3_exec(g.db, zSql, 0, 0, &zErrMsg);
206
+ sqlite3_free(zSql);
207
+ if( rc!=SQLITE_OK || zErrMsg ){
208
+ if( zErrMsg==0 ) zErrMsg = (char*)sqlite3_errmsg(g.db);
209
+ fossil_fatal("not a valid bundle: %s", zFile);
210
+ }
211
+ if( doInit ){
212
+ db_multi_exec(zBundleInit /*works-like:"%w%w"*/, zBName, zBName);
213
+ }else{
214
+ sqlite3_stmt *pStmt;
215
+ zSql = sqlite3_mprintf("SELECT bcname, bcvalue"
216
+ " FROM \"%w\".bconfig", zBName);
217
+ if( zSql==0 ) fossil_fatal("out of memory");
218
+ rc = sqlite3_prepare(g.db, zSql, -1, &pStmt, 0);
219
+ if( rc ) fossil_fatal("not a valid bundle: %s", zFile);
220
+ sqlite3_free(zSql);
221
+ sqlite3_finalize(pStmt);
222
+ zSql = sqlite3_mprintf("SELECT blobid, uuid,
223
+**makesright (==40** Copyright (c) 2014 D/*
224
+** Copyright (c) 2014 D. Richard Hipp
225
+**
226
+** This program is free software; you can redistribute it and/or
227
+** modify it under the terms of the Simplified BSD License (also
228
+** known as the "2-Clause License" or "FreeBSD License".)
229
+
230
+** This program is distributed in the hope that it will be useful,
231
+** but without any warranty; without even the implied warranty of
232
+** merchantability or fitness for a particular purpose.
233
+**
234
+** Author contact information:
235
+** [email protected]
236
+** http://www.hwaci.com/drh/
237
+**
238
+*******************************************************************************
239
+**
240
+** This file contains code used to implement and manage a "bundle" file.
241
+*/
242
+#include "config.h"
243
+#include "bundle.h"
244
+#include <assert.h>
245
+
246
+/*
247
+** SQe schema of a bundle.
248
+**
249
+** The bblob.delta field can be an integer, a text string, or NULL.
250
+** If an integer, then the corresponding blobid is the delta basis.
251
+** If a text string, then that string is a SHA1 hash for the delta
252
+** basis, whister is presumably in the ain repository. If NULL, then
253
+** data contains content without delta compression.
254
+*/
255
+static const char zBundleInit[] =
256
+@ CREATE TABLE IF NOT EXISTS "%w".bconfig(e ANY
257
+@ );
258
+@ CREATE TABLE IF NOT EXISTS "%w".bblob(
259
+@ blobid INTEGER PRIMARY KEY, -- Blob ID
260
+@ uuid TEXT SHA1 NOT NULL, -- hash of expanded blob
261
+@ sz INT NOT NULL, -- Size of blob after expansion
262
+@ delta ANY, -- Delta compression basis, or NULL
263
+@ notes TEXT, -- Description of content
264
+@ data BLOB -- compressed content
265
+@ );
266
+;
267
+
268
+/*
269
+** Attach a bundle file to the current database connection using the
270
+** attachment name zBName.
271
+*/
272
+static void bundle_attach_file(
273
+ const char *zFile, /* Name of the file that contains the bundle */
274
+ const char *zBName, /* Attachment name */
275
+ int doInit /* Initialize a new bundle, if true */
276
+){
277
+ int rc;
278
+ char *zErrMsg = 0;
279
+ char *zSql;
280
+ if( )<0 ){blob.rid=tobundle.rid"
281
+ _size(zFile, ExtFILE)<0 ){
282
+ fossil_fatal("no such file: %s", zFile);
283
+ }
284
+ assert( g.db );
285
+ zSql = sqlite3_mprintf("ATTAfatalhat string is a SHA1 c = sqlite3_exec(g.db, zSql, 0, 0, &zErrMsg);
286
+ sqlite3_free(zSql);
287
+ if( rc!=SQLITE_OK || zErrMsg ){
288
+ if( zErrMsg==0 ) zErrMsg = (char*)sqlite3_errmsg(g.db);
289
+ fossil_fatal("not a valid bundle: %s", zFile);
290
+ }
291
+ if( doInit ){
292
+ db_multi_exec(zBundleInit /*works-like:"%w%w"*/, zBName, zBName);
293
+ }else{
294
+ sqlite3_stmt *pStmt;
295
+ zSql = sqlite3_mprintf("SELECT bcname, bcvalue"
296
+ " FROM \"%w\".bconfig", zBName);panic that string is a SHA1fatalhat string is a SHA1 hash for the delta
297
+** basis, whister is presumably in the main repository. If NULL, then
298
+** data contains content without delta compression.
299
+*/
300
+static const char zBundleInit[] =
301
+@ CREATE TABLE IF NOT EXISTS "%w".bconfig(
302
+@ bcname TEXT,
303
+@ bcvalue ANY
304
+@ );
305
+@ CREATE TABLE IF NOT EXISTS "%w".bblob(
306
+@ blobid INTEGER Pfatalhat string is a SHA1 hash for the delta
307
+** basis, whist ins
--- a/src/bundle.c
+++ b/src/bundle.c
@@ -0,0 +1,307 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/src/bundle.c
+++ b/src/bundle.c
@@ -0,0 +1,307 @@
1 /*
2 ** Copyright (==40** Copyright (c) 2014 D/*
3 ** Copyright (c) 2014 D. Richard Hipp
4 **
5 ** This program is free software; you can redistribute it and/or
6 ** modify it under the terms of the Simplified BSD License (also
7 ** known as the "2-Clause License" or "FreeBSD License".)
8
9 ** This program is distributed in the hope that it will be useful,
10 ** but without any warranty; without even the implied warranty of
11 ** merchantability or fitness for a particular purpose.
12 **
13 ** Author contact information:
14 ** [email protected]
15 ** http://www.hwaci.com/drh/
16 **
17 *******************************************************************************
18 **
19 ** This file containused to implement and manage a "bundle" file.
20 */
21 #include "config.h"
22 #include "bundle.h"
23 #include <assert.h>
24
25 /*
26 ** SQL code used to initialize the schema of a bundle.
27 **
28 ** The bblob.delta field can be an integer, a text string, or NULL.
29 ** If an integer, then the corresponding blobid is the delta basis.
30 ** If a text string, then that string is a SHA1 hash for the delta
31 ** basis, whister is ainory. If NULL, then
32 ** data contains content without delta compression.
33 */
34 static const cha r zBundleInit[] =
35 @ CREATE TABLE IF NOT EXISTS "%w".bconfig(
36 @ bcname TEXT,
37 @ bcvalue ANY
38 @ );
39 @ CREATE TABLE IF NOT EXISTS "%w".bblob(
40 @ blobid INTEGER PRIMARY KEY, -- Blob ID
41 @ uuid TEXT SHA1 NOT NULL, -- hash of expanded blob
42 @ sz INT NOT NULL, -- Size of blob after expansion
43 @ delta ANY, -- Delta compression basis, or NULL
44 @ notes TEXT, -- Description of content
45 @ data BLOB -- compressed content
46 @ );
47 ;
48
49 /*
50 ** Attach a bundle file to the current database connection using the
51 ** attachment name zBName.
52 */
53 static void bundle_attach_file(
54 const char *zFile, /* Name of the file that contains the bundle */
55 const char *zBName, /* Attachment name */
56 int doInit /* Initialize a new bundle, if true */
57 ){
58 int rc;
59 char *zErrMsg = 0;
60 char *zSql;
61 if( )<0 ){blob.rid=tobundle.rid"
62 _size(zFile, ExtFILE)<0 ){
63 fossil_fatal("no such file: %s", zFile);
64 }
65 assert( g.db );
66 zSql = sqlite3_mprintf("ATTAfatalhat string is a SHA1 c = sqlite3_exec(g.db, zSql, 0, 0, &zErrMsg);
67 sqlite3_free(zSql);
68 if( rc!=SQLITE_OK || zErrMsg ){
69 if( zErrMsg==0 ) zErrMsg = (char*)sqlite3_errmsg(g.db);
70 fossil_fatal("not a valid bundle: %s", zFile);
71 }
72 if( doInit ){
73 db_multi_exec(zBundleInit /*works-like:"%w%w"*/, zBName, zBName);
74 }else{
75 sqlite3_stmt *pStmt;
76 zSql = sqlite3_mprintf("SELECT bcname, bcvalue"
77 " FROM \"%w\".bconfig", zBName);panic that string is a SHA1fatalhat string is a SHA1 hash for the delta
78 ** basis, whister is presumably in the main repository. If NULL, then
79 ** data contains content without delta compression.
80 */
81 static const char zBundleInit[] =
82 @ CREATE TABLE IF NOT EXISTS "%w".bconfig(
83 @ bcname TEXT,
84 @ bcvalue ANY
85 @ );
86 @ CREATE TABLE IF NOT EXISTS "%w".bblob(
87 @ blobid INTEGER Pfatalhat string is a SHA1 hash for the delta
88 ** basis, whister is presumably in the main repository. If NULL, then
89 ** data contains content without delta compressio}
90 }
91
92 /*
93 **sociates("ok", 1);
94
95 /* NULL
96 @ notes TEXT, -- Description of content
97 @ data BLOB -- compressed content
98 @ );
99 ;
100
101 /*
102 ** Attac ter is presumably iHipp
103 **
104 ** This program is free software; you can redistribute it and/or
105 ** modify it under the terms of the Simplified BSD License (also
106 ** known as the "2-Clause License" or "FreeBSD License".)
107
108 ** This program is distributed in the hope that it will be useful,
109 ** but without any warranty; without even the implied warranty of
110 ** merchantability or fitness for a particular purpose.
111 **
112 ** Author contact information:
113 ** [email protected]
114 ** http://www.hwaci.com/drh/
115 **
116 *******************************************************************************
117 **
118 ** This file contains code used to implement and manage a "bundle" file.
119 */
120 #include "config.h"
121 #include "bundle.h"
122 #include <assert.h>
123
124 /*
125 ** SQL code used to initialize the schema of a bundle.
126 **
127 ** The bblob.delta field can be an integer, a text string, or NULL.
128 ** If an integer, then the corresponding blobid is the delta basis.
129 ** If a text string, then that string is a SHA1 hash for the delta
130 ** basis, whister is ainory. If NULL, then
131 ** data contains content without delta compression.
132 */
133 static const char zBundleInit[] =
134 @ CREATE TABLE IF NOT EXISTS "%w/mpressed content
135 @ );
136 ;
137
138 /*
139 ** Attach a bundle file to the current database connection using the
140 ** attachment name zBName.
141 */
142 static void bundle_attach_file(
143 const char *zFile, /* Name of the file that contains the bundle */
144 const char *zBName, /* Attachment name */
145 int doInit /* Initialize a new bundle, if true */
146 ){
147 int rc;
148 char *zErrMsg = 0;
149 char *zSql;
150 if( )<0 ){blob.rid=tobundle.rid"
151 _size(zFile, ExtFILE)<0 ){
152 fossil_fatal("no such file: %s", zFile);
153 }
154 assert( g.db );
155 zSql = sqlite3_mprintf("ATTAfatalhat string is a SHA1 c = sqlite3_exec(g.db, zSql, 0, 0, &zErrMsg);
156 sqlite3_free(zSql);
157 if( rc!=SQLITE_OK || zErrMsg ){
158 if( zErrMsg==0 ) zErrMsg = (char*)sqlite3_errmsg(g.db);
159 fossil_fatal("not a valid bundle: %s", zFile);
160 }
161 if( doInit ){
162 db_multi_exec(zBundleInit /*works-like:"%w%w"*/, zBName, zBName);
163 }else{
164 sqlite3_stmt *pStmt;
165 zSql = sqlite3_mprintf("SELECT bcname, bcvalue"
166 " FROM \"%w\".bconfig", zBName);panic that string is a SHA1fatalhat string is a SHA1 hash for the delta
167 ** basis, whister is presumably in the main repository. If NULL, then
168 ** data contains content without delta compression.
169 */
170 statc const char zBundleInit[] =
171 @ CREATE TABLE IF NOT EXISTS "%w".bconfig(
172 @ bcname TEXT,
173 @ bcvalue ANY
174 @ );
175 @ CREATE TABLE IF NOT EXISTS "% Pfatalhat string is a SHA1 hash for the delta
176 ** basis, whister is presumably in the main reposa contains content without delta compressio}
177 }
178
179 /*
180 **sociates("ok", 1);
181
182 /* NULL
183 @ notes TEXT, -- Description of ontent
184 @ data BLOB content
185 @ );
186 ;
187
188 /*
189 ** Attach a bundle file to the current database connection using the
190 ** attachment name zBName.
191 */
192 static void bundle_attach_file(
193 const char *zFile, /* Name of the file that contains the bundle */
194 const char *zBName, */
195 ){
196 int rc;
197 char *zErrMsg = 0;
198 char *zSql;
199 if( !doInit && file_size(zFile, ExtFILE)<0 ){
200 fossil_fatal("no such file: %s", zFile);
201 }
202 assert( g.db );
203 zSql = sqlite3_mprintf("ATTACH %Q AS %Q", zFile, zBName);
204 if( zSql==0 ) fossil_fatal("out of memory");
205 rc = sqlite3_exec(g.db, zSql, 0, 0, &zErrMsg);
206 sqlite3_free(zSql);
207 if( rc!=SQLITE_OK || zErrMsg ){
208 if( zErrMsg==0 ) zErrMsg = (char*)sqlite3_errmsg(g.db);
209 fossil_fatal("not a valid bundle: %s", zFile);
210 }
211 if( doInit ){
212 db_multi_exec(zBundleInit /*works-like:"%w%w"*/, zBName, zBName);
213 }else{
214 sqlite3_stmt *pStmt;
215 zSql = sqlite3_mprintf("SELECT bcname, bcvalue"
216 " FROM \"%w\".bconfig", zBName);
217 if( zSql==0 ) fossil_fatal("out of memory");
218 rc = sqlite3_prepare(g.db, zSql, -1, &pStmt, 0);
219 if( rc ) fossil_fatal("not a valid bundle: %s", zFile);
220 sqlite3_free(zSql);
221 sqlite3_finalize(pStmt);
222 zSql = sqlite3_mprintf("SELECT blobid, uuid,
223 **makesright (==40** Copyright (c) 2014 D/*
224 ** Copyright (c) 2014 D. Richard Hipp
225 **
226 ** This program is free software; you can redistribute it and/or
227 ** modify it under the terms of the Simplified BSD License (also
228 ** known as the "2-Clause License" or "FreeBSD License".)
229
230 ** This program is distributed in the hope that it will be useful,
231 ** but without any warranty; without even the implied warranty of
232 ** merchantability or fitness for a particular purpose.
233 **
234 ** Author contact information:
235 ** [email protected]
236 ** http://www.hwaci.com/drh/
237 **
238 *******************************************************************************
239 **
240 ** This file contains code used to implement and manage a "bundle" file.
241 */
242 #include "config.h"
243 #include "bundle.h"
244 #include <assert.h>
245
246 /*
247 ** SQe schema of a bundle.
248 **
249 ** The bblob.delta field can be an integer, a text string, or NULL.
250 ** If an integer, then the corresponding blobid is the delta basis.
251 ** If a text string, then that string is a SHA1 hash for the delta
252 ** basis, whister is presumably in the ain repository. If NULL, then
253 ** data contains content without delta compression.
254 */
255 static const char zBundleInit[] =
256 @ CREATE TABLE IF NOT EXISTS "%w".bconfig(e ANY
257 @ );
258 @ CREATE TABLE IF NOT EXISTS "%w".bblob(
259 @ blobid INTEGER PRIMARY KEY, -- Blob ID
260 @ uuid TEXT SHA1 NOT NULL, -- hash of expanded blob
261 @ sz INT NOT NULL, -- Size of blob after expansion
262 @ delta ANY, -- Delta compression basis, or NULL
263 @ notes TEXT, -- Description of content
264 @ data BLOB -- compressed content
265 @ );
266 ;
267
268 /*
269 ** Attach a bundle file to the current database connection using the
270 ** attachment name zBName.
271 */
272 static void bundle_attach_file(
273 const char *zFile, /* Name of the file that contains the bundle */
274 const char *zBName, /* Attachment name */
275 int doInit /* Initialize a new bundle, if true */
276 ){
277 int rc;
278 char *zErrMsg = 0;
279 char *zSql;
280 if( )<0 ){blob.rid=tobundle.rid"
281 _size(zFile, ExtFILE)<0 ){
282 fossil_fatal("no such file: %s", zFile);
283 }
284 assert( g.db );
285 zSql = sqlite3_mprintf("ATTAfatalhat string is a SHA1 c = sqlite3_exec(g.db, zSql, 0, 0, &zErrMsg);
286 sqlite3_free(zSql);
287 if( rc!=SQLITE_OK || zErrMsg ){
288 if( zErrMsg==0 ) zErrMsg = (char*)sqlite3_errmsg(g.db);
289 fossil_fatal("not a valid bundle: %s", zFile);
290 }
291 if( doInit ){
292 db_multi_exec(zBundleInit /*works-like:"%w%w"*/, zBName, zBName);
293 }else{
294 sqlite3_stmt *pStmt;
295 zSql = sqlite3_mprintf("SELECT bcname, bcvalue"
296 " FROM \"%w\".bconfig", zBName);panic that string is a SHA1fatalhat string is a SHA1 hash for the delta
297 ** basis, whister is presumably in the main repository. If NULL, then
298 ** data contains content without delta compression.
299 */
300 static const char zBundleInit[] =
301 @ CREATE TABLE IF NOT EXISTS "%w".bconfig(
302 @ bcname TEXT,
303 @ bcvalue ANY
304 @ );
305 @ CREATE TABLE IF NOT EXISTS "%w".bblob(
306 @ blobid INTEGER Pfatalhat string is a SHA1 hash for the delta
307 ** basis, whist ins
+4 -4
--- src/content.c
+++ src/content.c
@@ -567,14 +567,14 @@
567567
db_exec(&s1);
568568
rid = db_last_insert_rowid();
569569
if( !pBlob ){
570570
db_multi_exec("INSERT OR IGNORE INTO phantom VALUES(%d)", rid);
571571
}
572
- if( g.markPrivate || isPrivate ){
573
- db_multi_exec("INSERT INTO private VALUES(%d)", rid);
574
- markAsUnclustered = 0;
575
- }
572
+ }
573
+ if( g.markPrivate || isPrivate ){
574
+ db_multi_exec("INSERT INTO private VALUES(%d)", rid);
575
+ markAsUnclustered = 0;
576576
}
577577
if( nBlob==0 ) blob_reset(&cmpr);
578578
579579
/* If the srcId is specified, then the data we just added is
580580
** really a delta. Record this fact in the delta table.
581581
--- src/content.c
+++ src/content.c
@@ -567,14 +567,14 @@
567 db_exec(&s1);
568 rid = db_last_insert_rowid();
569 if( !pBlob ){
570 db_multi_exec("INSERT OR IGNORE INTO phantom VALUES(%d)", rid);
571 }
572 if( g.markPrivate || isPrivate ){
573 db_multi_exec("INSERT INTO private VALUES(%d)", rid);
574 markAsUnclustered = 0;
575 }
576 }
577 if( nBlob==0 ) blob_reset(&cmpr);
578
579 /* If the srcId is specified, then the data we just added is
580 ** really a delta. Record this fact in the delta table.
581
--- src/content.c
+++ src/content.c
@@ -567,14 +567,14 @@
567 db_exec(&s1);
568 rid = db_last_insert_rowid();
569 if( !pBlob ){
570 db_multi_exec("INSERT OR IGNORE INTO phantom VALUES(%d)", rid);
571 }
572 }
573 if( g.markPrivate || isPrivate ){
574 db_multi_exec("INSERT INTO private VALUES(%d)", rid);
575 markAsUnclustered = 0;
576 }
577 if( nBlob==0 ) blob_reset(&cmpr);
578
579 /* If the srcId is specified, then the data we just added is
580 ** really a delta. Record this fact in the delta table.
581
+44 -1
--- src/db.c
+++ src/db.c
@@ -424,10 +424,13 @@
424424
425425
/*
426426
** Extract text, integer, or blob values from the N-th column of the
427427
** current row.
428428
*/
429
+int db_column_type(Stmt *pStmt, int N){
430
+ return sqlite3_column_type(pStmt->pStmt, N);
431
+}
429432
int db_column_bytes(Stmt *pStmt, int N){
430433
return sqlite3_column_bytes(pStmt->pStmt, N);
431434
}
432435
int db_column_int(Stmt *pStmt, int N){
433436
return sqlite3_column_int(pStmt->pStmt, N);
@@ -486,10 +489,50 @@
486489
while( (rc = db_step(pStmt))==SQLITE_ROW ){}
487490
rc = db_reset(pStmt);
488491
db_check_result(rc);
489492
return rc;
490493
}
494
+
495
+/*
496
+** Print the output of one or more SQL queries on standard output.
497
+** This routine is used for debugging purposes only.
498
+*/
499
+int db_debug(const char *zSql, ...){
500
+ Blob sql;
501
+ int rc = SQLITE_OK;
502
+ va_list ap;
503
+ const char *z, *zEnd;
504
+ sqlite3_stmt *pStmt;
505
+ blob_init(&sql, 0, 0);
506
+ va_start(ap, zSql);
507
+ blob_vappendf(&sql, zSql, ap);
508
+ va_end(ap);
509
+ z = blob_str(&sql);
510
+ while( rc==SQLITE_OK && z[0] ){
511
+ pStmt = 0;
512
+ rc = sqlite3_prepare_v2(g.db, z, -1, &pStmt, &zEnd);
513
+ if( rc!=SQLITE_OK ) break;
514
+ if( pStmt ){
515
+ int nRow = 0;
516
+ db.nPrepare++;
517
+ while( sqlite3_step(pStmt)==SQLITE_ROW ){
518
+ int i, n;
519
+ if( nRow++ > 0 ) fossil_print("\n");
520
+ n = sqlite3_column_count(pStmt);
521
+ for(i=0; i<n; i++){
522
+ fossil_print("%s = %s\n", sqlite3_column_name(pStmt, i),
523
+ sqlite3_column_text(pStmt,i));
524
+ }
525
+ }
526
+ rc = sqlite3_finalize(pStmt);
527
+ if( rc ) db_err("%s: {%.*s}", sqlite3_errmsg(g.db), (int)(zEnd-z), z);
528
+ }
529
+ z = zEnd;
530
+ }
531
+ blob_reset(&sql);
532
+ return rc;
533
+}
491534
492535
/*
493536
** Execute multiple SQL statements.
494537
*/
495538
int db_multi_exec(const char *zSql, ...){
@@ -722,11 +765,11 @@
722765
arg = (const char*)sqlite3_value_text(argv[0]);
723766
if(!arg){
724767
sqlite3_result_error(context, "Expecting a STRING argument", -1);
725768
}else{
726769
int rid;
727
- type = (2==argc) ? sqlite3_value_text(argv[1]) : 0;
770
+ type = (2==argc) ? (const char*)sqlite3_value_text(argv[1]) : 0;
728771
if(!type) type = "ci";
729772
rid = symbolic_name_to_rid( arg, type );
730773
if(rid<0){
731774
sqlite3_result_error(context, "Symbolic name is ambiguous.", -1);
732775
}else if(0==rid){
733776
--- src/db.c
+++ src/db.c
@@ -424,10 +424,13 @@
424
425 /*
426 ** Extract text, integer, or blob values from the N-th column of the
427 ** current row.
428 */
 
 
 
429 int db_column_bytes(Stmt *pStmt, int N){
430 return sqlite3_column_bytes(pStmt->pStmt, N);
431 }
432 int db_column_int(Stmt *pStmt, int N){
433 return sqlite3_column_int(pStmt->pStmt, N);
@@ -486,10 +489,50 @@
486 while( (rc = db_step(pStmt))==SQLITE_ROW ){}
487 rc = db_reset(pStmt);
488 db_check_result(rc);
489 return rc;
490 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
491
492 /*
493 ** Execute multiple SQL statements.
494 */
495 int db_multi_exec(const char *zSql, ...){
@@ -722,11 +765,11 @@
722 arg = (const char*)sqlite3_value_text(argv[0]);
723 if(!arg){
724 sqlite3_result_error(context, "Expecting a STRING argument", -1);
725 }else{
726 int rid;
727 type = (2==argc) ? sqlite3_value_text(argv[1]) : 0;
728 if(!type) type = "ci";
729 rid = symbolic_name_to_rid( arg, type );
730 if(rid<0){
731 sqlite3_result_error(context, "Symbolic name is ambiguous.", -1);
732 }else if(0==rid){
733
--- src/db.c
+++ src/db.c
@@ -424,10 +424,13 @@
424
425 /*
426 ** Extract text, integer, or blob values from the N-th column of the
427 ** current row.
428 */
429 int db_column_type(Stmt *pStmt, int N){
430 return sqlite3_column_type(pStmt->pStmt, N);
431 }
432 int db_column_bytes(Stmt *pStmt, int N){
433 return sqlite3_column_bytes(pStmt->pStmt, N);
434 }
435 int db_column_int(Stmt *pStmt, int N){
436 return sqlite3_column_int(pStmt->pStmt, N);
@@ -486,10 +489,50 @@
489 while( (rc = db_step(pStmt))==SQLITE_ROW ){}
490 rc = db_reset(pStmt);
491 db_check_result(rc);
492 return rc;
493 }
494
495 /*
496 ** Print the output of one or more SQL queries on standard output.
497 ** This routine is used for debugging purposes only.
498 */
499 int db_debug(const char *zSql, ...){
500 Blob sql;
501 int rc = SQLITE_OK;
502 va_list ap;
503 const char *z, *zEnd;
504 sqlite3_stmt *pStmt;
505 blob_init(&sql, 0, 0);
506 va_start(ap, zSql);
507 blob_vappendf(&sql, zSql, ap);
508 va_end(ap);
509 z = blob_str(&sql);
510 while( rc==SQLITE_OK && z[0] ){
511 pStmt = 0;
512 rc = sqlite3_prepare_v2(g.db, z, -1, &pStmt, &zEnd);
513 if( rc!=SQLITE_OK ) break;
514 if( pStmt ){
515 int nRow = 0;
516 db.nPrepare++;
517 while( sqlite3_step(pStmt)==SQLITE_ROW ){
518 int i, n;
519 if( nRow++ > 0 ) fossil_print("\n");
520 n = sqlite3_column_count(pStmt);
521 for(i=0; i<n; i++){
522 fossil_print("%s = %s\n", sqlite3_column_name(pStmt, i),
523 sqlite3_column_text(pStmt,i));
524 }
525 }
526 rc = sqlite3_finalize(pStmt);
527 if( rc ) db_err("%s: {%.*s}", sqlite3_errmsg(g.db), (int)(zEnd-z), z);
528 }
529 z = zEnd;
530 }
531 blob_reset(&sql);
532 return rc;
533 }
534
535 /*
536 ** Execute multiple SQL statements.
537 */
538 int db_multi_exec(const char *zSql, ...){
@@ -722,11 +765,11 @@
765 arg = (const char*)sqlite3_value_text(argv[0]);
766 if(!arg){
767 sqlite3_result_error(context, "Expecting a STRING argument", -1);
768 }else{
769 int rid;
770 type = (2==argc) ? (const char*)sqlite3_value_text(argv[1]) : 0;
771 if(!type) type = "ci";
772 rid = symbolic_name_to_rid( arg, type );
773 if(rid<0){
774 sqlite3_result_error(context, "Symbolic name is ambiguous.", -1);
775 }else if(0==rid){
776
--- src/descendants.c
+++ src/descendants.c
@@ -289,14 +289,14 @@
289289
}
290290
291291
/*
292292
** COMMAND: descendants*
293293
**
294
-** Usage: %fossil descendants ?BASELINE-ID? ?OPTIONS?
294
+** Usage: %fossil descendants ?CHECKIN? ?OPTIONS?
295295
**
296
-** Find all leaf descendants of the baseline specified or if the argument
297
-** is omitted, of the baseline currently checked out.
296
+** Find all leaf descendants of the checkin specified or if the argument
297
+** is omitted, of the checkin currently checked out.
298298
**
299299
** Options:
300300
** -R|--repository FILE Extract info from repository FILE
301301
** -W|--width <num> Width of lines (default is to auto-detect).
302302
** Must be >20 or 0 (= no limit, resulting in a
@@ -334,11 +334,11 @@
334334
"%s"
335335
" AND event.objid IN (SELECT rid FROM leaves)"
336336
" ORDER BY event.mtime DESC",
337337
timeline_query_for_tty()
338338
);
339
- print_timeline(&q, -20, width, 0);
339
+ print_timeline(&q, 0, width, 0);
340340
db_finalize(&q);
341341
}
342342
343343
/*
344344
** COMMAND: leaves*
345345
--- src/descendants.c
+++ src/descendants.c
@@ -289,14 +289,14 @@
289 }
290
291 /*
292 ** COMMAND: descendants*
293 **
294 ** Usage: %fossil descendants ?BASELINE-ID? ?OPTIONS?
295 **
296 ** Find all leaf descendants of the baseline specified or if the argument
297 ** is omitted, of the baseline currently checked out.
298 **
299 ** Options:
300 ** -R|--repository FILE Extract info from repository FILE
301 ** -W|--width <num> Width of lines (default is to auto-detect).
302 ** Must be >20 or 0 (= no limit, resulting in a
@@ -334,11 +334,11 @@
334 "%s"
335 " AND event.objid IN (SELECT rid FROM leaves)"
336 " ORDER BY event.mtime DESC",
337 timeline_query_for_tty()
338 );
339 print_timeline(&q, -20, width, 0);
340 db_finalize(&q);
341 }
342
343 /*
344 ** COMMAND: leaves*
345
--- src/descendants.c
+++ src/descendants.c
@@ -289,14 +289,14 @@
289 }
290
291 /*
292 ** COMMAND: descendants*
293 **
294 ** Usage: %fossil descendants ?CHECKIN? ?OPTIONS?
295 **
296 ** Find all leaf descendants of the checkin specified or if the argument
297 ** is omitted, of the checkin currently checked out.
298 **
299 ** Options:
300 ** -R|--repository FILE Extract info from repository FILE
301 ** -W|--width <num> Width of lines (default is to auto-detect).
302 ** Must be >20 or 0 (= no limit, resulting in a
@@ -334,11 +334,11 @@
334 "%s"
335 " AND event.objid IN (SELECT rid FROM leaves)"
336 " ORDER BY event.mtime DESC",
337 timeline_query_for_tty()
338 );
339 print_timeline(&q, 0, width, 0);
340 db_finalize(&q);
341 }
342
343 /*
344 ** COMMAND: leaves*
345
--- src/finfo.c
+++ src/finfo.c
@@ -495,10 +495,11 @@
495495
@ <br>fid=%d(frid) pid=%d(fpid) mid=%d(fmid) sz=%d(sz)
496496
if( srcid ){
497497
@ srcid=%d(srcid)
498498
}
499499
}
500
+ tag_private_status(frid);
500501
@ </td></tr>
501502
}
502503
db_finalize(&q);
503504
if( pGraph ){
504505
graph_finish(pGraph, 0);
505506
--- src/finfo.c
+++ src/finfo.c
@@ -495,10 +495,11 @@
495 @ <br>fid=%d(frid) pid=%d(fpid) mid=%d(fmid) sz=%d(sz)
496 if( srcid ){
497 @ srcid=%d(srcid)
498 }
499 }
 
500 @ </td></tr>
501 }
502 db_finalize(&q);
503 if( pGraph ){
504 graph_finish(pGraph, 0);
505
--- src/finfo.c
+++ src/finfo.c
@@ -495,10 +495,11 @@
495 @ <br>fid=%d(frid) pid=%d(fpid) mid=%d(fmid) sz=%d(sz)
496 if( srcid ){
497 @ srcid=%d(srcid)
498 }
499 }
500 tag_private_status(frid);
501 @ </td></tr>
502 }
503 db_finalize(&q);
504 if( pGraph ){
505 graph_finish(pGraph, 0);
506
-3
--- src/foci.c
+++ src/foci.c
@@ -104,14 +104,11 @@
104104
105105
/*
106106
** Open a new focivfs cursor.
107107
*/
108108
static int fociOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
109
- FociTable *pTab = (FociTable *)pVTab;
110109
FociCursor *pCsr;
111
- int rc;
112
-
113110
pCsr = (FociCursor *)sqlite3_malloc(sizeof(FociCursor));
114111
memset(pCsr, 0, sizeof(FociCursor));
115112
pCsr->base.pVtab = pVTab;
116113
*ppCursor = (sqlite3_vtab_cursor *)pCsr;
117114
return SQLITE_OK;
118115
--- src/foci.c
+++ src/foci.c
@@ -104,14 +104,11 @@
104
105 /*
106 ** Open a new focivfs cursor.
107 */
108 static int fociOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
109 FociTable *pTab = (FociTable *)pVTab;
110 FociCursor *pCsr;
111 int rc;
112
113 pCsr = (FociCursor *)sqlite3_malloc(sizeof(FociCursor));
114 memset(pCsr, 0, sizeof(FociCursor));
115 pCsr->base.pVtab = pVTab;
116 *ppCursor = (sqlite3_vtab_cursor *)pCsr;
117 return SQLITE_OK;
118
--- src/foci.c
+++ src/foci.c
@@ -104,14 +104,11 @@
104
105 /*
106 ** Open a new focivfs cursor.
107 */
108 static int fociOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
 
109 FociCursor *pCsr;
 
 
110 pCsr = (FociCursor *)sqlite3_malloc(sizeof(FociCursor));
111 memset(pCsr, 0, sizeof(FociCursor));
112 pCsr->base.pVtab = pVTab;
113 *ppCursor = (sqlite3_vtab_cursor *)pCsr;
114 return SQLITE_OK;
115
+6 -1
--- src/info.c
+++ src/info.c
@@ -931,10 +931,11 @@
931931
}else{
932932
@ tags: %h(zTagList),
933933
}
934934
@ date:
935935
hyperlink_to_date(zDate, ")");
936
+ tag_private_status(rid);
936937
}
937938
db_finalize(&q);
938939
}
939940
940941
@@ -1203,19 +1204,20 @@
12031204
}else{
12041205
@ <li>File
12051206
}
12061207
objType |= OBJTYPE_CONTENT;
12071208
@ %z(href("%R/finfo?name=%T",zName))%h(zName)</a>
1209
+ tag_private_status(rid);
12081210
if( showDetail ){
12091211
@ <ul>
12101212
}
12111213
prevName = fossil_strdup(zName);
12121214
}
12131215
if( showDetail ){
12141216
@ <li>
12151217
hyperlink_to_date(zDate,"");
1216
- @ &mdash; part of check-in
1218
+ @ &mdash; part of checkin
12171219
hyperlink_to_uuid(zVers);
12181220
}else{
12191221
@ &mdash; part of checkin
12201222
hyperlink_to_uuid(zVers);
12211223
@ at
@@ -1314,10 +1316,11 @@
13141316
hyperlink_to_user(zUser,zDate," on");
13151317
hyperlink_to_date(zDate, ".");
13161318
if( pDownloadName && blob_size(pDownloadName)==0 ){
13171319
blob_appendf(pDownloadName, "%.10s.txt", zUuid);
13181320
}
1321
+ tag_private_status(rid);
13191322
cnt++;
13201323
}
13211324
db_finalize(&q);
13221325
}
13231326
db_prepare(&q,
@@ -1357,17 +1360,19 @@
13571360
hyperlink_to_date(zDate,".");
13581361
cnt++;
13591362
if( pDownloadName && blob_size(pDownloadName)==0 ){
13601363
blob_append(pDownloadName, zFilename, -1);
13611364
}
1365
+ tag_private_status(rid);
13621366
}
13631367
db_finalize(&q);
13641368
if( cnt==0 ){
13651369
@ Control artifact.
13661370
if( pDownloadName && blob_size(pDownloadName)==0 ){
13671371
blob_appendf(pDownloadName, "%.10s.txt", zUuid);
13681372
}
1373
+ tag_private_status(rid);
13691374
}
13701375
return objType;
13711376
}
13721377
13731378
13741379
--- src/info.c
+++ src/info.c
@@ -931,10 +931,11 @@
931 }else{
932 @ tags: %h(zTagList),
933 }
934 @ date:
935 hyperlink_to_date(zDate, ")");
 
936 }
937 db_finalize(&q);
938 }
939
940
@@ -1203,19 +1204,20 @@
1203 }else{
1204 @ <li>File
1205 }
1206 objType |= OBJTYPE_CONTENT;
1207 @ %z(href("%R/finfo?name=%T",zName))%h(zName)</a>
 
1208 if( showDetail ){
1209 @ <ul>
1210 }
1211 prevName = fossil_strdup(zName);
1212 }
1213 if( showDetail ){
1214 @ <li>
1215 hyperlink_to_date(zDate,"");
1216 @ &mdash; part of check-in
1217 hyperlink_to_uuid(zVers);
1218 }else{
1219 @ &mdash; part of checkin
1220 hyperlink_to_uuid(zVers);
1221 @ at
@@ -1314,10 +1316,11 @@
1314 hyperlink_to_user(zUser,zDate," on");
1315 hyperlink_to_date(zDate, ".");
1316 if( pDownloadName && blob_size(pDownloadName)==0 ){
1317 blob_appendf(pDownloadName, "%.10s.txt", zUuid);
1318 }
 
1319 cnt++;
1320 }
1321 db_finalize(&q);
1322 }
1323 db_prepare(&q,
@@ -1357,17 +1360,19 @@
1357 hyperlink_to_date(zDate,".");
1358 cnt++;
1359 if( pDownloadName && blob_size(pDownloadName)==0 ){
1360 blob_append(pDownloadName, zFilename, -1);
1361 }
 
1362 }
1363 db_finalize(&q);
1364 if( cnt==0 ){
1365 @ Control artifact.
1366 if( pDownloadName && blob_size(pDownloadName)==0 ){
1367 blob_appendf(pDownloadName, "%.10s.txt", zUuid);
1368 }
 
1369 }
1370 return objType;
1371 }
1372
1373
1374
--- src/info.c
+++ src/info.c
@@ -931,10 +931,11 @@
931 }else{
932 @ tags: %h(zTagList),
933 }
934 @ date:
935 hyperlink_to_date(zDate, ")");
936 tag_private_status(rid);
937 }
938 db_finalize(&q);
939 }
940
941
@@ -1203,19 +1204,20 @@
1204 }else{
1205 @ <li>File
1206 }
1207 objType |= OBJTYPE_CONTENT;
1208 @ %z(href("%R/finfo?name=%T",zName))%h(zName)</a>
1209 tag_private_status(rid);
1210 if( showDetail ){
1211 @ <ul>
1212 }
1213 prevName = fossil_strdup(zName);
1214 }
1215 if( showDetail ){
1216 @ <li>
1217 hyperlink_to_date(zDate,"");
1218 @ &mdash; part of checkin
1219 hyperlink_to_uuid(zVers);
1220 }else{
1221 @ &mdash; part of checkin
1222 hyperlink_to_uuid(zVers);
1223 @ at
@@ -1314,10 +1316,11 @@
1316 hyperlink_to_user(zUser,zDate," on");
1317 hyperlink_to_date(zDate, ".");
1318 if( pDownloadName && blob_size(pDownloadName)==0 ){
1319 blob_appendf(pDownloadName, "%.10s.txt", zUuid);
1320 }
1321 tag_private_status(rid);
1322 cnt++;
1323 }
1324 db_finalize(&q);
1325 }
1326 db_prepare(&q,
@@ -1357,17 +1360,19 @@
1360 hyperlink_to_date(zDate,".");
1361 cnt++;
1362 if( pDownloadName && blob_size(pDownloadName)==0 ){
1363 blob_append(pDownloadName, zFilename, -1);
1364 }
1365 tag_private_status(rid);
1366 }
1367 db_finalize(&q);
1368 if( cnt==0 ){
1369 @ Control artifact.
1370 if( pDownloadName && blob_size(pDownloadName)==0 ){
1371 blob_appendf(pDownloadName, "%.10s.txt", zUuid);
1372 }
1373 tag_private_status(rid);
1374 }
1375 return objType;
1376 }
1377
1378
1379
+36
--- src/main.mk
+++ src/main.mk
@@ -21,10 +21,11 @@
2121
$(SRCDIR)/bisect.c \
2222
$(SRCDIR)/blob.c \
2323
$(SRCDIR)/branch.c \
2424
$(SRCDIR)/browse.c \
2525
$(SRCDIR)/builtin.c \
26
+ $(SRCDIR)/bundle.c \
2627
$(SRCDIR)/cache.c \
2728
$(SRCDIR)/captcha.c \
2829
$(SRCDIR)/cgi.c \
2930
$(SRCDIR)/checkin.c \
3031
$(SRCDIR)/checkout.c \
@@ -87,10 +88,12 @@
8788
$(SRCDIR)/path.c \
8889
$(SRCDIR)/pivot.c \
8990
$(SRCDIR)/popen.c \
9091
$(SRCDIR)/pqueue.c \
9192
$(SRCDIR)/printf.c \
93
+ $(SRCDIR)/publish.c \
94
+ $(SRCDIR)/purge.c \
9295
$(SRCDIR)/rebuild.c \
9396
$(SRCDIR)/regexp.c \
9497
$(SRCDIR)/report.c \
9598
$(SRCDIR)/rss.c \
9699
$(SRCDIR)/schema.c \
@@ -139,10 +142,11 @@
139142
$(OBJDIR)/bisect_.c \
140143
$(OBJDIR)/blob_.c \
141144
$(OBJDIR)/branch_.c \
142145
$(OBJDIR)/browse_.c \
143146
$(OBJDIR)/builtin_.c \
147
+ $(OBJDIR)/bundle_.c \
144148
$(OBJDIR)/cache_.c \
145149
$(OBJDIR)/captcha_.c \
146150
$(OBJDIR)/cgi_.c \
147151
$(OBJDIR)/checkin_.c \
148152
$(OBJDIR)/checkout_.c \
@@ -205,10 +209,12 @@
205209
$(OBJDIR)/path_.c \
206210
$(OBJDIR)/pivot_.c \
207211
$(OBJDIR)/popen_.c \
208212
$(OBJDIR)/pqueue_.c \
209213
$(OBJDIR)/printf_.c \
214
+ $(OBJDIR)/publish_.c \
215
+ $(OBJDIR)/purge_.c \
210216
$(OBJDIR)/rebuild_.c \
211217
$(OBJDIR)/regexp_.c \
212218
$(OBJDIR)/report_.c \
213219
$(OBJDIR)/rss_.c \
214220
$(OBJDIR)/schema_.c \
@@ -254,10 +260,11 @@
254260
$(OBJDIR)/bisect.o \
255261
$(OBJDIR)/blob.o \
256262
$(OBJDIR)/branch.o \
257263
$(OBJDIR)/browse.o \
258264
$(OBJDIR)/builtin.o \
265
+ $(OBJDIR)/bundle.o \
259266
$(OBJDIR)/cache.o \
260267
$(OBJDIR)/captcha.o \
261268
$(OBJDIR)/cgi.o \
262269
$(OBJDIR)/checkin.o \
263270
$(OBJDIR)/checkout.o \
@@ -320,10 +327,12 @@
320327
$(OBJDIR)/path.o \
321328
$(OBJDIR)/pivot.o \
322329
$(OBJDIR)/popen.o \
323330
$(OBJDIR)/pqueue.o \
324331
$(OBJDIR)/printf.o \
332
+ $(OBJDIR)/publish.o \
333
+ $(OBJDIR)/purge.o \
325334
$(OBJDIR)/rebuild.o \
326335
$(OBJDIR)/regexp.o \
327336
$(OBJDIR)/report.o \
328337
$(OBJDIR)/rss.o \
329338
$(OBJDIR)/schema.o \
@@ -478,10 +487,11 @@
478487
$(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h \
479488
$(OBJDIR)/blob_.c:$(OBJDIR)/blob.h \
480489
$(OBJDIR)/branch_.c:$(OBJDIR)/branch.h \
481490
$(OBJDIR)/browse_.c:$(OBJDIR)/browse.h \
482491
$(OBJDIR)/builtin_.c:$(OBJDIR)/builtin.h \
492
+ $(OBJDIR)/bundle_.c:$(OBJDIR)/bundle.h \
483493
$(OBJDIR)/cache_.c:$(OBJDIR)/cache.h \
484494
$(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h \
485495
$(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h \
486496
$(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h \
487497
$(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h \
@@ -544,10 +554,12 @@
544554
$(OBJDIR)/path_.c:$(OBJDIR)/path.h \
545555
$(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h \
546556
$(OBJDIR)/popen_.c:$(OBJDIR)/popen.h \
547557
$(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h \
548558
$(OBJDIR)/printf_.c:$(OBJDIR)/printf.h \
559
+ $(OBJDIR)/publish_.c:$(OBJDIR)/publish.h \
560
+ $(OBJDIR)/purge_.c:$(OBJDIR)/purge.h \
549561
$(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h \
550562
$(OBJDIR)/regexp_.c:$(OBJDIR)/regexp.h \
551563
$(OBJDIR)/report_.c:$(OBJDIR)/report.h \
552564
$(OBJDIR)/rss_.c:$(OBJDIR)/rss.h \
553565
$(OBJDIR)/schema_.c:$(OBJDIR)/schema.h \
@@ -660,10 +672,18 @@
660672
661673
$(OBJDIR)/builtin.o: $(OBJDIR)/builtin_.c $(OBJDIR)/builtin.h $(OBJDIR)/builtin_data.h $(SRCDIR)/config.h
662674
$(XTCC) -o $(OBJDIR)/builtin.o -c $(OBJDIR)/builtin_.c
663675
664676
$(OBJDIR)/builtin.h: $(OBJDIR)/headers
677
+
678
+$(OBJDIR)/bundle_.c: $(SRCDIR)/bundle.c $(OBJDIR)/translate
679
+ $(OBJDIR)/translate $(SRCDIR)/bundle.c >$@
680
+
681
+$(OBJDIR)/bundle.o: $(OBJDIR)/bundle_.c $(OBJDIR)/bundle.h $(SRCDIR)/config.h
682
+ $(XTCC) -o $(OBJDIR)/bundle.o -c $(OBJDIR)/bundle_.c
683
+
684
+$(OBJDIR)/bundle.h: $(OBJDIR)/headers
665685
666686
$(OBJDIR)/cache_.c: $(SRCDIR)/cache.c $(OBJDIR)/translate
667687
$(OBJDIR)/translate $(SRCDIR)/cache.c >$@
668688
669689
$(OBJDIR)/cache.o: $(OBJDIR)/cache_.c $(OBJDIR)/cache.h $(SRCDIR)/config.h
@@ -1188,10 +1208,26 @@
11881208
11891209
$(OBJDIR)/printf.o: $(OBJDIR)/printf_.c $(OBJDIR)/printf.h $(SRCDIR)/config.h
11901210
$(XTCC) -o $(OBJDIR)/printf.o -c $(OBJDIR)/printf_.c
11911211
11921212
$(OBJDIR)/printf.h: $(OBJDIR)/headers
1213
+
1214
+$(OBJDIR)/publish_.c: $(SRCDIR)/publish.c $(OBJDIR)/translate
1215
+ $(OBJDIR)/translate $(SRCDIR)/publish.c >$@
1216
+
1217
+$(OBJDIR)/publish.o: $(OBJDIR)/publish_.c $(OBJDIR)/publish.h $(SRCDIR)/config.h
1218
+ $(XTCC) -o $(OBJDIR)/publish.o -c $(OBJDIR)/publish_.c
1219
+
1220
+$(OBJDIR)/publish.h: $(OBJDIR)/headers
1221
+
1222
+$(OBJDIR)/purge_.c: $(SRCDIR)/purge.c $(OBJDIR)/translate
1223
+ $(OBJDIR)/translate $(SRCDIR)/purge.c >$@
1224
+
1225
+$(OBJDIR)/purge.o: $(OBJDIR)/purge_.c $(OBJDIR)/purge.h $(SRCDIR)/config.h
1226
+ $(XTCC) -o $(OBJDIR)/purge.o -c $(OBJDIR)/purge_.c
1227
+
1228
+$(OBJDIR)/purge.h: $(OBJDIR)/headers
11931229
11941230
$(OBJDIR)/rebuild_.c: $(SRCDIR)/rebuild.c $(OBJDIR)/translate
11951231
$(OBJDIR)/translate $(SRCDIR)/rebuild.c >$@
11961232
11971233
$(OBJDIR)/rebuild.o: $(OBJDIR)/rebuild_.c $(OBJDIR)/rebuild.h $(SRCDIR)/config.h
11981234
--- src/main.mk
+++ src/main.mk
@@ -21,10 +21,11 @@
21 $(SRCDIR)/bisect.c \
22 $(SRCDIR)/blob.c \
23 $(SRCDIR)/branch.c \
24 $(SRCDIR)/browse.c \
25 $(SRCDIR)/builtin.c \
 
26 $(SRCDIR)/cache.c \
27 $(SRCDIR)/captcha.c \
28 $(SRCDIR)/cgi.c \
29 $(SRCDIR)/checkin.c \
30 $(SRCDIR)/checkout.c \
@@ -87,10 +88,12 @@
87 $(SRCDIR)/path.c \
88 $(SRCDIR)/pivot.c \
89 $(SRCDIR)/popen.c \
90 $(SRCDIR)/pqueue.c \
91 $(SRCDIR)/printf.c \
 
 
92 $(SRCDIR)/rebuild.c \
93 $(SRCDIR)/regexp.c \
94 $(SRCDIR)/report.c \
95 $(SRCDIR)/rss.c \
96 $(SRCDIR)/schema.c \
@@ -139,10 +142,11 @@
139 $(OBJDIR)/bisect_.c \
140 $(OBJDIR)/blob_.c \
141 $(OBJDIR)/branch_.c \
142 $(OBJDIR)/browse_.c \
143 $(OBJDIR)/builtin_.c \
 
144 $(OBJDIR)/cache_.c \
145 $(OBJDIR)/captcha_.c \
146 $(OBJDIR)/cgi_.c \
147 $(OBJDIR)/checkin_.c \
148 $(OBJDIR)/checkout_.c \
@@ -205,10 +209,12 @@
205 $(OBJDIR)/path_.c \
206 $(OBJDIR)/pivot_.c \
207 $(OBJDIR)/popen_.c \
208 $(OBJDIR)/pqueue_.c \
209 $(OBJDIR)/printf_.c \
 
 
210 $(OBJDIR)/rebuild_.c \
211 $(OBJDIR)/regexp_.c \
212 $(OBJDIR)/report_.c \
213 $(OBJDIR)/rss_.c \
214 $(OBJDIR)/schema_.c \
@@ -254,10 +260,11 @@
254 $(OBJDIR)/bisect.o \
255 $(OBJDIR)/blob.o \
256 $(OBJDIR)/branch.o \
257 $(OBJDIR)/browse.o \
258 $(OBJDIR)/builtin.o \
 
259 $(OBJDIR)/cache.o \
260 $(OBJDIR)/captcha.o \
261 $(OBJDIR)/cgi.o \
262 $(OBJDIR)/checkin.o \
263 $(OBJDIR)/checkout.o \
@@ -320,10 +327,12 @@
320 $(OBJDIR)/path.o \
321 $(OBJDIR)/pivot.o \
322 $(OBJDIR)/popen.o \
323 $(OBJDIR)/pqueue.o \
324 $(OBJDIR)/printf.o \
 
 
325 $(OBJDIR)/rebuild.o \
326 $(OBJDIR)/regexp.o \
327 $(OBJDIR)/report.o \
328 $(OBJDIR)/rss.o \
329 $(OBJDIR)/schema.o \
@@ -478,10 +487,11 @@
478 $(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h \
479 $(OBJDIR)/blob_.c:$(OBJDIR)/blob.h \
480 $(OBJDIR)/branch_.c:$(OBJDIR)/branch.h \
481 $(OBJDIR)/browse_.c:$(OBJDIR)/browse.h \
482 $(OBJDIR)/builtin_.c:$(OBJDIR)/builtin.h \
 
483 $(OBJDIR)/cache_.c:$(OBJDIR)/cache.h \
484 $(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h \
485 $(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h \
486 $(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h \
487 $(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h \
@@ -544,10 +554,12 @@
544 $(OBJDIR)/path_.c:$(OBJDIR)/path.h \
545 $(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h \
546 $(OBJDIR)/popen_.c:$(OBJDIR)/popen.h \
547 $(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h \
548 $(OBJDIR)/printf_.c:$(OBJDIR)/printf.h \
 
 
549 $(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h \
550 $(OBJDIR)/regexp_.c:$(OBJDIR)/regexp.h \
551 $(OBJDIR)/report_.c:$(OBJDIR)/report.h \
552 $(OBJDIR)/rss_.c:$(OBJDIR)/rss.h \
553 $(OBJDIR)/schema_.c:$(OBJDIR)/schema.h \
@@ -660,10 +672,18 @@
660
661 $(OBJDIR)/builtin.o: $(OBJDIR)/builtin_.c $(OBJDIR)/builtin.h $(OBJDIR)/builtin_data.h $(SRCDIR)/config.h
662 $(XTCC) -o $(OBJDIR)/builtin.o -c $(OBJDIR)/builtin_.c
663
664 $(OBJDIR)/builtin.h: $(OBJDIR)/headers
 
 
 
 
 
 
 
 
665
666 $(OBJDIR)/cache_.c: $(SRCDIR)/cache.c $(OBJDIR)/translate
667 $(OBJDIR)/translate $(SRCDIR)/cache.c >$@
668
669 $(OBJDIR)/cache.o: $(OBJDIR)/cache_.c $(OBJDIR)/cache.h $(SRCDIR)/config.h
@@ -1188,10 +1208,26 @@
1188
1189 $(OBJDIR)/printf.o: $(OBJDIR)/printf_.c $(OBJDIR)/printf.h $(SRCDIR)/config.h
1190 $(XTCC) -o $(OBJDIR)/printf.o -c $(OBJDIR)/printf_.c
1191
1192 $(OBJDIR)/printf.h: $(OBJDIR)/headers
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1193
1194 $(OBJDIR)/rebuild_.c: $(SRCDIR)/rebuild.c $(OBJDIR)/translate
1195 $(OBJDIR)/translate $(SRCDIR)/rebuild.c >$@
1196
1197 $(OBJDIR)/rebuild.o: $(OBJDIR)/rebuild_.c $(OBJDIR)/rebuild.h $(SRCDIR)/config.h
1198
--- src/main.mk
+++ src/main.mk
@@ -21,10 +21,11 @@
21 $(SRCDIR)/bisect.c \
22 $(SRCDIR)/blob.c \
23 $(SRCDIR)/branch.c \
24 $(SRCDIR)/browse.c \
25 $(SRCDIR)/builtin.c \
26 $(SRCDIR)/bundle.c \
27 $(SRCDIR)/cache.c \
28 $(SRCDIR)/captcha.c \
29 $(SRCDIR)/cgi.c \
30 $(SRCDIR)/checkin.c \
31 $(SRCDIR)/checkout.c \
@@ -87,10 +88,12 @@
88 $(SRCDIR)/path.c \
89 $(SRCDIR)/pivot.c \
90 $(SRCDIR)/popen.c \
91 $(SRCDIR)/pqueue.c \
92 $(SRCDIR)/printf.c \
93 $(SRCDIR)/publish.c \
94 $(SRCDIR)/purge.c \
95 $(SRCDIR)/rebuild.c \
96 $(SRCDIR)/regexp.c \
97 $(SRCDIR)/report.c \
98 $(SRCDIR)/rss.c \
99 $(SRCDIR)/schema.c \
@@ -139,10 +142,11 @@
142 $(OBJDIR)/bisect_.c \
143 $(OBJDIR)/blob_.c \
144 $(OBJDIR)/branch_.c \
145 $(OBJDIR)/browse_.c \
146 $(OBJDIR)/builtin_.c \
147 $(OBJDIR)/bundle_.c \
148 $(OBJDIR)/cache_.c \
149 $(OBJDIR)/captcha_.c \
150 $(OBJDIR)/cgi_.c \
151 $(OBJDIR)/checkin_.c \
152 $(OBJDIR)/checkout_.c \
@@ -205,10 +209,12 @@
209 $(OBJDIR)/path_.c \
210 $(OBJDIR)/pivot_.c \
211 $(OBJDIR)/popen_.c \
212 $(OBJDIR)/pqueue_.c \
213 $(OBJDIR)/printf_.c \
214 $(OBJDIR)/publish_.c \
215 $(OBJDIR)/purge_.c \
216 $(OBJDIR)/rebuild_.c \
217 $(OBJDIR)/regexp_.c \
218 $(OBJDIR)/report_.c \
219 $(OBJDIR)/rss_.c \
220 $(OBJDIR)/schema_.c \
@@ -254,10 +260,11 @@
260 $(OBJDIR)/bisect.o \
261 $(OBJDIR)/blob.o \
262 $(OBJDIR)/branch.o \
263 $(OBJDIR)/browse.o \
264 $(OBJDIR)/builtin.o \
265 $(OBJDIR)/bundle.o \
266 $(OBJDIR)/cache.o \
267 $(OBJDIR)/captcha.o \
268 $(OBJDIR)/cgi.o \
269 $(OBJDIR)/checkin.o \
270 $(OBJDIR)/checkout.o \
@@ -320,10 +327,12 @@
327 $(OBJDIR)/path.o \
328 $(OBJDIR)/pivot.o \
329 $(OBJDIR)/popen.o \
330 $(OBJDIR)/pqueue.o \
331 $(OBJDIR)/printf.o \
332 $(OBJDIR)/publish.o \
333 $(OBJDIR)/purge.o \
334 $(OBJDIR)/rebuild.o \
335 $(OBJDIR)/regexp.o \
336 $(OBJDIR)/report.o \
337 $(OBJDIR)/rss.o \
338 $(OBJDIR)/schema.o \
@@ -478,10 +487,11 @@
487 $(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h \
488 $(OBJDIR)/blob_.c:$(OBJDIR)/blob.h \
489 $(OBJDIR)/branch_.c:$(OBJDIR)/branch.h \
490 $(OBJDIR)/browse_.c:$(OBJDIR)/browse.h \
491 $(OBJDIR)/builtin_.c:$(OBJDIR)/builtin.h \
492 $(OBJDIR)/bundle_.c:$(OBJDIR)/bundle.h \
493 $(OBJDIR)/cache_.c:$(OBJDIR)/cache.h \
494 $(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h \
495 $(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h \
496 $(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h \
497 $(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h \
@@ -544,10 +554,12 @@
554 $(OBJDIR)/path_.c:$(OBJDIR)/path.h \
555 $(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h \
556 $(OBJDIR)/popen_.c:$(OBJDIR)/popen.h \
557 $(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h \
558 $(OBJDIR)/printf_.c:$(OBJDIR)/printf.h \
559 $(OBJDIR)/publish_.c:$(OBJDIR)/publish.h \
560 $(OBJDIR)/purge_.c:$(OBJDIR)/purge.h \
561 $(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h \
562 $(OBJDIR)/regexp_.c:$(OBJDIR)/regexp.h \
563 $(OBJDIR)/report_.c:$(OBJDIR)/report.h \
564 $(OBJDIR)/rss_.c:$(OBJDIR)/rss.h \
565 $(OBJDIR)/schema_.c:$(OBJDIR)/schema.h \
@@ -660,10 +672,18 @@
672
673 $(OBJDIR)/builtin.o: $(OBJDIR)/builtin_.c $(OBJDIR)/builtin.h $(OBJDIR)/builtin_data.h $(SRCDIR)/config.h
674 $(XTCC) -o $(OBJDIR)/builtin.o -c $(OBJDIR)/builtin_.c
675
676 $(OBJDIR)/builtin.h: $(OBJDIR)/headers
677
678 $(OBJDIR)/bundle_.c: $(SRCDIR)/bundle.c $(OBJDIR)/translate
679 $(OBJDIR)/translate $(SRCDIR)/bundle.c >$@
680
681 $(OBJDIR)/bundle.o: $(OBJDIR)/bundle_.c $(OBJDIR)/bundle.h $(SRCDIR)/config.h
682 $(XTCC) -o $(OBJDIR)/bundle.o -c $(OBJDIR)/bundle_.c
683
684 $(OBJDIR)/bundle.h: $(OBJDIR)/headers
685
686 $(OBJDIR)/cache_.c: $(SRCDIR)/cache.c $(OBJDIR)/translate
687 $(OBJDIR)/translate $(SRCDIR)/cache.c >$@
688
689 $(OBJDIR)/cache.o: $(OBJDIR)/cache_.c $(OBJDIR)/cache.h $(SRCDIR)/config.h
@@ -1188,10 +1208,26 @@
1208
1209 $(OBJDIR)/printf.o: $(OBJDIR)/printf_.c $(OBJDIR)/printf.h $(SRCDIR)/config.h
1210 $(XTCC) -o $(OBJDIR)/printf.o -c $(OBJDIR)/printf_.c
1211
1212 $(OBJDIR)/printf.h: $(OBJDIR)/headers
1213
1214 $(OBJDIR)/publish_.c: $(SRCDIR)/publish.c $(OBJDIR)/translate
1215 $(OBJDIR)/translate $(SRCDIR)/publish.c >$@
1216
1217 $(OBJDIR)/publish.o: $(OBJDIR)/publish_.c $(OBJDIR)/publish.h $(SRCDIR)/config.h
1218 $(XTCC) -o $(OBJDIR)/publish.o -c $(OBJDIR)/publish_.c
1219
1220 $(OBJDIR)/publish.h: $(OBJDIR)/headers
1221
1222 $(OBJDIR)/purge_.c: $(SRCDIR)/purge.c $(OBJDIR)/translate
1223 $(OBJDIR)/translate $(SRCDIR)/purge.c >$@
1224
1225 $(OBJDIR)/purge.o: $(OBJDIR)/purge_.c $(OBJDIR)/purge.h $(SRCDIR)/config.h
1226 $(XTCC) -o $(OBJDIR)/purge.o -c $(OBJDIR)/purge_.c
1227
1228 $(OBJDIR)/purge.h: $(OBJDIR)/headers
1229
1230 $(OBJDIR)/rebuild_.c: $(SRCDIR)/rebuild.c $(OBJDIR)/translate
1231 $(OBJDIR)/translate $(SRCDIR)/rebuild.c >$@
1232
1233 $(OBJDIR)/rebuild.o: $(OBJDIR)/rebuild_.c $(OBJDIR)/rebuild.h $(SRCDIR)/config.h
1234
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -28,10 +28,11 @@
2828
bisect
2929
blob
3030
branch
3131
browse
3232
builtin
33
+ bundle
3334
cache
3435
captcha
3536
cgi
3637
checkin
3738
checkout
@@ -93,10 +94,12 @@
9394
path
9495
pivot
9596
popen
9697
pqueue
9798
printf
99
+ publish
100
+ purge
98101
rebuild
99102
regexp
100103
report
101104
rss
102105
schema
103106
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -28,10 +28,11 @@
28 bisect
29 blob
30 branch
31 browse
32 builtin
 
33 cache
34 captcha
35 cgi
36 checkin
37 checkout
@@ -93,10 +94,12 @@
93 path
94 pivot
95 popen
96 pqueue
97 printf
 
 
98 rebuild
99 regexp
100 report
101 rss
102 schema
103
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -28,10 +28,11 @@
28 bisect
29 blob
30 branch
31 browse
32 builtin
33 bundle
34 cache
35 captcha
36 cgi
37 checkin
38 checkout
@@ -93,10 +94,12 @@
94 path
95 pivot
96 popen
97 pqueue
98 printf
99 publish
100 purge
101 rebuild
102 regexp
103 report
104 rss
105 schema
106
+9 -2
--- src/mkversion.c
+++ src/mkversion.c
@@ -7,10 +7,11 @@
77
**
88
** Note that the manifest.uuid and manifest files are generated by Fossil.
99
*/
1010
#include <stdio.h>
1111
#include <string.h>
12
+#include <stdlib.h>
1213
1314
int main(int argc, char *argv[]){
1415
FILE *m,*u,*v;
1516
char *z;
1617
int i, x, d;
@@ -17,11 +18,14 @@
1718
char b[1000];
1819
char vx[1000];
1920
memset(b,0,sizeof(b));
2021
memset(vx,0,sizeof(vx));
2122
u = fopen(argv[1],"r");
22
- fgets(b, sizeof(b)-1,u);
23
+ if( fgets(b, sizeof(b)-1,u)==0 ){
24
+ fprintf(stderr, "malformed manifest.uuid file: %s\n", argv[1]);
25
+ exit(1);
26
+ }
2327
fclose(u);
2428
for(z=b; z[0] && z[0]!='\r' && z[0]!='\n'; z++){}
2529
*z = 0;
2630
printf("#define MANIFEST_UUID \"%s\"\n",b);
2731
printf("#define MANIFEST_VERSION \"[%10.10s]\"\n",b);
@@ -32,11 +36,14 @@
3236
printf("#define MANIFEST_YEAR \"%.4s\"\n",b+2);
3337
}
3438
}
3539
fclose(m);
3640
v = fopen(argv[3],"r");
37
- fgets(b, sizeof(b)-1,v);
41
+ if( fgets(b, sizeof(b)-1,v)==0 ){
42
+ fprintf(stderr, "malformed VERSION file: %s\n", argv[3]);
43
+ exit(1);
44
+ }
3845
fclose(v);
3946
for(z=b; z[0] && z[0]!='\r' && z[0]!='\n'; z++){}
4047
*z = 0;
4148
printf("#define RELEASE_VERSION \"%s\"\n", b);
4249
x=0;
4350
--- src/mkversion.c
+++ src/mkversion.c
@@ -7,10 +7,11 @@
7 **
8 ** Note that the manifest.uuid and manifest files are generated by Fossil.
9 */
10 #include <stdio.h>
11 #include <string.h>
 
12
13 int main(int argc, char *argv[]){
14 FILE *m,*u,*v;
15 char *z;
16 int i, x, d;
@@ -17,11 +18,14 @@
17 char b[1000];
18 char vx[1000];
19 memset(b,0,sizeof(b));
20 memset(vx,0,sizeof(vx));
21 u = fopen(argv[1],"r");
22 fgets(b, sizeof(b)-1,u);
 
 
 
23 fclose(u);
24 for(z=b; z[0] && z[0]!='\r' && z[0]!='\n'; z++){}
25 *z = 0;
26 printf("#define MANIFEST_UUID \"%s\"\n",b);
27 printf("#define MANIFEST_VERSION \"[%10.10s]\"\n",b);
@@ -32,11 +36,14 @@
32 printf("#define MANIFEST_YEAR \"%.4s\"\n",b+2);
33 }
34 }
35 fclose(m);
36 v = fopen(argv[3],"r");
37 fgets(b, sizeof(b)-1,v);
 
 
 
38 fclose(v);
39 for(z=b; z[0] && z[0]!='\r' && z[0]!='\n'; z++){}
40 *z = 0;
41 printf("#define RELEASE_VERSION \"%s\"\n", b);
42 x=0;
43
--- src/mkversion.c
+++ src/mkversion.c
@@ -7,10 +7,11 @@
7 **
8 ** Note that the manifest.uuid and manifest files are generated by Fossil.
9 */
10 #include <stdio.h>
11 #include <string.h>
12 #include <stdlib.h>
13
14 int main(int argc, char *argv[]){
15 FILE *m,*u,*v;
16 char *z;
17 int i, x, d;
@@ -17,11 +18,14 @@
18 char b[1000];
19 char vx[1000];
20 memset(b,0,sizeof(b));
21 memset(vx,0,sizeof(vx));
22 u = fopen(argv[1],"r");
23 if( fgets(b, sizeof(b)-1,u)==0 ){
24 fprintf(stderr, "malformed manifest.uuid file: %s\n", argv[1]);
25 exit(1);
26 }
27 fclose(u);
28 for(z=b; z[0] && z[0]!='\r' && z[0]!='\n'; z++){}
29 *z = 0;
30 printf("#define MANIFEST_UUID \"%s\"\n",b);
31 printf("#define MANIFEST_VERSION \"[%10.10s]\"\n",b);
@@ -32,11 +36,14 @@
36 printf("#define MANIFEST_YEAR \"%.4s\"\n",b+2);
37 }
38 }
39 fclose(m);
40 v = fopen(argv[3],"r");
41 if( fgets(b, sizeof(b)-1,v)==0 ){
42 fprintf(stderr, "malformed VERSION file: %s\n", argv[3]);
43 exit(1);
44 }
45 fclose(v);
46 for(z=b; z[0] && z[0]!='\r' && z[0]!='\n'; z++){}
47 *z = 0;
48 printf("#define RELEASE_VERSION \"%s\"\n", b);
49 x=0;
50
+265 -35
--- src/name.c
+++ src/name.c
@@ -42,10 +42,44 @@
4242
if( z[7]!='-') return 0;
4343
if( !fossil_isdigit(z[8]) ) return 0;
4444
if( !fossil_isdigit(z[9]) ) return 0;
4545
return 1;
4646
}
47
+
48
+/*
49
+** Return the RID that is the "root" of the branch that contains
50
+** check-in "rid" if inBranch==0 or the first check-in in the branch
51
+** if inBranch==1.
52
+*/
53
+int start_of_branch(int rid, int inBranch){
54
+ Stmt q;
55
+ int rc;
56
+ char *zBr;
57
+ zBr = db_text("trunk","SELECT value FROM tagxref"
58
+ " WHERE rid=%d AND tagid=%d"
59
+ " AND tagtype>0",
60
+ rid, TAG_BRANCH);
61
+ db_prepare(&q,
62
+ "SELECT pid, EXISTS(SELECT 1 FROM tagxref"
63
+ " WHERE tagid=%d AND tagtype>0"
64
+ " AND value=%Q AND rid=plink.pid)"
65
+ " FROM plink"
66
+ " WHERE cid=:cid AND isprim",
67
+ TAG_BRANCH, zBr
68
+ );
69
+ fossil_free(zBr);
70
+ do{
71
+ db_reset(&q);
72
+ db_bind_int(&q, ":cid", rid);
73
+ rc = db_step(&q);
74
+ if( rc!=SQLITE_ROW ) break;
75
+ if( inBranch && db_column_int(&q,1)==0 ) break;
76
+ rid = db_column_int(&q, 0);
77
+ }while( db_column_int(&q, 1)==1 && rid>0 );
78
+ db_finalize(&q);
79
+ return rid;
80
+}
4781
4882
/*
4983
** Convert a symbolic name into a RID. Acceptable forms:
5084
**
5185
** * SHA1 hash
@@ -66,20 +100,28 @@
66100
** Return the RID of the matching artifact. Or return 0 if the name does not
67101
** match any known object. Or return -1 if the name is ambiguous.
68102
**
69103
** The zType parameter specifies the type of artifact: ci, t, w, e, g.
70104
** If zType is NULL or "" or "*" then any type of artifact will serve.
105
+** If zType is "br" then find the first check-in of the named branch
106
+** rather than the last.
71107
** zType is "ci" in most use cases since we are usually searching for
72108
** a check-in.
73109
*/
74110
int symbolic_name_to_rid(const char *zTag, const char *zType){
75111
int vid;
76112
int rid = 0;
77113
int nTag;
78114
int i;
115
+ int startOfBranch = 0;
79116
80
- if( zType==0 || zType[0]==0 ) zType = "*";
117
+ if( zType==0 || zType[0]==0 ){
118
+ zType = "*";
119
+ }else if( zType[0]=='b' ){
120
+ zType = "ci";
121
+ startOfBranch = 1;
122
+ }
81123
if( zTag==0 || zTag[0]==0 ) return 0;
82124
83125
/* special keyword: "tip" */
84126
if( fossil_strcmp(zTag, "tip")==0 && (zType[0]=='*' || zType[0]=='c') ){
85127
rid = db_int(0,
@@ -151,41 +193,18 @@
151193
" AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 "
152194
" AND event.objid=tagxref.rid "
153195
" AND event.type GLOB '%q'",
154196
&zTag[4], zType
155197
);
198
+ if( startOfBranch ) rid = start_of_branch(rid,1);
156199
return rid;
157200
}
158201
159202
/* root:TAG -> The origin of the branch */
160203
if( memcmp(zTag, "root:", 5)==0 ){
161
- Stmt q;
162
- int rc;
163
- char *zBr;
164204
rid = symbolic_name_to_rid(zTag+5, zType);
165
- zBr = db_text("trunk","SELECT value FROM tagxref"
166
- " WHERE rid=%d AND tagid=%d"
167
- " AND tagtype>0",
168
- rid, TAG_BRANCH);
169
- db_prepare(&q,
170
- "SELECT pid, EXISTS(SELECT 1 FROM tagxref"
171
- " WHERE tagid=%d AND tagtype>0"
172
- " AND value=%Q AND rid=plink.pid)"
173
- " FROM plink"
174
- " WHERE cid=:cid AND isprim",
175
- TAG_BRANCH, zBr
176
- );
177
- fossil_free(zBr);
178
- do{
179
- db_reset(&q);
180
- db_bind_int(&q, ":cid", rid);
181
- rc = db_step(&q);
182
- if( rc!=SQLITE_ROW ) break;
183
- rid = db_column_int(&q, 0);
184
- }while( db_column_int(&q, 1)==1 && rid>0 );
185
- db_finalize(&q);
186
- return rid;
205
+ return start_of_branch(rid, 0);
187206
}
188207
189208
/* symbolic-name ":" date-time */
190209
nTag = strlen(zTag);
191210
for(i=0; i<nTag-10 && zTag[i]!=':'; i++){}
@@ -245,11 +264,14 @@
245264
" AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 "
246265
" AND event.objid=tagxref.rid "
247266
" AND event.type GLOB '%q'",
248267
zTag, zType
249268
);
250
- if( rid>0 ) return rid;
269
+ if( rid>0 ){
270
+ if( startOfBranch ) rid = start_of_branch(rid,1);
271
+ return rid;
272
+ }
251273
252274
/* Undocumented: numeric tags get translated directly into the RID */
253275
if( memcmp(zTag, "rid:", 4)==0 ){
254276
zTag += 4;
255277
for(i=0; fossil_isdigit(zTag[i]); i++){}
@@ -391,18 +413,15 @@
391413
int rid;
392414
393415
if( zName==0 || zName[0]==0 ) return 0;
394416
rid = symbolic_name_to_rid(zName, zType);
395417
if( rid<0 ){
396
- fossil_error(1, "ambiguous name: %s", zName);
397
- return 0;
418
+ fossil_fatal("ambiguous name: %s", zName);
398419
}else if( rid==0 ){
399
- fossil_error(1, "not found: %s", zName);
400
- return 0;
401
- }else{
402
- return rid;
420
+ fossil_fatal("not found: %s", zName);
403421
}
422
+ return rid;
404423
}
405424
int name_to_rid(const char *zName){
406425
return name_to_typed_rid(zName, "*");
407426
}
408427
@@ -505,11 +524,11 @@
505524
}
506525
507526
/*
508527
** Generate a description of artifact "rid"
509528
*/
510
-static void whatis_rid(int rid, int verboseFlag){
529
+void whatis_rid(int rid, int verboseFlag){
511530
Stmt q;
512531
int cnt;
513532
514533
/* Basic information about the object. */
515534
db_prepare(&q,
@@ -657,21 +676,23 @@
657676
void whatis_cmd(void){
658677
int rid;
659678
const char *zName;
660679
int verboseFlag;
661680
int i;
681
+ const char *zType = 0;
662682
db_find_and_open_repository(0,0);
663683
verboseFlag = find_option("verbose","v",0)!=0;
684
+ zType = find_option("type",0,1);
664685
665686
/* We should be done with options.. */
666687
verify_all_options();
667688
668689
if( g.argc<3 ) usage("whatis NAME ...");
669690
for(i=2; i<g.argc; i++){
670691
zName = g.argv[i];
671692
if( i>2 ) fossil_print("%.79c\n",'-');
672
- rid = symbolic_name_to_rid(zName, 0);
693
+ rid = symbolic_name_to_rid(zName, zType);
673694
if( rid<0 ){
674695
Stmt q;
675696
int cnt = 0;
676697
fossil_print("name: %s (ambiguous)\n", zName);
677698
db_prepare(&q,
@@ -757,5 +778,214 @@
757778
while( db_step(&q)==SQLITE_ROW ){
758779
fossil_print("%s\n", db_column_text(&q, 0));
759780
}
760781
db_finalize(&q);
761782
}
783
+
784
+/*
785
+** Schema for the description table
786
+*/
787
+static const char zDescTab[] =
788
+@ CREATE TEMP TABLE IF NOT EXISTS description(
789
+@ rid INTEGER PRIMARY KEY, -- RID of the object
790
+@ uuid TEXT, -- SHA1 hash of the object
791
+@ ctime DATETIME, -- Time of creation
792
+@ isPrivate BOOLEAN DEFAULT 0, -- True for unpublished artifacts
793
+@ type TEXT, -- file, checkin, wiki, ticket, etc.
794
+@ summary TEXT, -- Summary comment for the object
795
+@ detail TEXT -- filename, checkin comment, etc
796
+@ );
797
+;
798
+
799
+/*
800
+** Create the description table if it does not already exists.
801
+** Populate fields of this table with descriptions for all artifacts
802
+** whose RID matches the SQL expression in zWhere.
803
+*/
804
+void describe_artifacts(const char *zWhere){
805
+ db_multi_exec("%s", zDescTab/*safe-for-%s*/);
806
+
807
+ /* Describe checkins */
808
+ db_multi_exec(
809
+ "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,summary)\n"
810
+ "SELECT blob.rid, blob.uuid, event.mtime, 'checkin',\n"
811
+ " 'checkin on ' || strftime('%%Y-%%m-%%d %%H:%%M',event.mtime)\n"
812
+ " FROM event, blob\n"
813
+ " WHERE event.objid %s AND event.type='ci'\n"
814
+ " AND event.objid=blob.rid;",
815
+ zWhere /*safe-for-%s*/
816
+ );
817
+
818
+ /* Describe files */
819
+ db_multi_exec(
820
+ "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,summary)\n"
821
+ "SELECT blob.rid, blob.uuid, event.mtime, 'file', 'file '||filename.name\n"
822
+ " FROM mlink, blob, event, filename\n"
823
+ " WHERE mlink.fid %s\n"
824
+ " AND mlink.mid=event.objid\n"
825
+ " AND filename.fnid=mlink.fnid\n"
826
+ " AND mlink.fid=blob.rid;",
827
+ zWhere /*safe-for-%s*/
828
+ );
829
+
830
+ /* Describe tags */
831
+ db_multi_exec(
832
+ "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,summary)\n"
833
+ "SELECT blob.rid, blob.uuid, tagxref.mtime, 'tag',\n"
834
+ " 'tag '||substr((SELECT uuid FROM blob WHERE rid=tagxref.rid),1,16)\n"
835
+ " FROM tagxref, blob\n"
836
+ " WHERE tagxref.srcid %s AND tagxref.srcid!=tagxref.rid\n"
837
+ " AND tagxref.srcid=blob.rid;",
838
+ zWhere /*safe-for-%s*/
839
+ );
840
+
841
+ /* Cluster artifacts */
842
+ db_multi_exec(
843
+ "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,summary)\n"
844
+ "SELECT blob.rid, blob.uuid, tagxref.mtime, 'cluster', 'cluster'\n"
845
+ " FROM tagxref, blob\n"
846
+ " WHERE tagxref.rid %s\n"
847
+ " AND tagxref.tagid=(SELECT tagid FROM tag WHERE tagname='cluster')\n"
848
+ " AND blob.rid=tagxref.rid;",
849
+ zWhere /*safe-for-%s*/
850
+ );
851
+
852
+ /* Ticket change artifacts */
853
+ db_multi_exec(
854
+ "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,summary)\n"
855
+ "SELECT blob.rid, blob.uuid, tagxref.mtime, 'ticket',\n"
856
+ " 'ticket '||substr(tag.tagname,5,21)\n"
857
+ " FROM tagxref, tag, blob\n"
858
+ " WHERE tagxref.rid %s\n"
859
+ " AND tag.tagid=tagxref.tagid\n"
860
+ " AND tag.tagname GLOB 'tkt-*'"
861
+ " AND blob.rid=tagxref.rid;",
862
+ zWhere /*safe-for-%s*/
863
+ );
864
+
865
+ /* Wiki edit artifacts */
866
+ db_multi_exec(
867
+ "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,summary)\n"
868
+ "SELECT blob.rid, blob.uuid, tagxref.mtime, 'wiki',\n"
869
+ " printf('wiki \"%%s\"',substr(tag.tagname,6))\n"
870
+ " FROM tagxref, tag, blob\n"
871
+ " WHERE tagxref.rid %s\n"
872
+ " AND tag.tagid=tagxref.tagid\n"
873
+ " AND tag.tagname GLOB 'wiki-*'"
874
+ " AND blob.rid=tagxref.rid;",
875
+ zWhere /*safe-for-%s*/
876
+ );
877
+
878
+ /* Event edit artifacts */
879
+ db_multi_exec(
880
+ "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,summary)\n"
881
+ "SELECT blob.rid, blob.uuid, tagxref.mtime, 'event',\n"
882
+ " 'event '||substr(tag.tagname,7)\n"
883
+ " FROM tagxref, tag, blob\n"
884
+ " WHERE tagxref.rid %s\n"
885
+ " AND tag.tagid=tagxref.tagid\n"
886
+ " AND tag.tagname GLOB 'event-*'"
887
+ " AND blob.rid=tagxref.rid;",
888
+ zWhere /*safe-for-%s*/
889
+ );
890
+
891
+ /* Attachments */
892
+ db_multi_exec(
893
+ "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,detail)\n"
894
+ "SELECT blob.rid, blob.uuid, attachment.mtime, 'attachment',\n"
895
+ " 'attachment '||attachment.filename\n"
896
+ " FROM attachment, blob\n"
897
+ " WHERE attachment.src %s\n"
898
+ " AND blob.rid=attachment.src;",
899
+ zWhere /*safe-for-%s*/
900
+ );
901
+
902
+ /* Everything else */
903
+ db_multi_exec(
904
+ "INSERT OR IGNORE INTO description(rid,uuid,type,summary)\n"
905
+ "SELECT blob.rid, blob.uuid,"
906
+ " CASE WHEN blob.size<0 THEN 'phantom' ELSE '' END,\n"
907
+ " 'unknown'\n"
908
+ " FROM blob WHERE blob.rid %s;",
909
+ zWhere /*safe-for-%s*/
910
+ );
911
+
912
+ /* Mark private elements */
913
+ db_multi_exec(
914
+ "UPDATE description SET isPrivate=1 WHERE rid IN private"
915
+ );
916
+}
917
+
918
+/*
919
+** Print the content of the description table on stdout
920
+*/
921
+int describe_artifacts_to_stdout(const char *zWhere, const char *zLabel){
922
+ Stmt q;
923
+ int cnt = 0;
924
+ describe_artifacts(zWhere);
925
+ db_prepare(&q,
926
+ "SELECT uuid, summary, isPrivate\n"
927
+ " FROM description\n"
928
+ " ORDER BY ctime, type;"
929
+ );
930
+ while( db_step(&q)==SQLITE_ROW ){
931
+ if( zLabel ){
932
+ fossil_print("%s\n", zLabel);
933
+ zLabel = 0;
934
+ }
935
+ fossil_print(" %.16s %s", db_column_text(&q,0), db_column_text(&q,1));
936
+ if( db_column_int(&q,2) ) fossil_print(" (unpublished)");
937
+ fossil_print("\n");
938
+ cnt++;
939
+ }
940
+ db_finalize(&q);
941
+ db_multi_exec("DELETE FROM description;");
942
+ return cnt;
943
+}
944
+
945
+/*
946
+** COMMAND: test-describe-artifacts
947
+**
948
+** Usage: %fossil test-describe-artifacts
949
+**
950
+** Display a one-line description of every artifact.
951
+*/
952
+void test_describe_artifacts_cmd(void){
953
+ db_find_and_open_repository(0,0);
954
+ describe_artifacts_to_stdout("IN (SELECT rid FROM blob)", 0);
955
+}
956
+
957
+/*
958
+** COMMAND: test-unsent
959
+**
960
+** Usage: %fossil test-unsent
961
+**
962
+** Show all artifacts in the unsent table
963
+*/
964
+void test_unsent_cmd(void){
965
+ db_find_and_open_repository(0,0);
966
+ describe_artifacts_to_stdout("IN unsent", 0);
967
+}
968
+
969
+/*
970
+** COMMAND: test-unclustered
971
+**
972
+** Usage: %fossil test-unclustered
973
+**
974
+** Show all artifacts in the unclustered table
975
+*/
976
+void test_unclusterd_cmd(void){
977
+ db_find_and_open_repository(0,0);
978
+ describe_artifacts_to_stdout("IN unclustered", 0);
979
+}
980
+
981
+/*
982
+** COMMAND: test-phantoms
983
+**
984
+** Usage: %fossil test-phantoms
985
+**
986
+** Show all phantom artifacts
987
+*/
988
+void test_phatoms_cmd(void){
989
+ db_find_and_open_repository(0,0);
990
+ describe_artifacts_to_stdout("IN (SELECT rid FROM blob WHERE size<0)", 0);
991
+}
762992
763993
ADDED src/publish.c
764994
ADDED src/purge.c
--- src/name.c
+++ src/name.c
@@ -42,10 +42,44 @@
42 if( z[7]!='-') return 0;
43 if( !fossil_isdigit(z[8]) ) return 0;
44 if( !fossil_isdigit(z[9]) ) return 0;
45 return 1;
46 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
48 /*
49 ** Convert a symbolic name into a RID. Acceptable forms:
50 **
51 ** * SHA1 hash
@@ -66,20 +100,28 @@
66 ** Return the RID of the matching artifact. Or return 0 if the name does not
67 ** match any known object. Or return -1 if the name is ambiguous.
68 **
69 ** The zType parameter specifies the type of artifact: ci, t, w, e, g.
70 ** If zType is NULL or "" or "*" then any type of artifact will serve.
 
 
71 ** zType is "ci" in most use cases since we are usually searching for
72 ** a check-in.
73 */
74 int symbolic_name_to_rid(const char *zTag, const char *zType){
75 int vid;
76 int rid = 0;
77 int nTag;
78 int i;
 
79
80 if( zType==0 || zType[0]==0 ) zType = "*";
 
 
 
 
 
81 if( zTag==0 || zTag[0]==0 ) return 0;
82
83 /* special keyword: "tip" */
84 if( fossil_strcmp(zTag, "tip")==0 && (zType[0]=='*' || zType[0]=='c') ){
85 rid = db_int(0,
@@ -151,41 +193,18 @@
151 " AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 "
152 " AND event.objid=tagxref.rid "
153 " AND event.type GLOB '%q'",
154 &zTag[4], zType
155 );
 
156 return rid;
157 }
158
159 /* root:TAG -> The origin of the branch */
160 if( memcmp(zTag, "root:", 5)==0 ){
161 Stmt q;
162 int rc;
163 char *zBr;
164 rid = symbolic_name_to_rid(zTag+5, zType);
165 zBr = db_text("trunk","SELECT value FROM tagxref"
166 " WHERE rid=%d AND tagid=%d"
167 " AND tagtype>0",
168 rid, TAG_BRANCH);
169 db_prepare(&q,
170 "SELECT pid, EXISTS(SELECT 1 FROM tagxref"
171 " WHERE tagid=%d AND tagtype>0"
172 " AND value=%Q AND rid=plink.pid)"
173 " FROM plink"
174 " WHERE cid=:cid AND isprim",
175 TAG_BRANCH, zBr
176 );
177 fossil_free(zBr);
178 do{
179 db_reset(&q);
180 db_bind_int(&q, ":cid", rid);
181 rc = db_step(&q);
182 if( rc!=SQLITE_ROW ) break;
183 rid = db_column_int(&q, 0);
184 }while( db_column_int(&q, 1)==1 && rid>0 );
185 db_finalize(&q);
186 return rid;
187 }
188
189 /* symbolic-name ":" date-time */
190 nTag = strlen(zTag);
191 for(i=0; i<nTag-10 && zTag[i]!=':'; i++){}
@@ -245,11 +264,14 @@
245 " AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 "
246 " AND event.objid=tagxref.rid "
247 " AND event.type GLOB '%q'",
248 zTag, zType
249 );
250 if( rid>0 ) return rid;
 
 
 
251
252 /* Undocumented: numeric tags get translated directly into the RID */
253 if( memcmp(zTag, "rid:", 4)==0 ){
254 zTag += 4;
255 for(i=0; fossil_isdigit(zTag[i]); i++){}
@@ -391,18 +413,15 @@
391 int rid;
392
393 if( zName==0 || zName[0]==0 ) return 0;
394 rid = symbolic_name_to_rid(zName, zType);
395 if( rid<0 ){
396 fossil_error(1, "ambiguous name: %s", zName);
397 return 0;
398 }else if( rid==0 ){
399 fossil_error(1, "not found: %s", zName);
400 return 0;
401 }else{
402 return rid;
403 }
 
404 }
405 int name_to_rid(const char *zName){
406 return name_to_typed_rid(zName, "*");
407 }
408
@@ -505,11 +524,11 @@
505 }
506
507 /*
508 ** Generate a description of artifact "rid"
509 */
510 static void whatis_rid(int rid, int verboseFlag){
511 Stmt q;
512 int cnt;
513
514 /* Basic information about the object. */
515 db_prepare(&q,
@@ -657,21 +676,23 @@
657 void whatis_cmd(void){
658 int rid;
659 const char *zName;
660 int verboseFlag;
661 int i;
 
662 db_find_and_open_repository(0,0);
663 verboseFlag = find_option("verbose","v",0)!=0;
 
664
665 /* We should be done with options.. */
666 verify_all_options();
667
668 if( g.argc<3 ) usage("whatis NAME ...");
669 for(i=2; i<g.argc; i++){
670 zName = g.argv[i];
671 if( i>2 ) fossil_print("%.79c\n",'-');
672 rid = symbolic_name_to_rid(zName, 0);
673 if( rid<0 ){
674 Stmt q;
675 int cnt = 0;
676 fossil_print("name: %s (ambiguous)\n", zName);
677 db_prepare(&q,
@@ -757,5 +778,214 @@
757 while( db_step(&q)==SQLITE_ROW ){
758 fossil_print("%s\n", db_column_text(&q, 0));
759 }
760 db_finalize(&q);
761 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
762
763 DDED src/publish.c
764 DDED src/purge.c
--- src/name.c
+++ src/name.c
@@ -42,10 +42,44 @@
42 if( z[7]!='-') return 0;
43 if( !fossil_isdigit(z[8]) ) return 0;
44 if( !fossil_isdigit(z[9]) ) return 0;
45 return 1;
46 }
47
48 /*
49 ** Return the RID that is the "root" of the branch that contains
50 ** check-in "rid" if inBranch==0 or the first check-in in the branch
51 ** if inBranch==1.
52 */
53 int start_of_branch(int rid, int inBranch){
54 Stmt q;
55 int rc;
56 char *zBr;
57 zBr = db_text("trunk","SELECT value FROM tagxref"
58 " WHERE rid=%d AND tagid=%d"
59 " AND tagtype>0",
60 rid, TAG_BRANCH);
61 db_prepare(&q,
62 "SELECT pid, EXISTS(SELECT 1 FROM tagxref"
63 " WHERE tagid=%d AND tagtype>0"
64 " AND value=%Q AND rid=plink.pid)"
65 " FROM plink"
66 " WHERE cid=:cid AND isprim",
67 TAG_BRANCH, zBr
68 );
69 fossil_free(zBr);
70 do{
71 db_reset(&q);
72 db_bind_int(&q, ":cid", rid);
73 rc = db_step(&q);
74 if( rc!=SQLITE_ROW ) break;
75 if( inBranch && db_column_int(&q,1)==0 ) break;
76 rid = db_column_int(&q, 0);
77 }while( db_column_int(&q, 1)==1 && rid>0 );
78 db_finalize(&q);
79 return rid;
80 }
81
82 /*
83 ** Convert a symbolic name into a RID. Acceptable forms:
84 **
85 ** * SHA1 hash
@@ -66,20 +100,28 @@
100 ** Return the RID of the matching artifact. Or return 0 if the name does not
101 ** match any known object. Or return -1 if the name is ambiguous.
102 **
103 ** The zType parameter specifies the type of artifact: ci, t, w, e, g.
104 ** If zType is NULL or "" or "*" then any type of artifact will serve.
105 ** If zType is "br" then find the first check-in of the named branch
106 ** rather than the last.
107 ** zType is "ci" in most use cases since we are usually searching for
108 ** a check-in.
109 */
110 int symbolic_name_to_rid(const char *zTag, const char *zType){
111 int vid;
112 int rid = 0;
113 int nTag;
114 int i;
115 int startOfBranch = 0;
116
117 if( zType==0 || zType[0]==0 ){
118 zType = "*";
119 }else if( zType[0]=='b' ){
120 zType = "ci";
121 startOfBranch = 1;
122 }
123 if( zTag==0 || zTag[0]==0 ) return 0;
124
125 /* special keyword: "tip" */
126 if( fossil_strcmp(zTag, "tip")==0 && (zType[0]=='*' || zType[0]=='c') ){
127 rid = db_int(0,
@@ -151,41 +193,18 @@
193 " AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 "
194 " AND event.objid=tagxref.rid "
195 " AND event.type GLOB '%q'",
196 &zTag[4], zType
197 );
198 if( startOfBranch ) rid = start_of_branch(rid,1);
199 return rid;
200 }
201
202 /* root:TAG -> The origin of the branch */
203 if( memcmp(zTag, "root:", 5)==0 ){
 
 
 
204 rid = symbolic_name_to_rid(zTag+5, zType);
205 return start_of_branch(rid, 0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
206 }
207
208 /* symbolic-name ":" date-time */
209 nTag = strlen(zTag);
210 for(i=0; i<nTag-10 && zTag[i]!=':'; i++){}
@@ -245,11 +264,14 @@
264 " AND tagxref.tagid=tag.tagid AND tagxref.tagtype>0 "
265 " AND event.objid=tagxref.rid "
266 " AND event.type GLOB '%q'",
267 zTag, zType
268 );
269 if( rid>0 ){
270 if( startOfBranch ) rid = start_of_branch(rid,1);
271 return rid;
272 }
273
274 /* Undocumented: numeric tags get translated directly into the RID */
275 if( memcmp(zTag, "rid:", 4)==0 ){
276 zTag += 4;
277 for(i=0; fossil_isdigit(zTag[i]); i++){}
@@ -391,18 +413,15 @@
413 int rid;
414
415 if( zName==0 || zName[0]==0 ) return 0;
416 rid = symbolic_name_to_rid(zName, zType);
417 if( rid<0 ){
418 fossil_fatal("ambiguous name: %s", zName);
 
419 }else if( rid==0 ){
420 fossil_fatal("not found: %s", zName);
 
 
 
421 }
422 return rid;
423 }
424 int name_to_rid(const char *zName){
425 return name_to_typed_rid(zName, "*");
426 }
427
@@ -505,11 +524,11 @@
524 }
525
526 /*
527 ** Generate a description of artifact "rid"
528 */
529 void whatis_rid(int rid, int verboseFlag){
530 Stmt q;
531 int cnt;
532
533 /* Basic information about the object. */
534 db_prepare(&q,
@@ -657,21 +676,23 @@
676 void whatis_cmd(void){
677 int rid;
678 const char *zName;
679 int verboseFlag;
680 int i;
681 const char *zType = 0;
682 db_find_and_open_repository(0,0);
683 verboseFlag = find_option("verbose","v",0)!=0;
684 zType = find_option("type",0,1);
685
686 /* We should be done with options.. */
687 verify_all_options();
688
689 if( g.argc<3 ) usage("whatis NAME ...");
690 for(i=2; i<g.argc; i++){
691 zName = g.argv[i];
692 if( i>2 ) fossil_print("%.79c\n",'-');
693 rid = symbolic_name_to_rid(zName, zType);
694 if( rid<0 ){
695 Stmt q;
696 int cnt = 0;
697 fossil_print("name: %s (ambiguous)\n", zName);
698 db_prepare(&q,
@@ -757,5 +778,214 @@
778 while( db_step(&q)==SQLITE_ROW ){
779 fossil_print("%s\n", db_column_text(&q, 0));
780 }
781 db_finalize(&q);
782 }
783
784 /*
785 ** Schema for the description table
786 */
787 static const char zDescTab[] =
788 @ CREATE TEMP TABLE IF NOT EXISTS description(
789 @ rid INTEGER PRIMARY KEY, -- RID of the object
790 @ uuid TEXT, -- SHA1 hash of the object
791 @ ctime DATETIME, -- Time of creation
792 @ isPrivate BOOLEAN DEFAULT 0, -- True for unpublished artifacts
793 @ type TEXT, -- file, checkin, wiki, ticket, etc.
794 @ summary TEXT, -- Summary comment for the object
795 @ detail TEXT -- filename, checkin comment, etc
796 @ );
797 ;
798
799 /*
800 ** Create the description table if it does not already exists.
801 ** Populate fields of this table with descriptions for all artifacts
802 ** whose RID matches the SQL expression in zWhere.
803 */
804 void describe_artifacts(const char *zWhere){
805 db_multi_exec("%s", zDescTab/*safe-for-%s*/);
806
807 /* Describe checkins */
808 db_multi_exec(
809 "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,summary)\n"
810 "SELECT blob.rid, blob.uuid, event.mtime, 'checkin',\n"
811 " 'checkin on ' || strftime('%%Y-%%m-%%d %%H:%%M',event.mtime)\n"
812 " FROM event, blob\n"
813 " WHERE event.objid %s AND event.type='ci'\n"
814 " AND event.objid=blob.rid;",
815 zWhere /*safe-for-%s*/
816 );
817
818 /* Describe files */
819 db_multi_exec(
820 "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,summary)\n"
821 "SELECT blob.rid, blob.uuid, event.mtime, 'file', 'file '||filename.name\n"
822 " FROM mlink, blob, event, filename\n"
823 " WHERE mlink.fid %s\n"
824 " AND mlink.mid=event.objid\n"
825 " AND filename.fnid=mlink.fnid\n"
826 " AND mlink.fid=blob.rid;",
827 zWhere /*safe-for-%s*/
828 );
829
830 /* Describe tags */
831 db_multi_exec(
832 "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,summary)\n"
833 "SELECT blob.rid, blob.uuid, tagxref.mtime, 'tag',\n"
834 " 'tag '||substr((SELECT uuid FROM blob WHERE rid=tagxref.rid),1,16)\n"
835 " FROM tagxref, blob\n"
836 " WHERE tagxref.srcid %s AND tagxref.srcid!=tagxref.rid\n"
837 " AND tagxref.srcid=blob.rid;",
838 zWhere /*safe-for-%s*/
839 );
840
841 /* Cluster artifacts */
842 db_multi_exec(
843 "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,summary)\n"
844 "SELECT blob.rid, blob.uuid, tagxref.mtime, 'cluster', 'cluster'\n"
845 " FROM tagxref, blob\n"
846 " WHERE tagxref.rid %s\n"
847 " AND tagxref.tagid=(SELECT tagid FROM tag WHERE tagname='cluster')\n"
848 " AND blob.rid=tagxref.rid;",
849 zWhere /*safe-for-%s*/
850 );
851
852 /* Ticket change artifacts */
853 db_multi_exec(
854 "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,summary)\n"
855 "SELECT blob.rid, blob.uuid, tagxref.mtime, 'ticket',\n"
856 " 'ticket '||substr(tag.tagname,5,21)\n"
857 " FROM tagxref, tag, blob\n"
858 " WHERE tagxref.rid %s\n"
859 " AND tag.tagid=tagxref.tagid\n"
860 " AND tag.tagname GLOB 'tkt-*'"
861 " AND blob.rid=tagxref.rid;",
862 zWhere /*safe-for-%s*/
863 );
864
865 /* Wiki edit artifacts */
866 db_multi_exec(
867 "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,summary)\n"
868 "SELECT blob.rid, blob.uuid, tagxref.mtime, 'wiki',\n"
869 " printf('wiki \"%%s\"',substr(tag.tagname,6))\n"
870 " FROM tagxref, tag, blob\n"
871 " WHERE tagxref.rid %s\n"
872 " AND tag.tagid=tagxref.tagid\n"
873 " AND tag.tagname GLOB 'wiki-*'"
874 " AND blob.rid=tagxref.rid;",
875 zWhere /*safe-for-%s*/
876 );
877
878 /* Event edit artifacts */
879 db_multi_exec(
880 "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,summary)\n"
881 "SELECT blob.rid, blob.uuid, tagxref.mtime, 'event',\n"
882 " 'event '||substr(tag.tagname,7)\n"
883 " FROM tagxref, tag, blob\n"
884 " WHERE tagxref.rid %s\n"
885 " AND tag.tagid=tagxref.tagid\n"
886 " AND tag.tagname GLOB 'event-*'"
887 " AND blob.rid=tagxref.rid;",
888 zWhere /*safe-for-%s*/
889 );
890
891 /* Attachments */
892 db_multi_exec(
893 "INSERT OR IGNORE INTO description(rid,uuid,ctime,type,detail)\n"
894 "SELECT blob.rid, blob.uuid, attachment.mtime, 'attachment',\n"
895 " 'attachment '||attachment.filename\n"
896 " FROM attachment, blob\n"
897 " WHERE attachment.src %s\n"
898 " AND blob.rid=attachment.src;",
899 zWhere /*safe-for-%s*/
900 );
901
902 /* Everything else */
903 db_multi_exec(
904 "INSERT OR IGNORE INTO description(rid,uuid,type,summary)\n"
905 "SELECT blob.rid, blob.uuid,"
906 " CASE WHEN blob.size<0 THEN 'phantom' ELSE '' END,\n"
907 " 'unknown'\n"
908 " FROM blob WHERE blob.rid %s;",
909 zWhere /*safe-for-%s*/
910 );
911
912 /* Mark private elements */
913 db_multi_exec(
914 "UPDATE description SET isPrivate=1 WHERE rid IN private"
915 );
916 }
917
918 /*
919 ** Print the content of the description table on stdout
920 */
921 int describe_artifacts_to_stdout(const char *zWhere, const char *zLabel){
922 Stmt q;
923 int cnt = 0;
924 describe_artifacts(zWhere);
925 db_prepare(&q,
926 "SELECT uuid, summary, isPrivate\n"
927 " FROM description\n"
928 " ORDER BY ctime, type;"
929 );
930 while( db_step(&q)==SQLITE_ROW ){
931 if( zLabel ){
932 fossil_print("%s\n", zLabel);
933 zLabel = 0;
934 }
935 fossil_print(" %.16s %s", db_column_text(&q,0), db_column_text(&q,1));
936 if( db_column_int(&q,2) ) fossil_print(" (unpublished)");
937 fossil_print("\n");
938 cnt++;
939 }
940 db_finalize(&q);
941 db_multi_exec("DELETE FROM description;");
942 return cnt;
943 }
944
945 /*
946 ** COMMAND: test-describe-artifacts
947 **
948 ** Usage: %fossil test-describe-artifacts
949 **
950 ** Display a one-line description of every artifact.
951 */
952 void test_describe_artifacts_cmd(void){
953 db_find_and_open_repository(0,0);
954 describe_artifacts_to_stdout("IN (SELECT rid FROM blob)", 0);
955 }
956
957 /*
958 ** COMMAND: test-unsent
959 **
960 ** Usage: %fossil test-unsent
961 **
962 ** Show all artifacts in the unsent table
963 */
964 void test_unsent_cmd(void){
965 db_find_and_open_repository(0,0);
966 describe_artifacts_to_stdout("IN unsent", 0);
967 }
968
969 /*
970 ** COMMAND: test-unclustered
971 **
972 ** Usage: %fossil test-unclustered
973 **
974 ** Show all artifacts in the unclustered table
975 */
976 void test_unclusterd_cmd(void){
977 db_find_and_open_repository(0,0);
978 describe_artifacts_to_stdout("IN unclustered", 0);
979 }
980
981 /*
982 ** COMMAND: test-phantoms
983 **
984 ** Usage: %fossil test-phantoms
985 **
986 ** Show all phantom artifacts
987 */
988 void test_phatoms_cmd(void){
989 db_find_and_open_repository(0,0);
990 describe_artifacts_to_stdout("IN (SELECT rid FROM blob WHERE size<0)", 0);
991 }
992
993 DDED src/publish.c
994 DDED src/purge.c
--- a/src/publish.c
+++ b/src/publish.c
@@ -0,0 +1,2 @@
1
+/*
2
+** Copyright (c) 2014 D. Richardat
--- a/src/publish.c
+++ b/src/publish.c
@@ -0,0 +1,2 @@
 
 
--- a/src/publish.c
+++ b/src/publish.c
@@ -0,0 +1,2 @@
1 /*
2 ** Copyright (c) 2014 D. Richardat
--- a/src/purge.c
+++ b/src/purge.c
@@ -0,0 +1 @@
1
+db_n%s.sqlite_master WHERE name='plink'" AND sql GLOB '* baseiddb_int(-1,"PRAGMA t
--- a/src/purge.c
+++ b/src/purge.c
@@ -0,0 +1 @@
 
--- a/src/purge.c
+++ b/src/purge.c
@@ -0,0 +1 @@
1 db_n%s.sqlite_master WHERE name='plink'" AND sql GLOB '* baseiddb_int(-1,"PRAGMA t
+10 -5
--- src/rebuild.c
+++ src/rebuild.c
@@ -348,11 +348,12 @@
348348
zTable = db_text(0,
349349
"SELECT name FROM sqlite_master /*scan*/"
350350
" WHERE type='table'"
351351
" AND name NOT IN ('admin_log', 'blob','delta','rcvfrom','user',"
352352
"'config','shun','private','reportfmt',"
353
- "'concealed','accesslog','modreq')"
353
+ "'concealed','accesslog','modreq',"
354
+ "'purgeevent','purgeitem')"
354355
" AND name NOT GLOB 'sqlite_*'"
355356
" AND name NOT GLOB 'fx_*'"
356357
);
357358
if( zTable==0 ) break;
358359
db_multi_exec("DROP TABLE %Q", zTable);
@@ -829,14 +830,18 @@
829830
"DELETE FROM config WHERE name GLOB 'skin:*';"
830831
"DELETE FROM config WHERE name GLOB 'subrepo:*';"
831832
);
832833
if( bVerily ){
833834
db_multi_exec(
834
- "DELETE FROM concealed;"
835
- "UPDATE rcvfrom SET ipaddr='unknown';"
836
- "DROP TABLE IF EXISTS accesslog;"
837
- "UPDATE user SET photo=NULL, info='';"
835
+ "DELETE FROM concealed;\n"
836
+ "UPDATE rcvfrom SET ipaddr='unknown';\n"
837
+ "DROP TABLE IF EXISTS accesslog;\n"
838
+ "UPDATE user SET photo=NULL, info='';\n"
839
+ "DROP TABLE IF EXISTS purgeevent;\n"
840
+ "DROP TABLE IF EXISTS purgeitem;\n"
841
+ "DROP TABLE IF EXISTS admin_log;\n"
842
+ "DROP TABLE IF EXISTS vcache;\n"
838843
);
839844
}
840845
}
841846
if( !bNeedRebuild ){
842847
db_end_transaction(0);
843848
--- src/rebuild.c
+++ src/rebuild.c
@@ -348,11 +348,12 @@
348 zTable = db_text(0,
349 "SELECT name FROM sqlite_master /*scan*/"
350 " WHERE type='table'"
351 " AND name NOT IN ('admin_log', 'blob','delta','rcvfrom','user',"
352 "'config','shun','private','reportfmt',"
353 "'concealed','accesslog','modreq')"
 
354 " AND name NOT GLOB 'sqlite_*'"
355 " AND name NOT GLOB 'fx_*'"
356 );
357 if( zTable==0 ) break;
358 db_multi_exec("DROP TABLE %Q", zTable);
@@ -829,14 +830,18 @@
829 "DELETE FROM config WHERE name GLOB 'skin:*';"
830 "DELETE FROM config WHERE name GLOB 'subrepo:*';"
831 );
832 if( bVerily ){
833 db_multi_exec(
834 "DELETE FROM concealed;"
835 "UPDATE rcvfrom SET ipaddr='unknown';"
836 "DROP TABLE IF EXISTS accesslog;"
837 "UPDATE user SET photo=NULL, info='';"
 
 
 
 
838 );
839 }
840 }
841 if( !bNeedRebuild ){
842 db_end_transaction(0);
843
--- src/rebuild.c
+++ src/rebuild.c
@@ -348,11 +348,12 @@
348 zTable = db_text(0,
349 "SELECT name FROM sqlite_master /*scan*/"
350 " WHERE type='table'"
351 " AND name NOT IN ('admin_log', 'blob','delta','rcvfrom','user',"
352 "'config','shun','private','reportfmt',"
353 "'concealed','accesslog','modreq',"
354 "'purgeevent','purgeitem')"
355 " AND name NOT GLOB 'sqlite_*'"
356 " AND name NOT GLOB 'fx_*'"
357 );
358 if( zTable==0 ) break;
359 db_multi_exec("DROP TABLE %Q", zTable);
@@ -829,14 +830,18 @@
830 "DELETE FROM config WHERE name GLOB 'skin:*';"
831 "DELETE FROM config WHERE name GLOB 'subrepo:*';"
832 );
833 if( bVerily ){
834 db_multi_exec(
835 "DELETE FROM concealed;\n"
836 "UPDATE rcvfrom SET ipaddr='unknown';\n"
837 "DROP TABLE IF EXISTS accesslog;\n"
838 "UPDATE user SET photo=NULL, info='';\n"
839 "DROP TABLE IF EXISTS purgeevent;\n"
840 "DROP TABLE IF EXISTS purgeitem;\n"
841 "DROP TABLE IF EXISTS admin_log;\n"
842 "DROP TABLE IF EXISTS vcache;\n"
843 );
844 }
845 }
846 if( !bNeedRebuild ){
847 db_end_transaction(0);
848
+2 -2
--- src/schema.c
+++ src/schema.c
@@ -81,12 +81,12 @@
8181
@ uuid TEXT UNIQUE NOT NULL, -- SHA1 hash of the content
8282
@ content BLOB, -- Compressed content of this record
8383
@ CHECK( length(uuid)==40 AND rid>0 )
8484
@ );
8585
@ CREATE TABLE delta(
86
-@ rid INTEGER PRIMARY KEY, -- Record ID
87
-@ srcid INTEGER NOT NULL REFERENCES blob -- Record holding source document
86
+@ rid INTEGER PRIMARY KEY, -- BLOB that is delta-compressed
87
+@ srcid INTEGER NOT NULL REFERENCES blob -- Baseline for delta-compression
8888
@ );
8989
@ CREATE INDEX delta_i1 ON delta(srcid);
9090
@
9191
@ -------------------------------------------------------------------------
9292
@ -- The BLOB and DELTA tables above hold the "global state" of a Fossil
9393
--- src/schema.c
+++ src/schema.c
@@ -81,12 +81,12 @@
81 @ uuid TEXT UNIQUE NOT NULL, -- SHA1 hash of the content
82 @ content BLOB, -- Compressed content of this record
83 @ CHECK( length(uuid)==40 AND rid>0 )
84 @ );
85 @ CREATE TABLE delta(
86 @ rid INTEGER PRIMARY KEY, -- Record ID
87 @ srcid INTEGER NOT NULL REFERENCES blob -- Record holding source document
88 @ );
89 @ CREATE INDEX delta_i1 ON delta(srcid);
90 @
91 @ -------------------------------------------------------------------------
92 @ -- The BLOB and DELTA tables above hold the "global state" of a Fossil
93
--- src/schema.c
+++ src/schema.c
@@ -81,12 +81,12 @@
81 @ uuid TEXT UNIQUE NOT NULL, -- SHA1 hash of the content
82 @ content BLOB, -- Compressed content of this record
83 @ CHECK( length(uuid)==40 AND rid>0 )
84 @ );
85 @ CREATE TABLE delta(
86 @ rid INTEGER PRIMARY KEY, -- BLOB that is delta-compressed
87 @ srcid INTEGER NOT NULL REFERENCES blob -- Baseline for delta-compression
88 @ );
89 @ CREATE INDEX delta_i1 ON delta(srcid);
90 @
91 @ -------------------------------------------------------------------------
92 @ -- The BLOB and DELTA tables above hold the "global state" of a Fossil
93
+3 -3
--- src/setup.c
+++ src/setup.c
@@ -105,15 +105,15 @@
105105
"Edit HTML text for an ad unit inserted after the menu bar");
106106
setup_menu_entry("Logo", "setup_logo",
107107
"Change the logo and background images for the server");
108108
setup_menu_entry("Shunned", "shun",
109109
"Show artifacts that are shunned by this repository");
110
- setup_menu_entry("Log", "rcvfromlist",
110
+ setup_menu_entry("Artifact Receipts Log", "rcvfromlist",
111111
"A record of received artifacts and their sources");
112
- setup_menu_entry("User-Log", "access_log",
112
+ setup_menu_entry("User Log", "access_log",
113113
"A record of login attempts");
114
- setup_menu_entry("Admin-Log", "admin_log",
114
+ setup_menu_entry("Administrative Log", "admin_log",
115115
"View the admin_log entries");
116116
setup_menu_entry("Stats", "stat",
117117
"Display repository statistics");
118118
setup_menu_entry("SQL", "admin_sql",
119119
"Enter raw SQL commands");
120120
--- src/setup.c
+++ src/setup.c
@@ -105,15 +105,15 @@
105 "Edit HTML text for an ad unit inserted after the menu bar");
106 setup_menu_entry("Logo", "setup_logo",
107 "Change the logo and background images for the server");
108 setup_menu_entry("Shunned", "shun",
109 "Show artifacts that are shunned by this repository");
110 setup_menu_entry("Log", "rcvfromlist",
111 "A record of received artifacts and their sources");
112 setup_menu_entry("User-Log", "access_log",
113 "A record of login attempts");
114 setup_menu_entry("Admin-Log", "admin_log",
115 "View the admin_log entries");
116 setup_menu_entry("Stats", "stat",
117 "Display repository statistics");
118 setup_menu_entry("SQL", "admin_sql",
119 "Enter raw SQL commands");
120
--- src/setup.c
+++ src/setup.c
@@ -105,15 +105,15 @@
105 "Edit HTML text for an ad unit inserted after the menu bar");
106 setup_menu_entry("Logo", "setup_logo",
107 "Change the logo and background images for the server");
108 setup_menu_entry("Shunned", "shun",
109 "Show artifacts that are shunned by this repository");
110 setup_menu_entry("Artifact Receipts Log", "rcvfromlist",
111 "A record of received artifacts and their sources");
112 setup_menu_entry("User Log", "access_log",
113 "A record of login attempts");
114 setup_menu_entry("Administrative Log", "admin_log",
115 "View the admin_log entries");
116 setup_menu_entry("Stats", "stat",
117 "Display repository statistics");
118 setup_menu_entry("SQL", "admin_sql",
119 "Enter raw SQL commands");
120
+41 -13
--- src/shun.c
+++ src/shun.c
@@ -295,37 +295,50 @@
295295
**
296296
** Show a listing of RCVFROM table entries.
297297
*/
298298
void rcvfromlist_page(void){
299299
int ofst = atoi(PD("ofst","0"));
300
+ int showAll = P("all")!=0;
300301
int cnt;
301302
Stmt q;
302303
303304
login_check_credentials();
304305
if( !g.perm.Admin ){
305306
login_needed();
306307
}
307
- style_header("Content Sources");
308
+ style_header("Artifact Receipts");
309
+ if( showAll ){
310
+ ofst = 0;
311
+ }else{
312
+ style_submenu_element("All", "All", "rcvfromlist?all=1");
313
+ }
308314
if( ofst>0 ){
309315
style_submenu_element("Newer", "Newer", "rcvfromlist?ofst=%d",
310316
ofst>30 ? ofst-30 : 0);
311317
}
318
+ db_multi_exec(
319
+ "CREATE TEMP TABLE rcvidUsed(x INTEGER PRIMARY KEY);"
320
+ "INSERT OR IGNORE INTO rcvidUsed(x) SELECT rcvid FROM blob;"
321
+ );
312322
db_prepare(&q,
313
- "SELECT rcvid, login, datetime(rcvfrom.mtime), rcvfrom.ipaddr"
323
+ "SELECT rcvid, login, datetime(rcvfrom.mtime), rcvfrom.ipaddr,"
324
+ " EXISTS(SELECT 1 FROM rcvidUsed WHERE x=rcvfrom.rcvid)"
314325
" FROM rcvfrom LEFT JOIN user USING(uid)"
315
- " ORDER BY rcvid DESC LIMIT 31 OFFSET %d",
316
- ofst
326
+ " ORDER BY rcvid DESC LIMIT %d OFFSET %d",
327
+ showAll ? -1 : 31, ofst
317328
);
318329
@ <p>Whenever new artifacts are added to the repository, either by
319330
@ push or using the web interface, an entry is made in the RCVFROM table
320331
@ to record the source of that artifact. This log facilitates
321332
@ finding and fixing attempts to inject illicit content into the
322333
@ repository.</p>
323334
@
324335
@ <p>Click on the "rcvid" to show a list of specific artifacts received
325336
@ by a transaction. After identifying illicit artifacts, remove them
326
- @ using the "Shun" feature.</p>
337
+ @ using the "Shun" button. If an "rcvid" is not hyperlinked, that means
338
+ @ all artifacts associated with that rcvid have already been shunned
339
+ @ or purged.</p>
327340
@
328341
@ <table cellpadding="0" cellspacing="0" border="0">
329342
@ <tr><th style="padding-right: 15px;text-align: right;">rcvid</th>
330343
@ <th style="padding-right: 15px;text-align: left;">Date</th>
331344
@ <th style="padding-right: 15px;text-align: left;">User</th>
@@ -334,17 +347,22 @@
334347
while( db_step(&q)==SQLITE_ROW ){
335348
int rcvid = db_column_int(&q, 0);
336349
const char *zUser = db_column_text(&q, 1);
337350
const char *zDate = db_column_text(&q, 2);
338351
const char *zIpAddr = db_column_text(&q, 3);
339
- if( cnt==30 ){
352
+ if( cnt==30 && !showAll ){
340353
style_submenu_element("Older", "Older",
341354
"rcvfromlist?ofst=%d", ofst+30);
342355
}else{
343356
cnt++;
344357
@ <tr>
345
- @ <td style="padding-right: 15px;text-align: right;"><a href="rcvfrom?rcvid=%d(rcvid)">%d(rcvid)</a></td>
358
+ if( db_column_int(&q,4) ){
359
+ @ <td style="padding-right: 15px;text-align: right;">
360
+ @ <a href="rcvfrom?rcvid=%d(rcvid)">%d(rcvid)</a></td>
361
+ }else{
362
+ @ <td style="padding-right: 15px;text-align: right;">%d(rcvid)</td>
363
+ }
346364
@ <td style="padding-right: 15px;text-align: left;">%s(zDate)</td>
347365
@ <td style="padding-right: 15px;text-align: left;">%h(zUser)</td>
348366
@ <td style="text-align: left;">%s(zIpAddr)</td>
349367
@ </tr>
350368
}
@@ -365,22 +383,24 @@
365383
366384
login_check_credentials();
367385
if( !g.perm.Admin ){
368386
login_needed();
369387
}
370
- style_header("Content Source %d", rcvid);
388
+ style_header("Artifact Receipt %d", rcvid);
371389
if( db_exists(
372390
"SELECT 1 FROM blob WHERE rcvid=%d AND"
373391
" NOT EXISTS (SELECT 1 FROM shun WHERE shun.uuid=blob.uuid)", rcvid)
374392
){
375
- style_submenu_element("Shun All", "Shun All", "shun?shun&rcvid=%d#addshun", rcvid);
393
+ style_submenu_element("Shun All", "Shun All",
394
+ "shun?shun&rcvid=%d#addshun", rcvid);
376395
}
377396
if( db_exists(
378397
"SELECT 1 FROM blob WHERE rcvid=%d AND"
379398
" EXISTS (SELECT 1 FROM shun WHERE shun.uuid=blob.uuid)", rcvid)
380399
){
381
- style_submenu_element("Unshun All", "Unshun All", "shun?accept&rcvid=%d#delshun", rcvid);
400
+ style_submenu_element("Unshun All", "Unshun All",
401
+ "shun?accept&rcvid=%d#delshun", rcvid);
382402
}
383403
db_prepare(&q,
384404
"SELECT login, datetime(rcvfrom.mtime), rcvfrom.ipaddr"
385405
" FROM rcvfrom LEFT JOIN user USING(uid)"
386406
" WHERE rcvid=%d",
@@ -399,22 +419,30 @@
399419
@ <td valign="top">%s(zDate)</td></tr>
400420
@ <tr><th valign="top" align="right">IP&nbsp;Address:</th>
401421
@ <td valign="top">%s(zIpAddr)</td></tr>
402422
}
403423
db_finalize(&q);
424
+ db_multi_exec(
425
+ "CREATE TEMP TABLE toshow(rid INTEGER PRIMARY KEY);"
426
+ "INSERT INTO toshow SELECT rid FROM blob WHERE rcvid=%d", rcvid
427
+ );
428
+ describe_artifacts("IN toshow");
404429
db_prepare(&q,
405
- "SELECT rid, uuid, size FROM blob WHERE rcvid=%d", rcvid
430
+ "SELECT blob.rid, blob.uuid, blob.size, description.summary\n"
431
+ " FROM blob LEFT JOIN description ON (blob.rid=description.rid)"
432
+ " WHERE blob.rcvid=%d", rcvid
406433
);
407434
@ <tr><th valign="top" align="right">Artifacts:</th>
408435
@ <td valign="top">
409436
while( db_step(&q)==SQLITE_ROW ){
410
- int rid = db_column_int(&q, 0);
411437
const char *zUuid = db_column_text(&q, 1);
412438
int size = db_column_int(&q, 2);
439
+ const char *zDesc = db_column_text(&q, 3);
440
+ if( zDesc==0 ) zDesc = "";
413441
@ <a href="%s(g.zTop)/info/%s(zUuid)">%s(zUuid)</a>
414
- @ (rid: %d(rid), size: %d(size))<br />
442
+ @ %h(zDesc) (size: %d(size))<br />
415443
}
416444
@ </td></tr>
417445
@ </table>
418446
db_finalize(&q);
419447
style_footer();
420448
}
421449
--- src/shun.c
+++ src/shun.c
@@ -295,37 +295,50 @@
295 **
296 ** Show a listing of RCVFROM table entries.
297 */
298 void rcvfromlist_page(void){
299 int ofst = atoi(PD("ofst","0"));
 
300 int cnt;
301 Stmt q;
302
303 login_check_credentials();
304 if( !g.perm.Admin ){
305 login_needed();
306 }
307 style_header("Content Sources");
 
 
 
 
 
308 if( ofst>0 ){
309 style_submenu_element("Newer", "Newer", "rcvfromlist?ofst=%d",
310 ofst>30 ? ofst-30 : 0);
311 }
 
 
 
 
312 db_prepare(&q,
313 "SELECT rcvid, login, datetime(rcvfrom.mtime), rcvfrom.ipaddr"
 
314 " FROM rcvfrom LEFT JOIN user USING(uid)"
315 " ORDER BY rcvid DESC LIMIT 31 OFFSET %d",
316 ofst
317 );
318 @ <p>Whenever new artifacts are added to the repository, either by
319 @ push or using the web interface, an entry is made in the RCVFROM table
320 @ to record the source of that artifact. This log facilitates
321 @ finding and fixing attempts to inject illicit content into the
322 @ repository.</p>
323 @
324 @ <p>Click on the "rcvid" to show a list of specific artifacts received
325 @ by a transaction. After identifying illicit artifacts, remove them
326 @ using the "Shun" feature.</p>
 
 
327 @
328 @ <table cellpadding="0" cellspacing="0" border="0">
329 @ <tr><th style="padding-right: 15px;text-align: right;">rcvid</th>
330 @ <th style="padding-right: 15px;text-align: left;">Date</th>
331 @ <th style="padding-right: 15px;text-align: left;">User</th>
@@ -334,17 +347,22 @@
334 while( db_step(&q)==SQLITE_ROW ){
335 int rcvid = db_column_int(&q, 0);
336 const char *zUser = db_column_text(&q, 1);
337 const char *zDate = db_column_text(&q, 2);
338 const char *zIpAddr = db_column_text(&q, 3);
339 if( cnt==30 ){
340 style_submenu_element("Older", "Older",
341 "rcvfromlist?ofst=%d", ofst+30);
342 }else{
343 cnt++;
344 @ <tr>
345 @ <td style="padding-right: 15px;text-align: right;"><a href="rcvfrom?rcvid=%d(rcvid)">%d(rcvid)</a></td>
 
 
 
 
 
346 @ <td style="padding-right: 15px;text-align: left;">%s(zDate)</td>
347 @ <td style="padding-right: 15px;text-align: left;">%h(zUser)</td>
348 @ <td style="text-align: left;">%s(zIpAddr)</td>
349 @ </tr>
350 }
@@ -365,22 +383,24 @@
365
366 login_check_credentials();
367 if( !g.perm.Admin ){
368 login_needed();
369 }
370 style_header("Content Source %d", rcvid);
371 if( db_exists(
372 "SELECT 1 FROM blob WHERE rcvid=%d AND"
373 " NOT EXISTS (SELECT 1 FROM shun WHERE shun.uuid=blob.uuid)", rcvid)
374 ){
375 style_submenu_element("Shun All", "Shun All", "shun?shun&rcvid=%d#addshun", rcvid);
 
376 }
377 if( db_exists(
378 "SELECT 1 FROM blob WHERE rcvid=%d AND"
379 " EXISTS (SELECT 1 FROM shun WHERE shun.uuid=blob.uuid)", rcvid)
380 ){
381 style_submenu_element("Unshun All", "Unshun All", "shun?accept&rcvid=%d#delshun", rcvid);
 
382 }
383 db_prepare(&q,
384 "SELECT login, datetime(rcvfrom.mtime), rcvfrom.ipaddr"
385 " FROM rcvfrom LEFT JOIN user USING(uid)"
386 " WHERE rcvid=%d",
@@ -399,22 +419,30 @@
399 @ <td valign="top">%s(zDate)</td></tr>
400 @ <tr><th valign="top" align="right">IP&nbsp;Address:</th>
401 @ <td valign="top">%s(zIpAddr)</td></tr>
402 }
403 db_finalize(&q);
 
 
 
 
 
404 db_prepare(&q,
405 "SELECT rid, uuid, size FROM blob WHERE rcvid=%d", rcvid
 
 
406 );
407 @ <tr><th valign="top" align="right">Artifacts:</th>
408 @ <td valign="top">
409 while( db_step(&q)==SQLITE_ROW ){
410 int rid = db_column_int(&q, 0);
411 const char *zUuid = db_column_text(&q, 1);
412 int size = db_column_int(&q, 2);
 
 
413 @ <a href="%s(g.zTop)/info/%s(zUuid)">%s(zUuid)</a>
414 @ (rid: %d(rid), size: %d(size))<br />
415 }
416 @ </td></tr>
417 @ </table>
418 db_finalize(&q);
419 style_footer();
420 }
421
--- src/shun.c
+++ src/shun.c
@@ -295,37 +295,50 @@
295 **
296 ** Show a listing of RCVFROM table entries.
297 */
298 void rcvfromlist_page(void){
299 int ofst = atoi(PD("ofst","0"));
300 int showAll = P("all")!=0;
301 int cnt;
302 Stmt q;
303
304 login_check_credentials();
305 if( !g.perm.Admin ){
306 login_needed();
307 }
308 style_header("Artifact Receipts");
309 if( showAll ){
310 ofst = 0;
311 }else{
312 style_submenu_element("All", "All", "rcvfromlist?all=1");
313 }
314 if( ofst>0 ){
315 style_submenu_element("Newer", "Newer", "rcvfromlist?ofst=%d",
316 ofst>30 ? ofst-30 : 0);
317 }
318 db_multi_exec(
319 "CREATE TEMP TABLE rcvidUsed(x INTEGER PRIMARY KEY);"
320 "INSERT OR IGNORE INTO rcvidUsed(x) SELECT rcvid FROM blob;"
321 );
322 db_prepare(&q,
323 "SELECT rcvid, login, datetime(rcvfrom.mtime), rcvfrom.ipaddr,"
324 " EXISTS(SELECT 1 FROM rcvidUsed WHERE x=rcvfrom.rcvid)"
325 " FROM rcvfrom LEFT JOIN user USING(uid)"
326 " ORDER BY rcvid DESC LIMIT %d OFFSET %d",
327 showAll ? -1 : 31, ofst
328 );
329 @ <p>Whenever new artifacts are added to the repository, either by
330 @ push or using the web interface, an entry is made in the RCVFROM table
331 @ to record the source of that artifact. This log facilitates
332 @ finding and fixing attempts to inject illicit content into the
333 @ repository.</p>
334 @
335 @ <p>Click on the "rcvid" to show a list of specific artifacts received
336 @ by a transaction. After identifying illicit artifacts, remove them
337 @ using the "Shun" button. If an "rcvid" is not hyperlinked, that means
338 @ all artifacts associated with that rcvid have already been shunned
339 @ or purged.</p>
340 @
341 @ <table cellpadding="0" cellspacing="0" border="0">
342 @ <tr><th style="padding-right: 15px;text-align: right;">rcvid</th>
343 @ <th style="padding-right: 15px;text-align: left;">Date</th>
344 @ <th style="padding-right: 15px;text-align: left;">User</th>
@@ -334,17 +347,22 @@
347 while( db_step(&q)==SQLITE_ROW ){
348 int rcvid = db_column_int(&q, 0);
349 const char *zUser = db_column_text(&q, 1);
350 const char *zDate = db_column_text(&q, 2);
351 const char *zIpAddr = db_column_text(&q, 3);
352 if( cnt==30 && !showAll ){
353 style_submenu_element("Older", "Older",
354 "rcvfromlist?ofst=%d", ofst+30);
355 }else{
356 cnt++;
357 @ <tr>
358 if( db_column_int(&q,4) ){
359 @ <td style="padding-right: 15px;text-align: right;">
360 @ <a href="rcvfrom?rcvid=%d(rcvid)">%d(rcvid)</a></td>
361 }else{
362 @ <td style="padding-right: 15px;text-align: right;">%d(rcvid)</td>
363 }
364 @ <td style="padding-right: 15px;text-align: left;">%s(zDate)</td>
365 @ <td style="padding-right: 15px;text-align: left;">%h(zUser)</td>
366 @ <td style="text-align: left;">%s(zIpAddr)</td>
367 @ </tr>
368 }
@@ -365,22 +383,24 @@
383
384 login_check_credentials();
385 if( !g.perm.Admin ){
386 login_needed();
387 }
388 style_header("Artifact Receipt %d", rcvid);
389 if( db_exists(
390 "SELECT 1 FROM blob WHERE rcvid=%d AND"
391 " NOT EXISTS (SELECT 1 FROM shun WHERE shun.uuid=blob.uuid)", rcvid)
392 ){
393 style_submenu_element("Shun All", "Shun All",
394 "shun?shun&rcvid=%d#addshun", rcvid);
395 }
396 if( db_exists(
397 "SELECT 1 FROM blob WHERE rcvid=%d AND"
398 " EXISTS (SELECT 1 FROM shun WHERE shun.uuid=blob.uuid)", rcvid)
399 ){
400 style_submenu_element("Unshun All", "Unshun All",
401 "shun?accept&rcvid=%d#delshun", rcvid);
402 }
403 db_prepare(&q,
404 "SELECT login, datetime(rcvfrom.mtime), rcvfrom.ipaddr"
405 " FROM rcvfrom LEFT JOIN user USING(uid)"
406 " WHERE rcvid=%d",
@@ -399,22 +419,30 @@
419 @ <td valign="top">%s(zDate)</td></tr>
420 @ <tr><th valign="top" align="right">IP&nbsp;Address:</th>
421 @ <td valign="top">%s(zIpAddr)</td></tr>
422 }
423 db_finalize(&q);
424 db_multi_exec(
425 "CREATE TEMP TABLE toshow(rid INTEGER PRIMARY KEY);"
426 "INSERT INTO toshow SELECT rid FROM blob WHERE rcvid=%d", rcvid
427 );
428 describe_artifacts("IN toshow");
429 db_prepare(&q,
430 "SELECT blob.rid, blob.uuid, blob.size, description.summary\n"
431 " FROM blob LEFT JOIN description ON (blob.rid=description.rid)"
432 " WHERE blob.rcvid=%d", rcvid
433 );
434 @ <tr><th valign="top" align="right">Artifacts:</th>
435 @ <td valign="top">
436 while( db_step(&q)==SQLITE_ROW ){
 
437 const char *zUuid = db_column_text(&q, 1);
438 int size = db_column_int(&q, 2);
439 const char *zDesc = db_column_text(&q, 3);
440 if( zDesc==0 ) zDesc = "";
441 @ <a href="%s(g.zTop)/info/%s(zUuid)">%s(zUuid)</a>
442 @ %h(zDesc) (size: %d(size))<br />
443 }
444 @ </td></tr>
445 @ </table>
446 db_finalize(&q);
447 style_footer();
448 }
449
+21 -20
--- src/sqlcmd.c
+++ src/sqlcmd.c
@@ -106,10 +106,24 @@
106106
sqlite3_result_blob(context, pOut, nOut, sqlite3_free);
107107
}else{
108108
sqlite3_result_error(context, "input is not zlib compressed", -1);
109109
}
110110
}
111
+
112
+/*
113
+** Add the content(), compress(), and decompress() SQL functions to
114
+** database connection db.
115
+*/
116
+int add_content_sql_commands(sqlite3 *db){
117
+ sqlite3_create_function(db, "content", 1, SQLITE_UTF8, 0,
118
+ sqlcmd_content, 0, 0);
119
+ sqlite3_create_function(db, "compress", 1, SQLITE_UTF8, 0,
120
+ sqlcmd_compress, 0, 0);
121
+ sqlite3_create_function(db, "decompress", 1, SQLITE_UTF8, 0,
122
+ sqlcmd_decompress, 0, 0);
123
+ return SQLITE_OK;
124
+}
111125
112126
/*
113127
** This is the "automatic extension" initializer that runs right after
114128
** the connection to the repository database is opened. Set up the
115129
** database connection to be more useful to the human operator.
@@ -117,40 +131,27 @@
117131
static int sqlcmd_autoinit(
118132
sqlite3 *db,
119133
const char **pzErrMsg,
120134
const void *notUsed
121135
){
122
- char *zSql;
123
- int rc = SQLITE_OK;
124
- sqlite3_create_function(db, "content", 1, SQLITE_UTF8, 0,
125
- sqlcmd_content, 0, 0);
126
- sqlite3_create_function(db, "compress", 1, SQLITE_UTF8, 0,
127
- sqlcmd_compress, 0, 0);
128
- sqlite3_create_function(db, "decompress", 1, SQLITE_UTF8, 0,
129
- sqlcmd_decompress, 0, 0);
136
+ add_content_sql_commands(db);
130137
re_add_sql_func(db);
131
- foci_register(db);
132138
g.zMainDbType = "repository";
139
+ foci_register(db);
133140
g.repositoryOpen = 1;
134141
g.db = db;
135
- db_open_config(1);
136
- if( g.zLocalDbName ){
137
- zSql = sqlite3_mprintf("ATTACH %Q AS localdb;", g.zLocalDbName);
138
- rc = sqlite3_exec(db, zSql, 0, 0, 0);
139
- sqlite3_free(zSql);
140
- }
141
- return rc;
142
+ return SQLITE_OK;
142143
}
143144
144145
/*
145146
** COMMAND: sqlite3
146147
**
147
-** Usage: %fossil sqlite3 ?SQL-COMMANDS? ?OPTIONS?
148
+** Usage: %fossil sqlite3 ?DATABASE? ?OPTIONS?
148149
**
149
-** Run the standalone sqlite3 command-line shell on the repository database
150
-** for the current checkout, or whatever repository is specified by the
151
-** -R command-line option.
150
+** Run the standalone sqlite3 command-line shell on DATABASE with OPTIONS.
151
+** If DATABASE is omitted, then the repository that serves the working
152
+** directory is opened.
152153
**
153154
** WARNING: Careless use of this command can corrupt a Fossil repository
154155
** in ways that are unrecoverable. Be sure you know what you are doing before
155156
** running any SQL commands that modifies the repository database.
156157
*/
157158
--- src/sqlcmd.c
+++ src/sqlcmd.c
@@ -106,10 +106,24 @@
106 sqlite3_result_blob(context, pOut, nOut, sqlite3_free);
107 }else{
108 sqlite3_result_error(context, "input is not zlib compressed", -1);
109 }
110 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
112 /*
113 ** This is the "automatic extension" initializer that runs right after
114 ** the connection to the repository database is opened. Set up the
115 ** database connection to be more useful to the human operator.
@@ -117,40 +131,27 @@
117 static int sqlcmd_autoinit(
118 sqlite3 *db,
119 const char **pzErrMsg,
120 const void *notUsed
121 ){
122 char *zSql;
123 int rc = SQLITE_OK;
124 sqlite3_create_function(db, "content", 1, SQLITE_UTF8, 0,
125 sqlcmd_content, 0, 0);
126 sqlite3_create_function(db, "compress", 1, SQLITE_UTF8, 0,
127 sqlcmd_compress, 0, 0);
128 sqlite3_create_function(db, "decompress", 1, SQLITE_UTF8, 0,
129 sqlcmd_decompress, 0, 0);
130 re_add_sql_func(db);
131 foci_register(db);
132 g.zMainDbType = "repository";
 
133 g.repositoryOpen = 1;
134 g.db = db;
135 db_open_config(1);
136 if( g.zLocalDbName ){
137 zSql = sqlite3_mprintf("ATTACH %Q AS localdb;", g.zLocalDbName);
138 rc = sqlite3_exec(db, zSql, 0, 0, 0);
139 sqlite3_free(zSql);
140 }
141 return rc;
142 }
143
144 /*
145 ** COMMAND: sqlite3
146 **
147 ** Usage: %fossil sqlite3 ?SQL-COMMANDS? ?OPTIONS?
148 **
149 ** Run the standalone sqlite3 command-line shell on the repository database
150 ** for the current checkout, or whatever repository is specified by the
151 ** -R command-line option.
152 **
153 ** WARNING: Careless use of this command can corrupt a Fossil repository
154 ** in ways that are unrecoverable. Be sure you know what you are doing before
155 ** running any SQL commands that modifies the repository database.
156 */
157
--- src/sqlcmd.c
+++ src/sqlcmd.c
@@ -106,10 +106,24 @@
106 sqlite3_result_blob(context, pOut, nOut, sqlite3_free);
107 }else{
108 sqlite3_result_error(context, "input is not zlib compressed", -1);
109 }
110 }
111
112 /*
113 ** Add the content(), compress(), and decompress() SQL functions to
114 ** database connection db.
115 */
116 int add_content_sql_commands(sqlite3 *db){
117 sqlite3_create_function(db, "content", 1, SQLITE_UTF8, 0,
118 sqlcmd_content, 0, 0);
119 sqlite3_create_function(db, "compress", 1, SQLITE_UTF8, 0,
120 sqlcmd_compress, 0, 0);
121 sqlite3_create_function(db, "decompress", 1, SQLITE_UTF8, 0,
122 sqlcmd_decompress, 0, 0);
123 return SQLITE_OK;
124 }
125
126 /*
127 ** This is the "automatic extension" initializer that runs right after
128 ** the connection to the repository database is opened. Set up the
129 ** database connection to be more useful to the human operator.
@@ -117,40 +131,27 @@
131 static int sqlcmd_autoinit(
132 sqlite3 *db,
133 const char **pzErrMsg,
134 const void *notUsed
135 ){
136 add_content_sql_commands(db);
 
 
 
 
 
 
 
137 re_add_sql_func(db);
 
138 g.zMainDbType = "repository";
139 foci_register(db);
140 g.repositoryOpen = 1;
141 g.db = db;
142 return SQLITE_OK;
 
 
 
 
 
 
143 }
144
145 /*
146 ** COMMAND: sqlite3
147 **
148 ** Usage: %fossil sqlite3 ?DATABASE? ?OPTIONS?
149 **
150 ** Run the standalone sqlite3 command-line shell on DATABASE with OPTIONS.
151 ** If DATABASE is omitted, then the repository that serves the working
152 ** directory is opened.
153 **
154 ** WARNING: Careless use of this command can corrupt a Fossil repository
155 ** in ways that are unrecoverable. Be sure you know what you are doing before
156 ** running any SQL commands that modifies the repository database.
157 */
158
+27 -8
--- src/timeline.c
+++ src/timeline.c
@@ -20,10 +20,20 @@
2020
*/
2121
#include "config.h"
2222
#include <string.h>
2323
#include <time.h>
2424
#include "timeline.h"
25
+
26
+/*
27
+** Add an appropriate tag to the output if "rid" is unpublished (private)
28
+*/
29
+#define UNPUB_TAG "<em>(unpublished)</em>"
30
+void tag_private_status(int rid){
31
+ if( content_is_private(rid) ){
32
+ cgi_printf("%s", UNPUB_TAG);
33
+ }
34
+}
2535
2636
/*
2737
** Generate a hyperlink to a version.
2838
*/
2939
void hyperlink_to_uuid(const char *zUuid){
@@ -456,11 +466,11 @@
456466
blob_reset(&links);
457467
}else{
458468
@ tags: %h(zTagList))
459469
}
460470
}
461
-
471
+ tag_private_status(rid);
462472
463473
/* Generate extra hyperlinks at the end of the comment */
464474
if( xExtra ){
465475
xExtra(rid);
466476
}
@@ -471,11 +481,11 @@
471481
){
472482
int inUl = 0;
473483
if( !fchngQueryInit ){
474484
db_prepare(&fchngQuery,
475485
"SELECT (pid==0) AS isnew,"
476
- " (fid==0) AS isdel,"
486
+ " fid,"
477487
" (SELECT name FROM filename WHERE fnid=mlink.fnid) AS name,"
478488
" (SELECT uuid FROM blob WHERE rid=fid),"
479489
" (SELECT uuid FROM blob WHERE rid=pid),"
480490
" (SELECT name FROM filename WHERE fnid=mlink.pfnid) AS oldnm"
481491
" FROM mlink"
@@ -488,14 +498,16 @@
488498
}
489499
db_bind_int(&fchngQuery, ":mid", rid);
490500
while( db_step(&fchngQuery)==SQLITE_ROW ){
491501
const char *zFilename = db_column_text(&fchngQuery, 2);
492502
int isNew = db_column_int(&fchngQuery, 0);
493
- int isDel = db_column_int(&fchngQuery, 1);
503
+ int fid = db_column_int(&fchngQuery, 1);
504
+ int isDel = fid==0;
494505
const char *zOldName = db_column_text(&fchngQuery, 5);
495506
const char *zOld = db_column_text(&fchngQuery, 4);
496507
const char *zNew = db_column_text(&fchngQuery, 3);
508
+ const char *zUnpubTag = "";
497509
if( !inUl ){
498510
@ <ul class="filelist">
499511
inUl = 1;
500512
}
501513
if( (tmFlags & TIMELINE_FRENAMES)!=0 ){
@@ -502,23 +514,26 @@
502514
if( !isNew && !isDel && zOldName!=0 ){
503515
@ <li> %h(zOldName) &rarr; %h(zFilename)
504516
}
505517
continue;
506518
}
519
+ if( content_is_private(fid) ){
520
+ zUnpubTag = UNPUB_TAG;
521
+ }
507522
if( isNew ){
508
- @ <li> %h(zFilename) (new file) &nbsp;
523
+ @ <li> %h(zFilename) %s(zUnpubTag) (new file) &nbsp;
509524
@ %z(href("%R/artifact/%s",zNew))[view]</a></li>
510525
}else if( isDel ){
511526
@ <li> %h(zFilename) (deleted)</li>
512527
}else if( fossil_strcmp(zOld,zNew)==0 && zOldName!=0 ){
513
- @ <li> %h(zOldName) &rarr; %h(zFilename)
528
+ @ <li> %h(zOldName) &rarr; %h(zFilename) %s(zUnpubTag)
514529
@ %z(href("%R/artifact/%s",zNew))[view]</a></li>
515530
}else{
516531
if( zOldName!=0 ){
517
- @ <li> %h(zOldName) &rarr; %h(zFilename)
532
+ @ <li> %h(zOldName) &rarr; %h(zFilename) %s(zUnpubTag)
518533
}else{
519
- @ <li> %h(zFilename) &nbsp;
534
+ @ <li> %h(zFilename) &nbsp; %s(zUnpubTag)
520535
}
521536
@ %z(href("%R/fdiff?sbs=1&v1=%s&v2=%s",zOld,zNew))[diff]</a></li>
522537
}
523538
}
524539
db_reset(&fchngQuery);
@@ -1617,11 +1632,15 @@
16171632
sqlite3_snprintf(sizeof(zPrefix)-n, &zPrefix[n], zBrType);
16181633
n = strlen(zPrefix);
16191634
}
16201635
if( fossil_strcmp(zCurrentUuid,zId)==0 ){
16211636
sqlite3_snprintf(sizeof(zPrefix)-n, &zPrefix[n], "*CURRENT* ");
1622
- n += strlen(zPrefix);
1637
+ n += strlen(zPrefix+n);
1638
+ }
1639
+ if( content_is_private(rid) ){
1640
+ sqlite3_snprintf(sizeof(zPrefix)-n, &zPrefix[n], "*UNPUBLISHED* ");
1641
+ n += strlen(zPrefix+n);
16231642
}
16241643
zFree = mprintf("[%S] %s%s", zId, zPrefix, zCom);
16251644
/* record another X lines */
16261645
nLine += comment_print(zFree, zCom, 9, width, g.comFmtFlags);
16271646
fossil_free(zFree);
16281647
--- src/timeline.c
+++ src/timeline.c
@@ -20,10 +20,20 @@
20 */
21 #include "config.h"
22 #include <string.h>
23 #include <time.h>
24 #include "timeline.h"
 
 
 
 
 
 
 
 
 
 
25
26 /*
27 ** Generate a hyperlink to a version.
28 */
29 void hyperlink_to_uuid(const char *zUuid){
@@ -456,11 +466,11 @@
456 blob_reset(&links);
457 }else{
458 @ tags: %h(zTagList))
459 }
460 }
461
462
463 /* Generate extra hyperlinks at the end of the comment */
464 if( xExtra ){
465 xExtra(rid);
466 }
@@ -471,11 +481,11 @@
471 ){
472 int inUl = 0;
473 if( !fchngQueryInit ){
474 db_prepare(&fchngQuery,
475 "SELECT (pid==0) AS isnew,"
476 " (fid==0) AS isdel,"
477 " (SELECT name FROM filename WHERE fnid=mlink.fnid) AS name,"
478 " (SELECT uuid FROM blob WHERE rid=fid),"
479 " (SELECT uuid FROM blob WHERE rid=pid),"
480 " (SELECT name FROM filename WHERE fnid=mlink.pfnid) AS oldnm"
481 " FROM mlink"
@@ -488,14 +498,16 @@
488 }
489 db_bind_int(&fchngQuery, ":mid", rid);
490 while( db_step(&fchngQuery)==SQLITE_ROW ){
491 const char *zFilename = db_column_text(&fchngQuery, 2);
492 int isNew = db_column_int(&fchngQuery, 0);
493 int isDel = db_column_int(&fchngQuery, 1);
 
494 const char *zOldName = db_column_text(&fchngQuery, 5);
495 const char *zOld = db_column_text(&fchngQuery, 4);
496 const char *zNew = db_column_text(&fchngQuery, 3);
 
497 if( !inUl ){
498 @ <ul class="filelist">
499 inUl = 1;
500 }
501 if( (tmFlags & TIMELINE_FRENAMES)!=0 ){
@@ -502,23 +514,26 @@
502 if( !isNew && !isDel && zOldName!=0 ){
503 @ <li> %h(zOldName) &rarr; %h(zFilename)
504 }
505 continue;
506 }
 
 
 
507 if( isNew ){
508 @ <li> %h(zFilename) (new file) &nbsp;
509 @ %z(href("%R/artifact/%s",zNew))[view]</a></li>
510 }else if( isDel ){
511 @ <li> %h(zFilename) (deleted)</li>
512 }else if( fossil_strcmp(zOld,zNew)==0 && zOldName!=0 ){
513 @ <li> %h(zOldName) &rarr; %h(zFilename)
514 @ %z(href("%R/artifact/%s",zNew))[view]</a></li>
515 }else{
516 if( zOldName!=0 ){
517 @ <li> %h(zOldName) &rarr; %h(zFilename)
518 }else{
519 @ <li> %h(zFilename) &nbsp;
520 }
521 @ %z(href("%R/fdiff?sbs=1&v1=%s&v2=%s",zOld,zNew))[diff]</a></li>
522 }
523 }
524 db_reset(&fchngQuery);
@@ -1617,11 +1632,15 @@
1617 sqlite3_snprintf(sizeof(zPrefix)-n, &zPrefix[n], zBrType);
1618 n = strlen(zPrefix);
1619 }
1620 if( fossil_strcmp(zCurrentUuid,zId)==0 ){
1621 sqlite3_snprintf(sizeof(zPrefix)-n, &zPrefix[n], "*CURRENT* ");
1622 n += strlen(zPrefix);
 
 
 
 
1623 }
1624 zFree = mprintf("[%S] %s%s", zId, zPrefix, zCom);
1625 /* record another X lines */
1626 nLine += comment_print(zFree, zCom, 9, width, g.comFmtFlags);
1627 fossil_free(zFree);
1628
--- src/timeline.c
+++ src/timeline.c
@@ -20,10 +20,20 @@
20 */
21 #include "config.h"
22 #include <string.h>
23 #include <time.h>
24 #include "timeline.h"
25
26 /*
27 ** Add an appropriate tag to the output if "rid" is unpublished (private)
28 */
29 #define UNPUB_TAG "<em>(unpublished)</em>"
30 void tag_private_status(int rid){
31 if( content_is_private(rid) ){
32 cgi_printf("%s", UNPUB_TAG);
33 }
34 }
35
36 /*
37 ** Generate a hyperlink to a version.
38 */
39 void hyperlink_to_uuid(const char *zUuid){
@@ -456,11 +466,11 @@
466 blob_reset(&links);
467 }else{
468 @ tags: %h(zTagList))
469 }
470 }
471 tag_private_status(rid);
472
473 /* Generate extra hyperlinks at the end of the comment */
474 if( xExtra ){
475 xExtra(rid);
476 }
@@ -471,11 +481,11 @@
481 ){
482 int inUl = 0;
483 if( !fchngQueryInit ){
484 db_prepare(&fchngQuery,
485 "SELECT (pid==0) AS isnew,"
486 " fid,"
487 " (SELECT name FROM filename WHERE fnid=mlink.fnid) AS name,"
488 " (SELECT uuid FROM blob WHERE rid=fid),"
489 " (SELECT uuid FROM blob WHERE rid=pid),"
490 " (SELECT name FROM filename WHERE fnid=mlink.pfnid) AS oldnm"
491 " FROM mlink"
@@ -488,14 +498,16 @@
498 }
499 db_bind_int(&fchngQuery, ":mid", rid);
500 while( db_step(&fchngQuery)==SQLITE_ROW ){
501 const char *zFilename = db_column_text(&fchngQuery, 2);
502 int isNew = db_column_int(&fchngQuery, 0);
503 int fid = db_column_int(&fchngQuery, 1);
504 int isDel = fid==0;
505 const char *zOldName = db_column_text(&fchngQuery, 5);
506 const char *zOld = db_column_text(&fchngQuery, 4);
507 const char *zNew = db_column_text(&fchngQuery, 3);
508 const char *zUnpubTag = "";
509 if( !inUl ){
510 @ <ul class="filelist">
511 inUl = 1;
512 }
513 if( (tmFlags & TIMELINE_FRENAMES)!=0 ){
@@ -502,23 +514,26 @@
514 if( !isNew && !isDel && zOldName!=0 ){
515 @ <li> %h(zOldName) &rarr; %h(zFilename)
516 }
517 continue;
518 }
519 if( content_is_private(fid) ){
520 zUnpubTag = UNPUB_TAG;
521 }
522 if( isNew ){
523 @ <li> %h(zFilename) %s(zUnpubTag) (new file) &nbsp;
524 @ %z(href("%R/artifact/%s",zNew))[view]</a></li>
525 }else if( isDel ){
526 @ <li> %h(zFilename) (deleted)</li>
527 }else if( fossil_strcmp(zOld,zNew)==0 && zOldName!=0 ){
528 @ <li> %h(zOldName) &rarr; %h(zFilename) %s(zUnpubTag)
529 @ %z(href("%R/artifact/%s",zNew))[view]</a></li>
530 }else{
531 if( zOldName!=0 ){
532 @ <li> %h(zOldName) &rarr; %h(zFilename) %s(zUnpubTag)
533 }else{
534 @ <li> %h(zFilename) &nbsp; %s(zUnpubTag)
535 }
536 @ %z(href("%R/fdiff?sbs=1&v1=%s&v2=%s",zOld,zNew))[diff]</a></li>
537 }
538 }
539 db_reset(&fchngQuery);
@@ -1617,11 +1632,15 @@
1632 sqlite3_snprintf(sizeof(zPrefix)-n, &zPrefix[n], zBrType);
1633 n = strlen(zPrefix);
1634 }
1635 if( fossil_strcmp(zCurrentUuid,zId)==0 ){
1636 sqlite3_snprintf(sizeof(zPrefix)-n, &zPrefix[n], "*CURRENT* ");
1637 n += strlen(zPrefix+n);
1638 }
1639 if( content_is_private(rid) ){
1640 sqlite3_snprintf(sizeof(zPrefix)-n, &zPrefix[n], "*UNPUBLISHED* ");
1641 n += strlen(zPrefix+n);
1642 }
1643 zFree = mprintf("[%S] %s%s", zId, zPrefix, zCom);
1644 /* record another X lines */
1645 nLine += comment_print(zFree, zCom, 9, width, g.comFmtFlags);
1646 fossil_free(zFree);
1647
+22 -4
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -28,13 +28,13 @@
2828
2929
SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS
3030
3131
SHELL_OPTIONS = -Dmain=sqlite3_shell -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=fossil_open -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
3232
33
-SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c cache_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c foci_.c fusefs_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_status_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c loadctrl_.c login_.c lookslike_.c main_.c manifest_.c markdown_.c markdown_html_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c rebuild_.c regexp_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c skins_.c sqlcmd_.c stash_.c stat_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
33
+SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c foci_.c fusefs_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_status_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c loadctrl_.c login_.c lookslike_.c main_.c manifest_.c markdown_.c markdown_html_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c skins_.c sqlcmd_.c stash_.c stat_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
3434
35
-OBJ = $(OBJDIR)\add$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\builtin$O $(OBJDIR)\cache$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\doc$O $(OBJDIR)\encode$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\file$O $(OBJDIR)\finfo$O $(OBJDIR)\foci$O $(OBJDIR)\fusefs$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(OBJDIR)\json$O $(OBJDIR)\json_artifact$O $(OBJDIR)\json_branch$O $(OBJDIR)\json_config$O $(OBJDIR)\json_diff$O $(OBJDIR)\json_dir$O $(OBJDIR)\json_finfo$O $(OBJDIR)\json_login$O $(OBJDIR)\json_query$O $(OBJDIR)\json_report$O $(OBJDIR)\json_status$O $(OBJDIR)\json_tag$O $(OBJDIR)\json_timeline$O $(OBJDIR)\json_user$O $(OBJDIR)\json_wiki$O $(OBJDIR)\leaf$O $(OBJDIR)\loadctrl$O $(OBJDIR)\login$O $(OBJDIR)\lookslike$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\markdown$O $(OBJDIR)\markdown_html$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\moderate$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\rebuild$O $(OBJDIR)\regexp$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\setup$O $(OBJDIR)\sha1$O $(OBJDIR)\shun$O $(OBJDIR)\skins$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\unicode$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\utf8$O $(OBJDIR)\util$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winfile$O $(OBJDIR)\winhttp$O $(OBJDIR)\wysiwyg$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O
35
+OBJ = $(OBJDIR)\add$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\builtin$O $(OBJDIR)\bundle$O $(OBJDIR)\cache$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\doc$O $(OBJDIR)\encode$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\file$O $(OBJDIR)\finfo$O $(OBJDIR)\foci$O $(OBJDIR)\fusefs$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(OBJDIR)\json$O $(OBJDIR)\json_artifact$O $(OBJDIR)\json_branch$O $(OBJDIR)\json_config$O $(OBJDIR)\json_diff$O $(OBJDIR)\json_dir$O $(OBJDIR)\json_finfo$O $(OBJDIR)\json_login$O $(OBJDIR)\json_query$O $(OBJDIR)\json_report$O $(OBJDIR)\json_status$O $(OBJDIR)\json_tag$O $(OBJDIR)\json_timeline$O $(OBJDIR)\json_user$O $(OBJDIR)\json_wiki$O $(OBJDIR)\leaf$O $(OBJDIR)\loadctrl$O $(OBJDIR)\login$O $(OBJDIR)\lookslike$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\markdown$O $(OBJDIR)\markdown_html$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\moderate$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\publish$O $(OBJDIR)\purge$O $(OBJDIR)\rebuild$O $(OBJDIR)\regexp$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\setup$O $(OBJDIR)\sha1$O $(OBJDIR)\shun$O $(OBJDIR)\skins$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\unicode$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\utf8$O $(OBJDIR)\util$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winfile$O $(OBJDIR)\winhttp$O $(OBJDIR)\wysiwyg$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O
3636
3737
3838
RC=$(DMDIR)\bin\rcc
3939
RCFLAGS=-32 -w1 -I$(SRCDIR) /D__DMC__
4040
@@ -49,11 +49,11 @@
4949
5050
$(OBJDIR)\fossil.res: $B\win\fossil.rc
5151
$(RC) $(RCFLAGS) -o$@ $**
5252
5353
$(OBJDIR)\link: $B\win\Makefile.dmc $(OBJDIR)\fossil.res
54
- +echo add allrepo attach bag bisect blob branch browse builtin cache captcha cgi checkin checkout clearsign clone comformat configure content db delta deltacmd descendants diff diffcmd doc encode event export file finfo foci fusefs glob graph gzip http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_status json_tag json_timeline json_user json_wiki leaf loadctrl login lookslike main manifest markdown markdown_html md5 merge merge3 moderate name path pivot popen pqueue printf rebuild regexp report rss schema search setup sha1 shun skins sqlcmd stash stat style sync tag tar th_main timeline tkt tktsetup undo unicode update url user utf8 util verify vfile wiki wikiformat winfile winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
54
+ +echo add allrepo attach bag bisect blob branch browse builtin bundle cache captcha cgi checkin checkout clearsign clone comformat configure content db delta deltacmd descendants diff diffcmd doc encode event export file finfo foci fusefs glob graph gzip http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_status json_tag json_timeline json_user json_wiki leaf loadctrl login lookslike main manifest markdown markdown_html md5 merge merge3 moderate name path pivot popen pqueue printf publish purge rebuild regexp report rss schema search setup sha1 shun skins sqlcmd stash stat style sync tag tar th_main timeline tkt tktsetup undo unicode update url user utf8 util verify vfile wiki wikiformat winfile winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
5555
+echo fossil >> $@
5656
+echo fossil >> $@
5757
+echo $(LIBS) >> $@
5858
+echo. >> $@
5959
+echo fossil >> $@
@@ -176,10 +176,16 @@
176176
$(OBJDIR)\builtin$O : builtin_.c builtin.h
177177
$(TCC) -o$@ -c builtin_.c
178178
179179
builtin_.c : $(SRCDIR)\builtin.c
180180
+translate$E $** > $@
181
+
182
+$(OBJDIR)\bundle$O : bundle_.c bundle.h
183
+ $(TCC) -o$@ -c bundle_.c
184
+
185
+bundle_.c : $(SRCDIR)\bundle.c
186
+ +translate$E $** > $@
181187
182188
$(OBJDIR)\cache$O : cache_.c cache.h
183189
$(TCC) -o$@ -c cache_.c
184190
185191
cache_.c : $(SRCDIR)\cache.c
@@ -572,10 +578,22 @@
572578
$(OBJDIR)\printf$O : printf_.c printf.h
573579
$(TCC) -o$@ -c printf_.c
574580
575581
printf_.c : $(SRCDIR)\printf.c
576582
+translate$E $** > $@
583
+
584
+$(OBJDIR)\publish$O : publish_.c publish.h
585
+ $(TCC) -o$@ -c publish_.c
586
+
587
+publish_.c : $(SRCDIR)\publish.c
588
+ +translate$E $** > $@
589
+
590
+$(OBJDIR)\purge$O : purge_.c purge.h
591
+ $(TCC) -o$@ -c purge_.c
592
+
593
+purge_.c : $(SRCDIR)\purge.c
594
+ +translate$E $** > $@
577595
578596
$(OBJDIR)\rebuild$O : rebuild_.c rebuild.h
579597
$(TCC) -o$@ -c rebuild_.c
580598
581599
rebuild_.c : $(SRCDIR)\rebuild.c
@@ -802,7 +820,7 @@
802820
803821
zip_.c : $(SRCDIR)\zip.c
804822
+translate$E $** > $@
805823
806824
headers: makeheaders$E page_index.h builtin_data.h VERSION.h
807
- +makeheaders$E add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h builtin_.c:builtin.h cache_.c:cache.h captcha_.c:captcha.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 configure_.c:configure.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h doc_.c:doc.h encode_.c:encode.h event_.c:event.h export_.c:export.h file_.c:file.h finfo_.c:finfo.h foci_.c:foci.h fusefs_.c:fusefs.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_status_.c:json_status.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h loadctrl_.c:loadctrl.h login_.c:login.h lookslike_.c:lookslike.h main_.c:main.h manifest_.c:manifest.h markdown_.c:markdown.h markdown_html_.c:markdown_html.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h moderate_.c:moderate.h name_.c:name.h path_.c:path.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h regexp_.c:regexp.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h setup_.c:setup.h sha1_.c:sha1.h shun_.c:shun.h skins_.c:skins.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h unicode_.c:unicode.h update_.c:update.h url_.c:url.h user_.c:user.h utf8_.c:utf8.h util_.c:util.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winfile_.c:winfile.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
825
+ +makeheaders$E add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h builtin_.c:builtin.h bundle_.c:bundle.h cache_.c:cache.h captcha_.c:captcha.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 configure_.c:configure.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h doc_.c:doc.h encode_.c:encode.h event_.c:event.h export_.c:export.h file_.c:file.h finfo_.c:finfo.h foci_.c:foci.h fusefs_.c:fusefs.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_status_.c:json_status.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h loadctrl_.c:loadctrl.h login_.c:login.h lookslike_.c:lookslike.h main_.c:main.h manifest_.c:manifest.h markdown_.c:markdown.h markdown_html_.c:markdown_html.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h moderate_.c:moderate.h name_.c:name.h path_.c:path.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h publish_.c:publish.h purge_.c:purge.h rebuild_.c:rebuild.h regexp_.c:regexp.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h setup_.c:setup.h sha1_.c:sha1.h shun_.c:shun.h skins_.c:skins.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h unicode_.c:unicode.h update_.c:update.h url_.c:url.h user_.c:user.h utf8_.c:utf8.h util_.c:util.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winfile_.c:winfile.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
808826
@copy /Y nul: headers
809827
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -28,13 +28,13 @@
28
29 SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS
30
31 SHELL_OPTIONS = -Dmain=sqlite3_shell -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=fossil_open -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
32
33 SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c cache_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c foci_.c fusefs_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_status_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c loadctrl_.c login_.c lookslike_.c main_.c manifest_.c markdown_.c markdown_html_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c rebuild_.c regexp_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c skins_.c sqlcmd_.c stash_.c stat_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
34
35 OBJ = $(OBJDIR)\add$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\builtin$O $(OBJDIR)\cache$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\doc$O $(OBJDIR)\encode$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\file$O $(OBJDIR)\finfo$O $(OBJDIR)\foci$O $(OBJDIR)\fusefs$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(OBJDIR)\json$O $(OBJDIR)\json_artifact$O $(OBJDIR)\json_branch$O $(OBJDIR)\json_config$O $(OBJDIR)\json_diff$O $(OBJDIR)\json_dir$O $(OBJDIR)\json_finfo$O $(OBJDIR)\json_login$O $(OBJDIR)\json_query$O $(OBJDIR)\json_report$O $(OBJDIR)\json_status$O $(OBJDIR)\json_tag$O $(OBJDIR)\json_timeline$O $(OBJDIR)\json_user$O $(OBJDIR)\json_wiki$O $(OBJDIR)\leaf$O $(OBJDIR)\loadctrl$O $(OBJDIR)\login$O $(OBJDIR)\lookslike$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\markdown$O $(OBJDIR)\markdown_html$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\moderate$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\rebuild$O $(OBJDIR)\regexp$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\setup$O $(OBJDIR)\sha1$O $(OBJDIR)\shun$O $(OBJDIR)\skins$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\unicode$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\utf8$O $(OBJDIR)\util$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winfile$O $(OBJDIR)\winhttp$O $(OBJDIR)\wysiwyg$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O
36
37
38 RC=$(DMDIR)\bin\rcc
39 RCFLAGS=-32 -w1 -I$(SRCDIR) /D__DMC__
40
@@ -49,11 +49,11 @@
49
50 $(OBJDIR)\fossil.res: $B\win\fossil.rc
51 $(RC) $(RCFLAGS) -o$@ $**
52
53 $(OBJDIR)\link: $B\win\Makefile.dmc $(OBJDIR)\fossil.res
54 +echo add allrepo attach bag bisect blob branch browse builtin cache captcha cgi checkin checkout clearsign clone comformat configure content db delta deltacmd descendants diff diffcmd doc encode event export file finfo foci fusefs glob graph gzip http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_status json_tag json_timeline json_user json_wiki leaf loadctrl login lookslike main manifest markdown markdown_html md5 merge merge3 moderate name path pivot popen pqueue printf rebuild regexp report rss schema search setup sha1 shun skins sqlcmd stash stat style sync tag tar th_main timeline tkt tktsetup undo unicode update url user utf8 util verify vfile wiki wikiformat winfile winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
55 +echo fossil >> $@
56 +echo fossil >> $@
57 +echo $(LIBS) >> $@
58 +echo. >> $@
59 +echo fossil >> $@
@@ -176,10 +176,16 @@
176 $(OBJDIR)\builtin$O : builtin_.c builtin.h
177 $(TCC) -o$@ -c builtin_.c
178
179 builtin_.c : $(SRCDIR)\builtin.c
180 +translate$E $** > $@
 
 
 
 
 
 
181
182 $(OBJDIR)\cache$O : cache_.c cache.h
183 $(TCC) -o$@ -c cache_.c
184
185 cache_.c : $(SRCDIR)\cache.c
@@ -572,10 +578,22 @@
572 $(OBJDIR)\printf$O : printf_.c printf.h
573 $(TCC) -o$@ -c printf_.c
574
575 printf_.c : $(SRCDIR)\printf.c
576 +translate$E $** > $@
 
 
 
 
 
 
 
 
 
 
 
 
577
578 $(OBJDIR)\rebuild$O : rebuild_.c rebuild.h
579 $(TCC) -o$@ -c rebuild_.c
580
581 rebuild_.c : $(SRCDIR)\rebuild.c
@@ -802,7 +820,7 @@
802
803 zip_.c : $(SRCDIR)\zip.c
804 +translate$E $** > $@
805
806 headers: makeheaders$E page_index.h builtin_data.h VERSION.h
807 +makeheaders$E add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h builtin_.c:builtin.h cache_.c:cache.h captcha_.c:captcha.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 configure_.c:configure.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h doc_.c:doc.h encode_.c:encode.h event_.c:event.h export_.c:export.h file_.c:file.h finfo_.c:finfo.h foci_.c:foci.h fusefs_.c:fusefs.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_status_.c:json_status.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h loadctrl_.c:loadctrl.h login_.c:login.h lookslike_.c:lookslike.h main_.c:main.h manifest_.c:manifest.h markdown_.c:markdown.h markdown_html_.c:markdown_html.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h moderate_.c:moderate.h name_.c:name.h path_.c:path.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.h regexp_.c:regexp.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h setup_.c:setup.h sha1_.c:sha1.h shun_.c:shun.h skins_.c:skins.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h unicode_.c:unicode.h update_.c:update.h url_.c:url.h user_.c:user.h utf8_.c:utf8.h util_.c:util.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winfile_.c:winfile.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
808 @copy /Y nul: headers
809
--- win/Makefile.dmc
+++ win/Makefile.dmc
@@ -28,13 +28,13 @@
28
29 SQLITE_OPTIONS = -DNDEBUG=1 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_ENABLE_LOCKING_STYLE=0 -DSQLITE_THREADSAFE=0 -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_OMIT_DEPRECATED -DSQLITE_ENABLE_EXPLAIN_COMMENTS
30
31 SHELL_OPTIONS = -Dmain=sqlite3_shell -DSQLITE_OMIT_LOAD_EXTENSION=1 -DUSE_SYSTEM_SQLITE=$(USE_SYSTEM_SQLITE) -DSQLITE_SHELL_DBNAME_PROC=fossil_open -Daccess=file_access -Dsystem=fossil_system -Dgetenv=fossil_getenv -Dfopen=fossil_fopen
32
33 SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.c builtin_.c bundle_.c cache_.c captcha_.c cgi_.c checkin_.c checkout_.c clearsign_.c clone_.c comformat_.c configure_.c content_.c db_.c delta_.c deltacmd_.c descendants_.c diff_.c diffcmd_.c doc_.c encode_.c event_.c export_.c file_.c finfo_.c foci_.c fusefs_.c glob_.c graph_.c gzip_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c json_.c json_artifact_.c json_branch_.c json_config_.c json_diff_.c json_dir_.c json_finfo_.c json_login_.c json_query_.c json_report_.c json_status_.c json_tag_.c json_timeline_.c json_user_.c json_wiki_.c leaf_.c loadctrl_.c login_.c lookslike_.c main_.c manifest_.c markdown_.c markdown_html_.c md5_.c merge_.c merge3_.c moderate_.c name_.c path_.c pivot_.c popen_.c pqueue_.c printf_.c publish_.c purge_.c rebuild_.c regexp_.c report_.c rss_.c schema_.c search_.c setup_.c sha1_.c shun_.c skins_.c sqlcmd_.c stash_.c stat_.c style_.c sync_.c tag_.c tar_.c th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c unicode_.c update_.c url_.c user_.c utf8_.c util_.c verify_.c vfile_.c wiki_.c wikiformat_.c winfile_.c winhttp_.c wysiwyg_.c xfer_.c xfersetup_.c zip_.c
34
35 OBJ = $(OBJDIR)\add$O $(OBJDIR)\allrepo$O $(OBJDIR)\attach$O $(OBJDIR)\bag$O $(OBJDIR)\bisect$O $(OBJDIR)\blob$O $(OBJDIR)\branch$O $(OBJDIR)\browse$O $(OBJDIR)\builtin$O $(OBJDIR)\bundle$O $(OBJDIR)\cache$O $(OBJDIR)\captcha$O $(OBJDIR)\cgi$O $(OBJDIR)\checkin$O $(OBJDIR)\checkout$O $(OBJDIR)\clearsign$O $(OBJDIR)\clone$O $(OBJDIR)\comformat$O $(OBJDIR)\configure$O $(OBJDIR)\content$O $(OBJDIR)\db$O $(OBJDIR)\delta$O $(OBJDIR)\deltacmd$O $(OBJDIR)\descendants$O $(OBJDIR)\diff$O $(OBJDIR)\diffcmd$O $(OBJDIR)\doc$O $(OBJDIR)\encode$O $(OBJDIR)\event$O $(OBJDIR)\export$O $(OBJDIR)\file$O $(OBJDIR)\finfo$O $(OBJDIR)\foci$O $(OBJDIR)\fusefs$O $(OBJDIR)\glob$O $(OBJDIR)\graph$O $(OBJDIR)\gzip$O $(OBJDIR)\http$O $(OBJDIR)\http_socket$O $(OBJDIR)\http_ssl$O $(OBJDIR)\http_transport$O $(OBJDIR)\import$O $(OBJDIR)\info$O $(OBJDIR)\json$O $(OBJDIR)\json_artifact$O $(OBJDIR)\json_branch$O $(OBJDIR)\json_config$O $(OBJDIR)\json_diff$O $(OBJDIR)\json_dir$O $(OBJDIR)\json_finfo$O $(OBJDIR)\json_login$O $(OBJDIR)\json_query$O $(OBJDIR)\json_report$O $(OBJDIR)\json_status$O $(OBJDIR)\json_tag$O $(OBJDIR)\json_timeline$O $(OBJDIR)\json_user$O $(OBJDIR)\json_wiki$O $(OBJDIR)\leaf$O $(OBJDIR)\loadctrl$O $(OBJDIR)\login$O $(OBJDIR)\lookslike$O $(OBJDIR)\main$O $(OBJDIR)\manifest$O $(OBJDIR)\markdown$O $(OBJDIR)\markdown_html$O $(OBJDIR)\md5$O $(OBJDIR)\merge$O $(OBJDIR)\merge3$O $(OBJDIR)\moderate$O $(OBJDIR)\name$O $(OBJDIR)\path$O $(OBJDIR)\pivot$O $(OBJDIR)\popen$O $(OBJDIR)\pqueue$O $(OBJDIR)\printf$O $(OBJDIR)\publish$O $(OBJDIR)\purge$O $(OBJDIR)\rebuild$O $(OBJDIR)\regexp$O $(OBJDIR)\report$O $(OBJDIR)\rss$O $(OBJDIR)\schema$O $(OBJDIR)\search$O $(OBJDIR)\setup$O $(OBJDIR)\sha1$O $(OBJDIR)\shun$O $(OBJDIR)\skins$O $(OBJDIR)\sqlcmd$O $(OBJDIR)\stash$O $(OBJDIR)\stat$O $(OBJDIR)\style$O $(OBJDIR)\sync$O $(OBJDIR)\tag$O $(OBJDIR)\tar$O $(OBJDIR)\th_main$O $(OBJDIR)\timeline$O $(OBJDIR)\tkt$O $(OBJDIR)\tktsetup$O $(OBJDIR)\undo$O $(OBJDIR)\unicode$O $(OBJDIR)\update$O $(OBJDIR)\url$O $(OBJDIR)\user$O $(OBJDIR)\utf8$O $(OBJDIR)\util$O $(OBJDIR)\verify$O $(OBJDIR)\vfile$O $(OBJDIR)\wiki$O $(OBJDIR)\wikiformat$O $(OBJDIR)\winfile$O $(OBJDIR)\winhttp$O $(OBJDIR)\wysiwyg$O $(OBJDIR)\xfer$O $(OBJDIR)\xfersetup$O $(OBJDIR)\zip$O $(OBJDIR)\shell$O $(OBJDIR)\sqlite3$O $(OBJDIR)\th$O $(OBJDIR)\th_lang$O
36
37
38 RC=$(DMDIR)\bin\rcc
39 RCFLAGS=-32 -w1 -I$(SRCDIR) /D__DMC__
40
@@ -49,11 +49,11 @@
49
50 $(OBJDIR)\fossil.res: $B\win\fossil.rc
51 $(RC) $(RCFLAGS) -o$@ $**
52
53 $(OBJDIR)\link: $B\win\Makefile.dmc $(OBJDIR)\fossil.res
54 +echo add allrepo attach bag bisect blob branch browse builtin bundle cache captcha cgi checkin checkout clearsign clone comformat configure content db delta deltacmd descendants diff diffcmd doc encode event export file finfo foci fusefs glob graph gzip http http_socket http_ssl http_transport import info json json_artifact json_branch json_config json_diff json_dir json_finfo json_login json_query json_report json_status json_tag json_timeline json_user json_wiki leaf loadctrl login lookslike main manifest markdown markdown_html md5 merge merge3 moderate name path pivot popen pqueue printf publish purge rebuild regexp report rss schema search setup sha1 shun skins sqlcmd stash stat style sync tag tar th_main timeline tkt tktsetup undo unicode update url user utf8 util verify vfile wiki wikiformat winfile winhttp wysiwyg xfer xfersetup zip shell sqlite3 th th_lang > $@
55 +echo fossil >> $@
56 +echo fossil >> $@
57 +echo $(LIBS) >> $@
58 +echo. >> $@
59 +echo fossil >> $@
@@ -176,10 +176,16 @@
176 $(OBJDIR)\builtin$O : builtin_.c builtin.h
177 $(TCC) -o$@ -c builtin_.c
178
179 builtin_.c : $(SRCDIR)\builtin.c
180 +translate$E $** > $@
181
182 $(OBJDIR)\bundle$O : bundle_.c bundle.h
183 $(TCC) -o$@ -c bundle_.c
184
185 bundle_.c : $(SRCDIR)\bundle.c
186 +translate$E $** > $@
187
188 $(OBJDIR)\cache$O : cache_.c cache.h
189 $(TCC) -o$@ -c cache_.c
190
191 cache_.c : $(SRCDIR)\cache.c
@@ -572,10 +578,22 @@
578 $(OBJDIR)\printf$O : printf_.c printf.h
579 $(TCC) -o$@ -c printf_.c
580
581 printf_.c : $(SRCDIR)\printf.c
582 +translate$E $** > $@
583
584 $(OBJDIR)\publish$O : publish_.c publish.h
585 $(TCC) -o$@ -c publish_.c
586
587 publish_.c : $(SRCDIR)\publish.c
588 +translate$E $** > $@
589
590 $(OBJDIR)\purge$O : purge_.c purge.h
591 $(TCC) -o$@ -c purge_.c
592
593 purge_.c : $(SRCDIR)\purge.c
594 +translate$E $** > $@
595
596 $(OBJDIR)\rebuild$O : rebuild_.c rebuild.h
597 $(TCC) -o$@ -c rebuild_.c
598
599 rebuild_.c : $(SRCDIR)\rebuild.c
@@ -802,7 +820,7 @@
820
821 zip_.c : $(SRCDIR)\zip.c
822 +translate$E $** > $@
823
824 headers: makeheaders$E page_index.h builtin_data.h VERSION.h
825 +makeheaders$E add_.c:add.h allrepo_.c:allrepo.h attach_.c:attach.h bag_.c:bag.h bisect_.c:bisect.h blob_.c:blob.h branch_.c:branch.h browse_.c:browse.h builtin_.c:builtin.h bundle_.c:bundle.h cache_.c:cache.h captcha_.c:captcha.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 configure_.c:configure.h content_.c:content.h db_.c:db.h delta_.c:delta.h deltacmd_.c:deltacmd.h descendants_.c:descendants.h diff_.c:diff.h diffcmd_.c:diffcmd.h doc_.c:doc.h encode_.c:encode.h event_.c:event.h export_.c:export.h file_.c:file.h finfo_.c:finfo.h foci_.c:foci.h fusefs_.c:fusefs.h glob_.c:glob.h graph_.c:graph.h gzip_.c:gzip.h http_.c:http.h http_socket_.c:http_socket.h http_ssl_.c:http_ssl.h http_transport_.c:http_transport.h import_.c:import.h info_.c:info.h json_.c:json.h json_artifact_.c:json_artifact.h json_branch_.c:json_branch.h json_config_.c:json_config.h json_diff_.c:json_diff.h json_dir_.c:json_dir.h json_finfo_.c:json_finfo.h json_login_.c:json_login.h json_query_.c:json_query.h json_report_.c:json_report.h json_status_.c:json_status.h json_tag_.c:json_tag.h json_timeline_.c:json_timeline.h json_user_.c:json_user.h json_wiki_.c:json_wiki.h leaf_.c:leaf.h loadctrl_.c:loadctrl.h login_.c:login.h lookslike_.c:lookslike.h main_.c:main.h manifest_.c:manifest.h markdown_.c:markdown.h markdown_html_.c:markdown_html.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h moderate_.c:moderate.h name_.c:name.h path_.c:path.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h publish_.c:publish.h purge_.c:purge.h rebuild_.c:rebuild.h regexp_.c:regexp.h report_.c:report.h rss_.c:rss.h schema_.c:schema.h search_.c:search.h setup_.c:setup.h sha1_.c:sha1.h shun_.c:shun.h skins_.c:skins.h sqlcmd_.c:sqlcmd.h stash_.c:stash.h stat_.c:stat.h style_.c:style.h sync_.c:sync.h tag_.c:tag.h tar_.c:tar.h th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h unicode_.c:unicode.h update_.c:update.h url_.c:url.h user_.c:user.h utf8_.c:utf8.h util_.c:util.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winfile_.c:winfile.h winhttp_.c:winhttp.h wysiwyg_.c:wysiwyg.h xfer_.c:xfer.h xfersetup_.c:xfersetup.h zip_.c:zip.h $(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h $(SRCDIR)\cson_amalgamation.h
826 @copy /Y nul: headers
827
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -357,10 +357,11 @@
357357
$(SRCDIR)/bisect.c \
358358
$(SRCDIR)/blob.c \
359359
$(SRCDIR)/branch.c \
360360
$(SRCDIR)/browse.c \
361361
$(SRCDIR)/builtin.c \
362
+ $(SRCDIR)/bundle.c \
362363
$(SRCDIR)/cache.c \
363364
$(SRCDIR)/captcha.c \
364365
$(SRCDIR)/cgi.c \
365366
$(SRCDIR)/checkin.c \
366367
$(SRCDIR)/checkout.c \
@@ -423,10 +424,12 @@
423424
$(SRCDIR)/path.c \
424425
$(SRCDIR)/pivot.c \
425426
$(SRCDIR)/popen.c \
426427
$(SRCDIR)/pqueue.c \
427428
$(SRCDIR)/printf.c \
429
+ $(SRCDIR)/publish.c \
430
+ $(SRCDIR)/purge.c \
428431
$(SRCDIR)/rebuild.c \
429432
$(SRCDIR)/regexp.c \
430433
$(SRCDIR)/report.c \
431434
$(SRCDIR)/rss.c \
432435
$(SRCDIR)/schema.c \
@@ -475,10 +478,11 @@
475478
$(OBJDIR)/bisect_.c \
476479
$(OBJDIR)/blob_.c \
477480
$(OBJDIR)/branch_.c \
478481
$(OBJDIR)/browse_.c \
479482
$(OBJDIR)/builtin_.c \
483
+ $(OBJDIR)/bundle_.c \
480484
$(OBJDIR)/cache_.c \
481485
$(OBJDIR)/captcha_.c \
482486
$(OBJDIR)/cgi_.c \
483487
$(OBJDIR)/checkin_.c \
484488
$(OBJDIR)/checkout_.c \
@@ -541,10 +545,12 @@
541545
$(OBJDIR)/path_.c \
542546
$(OBJDIR)/pivot_.c \
543547
$(OBJDIR)/popen_.c \
544548
$(OBJDIR)/pqueue_.c \
545549
$(OBJDIR)/printf_.c \
550
+ $(OBJDIR)/publish_.c \
551
+ $(OBJDIR)/purge_.c \
546552
$(OBJDIR)/rebuild_.c \
547553
$(OBJDIR)/regexp_.c \
548554
$(OBJDIR)/report_.c \
549555
$(OBJDIR)/rss_.c \
550556
$(OBJDIR)/schema_.c \
@@ -590,10 +596,11 @@
590596
$(OBJDIR)/bisect.o \
591597
$(OBJDIR)/blob.o \
592598
$(OBJDIR)/branch.o \
593599
$(OBJDIR)/browse.o \
594600
$(OBJDIR)/builtin.o \
601
+ $(OBJDIR)/bundle.o \
595602
$(OBJDIR)/cache.o \
596603
$(OBJDIR)/captcha.o \
597604
$(OBJDIR)/cgi.o \
598605
$(OBJDIR)/checkin.o \
599606
$(OBJDIR)/checkout.o \
@@ -656,10 +663,12 @@
656663
$(OBJDIR)/path.o \
657664
$(OBJDIR)/pivot.o \
658665
$(OBJDIR)/popen.o \
659666
$(OBJDIR)/pqueue.o \
660667
$(OBJDIR)/printf.o \
668
+ $(OBJDIR)/publish.o \
669
+ $(OBJDIR)/purge.o \
661670
$(OBJDIR)/rebuild.o \
662671
$(OBJDIR)/regexp.o \
663672
$(OBJDIR)/report.o \
664673
$(OBJDIR)/rss.o \
665674
$(OBJDIR)/schema.o \
@@ -898,10 +907,11 @@
898907
$(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h \
899908
$(OBJDIR)/blob_.c:$(OBJDIR)/blob.h \
900909
$(OBJDIR)/branch_.c:$(OBJDIR)/branch.h \
901910
$(OBJDIR)/browse_.c:$(OBJDIR)/browse.h \
902911
$(OBJDIR)/builtin_.c:$(OBJDIR)/builtin.h \
912
+ $(OBJDIR)/bundle_.c:$(OBJDIR)/bundle.h \
903913
$(OBJDIR)/cache_.c:$(OBJDIR)/cache.h \
904914
$(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h \
905915
$(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h \
906916
$(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h \
907917
$(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h \
@@ -964,10 +974,12 @@
964974
$(OBJDIR)/path_.c:$(OBJDIR)/path.h \
965975
$(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h \
966976
$(OBJDIR)/popen_.c:$(OBJDIR)/popen.h \
967977
$(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h \
968978
$(OBJDIR)/printf_.c:$(OBJDIR)/printf.h \
979
+ $(OBJDIR)/publish_.c:$(OBJDIR)/publish.h \
980
+ $(OBJDIR)/purge_.c:$(OBJDIR)/purge.h \
969981
$(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h \
970982
$(OBJDIR)/regexp_.c:$(OBJDIR)/regexp.h \
971983
$(OBJDIR)/report_.c:$(OBJDIR)/report.h \
972984
$(OBJDIR)/rss_.c:$(OBJDIR)/rss.h \
973985
$(OBJDIR)/schema_.c:$(OBJDIR)/schema.h \
@@ -1082,10 +1094,18 @@
10821094
10831095
$(OBJDIR)/builtin.o: $(OBJDIR)/builtin_.c $(OBJDIR)/builtin.h $(OBJDIR)/builtin_data.h $(SRCDIR)/config.h
10841096
$(XTCC) -o $(OBJDIR)/builtin.o -c $(OBJDIR)/builtin_.c
10851097
10861098
$(OBJDIR)/builtin.h: $(OBJDIR)/headers
1099
+
1100
+$(OBJDIR)/bundle_.c: $(SRCDIR)/bundle.c $(TRANSLATE)
1101
+ $(TRANSLATE) $(SRCDIR)/bundle.c >$@
1102
+
1103
+$(OBJDIR)/bundle.o: $(OBJDIR)/bundle_.c $(OBJDIR)/bundle.h $(SRCDIR)/config.h
1104
+ $(XTCC) -o $(OBJDIR)/bundle.o -c $(OBJDIR)/bundle_.c
1105
+
1106
+$(OBJDIR)/bundle.h: $(OBJDIR)/headers
10871107
10881108
$(OBJDIR)/cache_.c: $(SRCDIR)/cache.c $(TRANSLATE)
10891109
$(TRANSLATE) $(SRCDIR)/cache.c >$@
10901110
10911111
$(OBJDIR)/cache.o: $(OBJDIR)/cache_.c $(OBJDIR)/cache.h $(SRCDIR)/config.h
@@ -1610,10 +1630,26 @@
16101630
16111631
$(OBJDIR)/printf.o: $(OBJDIR)/printf_.c $(OBJDIR)/printf.h $(SRCDIR)/config.h
16121632
$(XTCC) -o $(OBJDIR)/printf.o -c $(OBJDIR)/printf_.c
16131633
16141634
$(OBJDIR)/printf.h: $(OBJDIR)/headers
1635
+
1636
+$(OBJDIR)/publish_.c: $(SRCDIR)/publish.c $(TRANSLATE)
1637
+ $(TRANSLATE) $(SRCDIR)/publish.c >$@
1638
+
1639
+$(OBJDIR)/publish.o: $(OBJDIR)/publish_.c $(OBJDIR)/publish.h $(SRCDIR)/config.h
1640
+ $(XTCC) -o $(OBJDIR)/publish.o -c $(OBJDIR)/publish_.c
1641
+
1642
+$(OBJDIR)/publish.h: $(OBJDIR)/headers
1643
+
1644
+$(OBJDIR)/purge_.c: $(SRCDIR)/purge.c $(TRANSLATE)
1645
+ $(TRANSLATE) $(SRCDIR)/purge.c >$@
1646
+
1647
+$(OBJDIR)/purge.o: $(OBJDIR)/purge_.c $(OBJDIR)/purge.h $(SRCDIR)/config.h
1648
+ $(XTCC) -o $(OBJDIR)/purge.o -c $(OBJDIR)/purge_.c
1649
+
1650
+$(OBJDIR)/purge.h: $(OBJDIR)/headers
16151651
16161652
$(OBJDIR)/rebuild_.c: $(SRCDIR)/rebuild.c $(TRANSLATE)
16171653
$(TRANSLATE) $(SRCDIR)/rebuild.c >$@
16181654
16191655
$(OBJDIR)/rebuild.o: $(OBJDIR)/rebuild_.c $(OBJDIR)/rebuild.h $(SRCDIR)/config.h
16201656
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -357,10 +357,11 @@
357 $(SRCDIR)/bisect.c \
358 $(SRCDIR)/blob.c \
359 $(SRCDIR)/branch.c \
360 $(SRCDIR)/browse.c \
361 $(SRCDIR)/builtin.c \
 
362 $(SRCDIR)/cache.c \
363 $(SRCDIR)/captcha.c \
364 $(SRCDIR)/cgi.c \
365 $(SRCDIR)/checkin.c \
366 $(SRCDIR)/checkout.c \
@@ -423,10 +424,12 @@
423 $(SRCDIR)/path.c \
424 $(SRCDIR)/pivot.c \
425 $(SRCDIR)/popen.c \
426 $(SRCDIR)/pqueue.c \
427 $(SRCDIR)/printf.c \
 
 
428 $(SRCDIR)/rebuild.c \
429 $(SRCDIR)/regexp.c \
430 $(SRCDIR)/report.c \
431 $(SRCDIR)/rss.c \
432 $(SRCDIR)/schema.c \
@@ -475,10 +478,11 @@
475 $(OBJDIR)/bisect_.c \
476 $(OBJDIR)/blob_.c \
477 $(OBJDIR)/branch_.c \
478 $(OBJDIR)/browse_.c \
479 $(OBJDIR)/builtin_.c \
 
480 $(OBJDIR)/cache_.c \
481 $(OBJDIR)/captcha_.c \
482 $(OBJDIR)/cgi_.c \
483 $(OBJDIR)/checkin_.c \
484 $(OBJDIR)/checkout_.c \
@@ -541,10 +545,12 @@
541 $(OBJDIR)/path_.c \
542 $(OBJDIR)/pivot_.c \
543 $(OBJDIR)/popen_.c \
544 $(OBJDIR)/pqueue_.c \
545 $(OBJDIR)/printf_.c \
 
 
546 $(OBJDIR)/rebuild_.c \
547 $(OBJDIR)/regexp_.c \
548 $(OBJDIR)/report_.c \
549 $(OBJDIR)/rss_.c \
550 $(OBJDIR)/schema_.c \
@@ -590,10 +596,11 @@
590 $(OBJDIR)/bisect.o \
591 $(OBJDIR)/blob.o \
592 $(OBJDIR)/branch.o \
593 $(OBJDIR)/browse.o \
594 $(OBJDIR)/builtin.o \
 
595 $(OBJDIR)/cache.o \
596 $(OBJDIR)/captcha.o \
597 $(OBJDIR)/cgi.o \
598 $(OBJDIR)/checkin.o \
599 $(OBJDIR)/checkout.o \
@@ -656,10 +663,12 @@
656 $(OBJDIR)/path.o \
657 $(OBJDIR)/pivot.o \
658 $(OBJDIR)/popen.o \
659 $(OBJDIR)/pqueue.o \
660 $(OBJDIR)/printf.o \
 
 
661 $(OBJDIR)/rebuild.o \
662 $(OBJDIR)/regexp.o \
663 $(OBJDIR)/report.o \
664 $(OBJDIR)/rss.o \
665 $(OBJDIR)/schema.o \
@@ -898,10 +907,11 @@
898 $(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h \
899 $(OBJDIR)/blob_.c:$(OBJDIR)/blob.h \
900 $(OBJDIR)/branch_.c:$(OBJDIR)/branch.h \
901 $(OBJDIR)/browse_.c:$(OBJDIR)/browse.h \
902 $(OBJDIR)/builtin_.c:$(OBJDIR)/builtin.h \
 
903 $(OBJDIR)/cache_.c:$(OBJDIR)/cache.h \
904 $(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h \
905 $(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h \
906 $(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h \
907 $(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h \
@@ -964,10 +974,12 @@
964 $(OBJDIR)/path_.c:$(OBJDIR)/path.h \
965 $(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h \
966 $(OBJDIR)/popen_.c:$(OBJDIR)/popen.h \
967 $(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h \
968 $(OBJDIR)/printf_.c:$(OBJDIR)/printf.h \
 
 
969 $(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h \
970 $(OBJDIR)/regexp_.c:$(OBJDIR)/regexp.h \
971 $(OBJDIR)/report_.c:$(OBJDIR)/report.h \
972 $(OBJDIR)/rss_.c:$(OBJDIR)/rss.h \
973 $(OBJDIR)/schema_.c:$(OBJDIR)/schema.h \
@@ -1082,10 +1094,18 @@
1082
1083 $(OBJDIR)/builtin.o: $(OBJDIR)/builtin_.c $(OBJDIR)/builtin.h $(OBJDIR)/builtin_data.h $(SRCDIR)/config.h
1084 $(XTCC) -o $(OBJDIR)/builtin.o -c $(OBJDIR)/builtin_.c
1085
1086 $(OBJDIR)/builtin.h: $(OBJDIR)/headers
 
 
 
 
 
 
 
 
1087
1088 $(OBJDIR)/cache_.c: $(SRCDIR)/cache.c $(TRANSLATE)
1089 $(TRANSLATE) $(SRCDIR)/cache.c >$@
1090
1091 $(OBJDIR)/cache.o: $(OBJDIR)/cache_.c $(OBJDIR)/cache.h $(SRCDIR)/config.h
@@ -1610,10 +1630,26 @@
1610
1611 $(OBJDIR)/printf.o: $(OBJDIR)/printf_.c $(OBJDIR)/printf.h $(SRCDIR)/config.h
1612 $(XTCC) -o $(OBJDIR)/printf.o -c $(OBJDIR)/printf_.c
1613
1614 $(OBJDIR)/printf.h: $(OBJDIR)/headers
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1615
1616 $(OBJDIR)/rebuild_.c: $(SRCDIR)/rebuild.c $(TRANSLATE)
1617 $(TRANSLATE) $(SRCDIR)/rebuild.c >$@
1618
1619 $(OBJDIR)/rebuild.o: $(OBJDIR)/rebuild_.c $(OBJDIR)/rebuild.h $(SRCDIR)/config.h
1620
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -357,10 +357,11 @@
357 $(SRCDIR)/bisect.c \
358 $(SRCDIR)/blob.c \
359 $(SRCDIR)/branch.c \
360 $(SRCDIR)/browse.c \
361 $(SRCDIR)/builtin.c \
362 $(SRCDIR)/bundle.c \
363 $(SRCDIR)/cache.c \
364 $(SRCDIR)/captcha.c \
365 $(SRCDIR)/cgi.c \
366 $(SRCDIR)/checkin.c \
367 $(SRCDIR)/checkout.c \
@@ -423,10 +424,12 @@
424 $(SRCDIR)/path.c \
425 $(SRCDIR)/pivot.c \
426 $(SRCDIR)/popen.c \
427 $(SRCDIR)/pqueue.c \
428 $(SRCDIR)/printf.c \
429 $(SRCDIR)/publish.c \
430 $(SRCDIR)/purge.c \
431 $(SRCDIR)/rebuild.c \
432 $(SRCDIR)/regexp.c \
433 $(SRCDIR)/report.c \
434 $(SRCDIR)/rss.c \
435 $(SRCDIR)/schema.c \
@@ -475,10 +478,11 @@
478 $(OBJDIR)/bisect_.c \
479 $(OBJDIR)/blob_.c \
480 $(OBJDIR)/branch_.c \
481 $(OBJDIR)/browse_.c \
482 $(OBJDIR)/builtin_.c \
483 $(OBJDIR)/bundle_.c \
484 $(OBJDIR)/cache_.c \
485 $(OBJDIR)/captcha_.c \
486 $(OBJDIR)/cgi_.c \
487 $(OBJDIR)/checkin_.c \
488 $(OBJDIR)/checkout_.c \
@@ -541,10 +545,12 @@
545 $(OBJDIR)/path_.c \
546 $(OBJDIR)/pivot_.c \
547 $(OBJDIR)/popen_.c \
548 $(OBJDIR)/pqueue_.c \
549 $(OBJDIR)/printf_.c \
550 $(OBJDIR)/publish_.c \
551 $(OBJDIR)/purge_.c \
552 $(OBJDIR)/rebuild_.c \
553 $(OBJDIR)/regexp_.c \
554 $(OBJDIR)/report_.c \
555 $(OBJDIR)/rss_.c \
556 $(OBJDIR)/schema_.c \
@@ -590,10 +596,11 @@
596 $(OBJDIR)/bisect.o \
597 $(OBJDIR)/blob.o \
598 $(OBJDIR)/branch.o \
599 $(OBJDIR)/browse.o \
600 $(OBJDIR)/builtin.o \
601 $(OBJDIR)/bundle.o \
602 $(OBJDIR)/cache.o \
603 $(OBJDIR)/captcha.o \
604 $(OBJDIR)/cgi.o \
605 $(OBJDIR)/checkin.o \
606 $(OBJDIR)/checkout.o \
@@ -656,10 +663,12 @@
663 $(OBJDIR)/path.o \
664 $(OBJDIR)/pivot.o \
665 $(OBJDIR)/popen.o \
666 $(OBJDIR)/pqueue.o \
667 $(OBJDIR)/printf.o \
668 $(OBJDIR)/publish.o \
669 $(OBJDIR)/purge.o \
670 $(OBJDIR)/rebuild.o \
671 $(OBJDIR)/regexp.o \
672 $(OBJDIR)/report.o \
673 $(OBJDIR)/rss.o \
674 $(OBJDIR)/schema.o \
@@ -898,10 +907,11 @@
907 $(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h \
908 $(OBJDIR)/blob_.c:$(OBJDIR)/blob.h \
909 $(OBJDIR)/branch_.c:$(OBJDIR)/branch.h \
910 $(OBJDIR)/browse_.c:$(OBJDIR)/browse.h \
911 $(OBJDIR)/builtin_.c:$(OBJDIR)/builtin.h \
912 $(OBJDIR)/bundle_.c:$(OBJDIR)/bundle.h \
913 $(OBJDIR)/cache_.c:$(OBJDIR)/cache.h \
914 $(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h \
915 $(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h \
916 $(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h \
917 $(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h \
@@ -964,10 +974,12 @@
974 $(OBJDIR)/path_.c:$(OBJDIR)/path.h \
975 $(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h \
976 $(OBJDIR)/popen_.c:$(OBJDIR)/popen.h \
977 $(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h \
978 $(OBJDIR)/printf_.c:$(OBJDIR)/printf.h \
979 $(OBJDIR)/publish_.c:$(OBJDIR)/publish.h \
980 $(OBJDIR)/purge_.c:$(OBJDIR)/purge.h \
981 $(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h \
982 $(OBJDIR)/regexp_.c:$(OBJDIR)/regexp.h \
983 $(OBJDIR)/report_.c:$(OBJDIR)/report.h \
984 $(OBJDIR)/rss_.c:$(OBJDIR)/rss.h \
985 $(OBJDIR)/schema_.c:$(OBJDIR)/schema.h \
@@ -1082,10 +1094,18 @@
1094
1095 $(OBJDIR)/builtin.o: $(OBJDIR)/builtin_.c $(OBJDIR)/builtin.h $(OBJDIR)/builtin_data.h $(SRCDIR)/config.h
1096 $(XTCC) -o $(OBJDIR)/builtin.o -c $(OBJDIR)/builtin_.c
1097
1098 $(OBJDIR)/builtin.h: $(OBJDIR)/headers
1099
1100 $(OBJDIR)/bundle_.c: $(SRCDIR)/bundle.c $(TRANSLATE)
1101 $(TRANSLATE) $(SRCDIR)/bundle.c >$@
1102
1103 $(OBJDIR)/bundle.o: $(OBJDIR)/bundle_.c $(OBJDIR)/bundle.h $(SRCDIR)/config.h
1104 $(XTCC) -o $(OBJDIR)/bundle.o -c $(OBJDIR)/bundle_.c
1105
1106 $(OBJDIR)/bundle.h: $(OBJDIR)/headers
1107
1108 $(OBJDIR)/cache_.c: $(SRCDIR)/cache.c $(TRANSLATE)
1109 $(TRANSLATE) $(SRCDIR)/cache.c >$@
1110
1111 $(OBJDIR)/cache.o: $(OBJDIR)/cache_.c $(OBJDIR)/cache.h $(SRCDIR)/config.h
@@ -1610,10 +1630,26 @@
1630
1631 $(OBJDIR)/printf.o: $(OBJDIR)/printf_.c $(OBJDIR)/printf.h $(SRCDIR)/config.h
1632 $(XTCC) -o $(OBJDIR)/printf.o -c $(OBJDIR)/printf_.c
1633
1634 $(OBJDIR)/printf.h: $(OBJDIR)/headers
1635
1636 $(OBJDIR)/publish_.c: $(SRCDIR)/publish.c $(TRANSLATE)
1637 $(TRANSLATE) $(SRCDIR)/publish.c >$@
1638
1639 $(OBJDIR)/publish.o: $(OBJDIR)/publish_.c $(OBJDIR)/publish.h $(SRCDIR)/config.h
1640 $(XTCC) -o $(OBJDIR)/publish.o -c $(OBJDIR)/publish_.c
1641
1642 $(OBJDIR)/publish.h: $(OBJDIR)/headers
1643
1644 $(OBJDIR)/purge_.c: $(SRCDIR)/purge.c $(TRANSLATE)
1645 $(TRANSLATE) $(SRCDIR)/purge.c >$@
1646
1647 $(OBJDIR)/purge.o: $(OBJDIR)/purge_.c $(OBJDIR)/purge.h $(SRCDIR)/config.h
1648 $(XTCC) -o $(OBJDIR)/purge.o -c $(OBJDIR)/purge_.c
1649
1650 $(OBJDIR)/purge.h: $(OBJDIR)/headers
1651
1652 $(OBJDIR)/rebuild_.c: $(SRCDIR)/rebuild.c $(TRANSLATE)
1653 $(TRANSLATE) $(SRCDIR)/rebuild.c >$@
1654
1655 $(OBJDIR)/rebuild.o: $(OBJDIR)/rebuild_.c $(OBJDIR)/rebuild.h $(SRCDIR)/config.h
1656
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -357,10 +357,11 @@
357357
$(SRCDIR)/bisect.c \
358358
$(SRCDIR)/blob.c \
359359
$(SRCDIR)/branch.c \
360360
$(SRCDIR)/browse.c \
361361
$(SRCDIR)/builtin.c \
362
+ $(SRCDIR)/bundle.c \
362363
$(SRCDIR)/cache.c \
363364
$(SRCDIR)/captcha.c \
364365
$(SRCDIR)/cgi.c \
365366
$(SRCDIR)/checkin.c \
366367
$(SRCDIR)/checkout.c \
@@ -423,10 +424,12 @@
423424
$(SRCDIR)/path.c \
424425
$(SRCDIR)/pivot.c \
425426
$(SRCDIR)/popen.c \
426427
$(SRCDIR)/pqueue.c \
427428
$(SRCDIR)/printf.c \
429
+ $(SRCDIR)/publish.c \
430
+ $(SRCDIR)/purge.c \
428431
$(SRCDIR)/rebuild.c \
429432
$(SRCDIR)/regexp.c \
430433
$(SRCDIR)/report.c \
431434
$(SRCDIR)/rss.c \
432435
$(SRCDIR)/schema.c \
@@ -475,10 +478,11 @@
475478
$(OBJDIR)/bisect_.c \
476479
$(OBJDIR)/blob_.c \
477480
$(OBJDIR)/branch_.c \
478481
$(OBJDIR)/browse_.c \
479482
$(OBJDIR)/builtin_.c \
483
+ $(OBJDIR)/bundle_.c \
480484
$(OBJDIR)/cache_.c \
481485
$(OBJDIR)/captcha_.c \
482486
$(OBJDIR)/cgi_.c \
483487
$(OBJDIR)/checkin_.c \
484488
$(OBJDIR)/checkout_.c \
@@ -541,10 +545,12 @@
541545
$(OBJDIR)/path_.c \
542546
$(OBJDIR)/pivot_.c \
543547
$(OBJDIR)/popen_.c \
544548
$(OBJDIR)/pqueue_.c \
545549
$(OBJDIR)/printf_.c \
550
+ $(OBJDIR)/publish_.c \
551
+ $(OBJDIR)/purge_.c \
546552
$(OBJDIR)/rebuild_.c \
547553
$(OBJDIR)/regexp_.c \
548554
$(OBJDIR)/report_.c \
549555
$(OBJDIR)/rss_.c \
550556
$(OBJDIR)/schema_.c \
@@ -590,10 +596,11 @@
590596
$(OBJDIR)/bisect.o \
591597
$(OBJDIR)/blob.o \
592598
$(OBJDIR)/branch.o \
593599
$(OBJDIR)/browse.o \
594600
$(OBJDIR)/builtin.o \
601
+ $(OBJDIR)/bundle.o \
595602
$(OBJDIR)/cache.o \
596603
$(OBJDIR)/captcha.o \
597604
$(OBJDIR)/cgi.o \
598605
$(OBJDIR)/checkin.o \
599606
$(OBJDIR)/checkout.o \
@@ -656,10 +663,12 @@
656663
$(OBJDIR)/path.o \
657664
$(OBJDIR)/pivot.o \
658665
$(OBJDIR)/popen.o \
659666
$(OBJDIR)/pqueue.o \
660667
$(OBJDIR)/printf.o \
668
+ $(OBJDIR)/publish.o \
669
+ $(OBJDIR)/purge.o \
661670
$(OBJDIR)/rebuild.o \
662671
$(OBJDIR)/regexp.o \
663672
$(OBJDIR)/report.o \
664673
$(OBJDIR)/rss.o \
665674
$(OBJDIR)/schema.o \
@@ -898,10 +907,11 @@
898907
$(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h \
899908
$(OBJDIR)/blob_.c:$(OBJDIR)/blob.h \
900909
$(OBJDIR)/branch_.c:$(OBJDIR)/branch.h \
901910
$(OBJDIR)/browse_.c:$(OBJDIR)/browse.h \
902911
$(OBJDIR)/builtin_.c:$(OBJDIR)/builtin.h \
912
+ $(OBJDIR)/bundle_.c:$(OBJDIR)/bundle.h \
903913
$(OBJDIR)/cache_.c:$(OBJDIR)/cache.h \
904914
$(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h \
905915
$(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h \
906916
$(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h \
907917
$(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h \
@@ -964,10 +974,12 @@
964974
$(OBJDIR)/path_.c:$(OBJDIR)/path.h \
965975
$(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h \
966976
$(OBJDIR)/popen_.c:$(OBJDIR)/popen.h \
967977
$(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h \
968978
$(OBJDIR)/printf_.c:$(OBJDIR)/printf.h \
979
+ $(OBJDIR)/publish_.c:$(OBJDIR)/publish.h \
980
+ $(OBJDIR)/purge_.c:$(OBJDIR)/purge.h \
969981
$(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h \
970982
$(OBJDIR)/regexp_.c:$(OBJDIR)/regexp.h \
971983
$(OBJDIR)/report_.c:$(OBJDIR)/report.h \
972984
$(OBJDIR)/rss_.c:$(OBJDIR)/rss.h \
973985
$(OBJDIR)/schema_.c:$(OBJDIR)/schema.h \
@@ -1082,10 +1094,18 @@
10821094
10831095
$(OBJDIR)/builtin.o: $(OBJDIR)/builtin_.c $(OBJDIR)/builtin.h $(OBJDIR)/builtin_data.h $(SRCDIR)/config.h
10841096
$(XTCC) -o $(OBJDIR)/builtin.o -c $(OBJDIR)/builtin_.c
10851097
10861098
$(OBJDIR)/builtin.h: $(OBJDIR)/headers
1099
+
1100
+$(OBJDIR)/bundle_.c: $(SRCDIR)/bundle.c $(TRANSLATE)
1101
+ $(TRANSLATE) $(SRCDIR)/bundle.c >$@
1102
+
1103
+$(OBJDIR)/bundle.o: $(OBJDIR)/bundle_.c $(OBJDIR)/bundle.h $(SRCDIR)/config.h
1104
+ $(XTCC) -o $(OBJDIR)/bundle.o -c $(OBJDIR)/bundle_.c
1105
+
1106
+$(OBJDIR)/bundle.h: $(OBJDIR)/headers
10871107
10881108
$(OBJDIR)/cache_.c: $(SRCDIR)/cache.c $(TRANSLATE)
10891109
$(TRANSLATE) $(SRCDIR)/cache.c >$@
10901110
10911111
$(OBJDIR)/cache.o: $(OBJDIR)/cache_.c $(OBJDIR)/cache.h $(SRCDIR)/config.h
@@ -1610,10 +1630,26 @@
16101630
16111631
$(OBJDIR)/printf.o: $(OBJDIR)/printf_.c $(OBJDIR)/printf.h $(SRCDIR)/config.h
16121632
$(XTCC) -o $(OBJDIR)/printf.o -c $(OBJDIR)/printf_.c
16131633
16141634
$(OBJDIR)/printf.h: $(OBJDIR)/headers
1635
+
1636
+$(OBJDIR)/publish_.c: $(SRCDIR)/publish.c $(TRANSLATE)
1637
+ $(TRANSLATE) $(SRCDIR)/publish.c >$@
1638
+
1639
+$(OBJDIR)/publish.o: $(OBJDIR)/publish_.c $(OBJDIR)/publish.h $(SRCDIR)/config.h
1640
+ $(XTCC) -o $(OBJDIR)/publish.o -c $(OBJDIR)/publish_.c
1641
+
1642
+$(OBJDIR)/publish.h: $(OBJDIR)/headers
1643
+
1644
+$(OBJDIR)/purge_.c: $(SRCDIR)/purge.c $(TRANSLATE)
1645
+ $(TRANSLATE) $(SRCDIR)/purge.c >$@
1646
+
1647
+$(OBJDIR)/purge.o: $(OBJDIR)/purge_.c $(OBJDIR)/purge.h $(SRCDIR)/config.h
1648
+ $(XTCC) -o $(OBJDIR)/purge.o -c $(OBJDIR)/purge_.c
1649
+
1650
+$(OBJDIR)/purge.h: $(OBJDIR)/headers
16151651
16161652
$(OBJDIR)/rebuild_.c: $(SRCDIR)/rebuild.c $(TRANSLATE)
16171653
$(TRANSLATE) $(SRCDIR)/rebuild.c >$@
16181654
16191655
$(OBJDIR)/rebuild.o: $(OBJDIR)/rebuild_.c $(OBJDIR)/rebuild.h $(SRCDIR)/config.h
16201656
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -357,10 +357,11 @@
357 $(SRCDIR)/bisect.c \
358 $(SRCDIR)/blob.c \
359 $(SRCDIR)/branch.c \
360 $(SRCDIR)/browse.c \
361 $(SRCDIR)/builtin.c \
 
362 $(SRCDIR)/cache.c \
363 $(SRCDIR)/captcha.c \
364 $(SRCDIR)/cgi.c \
365 $(SRCDIR)/checkin.c \
366 $(SRCDIR)/checkout.c \
@@ -423,10 +424,12 @@
423 $(SRCDIR)/path.c \
424 $(SRCDIR)/pivot.c \
425 $(SRCDIR)/popen.c \
426 $(SRCDIR)/pqueue.c \
427 $(SRCDIR)/printf.c \
 
 
428 $(SRCDIR)/rebuild.c \
429 $(SRCDIR)/regexp.c \
430 $(SRCDIR)/report.c \
431 $(SRCDIR)/rss.c \
432 $(SRCDIR)/schema.c \
@@ -475,10 +478,11 @@
475 $(OBJDIR)/bisect_.c \
476 $(OBJDIR)/blob_.c \
477 $(OBJDIR)/branch_.c \
478 $(OBJDIR)/browse_.c \
479 $(OBJDIR)/builtin_.c \
 
480 $(OBJDIR)/cache_.c \
481 $(OBJDIR)/captcha_.c \
482 $(OBJDIR)/cgi_.c \
483 $(OBJDIR)/checkin_.c \
484 $(OBJDIR)/checkout_.c \
@@ -541,10 +545,12 @@
541 $(OBJDIR)/path_.c \
542 $(OBJDIR)/pivot_.c \
543 $(OBJDIR)/popen_.c \
544 $(OBJDIR)/pqueue_.c \
545 $(OBJDIR)/printf_.c \
 
 
546 $(OBJDIR)/rebuild_.c \
547 $(OBJDIR)/regexp_.c \
548 $(OBJDIR)/report_.c \
549 $(OBJDIR)/rss_.c \
550 $(OBJDIR)/schema_.c \
@@ -590,10 +596,11 @@
590 $(OBJDIR)/bisect.o \
591 $(OBJDIR)/blob.o \
592 $(OBJDIR)/branch.o \
593 $(OBJDIR)/browse.o \
594 $(OBJDIR)/builtin.o \
 
595 $(OBJDIR)/cache.o \
596 $(OBJDIR)/captcha.o \
597 $(OBJDIR)/cgi.o \
598 $(OBJDIR)/checkin.o \
599 $(OBJDIR)/checkout.o \
@@ -656,10 +663,12 @@
656 $(OBJDIR)/path.o \
657 $(OBJDIR)/pivot.o \
658 $(OBJDIR)/popen.o \
659 $(OBJDIR)/pqueue.o \
660 $(OBJDIR)/printf.o \
 
 
661 $(OBJDIR)/rebuild.o \
662 $(OBJDIR)/regexp.o \
663 $(OBJDIR)/report.o \
664 $(OBJDIR)/rss.o \
665 $(OBJDIR)/schema.o \
@@ -898,10 +907,11 @@
898 $(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h \
899 $(OBJDIR)/blob_.c:$(OBJDIR)/blob.h \
900 $(OBJDIR)/branch_.c:$(OBJDIR)/branch.h \
901 $(OBJDIR)/browse_.c:$(OBJDIR)/browse.h \
902 $(OBJDIR)/builtin_.c:$(OBJDIR)/builtin.h \
 
903 $(OBJDIR)/cache_.c:$(OBJDIR)/cache.h \
904 $(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h \
905 $(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h \
906 $(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h \
907 $(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h \
@@ -964,10 +974,12 @@
964 $(OBJDIR)/path_.c:$(OBJDIR)/path.h \
965 $(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h \
966 $(OBJDIR)/popen_.c:$(OBJDIR)/popen.h \
967 $(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h \
968 $(OBJDIR)/printf_.c:$(OBJDIR)/printf.h \
 
 
969 $(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h \
970 $(OBJDIR)/regexp_.c:$(OBJDIR)/regexp.h \
971 $(OBJDIR)/report_.c:$(OBJDIR)/report.h \
972 $(OBJDIR)/rss_.c:$(OBJDIR)/rss.h \
973 $(OBJDIR)/schema_.c:$(OBJDIR)/schema.h \
@@ -1082,10 +1094,18 @@
1082
1083 $(OBJDIR)/builtin.o: $(OBJDIR)/builtin_.c $(OBJDIR)/builtin.h $(OBJDIR)/builtin_data.h $(SRCDIR)/config.h
1084 $(XTCC) -o $(OBJDIR)/builtin.o -c $(OBJDIR)/builtin_.c
1085
1086 $(OBJDIR)/builtin.h: $(OBJDIR)/headers
 
 
 
 
 
 
 
 
1087
1088 $(OBJDIR)/cache_.c: $(SRCDIR)/cache.c $(TRANSLATE)
1089 $(TRANSLATE) $(SRCDIR)/cache.c >$@
1090
1091 $(OBJDIR)/cache.o: $(OBJDIR)/cache_.c $(OBJDIR)/cache.h $(SRCDIR)/config.h
@@ -1610,10 +1630,26 @@
1610
1611 $(OBJDIR)/printf.o: $(OBJDIR)/printf_.c $(OBJDIR)/printf.h $(SRCDIR)/config.h
1612 $(XTCC) -o $(OBJDIR)/printf.o -c $(OBJDIR)/printf_.c
1613
1614 $(OBJDIR)/printf.h: $(OBJDIR)/headers
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1615
1616 $(OBJDIR)/rebuild_.c: $(SRCDIR)/rebuild.c $(TRANSLATE)
1617 $(TRANSLATE) $(SRCDIR)/rebuild.c >$@
1618
1619 $(OBJDIR)/rebuild.o: $(OBJDIR)/rebuild_.c $(OBJDIR)/rebuild.h $(SRCDIR)/config.h
1620
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -357,10 +357,11 @@
357 $(SRCDIR)/bisect.c \
358 $(SRCDIR)/blob.c \
359 $(SRCDIR)/branch.c \
360 $(SRCDIR)/browse.c \
361 $(SRCDIR)/builtin.c \
362 $(SRCDIR)/bundle.c \
363 $(SRCDIR)/cache.c \
364 $(SRCDIR)/captcha.c \
365 $(SRCDIR)/cgi.c \
366 $(SRCDIR)/checkin.c \
367 $(SRCDIR)/checkout.c \
@@ -423,10 +424,12 @@
424 $(SRCDIR)/path.c \
425 $(SRCDIR)/pivot.c \
426 $(SRCDIR)/popen.c \
427 $(SRCDIR)/pqueue.c \
428 $(SRCDIR)/printf.c \
429 $(SRCDIR)/publish.c \
430 $(SRCDIR)/purge.c \
431 $(SRCDIR)/rebuild.c \
432 $(SRCDIR)/regexp.c \
433 $(SRCDIR)/report.c \
434 $(SRCDIR)/rss.c \
435 $(SRCDIR)/schema.c \
@@ -475,10 +478,11 @@
478 $(OBJDIR)/bisect_.c \
479 $(OBJDIR)/blob_.c \
480 $(OBJDIR)/branch_.c \
481 $(OBJDIR)/browse_.c \
482 $(OBJDIR)/builtin_.c \
483 $(OBJDIR)/bundle_.c \
484 $(OBJDIR)/cache_.c \
485 $(OBJDIR)/captcha_.c \
486 $(OBJDIR)/cgi_.c \
487 $(OBJDIR)/checkin_.c \
488 $(OBJDIR)/checkout_.c \
@@ -541,10 +545,12 @@
545 $(OBJDIR)/path_.c \
546 $(OBJDIR)/pivot_.c \
547 $(OBJDIR)/popen_.c \
548 $(OBJDIR)/pqueue_.c \
549 $(OBJDIR)/printf_.c \
550 $(OBJDIR)/publish_.c \
551 $(OBJDIR)/purge_.c \
552 $(OBJDIR)/rebuild_.c \
553 $(OBJDIR)/regexp_.c \
554 $(OBJDIR)/report_.c \
555 $(OBJDIR)/rss_.c \
556 $(OBJDIR)/schema_.c \
@@ -590,10 +596,11 @@
596 $(OBJDIR)/bisect.o \
597 $(OBJDIR)/blob.o \
598 $(OBJDIR)/branch.o \
599 $(OBJDIR)/browse.o \
600 $(OBJDIR)/builtin.o \
601 $(OBJDIR)/bundle.o \
602 $(OBJDIR)/cache.o \
603 $(OBJDIR)/captcha.o \
604 $(OBJDIR)/cgi.o \
605 $(OBJDIR)/checkin.o \
606 $(OBJDIR)/checkout.o \
@@ -656,10 +663,12 @@
663 $(OBJDIR)/path.o \
664 $(OBJDIR)/pivot.o \
665 $(OBJDIR)/popen.o \
666 $(OBJDIR)/pqueue.o \
667 $(OBJDIR)/printf.o \
668 $(OBJDIR)/publish.o \
669 $(OBJDIR)/purge.o \
670 $(OBJDIR)/rebuild.o \
671 $(OBJDIR)/regexp.o \
672 $(OBJDIR)/report.o \
673 $(OBJDIR)/rss.o \
674 $(OBJDIR)/schema.o \
@@ -898,10 +907,11 @@
907 $(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h \
908 $(OBJDIR)/blob_.c:$(OBJDIR)/blob.h \
909 $(OBJDIR)/branch_.c:$(OBJDIR)/branch.h \
910 $(OBJDIR)/browse_.c:$(OBJDIR)/browse.h \
911 $(OBJDIR)/builtin_.c:$(OBJDIR)/builtin.h \
912 $(OBJDIR)/bundle_.c:$(OBJDIR)/bundle.h \
913 $(OBJDIR)/cache_.c:$(OBJDIR)/cache.h \
914 $(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h \
915 $(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h \
916 $(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h \
917 $(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h \
@@ -964,10 +974,12 @@
974 $(OBJDIR)/path_.c:$(OBJDIR)/path.h \
975 $(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h \
976 $(OBJDIR)/popen_.c:$(OBJDIR)/popen.h \
977 $(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h \
978 $(OBJDIR)/printf_.c:$(OBJDIR)/printf.h \
979 $(OBJDIR)/publish_.c:$(OBJDIR)/publish.h \
980 $(OBJDIR)/purge_.c:$(OBJDIR)/purge.h \
981 $(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h \
982 $(OBJDIR)/regexp_.c:$(OBJDIR)/regexp.h \
983 $(OBJDIR)/report_.c:$(OBJDIR)/report.h \
984 $(OBJDIR)/rss_.c:$(OBJDIR)/rss.h \
985 $(OBJDIR)/schema_.c:$(OBJDIR)/schema.h \
@@ -1082,10 +1094,18 @@
1094
1095 $(OBJDIR)/builtin.o: $(OBJDIR)/builtin_.c $(OBJDIR)/builtin.h $(OBJDIR)/builtin_data.h $(SRCDIR)/config.h
1096 $(XTCC) -o $(OBJDIR)/builtin.o -c $(OBJDIR)/builtin_.c
1097
1098 $(OBJDIR)/builtin.h: $(OBJDIR)/headers
1099
1100 $(OBJDIR)/bundle_.c: $(SRCDIR)/bundle.c $(TRANSLATE)
1101 $(TRANSLATE) $(SRCDIR)/bundle.c >$@
1102
1103 $(OBJDIR)/bundle.o: $(OBJDIR)/bundle_.c $(OBJDIR)/bundle.h $(SRCDIR)/config.h
1104 $(XTCC) -o $(OBJDIR)/bundle.o -c $(OBJDIR)/bundle_.c
1105
1106 $(OBJDIR)/bundle.h: $(OBJDIR)/headers
1107
1108 $(OBJDIR)/cache_.c: $(SRCDIR)/cache.c $(TRANSLATE)
1109 $(TRANSLATE) $(SRCDIR)/cache.c >$@
1110
1111 $(OBJDIR)/cache.o: $(OBJDIR)/cache_.c $(OBJDIR)/cache.h $(SRCDIR)/config.h
@@ -1610,10 +1630,26 @@
1630
1631 $(OBJDIR)/printf.o: $(OBJDIR)/printf_.c $(OBJDIR)/printf.h $(SRCDIR)/config.h
1632 $(XTCC) -o $(OBJDIR)/printf.o -c $(OBJDIR)/printf_.c
1633
1634 $(OBJDIR)/printf.h: $(OBJDIR)/headers
1635
1636 $(OBJDIR)/publish_.c: $(SRCDIR)/publish.c $(TRANSLATE)
1637 $(TRANSLATE) $(SRCDIR)/publish.c >$@
1638
1639 $(OBJDIR)/publish.o: $(OBJDIR)/publish_.c $(OBJDIR)/publish.h $(SRCDIR)/config.h
1640 $(XTCC) -o $(OBJDIR)/publish.o -c $(OBJDIR)/publish_.c
1641
1642 $(OBJDIR)/publish.h: $(OBJDIR)/headers
1643
1644 $(OBJDIR)/purge_.c: $(SRCDIR)/purge.c $(TRANSLATE)
1645 $(TRANSLATE) $(SRCDIR)/purge.c >$@
1646
1647 $(OBJDIR)/purge.o: $(OBJDIR)/purge_.c $(OBJDIR)/purge.h $(SRCDIR)/config.h
1648 $(XTCC) -o $(OBJDIR)/purge.o -c $(OBJDIR)/purge_.c
1649
1650 $(OBJDIR)/purge.h: $(OBJDIR)/headers
1651
1652 $(OBJDIR)/rebuild_.c: $(SRCDIR)/rebuild.c $(TRANSLATE)
1653 $(TRANSLATE) $(SRCDIR)/rebuild.c >$@
1654
1655 $(OBJDIR)/rebuild.o: $(OBJDIR)/rebuild_.c $(OBJDIR)/rebuild.h $(SRCDIR)/config.h
1656
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -204,10 +204,11 @@
204204
bisect_.c \
205205
blob_.c \
206206
branch_.c \
207207
browse_.c \
208208
builtin_.c \
209
+ bundle_.c \
209210
cache_.c \
210211
captcha_.c \
211212
cgi_.c \
212213
checkin_.c \
213214
checkout_.c \
@@ -270,10 +271,12 @@
270271
path_.c \
271272
pivot_.c \
272273
popen_.c \
273274
pqueue_.c \
274275
printf_.c \
276
+ publish_.c \
277
+ purge_.c \
275278
rebuild_.c \
276279
regexp_.c \
277280
report_.c \
278281
rss_.c \
279282
schema_.c \
@@ -320,10 +323,11 @@
320323
$(OX)\bisect$O \
321324
$(OX)\blob$O \
322325
$(OX)\branch$O \
323326
$(OX)\browse$O \
324327
$(OX)\builtin$O \
328
+ $(OX)\bundle$O \
325329
$(OX)\cache$O \
326330
$(OX)\captcha$O \
327331
$(OX)\cgi$O \
328332
$(OX)\checkin$O \
329333
$(OX)\checkout$O \
@@ -387,10 +391,12 @@
387391
$(OX)\path$O \
388392
$(OX)\pivot$O \
389393
$(OX)\popen$O \
390394
$(OX)\pqueue$O \
391395
$(OX)\printf$O \
396
+ $(OX)\publish$O \
397
+ $(OX)\purge$O \
392398
$(OX)\rebuild$O \
393399
$(OX)\regexp$O \
394400
$(OX)\report$O \
395401
$(OX)\rss$O \
396402
$(OX)\schema$O \
@@ -490,10 +496,11 @@
490496
echo $(OX)\bisect.obj >> $@
491497
echo $(OX)\blob.obj >> $@
492498
echo $(OX)\branch.obj >> $@
493499
echo $(OX)\browse.obj >> $@
494500
echo $(OX)\builtin.obj >> $@
501
+ echo $(OX)\bundle.obj >> $@
495502
echo $(OX)\cache.obj >> $@
496503
echo $(OX)\captcha.obj >> $@
497504
echo $(OX)\cgi.obj >> $@
498505
echo $(OX)\checkin.obj >> $@
499506
echo $(OX)\checkout.obj >> $@
@@ -557,10 +564,12 @@
557564
echo $(OX)\path.obj >> $@
558565
echo $(OX)\pivot.obj >> $@
559566
echo $(OX)\popen.obj >> $@
560567
echo $(OX)\pqueue.obj >> $@
561568
echo $(OX)\printf.obj >> $@
569
+ echo $(OX)\publish.obj >> $@
570
+ echo $(OX)\purge.obj >> $@
562571
echo $(OX)\rebuild.obj >> $@
563572
echo $(OX)\regexp.obj >> $@
564573
echo $(OX)\report.obj >> $@
565574
echo $(OX)\rss.obj >> $@
566575
echo $(OX)\schema.obj >> $@
@@ -752,10 +761,16 @@
752761
$(OX)\builtin$O : builtin_.c builtin.h
753762
$(TCC) /Fo$@ -c builtin_.c
754763
755764
builtin_.c : $(SRCDIR)\builtin.c
756765
translate$E $** > $@
766
+
767
+$(OX)\bundle$O : bundle_.c bundle.h
768
+ $(TCC) /Fo$@ -c bundle_.c
769
+
770
+bundle_.c : $(SRCDIR)\bundle.c
771
+ translate$E $** > $@
757772
758773
$(OX)\cache$O : cache_.c cache.h
759774
$(TCC) /Fo$@ -c cache_.c
760775
761776
cache_.c : $(SRCDIR)\cache.c
@@ -1148,10 +1163,22 @@
11481163
$(OX)\printf$O : printf_.c printf.h
11491164
$(TCC) /Fo$@ -c printf_.c
11501165
11511166
printf_.c : $(SRCDIR)\printf.c
11521167
translate$E $** > $@
1168
+
1169
+$(OX)\publish$O : publish_.c publish.h
1170
+ $(TCC) /Fo$@ -c publish_.c
1171
+
1172
+publish_.c : $(SRCDIR)\publish.c
1173
+ translate$E $** > $@
1174
+
1175
+$(OX)\purge$O : purge_.c purge.h
1176
+ $(TCC) /Fo$@ -c purge_.c
1177
+
1178
+purge_.c : $(SRCDIR)\purge.c
1179
+ translate$E $** > $@
11531180
11541181
$(OX)\rebuild$O : rebuild_.c rebuild.h
11551182
$(TCC) /Fo$@ -c rebuild_.c
11561183
11571184
rebuild_.c : $(SRCDIR)\rebuild.c
@@ -1390,10 +1417,11 @@
13901417
bisect_.c:bisect.h \
13911418
blob_.c:blob.h \
13921419
branch_.c:branch.h \
13931420
browse_.c:browse.h \
13941421
builtin_.c:builtin.h \
1422
+ bundle_.c:bundle.h \
13951423
cache_.c:cache.h \
13961424
captcha_.c:captcha.h \
13971425
cgi_.c:cgi.h \
13981426
checkin_.c:checkin.h \
13991427
checkout_.c:checkout.h \
@@ -1456,10 +1484,12 @@
14561484
path_.c:path.h \
14571485
pivot_.c:pivot.h \
14581486
popen_.c:popen.h \
14591487
pqueue_.c:pqueue.h \
14601488
printf_.c:printf.h \
1489
+ publish_.c:publish.h \
1490
+ purge_.c:purge.h \
14611491
rebuild_.c:rebuild.h \
14621492
regexp_.c:regexp.h \
14631493
report_.c:report.h \
14641494
rss_.c:rss.h \
14651495
schema_.c:schema.h \
14661496
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -204,10 +204,11 @@
204 bisect_.c \
205 blob_.c \
206 branch_.c \
207 browse_.c \
208 builtin_.c \
 
209 cache_.c \
210 captcha_.c \
211 cgi_.c \
212 checkin_.c \
213 checkout_.c \
@@ -270,10 +271,12 @@
270 path_.c \
271 pivot_.c \
272 popen_.c \
273 pqueue_.c \
274 printf_.c \
 
 
275 rebuild_.c \
276 regexp_.c \
277 report_.c \
278 rss_.c \
279 schema_.c \
@@ -320,10 +323,11 @@
320 $(OX)\bisect$O \
321 $(OX)\blob$O \
322 $(OX)\branch$O \
323 $(OX)\browse$O \
324 $(OX)\builtin$O \
 
325 $(OX)\cache$O \
326 $(OX)\captcha$O \
327 $(OX)\cgi$O \
328 $(OX)\checkin$O \
329 $(OX)\checkout$O \
@@ -387,10 +391,12 @@
387 $(OX)\path$O \
388 $(OX)\pivot$O \
389 $(OX)\popen$O \
390 $(OX)\pqueue$O \
391 $(OX)\printf$O \
 
 
392 $(OX)\rebuild$O \
393 $(OX)\regexp$O \
394 $(OX)\report$O \
395 $(OX)\rss$O \
396 $(OX)\schema$O \
@@ -490,10 +496,11 @@
490 echo $(OX)\bisect.obj >> $@
491 echo $(OX)\blob.obj >> $@
492 echo $(OX)\branch.obj >> $@
493 echo $(OX)\browse.obj >> $@
494 echo $(OX)\builtin.obj >> $@
 
495 echo $(OX)\cache.obj >> $@
496 echo $(OX)\captcha.obj >> $@
497 echo $(OX)\cgi.obj >> $@
498 echo $(OX)\checkin.obj >> $@
499 echo $(OX)\checkout.obj >> $@
@@ -557,10 +564,12 @@
557 echo $(OX)\path.obj >> $@
558 echo $(OX)\pivot.obj >> $@
559 echo $(OX)\popen.obj >> $@
560 echo $(OX)\pqueue.obj >> $@
561 echo $(OX)\printf.obj >> $@
 
 
562 echo $(OX)\rebuild.obj >> $@
563 echo $(OX)\regexp.obj >> $@
564 echo $(OX)\report.obj >> $@
565 echo $(OX)\rss.obj >> $@
566 echo $(OX)\schema.obj >> $@
@@ -752,10 +761,16 @@
752 $(OX)\builtin$O : builtin_.c builtin.h
753 $(TCC) /Fo$@ -c builtin_.c
754
755 builtin_.c : $(SRCDIR)\builtin.c
756 translate$E $** > $@
 
 
 
 
 
 
757
758 $(OX)\cache$O : cache_.c cache.h
759 $(TCC) /Fo$@ -c cache_.c
760
761 cache_.c : $(SRCDIR)\cache.c
@@ -1148,10 +1163,22 @@
1148 $(OX)\printf$O : printf_.c printf.h
1149 $(TCC) /Fo$@ -c printf_.c
1150
1151 printf_.c : $(SRCDIR)\printf.c
1152 translate$E $** > $@
 
 
 
 
 
 
 
 
 
 
 
 
1153
1154 $(OX)\rebuild$O : rebuild_.c rebuild.h
1155 $(TCC) /Fo$@ -c rebuild_.c
1156
1157 rebuild_.c : $(SRCDIR)\rebuild.c
@@ -1390,10 +1417,11 @@
1390 bisect_.c:bisect.h \
1391 blob_.c:blob.h \
1392 branch_.c:branch.h \
1393 browse_.c:browse.h \
1394 builtin_.c:builtin.h \
 
1395 cache_.c:cache.h \
1396 captcha_.c:captcha.h \
1397 cgi_.c:cgi.h \
1398 checkin_.c:checkin.h \
1399 checkout_.c:checkout.h \
@@ -1456,10 +1484,12 @@
1456 path_.c:path.h \
1457 pivot_.c:pivot.h \
1458 popen_.c:popen.h \
1459 pqueue_.c:pqueue.h \
1460 printf_.c:printf.h \
 
 
1461 rebuild_.c:rebuild.h \
1462 regexp_.c:regexp.h \
1463 report_.c:report.h \
1464 rss_.c:rss.h \
1465 schema_.c:schema.h \
1466
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -204,10 +204,11 @@
204 bisect_.c \
205 blob_.c \
206 branch_.c \
207 browse_.c \
208 builtin_.c \
209 bundle_.c \
210 cache_.c \
211 captcha_.c \
212 cgi_.c \
213 checkin_.c \
214 checkout_.c \
@@ -270,10 +271,12 @@
271 path_.c \
272 pivot_.c \
273 popen_.c \
274 pqueue_.c \
275 printf_.c \
276 publish_.c \
277 purge_.c \
278 rebuild_.c \
279 regexp_.c \
280 report_.c \
281 rss_.c \
282 schema_.c \
@@ -320,10 +323,11 @@
323 $(OX)\bisect$O \
324 $(OX)\blob$O \
325 $(OX)\branch$O \
326 $(OX)\browse$O \
327 $(OX)\builtin$O \
328 $(OX)\bundle$O \
329 $(OX)\cache$O \
330 $(OX)\captcha$O \
331 $(OX)\cgi$O \
332 $(OX)\checkin$O \
333 $(OX)\checkout$O \
@@ -387,10 +391,12 @@
391 $(OX)\path$O \
392 $(OX)\pivot$O \
393 $(OX)\popen$O \
394 $(OX)\pqueue$O \
395 $(OX)\printf$O \
396 $(OX)\publish$O \
397 $(OX)\purge$O \
398 $(OX)\rebuild$O \
399 $(OX)\regexp$O \
400 $(OX)\report$O \
401 $(OX)\rss$O \
402 $(OX)\schema$O \
@@ -490,10 +496,11 @@
496 echo $(OX)\bisect.obj >> $@
497 echo $(OX)\blob.obj >> $@
498 echo $(OX)\branch.obj >> $@
499 echo $(OX)\browse.obj >> $@
500 echo $(OX)\builtin.obj >> $@
501 echo $(OX)\bundle.obj >> $@
502 echo $(OX)\cache.obj >> $@
503 echo $(OX)\captcha.obj >> $@
504 echo $(OX)\cgi.obj >> $@
505 echo $(OX)\checkin.obj >> $@
506 echo $(OX)\checkout.obj >> $@
@@ -557,10 +564,12 @@
564 echo $(OX)\path.obj >> $@
565 echo $(OX)\pivot.obj >> $@
566 echo $(OX)\popen.obj >> $@
567 echo $(OX)\pqueue.obj >> $@
568 echo $(OX)\printf.obj >> $@
569 echo $(OX)\publish.obj >> $@
570 echo $(OX)\purge.obj >> $@
571 echo $(OX)\rebuild.obj >> $@
572 echo $(OX)\regexp.obj >> $@
573 echo $(OX)\report.obj >> $@
574 echo $(OX)\rss.obj >> $@
575 echo $(OX)\schema.obj >> $@
@@ -752,10 +761,16 @@
761 $(OX)\builtin$O : builtin_.c builtin.h
762 $(TCC) /Fo$@ -c builtin_.c
763
764 builtin_.c : $(SRCDIR)\builtin.c
765 translate$E $** > $@
766
767 $(OX)\bundle$O : bundle_.c bundle.h
768 $(TCC) /Fo$@ -c bundle_.c
769
770 bundle_.c : $(SRCDIR)\bundle.c
771 translate$E $** > $@
772
773 $(OX)\cache$O : cache_.c cache.h
774 $(TCC) /Fo$@ -c cache_.c
775
776 cache_.c : $(SRCDIR)\cache.c
@@ -1148,10 +1163,22 @@
1163 $(OX)\printf$O : printf_.c printf.h
1164 $(TCC) /Fo$@ -c printf_.c
1165
1166 printf_.c : $(SRCDIR)\printf.c
1167 translate$E $** > $@
1168
1169 $(OX)\publish$O : publish_.c publish.h
1170 $(TCC) /Fo$@ -c publish_.c
1171
1172 publish_.c : $(SRCDIR)\publish.c
1173 translate$E $** > $@
1174
1175 $(OX)\purge$O : purge_.c purge.h
1176 $(TCC) /Fo$@ -c purge_.c
1177
1178 purge_.c : $(SRCDIR)\purge.c
1179 translate$E $** > $@
1180
1181 $(OX)\rebuild$O : rebuild_.c rebuild.h
1182 $(TCC) /Fo$@ -c rebuild_.c
1183
1184 rebuild_.c : $(SRCDIR)\rebuild.c
@@ -1390,10 +1417,11 @@
1417 bisect_.c:bisect.h \
1418 blob_.c:blob.h \
1419 branch_.c:branch.h \
1420 browse_.c:browse.h \
1421 builtin_.c:builtin.h \
1422 bundle_.c:bundle.h \
1423 cache_.c:cache.h \
1424 captcha_.c:captcha.h \
1425 cgi_.c:cgi.h \
1426 checkin_.c:checkin.h \
1427 checkout_.c:checkout.h \
@@ -1456,10 +1484,12 @@
1484 path_.c:path.h \
1485 pivot_.c:pivot.h \
1486 popen_.c:popen.h \
1487 pqueue_.c:pqueue.h \
1488 printf_.c:printf.h \
1489 publish_.c:publish.h \
1490 purge_.c:purge.h \
1491 rebuild_.c:rebuild.h \
1492 regexp_.c:regexp.h \
1493 report_.c:report.h \
1494 rss_.c:rss.h \
1495 schema_.c:schema.h \
1496
--- www/checkin_names.wiki
+++ www/checkin_names.wiki
@@ -115,10 +115,31 @@
115115
116116
The "tag:deed2" name will refer to the most recent check-in
117117
tagged with "deed2" not to the
118118
check-in whose canonical name begins with "deed2".
119119
120
+<h2>Whole Branches</h2>
121
+
122
+Usually whan a branch name is specified, it means the latest checkin on
123
+that branch. But for some commands (ex: [/help/purge|purge]) a branch name
124
+on the argument means the earliest connected checkin on the branch. This
125
+seems confusing when being explained here, but it works out to be intuitive
126
+in practice.
127
+
128
+For example, the command "fossil purge XYZ" means to purge the checkin XYZ
129
+and all of its descendents. But when XYZ is in the form of a branch name, one
130
+generally wants to purge the entire branch, not just the last checkin on the
131
+branch. And so for this reason, commands like purge will interpret a branch
132
+name to be the first checkin of the branch rather than the last. If there
133
+are two or more branches with the same name, then these commands will select
134
+the first check-in of the branch that has the most recent checkin. What
135
+happens is that Fossil searches for the most recent checkin with the given
136
+tag, just as it always does. But if that tag is a branch name, it then walks
137
+back down the branch looking for the first check-in of that branch.
138
+
139
+Again, this behavior only occurs on a few commands where it make sense.
140
+
120141
<h2>Timestamps</h2>
121142
122143
A timestamp in one of the formats shown below means the most recent
123144
check-in that occurs no later than the timestamp given:
124145
125146
--- www/checkin_names.wiki
+++ www/checkin_names.wiki
@@ -115,10 +115,31 @@
115
116 The "tag:deed2" name will refer to the most recent check-in
117 tagged with "deed2" not to the
118 check-in whose canonical name begins with "deed2".
119
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120 <h2>Timestamps</h2>
121
122 A timestamp in one of the formats shown below means the most recent
123 check-in that occurs no later than the timestamp given:
124
125
--- www/checkin_names.wiki
+++ www/checkin_names.wiki
@@ -115,10 +115,31 @@
115
116 The "tag:deed2" name will refer to the most recent check-in
117 tagged with "deed2" not to the
118 check-in whose canonical name begins with "deed2".
119
120 <h2>Whole Branches</h2>
121
122 Usually whan a branch name is specified, it means the latest checkin on
123 that branch. But for some commands (ex: [/help/purge|purge]) a branch name
124 on the argument means the earliest connected checkin on the branch. This
125 seems confusing when being explained here, but it works out to be intuitive
126 in practice.
127
128 For example, the command "fossil purge XYZ" means to purge the checkin XYZ
129 and all of its descendents. But when XYZ is in the form of a branch name, one
130 generally wants to purge the entire branch, not just the last checkin on the
131 branch. And so for this reason, commands like purge will interpret a branch
132 name to be the first checkin of the branch rather than the last. If there
133 are two or more branches with the same name, then these commands will select
134 the first check-in of the branch that has the most recent checkin. What
135 happens is that Fossil searches for the most recent checkin with the given
136 tag, just as it always does. But if that tag is a branch name, it then walks
137 back down the branch looking for the first check-in of that branch.
138
139 Again, this behavior only occurs on a few commands where it make sense.
140
141 <h2>Timestamps</h2>
142
143 A timestamp in one of the formats shown below means the most recent
144 check-in that occurs no later than the timestamp given:
145
146

Keyboard Shortcuts

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