# Fossil

Check-in [d7d335a6]

Overview
Comment: Merge latest trunk. Tarball | ZIP archive | SQL archive family | ancestors | descendants | both | symlinks files | file ages | folders d7d335a6920257d00ed6605309ac9838dd044519 dmitry 2011-02-07 17:51:49
Context
 2011-02-07 17:57 Fix issue introduced by previous fix. check-in: 9fbc052c user: dmitry tags: symlinks 17:51 Merge latest trunk. check-in: d7d335a6 user: dmitry tags: symlinks 17:50 Fix segmentation fault in historical_version_of_file() when file has no permissions in manifest. check-in: 8e4e30fb user: dmitry tags: symlinks 14:35 Fix documentation typos. check-in: 49cbf5e5 user: drh tags: trunk
Changes

Changes to src/branch.c.

 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 ... 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 ... 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294   char *zCurrent = 0; if( g.localOpen ){ vid = db_lget_int("checkout", 0); zCurrent = db_text(0, "SELECT value FROM tagxref" " WHERE rid=%d AND tagid=%d", vid, TAG_BRANCH); } compute_leaves(0, 1); db_prepare(&q, "SELECT DISTINCT value FROM tagxref" " WHERE tagid=%d AND value NOT NULL AND rid IN leaves" " ORDER BY value /*sort*/", TAG_BRANCH ); while( db_step(&q)==SQLITE_ROW ){ const char *zBr = db_column_text(&q, 0); int isCur = zCurrent!=0 && fossil_strcmp(zCurrent,zBr)==0; printf("%s%s\n", (isCur ? "* " : " "), zBr); } db_finalize(&q); ................................................................................ style_submenu_element("Timeline", "Timeline", "brtimeline"); if( showClosed ){ style_submenu_element("Open","Open","brlist"); }else{ style_submenu_element("Closed","Closed","brlist?closed"); } login_anonymous_available(); compute_leaves(0, 1); style_sidebox_begin("Nomenclature:", "33%"); @
