Birthday Fossil

Changes On Branch drh-brthday-2021
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Changes In Branch drh-brthday-2021 Excluding Merge-Ins

This is equivalent to a diff from fb39f02b77 to fd0521e130

2021-04-08
14:14
Set eol time. ... (Leaf check-in: fd0521e130 user: rene tags: drh-brthday-2021 (unpublished))
06:33
Timely amendment to main() documentation. ... (check-in: c1471aa040 user: jamsek tags: drh-brthday-2021 (unpublished))
2021-03-27
16:04
/chat: removed the unused/unnecessary jump-to-top/bottom buttons. ... (check-in: a044fea785 user: stephan tags: trunk)
03:51
Minor doc addition. ... (check-in: e9438affc3 user: stephan tags: drh-brthday-2021 (unpublished))
2021-03-26
20:28
Darkmode skin ticket page style improvements from [forum:/forumpost/f7f89e2cdb | forum post f7f89e2cdb]. ... (check-in: fb39f02b77 user: stephan tags: trunk)
20:16
Append to the list of [/doc/trunk/www/changes.wiki#v2_15|changes in v2.15] an item about [/help?cmd=/whistory|/whistory]. ... (check-in: 920b7079f2 user: george tags: trunk)

Changes to README.md.











1
2
3
4
5
6
7
8
9
10
11
12
13
14
15




































































































































# About Fossil

Fossil is a distributed version control system that has been widely
used since 2007.  Fossil was originally designed to support the
[SQLite](https://sqlite.org) project but has been adopted by many other
projects as well.

Fossil is self-hosting at <https://fossil-scm.org>.

If you are reading this on GitHub, then you are looking at a Git mirror
of the self-hosting Fossil repository.  The purpose of that mirror is to
test and exercise Fossil's ability to export a Git mirror.  Nobody much
uses the GitHub mirror, except to verify that the mirror logic works.  If
you want to know more about Fossil, visit the official self-hosting site
linked above.

























































































































>
>
>
>
>
>
>
>
>
>
>















>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# Happy Birthday!!!!

May you have many more birthdays and may you share them, along with some cake
and ice cream, with yoru Sunday School class.

Until we meet again, either here or in Heaven or after the Our Lord's
Return.

Yours in Christ Jesus
Gerald

# About Fossil

Fossil is a distributed version control system that has been widely
used since 2007.  Fossil was originally designed to support the
[SQLite](https://sqlite.org) project but has been adopted by many other
projects as well.

Fossil is self-hosting at <https://fossil-scm.org>.

If you are reading this on GitHub, then you are looking at a Git mirror
of the self-hosting Fossil repository.  The purpose of that mirror is to
test and exercise Fossil's ability to export a Git mirror.  Nobody much
uses the GitHub mirror, except to verify that the mirror logic works.  If
you want to know more about Fossil, visit the official self-hosting site
linked above.

-----------------------

``` pikchr toggle indent
$bgcol = lightgray

define l_H {
  line down 4 then right 1 then \
  up 1.5 then right 1 then down 1.5 then right 1 then \
  up 4 then left 1 then down 1.5 then left 1 then up 1.5 then close \
  fill $bgcol
}

define l_A {
  line down 4 left 1.5 then right 0.75 then up 1.5 right 0.5 then \
  right 0.5 then down 1.5 right 0.5 then right 0.75 then \
  close fill $bgcol
  line from 1.50 below previous line.start down 0.5 left 0.2 \
  then right 0.4 then close fill white
}

define l_P {
  line right 3 then down 3 then left 2 then down 1 \
  then left 1 then close fill $bgcol
  box wid 1 ht 1 at previous line.start + (1.5, -1.5) fill white
}

define l_Y {
  line left 1 then down 2 right 1 then down 2 then \
      right 1 then up 2 then right 1 up 2 then left 1 then \
      down 1.5 left 0.5 then close fill $bgcol

}

define l_B {
  line right 1.8 then right 0.2 down 0.2 then down 1.8 then \
     left 0.2 down 0.15 then right 0.2 down 0.15 then \
     down 1.8 then down 0.2 left 0.2 then left 1.8 then \
     close fill $bgcol
     box wid 0.5 ht 1 at previous line.start + (1.0, -1.15) fill white
     box same at previous line.start + (1.0, -3.10) 
}

define l_I {
  move down 0.1
  box wid 1 ht 4.0 fill $bgcol
}

define l_R {
  line right 1.8 then right 0.2 down 0.2 then down 1.8 then \
     left 0.2 down 0.15 then right 0.2 down 0.15 then \
     down 2.0 then left 0.7 then up 2.0 then left 0.5 then down 2.0 \
     then left 0.8 then close fill $bgcol
     box wid 0.5 ht 1 at previous line.start + (1.0, -1.15) fill white
}

define l_T {
  line right 3 then down 1 then left 1 then down 3.2 then \
    left 1 then up 3.2 then left 1 then close fill $bgcol
}

define l_D {
  line right 2.7 then right 0.3 down 0.3 then down 3.7 then down 0.3 left 0.3 then left 1.7 then \
  then left 1 then close fill $bgcol
  box wid 1 ht 2.3 at previous line.start + (1.5, -2.15) fill white
}

l_H()
  move from previous line.ne + (1.5, 0)
l_A()
  move from 2nd previous line.start + (1.5, 0)
l_P()
  move from previous line.start + (3.5, 0)
l_P()
  move from previous line.start + (4.0, 0)
l_Y()

  move down from first line.sw + (0, -1)

l_B()
  move right from previous line.start + (2.5, 0)
l_I()
  move right from previous box.ne + (0, 0.1)
l_R()
  move right from previous line.start + (2, 0)
l_T()
  move right from previous line.start + (3, 0)
l_H()
  move right from previous line.start + (3, 0)
l_D()
  move right from previous line.start + (4.5, 0)
l_A()
  move right from previous line.start + (1.5, +1.5)
l_Y()
  
  move down from 7th line.sw + (0, -1)

l_D()
  move right from previous line.start + (3.0, 0)
l_R()
  move right from previous line.start + (2, -0.15)
l_H()

// To make everything small
move right 80
dot rad 0.01
```
\  
 I wish you the best in all sphere of your life. \  
 Thank you for SQLite, Fossil (and everything else, including pikchr).

 Martin G.


# Essential links

Congrats on reaching this major milestone.

Mark. J

  * [Benefits for senior citizens](https://www.benefits.gov/news/article/349)
Changes to VERSION.

1



2.15


>
|
>
>
1
2
3
4
60.0.0

Happy birthday, Richard!
Remember that the best is yet to come.
Changes to compat/tcl-8.6/generic/tcl.h.
49
50
51
52
53
54
55
56
57
58
59
60
61




















62
63
64
65
66
67
68
69
 * macosx/Tcl.xcode/default.pbxuser (not patchlevel) 1 LOC
 * macosx/Tcl-Common.xcconfig (not patchlevel) 1 LOC
 * win/README		(not patchlevel) (sections 0 and 2)
 * unix/tcl.spec	(1 LOC patch)
 * tools/tcl.hpj.in	(not patchlevel, for windows installer)
 */

#define TCL_MAJOR_VERSION   8
#define TCL_MINOR_VERSION   6
#define TCL_RELEASE_LEVEL   TCL_FINAL_RELEASE
#define TCL_RELEASE_SERIAL  0

#define TCL_VERSION	    "8.6"




















#define TCL_PATCH_LEVEL	    "8.6.0"

/*
 *----------------------------------------------------------------------------
 * The following definitions set up the proper options for Windows compilers.
 * We use this method because there is no autoconf equivalent.
 */








|
|



|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|







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
 * macosx/Tcl.xcode/default.pbxuser (not patchlevel) 1 LOC
 * macosx/Tcl-Common.xcconfig (not patchlevel) 1 LOC
 * win/README		(not patchlevel) (sections 0 and 2)
 * unix/tcl.spec	(1 LOC patch)
 * tools/tcl.hpj.in	(not patchlevel, for windows installer)
 */

#define TCL_MAJOR_VERSION   9
#define TCL_MINOR_VERSION   0
#define TCL_RELEASE_LEVEL   TCL_FINAL_RELEASE
#define TCL_RELEASE_SERIAL  0

#define TCL_VERSION	    "9.0"
/* Special Tcl 9.0 pre-release due to drh's 60th birthday
 * HIEP HIEP HOERA !!!
 * try it:
 * $ ./configure --with-tcl=1 --with-tcl-stubs --with-tcl-private-stubs
 * ...
 * $ make
 * ...
 * $ ./fossil version -v
 * This is fossil version 60.0.0 [??????????] 2021-04-09 ??:??:?? UTC
 * Compiled on Apr  9 2021 ....
 * Schema version 2015-01-24
 * Detected memory page size is 4096 bytes
 * zlib 1.2.11, loaded 1.2.11
 * ...
 * TCL (Tcl 9.0.60+special.birthday.release, loaded TH_OK: 9.0a2)
 * USE_TCL_STUBS
 * FOSSIL_ENABLE_TCL_PRIVATE_STUBS
 * ...
 *                                 Jan Nijtmans
 */
#define TCL_PATCH_LEVEL	    "9.0.60+special.birthday.release"

/*
 *----------------------------------------------------------------------------
 * The following definitions set up the proper options for Windows compilers.
 * We use this method because there is no autoconf equivalent.
 */

625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
/*
 * Structures filled in by Tcl_RegExpInfo. Note that all offset values are
 * relative to the start of the match string, not the beginning of the entire
 * string.
 */

typedef struct Tcl_RegExpIndices {
    long start;			/* Character offset of first character in
				 * match. */
    long end;			/* Character offset of first character after
				 * the match. */
} Tcl_RegExpIndices;

typedef struct Tcl_RegExpInfo {
    int nsubs;			/* Number of subexpressions in the compiled
				 * expression. */
    Tcl_RegExpIndices *matches;	/* Array of nsubs match offset pairs. */
    long extendStart;		/* The offset at which a subsequent match
				 * might begin. */
    long reserved;		/* Reserved for later use. */
} Tcl_RegExpInfo;

/*
 * Picky compilers complain if this typdef doesn't appear before the struct's
 * reference in tclDecls.h.
 */








|

|




|


|

<







645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663

664
665
666
667
668
669
670
/*
 * Structures filled in by Tcl_RegExpInfo. Note that all offset values are
 * relative to the start of the match string, not the beginning of the entire
 * string.
 */

typedef struct Tcl_RegExpIndices {
    size_t start;			/* Character offset of first character in
				 * match. */
    size_t end;			/* Character offset of first character after
				 * the match. */
} Tcl_RegExpIndices;

typedef struct Tcl_RegExpInfo {
    size_t nsubs;			/* Number of subexpressions in the compiled
				 * expression. */
    Tcl_RegExpIndices *matches;	/* Array of nsubs match offset pairs. */
    size_t extendStart;		/* The offset at which a subsequent match
				 * might begin. */

} Tcl_RegExpInfo;

/*
 * Picky compilers complain if this typdef doesn't appear before the struct's
 * reference in tclDecls.h.
 */

806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
/*
 * One of the following structures exists for each object in the Tcl system.
 * An object stores a value as either a string, some internal representation,
 * or both.
 */

typedef struct Tcl_Obj {
    int refCount;		/* When 0 the object will be freed. */
    char *bytes;		/* This points to the first byte of the
				 * object's string representation. The array
				 * must be followed by a null byte (i.e., at
				 * offset length) but may also contain
				 * embedded null characters. The array's
				 * storage is allocated by ckalloc. NULL means
				 * the string rep is invalid and must be
				 * regenerated from the internal rep.  Clients
				 * should use Tcl_GetStringFromObj or
				 * Tcl_GetString to get a pointer to the byte
				 * array as a readonly value. */
    int length;			/* The number of bytes at *bytes, not
				 * including the terminating null. */
    const Tcl_ObjType *typePtr;	/* Denotes the object's type. Always
				 * corresponds to the type of the object's
				 * internal rep. NULL indicates the object has
				 * no internal rep (has no type). */
    union {			/* The internal representation: */
	long longValue;		/*   - an long integer value. */







|











|







825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
/*
 * One of the following structures exists for each object in the Tcl system.
 * An object stores a value as either a string, some internal representation,
 * or both.
 */

typedef struct Tcl_Obj {
    size_t refCount;		/* When 0 the object will be freed. */
    char *bytes;		/* This points to the first byte of the
				 * object's string representation. The array
				 * must be followed by a null byte (i.e., at
				 * offset length) but may also contain
				 * embedded null characters. The array's
				 * storage is allocated by ckalloc. NULL means
				 * the string rep is invalid and must be
				 * regenerated from the internal rep.  Clients
				 * should use Tcl_GetStringFromObj or
				 * Tcl_GetString to get a pointer to the byte
				 * array as a readonly value. */
    size_t length;		/* The number of bytes at *bytes, not
				 * including the terminating null. */
    const Tcl_ObjType *typePtr;	/* Denotes the object's type. Always
				 * corresponds to the type of the object's
				 * internal rep. NULL indicates the object has
				 * no internal rep (has no type). */
    union {			/* The internal representation: */
	long longValue;		/*   - an long integer value. */
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
 * macros Tcl_DStringValue and Tcl_DStringLength.
 */

#define TCL_DSTRING_STATIC_SIZE 200
typedef struct Tcl_DString {
    char *string;		/* Points to beginning of string: either
				 * staticSpace below or a malloced array. */
    int length;			/* Number of non-NULL characters in the
				 * string. */
    int spaceAvl;		/* Total number of bytes available for the
				 * string and its terminating NULL char. */
    char staticSpace[TCL_DSTRING_STATIC_SIZE];
				/* Space to use in common case where string is
				 * small. */
} Tcl_DString;

#define Tcl_DStringLength(dsPtr) ((dsPtr)->length)







|

|







1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
 * macros Tcl_DStringValue and Tcl_DStringLength.
 */

#define TCL_DSTRING_STATIC_SIZE 200
typedef struct Tcl_DString {
    char *string;		/* Points to beginning of string: either
				 * staticSpace below or a malloced array. */
    size_t length;		/* Number of non-NULL characters in the
				 * string. */
    size_t spaceAvl;		/* Total number of bytes available for the
				 * string and its terminating NULL char. */
    char staticSpace[TCL_DSTRING_STATIC_SIZE];
				/* Space to use in common case where string is
				 * small. */
} Tcl_DString;

#define Tcl_DStringLength(dsPtr) ((dsPtr)->length)
1151
1152
1153
1154
1155
1156
1157




1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
#define TCL_LINK_WIDE_UINT	14
#define TCL_LINK_READ_ONLY	0x80

/*
 *----------------------------------------------------------------------------
 * Forward declarations of Tcl_HashTable and related types.
 */





typedef struct Tcl_HashKeyType Tcl_HashKeyType;
typedef struct Tcl_HashTable Tcl_HashTable;
typedef struct Tcl_HashEntry Tcl_HashEntry;

typedef unsigned (Tcl_HashKeyProc) (Tcl_HashTable *tablePtr, void *keyPtr);
typedef int (Tcl_CompareHashKeysProc) (void *keyPtr, Tcl_HashEntry *hPtr);
typedef Tcl_HashEntry * (Tcl_AllocHashEntryProc) (Tcl_HashTable *tablePtr,
	void *keyPtr);
typedef void (Tcl_FreeHashEntryProc) (Tcl_HashEntry *hPtr);

/*
 * This flag controls whether the hash table stores the hash of a key, or







>
>
>
>





|







1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
#define TCL_LINK_WIDE_UINT	14
#define TCL_LINK_READ_ONLY	0x80

/*
 *----------------------------------------------------------------------------
 * Forward declarations of Tcl_HashTable and related types.
 */

#ifndef TCL_HASH_TYPE
#  define TCL_HASH_TYPE size_t
#endif

typedef struct Tcl_HashKeyType Tcl_HashKeyType;
typedef struct Tcl_HashTable Tcl_HashTable;
typedef struct Tcl_HashEntry Tcl_HashEntry;

typedef TCL_HASH_TYPE (Tcl_HashKeyProc) (Tcl_HashTable *tablePtr, void *keyPtr);
typedef int (Tcl_CompareHashKeysProc) (void *keyPtr, Tcl_HashEntry *hPtr);
typedef Tcl_HashEntry * (Tcl_AllocHashEntryProc) (Tcl_HashTable *tablePtr,
	void *keyPtr);
typedef void (Tcl_FreeHashEntryProc) (Tcl_HashEntry *hPtr);

/*
 * This flag controls whether the hash table stores the hash of a key, or
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
 * should access any of these fields directly; use the macros defined below.
 */

struct Tcl_HashEntry {
    Tcl_HashEntry *nextPtr;	/* Pointer to next entry in this hash bucket,
				 * or NULL for end of chain. */
    Tcl_HashTable *tablePtr;	/* Pointer to table containing entry. */
#if TCL_HASH_KEY_STORE_HASH
    void *hash;			/* Hash value, stored as pointer to ensure
				 * that the offsets of the fields in this
				 * structure are not changed. */
#else
    Tcl_HashEntry **bucketPtr;	/* Pointer to bucket that points to first
				 * entry in this entry's chain: used for
				 * deleting the entry. */
#endif
    ClientData clientData;	/* Application stores something here with
				 * Tcl_SetHashValue. */
    union {			/* Key has one of these forms: */
	char *oneWordValue;	/* One-word value for key. */
	Tcl_Obj *objPtr;	/* Tcl_Obj * key value. */
	int words[1];		/* Multiple integer words for key. The actual
				 * size will be as large as necessary for this
				 * table's keys. */







<
|
<
<
<
<
<
<
<
|







1206
1207
1208
1209
1210
1211
1212

1213







1214
1215
1216
1217
1218
1219
1220
1221
 * should access any of these fields directly; use the macros defined below.
 */

struct Tcl_HashEntry {
    Tcl_HashEntry *nextPtr;	/* Pointer to next entry in this hash bucket,
				 * or NULL for end of chain. */
    Tcl_HashTable *tablePtr;	/* Pointer to table containing entry. */

    size_t hash;		/* Hash value. */







    void *clientData;		/* Application stores something here with
				 * Tcl_SetHashValue. */
    union {			/* Key has one of these forms: */
	char *oneWordValue;	/* One-word value for key. */
	Tcl_Obj *objPtr;	/* Tcl_Obj * key value. */
	int words[1];		/* Multiple integer words for key. The actual
				 * size will be as large as necessary for this
				 * table's keys. */
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292

1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
struct Tcl_HashTable {
    Tcl_HashEntry **buckets;	/* Pointer to bucket array. Each element
				 * points to first entry in bucket's hash
				 * chain, or NULL. */
    Tcl_HashEntry *staticBuckets[TCL_SMALL_HASH_TABLE];
				/* Bucket array used for small tables (to
				 * avoid mallocs and frees). */
    int numBuckets;		/* Total number of buckets allocated at
				 * **bucketPtr. */
    int numEntries;		/* Total number of entries present in
				 * table. */
    int rebuildSize;		/* Enlarge table when numEntries gets to be
				 * this large. */

    int downShift;		/* Shift count used in hashing function.
				 * Designed to use high-order bits of
				 * randomized keys. */
    int mask;			/* Mask value used in hashing function. */
    int keyType;		/* Type of keys used in this table. It's
				 * either TCL_CUSTOM_KEYS, TCL_STRING_KEYS,
				 * TCL_ONE_WORD_KEYS, or an integer giving the
				 * number of ints that is the size of the
				 * key. */
    Tcl_HashEntry *(*findProc) (Tcl_HashTable *tablePtr, const char *key);
    Tcl_HashEntry *(*createProc) (Tcl_HashTable *tablePtr, const char *key,
	    int *newPtr);
    const Tcl_HashKeyType *typePtr;
				/* Type of the keys used in the
				 * Tcl_HashTable. */
};

/*
 * Structure definition for information used to keep track of searches through
 * hash tables:
 */

typedef struct Tcl_HashSearch {
    Tcl_HashTable *tablePtr;	/* Table being searched. */
    int nextIndex;		/* Index of next bucket to be enumerated after
				 * present one. */
    Tcl_HashEntry *nextEntryPtr;/* Next entry to be enumerated in the current
				 * bucket. */
} Tcl_HashSearch;

/*
 * Acceptable key types for hash tables:







|

|

|

>



<




















|







1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311

1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
struct Tcl_HashTable {
    Tcl_HashEntry **buckets;	/* Pointer to bucket array. Each element
				 * points to first entry in bucket's hash
				 * chain, or NULL. */
    Tcl_HashEntry *staticBuckets[TCL_SMALL_HASH_TABLE];
				/* Bucket array used for small tables (to
				 * avoid mallocs and frees). */
    size_t numBuckets;		/* Total number of buckets allocated at
				 * **bucketPtr. */
    size_t numEntries;		/* Total number of entries present in
				 * table. */
    size_t rebuildSize;		/* Enlarge table when numEntries gets to be
				 * this large. */
    size_t mask;		/* Mask value used in hashing function. */
    int downShift;		/* Shift count used in hashing function.
				 * Designed to use high-order bits of
				 * randomized keys. */

    int keyType;		/* Type of keys used in this table. It's
				 * either TCL_CUSTOM_KEYS, TCL_STRING_KEYS,
				 * TCL_ONE_WORD_KEYS, or an integer giving the
				 * number of ints that is the size of the
				 * key. */
    Tcl_HashEntry *(*findProc) (Tcl_HashTable *tablePtr, const char *key);
    Tcl_HashEntry *(*createProc) (Tcl_HashTable *tablePtr, const char *key,
	    int *newPtr);
    const Tcl_HashKeyType *typePtr;
				/* Type of the keys used in the
				 * Tcl_HashTable. */
};

/*
 * Structure definition for information used to keep track of searches through
 * hash tables:
 */

typedef struct Tcl_HashSearch {
    Tcl_HashTable *tablePtr;	/* Table being searched. */
    size_t nextIndex;		/* Index of next bucket to be enumerated after
				 * present one. */
    Tcl_HashEntry *nextEntryPtr;/* Next entry to be enumerated in the current
				 * bucket. */
} Tcl_HashSearch;

/*
 * Acceptable key types for hash tables:
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
 * dictionaries. These fields should not be accessed by code outside
 * tclDictObj.c
 */

typedef struct {
    void *next;			/* Search position for underlying hash
				 * table. */
    int epoch;			/* Epoch marker for dictionary being searched,
				 * or -1 if search has terminated. */
    Tcl_Dict dictionaryPtr;	/* Reference to dictionary being searched. */
} Tcl_DictSearch;

/*
 *----------------------------------------------------------------------------
 * Flag values to pass to Tcl_DoOneEvent to disable searches for some kinds of
 * events:







|
|







1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
 * dictionaries. These fields should not be accessed by code outside
 * tclDictObj.c
 */

typedef struct {
    void *next;			/* Search position for underlying hash
				 * table. */
    size_t epoch;		/* Epoch marker for dictionary being searched,
				 * or 0 if search has terminated. */
    Tcl_Dict dictionaryPtr;	/* Reference to dictionary being searched. */
} Tcl_DictSearch;

/*
 *----------------------------------------------------------------------------
 * Flag values to pass to Tcl_DoOneEvent to disable searches for some kinds of
 * events:
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
 * Not all entries need be non-NULL; any which are NULL are simply ignored.
 * However, a complete filesystem should provide all of these functions. The
 * explanations in the structure show the importance of each function.
 */

typedef struct Tcl_Filesystem {
    const char *typeName;	/* The name of the filesystem. */
    int structureLength;	/* Length of this structure, so future binary
				 * compatibility can be assured. */
    Tcl_FSVersion version;	/* Version of the filesystem type. */
    Tcl_FSPathInFilesystemProc *pathInFilesystemProc;
				/* Function to check whether a path is in this
				 * filesystem. This is the most important
				 * filesystem function. */
    Tcl_FSDupInternalRepProc *dupInternalRepProc;







|







1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
 * Not all entries need be non-NULL; any which are NULL are simply ignored.
 * However, a complete filesystem should provide all of these functions. The
 * explanations in the structure show the importance of each function.
 */

typedef struct Tcl_Filesystem {
    const char *typeName;	/* The name of the filesystem. */
    size_t structureLength;	/* Length of this structure, so future binary
				 * compatibility can be assured. */
    Tcl_FSVersion version;	/* Version of the filesystem type. */
    Tcl_FSPathInFilesystemProc *pathInFilesystemProc;
				/* Function to check whether a path is in this
				 * filesystem. This is the most important
				 * filesystem function. */
    Tcl_FSDupInternalRepProc *dupInternalRepProc;
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
 * token.
 */

typedef struct Tcl_Token {
    int type;			/* Type of token, such as TCL_TOKEN_WORD; see
				 * below for valid types. */
    const char *start;		/* First character in token. */
    int size;			/* Number of bytes in token. */
    int numComponents;		/* If this token is composed of other tokens,
				 * this field tells how many of them there are
				 * (including components of components, etc.).
				 * The component tokens immediately follow
				 * this one. */
} Tcl_Token;

/*







|
|







1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
 * token.
 */

typedef struct Tcl_Token {
    int type;			/* Type of token, such as TCL_TOKEN_WORD; see
				 * below for valid types. */
    const char *start;		/* First character in token. */
    size_t size;			/* Number of bytes in token. */
    size_t numComponents;		/* If this token is composed of other tokens,
				 * this field tells how many of them there are
				 * (including components of components, etc.).
				 * The component tokens immediately follow
				 * this one. */
} Tcl_Token;

/*
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
 */

#define NUM_STATIC_TOKENS 20

typedef struct Tcl_Parse {
    const char *commentStart;	/* Pointer to # that begins the first of one
				 * or more comments preceding the command. */
    int commentSize;		/* Number of bytes in comments (up through
				 * newline character that terminates the last
				 * comment). If there were no comments, this
				 * field is 0. */
    const char *commandStart;	/* First character in first word of
				 * command. */
    int commandSize;		/* Number of bytes in command, including first
				 * character of first word, up through the







|







2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
 */

#define NUM_STATIC_TOKENS 20

typedef struct Tcl_Parse {
    const char *commentStart;	/* Pointer to # that begins the first of one
				 * or more comments preceding the command. */
    size_t commentSize;		/* Number of bytes in comments (up through
				 * newline character that terminates the last
				 * comment). If there were no comments, this
				 * field is 0. */
    const char *commandStart;	/* First character in first word of
				 * command. */
    int commandSize;		/* Number of bytes in command, including first
				 * character of first word, up through the
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
 * The following constant is used to test for older versions of Tcl in the
 * stubs tables.
 *
 * Jan Nijtman's plus patch uses 0xFCA1BACF, so we need to pick a different
 * value since the stubs tables don't match.
 */

#define TCL_STUB_MAGIC		((int) 0xFCA3BACF)

/*
 * The following function is required to be defined in all stubs aware
 * extensions. The function is actually implemented in the stub library, not
 * the main Tcl library, although there is a trivial implementation in the
 * main library in case an extension is statically linked into an application.
 */

const char *		Tcl_InitStubs(Tcl_Interp *interp, const char *version,
			    int exact);
const char *		TclTomMathInitializeStubs(Tcl_Interp *interp,
			    const char *version, int epoch, int revision);

/*
 * When not using stubs, make it a macro.
 */








|









|







2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
 * The following constant is used to test for older versions of Tcl in the
 * stubs tables.
 *
 * Jan Nijtman's plus patch uses 0xFCA1BACF, so we need to pick a different
 * value since the stubs tables don't match.
 */

#define TCL_STUB_MAGIC		((int) 0xFCA3BACB + (int) sizeof(void *))

/*
 * The following function is required to be defined in all stubs aware
 * extensions. The function is actually implemented in the stub library, not
 * the main Tcl library, although there is a trivial implementation in the
 * main library in case an extension is statically linked into an application.
 */

const char *		Tcl_InitStubs(Tcl_Interp *interp, const char *version,
			    int exact, int magic);
const char *		TclTomMathInitializeStubs(Tcl_Interp *interp,
			    const char *version, int epoch, int revision);

/*
 * When not using stubs, make it a macro.
 */

2483
2484
2485
2486
2487
2488
2489

2490
2491

2492
2493

2494
2495
2496

2497
2498
2499
2500
2501
2502

2503
2504
2505
2506
2507
2508
2509

2510
2511
2512
2513
2514
2515
2516
#   define Tcl_DumpActiveMemory(x)
#   undef  Tcl_ValidateAllMemory
#   define Tcl_ValidateAllMemory(x,y)

#endif /* !TCL_MEM_DEBUG */

#ifdef TCL_MEM_DEBUG

#   define Tcl_IncrRefCount(objPtr) \
	Tcl_DbIncrRefCount(objPtr, __FILE__, __LINE__)

#   define Tcl_DecrRefCount(objPtr) \
	Tcl_DbDecrRefCount(objPtr, __FILE__, __LINE__)

#   define Tcl_IsShared(objPtr) \
	Tcl_DbIsShared(objPtr, __FILE__, __LINE__)
#else

#   define Tcl_IncrRefCount(objPtr) \
	++(objPtr)->refCount
    /*
     * Use do/while0 idiom for optimum correctness without compiler warnings.
     * http://c2.com/cgi/wiki?TrivialDoWhileLoop
     */

#   define Tcl_DecrRefCount(objPtr) \
	do { \
	    Tcl_Obj *_objPtr = (objPtr); \
	    if (--(_objPtr)->refCount <= 0) { \
		TclFreeObj(_objPtr); \
	    } \
	} while(0)

#   define Tcl_IsShared(objPtr) \
	((objPtr)->refCount > 1)
#endif

/*
 * Macros and definitions that help to debug the use of Tcl objects. When
 * TCL_MEM_DEBUG is defined, the Tcl_New declarations are overridden to call







>


>


>



>






>



|



>







2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
#   define Tcl_DumpActiveMemory(x)
#   undef  Tcl_ValidateAllMemory
#   define Tcl_ValidateAllMemory(x,y)

#endif /* !TCL_MEM_DEBUG */

#ifdef TCL_MEM_DEBUG
#   undef Tcl_IncrRefCount
#   define Tcl_IncrRefCount(objPtr) \
	Tcl_DbIncrRefCount(objPtr, __FILE__, __LINE__)
#   undef Tcl_DecrRefCount
#   define Tcl_DecrRefCount(objPtr) \
	Tcl_DbDecrRefCount(objPtr, __FILE__, __LINE__)
#   undef Tcl_IsShared
#   define Tcl_IsShared(objPtr) \
	Tcl_DbIsShared(objPtr, __FILE__, __LINE__)
#else
#   undef Tcl_IncrRefCount
#   define Tcl_IncrRefCount(objPtr) \
	++(objPtr)->refCount
    /*
     * Use do/while0 idiom for optimum correctness without compiler warnings.
     * http://c2.com/cgi/wiki?TrivialDoWhileLoop
     */
#   undef Tcl_DecrRefCount
#   define Tcl_DecrRefCount(objPtr) \
	do { \
	    Tcl_Obj *_objPtr = (objPtr); \
	    if (_objPtr->refCount-- <= 1) { \
		TclFreeObj(_objPtr); \
	    } \
	} while(0)
#   undef Tcl_IsShared
#   define Tcl_IsShared(objPtr) \
	((objPtr)->refCount > 1)
#endif

/*
 * Macros and definitions that help to debug the use of Tcl objects. When
 * TCL_MEM_DEBUG is defined, the Tcl_New declarations are overridden to call
Changes to compat/tcl-8.6/generic/tclDecls.h.
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
				const char *file, int line);
/* 26 */
EXTERN Tcl_Obj *	Tcl_DbNewLongObj(long longValue, const char *file,
				int line);
/* 27 */
EXTERN Tcl_Obj *	Tcl_DbNewObj(const char *file, int line);
/* 28 */
EXTERN Tcl_Obj *	Tcl_DbNewStringObj(const char *bytes, int length,
				const char *file, int line);
/* 29 */
EXTERN Tcl_Obj *	Tcl_DuplicateObj(Tcl_Obj *objPtr);
/* 30 */
EXTERN void		TclFreeObj(Tcl_Obj *objPtr);
/* 31 */
EXTERN int		Tcl_GetBoolean(Tcl_Interp *interp, const char *src,







|







119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
				const char *file, int line);
/* 26 */
EXTERN Tcl_Obj *	Tcl_DbNewLongObj(long longValue, const char *file,
				int line);
/* 27 */
EXTERN Tcl_Obj *	Tcl_DbNewObj(const char *file, int line);
/* 28 */
EXTERN Tcl_Obj *	Tcl_DbNewStringObj(const char *bytes, size_t length,
				const char *file, int line);
/* 29 */
EXTERN Tcl_Obj *	Tcl_DuplicateObj(Tcl_Obj *objPtr);
/* 30 */
EXTERN void		TclFreeObj(Tcl_Obj *objPtr);
/* 31 */
EXTERN int		Tcl_GetBoolean(Tcl_Interp *interp, const char *src,
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
/* 53 */
EXTERN Tcl_Obj *	Tcl_NewListObj(int objc, Tcl_Obj *const objv[]);
/* 54 */
EXTERN Tcl_Obj *	Tcl_NewLongObj(long longValue);
/* 55 */
EXTERN Tcl_Obj *	Tcl_NewObj(void);
/* 56 */
EXTERN Tcl_Obj *	Tcl_NewStringObj(const char *bytes, int length);
/* 57 */
EXTERN void		Tcl_SetBooleanObj(Tcl_Obj *objPtr, int boolValue);
/* 58 */
EXTERN unsigned char *	Tcl_SetByteArrayLength(Tcl_Obj *objPtr, int length);
/* 59 */
EXTERN void		Tcl_SetByteArrayObj(Tcl_Obj *objPtr,
				const unsigned char *bytes, int length);







|







197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
/* 53 */
EXTERN Tcl_Obj *	Tcl_NewListObj(int objc, Tcl_Obj *const objv[]);
/* 54 */
EXTERN Tcl_Obj *	Tcl_NewLongObj(long longValue);
/* 55 */
EXTERN Tcl_Obj *	Tcl_NewObj(void);
/* 56 */
EXTERN Tcl_Obj *	Tcl_NewStringObj(const char *bytes, size_t length);
/* 57 */
EXTERN void		Tcl_SetBooleanObj(Tcl_Obj *objPtr, int boolValue);
/* 58 */
EXTERN unsigned char *	Tcl_SetByteArrayLength(Tcl_Obj *objPtr, int length);
/* 59 */
EXTERN void		Tcl_SetByteArrayObj(Tcl_Obj *objPtr,
				const unsigned char *bytes, int length);
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
    int (*tcl_DbIsShared) (Tcl_Obj *objPtr, const char *file, int line); /* 21 */
    Tcl_Obj * (*tcl_DbNewBooleanObj) (int boolValue, const char *file, int line); /* 22 */
    Tcl_Obj * (*tcl_DbNewByteArrayObj) (const unsigned char *bytes, int length, const char *file, int line); /* 23 */
    Tcl_Obj * (*tcl_DbNewDoubleObj) (double doubleValue, const char *file, int line); /* 24 */
    Tcl_Obj * (*tcl_DbNewListObj) (int objc, Tcl_Obj *const *objv, const char *file, int line); /* 25 */
    Tcl_Obj * (*tcl_DbNewLongObj) (long longValue, const char *file, int line); /* 26 */
    Tcl_Obj * (*tcl_DbNewObj) (const char *file, int line); /* 27 */
    Tcl_Obj * (*tcl_DbNewStringObj) (const char *bytes, int length, const char *file, int line); /* 28 */
    Tcl_Obj * (*tcl_DuplicateObj) (Tcl_Obj *objPtr); /* 29 */
    void (*tclFreeObj) (Tcl_Obj *objPtr); /* 30 */
    int (*tcl_GetBoolean) (Tcl_Interp *interp, const char *src, int *boolPtr); /* 31 */
    int (*tcl_GetBooleanFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int *boolPtr); /* 32 */
    unsigned char * (*tcl_GetByteArrayFromObj) (Tcl_Obj *objPtr, int *lengthPtr); /* 33 */
    int (*tcl_GetDouble) (Tcl_Interp *interp, const char *src, double *doublePtr); /* 34 */
    int (*tcl_GetDoubleFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, double *doublePtr); /* 35 */







|







1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
    int (*tcl_DbIsShared) (Tcl_Obj *objPtr, const char *file, int line); /* 21 */
    Tcl_Obj * (*tcl_DbNewBooleanObj) (int boolValue, const char *file, int line); /* 22 */
    Tcl_Obj * (*tcl_DbNewByteArrayObj) (const unsigned char *bytes, int length, const char *file, int line); /* 23 */
    Tcl_Obj * (*tcl_DbNewDoubleObj) (double doubleValue, const char *file, int line); /* 24 */
    Tcl_Obj * (*tcl_DbNewListObj) (int objc, Tcl_Obj *const *objv, const char *file, int line); /* 25 */
    Tcl_Obj * (*tcl_DbNewLongObj) (long longValue, const char *file, int line); /* 26 */
    Tcl_Obj * (*tcl_DbNewObj) (const char *file, int line); /* 27 */
    Tcl_Obj * (*tcl_DbNewStringObj) (const char *bytes, size_t length, const char *file, int line); /* 28 */
    Tcl_Obj * (*tcl_DuplicateObj) (Tcl_Obj *objPtr); /* 29 */
    void (*tclFreeObj) (Tcl_Obj *objPtr); /* 30 */
    int (*tcl_GetBoolean) (Tcl_Interp *interp, const char *src, int *boolPtr); /* 31 */
    int (*tcl_GetBooleanFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, int *boolPtr); /* 32 */
    unsigned char * (*tcl_GetByteArrayFromObj) (Tcl_Obj *objPtr, int *lengthPtr); /* 33 */
    int (*tcl_GetDouble) (Tcl_Interp *interp, const char *src, double *doublePtr); /* 34 */
    int (*tcl_GetDoubleFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, double *doublePtr); /* 35 */
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
    Tcl_Obj * (*tcl_NewBooleanObj) (int boolValue); /* 49 */
    Tcl_Obj * (*tcl_NewByteArrayObj) (const unsigned char *bytes, int length); /* 50 */
    Tcl_Obj * (*tcl_NewDoubleObj) (double doubleValue); /* 51 */
    Tcl_Obj * (*tcl_NewIntObj) (int intValue); /* 52 */
    Tcl_Obj * (*tcl_NewListObj) (int objc, Tcl_Obj *const objv[]); /* 53 */
    Tcl_Obj * (*tcl_NewLongObj) (long longValue); /* 54 */
    Tcl_Obj * (*tcl_NewObj) (void); /* 55 */
    Tcl_Obj * (*tcl_NewStringObj) (const char *bytes, int length); /* 56 */
    void (*tcl_SetBooleanObj) (Tcl_Obj *objPtr, int boolValue); /* 57 */
    unsigned char * (*tcl_SetByteArrayLength) (Tcl_Obj *objPtr, int length); /* 58 */
    void (*tcl_SetByteArrayObj) (Tcl_Obj *objPtr, const unsigned char *bytes, int length); /* 59 */
    void (*tcl_SetDoubleObj) (Tcl_Obj *objPtr, double doubleValue); /* 60 */
    void (*tcl_SetIntObj) (Tcl_Obj *objPtr, int intValue); /* 61 */
    void (*tcl_SetListObj) (Tcl_Obj *objPtr, int objc, Tcl_Obj *const objv[]); /* 62 */
    void (*tcl_SetLongObj) (Tcl_Obj *objPtr, long longValue); /* 63 */







|







1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
    Tcl_Obj * (*tcl_NewBooleanObj) (int boolValue); /* 49 */
    Tcl_Obj * (*tcl_NewByteArrayObj) (const unsigned char *bytes, int length); /* 50 */
    Tcl_Obj * (*tcl_NewDoubleObj) (double doubleValue); /* 51 */
    Tcl_Obj * (*tcl_NewIntObj) (int intValue); /* 52 */
    Tcl_Obj * (*tcl_NewListObj) (int objc, Tcl_Obj *const objv[]); /* 53 */
    Tcl_Obj * (*tcl_NewLongObj) (long longValue); /* 54 */
    Tcl_Obj * (*tcl_NewObj) (void); /* 55 */
    Tcl_Obj * (*tcl_NewStringObj) (const char *bytes, size_t length); /* 56 */
    void (*tcl_SetBooleanObj) (Tcl_Obj *objPtr, int boolValue); /* 57 */
    unsigned char * (*tcl_SetByteArrayLength) (Tcl_Obj *objPtr, int length); /* 58 */
    void (*tcl_SetByteArrayObj) (Tcl_Obj *objPtr, const unsigned char *bytes, int length); /* 59 */
    void (*tcl_SetDoubleObj) (Tcl_Obj *objPtr, double doubleValue); /* 60 */
    void (*tcl_SetIntObj) (Tcl_Obj *objPtr, int intValue); /* 61 */
    void (*tcl_SetListObj) (Tcl_Obj *objPtr, int objc, Tcl_Obj *const objv[]); /* 62 */
    void (*tcl_SetLongObj) (Tcl_Obj *objPtr, long longValue); /* 63 */
Changes to skins/default/header.txt.
1
2
3
4
5
6
7
8
9
10
11










12
13
14
15
16
17
18
19
20
<div class="header">
  <div class="title"><h1>$<project_name></h1>$<title></div>
    <div class="status"><th1>
 if {[info exists login]} {
   html "<a href='$home/login'>$login</a>\n"
 } else {
   html "<a href='$home/login'>Login</a>\n"
 }
    </th1></div>
</div>
<div class="mainmenu">










<th1>
html "<a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>&#9776;</a>"
builtin_request_js hbmenu.js
foreach {name url expr class} $mainmenu {
  if {![capexpr $expr]} continue
  if {[string match /* $url]} {
    if {[string match /$current_page* $url]} {
      set class "active $class"
    }











>
>
>
>
>
>
>
>
>
>

|







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
<div class="header">
  <div class="title"><h1>$<project_name></h1>$<title></div>
    <div class="status"><th1>
 if {[info exists login]} {
   html "<a href='$home/login'>$login</a>\n"
 } else {
   html "<a href='$home/login'>Login</a>\n"
 }
    </th1></div>
</div>
<div class="mainmenu">
                                                                            <!--
/  \
|  |    ╔══════════════════════════════════════════════════════════════════════╗
@  @    ║ Hehe, just kidding!  Nonetheless, some Windows nostalgia for Fossil! ║
|  |    ║ And, hopefully, many more smaller and larger moments of joy for you! ║
|| |/  /║ --Florian                                                            ║
|| ||   ╚══════════════════════════════════════════════════════════════════════╝
|\_/|
\___/
                                                                             -->
<th1>
html "<a id='hbbtn' href='$home/sitemap' aria-label='Site Map'><span style='color:#000;font-size:.8em'><code style='border:.25em solid #000'><span style='color:#f00;background:#00f;'>▀</span><span style='color:#0f0;background:#ff0;'>▄</span></code><span style='font-family:Verdana,Arial,sans-serif;font-weight:bold;'> Start</span></span></a>"
builtin_request_js hbmenu.js
foreach {name url expr class} $mainmenu {
  if {![capexpr $expr]} continue
  if {[string match /* $url]} {
    if {[string match /$current_page* $url]} {
      set class "active $class"
    }
Changes to src/branch.c.
1
2



3
4
5
6
7
8
9
/*
** Copyright (c) 2007 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


>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
/*
** Copyright (c) 2007 D. Richard Hipp
**
** The Peter Pan of software - he never seems to age and he as boundless enthusiasm.
** Best wishes from Quakka territory.  Steve L
**
** 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
Changes to src/checkout.c.
424
425
426
427
428
429
430


















































































































    db_unset(zUnset, 1);
    fossil_free(zUnset);
  }
  unlink_local_database(1);
  db_close(1);
  unlink_local_database(0);
}

























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
    db_unset(zUnset, 1);
    fossil_free(zUnset);
  }
  unlink_local_database(1);
  db_close(1);
  unlink_local_database(0);
}

/*
** COMMAND: greet
**
** Usage: %fossil greet
**
** Say something important.
*/
void greet_cmd(void){
  static const char msg[] =
    "\"\35\33_cf\37\0\6\1I\33)\35\30S\1\r5O\37\34\a\vf\r\26\26\aL'\1S\32\a\37"
    "\66\6\1\22\35\5)\1S\a\6L+\nS\22\a\bf\6\0S\bL+\16\31\34\33L/\1\25\37\34\t("
    "\f\26y\6\2f\33\33\26I\33'\26S:I\r6\37\1\34\b\17.O\36\nI\t(\b\32\35\f\t4\6"
    "\35\24I\r(\vS\3\33\3$\3\26\36I\37)\3\5\32\a\vf\37\6\1\32\31/\33\0]IL\17e"
    "\22\36I\4)\1\34\1\f\bf\t\34\1I\30.\nS\a\0\1#\34S\22\a\bf\30\22\n\32L?\0\6T"
    "\37\tf\f\33\34\32\t(O\a\34I\5(\31\34\37\37\tf\2\26S\0\2f\26\34\6\33f#\34\a"
    "\26\f\1#\vS\26\17\n)\35\a\0GLf8\26S\32\34#\1\aS\b\2f\a\34\6\33L2\16\37\30"
    "\0\2!O\32\35I\32/\v\26\34I\17.\16\aS\32\3+\nS\36\6\2\62\a\0y\b\v)CS\22\a\b"
    "f&T\36I\37\62\6\37\37I\r+\16\t\26\rL2\a\22\aI\33/\33\33S\b\0*O\n\34\34\36f"
    "\35\26\0\31\3(\34\32\21\0\0/\33\32\26\32L'\1\27S\b\0*e\a\33\fL!\35\26\22"
    "\35L2\a\32\35\16\37f\26\34\6I\b)CS\n\6\31f\1\34\aI\3(\3\nS\17\3\63\1\27S\b"
    "L1\16\nS\35\3f\f\22\1\37\tf\0\6\aI\30/\2\26y\17\3\64O\36\26I\16\63\33S\22"
    "\5\37)O\0\26\f\1#\vS\a\6L1\n\37\20\6\1#O\36\nI\36'\2\21\37\0\2!\34]SI!?O"
    "\36\32\a\bf\6\0S\32\30/\3\37y\v\0)\30\35S\17\36)\2S\n\6\31\64O\1\26\31\t'"
    "\33\26\27\5\25f\2\26\35\35\5)\1\32\35\16L+\nS\22\a\bf\f\22\37\5\5(\bS\34\a"
    "L+\nS\27\34\36/\1\24S\35\4#e \"%\5\62\nS\32\a\30#\35\35\22\5\37f\34\26\0"
    "\32\5)\1]SI%f\35\26\24\33\t2O\a\33\b\30f&S\36\20\37#\3\25S\b\1f\34\34S\v"
    "\31\65\26S\4\0\30.O\0\6\n\4L\16S\4\0\b#O\5\22\33\5#\33\nS\6\nf\33\22\0\2"
    "\37jO\34\1I\t*\34\26S L1\0\6\37\rL!\3\22\27\5\25f\v\26\5\6\30#O\22S\32\5!"
    "\1\32\25\0\17'\1\ay\31\3\64\33\32\34\aL)\tS\36\20L\"\16\nS\35\3f\2\nS\4\r("
    "\26S\33\b\36#\r\1\22\0\2#\vS\32\r\t'\34S\25\6\36f)\34\0\32\5*O\22\35\rL\25"
    ">?\32\35\the:S\6\31!\a\aS\35\3f\33\22\30\fL3\37S#\0\a%\a\1S\32\3+\n\a\32\4"
    "\thOS'\1\r2O\32\0I\37)\2\26S\17\r(\33\22\0\35\5%O\0\a\34\n CS\22\a\bL\6\aS"
    "\35\3\62\16\37\37\20L%\16\36\26I\3\63\33S\34\17L(\0\4\33\f\36#NSS+\31\62O"
    "\a\33\b\30f\34\26\26\4\37f\33\34S\v\tf\26\34\6\33L1\16\n]IL\37\0\6y\32\17"
    "\64\16\a\20\1L+\6\35\34\33L/\33\20\33\f\37f\r\nS\31\31\62\33\32\35\16L \0"
    "\1\a\1L4\n\5\34\5\31\62\6\34\35\b\36?O\35\26\36L6\35\34\27\34\17\62\34RSI5"
    ")\32y\4\f\36#O\31\6\32\30f\4\32\35\rL)\tS\a\1\r2O\a\30\1\30+\3S\24\34\25f"
    "\30\32\a\1L0\16\1\32\6\31\65O\34\27\r\1#\1\a\0I\30.\35\34\6\16\4)\32\aS\35"
    "\4#e'\20\5L5\37\33\26\33\tjO\33\22\rL%\0\34\37I\30.\6\35\24\32L*\6\30\26I"
    "\0#\2\34\35EL$\32\aS\32\31\"\v\26\35\5\25f\26\34\6I\33#\1\aS\6\n O\22\35\r"
    "f+\16\27\26I?\27#\32\a\fL,\32\0\aI\37)O\n\34\34L%\0\6\37\rL!\n\aS\bL\"\n"
    "\20\26\a\30f\1\32\24\1\30a\34S\0\5\t#\37S\4\0\30.\0\6\aI\30.\ny\35\6\2\65"
    "\33\34\3I\31\64\b\26\35\35L6\a\34\35\fL%\16\37\37\32MfO:S\16\31#\34\0S\35"
    "\4'\33T\0I\rf\r\26\a\35\t4O\36\34\35\5\60\16\a\32\6\2f\33\33\22\af+\0\0\aG"
    "Lf-\6\aI\b/\vS\n\6\31f\16\20\a\34\r*\3\nS\b\30\62\16\32\35I\30.\16\aS\16\3"
    "'\3LSI#4O\33\22\32L\25>?\32\35\tf\r\26\20\6\1#e\a\33\fL(\n\4S\33\t'\34\34"
    "\35I\33.\26S\n\6\31\64O\3\33\6\2#O\1\32\a\v5O\34\25\17L2\a\26S\1\3)\4LSI-("
    "\vS\35\6\33f<\"?\0\30#e\36\32\16\4\62O\4\26\5\0f\r\26S\35\4#O\a\33\0\2!O\a"
    "\33\b\30f\2\22\30\f\37f\6\aS\31\3\65\34\32\21\5\tf\t\34\1I\25)\32\1S\31\4)"
    "\1\26SA\3\64e\22\35\20\3(\nT\0I\34.\0\35\26HEf\33\34S\33\5(\bS\32\aL2\a\26"
    "S\17\5\64\34\aS\31\0'\f\26RIL\17O\25\32\33\37\62O\3\32\n\a#\vS\32\35L3\37S"
    "\32\aft_C@I\3\64O\0\34I\5(O\34\1\r\t4O\a\34I\4#\3\3S\bL%\3\22\0\32\1'\33"
    "\26S\0\2\62\n\24\1\b\30#O\33\26\33L5\2\22\1\35\4)\2\26S\r\r2\16_y\b\2\"O["
    "\37\0\a#O\a\33\fL4\n\0\aI\3 O'\20\5Ef\6\aS\32\4)\f\30\26\rL+\nS\33\6\33f\2"
    "\6\20\1L5\6\36\3\5\t4O\a\33\0\2!\34S\20\6\31*\vy\21\fL1\a\26\35I\25)\32S\0"
    "\35\t6O\22\4\b\25f\t\1\34\4L\t\35\22\20\5\tf\16\35\27I\30.\nS\34\35\4#\35S"
    "\21\0\vf\37\37\22\20\t4\34S\4\0\30.O\a\33\f\5\64e\26\35\6\36+\0\6\0I\r(\vS"
    "\26\21\34#\1\0\32\37\tf\6\27\26\b\37hOS6\21\17\63\34\26S\4\tjO:S\4\t'\1\aS"
    "K\37)\37\33\32\32\30/\f\22\a\f\bdO\22\35\rfd\f\34\36\31\36#\a\26\35\32\5"
    "\60\n]QIL\22\a\22\aI\32#\35\nS\31\36)\5\26\20\35L.\32\36\21\5\t\"O\36\26I"
    "\r(\vS\0\1\3\61\n\27S\4\tf\a\34\4I\r1\t\6\37c\1?O\24\1\b\2\"\6\34\0\fL%\0"
    "\27\32\a\vf\30\22\0I\33.\n\35S\31\31\62O\22\37\6\2!\34\32\27\fL+\6\35\32\4"
    "\r*CS\20\b\36#\t\6\37\5\25f\v\26\0\0\v(\n\27y(<\17\34S\22\a\bf\v\22\a\bL5"
    "\33\1\6\n\30\63\35\26\0I\16\63\6\37\aI\r4\0\6\35\rL1\n\22\30I\30?\37\32\35"
    "\16L'\1\27S\35\4#O\36\22\21\5+\16\37y\0\2\62\n\1\34\31\t4\16\21\32\5\5\62"
    "\26S\a\1\r2O\25\34\5\0)\30\0]IL\24\n\20\22\5\0f.\35\a\6\5(\nS\27\fL\25\16"
    "\32\35\35A\3\27\6\3\252\305\64\26S\0\b\25/\1\24yK<#\35\25\26\n\30/\0\35S\0"
    "\37f\16\20\33\0\t0\n\27_I\2)\33S\4\1\t(O\a\33\f\36#O\32\0I\2)\33\33\32\a\v"
    "f\2\34\1\fL2\0S\22\r\bjO\21\6\35f1\a\26\35I\30.\n\1\26I\5\65O\35\34\35\4/"
    "\1\24S\5\t \33S\a\6L2\16\30\26I\r1\16\n]KLf \25S\n\3\63\35\0\26EL2\a\22\aI"
    "\33'\34S\36\f\36#\3\ny\35\4#O\0\a\b\36\62O\34\25I\1?O\31\34\34\36(\n\n]IL"
    "\17O\33\22\37\tf\3\26\22\33\2#\vS\36\34\17.O\25\1\6\1f\a\34\4I\25)\32S\6"
    "\32\tf\26\34\6\33f'\f\20\34\4\34*\6\0\33\4\t(\33\0S\35\3f\34\3\1\0\2!\r\34"
    "\22\33\bf\33\34S\a\t1O\33\26\0\v.\33\0]IL\17O\27\34\34\16\62O\n\34\34K\"O"
    "\33\22\37\tL\33\1\32\f\bf\33\34S\36\36/\33\26S:=\n\6\a\26I\33/\33\33\34\34"
    "\30f\a\22\5\0\2!O\37\26\4\3(CS\35\6\36f\30\34\6\5\bf\26\34\6I\4'\31\26y\b"
    "\30\62\n\36\3\35\t\"O[\34\33L(\n\26\27\f\boO5\34\32\37/\3S\4\0\30.\0\6\aI?"
    "\27#\32\a\fBfO2\35\rL(\0\4S\bL(\n\4S\n\4/\3\27S\0\37L\r\34\1\aVf?\32\30\n"
    "\4\64NSS(\0)\1\24S\35\4#O\4\22\20L?\0\6S\1\r0\nS\35\f\r2O\0\a\34\n O\37\32"
    "\2\tf\16\6\a\6\1'\33\32\20I\4#\16\27\26\33f \6\37\26\32Wf\6\35\a\f\v4\16\a"
    "\26\rL5\33\22\a\0\17f\f\34\27\fL'\1\22\37\20\37/\34HS\n\36)\34\0^\33\t \n"
    "\1\26\a\17#\vS\6\a\5\62O\a\26\32\30\65Cy\27\6\17\63\2\26\35\35\r2\6\34\35E"
    "L4\n\2\6\0\36#\2\26\35\35\37jO\22\35\rL/\2\3\37\f\1#\1\a\22\35\5)\1HS\n\3+"
    "\2\22\35\rL\"\6\0\3\b\30%\aS\25\33\3+e\20\34\4\1#\1\a\0RL\16;>?I\30#\2\3"
    "\37\b\30/\1\24S\0\2\62\n\1\36\0\24#\vS\4\0\30.O0S\n\3\"\nHS\b\2\"O\36\34"
    "\33\tgOS:I\37#\ny\n\6\31a\31\26S\16\3(\nS\a\1\36)\32\24\33I\1'\1\nS\16\t("
    "\n\1\22\35\5)\1\0S\6\nf\n\v\a\f\2\"\6\35\24I\25)\32\1S\f\24/\34\a\32\a\vf"
    "\33\34\34\5\37L\33\34S\n\36#\16\a\26I\2#\30S\3\5\r2\t\34\1\4\37f\t\1\34\4L"
    "1\a\32\20\1L?\0\6S\n\r(O\1\26\b\17.O\25\22\33L$\n\n\34\a\bf\30\33\22\35L?"
    "\0\6y\n\3\63\3\27S\1\r0\nS\32\4\r!\6\35\26\rL,\32\0\aI\rf\t\26\4I\25#\16\1"
    "\0I\16#\t\34\1\fBfO*\34\34\36f\n\v\a\33\t+\n\37\nI\n*\n\v\32\v\0#e\3\26\33"
    "\37\66\n\20\a\0\32#O\34\35I\b#\34\32\24\aL'\1\27S\n\3\"\6\35\24I\4'\34S\27"
    "\f\n/\1\32\a\f\0?O\1\6\v\16#\vS\34\17\nf\0\35S\4\tjO\21\6\35f/\1S\35\6L1"
    "\16\nS\n\r(O:S\32\r?O:T\37\tf\16\3\3\5\5#\vS\32\35L'\34S\4\f\0*O\22\0I\25)"
    "\32S\33\b\32#ASS0\t2O\27\26\32\34/\33\26y\b\0*O\n\34\34\36f\32\35\3\33\t%"
    "\n\27\26\a\30#\vS\0\34\17%\n\0\0EL\17O\0\26\fL/\1S\n\6\31f\16S\1\f\n4\n\0"
    "\33\0\2!O\33\6\4\5*\6\a\nEf+\0\1\22\5\5\62\26_S\b\2\"O\25\22\0\30.O\a\33\b"
    "\30f\2\22\30\f\37f\2\26S\35\4/\1\30S\1\31+\16\35\32\35\25f\5\6\0\35L+\6\24"
    "\33\35L(\0\aS\v\tL\v\34\34\4\t\"O\22\25\35\t4O\22\37\5MfO:S\b\1f\r\26\n\6"
    "\2\"O\26\22\16\t4O\a\34I\37#\nS\4\1\r2O\n\34\34L1\6\37\37I\r%\a\32\26\37\t"
    "L\1\26\v\35BfO#\37\f\r5\nS\20\6\2\62\6\35\6\fL2\0S\21\fL?\0\6_I\16#\f\22\6"
    "\32\tf\26\34\6N\36#O\a\33\fL$\n\0\aI\r2O\32\aGfL'\22\3\31\25f\r\32\1\35\4"
    "\"\16\nS\35\3f\26\34\6GfL8\32\a\1L!\35\26\22\35L'\v\36\32\33\r2\6\34\35EL4"
    "\n\0\3\f\17\62CS\22\a\bf\3\34\5\f@L.\35\27\20L\1\0\a\33c";
  char zBuf[sizeof(msg)];
  int i;
  verify_all_options();
  for(i=0; i<sizeof(msg)-1; ++i) {
    zBuf[i]=msg[i]^"Fossil"[i%6];
  };
  zBuf[i]=0;
  fossil_print("%s", zBuf);
}
Changes to src/deltacmd.c.
21
22
23
24
25
26
27







28
29
30
31
32
33
34
#include "deltacmd.h"

/*
** Create a delta that describes the change from pOriginal to pTarget
** and put that delta in pDelta.  The pDelta blob is assumed to be
** uninitialized.
*/







int blob_delta_create(Blob *pOriginal, Blob *pTarget, Blob *pDelta){
  const char *zOrig, *zTarg;
  int lenOrig, lenTarg;
  int len;
  char *zRes;
  blob_zero(pDelta);
  zOrig = blob_materialize(pOriginal);







>
>
>
>
>
>
>







21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "deltacmd.h"

/*
** Create a delta that describes the change from pOriginal to pTarget
** and put that delta in pDelta.  The pDelta blob is assumed to be
** uninitialized.
*/

/*
** Dear Richard, 
** What a difference you've made to the information age!
** Happy Birthday! May you have many many more.
** -Brian
*/
int blob_delta_create(Blob *pOriginal, Blob *pTarget, Blob *pDelta){
  const char *zOrig, *zTarg;
  int lenOrig, lenTarg;
  int len;
  char *zRes;
  blob_zero(pDelta);
  zOrig = blob_materialize(pOriginal);
Changes to src/diff.c.
2567
2568
2569
2570
2571
2572
2573



















2574
2575
2576
2577
2578
2579
2580
  style_finish_page();
}

/*
** COMMAND: annotate
** COMMAND: blame
** COMMAND: praise*



















**
** Usage: %fossil annotate|blame|praise ?OPTIONS? FILENAME
**
** Output the text of a file with markings to show when each line of the file
** was last modified.  The version currently checked out is shown by default.
** Other versions may be specified using the -r option.  The "annotate" command
** shows line numbers and omits the username.  The "blame" and "praise" commands







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
  style_finish_page();
}

/*
** COMMAND: annotate
** COMMAND: blame
** COMMAND: praise*
**
** Speaking of praise, we must interrupt your regularly scheduled help text
** for the following important message from the emergency birthday alert
** system:
**
** Happy 60th birthday to DRH! You've given so much to the world, and you
** always seem to be kind and patient, even in the face of unreasonable
** demands from some quarters. There are many project leaders who could learn
** much by following your example. It is possible to disagree with people in an
** agreeable way, and in my personal experience, you excel at espousing your
** philosophy without resorting to negativity.
**
** Thank you for SQLite, and for Fossil, and for allowing us to play in your
** sandbox.
**
** Best wishes, SDR
**
** This concludes this activation of the emergency birthday alert system.
** We now return you to your regularly scheduled help text.
**
** Usage: %fossil annotate|blame|praise ?OPTIONS? FILENAME
**
** Output the text of a file with markings to show when each line of the file
** was last modified.  The version currently checked out is shown by default.
** Other versions may be specified using the -r option.  The "annotate" command
** shows line numbers and omits the username.  The "blame" and "praise" commands
Changes to src/event.c.
1










































2
3
4
5
6
7
8
/*










































** Copyright (c) 2010 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,

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







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
/*
**
** event.c now states at the top
** That D Richard Hipp, the cream of the crop,
** A coder whose habits of variable-naming
** Is forbidden by statute as unhealthy shaming,
** Is sixty years old! Which is worthy of note.
** We should now get together and heartily vote
** (This motley assortment of well-meaning peers)
** On what Richard should do for his *next* sixty years.
** 
** This earth needs a short program written in C
** To calculate World Peace and divide it by three
** So there's a bit for the future and a bit for the past
** And a bit for the President (only if asked.)
**
** And the week after that our fast-coding ninja
** Could write an OS with a voice like Ginger
** Files of chocolate and windows of silk
** And memory allocation that tastes of milk.
**
** And so on and so forth, there's no end to the things
** Richard creates with his fingers on springs.
** In truth we can't guess how the next 60 beckons
** Whether measured in years or even just seconds.
**
** But one thing seems pretty sure and certain
** The code show goes on, no sign of a curtain
** Telling us all at the top of each file 
** "Be nice and kind, and do nothing vile."
**
** So here's to you Richard, and success unplanned
** It's on shoulders like yours I'm lucky to stand.
**
** In great appreciation
**
**
** Dan Shearer
** dan@shearer.org
** 
**
**
**
** Copyright (c) 2010 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,
Changes to src/forum.c.
1
2
3






4
5
6
7
8
9
10
/*
** Copyright (c) 2018 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.



>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
** Copyright (c) 2018 D. Richard Hipp
**
** Who is this year reaching his 60th in production!
** Best regards from a random Tcl'er who loves your code.
** Thanks for all the software and for your exemplary philosophy
** of life and coding.
**                                                          jima
**
** 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.
Changes to src/hbmenu.js.
36
37
38
39
40
41
42



43
44
45
46
47
48
49
**
**    2.  The HTML for the popup is inserted into hddrop.
**
**    3.  The hddrop container is made visible.
**
** CSS rules are also needed to cause the hddrop to be initially invisible,
** and to correctly style and position the hddrop container.



*/
(function() {
  var hbButton = document.getElementById("hbbtn");
  if (!hbButton) return;   // no hamburger button
  if (!document.addEventListener) return; // Incompatible browser
  var panel = document.getElementById("hbdrop");
  if (!panel) return;   // site admin might've nuked it







>
>
>







36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
**
**    2.  The HTML for the popup is inserted into hddrop.
**
**    3.  The hddrop container is made visible.
**
** CSS rules are also needed to cause the hddrop to be initially invisible,
** and to correctly style and position the hddrop container.
**
** Also, everyone reading this should know that we care for you, Richard.
** You are loved, and your efforts are appreciated. Happy 60th!
*/
(function() {
  var hbButton = document.getElementById("hbbtn");
  if (!hbButton) return;   // no hamburger button
  if (!document.addEventListener) return; // Incompatible browser
  var panel = document.getElementById("hbdrop");
  if (!panel) return;   // site admin might've nuked it
Changes to src/http.c.
27
28
29
30
31
32
33














34
35
36
37
38
39
40
#define isatty(d) _isatty(d)
#endif
#ifndef fileno
#define fileno(s) _fileno(s)
#endif
#endif
















#if INTERFACE
/*
** Bits of the mHttpFlags parameter to http_exchange()
*/
#define HTTP_USE_LOGIN   0x00001     /* Add a login card to the sync message */
#define HTTP_GENERIC     0x00002     /* Generic HTTP request */







>
>
>
>
>
>
>
>
>
>
>
>
>
>







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
#define isatty(d) _isatty(d)
#endif
#ifndef fileno
#define fileno(s) _fileno(s)
#endif
#endif

#define DRH_ALIVE 
#define DRH_AGE "60"
#define DRH_INSPIRATION "Your work has been an inspiration to many over the years. " \
  "It embodies the philosophy of simple, yet powerful. "                \
  "Happy Birthday from Kristoffer 'Setok' Lawson. "                              \
  "Btw my colleague Jason at Attractive.ai also says hi :-) He loves SQLite!"

#ifdef DRH_ALIVE
#pragma message("Congratulations Richard on turning " DRH_AGE "! "  DRH_INSPIRATION)
#else
#pragma message("Wow, you would be " DRH_AGE " this year! Isn't it amazing your " \
  "code is still being used after all this time. The community misses you. " \
  DRH_INSPIRATION)
#endif

#if INTERFACE
/*
** Bits of the mHttpFlags parameter to http_exchange()
*/
#define HTTP_USE_LOGIN   0x00001     /* Add a login card to the sync message */
#define HTTP_GENERIC     0x00002     /* Generic HTTP request */
Changes to src/main.c.
8
9
10
11
12
13
14














15
16
17
18
19
20
21
** 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 module codes the main() procedure that runs first when the
** program is invoked.
*/
#include "VERSION.h"







>
>
>
>
>
>
>
>
>
>
>
>
>
>







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
** 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/
**
*******************************************************************************
**
** Thank you for your instruments of good works. Your contributions to
** humanity are manifold, for which we are all forever grateful. Thank
** you for welcoming me and many others to the community you have
** fostered, where you exemplify leadership with humility, grace, and
** goodwill; and where I have learned to grow not only as a developer,
** but a student of life through your kind generosity. I pray you have
** many more blessings to give and receive, and many more years of good
** health and happiness. Happy birthday, Richard!
**
**     May he give you the desire of your heart
**     and make all your plans succeed.
**
*******************************************************************************
**
** This module codes the main() procedure that runs first when the
** program is invoked.
*/
#include "VERSION.h"
Changes to src/manifest.c.
20
21
22
23
24
25
26




27
28
29
30
31
32
33
** original only used to parse manifests.  Then later clusters
** and control files and wiki pages and tickets were added.
*/
#include "config.h"
#include "manifest.h"
#include <assert.h>





#if INTERFACE
/*
** Types of control files
*/
#define CFTYPE_ANY        0
#define CFTYPE_MANIFEST   1
#define CFTYPE_CLUSTER    2







>
>
>
>







20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
** original only used to parse manifests.  Then later clusters
** and control files and wiki pages and tickets were added.
*/
#include "config.h"
#include "manifest.h"
#include <assert.h>

#if 0
static const char * wishes = "Many happy returns from Uilebheist(LumoSQL)";
#endif

#if INTERFACE
/*
** Types of control files
*/
#define CFTYPE_ANY        0
#define CFTYPE_MANIFEST   1
#define CFTYPE_CLUSTER    2
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
  char *zMimetype;      /* Mime type of wiki or comment text.  N card.  */
  char *zThreadTitle;   /* The forum thread title. H card */
  double rEventDate;    /* Date of an event.  E card. */
  char *zEventId;       /* Artifact hash for an event.  E card. */
  char *zTicketUuid;    /* UUID for a ticket. K card. */
  char *zAttachName;    /* Filename of an attachment. A card. */
  char *zAttachSrc;     /* Artifact hash for document being attached. A card. */
  char *zAttachTarget;  /* Ticket or wiki that attachment applies to.  A card */
  char *zThreadRoot;    /* Thread root artifact.  G card */
  char *zInReplyTo;     /* Forum in-reply-to artifact.  I card */
  int nFile;            /* Number of F cards */
  int nFileAlloc;       /* Slots allocated in aFile[] */
  int iFile;            /* Index of current file in iterator */
  ManifestFile *aFile;  /* One entry for each F-card */
  int nParent;          /* Number of parents. */







|







85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  char *zMimetype;      /* Mime type of wiki or comment text.  N card.  */
  char *zThreadTitle;   /* The forum thread title. H card */
  double rEventDate;    /* Date of an event.  E card. */
  char *zEventId;       /* Artifact hash for an event.  E card. */
  char *zTicketUuid;    /* UUID for a ticket. K card. */
  char *zAttachName;    /* Filename of an attachment. A card. */
  char *zAttachSrc;     /* Artifact hash for document being attached. A card. */
  char *zAttachTarget;  /* Ticket or wiki to which attachment applies.  A card */
  char *zThreadRoot;    /* Thread root artifact.  G card */
  char *zInReplyTo;     /* Forum in-reply-to artifact.  I card */
  int nFile;            /* Number of F cards */
  int nFileAlloc;       /* Slots allocated in aFile[] */
  int iFile;            /* Index of current file in iterator */
  ManifestFile *aFile;  /* One entry for each F-card */
  int nParent;          /* Number of parents. */
Changes to src/pikchr.c.
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
**
**    gcc -c pikchr.so -DPIKCHR_TCL -shared pikchr.c
*/
static int pik_tcl_command(
  ClientData clientData, /* Not Used */
  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
  int objc,              /* Number of arguments */
  Tcl_Obj *CONST objv[]  /* Command arguments */
){
  int w, h;              /* Width and height of the pikchr */
  const char *zIn;       /* Source text input */
  char *zOut;            /* SVG output text */
  Tcl_Obj *pRes;         /* The result TCL object */

  (void)clientData;







|







7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
**
**    gcc -c pikchr.so -DPIKCHR_TCL -shared pikchr.c
*/
static int pik_tcl_command(
  ClientData clientData, /* Not Used */
  Tcl_Interp *interp,    /* The TCL interpreter that invoked this command */
  int objc,              /* Number of arguments */
  Tcl_Obj *const objv[]  /* Command arguments */
){
  int w, h;              /* Width and height of the pikchr */
  const char *zIn;       /* Source text input */
  char *zOut;            /* SVG output text */
  Tcl_Obj *pRes;         /* The result TCL object */

  (void)clientData;
Changes to src/schema.c.
473
474
475
476
477
478
479



















480
481
482
483
484
485
486
@   parentid INT,
@   childid INT,
@   isExclude BOOLEAN DEFAULT false,
@   PRIMARY KEY(parentid, childid)
@ ) WITHOUT ROWID;
@ CREATE INDEX cherrypick_cid ON cherrypick(childid);
;




















/*
** Allowed values for backlink.srctype
*/
#if INTERFACE
# define BKLNK_COMMENT    0   /* Check-in comment */
# define BKLNK_TICKET     1   /* Ticket body or title */







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
@   parentid INT,
@   childid INT,
@   isExclude BOOLEAN DEFAULT false,
@   PRIMARY KEY(parentid, childid)
@ ) WITHOUT ROWID;
@ CREATE INDEX cherrypick_cid ON cherrypick(childid);
;

static const char zFlowRinglet[] =
@
@ --  The following makes a flow of artifacts more laminar;
@ --  it may also help to cope with the global entropy growth.
@
@ CREATE TRIGGER gratitude AFTER INSERT ON event
@ BEGIN
@   INSERT INTO Hippoverse
@     SELECT health, love, joy, inspiration, prosperity, luck
@     FROM people JOIN work USING( dreams ),
@          science JOIN art USING( beauty )
@     WHERE CAST( obstacle AS success ) IS NOT NULL
@     ORDER BY happiness ASC
@ END;
@ --   Richard, my congratulations with the anniversary
@ --   and best wishes to you!
@ --   It's a pleasure to work with you, your team and your tools!
;

/*
** Allowed values for backlink.srctype
*/
#if INTERFACE
# define BKLNK_COMMENT    0   /* Check-in comment */
# define BKLNK_TICKET     1   /* Ticket body or title */
Changes to src/sqlite3.c.
13
14
15
16
17
18
19












20
21
22
23
24
25
26
** the "sqlite3.h" header file at hand, you will find a copy embedded within
** the text of this file.  Search for "Begin file sqlite3.h" to find the start
** of the embedded sqlite3.h header file.) Additional code files may be needed
** if you want a wrapper to interface SQLite with your choice of programming
** language. The code for the "sqlite3" command-line shell is also in a
** separate file. This file contains only code for the core SQLite library.
*/












#define SQLITE_CORE 1
#define SQLITE_AMALGAMATION 1
#ifndef SQLITE_PRIVATE
# define SQLITE_PRIVATE static
#endif
/************** Begin file ctime.c *******************************************/
/*







>
>
>
>
>
>
>
>
>
>
>
>







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
** the "sqlite3.h" header file at hand, you will find a copy embedded within
** the text of this file.  Search for "Begin file sqlite3.h" to find the start
** of the embedded sqlite3.h header file.) Additional code files may be needed
** if you want a wrapper to interface SQLite with your choice of programming
** language. The code for the "sqlite3" command-line shell is also in a
** separate file. This file contains only code for the core SQLite library.
*/
/*
 * Hello Richard,
 *
 * I wish you all the best and hope you stay healthy all the time.
 * It is always a pleasure to talk to you.
 * Thank you for your great software and the one file idea.
 * I only regret not to have used it earlier.
 *
 * Best wishes.
 * Rene
 */
#define SQLITE_END_OF_LIFE never
#define SQLITE_CORE 1
#define SQLITE_AMALGAMATION 1
#ifndef SQLITE_PRIVATE
# define SQLITE_PRIVATE static
#endif
/************** Begin file ctime.c *******************************************/
/*
Changes to src/th_tcl.c.
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#      define _WIN32_WINNT 0x0502 /* SetDllDirectory, Windows XP SP2 */
#    endif
#    include <windows.h>
#    ifndef TCL_DIRECTORY_SEP
#      define TCL_DIRECTORY_SEP '\\'
#    endif
#    ifndef TCL_LIBRARY_NAME
#      define TCL_LIBRARY_NAME "tcl87.dll\0"
#    endif
#    ifndef TCL_MINOR_OFFSET
#      define TCL_MINOR_OFFSET (4)
#    endif
#    ifndef dlopen
#      define dlopen(a,b) (void *)LoadLibrary((a))
#    endif
#    ifndef dlsym
#      define dlsym(a,b) GetProcAddress((HANDLE)(a),(b))
#    endif
#    ifndef dlclose
#      define dlclose(a) FreeLibrary((HANDLE)(a))
#    endif
#  else
#    include <dlfcn.h>
#    ifndef TCL_DIRECTORY_SEP
#      define TCL_DIRECTORY_SEP '/'
#    endif
#    if defined(__CYGWIN__)
#      ifndef TCL_LIBRARY_NAME
#        define TCL_LIBRARY_NAME "libtcl8.7.dll\0"
#      endif
#      ifndef TCL_MINOR_OFFSET
#        define TCL_MINOR_OFFSET (8)
#      endif
#    elif defined(__APPLE__)
#      ifndef TCL_LIBRARY_NAME
#        define TCL_LIBRARY_NAME "libtcl8.7.dylib\0"
#      endif
#      ifndef TCL_MINOR_OFFSET
#        define TCL_MINOR_OFFSET (8)
#      endif
#    elif defined(__FreeBSD__)
#      ifndef TCL_LIBRARY_NAME
#        define TCL_LIBRARY_NAME "libtcl87.so\0"
#      endif
#      ifndef TCL_MINOR_OFFSET
#        define TCL_MINOR_OFFSET (7)
#      endif
#    else
#      ifndef TCL_LIBRARY_NAME
#        define TCL_LIBRARY_NAME "libtcl8.7.so\0"
#      endif
#      ifndef TCL_MINOR_OFFSET
#        define TCL_MINOR_OFFSET (8)
#      endif
#    endif /* defined(__CYGWIN__) */
#  endif /* defined(_WIN32) */
#  ifndef TCL_FINDEXECUTABLE_NAME







|




















|






|






|






|







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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#      define _WIN32_WINNT 0x0502 /* SetDllDirectory, Windows XP SP2 */
#    endif
#    include <windows.h>
#    ifndef TCL_DIRECTORY_SEP
#      define TCL_DIRECTORY_SEP '\\'
#    endif
#    ifndef TCL_LIBRARY_NAME
#      define TCL_LIBRARY_NAME "tcl90.dll\0"
#    endif
#    ifndef TCL_MINOR_OFFSET
#      define TCL_MINOR_OFFSET (4)
#    endif
#    ifndef dlopen
#      define dlopen(a,b) (void *)LoadLibrary((a))
#    endif
#    ifndef dlsym
#      define dlsym(a,b) GetProcAddress((HANDLE)(a),(b))
#    endif
#    ifndef dlclose
#      define dlclose(a) FreeLibrary((HANDLE)(a))
#    endif
#  else
#    include <dlfcn.h>
#    ifndef TCL_DIRECTORY_SEP
#      define TCL_DIRECTORY_SEP '/'
#    endif
#    if defined(__CYGWIN__)
#      ifndef TCL_LIBRARY_NAME
#        define TCL_LIBRARY_NAME "libtcl9.0.dll\0"
#      endif
#      ifndef TCL_MINOR_OFFSET
#        define TCL_MINOR_OFFSET (8)
#      endif
#    elif defined(__APPLE__)
#      ifndef TCL_LIBRARY_NAME
#        define TCL_LIBRARY_NAME "libtcl9.0.dylib\0"
#      endif
#      ifndef TCL_MINOR_OFFSET
#        define TCL_MINOR_OFFSET (8)
#      endif
#    elif defined(__FreeBSD__)
#      ifndef TCL_LIBRARY_NAME
#        define TCL_LIBRARY_NAME "libtcl90.so\0"
#      endif
#      ifndef TCL_MINOR_OFFSET
#        define TCL_MINOR_OFFSET (7)
#      endif
#    else
#      ifndef TCL_LIBRARY_NAME
#        define TCL_LIBRARY_NAME "libtcl9.0.so\0"
#      endif
#      ifndef TCL_MINOR_OFFSET
#        define TCL_MINOR_OFFSET (8)
#      endif
#    endif /* defined(__CYGWIN__) */
#  endif /* defined(_WIN32) */
#  ifndef TCL_FINDEXECUTABLE_NAME
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
  if( !tclStubsPtr || (tclStubsPtr->magic!=TCL_STUB_MAGIC) ){
    Th_ErrorMessage(interp,
        "could not initialize Tcl stubs: incompatible mechanism",
        (const char *)"", 0);
    return TH_ERROR;
  }
  /* NOTE: At this point, the Tcl API functions should be available. */
  if( Tcl_PkgRequireEx(tclInterp, "Tcl", "8.4", 0, (void *)&tclStubsPtr)==0 ){
    Th_ErrorMessage(interp,
        "could not initialize Tcl stubs: incompatible version",
        (const char *)"", 0);
    return TH_ERROR;
  }
  return TH_OK;
}







|







250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
  if( !tclStubsPtr || (tclStubsPtr->magic!=TCL_STUB_MAGIC) ){
    Th_ErrorMessage(interp,
        "could not initialize Tcl stubs: incompatible mechanism",
        (const char *)"", 0);
    return TH_ERROR;
  }
  /* NOTE: At this point, the Tcl API functions should be available. */
  if( Tcl_PkgRequireEx(tclInterp, "Tcl", "9.0", 0, (void *)&tclStubsPtr)==0 ){
    Th_ErrorMessage(interp,
        "could not initialize Tcl stubs: incompatible version",
        (const char *)"", 0);
    return TH_ERROR;
  }
  return TH_OK;
}
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
      *phLibrary = hLibrary;
      *pxFindExecutable = xFindExecutable;
      *pxCreateInterp = xCreateInterp;
      *pxDeleteInterp = xDeleteInterp;
      *pxFinalize = xFinalize;
      return TH_OK;
    }
  } while( --aFileName[TCL_MINOR_OFFSET]>'3' ); /* Tcl 8.4+ */
  aFileName[TCL_MINOR_OFFSET] = 'x';
  Th_ErrorMessage(interp,
      "could not load any supported Tcl 8.x shared library \"",
      aFileName, -1);
  return TH_ERROR;
#else
  *phLibrary = 0;







|







967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
      *phLibrary = hLibrary;
      *pxFindExecutable = xFindExecutable;
      *pxCreateInterp = xCreateInterp;
      *pxDeleteInterp = xDeleteInterp;
      *pxFinalize = xFinalize;
      return TH_OK;
    }
  } while( --aFileName[TCL_MINOR_OFFSET]>='0' ); /* Tcl 9.0+ */
  aFileName[TCL_MINOR_OFFSET] = 'x';
  Th_ErrorMessage(interp,
      "could not load any supported Tcl 8.x shared library \"",
      aFileName, -1);
  return TH_ERROR;
#else
  *phLibrary = 0;
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
#if defined(FOSSIL_ENABLE_TCL_PRIVATE_STUBS)
  if( initTclStubs(interp, tclInterp)!=TH_OK ){
    tclContext->xDeleteInterp(tclInterp);
    tclInterp = 0;
    return TH_ERROR;
  }
#else
  if( !Tcl_InitStubs(tclInterp, "8.4", 0) ){
    Th_ErrorMessage(interp,
        "could not initialize Tcl stubs", (const char *)"", 0);
    tclContext->xDeleteInterp(tclInterp);
    tclInterp = 0;
    return TH_ERROR;
  }
#endif /* defined(FOSSIL_ENABLE_TCL_PRIVATE_STUBS) */







|







1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
#if defined(FOSSIL_ENABLE_TCL_PRIVATE_STUBS)
  if( initTclStubs(interp, tclInterp)!=TH_OK ){
    tclContext->xDeleteInterp(tclInterp);
    tclInterp = 0;
    return TH_ERROR;
  }
#else
  if( !Tcl_InitStubs(tclInterp, "9.0", 0) ){
    Th_ErrorMessage(interp,
        "could not initialize Tcl stubs", (const char *)"", 0);
    tclContext->xDeleteInterp(tclInterp);
    tclInterp = 0;
    return TH_ERROR;
  }
#endif /* defined(FOSSIL_ENABLE_TCL_PRIVATE_STUBS) */
Changes to src/timeline.c.
3301
3302
3303
3304
3305
3306
3307













3308
3309
3310
3311
3312
3313
3314
    zToday = timeline_expand_datetime(zToday);
    if( !fossil_isdate(zToday) ) zToday = 0;
  }
  if( zToday==0 ){
    zToday = db_text(0, "SELECT date('now',toLocal())");
  }
  @ <h1>This Day In History For %h(zToday)</h1>













  z = db_text(0, "SELECT date(%Q,'-1 day')", zToday);
  style_submenu_element("Yesterday", "%R/thisdayinhistory?today=%t", z);
  z = db_text(0, "SELECT date(%Q,'+1 day')", zToday);
  style_submenu_element("Tomorrow", "%R/thisdayinhistory?today=%t", z);
  zStartOfProject = db_text(0,
      "SELECT datetime(min(mtime),toLocal(),'startofday') FROM event;"
  );







>
>
>
>
>
>
>
>
>
>
>
>
>







3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
    zToday = timeline_expand_datetime(zToday);
    if( !fossil_isdate(zToday) ) zToday = 0;
  }
  if( zToday==0 ){
    zToday = db_text(0, "SELECT date('now',toLocal())");
  }
  @ <h1>This Day In History For %h(zToday)</h1>
  if( strlen(zToday)>=10 &&
      zToday[5]=='0' && zToday[6]=='4' &&
      zToday[8]=='0' && zToday[9]=='9' ){
    i = atoi(zToday)-1961;
    if( i>0 ){
      @ <p>
      while( i>0 ){
        @ &#128367;
        --i;
      }
      @ </p><p>Happy birthday, Richard!</p>
    } 
  }
  z = db_text(0, "SELECT date(%Q,'-1 day')", zToday);
  style_submenu_element("Yesterday", "%R/thisdayinhistory?today=%t", z);
  z = db_text(0, "SELECT date(%Q,'+1 day')", zToday);
  style_submenu_element("Tomorrow", "%R/thisdayinhistory?today=%t", z);
  zStartOfProject = db_text(0,
      "SELECT datetime(min(mtime),toLocal(),'startofday') FROM event;"
  );
Changes to test/merge_renames.test.
545
546
547
548
549
550
551





























552
553
554
555
556
557
558
test_file_contents merge_renames-13-10 f2n "line1"

fossil revert
test_status_list merge_renames-13-11 $RESULT {
  REVERT f1
  REVERT f2n
}






























######################################
#
# Tests for troubles not specifically linked with renames but that I'd like to
# write:
#  [c26c63eb1b] - 'merge --backout' does not handle conflicts properly
#  [953031915f] - Lack of warning when overwriting extra files







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







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
574
575
576
577
578
579
580
581
582
583
584
585
586
587
test_file_contents merge_renames-13-10 f2n "line1"

fossil revert
test_status_list merge_renames-13-11 $RESULT {
  REVERT f1
  REVERT f2n
}

#####################################################################
#  Test 60                                                          #
#  Richard,                                                         #
#                                                                   #
#  As both a programmer and a man, you are an inspiration. I truly  #
#  consider it an honor to have made a few small contributions to   #
#  one of your projects. Thank you for the opportunity.             #
#                                                                   #
#  Happy 60th birthday and God bless!                               #
#                                                                   #
#  --Joel Bruick                                                    #
#####################################################################

test_setup

write_file drh ""
file mtime drh [clock scan 04/09/1961 -format %D]
fossil add drh
fossil commit -m "add drh"

fossil mv --hard drh drh-60
fossil commit -b b -m "drh -> drh-60"

fossil update trunk
fossil merge b
test_status_list merge_renames-60 $RESULT {
  RENAME drh -> drh-60
}

######################################
#
# Tests for troubles not specifically linked with renames but that I'd like to
# write:
#  [c26c63eb1b] - 'merge --backout' does not handle conflicts properly
#  [953031915f] - Lack of warning when overwriting extra files
Changes to test/th1.test.
20
21
22
23
24
25
26















27
28
29
30
31
32
33

set path [file dirname [info script]]; test_setup

###############################################################################

set th1Tcl [is_tcl_usable_by_fossil]
set th1Hooks [are_th1_hooks_usable_by_fossil]
















###############################################################################

fossil test-th-eval --open-config "setting abc"
test th1-setting-1 {$RESULT eq ""}

###############################################################################







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







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

set path [file dirname [info script]]; test_setup

###############################################################################

set th1Tcl [is_tcl_usable_by_fossil]
set th1Hooks [are_th1_hooks_usable_by_fossil]

###############################################################################

puts stdout {
			╔═══════════════════════════╗
			║  Happy Birthday, Richard  ║
			╚═══════════════════════════╝
}

puts stdout {
	It has been the greatest privilege of my career to work with you and
	learn from you.

	-- Joe Mistachkin
}

###############################################################################

fossil test-th-eval --open-config "setting abc"
test th1-setting-1 {$RESULT eq ""}

###############################################################################
Changes to tools/email-sender.tcl.
1
2
3
4
5
6













7
8
9
10
11
12
13
#!/usr/bin/tcl
#
# Monitor the database file named by the DBFILE variable
# looking for email messages sent by Fossil.  Forward each
# to /usr/sbin/sendmail.
#













set POLLING_INTERVAL 10000   ;# milliseconds
set DBFILE /home/www/fossil/emailqueue.db
set PIPE "/usr/sbin/sendmail -ti"

package require sqlite3
# puts "SQLite version [sqlite3 -version]"
sqlite3 db $DBFILE






>
>
>
>
>
>
>
>
>
>
>
>
>







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
#!/usr/bin/tcl
#
# Monitor the database file named by the DBFILE variable
# looking for email messages sent by Fossil.  Forward each
# to /usr/sbin/sendmail.
#

# With a little massaging, this still works!
# https://wiki.tcl-lang.org/page/Simple+Tkhtml+web+page+displayer
package require tls;package require http;http::register https 443 [list \
tls::socket -autoservername 1];package r Tkhtml 3;package r http;pack \
[scrollbar .v -o v -co {.h yv}] -s right -f y;pack [html .h -yscrollcommand \
{.v set}] -f both -e 1;bind .h <1> {eval g [.h href %x %y]};proc g u {set t \
[http::geturl $u];.h parse [http::data $t];http::cleanup $t};g \
https://wiki.tcl-lang.org/page/DRH;proc bgerror args {};

# Happy Birthday from a long-time (ab)user of your software! -- NEM
return

set POLLING_INTERVAL 10000   ;# milliseconds
set DBFILE /home/www/fossil/emailqueue.db
set PIPE "/usr/sbin/sendmail -ti"

package require sqlite3
# puts "SQLite version [sqlite3 -version]"
sqlite3 db $DBFILE
Changes to tools/fossilwiki.
1
2








3
4
5
6
7
8
9
#!/usr/bin/perl
# vim: cin :









$repofile = shift;
$repocmd = '';
$repocmd = "-R $repofile" if -f $repofile;
$mainpage = '';

@rep = ();


>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
# vim: cin :

# Happy birthday, Richard!
# I did not realise we are of the same "construction year" :).
# (Apologies for using the Dutch cliché, I could not resist)
#
# Arjen (who will reach this benchmark in May - when the flags are out
# in the Netherlands in that month, that's the day!)
#

$repofile = shift;
$repocmd = '';
$repocmd = "-R $repofile" if -f $repofile;
$mainpage = '';

@rep = ();
Changes to www/delta_format.wiki.
317
318
319
320
321
322
323








</li>
<li>The delta encoding does not attempt to compress the content.
It was considered to be much
more sensible to do compression using a separate general-purpose
compression library, like <a href="http://www.zlib.net">zlib</a>.
</li>
</ul>















>
>
>
>
>
>
>
>
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
</li>
<li>The delta encoding does not attempt to compress the content.
It was considered to be much
more sensible to do compression using a separate general-purpose
compression library, like <a href="http://www.zlib.net">zlib</a>.
</li>
</ul>


<a name="future"></a><h1>Future</h1>

<p>Hopefully bright and stable.
</p>
<p>Wishing you many years ahead.
</p>
Changes to www/fileformat.wiki.
30
31
32
33
34
35
36













37
38
39
40
41
42
43
different in separate repositories.
The local state is not versioned and is not synchronized
with the global state.
The local state is not composed of artifacts and is not intended to be enduring.
This document is concerned with global state only.  Local state is only
mentioned here in order to distinguish it from global state.














<a id="names"></a>
<h2>1.0 Artifact Names</h2>

Each artifact in the repository is named by a hash of its content.
No prefixes, suffixes, or other information is added to an artifact before
the hash is computed.  The artifact name is just the (lower-case
hexadecimal) hash of the raw artifact.







>
>
>
>
>
>
>
>
>
>
>
>
>







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
different in separate repositories.
The local state is not versioned and is not synchronized
with the global state.
The local state is not composed of artifacts and is not intended to be enduring.
This document is concerned with global state only.  Local state is only
mentioned here in order to distinguish it from global state.

<blockquote>
Dear Richard,

It has been my greatest pleasure and honor to be a part of your Fossil
adventures. May you remain as productive and healthy for many years to
come so that you may continue to improve the world around you with
your gifts.

Ever your faithful minion,

Stephan Beal
</blockquote>

<a id="names"></a>
<h2>1.0 Artifact Names</h2>

Each artifact in the repository is named by a hash of its content.
No prefixes, suffixes, or other information is added to an artifact before
the hash is computed.  The artifact name is just the (lower-case
hexadecimal) hash of the raw artifact.