Index: README.md
==================================================================
--- README.md
+++ README.md
@@ -1,5 +1,16 @@
+# 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
@@ -11,5 +22,126 @@
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)
Index: VERSION
==================================================================
--- VERSION
+++ VERSION
@@ -1,1 +1,4 @@
-2.15
+60.0.0
+
+Happy birthday, Richard!
+Remember that the best is yet to come.
Index: compat/tcl-8.6/generic/tcl.h
==================================================================
--- compat/tcl-8.6/generic/tcl.h
+++ compat/tcl-8.6/generic/tcl.h
@@ -51,17 +51,37 @@
* 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_MAJOR_VERSION 9
+#define TCL_MINOR_VERSION 0
#define TCL_RELEASE_LEVEL TCL_FINAL_RELEASE
#define TCL_RELEASE_SERIAL 0
-#define TCL_VERSION "8.6"
-#define TCL_PATCH_LEVEL "8.6.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.
@@ -627,23 +647,22 @@
* 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
+ size_t start; /* Character offset of first character in
* match. */
- long end; /* Character offset of first character after
+ size_t end; /* Character offset of first character after
* the match. */
} Tcl_RegExpIndices;
typedef struct Tcl_RegExpInfo {
- int nsubs; /* Number of subexpressions in the compiled
+ size_t 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
+ size_t 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.
@@ -808,11 +827,11 @@
* 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. */
+ 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
@@ -820,11 +839,11 @@
* 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
+ 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). */
@@ -988,13 +1007,13 @@
#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
+ size_t length; /* Number of non-NULL characters in the
* string. */
- int spaceAvl; /* Total number of bytes available for the
+ 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;
@@ -1153,16 +1172,20 @@
/*
*----------------------------------------------------------------------------
* 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 unsigned (Tcl_HashKeyProc) (Tcl_HashTable *tablePtr, void *keyPtr);
+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);
@@ -1185,20 +1208,12 @@
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
+ 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
@@ -1282,20 +1297,20 @@
* 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
+ size_t numBuckets; /* Total number of buckets allocated at
* **bucketPtr. */
- int numEntries; /* Total number of entries present in
+ size_t numEntries; /* Total number of entries present in
* table. */
- int rebuildSize; /* Enlarge table when numEntries gets to be
+ 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 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. */
@@ -1312,11 +1327,11 @@
* hash tables:
*/
typedef struct Tcl_HashSearch {
Tcl_HashTable *tablePtr; /* Table being searched. */
- int nextIndex; /* Index of next bucket to be enumerated after
+ 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;
@@ -1353,12 +1368,12 @@
*/
typedef struct {
void *next; /* Search position for underlying hash
* table. */
- int epoch; /* Epoch marker for dictionary being searched,
- * or -1 if search has terminated. */
+ 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;
/*
*----------------------------------------------------------------------------
@@ -1730,11 +1745,11 @@
* 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
+ 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
@@ -1920,12 +1935,12 @@
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,
+ 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;
@@ -2035,11 +2050,11 @@
#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
+ 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. */
@@ -2380,21 +2395,21 @@
*
* 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)
+#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 exact, int magic);
const char * TclTomMathInitializeStubs(Tcl_Interp *interp,
const char *version, int epoch, int revision);
/*
* When not using stubs, make it a macro.
@@ -2485,30 +2500,36 @@
# 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 <= 0) { \
+ if (_objPtr->refCount-- <= 1) { \
TclFreeObj(_objPtr); \
} \
} while(0)
+# undef Tcl_IsShared
# define Tcl_IsShared(objPtr) \
((objPtr)->refCount > 1)
#endif
/*
Index: compat/tcl-8.6/generic/tclDecls.h
==================================================================
--- compat/tcl-8.6/generic/tclDecls.h
+++ compat/tcl-8.6/generic/tclDecls.h
@@ -121,11 +121,11 @@
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,
+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);
@@ -199,11 +199,11 @@
/* 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);
+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 */
@@ -1864,11 +1864,11 @@
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_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 */
@@ -1892,11 +1892,11 @@
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 */
+ 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 */
Index: skins/default/header.txt
==================================================================
--- skins/default/header.txt
+++ skins/default/header.txt
@@ -7,12 +7,22 @@
html "Login\n"
}
+
-html "☰"
+html "▀▄
Start"
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]} {
Index: src/branch.c
==================================================================
--- src/branch.c
+++ src/branch.c
@@ -1,7 +1,10 @@
/*
** 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".)
Index: src/checkout.c
==================================================================
--- src/checkout.c
+++ src/checkout.c
@@ -426,5 +426,119 @@
}
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
+#if 0
+static const char * wishes = "Many happy returns from Uilebheist(LumoSQL)";
+#endif
+
#if INTERFACE
/*
** Types of control files
*/
#define CFTYPE_ANY 0
@@ -83,11 +87,11 @@
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 *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 */
Index: src/pikchr.c
==================================================================
--- src/pikchr.c
+++ src/pikchr.c
@@ -7921,11 +7921,11 @@
*/
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 */
+ 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 */
Index: src/schema.c
==================================================================
--- src/schema.c
+++ src/schema.c
@@ -475,10 +475,29 @@
@ 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
Index: src/sqlite3.c
==================================================================
--- src/sqlite3.c
+++ src/sqlite3.c
@@ -15,10 +15,22 @@
** 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
Index: src/th_tcl.c
==================================================================
--- src/th_tcl.c
+++ src/th_tcl.c
@@ -98,11 +98,11 @@
# include
# ifndef TCL_DIRECTORY_SEP
# define TCL_DIRECTORY_SEP '\\'
# endif
# ifndef TCL_LIBRARY_NAME
-# define TCL_LIBRARY_NAME "tcl87.dll\0"
+# define TCL_LIBRARY_NAME "tcl90.dll\0"
# endif
# ifndef TCL_MINOR_OFFSET
# define TCL_MINOR_OFFSET (4)
# endif
# ifndef dlopen
@@ -119,32 +119,32 @@
# ifndef TCL_DIRECTORY_SEP
# define TCL_DIRECTORY_SEP '/'
# endif
# if defined(__CYGWIN__)
# ifndef TCL_LIBRARY_NAME
-# define TCL_LIBRARY_NAME "libtcl8.7.dll\0"
+# 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 "libtcl8.7.dylib\0"
+# 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 "libtcl87.so\0"
+# 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 "libtcl8.7.so\0"
+# define TCL_LIBRARY_NAME "libtcl9.0.so\0"
# endif
# ifndef TCL_MINOR_OFFSET
# define TCL_MINOR_OFFSET (8)
# endif
# endif /* defined(__CYGWIN__) */
@@ -252,11 +252,11 @@
"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 ){
+ 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;
}
@@ -969,11 +969,11 @@
*pxCreateInterp = xCreateInterp;
*pxDeleteInterp = xDeleteInterp;
*pxFinalize = xFinalize;
return TH_OK;
}
- } while( --aFileName[TCL_MINOR_OFFSET]>'3' ); /* Tcl 8.4+ */
+ } 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;
@@ -1145,11 +1145,11 @@
tclContext->xDeleteInterp(tclInterp);
tclInterp = 0;
return TH_ERROR;
}
#else
- if( !Tcl_InitStubs(tclInterp, "8.4", 0) ){
+ 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;
Index: src/timeline.c
==================================================================
--- src/timeline.c
+++ src/timeline.c
@@ -3303,10 +3303,23 @@
}
if( zToday==0 ){
zToday = db_text(0, "SELECT date('now',toLocal())");
}
@ This Day In History For %h(zToday)
+ if( strlen(zToday)>=10 &&
+ zToday[5]=='0' && zToday[6]=='4' &&
+ zToday[8]=='0' && zToday[9]=='9' ){
+ i = atoi(zToday)-1961;
+ if( i>0 ){
+ @
+ while( i>0 ){
+ @ 🕯
+ --i;
+ }
+ @
Happy birthday, Richard!
+ }
+ }
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,
Index: test/merge_renames.test
==================================================================
--- test/merge_renames.test
+++ test/merge_renames.test
@@ -547,10 +547,39 @@
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:
Index: test/th1.test
==================================================================
--- test/th1.test
+++ test/th1.test
@@ -22,10 +22,25 @@
###############################################################################
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 ""}
Index: tools/email-sender.tcl
==================================================================
--- tools/email-sender.tcl
+++ tools/email-sender.tcl
@@ -2,10 +2,23 @@
#
# 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
Index: tools/fossilwiki
==================================================================
--- tools/fossilwiki
+++ tools/fossilwiki
@@ -1,7 +1,15 @@
#!/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 = '';
Index: www/delta_format.wiki
==================================================================
--- www/delta_format.wiki
+++ www/delta_format.wiki
@@ -319,5 +319,13 @@
It was considered to be much
more sensible to do compression using a separate general-purpose
compression library, like zlib.
+
+
+Future
+
+Hopefully bright and stable.
+
+Wishing you many years ahead.
+
Index: www/fileformat.wiki
==================================================================
--- www/fileformat.wiki
+++ www/fileformat.wiki
@@ -32,10 +32,23 @@
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.
+
+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
+
+
1.0 Artifact Names
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