@
1. An is a branch that has one or @ more open leaves. @ The presence of open leaves presumably means @ that the branch is still being extended with new check-ins.
2. ................................................................................ @ closed leaves. @ Closed branches are fixed and do not change (unless they are first @ reopened) @
style_sidebox_end(); cnt = 0; if( !showClosed ){ db_prepare(&q, "SELECT DISTINCT value FROM tagxref" " WHERE tagid=%d AND value NOT NULL" " AND rid IN leaves" " ORDER BY value /*sort*/", TAG_BRANCH ); }else{ db_prepare(&q, "SELECT value FROM tagxref" " WHERE tagid=%d AND value NOT NULL" " EXCEPT " "SELECT value FROM tagxref" " WHERE tagid=%d AND value NOT NULL" " AND rid IN leaves" " ORDER BY value /*sort*/", TAG_BRANCH, TAG_BRANCH ); } while( db_step(&q)==SQLITE_ROW ){ const char *zBr = db_column_text(&q, 0); if( cnt==0 ){ if( showClosed ){ @

Closed Branches:

}else{ @

Open Branches:

  < | > > | < < | | | | < < < < < < < < < < | | < > | <  203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 ... 244 245 246 247 248 249 250 251 252 253 254 255 256 257 ... 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282   char *zCurrent = 0; if( g.localOpen ){ vid = db_lget_int("checkout", 0); zCurrent = db_text(0, "SELECT value FROM tagxref" " WHERE rid=%d AND tagid=%d", vid, TAG_BRANCH); } db_prepare(&q, "SELECT DISTINCT value FROM tagxref" " WHERE tagid=%d AND value NOT NULL" " AND rid IN leaf" " AND NOT %z" " ORDER BY value /*sort*/", TAG_BRANCH, leaf_is_closed_sql("tagxref.rid") ); while( db_step(&q)==SQLITE_ROW ){ const char *zBr = db_column_text(&q, 0); int isCur = zCurrent!=0 && fossil_strcmp(zCurrent,zBr)==0; printf("%s%s\n", (isCur ? "* " : " "), zBr); } db_finalize(&q); ................................................................................ style_submenu_element("Timeline", "Timeline", "brtimeline"); if( showClosed ){ style_submenu_element("Open","Open","brlist"); }else{ style_submenu_element("Closed","Closed","brlist?closed"); } login_anonymous_available(); style_sidebox_begin("Nomenclature:", "33%"); @
@
1. An is a branch that has one or @ more open leaves. @ The presence of open leaves presumably means @ that the branch is still being extended with new check-ins.
2. ................................................................................ @ closed leaves. @ Closed branches are fixed and do not change (unless they are first @ reopened) @
style_sidebox_end(); cnt = 0; db_prepare(&q, "SELECT DISTINCT value FROM tagxref" " WHERE tagid=%d AND value NOT NULL" " AND rid IN leaf" " AND %s %z" " ORDER BY value /*sort*/", TAG_BRANCH, showClosed ? "" : "NOT", leaf_is_closed_sql("tagxref.rid") ); while( db_step(&q)==SQLITE_ROW ){ const char *zBr = db_column_text(&q, 0); if( cnt==0 ){ if( showClosed ){ @

Closed Branches:

}else{ @

Open Branches:



Changes to src/db.c.

 121 122 123 124 125 126 127 128 129 130 131 132 133 134  void db_end_transaction(int rollbackFlag){ if( g.db==0 ) return; if( nBegin<=0 ) return; if( rollbackFlag ) doRollback = 1; nBegin--; if( nBegin==0 ){ int i; for(i=0; doRollback==0 && i  121 122 123 124 125 126 127 128 129 130 131 132 133 134 135  void db_end_transaction(int rollbackFlag){ if( g.db==0 ) return; if( nBegin<=0 ) return; if( rollbackFlag ) doRollback = 1; nBegin--; if( nBegin==0 ){ int i; if( doRollback==0 ) leaf_do_pending_checks(); for(i=0; doRollback==0 && i

Changes to src/descendants.c.

 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 .. 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 ... 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 ... 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 ... 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357  #include /* ** Create a temporary table named "leaves" if it does not ** already exist. Load this table with the RID of all ** check-ins that are leaves which are decended from ** check-in iBase. If iBase==0, find all leaves within the ** entire check-in hierarchy. ** ** A "leaf" is a check-in that has no children in the same branch. ** ** The closeMode flag determines behavior associated with the "closed" ** tag: ** ** closeMode==0 Show all leaves regardless of the "closed" tag. ** ** closeMode==1 Show only leaves without the "closed" tag. ................................................................................ db_multi_exec( "CREATE TEMP TABLE IF NOT EXISTS leaves(" " rid INTEGER PRIMARY KEY" ");" "DELETE FROM leaves;" ); /* We are checking all descendants of iBase. If iBase==0, then ** use a short-cut to find all leaves anywhere in the hierarchy. */ if( iBase<=0 ){ db_multi_exec( "INSERT OR IGNORE INTO leaves" " SELECT cid FROM plink" " EXCEPT" " SELECT pid FROM plink" " WHERE coalesce((SELECT value FROM tagxref" " WHERE tagid=%d AND rid=plink.pid),'trunk')" " == coalesce((SELECT value FROM tagxref" " WHERE tagid=%d AND rid=plink.cid),'trunk');", TAG_BRANCH, TAG_BRANCH ); }else{ Bag seen; /* Descendants seen */ Bag pending; /* Unpropagated descendants */ Stmt q1; /* Query to find children of a check-in */ Stmt isBr; /* Query to check to see if a check-in starts a new branch */ Stmt ins; /* INSERT statement for a new record */ /* Initialize the bags. */ ................................................................................ ** COMMAND: leaves ** ** Usage: %fossil leaves ?--all? ?--closed? ** ** Find leaves of all branches. By default show only open leaves. ** The --all flag causes all leaves (closed and open) to be shown. ** The --closed flag shows only closed leaves. */ void leaves_cmd(void){ Stmt q; int showAll = find_option("all", 0, 0)!=0; int showClosed = find_option("closed", 0, 0)!=0; db_must_be_within_tree(); compute_leaves(0, showAll ? 0 : showClosed ? 2 : 1); db_prepare(&q, "%s" " AND blob.rid IN leaves" " ORDER BY event.mtime DESC", timeline_query_for_tty() ); print_timeline(&q, 2000); db_finalize(&q); } /* ** This routine is called while for each check-in that is rendered by ** the "leaves" page. Add some additional hyperlink to show the ** ancestors of the leaf. */ static void leaves_extra(int rid){ if( g.okHistory ){ @ [timeline] } } /* ** WEBPAGE: leaves ** ** Find leaves of all branches. */ void leaves_page(void){ Stmt q; int showAll = P("all")!=0; int showClosed = P("closed")!=0; login_check_credentials(); if( !g.okRead ){ login_needed(); return; } ................................................................................ style_submenu_element("Closed", "Closed", "leaves?closed"); } if( showClosed || showAll ){ style_submenu_element("Open", "Open", "leaves"); } style_header("Leaves"); login_anonymous_available(); compute_leaves(0, showAll ? 0 : showClosed ? 2 : 1); style_sidebox_begin("Nomenclature:", "33%"); @
@
1. A
leaf
@ is a check-in with no descendants in the same branch.
2. @
3. An
open leaf
@ is a leaf that does not have a "closed" tag @ and is thus assumed to still be in use.
4. ................................................................................ if( showAll ){ @

All leaves, both open and closed:

}else if( showClosed ){ @

Closed leaves:

}else{ @

Open leaves:

} db_prepare(&q, "%s" " AND blob.rid IN leaves" " ORDER BY event.mtime DESC", timeline_query_for_www() ); www_print_timeline(&q, TIMELINE_LEAFONLY, 0, 0, leaves_extra); db_finalize(&q); @
@ style_footer(); }   | < > > > < < < | < < < < < < < < < < < < > > > > > < < < > > > | > > > > > | < < > < < < < < < < < < < < > < | | | > > > > > | < < > |  23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 .. 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 ... 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 ... 299 300 301 302 303 304 305 306 307 308 309 310 311 312 ... 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346  #include /* ** Create a temporary table named "leaves" if it does not ** already exist. Load this table with the RID of all ** check-ins that are leaves which are decended from ** check-in iBase. ** ** A "leaf" is a check-in that has no children in the same branch. ** There is a separate permanent table LEAF that contains all leaves ** in the tree. This routine is used to compute a subset of that ** table consisting of leaves that are descended from a single checkin. ** ** The closeMode flag determines behavior associated with the "closed" ** tag: ** ** closeMode==0 Show all leaves regardless of the "closed" tag. ** ** closeMode==1 Show only leaves without the "closed" tag. ................................................................................ db_multi_exec( "CREATE TEMP TABLE IF NOT EXISTS leaves(" " rid INTEGER PRIMARY KEY" ");" "DELETE FROM leaves;" ); if( iBase>0 ){ Bag seen; /* Descendants seen */ Bag pending; /* Unpropagated descendants */ Stmt q1; /* Query to find children of a check-in */ Stmt isBr; /* Query to check to see if a check-in starts a new branch */ Stmt ins; /* INSERT statement for a new record */ /* Initialize the bags. */ ................................................................................ ** COMMAND: leaves ** ** Usage: %fossil leaves ?--all? ?--closed? ** ** Find leaves of all branches. By default show only open leaves. ** The --all flag causes all leaves (closed and open) to be shown. ** The --closed flag shows only closed leaves. ** ** The --recompute flag causes the content of the "leaf" table in the ** repository database to be recomputed. */ void leaves_cmd(void){ Stmt q; Blob sql; int showAll = find_option("all", 0, 0)!=0; int showClosed = find_option("closed", 0, 0)!=0; int recomputeFlag = find_option("recompute",0,0)!=0; db_must_be_within_tree(); if( recomputeFlag ) leaf_rebuild(); blob_zero(&sql); blob_append(&sql, timeline_query_for_tty(), -1); blob_appendf(&sql, " AND blob.rid IN leaf"); if( showClosed ){ blob_appendf(&sql," AND %z", leaf_is_closed_sql("blob.rid")); }else if( !showAll ){ blob_appendf(&sql," AND NOT %z", leaf_is_closed_sql("blob.rid")); } db_prepare(&q, "%s ORDER BY event.mtime DESC", blob_str(&sql)); blob_reset(&sql); print_timeline(&q, 2000); db_finalize(&q); } /* ** WEBPAGE: leaves ** ** Find leaves of all branches. */ void leaves_page(void){ Blob sql; Stmt q; int showAll = P("all")!=0; int showClosed = P("closed")!=0; login_check_credentials(); if( !g.okRead ){ login_needed(); return; } ................................................................................ style_submenu_element("Closed", "Closed", "leaves?closed"); } if( showClosed || showAll ){ style_submenu_element("Open", "Open", "leaves"); } style_header("Leaves"); login_anonymous_available(); style_sidebox_begin("Nomenclature:", "33%"); @
@
1. A
leaf
@ is a check-in with no descendants in the same branch.
2. @
3. An
open leaf
@ is a leaf that does not have a "closed" tag @ and is thus assumed to still be in use.
4. ................................................................................ if( showAll ){ @

All leaves, both open and closed:

}else if( showClosed ){ @

Closed leaves:

}else{ @

Open leaves:

} blob_zero(&sql); blob_append(&sql, timeline_query_for_www(), -1); blob_appendf(&sql, " AND blob.rid IN leaf"); if( showClosed ){ blob_appendf(&sql," AND %z", leaf_is_closed_sql("blob.rid")); }else if( !showAll ){ blob_appendf(&sql," AND NOT %z", leaf_is_closed_sql("blob.rid")); } db_prepare(&q, "%s ORDER BY event.mtime DESC", blob_str(&sql)); blob_reset(&sql); www_print_timeline(&q, TIMELINE_LEAFONLY, 0, 0, 0); db_finalize(&q); @
@ style_footer(); } 

Changes to src/diffcmd.c.

 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83   } zName2 = zName; } /* Compute and output the differences */ blob_zero(&out); text_diff(pFile1, &file2, &out, 5, ignoreEolWs); printf("--- %s\n+++ %s\n", zName, zName2); printf("%s\n", blob_str(&out)); /* Release memory resources */ blob_reset(&file2); blob_reset(&out); }else{ int cnt = 0; Blob nameFile1; /* Name of temporary file to old pFile1 content */   > | | >  68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85   } zName2 = zName; } /* Compute and output the differences */ blob_zero(&out); text_diff(pFile1, &file2, &out, 5, ignoreEolWs); if( blob_size(&out) ){ printf("--- %s\n+++ %s\n", zName, zName2); printf("%s\n", blob_str(&out)); } /* Release memory resources */ blob_reset(&file2); blob_reset(&out); }else{ int cnt = 0; Blob nameFile1; /* Name of temporary file to old pFile1 content */ 

Changes to src/graph.c.

 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 ... 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182  */ #include "config.h" #include "graph.h" #include #if INTERFACE #define GR_MAX_PARENT 10 /* Max number of parents for any one node */ #define GR_MAX_RAIL 32 /* Max number of "rails" to display */ /* The graph appears vertically beside a timeline. Each row in the ** timeline corresponds to a row in the graph. GraphRow.idx is 0 for ** the top-most row and increases moving down. Hence (in the absence of ** time skew) parents have a larger index than their children. */ struct GraphRow { int rid; /* The rid for the check-in */ i8 nParent; /* Number of parents */ int aParent[GR_MAX_PARENT]; /* Array of parents. 0 element is primary .*/ char *zBranch; /* Branch name */ char *zBgClr; /* Background Color */ GraphRow *pNext; /* Next row down in the list of all rows */ GraphRow *pPrev; /* Previous row */ int idx; /* Row index. First is 1. 0 used for "none" */ ................................................................................ int rid, /* RID for the check-in */ int nParent, /* Number of parents */ int *aParent, /* Array of parents */ const char *zBranch, /* Branch for this check-in */ const char *zBgClr /* Background color. NULL or "" for white. */ ){ GraphRow *pRow; if( p->nErr ) return 0; if( nParent>GR_MAX_PARENT ){ p->nErr++; return 0; } pRow = (GraphRow*)safeMalloc( sizeof(GraphRow) ); pRow->rid = rid; pRow->nParent = nParent; pRow->zBranch = persistBranchName(p, zBranch); if( zBgClr==0 || zBgClr[0]==0 ) zBgClr = "white"; pRow->zBgClr = persistBranchName(p, zBgClr); memcpy(pRow->aParent, aParent, sizeof(aParent[0])*nParent); if( p->pFirst==0 ){   < | > < > > | >  19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 ... 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184  */ #include "config.h" #include "graph.h" #include #if INTERFACE #define GR_MAX_RAIL 32 /* Max number of "rails" to display */ /* The graph appears vertically beside a timeline. Each row in the ** timeline corresponds to a row in the graph. GraphRow.idx is 0 for ** the top-most row and increases moving down. Hence (in the absence of ** time skew) parents have a larger index than their children. */ struct GraphRow { int rid; /* The rid for the check-in */ i8 nParent; /* Number of parents */ int *aParent; /* Array of parents. 0 element is primary .*/ char *zBranch; /* Branch name */ char *zBgClr; /* Background Color */ GraphRow *pNext; /* Next row down in the list of all rows */ GraphRow *pPrev; /* Previous row */ int idx; /* Row index. First is 1. 0 used for "none" */ ................................................................................ int rid, /* RID for the check-in */ int nParent, /* Number of parents */ int *aParent, /* Array of parents */ const char *zBranch, /* Branch for this check-in */ const char *zBgClr /* Background color. NULL or "" for white. */ ){ GraphRow *pRow; int nByte; if( p->nErr ) return 0; nByte = sizeof(GraphRow); nByte += sizeof(pRow->aParent[0])*nParent; pRow = (GraphRow*)safeMalloc( nByte ); pRow->aParent = (int*)&pRow[1]; pRow->rid = rid; pRow->nParent = nParent; pRow->zBranch = persistBranchName(p, zBranch); if( zBgClr==0 || zBgClr[0]==0 ) zBgClr = "white"; pRow->zBgClr = persistBranchName(p, zBgClr); memcpy(pRow->aParent, aParent, sizeof(aParent[0])*nParent); if( p->pFirst==0 ){ 

     > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132  /* ** Copyright (c) 2011 D. Richard Hipp ** ** This program is free software; you can redistribute it and/or ** modify it under the terms of the Simplified BSD License (also ** known as the "2-Clause License" or "FreeBSD License".) ** This program is distributed in the hope that it will be useful, ** but without any warranty; without even the implied warranty of ** merchantability or fitness for a particular purpose. ** ** Author contact information: ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ******************************************************************************* ** ** This file contains code used to manage the "leaf" table of the ** repository. ** ** The LEAF table contains the rids for all leaves in the checkin DAG. ** A leaf is a checkin that has no children in the same branch. */ #include "config.h" #include "leaf.h" #include /* ** Recompute the entire LEAF table. ** ** This can be expensive (5 seconds or so) for a really large repository. ** So it is only done for things like a rebuild. */ void leaf_rebuild(void){ db_multi_exec( "DELETE FROM leaf;" "INSERT OR IGNORE INTO leaf" " SELECT cid FROM plink" " EXCEPT" " SELECT pid FROM plink" " WHERE coalesce((SELECT value FROM tagxref" " WHERE tagid=%d AND rid=plink.pid),'trunk')" " == coalesce((SELECT value FROM tagxref" " WHERE tagid=%d AND rid=plink.cid),'trunk');", TAG_BRANCH, TAG_BRANCH ); } /* ** A bag of checkins whose leaf status needs to be checked. */ static Bag needToCheck; /* ** Check to see if checkin "rid" is a leaf and either add it to the LEAF ** table if it is, or remove it if it is not. */ void leaf_check(int rid){ static Stmt checkIfLeaf; static Stmt addLeaf; static Stmt removeLeaf; int rc; db_static_prepare(&checkIfLeaf, "SELECT 1 FROM plink" " WHERE pid=:rid" " AND coalesce((SELECT value FROM tagxref" " WHERE tagid=%d AND rid=:rid),'trunk')" " == coalesce((SELECT value FROM tagxref" " WHERE tagid=%d AND rid=plink.cid),'trunk');", TAG_BRANCH, TAG_BRANCH ); db_bind_int(&checkIfLeaf, ":rid", rid); rc = db_step(&checkIfLeaf); db_reset(&checkIfLeaf); if( rc==SQLITE_ROW ){ db_static_prepare(&removeLeaf, "DELETE FROM leaf WHERE rid=:rid"); db_bind_int(&removeLeaf, ":rid", rid); db_step(&removeLeaf); db_reset(&removeLeaf); }else{ db_static_prepare(&addLeaf, "INSERT OR IGNORE INTO leaf VALUES(:rid)"); db_bind_int(&addLeaf, ":rid", rid); db_step(&addLeaf); db_reset(&addLeaf); } } /* ** Return an SQL expression (stored in memory obtained from fossil_malloc()) ** that is true if the SQL variable named "zVar" contains the rid with ** a CLOSED tag. In other words, return true if the leaf is closed. ** ** The result can be prefaced with a NOT operator to get all leaves that ** are open. */ char *leaf_is_closed_sql(const char *zVar){ return mprintf( "EXISTS(SELECT 1 FROM tagxref AS tx" " WHERE tx.rid=%s" " AND tx.tagid=%d" " AND tx.tagtype>0)", zVar, TAG_CLOSED ); } /* ** Schedule a leaf check for "rid" and its parents. */ void leaf_eventually_check(int rid){ static Stmt parentsOf; db_static_prepare(&parentsOf, "SELECT pid FROM plink WHERE cid=:rid"); db_bind_int(&parentsOf, ":rid", rid); bag_insert(&needToCheck, rid); while( db_step(&parentsOf)==SQLITE_ROW ){ bag_insert(&needToCheck, db_column_int(&parentsOf, 0)); } db_reset(&parentsOf); } /* ** Do all pending leaf checks. */ void leaf_do_pending_checks(void){ int rid; for(rid=bag_first(&needToCheck); rid; rid=bag_next(&needToCheck,rid)){ leaf_check(rid); } bag_clear(&needToCheck); } 

Changes to src/main.mk.

 43 44 45 46 47 48 49 50 51 52 53 54 55 56 ... 122 123 124 125 126 127 128 129 130 131 132 133 134 135 ... 201 202 203 204 205 206 207 208 209 210 211 212 213 214 ... 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 ... 549 550 551 552 553 554 555 556 557 558 559 560 561 562   $(SRCDIR)/graph.c \$(SRCDIR)/http.c \ $(SRCDIR)/http_socket.c \$(SRCDIR)/http_ssl.c \ $(SRCDIR)/http_transport.c \$(SRCDIR)/import.c \ $(SRCDIR)/info.c \$(SRCDIR)/login.c \ $(SRCDIR)/main.c \$(SRCDIR)/manifest.c \ $(SRCDIR)/md5.c \$(SRCDIR)/merge.c \ $(SRCDIR)/merge3.c \$(SRCDIR)/name.c \ ................................................................................ $(OBJDIR)/graph_.c \$(OBJDIR)/http_.c \ $(OBJDIR)/http_socket_.c \$(OBJDIR)/http_ssl_.c \ $(OBJDIR)/http_transport_.c \$(OBJDIR)/import_.c \ $(OBJDIR)/info_.c \$(OBJDIR)/login_.c \ $(OBJDIR)/main_.c \$(OBJDIR)/manifest_.c \ $(OBJDIR)/md5_.c \$(OBJDIR)/merge_.c \ $(OBJDIR)/merge3_.c \$(OBJDIR)/name_.c \ ................................................................................ $(OBJDIR)/graph.o \$(OBJDIR)/http.o \ $(OBJDIR)/http_socket.o \$(OBJDIR)/http_ssl.o \ $(OBJDIR)/http_transport.o \$(OBJDIR)/import.o \ $(OBJDIR)/info.o \$(OBJDIR)/login.o \ $(OBJDIR)/main.o \$(OBJDIR)/manifest.o \ $(OBJDIR)/md5.o \$(OBJDIR)/merge.o \ $(OBJDIR)/merge3.o \$(OBJDIR)/name.o \ ................................................................................ clean: rm -rf $(OBJDIR)/*$(APPNAME) $(OBJDIR)/page_index.h:$(TRANS_SRC) $(OBJDIR)/mkindex$(OBJDIR)/mkindex $(TRANS_SRC) >$@ $(OBJDIR)/headers:$(OBJDIR)/page_index.h $(OBJDIR)/makeheaders$(OBJDIR)/VERSION.h $(OBJDIR)/makeheaders$(OBJDIR)/add_.c:$(OBJDIR)/add.h$(OBJDIR)/allrepo_.c:$(OBJDIR)/allrepo.h$(OBJDIR)/attach_.c:$(OBJDIR)/attach.h$(OBJDIR)/bag_.c:$(OBJDIR)/bag.h$(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h$(OBJDIR)/blob_.c:$(OBJDIR)/blob.h$(OBJDIR)/branch_.c:$(OBJDIR)/branch.h$(OBJDIR)/browse_.c:$(OBJDIR)/browse.h$(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h$(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h$(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h$(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h$(OBJDIR)/clearsign_.c:$(OBJDIR)/clearsign.h$(OBJDIR)/clone_.c:$(OBJDIR)/clone.h$(OBJDIR)/comformat_.c:$(OBJDIR)/comformat.h$(OBJDIR)/configure_.c:$(OBJDIR)/configure.h$(OBJDIR)/content_.c:$(OBJDIR)/content.h$(OBJDIR)/db_.c:$(OBJDIR)/db.h$(OBJDIR)/delta_.c:$(OBJDIR)/delta.h$(OBJDIR)/deltacmd_.c:$(OBJDIR)/deltacmd.h$(OBJDIR)/descendants_.c:$(OBJDIR)/descendants.h$(OBJDIR)/diff_.c:$(OBJDIR)/diff.h$(OBJDIR)/diffcmd_.c:$(OBJDIR)/diffcmd.h$(OBJDIR)/doc_.c:$(OBJDIR)/doc.h$(OBJDIR)/encode_.c:$(OBJDIR)/encode.h$(OBJDIR)/event_.c:$(OBJDIR)/event.h$(OBJDIR)/export_.c:$(OBJDIR)/export.h$(OBJDIR)/file_.c:$(OBJDIR)/file.h$(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h$(OBJDIR)/graph_.c:$(OBJDIR)/graph.h$(OBJDIR)/http_.c:$(OBJDIR)/http.h$(OBJDIR)/http_socket_.c:$(OBJDIR)/http_socket.h$(OBJDIR)/http_ssl_.c:$(OBJDIR)/http_ssl.h$(OBJDIR)/http_transport_.c:$(OBJDIR)/http_transport.h$(OBJDIR)/import_.c:$(OBJDIR)/import.h$(OBJDIR)/info_.c:$(OBJDIR)/info.h$(OBJDIR)/login_.c:$(OBJDIR)/login.h$(OBJDIR)/main_.c:$(OBJDIR)/main.h$(OBJDIR)/manifest_.c:$(OBJDIR)/manifest.h$(OBJDIR)/md5_.c:$(OBJDIR)/md5.h$(OBJDIR)/merge_.c:$(OBJDIR)/merge.h$(OBJDIR)/merge3_.c:$(OBJDIR)/merge3.h$(OBJDIR)/name_.c:$(OBJDIR)/name.h$(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h$(OBJDIR)/popen_.c:$(OBJDIR)/popen.h$(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h$(OBJDIR)/printf_.c:$(OBJDIR)/printf.h$(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h$(OBJDIR)/report_.c:$(OBJDIR)/report.h$(OBJDIR)/rss_.c:$(OBJDIR)/rss.h$(OBJDIR)/schema_.c:$(OBJDIR)/schema.h$(OBJDIR)/search_.c:$(OBJDIR)/search.h$(OBJDIR)/setup_.c:$(OBJDIR)/setup.h$(OBJDIR)/sha1_.c:$(OBJDIR)/sha1.h$(OBJDIR)/shun_.c:$(OBJDIR)/shun.h$(OBJDIR)/skins_.c:$(OBJDIR)/skins.h$(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h$(OBJDIR)/stash_.c:$(OBJDIR)/stash.h$(OBJDIR)/stat_.c:$(OBJDIR)/stat.h$(OBJDIR)/style_.c:$(OBJDIR)/style.h$(OBJDIR)/sync_.c:$(OBJDIR)/sync.h$(OBJDIR)/tag_.c:$(OBJDIR)/tag.h$(OBJDIR)/th_main_.c:$(OBJDIR)/th_main.h$(OBJDIR)/timeline_.c:$(OBJDIR)/timeline.h$(OBJDIR)/tkt_.c:$(OBJDIR)/tkt.h$(OBJDIR)/tktsetup_.c:$(OBJDIR)/tktsetup.h$(OBJDIR)/undo_.c:$(OBJDIR)/undo.h$(OBJDIR)/update_.c:$(OBJDIR)/update.h$(OBJDIR)/url_.c:$(OBJDIR)/url.h$(OBJDIR)/user_.c:$(OBJDIR)/user.h$(OBJDIR)/verify_.c:$(OBJDIR)/verify.h$(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h$(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h$(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h$(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h$(OBJDIR)/xfer_.c:$(OBJDIR)/xfer.h$(OBJDIR)/zip_.c:$(OBJDIR)/zip.h$(SRCDIR)/sqlite3.h $(SRCDIR)/th.h$(OBJDIR)/VERSION.h touch $(OBJDIR)/headers$(OBJDIR)/headers: Makefile Makefile: $(OBJDIR)/add_.c:$(SRCDIR)/add.c $(OBJDIR)/translate$(OBJDIR)/translate $(SRCDIR)/add.c >$(OBJDIR)/add_.c $(OBJDIR)/add.o:$(OBJDIR)/add_.c $(OBJDIR)/add.h$(SRCDIR)/config.h ................................................................................ $(OBJDIR)/info_.c:$(SRCDIR)/info.c $(OBJDIR)/translate$(OBJDIR)/translate $(SRCDIR)/info.c >$(OBJDIR)/info_.c $(OBJDIR)/info.o:$(OBJDIR)/info_.c $(OBJDIR)/info.h$(SRCDIR)/config.h $(XTCC) -o$(OBJDIR)/info.o -c $(OBJDIR)/info_.c$(OBJDIR)/info.h: $(OBJDIR)/headers$(OBJDIR)/login_.c: $(SRCDIR)/login.c$(OBJDIR)/translate $(OBJDIR)/translate$(SRCDIR)/login.c >$(OBJDIR)/login_.c$(OBJDIR)/login.o: $(OBJDIR)/login_.c$(OBJDIR)/login.h $(SRCDIR)/config.h$(XTCC) -o $(OBJDIR)/login.o -c$(OBJDIR)/login_.c $(OBJDIR)/login.h:$(OBJDIR)/headers   > > > | > > > > > > >  43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 ... 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 ... 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 ... 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 ... 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572   $(SRCDIR)/graph.c \$(SRCDIR)/http.c \ $(SRCDIR)/http_socket.c \$(SRCDIR)/http_ssl.c \ $(SRCDIR)/http_transport.c \$(SRCDIR)/import.c \ $(SRCDIR)/info.c \$(SRCDIR)/leaf.c \ $(SRCDIR)/login.c \$(SRCDIR)/main.c \ $(SRCDIR)/manifest.c \$(SRCDIR)/md5.c \ $(SRCDIR)/merge.c \$(SRCDIR)/merge3.c \ $(SRCDIR)/name.c \ ................................................................................$(OBJDIR)/graph_.c \ $(OBJDIR)/http_.c \$(OBJDIR)/http_socket_.c \ $(OBJDIR)/http_ssl_.c \$(OBJDIR)/http_transport_.c \ $(OBJDIR)/import_.c \$(OBJDIR)/info_.c \ $(OBJDIR)/leaf_.c \$(OBJDIR)/login_.c \ $(OBJDIR)/main_.c \$(OBJDIR)/manifest_.c \ $(OBJDIR)/md5_.c \$(OBJDIR)/merge_.c \ $(OBJDIR)/merge3_.c \$(OBJDIR)/name_.c \ ................................................................................ $(OBJDIR)/graph.o \$(OBJDIR)/http.o \ $(OBJDIR)/http_socket.o \$(OBJDIR)/http_ssl.o \ $(OBJDIR)/http_transport.o \$(OBJDIR)/import.o \ $(OBJDIR)/info.o \$(OBJDIR)/leaf.o \ $(OBJDIR)/login.o \$(OBJDIR)/main.o \ $(OBJDIR)/manifest.o \$(OBJDIR)/md5.o \ $(OBJDIR)/merge.o \$(OBJDIR)/merge3.o \ $(OBJDIR)/name.o \ ................................................................................ clean: rm -rf$(OBJDIR)/* $(APPNAME)$(OBJDIR)/page_index.h: $(TRANS_SRC)$(OBJDIR)/mkindex $(OBJDIR)/mkindex$(TRANS_SRC) >$@$(OBJDIR)/headers: $(OBJDIR)/page_index.h$(OBJDIR)/makeheaders $(OBJDIR)/VERSION.h$(OBJDIR)/makeheaders $(OBJDIR)/add_.c:$(OBJDIR)/add.h $(OBJDIR)/allrepo_.c:$(OBJDIR)/allrepo.h $(OBJDIR)/attach_.c:$(OBJDIR)/attach.h $(OBJDIR)/bag_.c:$(OBJDIR)/bag.h $(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h $(OBJDIR)/blob_.c:$(OBJDIR)/blob.h $(OBJDIR)/branch_.c:$(OBJDIR)/branch.h $(OBJDIR)/browse_.c:$(OBJDIR)/browse.h $(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h $(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h $(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h $(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h $(OBJDIR)/clearsign_.c:$(OBJDIR)/clearsign.h $(OBJDIR)/clone_.c:$(OBJDIR)/clone.h $(OBJDIR)/comformat_.c:$(OBJDIR)/comformat.h $(OBJDIR)/configure_.c:$(OBJDIR)/configure.h $(OBJDIR)/content_.c:$(OBJDIR)/content.h $(OBJDIR)/db_.c:$(OBJDIR)/db.h $(OBJDIR)/delta_.c:$(OBJDIR)/delta.h $(OBJDIR)/deltacmd_.c:$(OBJDIR)/deltacmd.h $(OBJDIR)/descendants_.c:$(OBJDIR)/descendants.h $(OBJDIR)/diff_.c:$(OBJDIR)/diff.h $(OBJDIR)/diffcmd_.c:$(OBJDIR)/diffcmd.h $(OBJDIR)/doc_.c:$(OBJDIR)/doc.h $(OBJDIR)/encode_.c:$(OBJDIR)/encode.h $(OBJDIR)/event_.c:$(OBJDIR)/event.h $(OBJDIR)/export_.c:$(OBJDIR)/export.h $(OBJDIR)/file_.c:$(OBJDIR)/file.h $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h $(OBJDIR)/graph_.c:$(OBJDIR)/graph.h $(OBJDIR)/http_.c:$(OBJDIR)/http.h $(OBJDIR)/http_socket_.c:$(OBJDIR)/http_socket.h $(OBJDIR)/http_ssl_.c:$(OBJDIR)/http_ssl.h $(OBJDIR)/http_transport_.c:$(OBJDIR)/http_transport.h $(OBJDIR)/import_.c:$(OBJDIR)/import.h $(OBJDIR)/info_.c:$(OBJDIR)/info.h $(OBJDIR)/leaf_.c:$(OBJDIR)/leaf.h $(OBJDIR)/login_.c:$(OBJDIR)/login.h $(OBJDIR)/main_.c:$(OBJDIR)/main.h $(OBJDIR)/manifest_.c:$(OBJDIR)/manifest.h $(OBJDIR)/md5_.c:$(OBJDIR)/md5.h $(OBJDIR)/merge_.c:$(OBJDIR)/merge.h $(OBJDIR)/merge3_.c:$(OBJDIR)/merge3.h $(OBJDIR)/name_.c:$(OBJDIR)/name.h $(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h $(OBJDIR)/popen_.c:$(OBJDIR)/popen.h $(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h $(OBJDIR)/printf_.c:$(OBJDIR)/printf.h $(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h $(OBJDIR)/report_.c:$(OBJDIR)/report.h $(OBJDIR)/rss_.c:$(OBJDIR)/rss.h $(OBJDIR)/schema_.c:$(OBJDIR)/schema.h $(OBJDIR)/search_.c:$(OBJDIR)/search.h $(OBJDIR)/setup_.c:$(OBJDIR)/setup.h $(OBJDIR)/sha1_.c:$(OBJDIR)/sha1.h $(OBJDIR)/shun_.c:$(OBJDIR)/shun.h $(OBJDIR)/skins_.c:$(OBJDIR)/skins.h $(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h $(OBJDIR)/stash_.c:$(OBJDIR)/stash.h $(OBJDIR)/stat_.c:$(OBJDIR)/stat.h $(OBJDIR)/style_.c:$(OBJDIR)/style.h $(OBJDIR)/sync_.c:$(OBJDIR)/sync.h $(OBJDIR)/tag_.c:$(OBJDIR)/tag.h $(OBJDIR)/th_main_.c:$(OBJDIR)/th_main.h $(OBJDIR)/timeline_.c:$(OBJDIR)/timeline.h $(OBJDIR)/tkt_.c:$(OBJDIR)/tkt.h $(OBJDIR)/tktsetup_.c:$(OBJDIR)/tktsetup.h $(OBJDIR)/undo_.c:$(OBJDIR)/undo.h $(OBJDIR)/update_.c:$(OBJDIR)/update.h $(OBJDIR)/url_.c:$(OBJDIR)/url.h $(OBJDIR)/user_.c:$(OBJDIR)/user.h $(OBJDIR)/verify_.c:$(OBJDIR)/verify.h $(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h $(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h $(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h $(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h $(OBJDIR)/xfer_.c:$(OBJDIR)/xfer.h $(OBJDIR)/zip_.c:$(OBJDIR)/zip.h $(SRCDIR)/sqlite3.h$(SRCDIR)/th.h $(OBJDIR)/VERSION.h touch$(OBJDIR)/headers $(OBJDIR)/headers: Makefile Makefile:$(OBJDIR)/add_.c: $(SRCDIR)/add.c$(OBJDIR)/translate $(OBJDIR)/translate$(SRCDIR)/add.c >$(OBJDIR)/add_.c$(OBJDIR)/add.o: $(OBJDIR)/add_.c$(OBJDIR)/add.h $(SRCDIR)/config.h ................................................................................$(OBJDIR)/info_.c: $(SRCDIR)/info.c$(OBJDIR)/translate $(OBJDIR)/translate$(SRCDIR)/info.c >$(OBJDIR)/info_.c$(OBJDIR)/info.o: $(OBJDIR)/info_.c$(OBJDIR)/info.h $(SRCDIR)/config.h$(XTCC) -o $(OBJDIR)/info.o -c$(OBJDIR)/info_.c $(OBJDIR)/info.h:$(OBJDIR)/headers $(OBJDIR)/leaf_.c:$(SRCDIR)/leaf.c $(OBJDIR)/translate$(OBJDIR)/translate $(SRCDIR)/leaf.c >$(OBJDIR)/leaf_.c $(OBJDIR)/leaf.o:$(OBJDIR)/leaf_.c $(OBJDIR)/leaf.h$(SRCDIR)/config.h $(XTCC) -o$(OBJDIR)/leaf.o -c $(OBJDIR)/leaf_.c$(OBJDIR)/leaf.h: $(OBJDIR)/headers$(OBJDIR)/login_.c: $(SRCDIR)/login.c$(OBJDIR)/translate $(OBJDIR)/translate$(SRCDIR)/login.c >$(OBJDIR)/login_.c$(OBJDIR)/login.o: $(OBJDIR)/login_.c$(OBJDIR)/login.h $(SRCDIR)/config.h$(XTCC) -o $(OBJDIR)/login.o -c$(OBJDIR)/login_.c $(OBJDIR)/login.h:$(OBJDIR)/headers 

 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 .. 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 ... 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 ... 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 ... 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 ... 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 ... 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 ... 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 ... 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 ... 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 ... 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 ... 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 ... 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 .... 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062  
• 3.8 Caveats
• 4.0 Using Makeheaders To Generate Documentation
• 5.0 Compiling The Makeheaders Program
• 6.0 Summary And Conclusion

1.0 Background

A piece of C source code can be one of two things: a declaration or a definition. A declaration is source text that gives information to the compiler but doesn't directly result in any code being generated. ................................................................................ The .c files contain #include'' preprocessor statements that cause the contents of .h files to be included as part of the source code when the .c file is compiled. In this way, the .h files define the interface to a subsystem and the .c files define how the subsystem is implemented.

1.1 Problems With The Traditional Approach

As the art of computer programming continues to advance, and the size and complexity of programs continues to swell, the traditional C approach of placing declarations and definitions in separate files begins to present the programmer with logistics and ................................................................................ In a program with complex, interwoven data structures, the correct declaration order can become very difficult to determine manually, especially when the declarations involved are spread out over several files.

The makeheaders program is designed to ameliorate the problems associated with the traditional C programming model by automatically generating the interface information in the .h files from interface information contained in other .h files and ................................................................................ so that makeheaders will be run automatically whenever the project is rebuilt. And the burden of running makeheaders is light. It will easily process tens of thousands of lines of source code per second.

The makeheaders program is very easy to run. If you have a collection of C source code and include files in the working directory, then you can run makeheaders to generate appropriate .h files using the following command: ................................................................................ you can prepend a ./'' to its name in order to get it accepted by the command line parser. Or, you can insert the special option --'' on the command line to cause all subsequent command line arguments to be treated as filenames even if their names beginn with -''.

3.0 Preparing Source Files For Use With Makeheaders

Very little has to be done to prepare source files for use with makeheaders since makeheaders will read and understand ordinary C code. But it is important that you structure your files in a way that makes sense in the makeheaders context. This section will describe several typical uses of makeheaders.

3.1 The Basic Setup

The simpliest way to use makeheaders is to put all definitions in one or more .c files and all structure and type declarations in separate .h files. The only restriction is that you should take care to chose basenames ................................................................................ those entered manually be the programmer and others generated automatically by a prior run of makeheaders. But that is not a problem. The makeheaders program will recognize and ignore any files it has previously generated that show up on its input list.

3.2 What Declarations Get Copied

The following list details all of the code constructs that makeheaders will extract and place in the automatically generated .h files:

................................................................................ As a final note, we observe that automatically generated declarations are ordered as required by the ANSI-C programming language. If the declaration of some structure X'' requires a prior declaration of another structure Y'', then Y will appear first in the generated headers.

3.3 How To Avoid Having To Write Any Header Files

In my experience, large projects work better if all of the manually written code is placed in .c files and all .h files are generated automatically. This is slightly different for the traditional C method of placing ................................................................................ #if INTERFACE'' regions of .c files. Makeheaders treats all declarations alike, no matter where they come from. You should also note that a single .c file can contain as many #if INTERFACE'' regions as desired.

3.4 Designating Declarations For Export

In a large project, one will often construct a hierarchy of interfaces. For example, you may have a group of 20 or so files that form a library used in several other parts of the system. ................................................................................ The #if EXPORT_INTERFACE'' mechanism can be used in either .c or .h files. (The #if INTERFACE'' can also be used in both .h and .c files, but since it's use in a .h file would be redundant, we haven't mentioned it before.)

3.5 Local declarations processed by makeheaders

Structure declarations and typedefs that appear in .c files are normally ignored by makeheaders. Such declarations are only intended for use by the source file in which they appear and so makeheaders doesn't need to copy them into any ................................................................................ A LOCAL_INTERFACE'' block works very much like the INTERFACE'' and EXPORT_INTERFACE'' blocks described above, except that makeheaders insures that the objects declared in a LOCAL_INTERFACE are only visible to the file containing the LOCAL_INTERFACE.

3.6 Using Makeheaders With C++ Code

You can use makeheaders to generate header files for C++ code, in addition to C. Makeheaders will recognize and copy both class'' declarations and inline function definitions, and it knows not to try to generate ................................................................................

Makeheaders does not understand more recent C++ syntax such as templates and namespaces. Perhaps these issued will be addressed in future revisions.

3.7 Conditional Compilation

The makeheaders program understands and tracks the conditional compilation constructs in the source code files it scans. Hence, if the following code appears in a source file

................................................................................
#if 0   #endif
and treats the enclosed text as a comment.

3.8 Caveats

The makeheaders system is designed to be robust but it is possible for a devious programmer to fool the system, usually with unhelpful consequences. This subsection is a guide to helping you avoid trouble. ................................................................................ For most projects the code constructs that makeheaders cannot handle are very rare. As long as you avoid excessive cleverness, makeheaders will probably be able to figure out what you want and will do the right thing.

4.0 Using Makeheaders To Generate Documentation

Many people have observed the advantages of generating program documentation directly from the source code:

• Less effort is involved. It is easier to write a program than ................................................................................
• The complete text of a declaration for the object.
The exact output format will not be described here. It is simple to understand and parse and should be obvious to anyone who inspects some sample output.

The source code for makeheaders is a single file of ANSI-C code, less than 3000 lines in length. The program makes only modest demands of the system and C library and should compile without alteration on most ANSI C compilers and on most operating systems. It is known to compile using several variations of GCC for Unix as well as Cygwin32 and MSVC 5.0 for Win32.

6.0 Summary And Conclusion

The makeheaders program will automatically generate a minimal header file for each of a set of C source and header files, and will generate a composite header file for the entire source file suite, for either internal or external use.   | | | | | | | | | | | | | | | |  41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 .. 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 ... 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 ... 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 ... 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 ... 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 ... 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 ... 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 ... 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 ... 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 ... 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 ... 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 ... 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 .... 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062  

• 3.8 Caveats
• 4.0 Using Makeheaders To Generate Documentation
• 5.0 Compiling The Makeheaders Program
• 6.0 Summary And Conclusion

1.0 Background

A piece of C source code can be one of two things: a declaration or a definition. A declaration is source text that gives information to the compiler but doesn't directly result in any code being generated. ................................................................................ The .c files contain #include'' preprocessor statements that cause the contents of .h files to be included as part of the source code when the .c file is compiled. In this way, the .h files define the interface to a subsystem and the .c files define how the subsystem is implemented.

1.1 Problems With The Traditional Approach

As the art of computer programming continues to advance, and the size and complexity of programs continues to swell, the traditional C approach of placing declarations and definitions in separate files begins to present the programmer with logistics and ................................................................................ In a program with complex, interwoven data structures, the correct declaration order can become very difficult to determine manually, especially when the declarations involved are spread out over several files.

The makeheaders program is designed to ameliorate the problems associated with the traditional C programming model by automatically generating the interface information in the .h files from interface information contained in other .h files and ................................................................................ so that makeheaders will be run automatically whenever the project is rebuilt. And the burden of running makeheaders is light. It will easily process tens of thousands of lines of source code per second.

The makeheaders program is very easy to run. If you have a collection of C source code and include files in the working directory, then you can run makeheaders to generate appropriate .h files using the following command: ................................................................................ you can prepend a ./'' to its name in order to get it accepted by the command line parser. Or, you can insert the special option --'' on the command line to cause all subsequent command line arguments to be treated as filenames even if their names beginn with -''.

3.0 Preparing Source Files For Use With Makeheaders

Very little has to be done to prepare source files for use with makeheaders since makeheaders will read and understand ordinary C code. But it is important that you structure your files in a way that makes sense in the makeheaders context. This section will describe several typical uses of makeheaders.

3.1 The Basic Setup

The simpliest way to use makeheaders is to put all definitions in one or more .c files and all structure and type declarations in separate .h files. The only restriction is that you should take care to chose basenames ................................................................................ those entered manually be the programmer and others generated automatically by a prior run of makeheaders. But that is not a problem. The makeheaders program will recognize and ignore any files it has previously generated that show up on its input list.

3.2 What Declarations Get Copied

The following list details all of the code constructs that makeheaders will extract and place in the automatically generated .h files:

................................................................................ As a final note, we observe that automatically generated declarations are ordered as required by the ANSI-C programming language. If the declaration of some structure X'' requires a prior declaration of another structure Y'', then Y will appear first in the generated headers.

3.3 How To Avoid Having To Write Any Header Files

In my experience, large projects work better if all of the manually written code is placed in .c files and all .h files are generated automatically. This is slightly different for the traditional C method of placing ................................................................................ #if INTERFACE'' regions of .c files. Makeheaders treats all declarations alike, no matter where they come from. You should also note that a single .c file can contain as many #if INTERFACE'' regions as desired.

3.4 Designating Declarations For Export

In a large project, one will often construct a hierarchy of interfaces. For example, you may have a group of 20 or so files that form a library used in several other parts of the system. ................................................................................ The #if EXPORT_INTERFACE'' mechanism can be used in either .c or .h files. (The #if INTERFACE'' can also be used in both .h and .c files, but since it's use in a .h file would be redundant, we haven't mentioned it before.)

3.5 Local declarations processed by makeheaders

Structure declarations and typedefs that appear in .c files are normally ignored by makeheaders. Such declarations are only intended for use by the source file in which they appear and so makeheaders doesn't need to copy them into any ................................................................................ A LOCAL_INTERFACE'' block works very much like the INTERFACE'' and EXPORT_INTERFACE'' blocks described above, except that makeheaders insures that the objects declared in a LOCAL_INTERFACE are only visible to the file containing the LOCAL_INTERFACE.

3.6 Using Makeheaders With C++ Code

You can use makeheaders to generate header files for C++ code, in addition to C. Makeheaders will recognize and copy both class'' declarations and inline function definitions, and it knows not to try to generate ................................................................................

Makeheaders does not understand more recent C++ syntax such as templates and namespaces. Perhaps these issued will be addressed in future revisions.

3.7 Conditional Compilation

The makeheaders program understands and tracks the conditional compilation constructs in the source code files it scans. Hence, if the following code appears in a source file

................................................................................
#if 0   #endif
and treats the enclosed text as a comment.

3.8 Caveats

The makeheaders system is designed to be robust but it is possible for a devious programmer to fool the system, usually with unhelpful consequences. This subsection is a guide to helping you avoid trouble. ................................................................................ For most projects the code constructs that makeheaders cannot handle are very rare. As long as you avoid excessive cleverness, makeheaders will probably be able to figure out what you want and will do the right thing.

4.0 Using Makeheaders To Generate Documentation

Many people have observed the advantages of generating program documentation directly from the source code:

• Less effort is involved. It is easier to write a program than ................................................................................
• The complete text of a declaration for the object.
The exact output format will not be described here. It is simple to understand and parse and should be obvious to anyone who inspects some sample output.

The source code for makeheaders is a single file of ANSI-C code, less than 3000 lines in length. The program makes only modest demands of the system and C library and should compile without alteration on most ANSI C compilers and on most operating systems. It is known to compile using several variations of GCC for Unix as well as Cygwin32 and MSVC 5.0 for Win32.

6.0 Summary And Conclusion

The makeheaders program will automatically generate a minimal header file for each of a set of C source and header files, and will generate a composite header file for the entire source file suite, for either internal or external use. 

• Changes to src/makemake.tcl.

 49 50 51 52 53 54 55 56 57 58 59 60 61 62   finfo graph http http_socket http_transport import info login main manifest md5 merge merge3 name   >  49 50 51 52 53 54 55 56 57 58 59 60 61 62 63   finfo graph http http_socket http_transport import info leaf login main manifest md5 merge merge3 name 

Changes to src/schema.c.

 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 ... 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228  ** The content tables have a content version number which rarely ** changes. The aux tables have an arbitrary version number (typically ** a date) which can change frequently. When the content schema changes, ** we have to execute special procedures to update the schema. When ** the aux schema changes, all we need to do is rebuild the database. */ #define CONTENT_SCHEMA "1" #define AUX_SCHEMA "2010-11-24" #endif /* INTERFACE */ /* ** The schema for a repository database. ** ................................................................................ @ -- Filenames @ -- @ CREATE TABLE filename( @ fnid INTEGER PRIMARY KEY, -- Filename ID @ name TEXT UNIQUE -- Name of file page @ ); @ @ -- Linkages between manifests, files created by that manifest, and @ -- the names of those files. @ -- @ -- pid==0 if the file is added by check-in mid. @ -- fid==0 if the file is removed by check-in mid. @ -- @ CREATE TABLE mlink( @ mid INTEGER REFERENCES blob, -- Manifest ID where change occurs @ pid INTEGER REFERENCES blob, -- File ID in parent manifest @ fid INTEGER REFERENCES blob, -- Changed file ID in this manifest @ fnid INTEGER REFERENCES filename, -- Name of the file @ pfnid INTEGER REFERENCES filename -- Previous name. 0 if unchanged @ ); @ CREATE INDEX mlink_i1 ON mlink(mid); @ CREATE INDEX mlink_i2 ON mlink(fnid); @ CREATE INDEX mlink_i3 ON mlink(fid); @ CREATE INDEX mlink_i4 ON mlink(pid); @ @ -- Parent/child linkages @ -- @ CREATE TABLE plink( @ pid INTEGER REFERENCES blob, -- Parent manifest @ cid INTEGER REFERENCES blob, -- Child manifest @ isprim BOOLEAN, -- pid is the primary parent of cid @ mtime DATETIME, -- the date/time stamp on cid @ UNIQUE(pid, cid) @ ); @ CREATE INDEX plink_i2 ON plink(cid,pid); @ @ -- Events used to generate a timeline @ -- @ CREATE TABLE event( @ type TEXT, -- Type of event: 'ci', 'w', 'e', 't' @ mtime DATETIME, -- Date and time when the event occurs @ objid INTEGER PRIMARY KEY, -- Associated record ID   | | | | | > > > > > > > > >  38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 ... 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237  ** The content tables have a content version number which rarely ** changes. The aux tables have an arbitrary version number (typically ** a date) which can change frequently. When the content schema changes, ** we have to execute special procedures to update the schema. When ** the aux schema changes, all we need to do is rebuild the database. */ #define CONTENT_SCHEMA "1" #define AUX_SCHEMA "2011-01-28" #endif /* INTERFACE */ /* ** The schema for a repository database. ** ................................................................................ @ -- Filenames @ -- @ CREATE TABLE filename( @ fnid INTEGER PRIMARY KEY, -- Filename ID @ name TEXT UNIQUE -- Name of file page @ ); @ @ -- Linkages between checkins, files created by each checkin, and @ -- the names of those files. @ -- @ -- pid==0 if the file is added by checkin mid. @ -- fid==0 if the file is removed by checkin mid. @ -- @ CREATE TABLE mlink( @ mid INTEGER REFERENCES blob, -- Manifest ID where change occurs @ pid INTEGER REFERENCES blob, -- File ID in parent manifest @ fid INTEGER REFERENCES blob, -- Changed file ID in this manifest @ fnid INTEGER REFERENCES filename, -- Name of the file @ pfnid INTEGER REFERENCES filename -- Previous name. 0 if unchanged @ ); @ CREATE INDEX mlink_i1 ON mlink(mid); @ CREATE INDEX mlink_i2 ON mlink(fnid); @ CREATE INDEX mlink_i3 ON mlink(fid); @ CREATE INDEX mlink_i4 ON mlink(pid); @ @ -- Parent/child linkages between checkins @ -- @ CREATE TABLE plink( @ pid INTEGER REFERENCES blob, -- Parent manifest @ cid INTEGER REFERENCES blob, -- Child manifest @ isprim BOOLEAN, -- pid is the primary parent of cid @ mtime DATETIME, -- the date/time stamp on cid @ UNIQUE(pid, cid) @ ); @ CREATE INDEX plink_i2 ON plink(cid,pid); @ @ -- A "leaf" checkin is a checkin that has no children in the same @ -- branch. The set of all leaves is easily computed with a join, @ -- between the plink and tagxref tables, but it is a slower join for @ -- very large repositories (repositories with 100,000 or more checkins) @ -- and so it makes sense to precompute the set of leaves. There is @ -- one entry in the following table for each leaf. @ -- @ CREATE TABLE leaf(rid INTEGER PRIMARY KEY); @ @ -- Events used to generate a timeline @ -- @ CREATE TABLE event( @ type TEXT, -- Type of event: 'ci', 'w', 'e', 't' @ mtime DATETIME, -- Date and time when the event occurs @ objid INTEGER PRIMARY KEY, -- Associated record ID 

Changes to src/tag.c.

 83 84 85 86 87 88 89 90 91 92 93 94 95 96 ... 172 173 174 175 176 177 178 179 180 181 182 183 184 185 ... 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 ... 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598   db_step(&ins); db_reset(&ins); if( tagid==TAG_BGCOLOR ){ db_bind_int(&eventupdate, ":rid", cid); db_step(&eventupdate); db_reset(&eventupdate); } } } db_reset(&s); } pqueue_clear(&queue); db_finalize(&ins); db_finalize(&s); ................................................................................ "REPLACE INTO tagxref(tagid,tagtype,srcId,origid,value,mtime,rid)" " VALUES(%d,%d,%d,%d,%Q,:mtime,%d)", tagid, tagtype, srcId, rid, zValue, rid ); db_bind_double(&s, ":mtime", mtime); db_step(&s); db_finalize(&s); if( tagtype==0 ){ zValue = 0; } zCol = 0; switch( tagid ){ case TAG_BGCOLOR: { zCol = "bgcolor"; ................................................................................ } } @ db_finalize(&q); style_footer(); } /* ** Draw the names of all tags added to check-in rid. Only tags ** that are directly applied to rid are named. Propagated tags ** are omitted. */ static void tagtimeline_extra(int rid){ Stmt q; db_prepare(&q, "SELECT substr(tagname,5) FROM tagxref, tag" " WHERE tagxref.rid=%d" " AND tagxref.tagid=tag.tagid" " AND tagxref.tagtype>0 AND tagxref.srcid>0" " AND tag.tagname GLOB 'sym-*'", rid ); while( db_step(&q)==SQLITE_ROW ){ const char *zTagName = db_column_text(&q, 0); if( g.okHistory ){ @ @ [%h(zTagName)] }else{ @ [%h(zTagName)] } } db_finalize(&q); } /* ** WEBPAGE: /tagtimeline */ void tagtimeline_page(void){ Stmt q; login_check_credentials(); ................................................................................ "%s AND blob.rid IN (SELECT rid FROM tagxref" " WHERE tagtype=1 AND srcid>0" " AND tagid IN (SELECT tagid FROM tag " " WHERE tagname GLOB 'sym-*'))" " ORDER BY event.mtime DESC", timeline_query_for_www() ); www_print_timeline(&q, 0, 0, 0, tagtimeline_extra); db_finalize(&q); @
@ style_footer(); }   > > > > < < < < < < < < < < < < < < < < < < < < < < < < < < < |  83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 ... 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 ... 537 538 539 540 541 542 543 544 545 546 547 548 549 550 ... 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575   db_step(&ins); db_reset(&ins); if( tagid==TAG_BGCOLOR ){ db_bind_int(&eventupdate, ":rid", cid); db_step(&eventupdate); db_reset(&eventupdate); } if( tagid==TAG_BRANCH ){ leaf_eventually_check(cid); } } } db_reset(&s); } pqueue_clear(&queue); db_finalize(&ins); db_finalize(&s); ................................................................................ "REPLACE INTO tagxref(tagid,tagtype,srcId,origid,value,mtime,rid)" " VALUES(%d,%d,%d,%d,%Q,:mtime,%d)", tagid, tagtype, srcId, rid, zValue, rid ); db_bind_double(&s, ":mtime", mtime); db_step(&s); db_finalize(&s); if( tagid==TAG_BRANCH ) leaf_eventually_check(rid); if( tagtype==0 ){ zValue = 0; } zCol = 0; switch( tagid ){ case TAG_BGCOLOR: { zCol = "bgcolor"; ................................................................................ } } @ db_finalize(&q); style_footer(); } /* ** WEBPAGE: /tagtimeline */ void tagtimeline_page(void){ Stmt q; login_check_credentials(); ................................................................................ "%s AND blob.rid IN (SELECT rid FROM tagxref" " WHERE tagtype=1 AND srcid>0" " AND tagid IN (SELECT tagid FROM tag " " WHERE tagname GLOB 'sym-*'))" " ORDER BY event.mtime DESC", timeline_query_for_www() ); www_print_timeline(&q, 0, 0, 0, 0); db_finalize(&q); @
@ style_footer(); } 

Changes to src/timeline.c.

 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655   static const char zBaseSql[] = @ SELECT @ blob.rid, @ uuid, @ datetime(event.mtime,'localtime') AS timestamp, @ coalesce(ecomment, comment), @ coalesce(euser, user), @ NOT EXISTS(SELECT 1 FROM plink @ WHERE pid=blob.rid @ AND coalesce((SELECT value FROM tagxref @ WHERE tagid=%d AND rid=plink.pid), 'trunk') @ = coalesce((SELECT value FROM tagxref @ WHERE tagid=%d AND rid=plink.cid), 'trunk')), @ bgcolor, @ event.type, @ (SELECT group_concat(substr(tagname,5), ', ') FROM tag, tagxref @ WHERE tagname GLOB 'sym-*' AND tag.tagid=tagxref.tagid @ AND tagxref.rid=blob.rid AND tagxref.tagtype>0), @ tagid, @ brief,   | < < < < <  636 637 638 639 640 641 642 643 644 645 646 647 648 649 650   static const char zBaseSql[] = @ SELECT @ blob.rid, @ uuid, @ datetime(event.mtime,'localtime') AS timestamp, @ coalesce(ecomment, comment), @ coalesce(euser, user), @ blob.rid IN leaf, @ bgcolor, @ event.type, @ (SELECT group_concat(substr(tagname,5), ', ') FROM tag, tagxref @ WHERE tagname GLOB 'sym-*' AND tag.tagid=tagxref.tagid @ AND tagxref.rid=blob.rid AND tagxref.tagtype>0), @ tagid, @ brief, 

Changes to win/Makefile.dmc.

 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 .. 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 ... 303 304 305 306 307 308 309 310 311 312 313 314 315 316 ... 551 552 553 554 555 556 557 558 559  I18N = -DFOSSIL_I18N=0 CFLAGS = -o BCC = $(DMDIR)\bin\dmc$(CFLAGS) TCC = $(DMDIR)\bin\dmc$(CFLAGS) $(DMCDEF)$(I18N) $(SSL)$(INCL) LIBS = $(DMDIR)\extra\lib\ zlib wsock32 SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.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 graph_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c login_.c main_.c manifest_.c md5_.c merge_.c merge3_.c name_.c pivot_.c popen_.c pqueue_.c printf_.c rebuild_.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 th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c update_.c url_.c user_.c verify_.c vfile_.c wiki_.c wikiformat_.c winhttp_.c xfer_.c zip_.c 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)\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)\graph$O$(OBJDIR)\http$O$(OBJDIR)\http_socket$O$(OBJDIR)\http_ssl$O$(OBJDIR)\http_transport$O$(OBJDIR)\import$O$(OBJDIR)\info$O$(OBJDIR)\login$O$(OBJDIR)\main$O$(OBJDIR)\manifest$O$(OBJDIR)\md5$O$(OBJDIR)\merge$O$(OBJDIR)\merge3$O$(OBJDIR)\name$O$(OBJDIR)\pivot$O$(OBJDIR)\popen$O$(OBJDIR)\pqueue$O$(OBJDIR)\printf$O$(OBJDIR)\rebuild$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)\th_main$O$(OBJDIR)\timeline$O$(OBJDIR)\tkt$O$(OBJDIR)\tktsetup$O$(OBJDIR)\undo$O$(OBJDIR)\update$O$(OBJDIR)\url$O$(OBJDIR)\user$O$(OBJDIR)\verify$O$(OBJDIR)\vfile$O$(OBJDIR)\wiki$O$(OBJDIR)\wikiformat$O$(OBJDIR)\winhttp$O$(OBJDIR)\xfer$O$(OBJDIR)\zip$O$(OBJDIR)\shell$O$(OBJDIR)\sqlcmd$O$(OBJDIR)\sqlite3$O$(OBJDIR)\th$O$(OBJDIR)\th_lang$O RC=$(DMDIR)\bin\rcc RCFLAGS=-32 -w1 -I$(SRCDIR) /D__DMC__ APPNAME =$(OBJDIR)\fossil$(E) ................................................................................ cd$(OBJDIR) $(DMDIR)\bin\link @link$(OBJDIR)\fossil.res: $B\win\fossil.rc$(RC) $(RCFLAGS) -o$@ $**$(OBJDIR)\link: $B\win\Makefile.dmc$(OBJDIR)\fossil.res +echo add allrepo attach bag bisect blob branch browse captcha cgi checkin checkout clearsign clone comformat configure content db delta deltacmd descendants diff diffcmd doc encode event export file finfo graph http http_socket http_ssl http_transport import info login main manifest md5 merge merge3 name pivot popen pqueue printf rebuild report rss schema search setup sha1 shun skins sqlcmd stash stat style sync tag th_main timeline tkt tktsetup undo update url user verify vfile wiki wikiformat winhttp xfer zip shell sqlcmd sqlite3 th th_lang > $@ +echo fossil >>$@ +echo fossil >> $@ +echo$(LIBS) >> $@ +echo. >>$@ +echo fossil >> $@ translate$E: $(SRCDIR)\translate.c ................................................................................ +translate$E $** >$@ $(OBJDIR)\info$O : info_.c info.h $(TCC) -o$@ -c info_.c info_.c : $(SRCDIR)\info.c +translate$E $** >$@ $(OBJDIR)\login$O : login_.c login.h $(TCC) -o$@ -c login_.c login_.c : $(SRCDIR)\login.c +translate$E $** >$@ ................................................................................ $(OBJDIR)\zip$O : zip_.c zip.h $(TCC) -o$@ -c zip_.c zip_.c : $(SRCDIR)\zip.c +translate$E $** >$@ headers: makeheaders$E page_index.h VERSION.h +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 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 graph_.c:graph.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 login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.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 th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winhttp_.c:winhttp.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)\sqlite3.h$(SRCDIR)\th.h VERSION.h @copy /Y nul: headers   | | | > > > > > > |  20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 .. 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 ... 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 ... 557 558 559 560 561 562 563 564 565  I18N = -DFOSSIL_I18N=0 CFLAGS = -o BCC = $(DMDIR)\bin\dmc$(CFLAGS) TCC = $(DMDIR)\bin\dmc$(CFLAGS) $(DMCDEF)$(I18N) $(SSL)$(INCL) LIBS = $(DMDIR)\extra\lib\ zlib wsock32 SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.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 graph_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c leaf_.c login_.c main_.c manifest_.c md5_.c merge_.c merge3_.c name_.c pivot_.c popen_.c pqueue_.c printf_.c rebuild_.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 th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c update_.c url_.c user_.c verify_.c vfile_.c wiki_.c wikiformat_.c winhttp_.c xfer_.c zip_.c 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)\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)\graph$O$(OBJDIR)\http$O$(OBJDIR)\http_socket$O$(OBJDIR)\http_ssl$O$(OBJDIR)\http_transport$O$(OBJDIR)\import$O$(OBJDIR)\info$O$(OBJDIR)\leaf$O$(OBJDIR)\login$O$(OBJDIR)\main$O$(OBJDIR)\manifest$O$(OBJDIR)\md5$O$(OBJDIR)\merge$O$(OBJDIR)\merge3$O$(OBJDIR)\name$O$(OBJDIR)\pivot$O$(OBJDIR)\popen$O$(OBJDIR)\pqueue$O$(OBJDIR)\printf$O$(OBJDIR)\rebuild$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)\th_main$O$(OBJDIR)\timeline$O$(OBJDIR)\tkt$O$(OBJDIR)\tktsetup$O$(OBJDIR)\undo$O$(OBJDIR)\update$O$(OBJDIR)\url$O$(OBJDIR)\user$O$(OBJDIR)\verify$O$(OBJDIR)\vfile$O$(OBJDIR)\wiki$O$(OBJDIR)\wikiformat$O$(OBJDIR)\winhttp$O$(OBJDIR)\xfer$O$(OBJDIR)\zip$O$(OBJDIR)\shell$O$(OBJDIR)\sqlcmd$O$(OBJDIR)\sqlite3$O$(OBJDIR)\th$O$(OBJDIR)\th_lang$O RC=$(DMDIR)\bin\rcc RCFLAGS=-32 -w1 -I$(SRCDIR) /D__DMC__ APPNAME =$(OBJDIR)\fossil$(E) ................................................................................ cd$(OBJDIR) $(DMDIR)\bin\link @link$(OBJDIR)\fossil.res: $B\win\fossil.rc$(RC) $(RCFLAGS) -o$@ $**$(OBJDIR)\link: $B\win\Makefile.dmc$(OBJDIR)\fossil.res +echo add allrepo attach bag bisect blob branch browse captcha cgi checkin checkout clearsign clone comformat configure content db delta deltacmd descendants diff diffcmd doc encode event export file finfo graph http http_socket http_ssl http_transport import info leaf login main manifest md5 merge merge3 name pivot popen pqueue printf rebuild report rss schema search setup sha1 shun skins sqlcmd stash stat style sync tag th_main timeline tkt tktsetup undo update url user verify vfile wiki wikiformat winhttp xfer zip shell sqlcmd sqlite3 th th_lang > $@ +echo fossil >>$@ +echo fossil >> $@ +echo$(LIBS) >> $@ +echo. >>$@ +echo fossil >> $@ translate$E: $(SRCDIR)\translate.c ................................................................................ +translate$E $** >$@ $(OBJDIR)\info$O : info_.c info.h $(TCC) -o$@ -c info_.c info_.c : $(SRCDIR)\info.c +translate$E $** >$@ $(OBJDIR)\leaf$O : leaf_.c leaf.h $(TCC) -o$@ -c leaf_.c leaf_.c : $(SRCDIR)\leaf.c +translate$E $** >$@ $(OBJDIR)\login$O : login_.c login.h $(TCC) -o$@ -c login_.c login_.c : $(SRCDIR)\login.c +translate$E $** >$@ ................................................................................ $(OBJDIR)\zip$O : zip_.c zip.h $(TCC) -o$@ -c zip_.c zip_.c : $(SRCDIR)\zip.c +translate$E $** >$@ headers: makeheaders$E page_index.h VERSION.h +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 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 graph_.c:graph.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 leaf_.c:leaf.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.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 th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winhttp_.c:winhttp.h xfer_.c:xfer.h zip_.c:zip.h $(SRCDIR)\sqlite3.h$(SRCDIR)\th.h VERSION.h @copy /Y nul: headers 

Changes to win/Makefile.mingw.

 102 103 104 105 106 107 108 109 110 111 112 113 114 115 ... 181 182 183 184 185 186 187 188 189 190 191 192 193 194 ... 260 261 262 263 264 265 266 267 268 269 270 271 272 273 ... 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 ... 618 619 620 621 622 623 624 625 626 627 628 629 630 631   $(SRCDIR)/graph.c \$(SRCDIR)/http.c \ $(SRCDIR)/http_socket.c \$(SRCDIR)/http_ssl.c \ $(SRCDIR)/http_transport.c \$(SRCDIR)/import.c \ $(SRCDIR)/info.c \$(SRCDIR)/login.c \ $(SRCDIR)/main.c \$(SRCDIR)/manifest.c \ $(SRCDIR)/md5.c \$(SRCDIR)/merge.c \ $(SRCDIR)/merge3.c \$(SRCDIR)/name.c \ ................................................................................ $(OBJDIR)/graph_.c \$(OBJDIR)/http_.c \ $(OBJDIR)/http_socket_.c \$(OBJDIR)/http_ssl_.c \ $(OBJDIR)/http_transport_.c \$(OBJDIR)/import_.c \ $(OBJDIR)/info_.c \$(OBJDIR)/login_.c \ $(OBJDIR)/main_.c \$(OBJDIR)/manifest_.c \ $(OBJDIR)/md5_.c \$(OBJDIR)/merge_.c \ $(OBJDIR)/merge3_.c \$(OBJDIR)/name_.c \ ................................................................................ $(OBJDIR)/graph.o \$(OBJDIR)/http.o \ $(OBJDIR)/http_socket.o \$(OBJDIR)/http_ssl.o \ $(OBJDIR)/http_transport.o \$(OBJDIR)/import.o \ $(OBJDIR)/info.o \$(OBJDIR)/login.o \ $(OBJDIR)/main.o \$(OBJDIR)/manifest.o \ $(OBJDIR)/md5.o \$(OBJDIR)/merge.o \ $(OBJDIR)/merge3.o \$(OBJDIR)/name.o \ ................................................................................ clean: rm -rf $(OBJDIR)$(APPNAME) $(OBJDIR)/page_index.h:$(TRANS_SRC) $(OBJDIR)/mkindex$(MKINDEX) $(TRANS_SRC) >$@ $(OBJDIR)/headers:$(OBJDIR)/page_index.h $(OBJDIR)/makeheaders$(OBJDIR)/VERSION.h $(MAKEHEADERS)$(OBJDIR)/add_.c:$(OBJDIR)/add.h$(OBJDIR)/allrepo_.c:$(OBJDIR)/allrepo.h$(OBJDIR)/attach_.c:$(OBJDIR)/attach.h$(OBJDIR)/bag_.c:$(OBJDIR)/bag.h$(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h$(OBJDIR)/blob_.c:$(OBJDIR)/blob.h$(OBJDIR)/branch_.c:$(OBJDIR)/branch.h$(OBJDIR)/browse_.c:$(OBJDIR)/browse.h$(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h$(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h$(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h$(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h$(OBJDIR)/clearsign_.c:$(OBJDIR)/clearsign.h$(OBJDIR)/clone_.c:$(OBJDIR)/clone.h$(OBJDIR)/comformat_.c:$(OBJDIR)/comformat.h$(OBJDIR)/configure_.c:$(OBJDIR)/configure.h$(OBJDIR)/content_.c:$(OBJDIR)/content.h$(OBJDIR)/db_.c:$(OBJDIR)/db.h$(OBJDIR)/delta_.c:$(OBJDIR)/delta.h$(OBJDIR)/deltacmd_.c:$(OBJDIR)/deltacmd.h$(OBJDIR)/descendants_.c:$(OBJDIR)/descendants.h$(OBJDIR)/diff_.c:$(OBJDIR)/diff.h$(OBJDIR)/diffcmd_.c:$(OBJDIR)/diffcmd.h$(OBJDIR)/doc_.c:$(OBJDIR)/doc.h$(OBJDIR)/encode_.c:$(OBJDIR)/encode.h$(OBJDIR)/event_.c:$(OBJDIR)/event.h$(OBJDIR)/export_.c:$(OBJDIR)/export.h$(OBJDIR)/file_.c:$(OBJDIR)/file.h$(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h$(OBJDIR)/graph_.c:$(OBJDIR)/graph.h$(OBJDIR)/http_.c:$(OBJDIR)/http.h$(OBJDIR)/http_socket_.c:$(OBJDIR)/http_socket.h$(OBJDIR)/http_ssl_.c:$(OBJDIR)/http_ssl.h$(OBJDIR)/http_transport_.c:$(OBJDIR)/http_transport.h$(OBJDIR)/import_.c:$(OBJDIR)/import.h$(OBJDIR)/info_.c:$(OBJDIR)/info.h$(OBJDIR)/login_.c:$(OBJDIR)/login.h$(OBJDIR)/main_.c:$(OBJDIR)/main.h$(OBJDIR)/manifest_.c:$(OBJDIR)/manifest.h$(OBJDIR)/md5_.c:$(OBJDIR)/md5.h$(OBJDIR)/merge_.c:$(OBJDIR)/merge.h$(OBJDIR)/merge3_.c:$(OBJDIR)/merge3.h$(OBJDIR)/name_.c:$(OBJDIR)/name.h$(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h$(OBJDIR)/popen_.c:$(OBJDIR)/popen.h$(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h$(OBJDIR)/printf_.c:$(OBJDIR)/printf.h$(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h$(OBJDIR)/report_.c:$(OBJDIR)/report.h$(OBJDIR)/rss_.c:$(OBJDIR)/rss.h$(OBJDIR)/schema_.c:$(OBJDIR)/schema.h$(OBJDIR)/search_.c:$(OBJDIR)/search.h$(OBJDIR)/setup_.c:$(OBJDIR)/setup.h$(OBJDIR)/sha1_.c:$(OBJDIR)/sha1.h$(OBJDIR)/shun_.c:$(OBJDIR)/shun.h$(OBJDIR)/skins_.c:$(OBJDIR)/skins.h$(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h$(OBJDIR)/stash_.c:$(OBJDIR)/stash.h$(OBJDIR)/stat_.c:$(OBJDIR)/stat.h$(OBJDIR)/style_.c:$(OBJDIR)/style.h$(OBJDIR)/sync_.c:$(OBJDIR)/sync.h$(OBJDIR)/tag_.c:$(OBJDIR)/tag.h$(OBJDIR)/th_main_.c:$(OBJDIR)/th_main.h$(OBJDIR)/timeline_.c:$(OBJDIR)/timeline.h$(OBJDIR)/tkt_.c:$(OBJDIR)/tkt.h$(OBJDIR)/tktsetup_.c:$(OBJDIR)/tktsetup.h$(OBJDIR)/undo_.c:$(OBJDIR)/undo.h$(OBJDIR)/update_.c:$(OBJDIR)/update.h$(OBJDIR)/url_.c:$(OBJDIR)/url.h$(OBJDIR)/user_.c:$(OBJDIR)/user.h$(OBJDIR)/verify_.c:$(OBJDIR)/verify.h$(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h$(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h$(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h$(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h$(OBJDIR)/xfer_.c:$(OBJDIR)/xfer.h$(OBJDIR)/zip_.c:$(OBJDIR)/zip.h$(SRCDIR)/sqlite3.h $(SRCDIR)/th.h$(OBJDIR)/VERSION.h echo Done >$(OBJDIR)/headers$(OBJDIR)/headers: Makefile Makefile: $(OBJDIR)/add_.c:$(SRCDIR)/add.c $(OBJDIR)/translate$(TRANSLATE) $(SRCDIR)/add.c >$(OBJDIR)/add_.c ................................................................................ $(OBJDIR)/info_.c:$(SRCDIR)/info.c $(OBJDIR)/translate$(TRANSLATE) $(SRCDIR)/info.c >$(OBJDIR)/info_.c $(OBJDIR)/info.o:$(OBJDIR)/info_.c $(OBJDIR)/info.h$(SRCDIR)/config.h $(XTCC) -o$(OBJDIR)/info.o -c $(OBJDIR)/info_.c info.h:$(OBJDIR)/headers $(OBJDIR)/login_.c:$(SRCDIR)/login.c $(OBJDIR)/translate$(TRANSLATE) $(SRCDIR)/login.c >$(OBJDIR)/login_.c $(OBJDIR)/login.o:$(OBJDIR)/login_.c $(OBJDIR)/login.h$(SRCDIR)/config.h $(XTCC) -o$(OBJDIR)/login.o -c $(OBJDIR)/login_.c login.h:$(OBJDIR)/headers   > > > | > > > > > > >  102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 ... 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 ... 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 ... 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 ... 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641   $(SRCDIR)/graph.c \$(SRCDIR)/http.c \ $(SRCDIR)/http_socket.c \$(SRCDIR)/http_ssl.c \ $(SRCDIR)/http_transport.c \$(SRCDIR)/import.c \ $(SRCDIR)/info.c \$(SRCDIR)/leaf.c \ $(SRCDIR)/login.c \$(SRCDIR)/main.c \ $(SRCDIR)/manifest.c \$(SRCDIR)/md5.c \ $(SRCDIR)/merge.c \$(SRCDIR)/merge3.c \ $(SRCDIR)/name.c \ ................................................................................$(OBJDIR)/graph_.c \ $(OBJDIR)/http_.c \$(OBJDIR)/http_socket_.c \ $(OBJDIR)/http_ssl_.c \$(OBJDIR)/http_transport_.c \ $(OBJDIR)/import_.c \$(OBJDIR)/info_.c \ $(OBJDIR)/leaf_.c \$(OBJDIR)/login_.c \ $(OBJDIR)/main_.c \$(OBJDIR)/manifest_.c \ $(OBJDIR)/md5_.c \$(OBJDIR)/merge_.c \ $(OBJDIR)/merge3_.c \$(OBJDIR)/name_.c \ ................................................................................ $(OBJDIR)/graph.o \$(OBJDIR)/http.o \ $(OBJDIR)/http_socket.o \$(OBJDIR)/http_ssl.o \ $(OBJDIR)/http_transport.o \$(OBJDIR)/import.o \ $(OBJDIR)/info.o \$(OBJDIR)/leaf.o \ $(OBJDIR)/login.o \$(OBJDIR)/main.o \ $(OBJDIR)/manifest.o \$(OBJDIR)/md5.o \ $(OBJDIR)/merge.o \$(OBJDIR)/merge3.o \ $(OBJDIR)/name.o \ ................................................................................ clean: rm -rf$(OBJDIR) $(APPNAME)$(OBJDIR)/page_index.h: $(TRANS_SRC)$(OBJDIR)/mkindex $(MKINDEX)$(TRANS_SRC) >$@$(OBJDIR)/headers: $(OBJDIR)/page_index.h$(OBJDIR)/makeheaders $(OBJDIR)/VERSION.h$(MAKEHEADERS) $(OBJDIR)/add_.c:$(OBJDIR)/add.h $(OBJDIR)/allrepo_.c:$(OBJDIR)/allrepo.h $(OBJDIR)/attach_.c:$(OBJDIR)/attach.h $(OBJDIR)/bag_.c:$(OBJDIR)/bag.h $(OBJDIR)/bisect_.c:$(OBJDIR)/bisect.h $(OBJDIR)/blob_.c:$(OBJDIR)/blob.h $(OBJDIR)/branch_.c:$(OBJDIR)/branch.h $(OBJDIR)/browse_.c:$(OBJDIR)/browse.h $(OBJDIR)/captcha_.c:$(OBJDIR)/captcha.h $(OBJDIR)/cgi_.c:$(OBJDIR)/cgi.h $(OBJDIR)/checkin_.c:$(OBJDIR)/checkin.h $(OBJDIR)/checkout_.c:$(OBJDIR)/checkout.h $(OBJDIR)/clearsign_.c:$(OBJDIR)/clearsign.h $(OBJDIR)/clone_.c:$(OBJDIR)/clone.h $(OBJDIR)/comformat_.c:$(OBJDIR)/comformat.h $(OBJDIR)/configure_.c:$(OBJDIR)/configure.h $(OBJDIR)/content_.c:$(OBJDIR)/content.h $(OBJDIR)/db_.c:$(OBJDIR)/db.h $(OBJDIR)/delta_.c:$(OBJDIR)/delta.h $(OBJDIR)/deltacmd_.c:$(OBJDIR)/deltacmd.h $(OBJDIR)/descendants_.c:$(OBJDIR)/descendants.h $(OBJDIR)/diff_.c:$(OBJDIR)/diff.h $(OBJDIR)/diffcmd_.c:$(OBJDIR)/diffcmd.h $(OBJDIR)/doc_.c:$(OBJDIR)/doc.h $(OBJDIR)/encode_.c:$(OBJDIR)/encode.h $(OBJDIR)/event_.c:$(OBJDIR)/event.h $(OBJDIR)/export_.c:$(OBJDIR)/export.h $(OBJDIR)/file_.c:$(OBJDIR)/file.h $(OBJDIR)/finfo_.c:$(OBJDIR)/finfo.h $(OBJDIR)/graph_.c:$(OBJDIR)/graph.h $(OBJDIR)/http_.c:$(OBJDIR)/http.h $(OBJDIR)/http_socket_.c:$(OBJDIR)/http_socket.h $(OBJDIR)/http_ssl_.c:$(OBJDIR)/http_ssl.h $(OBJDIR)/http_transport_.c:$(OBJDIR)/http_transport.h $(OBJDIR)/import_.c:$(OBJDIR)/import.h $(OBJDIR)/info_.c:$(OBJDIR)/info.h $(OBJDIR)/leaf_.c:$(OBJDIR)/leaf.h $(OBJDIR)/login_.c:$(OBJDIR)/login.h $(OBJDIR)/main_.c:$(OBJDIR)/main.h $(OBJDIR)/manifest_.c:$(OBJDIR)/manifest.h $(OBJDIR)/md5_.c:$(OBJDIR)/md5.h $(OBJDIR)/merge_.c:$(OBJDIR)/merge.h $(OBJDIR)/merge3_.c:$(OBJDIR)/merge3.h $(OBJDIR)/name_.c:$(OBJDIR)/name.h $(OBJDIR)/pivot_.c:$(OBJDIR)/pivot.h $(OBJDIR)/popen_.c:$(OBJDIR)/popen.h $(OBJDIR)/pqueue_.c:$(OBJDIR)/pqueue.h $(OBJDIR)/printf_.c:$(OBJDIR)/printf.h $(OBJDIR)/rebuild_.c:$(OBJDIR)/rebuild.h $(OBJDIR)/report_.c:$(OBJDIR)/report.h $(OBJDIR)/rss_.c:$(OBJDIR)/rss.h $(OBJDIR)/schema_.c:$(OBJDIR)/schema.h $(OBJDIR)/search_.c:$(OBJDIR)/search.h $(OBJDIR)/setup_.c:$(OBJDIR)/setup.h $(OBJDIR)/sha1_.c:$(OBJDIR)/sha1.h $(OBJDIR)/shun_.c:$(OBJDIR)/shun.h $(OBJDIR)/skins_.c:$(OBJDIR)/skins.h $(OBJDIR)/sqlcmd_.c:$(OBJDIR)/sqlcmd.h $(OBJDIR)/stash_.c:$(OBJDIR)/stash.h $(OBJDIR)/stat_.c:$(OBJDIR)/stat.h $(OBJDIR)/style_.c:$(OBJDIR)/style.h $(OBJDIR)/sync_.c:$(OBJDIR)/sync.h $(OBJDIR)/tag_.c:$(OBJDIR)/tag.h $(OBJDIR)/th_main_.c:$(OBJDIR)/th_main.h $(OBJDIR)/timeline_.c:$(OBJDIR)/timeline.h $(OBJDIR)/tkt_.c:$(OBJDIR)/tkt.h $(OBJDIR)/tktsetup_.c:$(OBJDIR)/tktsetup.h $(OBJDIR)/undo_.c:$(OBJDIR)/undo.h $(OBJDIR)/update_.c:$(OBJDIR)/update.h $(OBJDIR)/url_.c:$(OBJDIR)/url.h $(OBJDIR)/user_.c:$(OBJDIR)/user.h $(OBJDIR)/verify_.c:$(OBJDIR)/verify.h $(OBJDIR)/vfile_.c:$(OBJDIR)/vfile.h $(OBJDIR)/wiki_.c:$(OBJDIR)/wiki.h $(OBJDIR)/wikiformat_.c:$(OBJDIR)/wikiformat.h $(OBJDIR)/winhttp_.c:$(OBJDIR)/winhttp.h $(OBJDIR)/xfer_.c:$(OBJDIR)/xfer.h $(OBJDIR)/zip_.c:$(OBJDIR)/zip.h $(SRCDIR)/sqlite3.h$(SRCDIR)/th.h $(OBJDIR)/VERSION.h echo Done >$(OBJDIR)/headers $(OBJDIR)/headers: Makefile Makefile:$(OBJDIR)/add_.c: $(SRCDIR)/add.c$(OBJDIR)/translate $(TRANSLATE)$(SRCDIR)/add.c >$(OBJDIR)/add_.c ................................................................................$(OBJDIR)/info_.c: $(SRCDIR)/info.c$(OBJDIR)/translate $(TRANSLATE)$(SRCDIR)/info.c >$(OBJDIR)/info_.c$(OBJDIR)/info.o: $(OBJDIR)/info_.c$(OBJDIR)/info.h $(SRCDIR)/config.h$(XTCC) -o $(OBJDIR)/info.o -c$(OBJDIR)/info_.c info.h: $(OBJDIR)/headers$(OBJDIR)/leaf_.c: $(SRCDIR)/leaf.c$(OBJDIR)/translate $(TRANSLATE)$(SRCDIR)/leaf.c >$(OBJDIR)/leaf_.c$(OBJDIR)/leaf.o: $(OBJDIR)/leaf_.c$(OBJDIR)/leaf.h $(SRCDIR)/config.h$(XTCC) -o $(OBJDIR)/leaf.o -c$(OBJDIR)/leaf_.c leaf.h: $(OBJDIR)/headers$(OBJDIR)/login_.c: $(SRCDIR)/login.c$(OBJDIR)/translate $(TRANSLATE)$(SRCDIR)/login.c >$(OBJDIR)/login_.c$(OBJDIR)/login.o: $(OBJDIR)/login_.c$(OBJDIR)/login.h $(SRCDIR)/config.h$(XTCC) -o $(OBJDIR)/login.o -c$(OBJDIR)/login_.c login.h: $(OBJDIR)/headers  Changes to win/Makefile.msc.  33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 ... 307 308 309 310 311 312 313 314 315 316 317 318 319 320 ... 555 556 557 558 559 560 561 562 563   CFLAGS = -nologo -MT -O2 BCC =$(CC) $(CFLAGS) TCC =$(CC) -c $(CFLAGS)$(MSCDEF) $(I18N)$(SSL) $(INCL) LIBS =$(ZLIB) ws2_32.lib $(SSLLIB) LIBDIR = -LIBPATH:$(MSCDIR)\extra\lib -LIBPATH:$(ZLIBDIR) SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.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 graph_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c login_.c main_.c manifest_.c md5_.c merge_.c merge3_.c name_.c pivot_.c popen_.c pqueue_.c printf_.c rebuild_.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 th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c update_.c url_.c user_.c verify_.c vfile_.c wiki_.c wikiformat_.c winhttp_.c xfer_.c zip_.c 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)\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)\graph$O$(OBJDIR)\http$O$(OBJDIR)\http_socket$O$(OBJDIR)\http_ssl$O$(OBJDIR)\http_transport$O$(OBJDIR)\import$O$(OBJDIR)\info$O$(OBJDIR)\login$O$(OBJDIR)\main$O$(OBJDIR)\manifest$O$(OBJDIR)\md5$O$(OBJDIR)\merge$O$(OBJDIR)\merge3$O$(OBJDIR)\name$O$(OBJDIR)\pivot$O$(OBJDIR)\popen$O$(OBJDIR)\pqueue$O$(OBJDIR)\printf$O$(OBJDIR)\rebuild$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)\th_main$O$(OBJDIR)\timeline$O$(OBJDIR)\tkt$O$(OBJDIR)\tktsetup$O$(OBJDIR)\undo$O$(OBJDIR)\update$O$(OBJDIR)\url$O$(OBJDIR)\user$O$(OBJDIR)\verify$O$(OBJDIR)\vfile$O$(OBJDIR)\wiki$O$(OBJDIR)\wikiformat$O$(OBJDIR)\winhttp$O$(OBJDIR)\xfer$O$(OBJDIR)\zip$O$(OBJDIR)\sqlite3$O$(OBJDIR)\th$O$(OBJDIR)\th_lang$O APPNAME =$(OBJDIR)\fossil$(E) all:$(OBJDIR) $(APPNAME)$(APPNAME) : translate$E mkindex$E headers $(OBJ)$(OBJDIR)\linkopts cd $(OBJDIR) link -LINK -OUT:$@ $(LIBDIR) @linkopts$(OBJDIR)\linkopts: $B\win\Makefile.msc echo add allrepo attach bag bisect blob branch browse captcha cgi checkin checkout clearsign clone comformat configure content db delta deltacmd descendants diff diffcmd doc encode event export file finfo graph http http_socket http_ssl http_transport import info login main manifest md5 merge merge3 name pivot popen pqueue printf rebuild report rss schema search setup sha1 shun skins sqlcmd stash stat style sync tag th_main timeline tkt tktsetup undo update url user verify vfile wiki wikiformat winhttp xfer zip sqlite3 th th_lang >$@ echo $(LIBS) >>$@ $(OBJDIR): @-mkdir$@ ................................................................................ translate$E$** > $@$(OBJDIR)\info$O : info_.c info.h$(TCC) /Fo$@ -c info_.c info_.c :$(SRCDIR)\info.c translate$E$** > $@$(OBJDIR)\login$O : login_.c login.h$(TCC) /Fo$@ -c login_.c login_.c :$(SRCDIR)\login.c translate$E$** > $@ ................................................................................$(OBJDIR)\zip$O : zip_.c zip.h$(TCC) /Fo$@ -c zip_.c zip_.c :$(SRCDIR)\zip.c translate$E$** > $@ headers: makeheaders$E page_index.h VERSION.h 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 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 graph_.c:graph.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 login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.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 th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winhttp_.c:winhttp.h xfer_.c:xfer.h zip_.c:zip.h$(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h @copy /Y nul: headers   | | | > > > > > > |  33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 ... 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 ... 561 562 563 564 565 566 567 568 569   CFLAGS = -nologo -MT -O2 BCC =$(CC) $(CFLAGS) TCC =$(CC) -c $(CFLAGS)$(MSCDEF) $(I18N)$(SSL) $(INCL) LIBS =$(ZLIB) ws2_32.lib $(SSLLIB) LIBDIR = -LIBPATH:$(MSCDIR)\extra\lib -LIBPATH:$(ZLIBDIR) SRC = add_.c allrepo_.c attach_.c bag_.c bisect_.c blob_.c branch_.c browse_.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 graph_.c http_.c http_socket_.c http_ssl_.c http_transport_.c import_.c info_.c leaf_.c login_.c main_.c manifest_.c md5_.c merge_.c merge3_.c name_.c pivot_.c popen_.c pqueue_.c printf_.c rebuild_.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 th_main_.c timeline_.c tkt_.c tktsetup_.c undo_.c update_.c url_.c user_.c verify_.c vfile_.c wiki_.c wikiformat_.c winhttp_.c xfer_.c zip_.c 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)\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)\graph$O$(OBJDIR)\http$O$(OBJDIR)\http_socket$O$(OBJDIR)\http_ssl$O$(OBJDIR)\http_transport$O$(OBJDIR)\import$O$(OBJDIR)\info$O$(OBJDIR)\leaf$O$(OBJDIR)\login$O$(OBJDIR)\main$O$(OBJDIR)\manifest$O$(OBJDIR)\md5$O$(OBJDIR)\merge$O$(OBJDIR)\merge3$O$(OBJDIR)\name$O$(OBJDIR)\pivot$O$(OBJDIR)\popen$O$(OBJDIR)\pqueue$O$(OBJDIR)\printf$O$(OBJDIR)\rebuild$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)\th_main$O$(OBJDIR)\timeline$O$(OBJDIR)\tkt$O$(OBJDIR)\tktsetup$O$(OBJDIR)\undo$O$(OBJDIR)\update$O$(OBJDIR)\url$O$(OBJDIR)\user$O$(OBJDIR)\verify$O$(OBJDIR)\vfile$O$(OBJDIR)\wiki$O$(OBJDIR)\wikiformat$O$(OBJDIR)\winhttp$O$(OBJDIR)\xfer$O$(OBJDIR)\zip$O$(OBJDIR)\sqlite3$O$(OBJDIR)\th$O$(OBJDIR)\th_lang$O APPNAME =$(OBJDIR)\fossil$(E) all:$(OBJDIR) $(APPNAME)$(APPNAME) : translate$E mkindex$E headers $(OBJ)$(OBJDIR)\linkopts cd $(OBJDIR) link -LINK -OUT:$@ $(LIBDIR) @linkopts$(OBJDIR)\linkopts: $B\win\Makefile.msc echo add allrepo attach bag bisect blob branch browse captcha cgi checkin checkout clearsign clone comformat configure content db delta deltacmd descendants diff diffcmd doc encode event export file finfo graph http http_socket http_ssl http_transport import info leaf login main manifest md5 merge merge3 name pivot popen pqueue printf rebuild report rss schema search setup sha1 shun skins sqlcmd stash stat style sync tag th_main timeline tkt tktsetup undo update url user verify vfile wiki wikiformat winhttp xfer zip sqlite3 th th_lang >$@ echo $(LIBS) >>$@ $(OBJDIR): @-mkdir$@ ................................................................................ translate$E$** > $@$(OBJDIR)\info$O : info_.c info.h$(TCC) /Fo$@ -c info_.c info_.c :$(SRCDIR)\info.c translate$E$** > $@$(OBJDIR)\leaf$O : leaf_.c leaf.h$(TCC) /Fo$@ -c leaf_.c leaf_.c :$(SRCDIR)\leaf.c translate$E$** > $@$(OBJDIR)\login$O : login_.c login.h$(TCC) /Fo$@ -c login_.c login_.c :$(SRCDIR)\login.c translate$E$** > $@ ................................................................................$(OBJDIR)\zip$O : zip_.c zip.h$(TCC) /Fo$@ -c zip_.c zip_.c :$(SRCDIR)\zip.c translate$E$** > $@ headers: makeheaders$E page_index.h VERSION.h 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 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 graph_.c:graph.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 leaf_.c:leaf.h login_.c:login.h main_.c:main.h manifest_.c:manifest.h md5_.c:md5.h merge_.c:merge.h merge3_.c:merge3.h name_.c:name.h pivot_.c:pivot.h popen_.c:popen.h pqueue_.c:pqueue.h printf_.c:printf.h rebuild_.c:rebuild.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 th_main_.c:th_main.h timeline_.c:timeline.h tkt_.c:tkt.h tktsetup_.c:tktsetup.h undo_.c:undo.h update_.c:update.h url_.c:url.h user_.c:user.h verify_.c:verify.h vfile_.c:vfile.h wiki_.c:wiki.h wikiformat_.c:wikiformat.h winhttp_.c:winhttp.h xfer_.c:xfer.h zip_.c:zip.h$(SRCDIR)\sqlite3.h $(SRCDIR)\th.h VERSION.h @copy /Y nul: headers  Changes to www/checkin_names.wiki.  1 2 3 4 5 6 7 8 9 10 11 ... 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122  Check-in Names Many Fossil commands and [./webui.wiki | web-interface] URLs accept check-in names as an argument. For example, the "info" command accepts an optional check-in name to identify the specific checkout about which information is desired: fossil info checkin-name ................................................................................ The space between the day and the year can optionally be replaced by an uppercase T and the entire timestamp can optionally be followed by "utc". In its default configuration, Fossil interprets and displays all dates in Universal Coordinated Time (UTC). This tends to work the best for distributed projects where participants are scattered around the globe. But there is an open on the Admin/Timeline page of the web-interface to switch to local time. The "utc" suffix on an timestamp check-in name is meaningless if Fossil is in the default mode of using UTC for everything, but if Fossil has been switched to localtime mode, then the "utc" suffix means to interpret that particular timestamp using UTC instead localtime. As an example, consider the homepage for the Fossil website itself:   | | |  1 2 3 4 5 6 7 8 9 10 11 ... 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122  Check-in Names Many Fossil [/help|commands] and [./webui.wiki | web-interface] URLs accept check-in names as an argument. For example, the "[/help/info|info]" command accepts an optional check-in name to identify the specific checkout about which information is desired: fossil info checkin-name ................................................................................ The space between the day and the year can optionally be replaced by an uppercase T and the entire timestamp can optionally be followed by "utc". In its default configuration, Fossil interprets and displays all dates in Universal Coordinated Time (UTC). This tends to work the best for distributed projects where participants are scattered around the globe. But there is an option on the Admin/Timeline page of the web-interface to switch to local time. The "utc" suffix on an timestamp check-in name is meaningless if Fossil is in the default mode of using UTC for everything, but if Fossil has been switched to localtime mode, then the "utc" suffix means to interpret that particular timestamp using UTC instead localtime. As an example, consider the homepage for the Fossil website itself:  Changes to www/faq.tcl.  7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 .. 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 .. 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123   set ::faq($::cnt) [list [string trim $question] [string trim$answer]] incr ::cnt } faq { What GUIs are available for fossil? } { The fossil executable comes with a web-based GUI built in. Just run:
fossil ui REPOSITORY-FILENAME
And your default web browser should pop up and automatically point to the fossil interface. (Hint: You can omit the REPOSITORY-FILENAME if you are within an open check-out.) } ................................................................................ This is a big question - too big to answer in a FAQ. Please read the Branching, Forking, Merging, and Tagging document. } faq { How do I create a new branch in fossil? } { There are lots of ways: When you are checking in a new change using the commit command, you can add the option "--branch BRANCH-NAME" to make the change be the founding check-in for a new branch. You can also add the "--bgcolor COLOR" option to give the branch a specific background color on timelines. If you want to create a new branch whose founding check-in is the same as an existing check-in, use this command:
fossil branch new BRANCH-NAME BASIS
The BRANCH-NAME argument is the name of the new branch and the BASIS argument is the name of the check-in that the branch splits off from. If you already have a fork in your check-in tree and you want to convert that fork to a branch, you can do this from the web interface. First locate the check-in that you want to be the founding check-in of your branch on the timeline and click on its link so that you are on the ci page. Then find the "edit" link (near the "Commands:" label) and click on that. On the "Edit Check-in" page, check the box beside "Branching:" and fill in the name of your new branch to the right and press the "Apply Changes" button. } faq { How do I create a private branch that won't get pushed back to the main repository. } { Use the --private command-line option on the commit command. The result will be a check-in which exists on ................................................................................ } faq { How do I make a clone of the fossil self-hosting repository? } { Any of the following commands should work:
fossil  clone  http://www.fossil-scm.org/  fossil.fossil
fossil clone http://www2.fossil-scm.org/ fossil.fossil
fossil clone http://www.hwaci.com/cgi-bin/fossil fossil.fossil
Once you have the repository cloned, you can open a local check-out as follows:
mkdir src; cd src; fossil open ../fossil.fossil
Thereafter you should be able to keep your local check-out up to date with the latest code in the public repository by typing:
fossil update
} ############################################################################# # Code to actually generate the FAQ # puts "Fossil FAQ" puts "

\n" puts "

Note: See also Questions and Criticisms.\n"   | > | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | > > > > > > > >  7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 .. 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 ... 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160   set ::faq($::cnt) [list [string trim$question] [string trim \$answer]] incr ::cnt } faq { What GUIs are available for fossil? } { The fossil executable comes with a [./webui.wiki | web-based GUI] built in. Just run:

fossil [/help/ui|ui] REPOSITORY-FILENAME
And your default web browser should pop up and automatically point to the fossil interface. (Hint: You can omit the REPOSITORY-FILENAME if you are within an open check-out.) } ................................................................................ This is a big question - too big to answer in a FAQ. Please read the Branching, Forking, Merging, and Tagging document. } faq { How do I create a new branch? } { There are lots of ways: When you are checking in a new change using the [/help/commit|commit] command, you can add the option "--branch BRANCH-NAME" to make the new check-in be the first check-in for a new branch. You can also add the "--bgcolor COLOR" option to give the branch a specific background color on timelines. If you want to create a new branch whose initial content is the same as an existing check-in, use this command:
fossil [/help/branch|branch] new BRANCH-NAME BASIS
The BRANCH-NAME argument is the name of the new branch and the BASIS argument is the name of the check-in that the branch splits off from. If you already have a fork in your check-in tree and you want to convert that fork to a branch, you can do this from the web interface. First locate the check-in that you want to be the initial check-in of your branch on the timeline and click on its link so that you are on the ci page. Then find the "edit" link (near the "Commands:" label) and click on that. On the "Edit Check-in" page, check the box beside "Branching:" and fill in the name of your new branch to the right and press the "Apply Changes" button. } faq { How do I tag a check-in? } { There are several ways: When you are checking in a new change using the [/help/commit|commit] command, you can add a tag to that check-in using the "--tag TAGNAME" command-line option. If you want add a tag to an existing check-in, you can use the [/help/tag|tag] command. For example:
The CHECK-IN in the previous line can be any [./checkin_names.wiki | valid check-in name format]. You can also add (and remove) tags from a check-in using the [./webui.wiki | web interface]. First locate the check-in that you what to tag on the tmline, then click on the link to go the detailed information page for that check-in. Then find the "edit" link (near the "Commands:" label) and click on that. There are controls on the edit page that allow new tags to be added and existing tags to be removed. } faq { How do I create a private branch that won't get pushed back to the main repository. } { Use the --private command-line option on the commit command. The result will be a check-in which exists on ................................................................................ } faq { How do I make a clone of the fossil self-hosting repository? } { Any of the following commands should work:
fossil [/help/clone|clone]  http://www.fossil-scm.org/  fossil.fossil
fossil [/help/clone|clone] http://www2.fossil-scm.org/ fossil.fossil
fossil [/help/clone|clone] http://www3.fossli-scm.org/site.cgi fossil.fossil
Once you have the repository cloned, you can open a local check-out as follows:
mkdir src; cd src; fossil [/help/open|open] ../fossil.fossil
Thereafter you should be able to keep your local check-out up to date with the latest code in the public repository by typing:
fossil [/help/update|update]
} faq { How do I import or export content from and to other version control systems? } { Please see [./inout.wiki | Import And Export] } ############################################################################# # Code to actually generate the FAQ # puts "Fossil FAQ" puts "

\n" puts "

Note: See also Questions and Criticisms.\n" 

Changes to www/faq.wiki.

 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 .. 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 .. 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116  

1. What GUIs are available for fossil?
2. What is the difference between a "branch" and a "fork"?
3. How do I create a new branch in fossil?
4. How do I create a private branch that won't get pushed back to the main repository.
5. How can I delete inappropriate content from my fossil repository?
6. How do I make a clone of the fossil self-hosting repository?

(1) What GUIs are available for fossil?

The fossil executable comes with a web-based GUI built in. Just run:
fossil ui REPOSITORY-FILENAME
And your default web browser should pop up and automatically point to the fossil interface. (Hint: You can omit the REPOSITORY-FILENAME if you are within an open check-out.)
................................................................................

(2) What is the difference between a "branch" and a "fork"?

This is a big question - too big to answer in a FAQ. Please read the Branching, Forking, Merging, and Tagging document.

(3) How do I create a new branch in fossil?

There are lots of ways: When you are checking in a new change using the commit command, you can add the option "--branch BRANCH-NAME" to make the change be the founding check-in for a new branch. You can also add the "--bgcolor COLOR" option to give the branch a specific background color on timelines. If you want to create a new branch whose founding check-in is the same as an existing check-in, use this command:
fossil branch new BRANCH-NAME BASIS
The BRANCH-NAME argument is the name of the new branch and the BASIS argument is the name of the check-in that the branch splits off from. If you already have a fork in your check-in tree and you want to convert that fork to a branch, you can do this from the web interface. First locate the check-in that you want to be the founding check-in of your branch on the timeline and click on its link so that you are on the ci page. Then find the "edit" link (near the "Commands:" label) and click on that. On the "Edit Check-in" page, check the box beside "Branching:" and fill in the name of your new branch to the right and press the "Apply Changes" button.

(4) How do I create a private branch that won't get pushed back to the main repository.

Use the --private command-line option on the commit command. The result will be a check-in which exists on your local repository only and is never pushed to other repositories. All descendants of a private check-in are also private. Unless you specify something different using the --branch and/or --bgcolor options, the new private check-in will be put on a branch named "private" with an orange background color. You can merge from the trunk into your private branch in order to keep your private branch in sync with the latest changes on the trunk. Once ................................................................................ then merge your private branch back into the trunk and push. Only the final merge operation will appear in other repositories. It will seem as if all the changes that occurred on your private branch occurred in a single check-in. Of course, you can also keep your branch private forever simply by not merging the changes in the private branch back into the trunk.

(5) How can I delete inappropriate content from my fossil repository?

See the article on [./shunning.wiki | "shunning"] for details.

(6) How do I make a clone of the fossil self-hosting repository?

Any of the following commands should work:
fossil  clone  http://www.fossil-scm.org/  fossil.fossil
fossil clone http://www2.fossil-scm.org/ fossil.fossil
fossil clone http://www.hwaci.com/cgi-bin/fossil fossil.fossil
Once you have the repository cloned, you can open a local check-out as follows:
mkdir src; cd src; fossil open ../fossil.fossil
Thereafter you should be able to keep your local check-out up to date with the latest code in the public repository by typing:
fossil update
  | > | | | > | > | | | | | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > | | | | | | | | | | | > > > > >  2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 .. 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 ... 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151  

1. What GUIs are available for fossil?
2. What is the difference between a "branch" and a "fork"?
3. How do I create a new branch?
4. How do I tag a check-in?
5. How do I create a private branch that won't get pushed back to the main repository.
6. How can I delete inappropriate content from my fossil repository?
7. How do I make a clone of the fossil self-hosting repository?
8. How do I import or export content from and to other version control systems?

(1) What GUIs are available for fossil?

The fossil executable comes with a [./webui.wiki | web-based GUI] built in. Just run:
fossil [/help/ui|ui] REPOSITORY-FILENAME
And your default web browser should pop up and automatically point to the fossil interface. (Hint: You can omit the REPOSITORY-FILENAME if you are within an open check-out.)
................................................................................

(2) What is the difference between a "branch" and a "fork"?

This is a big question - too big to answer in a FAQ. Please read the Branching, Forking, Merging, and Tagging document.

(3) How do I create a new branch?

There are lots of ways: When you are checking in a new change using the [/help/commit|commit] command, you can add the option "--branch BRANCH-NAME" to make the new check-in be the first check-in for a new branch. You can also add the "--bgcolor COLOR" option to give the branch a specific background color on timelines. If you want to create a new branch whose initial content is the same as an existing check-in, use this command:
fossil [/help/branch|branch] new BRANCH-NAME BASIS
The BRANCH-NAME argument is the name of the new branch and the BASIS argument is the name of the check-in that the branch splits off from. If you already have a fork in your check-in tree and you want to convert that fork to a branch, you can do this from the web interface. First locate the check-in that you want to be the initial check-in of your branch on the timeline and click on its link so that you are on the ci page. Then find the "edit" link (near the "Commands:" label) and click on that. On the "Edit Check-in" page, check the box beside "Branching:" and fill in the name of your new branch to the right and press the "Apply Changes" button.

(4) How do I tag a check-in?

There are several ways: When you are checking in a new change using the [/help/commit|commit] command, you can add a tag to that check-in using the "--tag TAGNAME" command-line option. If you want add a tag to an existing check-in, you can use the [/help/tag|tag] command. For example:
The CHECK-IN in the previous line can be any [./checkin_names.wiki | valid check-in name format]. You can also add (and remove) tags from a check-in using the [./webui.wiki | web interface]. First locate the check-in that you what to tag on the tmline, then click on the link to go the detailed information page for that check-in. Then find the "edit" link (near the "Commands:" label) and click on that. There are controls on the edit page that allow new tags to be added and existing tags to be removed.

(5) How do I create a private branch that won't get pushed back to the main repository.

Use the --private command-line option on the commit command. The result will be a check-in which exists on your local repository only and is never pushed to other repositories. All descendents of a private check-in are also private. Unless you specify something different using the --branch and/or --bgcolor options, the new private check-in will be put on a branch named "private" with an orange background color. You can merge from the trunk into your private branch in order to keep your private branch in sync with the latest changes on the trunk. Once ................................................................................ then merge your private branch back into the trunk and push. Only the final merge operation will appear in other repositories. It will seem as if all the changes that occurred on your private branch occurred in a single check-in. Of course, you can also keep your branch private forever simply by not merging the changes in the private branch back into the trunk.

(6) How can I delete inappropriate content from my fossil repository?

See the article on [./shunning.wiki | "shunning"] for details.

(7) How do I make a clone of the fossil self-hosting repository?

Any of the following commands should work:
fossil [/help/clone|clone]  http://www.fossil-scm.org/  fossil.fossil
fossil [/help/clone|clone] http://www2.fossil-scm.org/ fossil.fossil
fossil [/help/clone|clone] http://www3.fossli-scm.org/site.cgi fossil.fossil
Once you have the repository cloned, you can open a local check-out as follows:
mkdir src; cd src; fossil [/help/open|open] ../fossil.fossil
Thereafter you should be able to keep your local check-out up to date with the latest code in the public repository by typing:
fossil [/help/update|update]

(8) How do I import or export content from and to other version control systems?

Please see [./inout.wiki | Import And Export]


Changes to www/makefile.wiki.

 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 ... 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124  should understand that whenever "src.c" or "src.h" is used in the text that follows, we really mean all (79) other source files other than the exceptions described above.

3.0 Automatically generated files

The "VERSION.h" header file contains some C preprocessor macros that identify the version of Fossil that is to be build. The VERSION.h file generated automatically from information extracted from the "manifest" and "manifest.uuid" source files in the root directory of the source tree. (The "manifest" and "manifest.uuid" files are automatically generated and updated by Fossil itself. See the [/help/setting | fossil set manifest] command for additional information.) Under unix, there is an AWK script that converts manifest and manifest.uuid ................................................................................ in the root of the source tree are the first two arguments and the name of the generated VERSION.h file is the third and final argument.

4.0 Preprocessing

There are three preprocessors for the Fossil sources. The mkindex and translate preprocessors can be run in any order. The makeheaders preprocessor has to be run after translate.

4.1 The mkindex preprocessor

The mkindex program scans the "src.c" source files looking for special comments that identify routines that implement of various Fossil commands, web interface methods, and help text comments. The mkindex program generates some C code that Fossil uses in order to dispatch commands and   | |  83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 ... 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124  should understand that whenever "src.c" or "src.h" is used in the text that follows, we really mean all (79) other source files other than the exceptions described above.

3.0 Automatically generated files

The "VERSION.h" header file contains some C preprocessor macros that identify the version of Fossil that is to be build. The VERSION.h file is generated automatically from information extracted from the "manifest" and "manifest.uuid" source files in the root directory of the source tree. (The "manifest" and "manifest.uuid" files are automatically generated and updated by Fossil itself. See the [/help/setting | fossil set manifest] command for additional information.) Under unix, there is an AWK script that converts manifest and manifest.uuid ................................................................................ in the root of the source tree are the first two arguments and the name of the generated VERSION.h file is the third and final argument.

4.0 Preprocessing

There are three preprocessors for the Fossil sources. The mkindex and translate preprocessors can be run in any order. The makeheaders preprocessor must be run after translate.

4.1 The mkindex preprocessor

The mkindex program scans the "src.c" source files looking for special comments that identify routines that implement of various Fossil commands, web interface methods, and help text comments. The mkindex program generates some C code that Fossil uses in order to dispatch commands and 

Changes to www/webui.wiki.

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 .. 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 ... 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153  The Fossil Web Interface

Overview

Things To Do Using The Web Interface

Installing On A Network Server

When you create a new fossil project and after you have configured it like you want it using the web interface, you can make the project available to a distributed team by simply copying the single repository file up to a web server that supports CGI. Just put the sample-project.fossil file in a directory where CGI scripts have both read and write permission on the file and the directory that contains the file, then add a CGI script that looks something like this: #!/usr/local/bin/fossil repository: /home/www/sample-project.fossil Adjust the script above so that the paths are correct for your system, of course, and also make sure the fossil binary is installed on the server. But that is all you have to do. You now have everything you need to host a distributed software development project in less than five minutes using a two-line CGI script. You don't have a CGI-capable web server running on your server machine? Not a problem. The fossil interface can also be launched via inetd or xinetd. An inetd configuration line sufficient to launch the fossil web interface looks like this: 80 stream tcp nowait.1000 root /usr/local/bin/fossil \ /usr/local/bin/fossil http /home/www/sample-project.fossil As always, you'll want to adjust the pathnames to whatever is appropriate for your system. The xinetd setup uses a different syntax but follows the same idea.   < | > > > < > > > > > | | | | | > > > > > | | > > | | | | | > | > | | | | | |  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 ... 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 ... 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168  The Fossil Web Interface One of the innovative features of Fossil is its built-in web interface. This web interface provides everything you need to run a software development project: * [./bugtheory.wiki | Ticketing and bug tracking] * [./wikitheory.wiki | Wiki] * [./embeddeddoc.wiki | On-line documentation] * Status information * Timelines * Graphs of revision and branching history * [./event.wiki | Blogs, News, and Announcements] * File and version lists and differences * Download historical versions as ZIP archives * Historical change data * Add and remove tags on checkins * Move checkins between branches * Revise checkin comments * Manage user credentials and access permissions * And so forth... You get all of this, and more, for free when you use Fossil. There are no extra programs to install or setup. Everything you need is already pre-configured and built into the self-contained, stand-alone Fossil executable. As an example of how useful this web interface can be, the entire [./index.wiki | Fossil website] (except for the [http://www.fossil-scm.org/download.html | download page]), including the document you are now reading, is rendered using the Fossil web interface, with no enhancements, and little customization.
Key point: The Fossil website is just a running instance of Fossil!
Note also that because Fossil is a distributed system, you can run the web interface on your local machine while off network (for example, while on an airplane) including making changes to wiki pages and/or trouble ticket, then synchronize with your co-workers after you reconnect. When you clone a Fossil repository, you don't just get the project source code, you get the entire project management website.

When you create a new Fossil project and after you have configured it like you want it using the web interface, you can make the project available to a distributed team by simply copying the single repository file up to a web server that supports CGI. Just put the sample-project.fossil file in a directory where CGI scripts have both read and write permission on the file and the directory that contains the file, then add a CGI script that looks something like this: #!/usr/local/bin/fossil repository: /home/www/sample-project.fossil Adjust the script above so that the paths are correct for your system, of course, and also make sure the Fossil binary is installed on the server. But that is all you have to do. You now have everything you need to host a distributed software development project in less than five minutes using a two-line CGI script. You don't have a CGI-capable web server running on your server machine? Not a problem. The Fossil interface can also be launched via inetd or xinetd. An inetd configuration line sufficient to launch the Fossil web interface looks like this: 80 stream tcp nowait.1000 root /usr/local/bin/fossil \ /usr/local/bin/fossil http /home/www/sample-project.fossil As always, you'll want to adjust the pathnames to whatever is appropriate for your system. The xinetd setup uses a different syntax but follows the same idea. `