0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20 /*.** Copyright
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68 (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54 ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20 te it and/or.**
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 modify it under
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76 lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65 ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 tributed in the
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 l be useful,.**
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20 but WITHOUT ANY
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55 A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20 RPOSE. See the
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50 GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 d have received
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72 g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69 ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65 te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20 ation, Inc., 59
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53 Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73 uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31 ton, MA 02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20 307, USA..**.**
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 nformation:.**
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 * http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 contains code t
0380: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 o implement the
0390: 74 69 6d 65 6c 69 6e 65 20 77 65 62 20 70 61 67 timeline web pag
03a0: 65 0a 2a 2a 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 e.**.*/.#include
03b0: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 <string.h>.#inc
03c0: 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 lude <time.h>.#i
03d0: 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 nclude "config.h
03e0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 69 6d 65 ".#include "time
03f0: 6c 69 6e 65 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 47 line.h"../*.** G
0400: 65 6e 65 72 61 74 65 20 61 20 68 79 70 65 72 6c enerate a hyperl
0410: 69 6e 6b 20 74 6f 20 61 20 76 65 72 73 69 6f 6e ink to a version
0420: 2e 0a 2a 2f 0a 76 6f 69 64 20 68 79 70 65 72 6c ..*/.void hyperl
0430: 69 6e 6b 5f 74 6f 5f 75 75 69 64 28 63 6f 6e 73 ink_to_uuid(cons
0440: 74 20 63 68 61 72 20 2a 7a 55 75 69 64 29 7b 0a t char *zUuid){.
0450: 20 20 63 68 61 72 20 7a 53 68 6f 72 74 55 75 69 char zShortUui
0460: 64 5b 55 55 49 44 5f 53 49 5a 45 2b 31 5d 3b 0a d[UUID_SIZE+1];.
0470: 20 20 73 70 72 69 6e 74 66 28 7a 53 68 6f 72 74 sprintf(zShort
0480: 55 75 69 64 2c 20 22 25 2e 31 30 73 22 2c 20 7a Uuid, "%.10s", z
0490: 55 75 69 64 29 3b 0a 20 20 69 66 28 20 67 2e 6f Uuid);. if( g.o
04a0: 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 kHistory ){.
04b0: 40 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e @ <a href="%s(g.
04c0: 7a 42 61 73 65 55 52 4c 29 2f 69 6e 66 6f 2f 25 zBaseURL)/info/%
04d0: 73 28 7a 55 75 69 64 29 22 3e 5b 25 73 28 7a 53 s(zUuid)">[%s(zS
04e0: 68 6f 72 74 55 75 69 64 29 5d 3c 2f 61 3e 0a 20 hortUuid)]</a>.
04f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c 62 }else{. @ <b
0500: 3e 5b 25 73 28 7a 53 68 6f 72 74 55 75 69 64 29 >[%s(zShortUuid)
0510: 5d 3c 2f 62 3e 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a ]</b>. }.}../*.
0520: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 79 ** Generate a hy
0530: 70 65 72 6c 69 6e 6b 20 74 68 61 74 20 69 6e 76 perlink that inv
0540: 6f 6b 65 73 20 6a 61 76 61 73 63 72 69 70 74 20 okes javascript
0550: 74 6f 20 68 69 67 68 6c 69 67 68 74 0a 2a 2a 20 to highlight.**
0560: 61 20 76 65 72 73 69 6f 6e 20 6f 6e 20 6d 6f 75 a version on mou
0570: 73 65 6f 76 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 seover..*/.void
0580: 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 hyperlink_to_uui
0590: 64 5f 77 69 74 68 5f 6d 6f 75 73 65 6f 76 65 72 d_with_mouseover
05a0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a (. const char *
05b0: 7a 55 75 69 64 2c 20 20 20 2f 2a 20 54 68 65 20 zUuid, /* The
05c0: 55 55 49 44 20 74 6f 20 64 69 73 70 6c 61 79 20 UUID to display
05d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
05e0: 2a 7a 49 6e 2c 20 20 20 20 20 2f 2a 20 4a 61 76 *zIn, /* Jav
05f0: 61 73 63 72 69 70 74 20 70 72 6f 63 20 66 6f 72 ascript proc for
0600: 20 6d 6f 75 73 65 6f 76 65 72 20 2a 2f 0a 20 20 mouseover */.
0610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 75 74 const char *zOut
0620: 2c 20 20 20 20 2f 2a 20 4a 61 76 61 73 63 72 69 , /* Javascri
0630: 70 74 20 70 72 6f 63 20 66 6f 72 20 6d 6f 75 73 pt proc for mous
0640: 65 6f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 64 eout */. int id
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
0660: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 6a 61 * Argument to ja
0670: 76 61 73 63 72 69 70 74 20 70 72 6f 63 73 20 2a vascript procs *
0680: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 53 68 6f /.){. char zSho
0690: 72 74 55 75 69 64 5b 55 55 49 44 5f 53 49 5a 45 rtUuid[UUID_SIZE
06a0: 2b 31 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a +1];. sprintf(z
06b0: 53 68 6f 72 74 55 75 69 64 2c 20 22 25 2e 31 30 ShortUuid, "%.10
06c0: 73 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 69 66 s", zUuid);. if
06d0: 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b ( g.okHistory ){
06e0: 0a 20 20 20 20 40 20 3c 61 20 6f 6e 6d 6f 75 73 . @ <a onmous
06f0: 65 6f 76 65 72 3d 27 25 73 28 7a 49 6e 29 28 22 eover='%s(zIn)("
0700: 6d 25 64 28 69 64 29 22 29 27 20 6f 6e 6d 6f 75 m%d(id)")' onmou
0710: 73 65 6f 75 74 3d 27 25 73 28 7a 4f 75 74 29 28 seout='%s(zOut)(
0720: 22 6d 25 64 28 69 64 29 22 29 27 0a 20 20 20 20 "m%d(id)")'.
0730: 40 20 20 20 20 68 72 65 66 3d 22 25 73 28 67 2e @ href="%s(g.
0740: 7a 42 61 73 65 55 52 4c 29 2f 76 69 6e 66 6f 2f zBaseURL)/vinfo/
0750: 25 73 28 7a 55 75 69 64 29 22 3e 5b 25 73 28 7a %s(zUuid)">[%s(z
0760: 53 68 6f 72 74 55 75 69 64 29 5d 3c 2f 61 3e 0a ShortUuid)]</a>.
0770: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c }else{. @ <
0780: 62 20 6f 6e 6d 6f 75 73 65 6f 76 65 72 3d 27 25 b onmouseover='%
0790: 73 28 7a 49 6e 29 28 22 6d 25 64 28 69 64 29 22 s(zIn)("m%d(id)"
07a0: 29 27 20 6f 6e 6d 6f 75 73 65 6f 75 74 3d 27 25 )' onmouseout='%
07b0: 73 28 7a 4f 75 74 29 28 22 6d 25 64 28 69 64 29 s(zOut)("m%d(id)
07c0: 22 29 27 3e 0a 20 20 20 20 40 20 5b 25 73 28 7a ")'>. @ [%s(z
07d0: 53 68 6f 72 74 55 75 69 64 29 5d 3c 2f 62 3e 0a ShortUuid)]</b>.
07e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e }.}../*.** Gen
07f0: 65 72 61 74 65 20 61 20 68 79 70 65 72 6c 69 6e erate a hyperlin
0800: 6b 20 74 6f 20 61 20 64 69 66 66 20 62 65 74 77 k to a diff betw
0810: 65 65 6e 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 een two versions
0820: 2e 0a 2a 2f 0a 76 6f 69 64 20 68 79 70 65 72 6c ..*/.void hyperl
0830: 69 6e 6b 5f 74 6f 5f 64 69 66 66 28 63 6f 6e 73 ink_to_diff(cons
0840: 74 20 63 68 61 72 20 2a 7a 56 31 2c 20 63 6f 6e t char *zV1, con
0850: 73 74 20 63 68 61 72 20 2a 7a 56 32 29 7b 0a 20 st char *zV2){.
0860: 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79 if( g.okHistory
0870: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 56 32 3d ){. if( zV2=
0880: 3d 30 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 61 =0 ){. @ <a
0890: 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 href="%s(g.zBas
08a0: 65 55 52 4c 29 2f 64 69 66 66 3f 76 32 3d 25 73 eURL)/diff?v2=%s
08b0: 28 7a 56 31 29 22 3e 5b 64 69 66 66 5d 3c 2f 61 (zV1)">[diff]</a
08c0: 3e 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 >. }else{.
08d0: 20 20 20 40 20 3c 61 20 68 72 65 66 3d 22 25 73 @ <a href="%s
08e0: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 64 69 66 (g.zBaseURL)/dif
08f0: 66 3f 76 31 3d 25 73 28 7a 56 31 29 26 76 32 3d f?v1=%s(zV1)&v2=
0900: 25 73 28 7a 56 32 29 22 3e 5b 64 69 66 66 5d 3c %s(zV2)">[diff]<
0910: 2f 61 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a /a>. }. }.}.
0920: 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 ./*.** Count the
0930: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 62 number of non-b
0940: 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 20 66 ranch children f
0950: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 68 65 or the given che
0960: 63 6b 2d 69 6e 2e 0a 2a 2a 20 41 20 6e 6f 6e 2d ck-in..** A non-
0970: 62 72 61 6e 63 68 20 63 68 69 6c 64 20 69 73 20 branch child is
0980: 61 20 63 68 69 6c 64 20 74 68 61 74 20 6f 6d 69 a child that omi
0990: 74 73 20 74 68 65 20 22 6e 65 77 62 72 61 6e 63 ts the "newbranc
09a0: 68 22 20 74 61 67 2e 0a 2a 2f 0a 69 6e 74 20 63 h" tag..*/.int c
09b0: 6f 75 6e 74 5f 6e 6f 6e 62 72 61 6e 63 68 5f 63 ount_nonbranch_c
09c0: 68 69 6c 64 72 65 6e 28 69 6e 74 20 70 69 64 29 hildren(int pid)
09d0: 7b 0a 20 20 69 6e 74 20 6e 4e 6f 6e 42 72 61 6e {. int nNonBran
09e0: 63 68 3b 0a 0a 20 20 6e 4e 6f 6e 42 72 61 6e 63 ch;.. nNonBranc
09f0: 68 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 20 0a h = db_int(0, .
0a00: 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e "SELECT coun
0a10: 74 28 2a 29 20 46 52 4f 4d 20 70 6c 69 6e 6b 22 t(*) FROM plink"
0a20: 0a 20 20 20 20 22 20 57 48 45 52 45 20 70 69 64 . " WHERE pid
0a30: 3d 25 64 22 0a 20 20 20 20 22 20 20 20 41 4e 44 =%d". " AND
0a40: 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 NOT EXISTS(SELE
0a50: 43 54 20 31 20 46 52 4f 4d 20 74 61 67 78 72 65 CT 1 FROM tagxre
0a60: 66 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 f".
0a70: 20 20 20 20 20 20 20 22 20 20 20 57 48 45 52 45 " WHERE
0a80: 20 74 61 67 69 64 3d 25 64 22 0a 20 20 20 20 20 tagid=%d".
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
0aa0: 20 20 20 20 20 41 4e 44 20 72 69 64 3d 63 69 64 AND rid=cid
0ab0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ".
0ac0: 20 20 20 20 20 20 22 20 20 20 20 20 41 4e 44 20 " AND
0ad0: 74 61 67 74 79 70 65 3e 30 22 0a 20 20 20 20 20 tagtype>0".
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
0af0: 20 29 22 2c 0a 20 20 20 20 70 69 64 2c 20 54 41 )",. pid, TA
0b00: 47 5f 4e 45 57 42 52 41 4e 43 48 0a 20 20 29 3b G_NEWBRANCH. );
0b10: 0a 20 20 72 65 74 75 72 6e 20 6e 4e 6f 6e 42 72 . return nNonBr
0b20: 61 6e 63 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 anch;.}../*.** A
0b30: 6c 6c 6f 77 65 64 20 66 6c 61 67 73 20 66 6f 72 llowed flags for
0b40: 20 74 68 65 20 74 6d 46 6c 61 67 73 20 61 72 67 the tmFlags arg
0b50: 75 6d 65 6e 74 20 74 6f 20 77 77 77 5f 70 72 69 ument to www_pri
0b60: 6e 74 5f 74 69 6d 65 6c 69 6e 65 0a 2a 2f 0a 23 nt_timeline.*/.#
0b70: 69 66 20 49 4e 54 45 52 46 41 43 45 0a 23 64 65 if INTERFACE.#de
0b80: 66 69 6e 65 20 54 49 4d 45 4c 49 4e 45 5f 41 52 fine TIMELINE_AR
0b90: 54 49 44 20 20 30 78 30 30 30 31 20 20 20 2f 2a TID 0x0001 /*
0ba0: 20 53 68 6f 77 20 61 72 74 69 66 61 63 74 20 49 Show artifact I
0bb0: 44 73 20 6f 6e 20 6e 6f 6e 2d 63 68 65 63 6b 2d Ds on non-check-
0bc0: 69 6e 20 6c 69 6e 65 73 20 2a 2f 0a 23 65 6e 64 in lines */.#end
0bd0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 if../*.** Output
0be0: 20 61 20 74 69 6d 65 6c 69 6e 65 20 69 6e 20 74 a timeline in t
0bf0: 68 65 20 77 65 62 20 66 6f 72 6d 61 74 20 67 69 he web format gi
0c00: 76 65 6e 20 61 20 71 75 65 72 79 2e 20 20 54 68 ven a query. Th
0c10: 65 20 71 75 65 72 79 0a 2a 2a 20 73 68 6f 75 6c e query.** shoul
0c20: 64 20 72 65 74 75 72 6e 20 74 68 65 73 65 20 63 d return these c
0c30: 6f 6c 75 6d 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 olumns:.**.**
0c40: 20 30 2e 20 20 72 69 64 0a 2a 2a 20 20 20 20 31 0. rid.** 1
0c50: 2e 20 20 55 55 49 44 0a 2a 2a 20 20 20 20 32 2e . UUID.** 2.
0c60: 20 20 44 61 74 65 2f 54 69 6d 65 0a 2a 2a 20 20 Date/Time.**
0c70: 20 20 33 2e 20 20 43 6f 6d 6d 65 6e 74 20 73 74 3. Comment st
0c80: 72 69 6e 67 0a 2a 2a 20 20 20 20 34 2e 20 20 55 ring.** 4. U
0c90: 73 65 72 0a 2a 2a 20 20 20 20 35 2e 20 20 4e 75 ser.** 5. Nu
0ca0: 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 6d 65 72 67 mber of non-merg
0cb0: 65 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 20 20 e children.**
0cc0: 20 36 2e 20 20 4e 75 6d 62 65 72 20 6f 66 20 70 6. Number of p
0cd0: 61 72 65 6e 74 73 0a 2a 2a 20 20 20 20 37 2e 20 arents.** 7.
0ce0: 20 54 72 75 65 20 69 66 20 69 73 20 61 20 6c 65 True if is a le
0cf0: 61 66 0a 2a 2a 20 20 20 20 38 2e 20 20 62 61 63 af.** 8. bac
0d00: 6b 67 72 6f 75 6e 64 20 63 6f 6c 6f 72 0a 2a 2a kground color.**
0d10: 20 20 20 20 39 2e 20 20 74 79 70 65 20 28 22 63 9. type ("c
0d20: 69 22 2c 20 22 77 22 29 0a 2a 2a 20 20 20 31 30 i", "w").** 10
0d30: 2e 20 20 6c 69 73 74 20 6f 66 20 73 79 6d 62 6f . list of symbo
0d40: 6c 69 63 20 74 61 67 73 2e 0a 2a 2f 0a 76 6f 69 lic tags..*/.voi
0d50: 64 20 77 77 77 5f 70 72 69 6e 74 5f 74 69 6d 65 d www_print_time
0d60: 6c 69 6e 65 28 0a 20 20 53 74 6d 74 20 2a 70 51 line(. Stmt *pQ
0d70: 75 65 72 79 2c 20 20 20 20 20 20 20 20 20 20 2f uery, /
0d80: 2a 20 51 75 65 72 79 20 74 6f 20 69 6d 70 6c 65 * Query to imple
0d90: 6d 65 6e 74 20 74 68 65 20 74 69 6d 65 6c 69 6e ment the timelin
0da0: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6d 46 6c 61 e */. int tmFla
0db0: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a gs, /*
0dc0: 20 46 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 Flags controlli
0dd0: 6e 67 20 64 69 73 70 6c 61 79 20 62 65 68 61 76 ng display behav
0de0: 69 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a ior */. void (*
0df0: 78 45 78 74 72 61 29 28 69 6e 74 29 20 20 20 20 xExtra)(int)
0e00: 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 63 61 /* Routine to ca
0e10: 6c 6c 20 6f 6e 20 65 61 63 68 20 6c 69 6e 65 20 ll on each line
0e20: 6f 66 20 64 69 73 70 6c 61 79 20 2a 2f 0a 29 7b of display */.){
0e30: 0a 20 20 69 6e 74 20 77 69 6b 69 46 6c 61 67 73 . int wikiFlags
0e40: 3b 0a 20 20 69 6e 74 20 6d 78 57 69 6b 69 4c 65 ;. int mxWikiLe
0e50: 6e 3b 0a 20 20 42 6c 6f 62 20 63 6f 6d 6d 65 6e n;. Blob commen
0e60: 74 3b 0a 20 20 63 68 61 72 20 7a 50 72 65 76 44 t;. char zPrevD
0e70: 61 74 65 5b 32 30 5d 3b 0a 20 20 7a 50 72 65 76 ate[20];. zPrev
0e80: 44 61 74 65 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 Date[0] = 0;..
0e90: 6d 78 57 69 6b 69 4c 65 6e 20 3d 20 64 62 5f 67 mxWikiLen = db_g
0ea0: 65 74 5f 69 6e 74 28 22 74 69 6d 65 6c 69 6e 65 et_int("timeline
0eb0: 2d 6d 61 78 2d 63 6f 6d 6d 65 6e 74 22 2c 20 30 -max-comment", 0
0ec0: 29 3b 0a 20 20 69 66 28 20 64 62 5f 67 65 74 5f );. if( db_get_
0ed0: 62 6f 6f 6c 65 61 6e 28 22 74 69 6d 65 6c 69 6e boolean("timelin
0ee0: 65 2d 62 6c 6f 63 6b 2d 6d 61 72 6b 75 70 22 2c e-block-markup",
0ef0: 20 30 29 20 29 7b 0a 20 20 20 20 77 69 6b 69 46 0) ){. wikiF
0f00: 6c 61 67 73 20 3d 20 57 49 4b 49 5f 49 4e 4c 49 lags = WIKI_INLI
0f10: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 NE;. }else{.
0f20: 20 77 69 6b 69 46 6c 61 67 73 20 3d 20 57 49 4b wikiFlags = WIK
0f30: 49 5f 49 4e 4c 49 4e 45 20 7c 20 57 49 4b 49 5f I_INLINE | WIKI_
0f40: 4e 4f 42 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 20 20 NOBLOCK;. }..
0f50: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 db_multi_exec(.
0f60: 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 "CREATE TEMP
0f70: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 TABLE IF NOT EX
0f80: 49 53 54 53 20 73 65 65 6e 28 72 69 64 20 49 4e ISTS seen(rid IN
0f90: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE
0fa0: 59 29 3b 22 0a 20 20 20 20 20 22 44 45 4c 45 54 Y);". "DELET
0fb0: 45 20 46 52 4f 4d 20 73 65 65 6e 3b 22 0a 20 20 E FROM seen;".
0fc0: 29 3b 0a 20 20 40 20 3c 74 61 62 6c 65 20 63 65 );. @ <table ce
0fd0: 6c 6c 73 70 61 63 69 6e 67 3d 30 20 62 6f 72 64 llspacing=0 bord
0fe0: 65 72 3d 30 20 63 65 6c 6c 70 61 64 64 69 6e 67 er=0 cellpadding
0ff0: 3d 30 3e 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 =0>. blob_zero(
1000: 26 63 6f 6d 6d 65 6e 74 29 3b 0a 20 20 77 68 69 &comment);. whi
1010: 6c 65 28 20 64 62 5f 73 74 65 70 28 70 51 75 65 le( db_step(pQue
1020: 72 79 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 ry)==SQLITE_ROW
1030: 29 7b 0a 20 20 20 20 69 6e 74 20 72 69 64 20 3d ){. int rid =
1040: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 db_column_int(p
1050: 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 63 Query, 0);. c
1060: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64 onst char *zUuid
1070: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 = db_column_tex
1080: 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 t(pQuery, 1);.
1090: 20 20 69 6e 74 20 6e 50 43 68 69 6c 64 20 3d 20 int nPChild =
10a0: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 51 db_column_int(pQ
10b0: 75 65 72 79 2c 20 35 29 3b 0a 20 20 20 20 69 6e uery, 5);. in
10c0: 74 20 6e 50 61 72 65 6e 74 20 3d 20 64 62 5f 63 t nParent = db_c
10d0: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 51 75 65 72 79 olumn_int(pQuery
10e0: 2c 20 36 29 3b 0a 20 20 20 20 69 6e 74 20 69 73 , 6);. int is
10f0: 4c 65 61 66 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e Leaf = db_column
1100: 5f 69 6e 74 28 70 51 75 65 72 79 2c 20 37 29 3b _int(pQuery, 7);
1110: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
1120: 2a 7a 42 67 43 6c 72 20 3d 20 64 62 5f 63 6f 6c *zBgClr = db_col
1130: 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c umn_text(pQuery,
1140: 20 38 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 8);. const c
1150: 68 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f har *zDate = db_
1160: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 column_text(pQue
1170: 72 79 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 ry, 2);. cons
1180: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 t char *zType =
1190: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 db_column_text(p
11a0: 51 75 65 72 79 2c 20 39 29 3b 0a 20 20 20 20 63 Query, 9);. c
11b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 onst char *zUser
11c0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 = db_column_tex
11d0: 74 28 70 51 75 65 72 79 2c 20 34 29 3b 0a 20 20 t(pQuery, 4);.
11e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 const char *zT
11f0: 61 67 4c 69 73 74 20 3d 20 64 62 5f 63 6f 6c 75 agList = db_colu
1200: 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 mn_text(pQuery,
1210: 31 30 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 10);. db_mult
1220: 69 5f 65 78 65 63 28 22 49 4e 53 45 52 54 20 4f i_exec("INSERT O
1230: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 73 65 R IGNORE INTO se
1240: 65 6e 20 56 41 4c 55 45 53 28 25 64 29 22 2c 20 en VALUES(%d)",
1250: 72 69 64 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 rid);. if( me
1260: 6d 63 6d 70 28 7a 44 61 74 65 2c 20 7a 50 72 65 mcmp(zDate, zPre
1270: 76 44 61 74 65 2c 20 31 30 29 20 29 7b 0a 20 20 vDate, 10) ){.
1280: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 50 72 65 sprintf(zPre
1290: 76 44 61 74 65 2c 20 22 25 2e 31 30 73 22 2c 20 vDate, "%.10s",
12a0: 7a 44 61 74 65 29 3b 0a 20 20 20 20 20 20 40 20 zDate);. @
12b0: 3c 74 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e 3d <tr><td colspan=
12c0: 33 3e 0a 20 20 20 20 20 20 40 20 20 20 3c 64 69 3>. @ <di
12d0: 76 20 63 6c 61 73 73 3d 22 64 69 76 69 64 65 72 v class="divider
12e0: 22 3e 25 73 28 7a 50 72 65 76 44 61 74 65 29 3c ">%s(zPrevDate)<
12f0: 2f 64 69 76 3e 0a 20 20 20 20 20 20 40 20 3c 2f /div>. @ </
1300: 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 7d 0a 20 td></tr>. }.
1310: 20 20 20 40 20 3c 74 72 3e 0a 20 20 20 20 40 20 @ <tr>. @
1320: 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 <td valign="top"
1330: 3e 25 73 28 26 7a 44 61 74 65 5b 31 31 5d 29 3c >%s(&zDate[11])<
1340: 2f 74 64 3e 0a 20 20 20 20 40 20 3c 74 64 20 77 /td>. @ <td w
1350: 69 64 74 68 3d 22 32 30 22 20 61 6c 69 67 6e 3d idth="20" align=
1360: 22 63 65 6e 74 65 72 22 20 76 61 6c 69 67 6e 3d "center" valign=
1370: 22 74 6f 70 22 3e 0a 20 20 20 20 40 20 3c 66 6f "top">. @ <fo
1380: 6e 74 20 69 64 3d 22 6d 25 64 28 72 69 64 29 22 nt id="m%d(rid)"
1390: 20 73 69 7a 65 3d 22 2b 31 22 20 63 6f 6c 6f 72 size="+1" color
13a0: 3d 22 77 68 69 74 65 22 3e 2a 3c 2f 66 6f 6e 74 ="white">*</font
13b0: 3e 3c 2f 74 64 3e 0a 20 20 20 20 69 66 28 20 7a ></td>. if( z
13c0: 42 67 43 6c 72 20 26 26 20 7a 42 67 43 6c 72 5b BgClr && zBgClr[
13d0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 74 0] ){. @ <t
13e0: 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 20 61 d valign="top" a
13f0: 6c 69 67 6e 3d 22 6c 65 66 74 22 20 62 67 63 6f lign="left" bgco
1400: 6c 6f 72 3d 22 25 68 28 7a 42 67 43 6c 72 29 22 lor="%h(zBgClr)"
1410: 3e 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 >. }else{.
1420: 20 20 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d @ <td valign=
1430: 22 74 6f 70 22 20 61 6c 69 67 6e 3d 22 6c 65 66 "top" align="lef
1440: 74 22 3e 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 t">. }. if
1450: 28 20 7a 54 79 70 65 5b 30 5d 3d 3d 27 63 27 20 ( zType[0]=='c'
1460: 29 7b 0a 20 20 20 20 20 20 68 79 70 65 72 6c 69 ){. hyperli
1470: 6e 6b 5f 74 6f 5f 75 75 69 64 5f 77 69 74 68 5f nk_to_uuid_with_
1480: 6d 6f 75 73 65 6f 76 65 72 28 7a 55 75 69 64 2c mouseover(zUuid,
1490: 20 22 78 69 6e 22 2c 20 22 78 6f 75 74 22 2c 20 "xin", "xout",
14a0: 72 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 rid);. if(
14b0: 6e 50 61 72 65 6e 74 3e 31 20 29 7b 0a 20 20 20 nParent>1 ){.
14c0: 20 20 20 20 20 40 20 3c 62 3e 4d 65 72 67 65 3c @ <b>Merge<
14d0: 2f 62 3e 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 /b> . }.
14e0: 20 20 20 69 66 28 20 6e 50 43 68 69 6c 64 3e 31 if( nPChild>1
14f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){. if(
1500: 63 6f 75 6e 74 5f 6e 6f 6e 62 72 61 6e 63 68 5f count_nonbranch_
1510: 63 68 69 6c 64 72 65 6e 28 72 69 64 29 3e 31 20 children(rid)>1
1520: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 40 20 3c ){. @ <
1530: 62 3e 46 6f 72 6b 3c 2f 62 3e 0a 20 20 20 20 20 b>Fork</b>.
1540: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
1550: 20 20 20 20 40 20 3c 62 3e 42 72 61 6e 63 68 3c @ <b>Branch<
1560: 2f 62 3e 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 /b>. }.
1570: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 }. if(
1580: 69 73 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 isLeaf ){.
1590: 20 20 40 20 3c 62 3e 4c 65 61 66 3c 2f 62 3e 0a @ <b>Leaf</b>.
15a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 }. }els
15b0: 65 20 69 66 28 20 28 74 6d 46 6c 61 67 73 20 26 e if( (tmFlags &
15c0: 20 54 49 4d 45 4c 49 4e 45 5f 41 52 54 49 44 29 TIMELINE_ARTID)
15d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 68 79 70 !=0 ){. hyp
15e0: 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 28 7a erlink_to_uuid(z
15f0: 55 75 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 Uuid);. }.
1600: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 db_column_blob(
1610: 70 51 75 65 72 79 2c 20 33 2c 20 26 63 6f 6d 6d pQuery, 3, &comm
1620: 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 6d 78 ent);. if( mx
1630: 57 69 6b 69 4c 65 6e 3e 30 20 26 26 20 62 6c 6f WikiLen>0 && blo
1640: 62 5f 73 69 7a 65 28 26 63 6f 6d 6d 65 6e 74 29 b_size(&comment)
1650: 3e 6d 78 57 69 6b 69 4c 65 6e 20 29 7b 0a 20 20 >mxWikiLen ){.
1660: 20 20 20 20 42 6c 6f 62 20 74 72 75 6e 63 61 74 Blob truncat
1670: 65 64 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 7a ed;. blob_z
1680: 65 72 6f 28 26 74 72 75 6e 63 61 74 65 64 29 3b ero(&truncated);
1690: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 . blob_appe
16a0: 6e 64 28 26 74 72 75 6e 63 61 74 65 64 2c 20 62 nd(&truncated, b
16b0: 6c 6f 62 5f 62 75 66 66 65 72 28 26 63 6f 6d 6d lob_buffer(&comm
16c0: 65 6e 74 29 2c 20 6d 78 57 69 6b 69 4c 65 6e 29 ent), mxWikiLen)
16d0: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 ;. blob_app
16e0: 65 6e 64 28 26 74 72 75 6e 63 61 74 65 64 2c 20 end(&truncated,
16f0: 22 2e 2e 2e 22 2c 20 33 29 3b 0a 20 20 20 20 20 "...", 3);.
1700: 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28 26 74 wiki_convert(&t
1710: 72 75 6e 63 61 74 65 64 2c 20 30 2c 20 77 69 6b runcated, 0, wik
1720: 69 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 62 iFlags);. b
1730: 6c 6f 62 5f 72 65 73 65 74 28 26 74 72 75 6e 63 lob_reset(&trunc
1740: 61 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 ated);. }else
1750: 7b 0a 20 20 20 20 20 20 77 69 6b 69 5f 63 6f 6e {. wiki_con
1760: 76 65 72 74 28 26 63 6f 6d 6d 65 6e 74 2c 20 30 vert(&comment, 0
1770: 2c 20 77 69 6b 69 46 6c 61 67 73 29 3b 0a 20 20 , wikiFlags);.
1780: 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 }. blob_res
1790: 65 74 28 26 63 6f 6d 6d 65 6e 74 29 3b 0a 20 20 et(&comment);.
17a0: 20 20 69 66 28 20 7a 54 61 67 4c 69 73 74 20 26 if( zTagList &
17b0: 26 20 7a 54 61 67 4c 69 73 74 5b 30 5d 20 29 7b & zTagList[0] ){
17c0: 0a 20 20 20 20 20 20 40 20 28 75 73 65 72 3a 20 . @ (user:
17d0: 25 68 28 7a 55 73 65 72 29 2c 20 74 61 67 73 3a %h(zUser), tags:
17e0: 20 25 68 28 7a 54 61 67 4c 69 73 74 29 29 3c 2f %h(zTagList))</
17f0: 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 7d 65 6c td></tr>. }el
1800: 73 65 7b 0a 20 20 20 20 20 20 40 20 28 75 73 65 se{. @ (use
1810: 72 3a 20 25 68 28 7a 55 73 65 72 29 29 3c 2f 74 r: %h(zUser))</t
1820: 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 7d 0a 20 20 d></tr>. }.
1830: 7d 0a 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 7d }. @ </table>.}
1840: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 ../*.** Create a
1850: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 temporary table
1860: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 73 74 suitable for st
1870: 6f 72 69 6e 67 20 74 69 6d 65 6c 69 6e 65 20 64 oring timeline d
1880: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 ata..*/.static v
1890: 6f 69 64 20 74 69 6d 65 6c 69 6e 65 5f 74 65 6d oid timeline_tem
18a0: 70 5f 74 61 62 6c 65 28 76 6f 69 64 29 7b 0a 20 p_table(void){.
18b0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 static const ch
18c0: 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 0a 20 20 20 ar zSql[] = .
18d0: 20 40 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 @ CREATE TEMP T
18e0: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 ABLE IF NOT EXIS
18f0: 54 53 20 74 69 6d 65 6c 69 6e 65 28 0a 20 20 20 TS timeline(.
1900: 20 40 20 20 20 72 69 64 20 49 4e 54 45 47 45 52 @ rid INTEGER
1910: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 PRIMARY KEY,.
1920: 20 20 40 20 20 20 75 75 69 64 20 54 45 58 54 2c @ uuid TEXT,
1930: 0a 20 20 20 20 40 20 20 20 74 69 6d 65 73 74 61 . @ timesta
1940: 6d 70 20 54 45 58 54 2c 0a 20 20 20 20 40 20 20 mp TEXT,. @
1950: 20 63 6f 6d 6d 65 6e 74 20 54 45 58 54 2c 0a 20 comment TEXT,.
1960: 20 20 20 40 20 20 20 75 73 65 72 20 54 45 58 54 @ user TEXT
1970: 2c 0a 20 20 20 20 40 20 20 20 6e 63 68 69 6c 64 ,. @ nchild
1980: 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 40 20 INTEGER,. @
1990: 20 20 6e 70 61 72 65 6e 74 20 49 4e 54 45 47 45 nparent INTEGE
19a0: 52 2c 0a 20 20 20 20 40 20 20 20 69 73 6c 65 61 R,. @ islea
19b0: 66 20 42 4f 4f 4c 45 41 4e 2c 0a 20 20 20 20 40 f BOOLEAN,. @
19c0: 20 20 20 62 67 63 6f 6c 6f 72 20 54 45 58 54 2c bgcolor TEXT,
19d0: 0a 20 20 20 20 40 20 20 20 65 74 79 70 65 20 54 . @ etype T
19e0: 45 58 54 2c 0a 20 20 20 20 40 20 20 20 74 61 67 EXT,. @ tag
19f0: 6c 69 73 74 20 54 45 58 54 0a 20 20 20 20 40 20 list TEXT. @
1a00: 29 0a 20 20 3b 0a 20 20 64 62 5f 6d 75 6c 74 69 ). ;. db_multi
1a10: 5f 65 78 65 63 28 7a 53 71 6c 29 3b 0a 7d 0a 0a _exec(zSql);.}..
1a20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 /*.** Return a p
1a30: 6f 69 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 ointer to a cons
1a40: 74 61 6e 74 20 73 74 72 69 6e 67 20 74 68 61 74 tant string that
1a50: 20 66 6f 72 6d 73 20 74 68 65 20 62 61 73 69 73 forms the basis
1a60: 0a 2a 2a 20 66 6f 72 20 61 20 74 69 6d 65 6c 69 .** for a timeli
1a70: 6e 65 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 ne query for the
1a80: 20 57 57 57 20 69 6e 74 65 72 66 61 63 65 2e 0a WWW interface..
1a90: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 */.const char *t
1aa0: 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f imeline_query_fo
1ab0: 72 5f 77 77 77 28 76 6f 69 64 29 7b 0a 20 20 73 r_www(void){. s
1ac0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
1ad0: 20 7a 42 61 73 65 53 71 6c 5b 5d 20 3d 0a 20 20 zBaseSql[] =.
1ae0: 20 20 40 20 53 45 4c 45 43 54 0a 20 20 20 20 40 @ SELECT. @
1af0: 20 20 20 62 6c 6f 62 2e 72 69 64 2c 0a 20 20 20 blob.rid,.
1b00: 20 40 20 20 20 75 75 69 64 2c 0a 20 20 20 20 40 @ uuid,. @
1b10: 20 20 20 64 61 74 65 74 69 6d 65 28 65 76 65 6e datetime(even
1b20: 74 2e 6d 74 69 6d 65 2c 27 6c 6f 63 61 6c 74 69 t.mtime,'localti
1b30: 6d 65 27 29 20 41 53 20 74 69 6d 65 73 74 61 6d me') AS timestam
1b40: 70 2c 0a 20 20 20 20 40 20 20 20 63 6f 61 6c 65 p,. @ coale
1b50: 73 63 65 28 65 63 6f 6d 6d 65 6e 74 2c 20 63 6f sce(ecomment, co
1b60: 6d 6d 65 6e 74 29 2c 0a 20 20 20 20 40 20 20 20 mment),. @
1b70: 63 6f 61 6c 65 73 63 65 28 65 75 73 65 72 2c 20 coalesce(euser,
1b80: 75 73 65 72 29 2c 0a 20 20 20 20 40 20 20 20 28 user),. @ (
1b90: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 SELECT count(*)
1ba0: 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 FROM plink WHERE
1bb0: 20 70 69 64 3d 62 6c 6f 62 2e 72 69 64 20 41 4e pid=blob.rid AN
1bc0: 44 20 69 73 70 72 69 6d 3d 31 29 2c 0a 20 20 20 D isprim=1),.
1bd0: 20 40 20 20 20 28 53 45 4c 45 43 54 20 63 6f 75 @ (SELECT cou
1be0: 6e 74 28 2a 29 20 46 52 4f 4d 20 70 6c 69 6e 6b nt(*) FROM plink
1bf0: 20 57 48 45 52 45 20 63 69 64 3d 62 6c 6f 62 2e WHERE cid=blob.
1c00: 72 69 64 29 2c 0a 20 20 20 20 40 20 20 20 30 3d rid),. @ 0=
1c10: 3d 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a =(SELECT count(*
1c20: 29 20 46 52 4f 4d 20 70 6c 69 6e 6b 0a 20 20 20 ) FROM plink.
1c30: 20 40 20 20 20 20 20 57 48 45 52 45 20 70 69 64 @ WHERE pid
1c40: 3d 62 6c 6f 62 2e 72 69 64 20 41 4e 44 20 4e 4f =blob.rid AND NO
1c50: 54 20 45 58 49 53 54 53 28 0a 20 20 20 20 40 20 T EXISTS(. @
1c60: 20 20 20 20 20 20 53 45 4c 45 43 54 20 31 20 46 SELECT 1 F
1c70: 52 4f 4d 20 74 61 67 78 72 65 66 0a 20 20 20 20 ROM tagxref.
1c80: 40 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74 @ WHERE t
1c90: 61 67 69 64 3d 28 53 45 4c 45 43 54 20 74 61 67 agid=(SELECT tag
1ca0: 69 64 20 46 52 4f 4d 20 74 61 67 20 57 48 45 52 id FROM tag WHER
1cb0: 45 20 74 61 67 6e 61 6d 65 3d 27 6e 65 77 62 72 E tagname='newbr
1cc0: 61 6e 63 68 27 29 0a 20 20 20 20 40 20 20 20 20 anch'). @
1cd0: 20 20 20 20 20 20 41 4e 44 20 72 69 64 3d 70 6c AND rid=pl
1ce0: 69 6e 6b 2e 63 69 64 20 41 4e 44 20 74 61 67 74 ink.cid AND tagt
1cf0: 79 70 65 3e 30 29 29 2c 0a 20 20 20 20 40 20 20 ype>0)),. @
1d00: 20 62 67 63 6f 6c 6f 72 2c 0a 20 20 20 20 40 20 bgcolor,. @
1d10: 20 20 65 76 65 6e 74 2e 74 79 70 65 2c 0a 20 20 event.type,.
1d20: 20 20 40 20 20 20 28 53 45 4c 45 43 54 20 67 72 @ (SELECT gr
1d30: 6f 75 70 5f 63 6f 6e 63 61 74 28 73 75 62 73 74 oup_concat(subst
1d40: 72 28 74 61 67 6e 61 6d 65 2c 35 29 2c 20 27 2c r(tagname,5), ',
1d50: 20 27 29 20 46 52 4f 4d 20 74 61 67 2c 20 74 61 ') FROM tag, ta
1d60: 67 78 72 65 66 0a 20 20 20 20 40 20 20 20 20 20 gxref. @
1d70: 57 48 45 52 45 20 74 61 67 6e 61 6d 65 20 47 4c WHERE tagname GL
1d80: 4f 42 20 27 73 79 6d 2d 2a 27 20 41 4e 44 20 74 OB 'sym-*' AND t
1d90: 61 67 2e 74 61 67 69 64 3d 74 61 67 78 72 65 66 ag.tagid=tagxref
1da0: 2e 74 61 67 69 64 0a 20 20 20 20 40 20 20 20 20 .tagid. @
1db0: 20 20 20 41 4e 44 20 74 61 67 78 72 65 66 2e 72 AND tagxref.r
1dc0: 69 64 3d 62 6c 6f 62 2e 72 69 64 20 41 4e 44 20 id=blob.rid AND
1dd0: 74 61 67 78 72 65 66 2e 74 61 67 74 79 70 65 3e tagxref.tagtype>
1de0: 30 29 0a 20 20 20 20 40 20 20 46 52 4f 4d 20 65 0). @ FROM e
1df0: 76 65 6e 74 20 4a 4f 49 4e 20 62 6c 6f 62 20 0a vent JOIN blob .
1e00: 20 20 20 20 40 20 57 48 45 52 45 20 62 6c 6f 62 @ WHERE blob
1e10: 2e 72 69 64 3d 65 76 65 6e 74 2e 6f 62 6a 69 64 .rid=event.objid
1e20: 0a 20 20 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 . ;. return zB
1e30: 61 73 65 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a aseSql;.}../*.**
1e40: 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 6d Generate a subm
1e50: 65 6e 75 20 65 6c 65 6d 65 6e 74 20 77 69 74 68 enu element with
1e60: 20 61 20 73 69 6e 67 6c 65 20 70 61 72 61 6d 65 a single parame
1e70: 74 65 72 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 73 ter change..*/.s
1e80: 74 61 74 69 63 20 76 6f 69 64 20 74 69 6d 65 6c tatic void timel
1e90: 69 6e 65 5f 73 75 62 6d 65 6e 75 28 0a 20 20 48 ine_submenu(. H
1ea0: 51 75 65 72 79 20 2a 70 55 72 6c 2c 20 20 20 20 Query *pUrl,
1eb0: 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 /* Base
1ec0: 55 52 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 URL */. const c
1ed0: 68 61 72 20 2a 7a 4d 65 6e 75 4e 61 6d 65 2c 20 har *zMenuName,
1ee0: 20 20 2f 2a 20 53 75 62 6d 65 6e 75 20 6e 61 6d /* Submenu nam
1ef0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 e */. const cha
1f00: 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 r *zParam,
1f10: 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 76 61 6c /* Parameter val
1f20: 75 65 20 74 6f 20 61 64 64 20 6f 72 20 63 68 61 ue to add or cha
1f30: 6e 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 nge */. const c
1f40: 68 61 72 20 2a 7a 56 61 6c 75 65 2c 20 20 20 20 har *zValue,
1f50: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 /* Value of th
1f60: 65 20 6e 65 77 20 70 61 72 61 6d 65 74 65 72 20 e new parameter
1f70: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
1f80: 2a 7a 52 65 6d 6f 76 65 20 20 20 20 20 20 2f 2a *zRemove /*
1f90: 20 50 61 72 61 6d 65 74 65 72 20 74 6f 20 6f 6d Parameter to om
1fa0: 69 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 79 6c 65 it */.){. style
1fb0: 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 _submenu_element
1fc0: 28 7a 4d 65 6e 75 4e 61 6d 65 2c 20 7a 4d 65 6e (zMenuName, zMen
1fd0: 75 4e 61 6d 65 2c 20 22 25 73 22 2c 0a 20 20 20 uName, "%s",.
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ff0: 20 20 20 20 20 75 72 6c 5f 72 65 6e 64 65 72 28 url_render(
2000: 70 55 72 6c 2c 20 7a 50 61 72 61 6d 2c 20 7a 56 pUrl, zParam, zV
2010: 61 6c 75 65 2c 20 7a 52 65 6d 6f 76 65 2c 20 30 alue, zRemove, 0
2020: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 ));.}../*.** WEB
2030: 50 41 47 45 3a 20 74 69 6d 65 6c 69 6e 65 0a 2a PAGE: timeline.*
2040: 2a 0a 2a 2a 20 51 75 65 72 79 20 70 61 72 61 6d *.** Query param
2050: 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 eters:.**.**
2060: 61 3d 54 49 4d 45 53 54 41 4d 50 20 20 20 20 61 a=TIMESTAMP a
2070: 66 74 65 72 20 74 68 69 73 20 64 61 74 65 0a 2a fter this date.*
2080: 2a 20 20 20 20 62 3d 54 49 4d 45 53 54 41 4d 50 * b=TIMESTAMP
2090: 20 20 20 20 62 65 66 6f 72 65 20 74 68 69 73 20 before this
20a0: 64 61 74 65 2e 0a 2a 2a 20 20 20 20 6e 3d 43 4f date..** n=CO
20b0: 55 4e 54 20 20 20 20 20 20 20 20 6e 75 6d 62 65 UNT numbe
20c0: 72 20 6f 66 20 65 76 65 6e 74 73 20 69 6e 20 6f r of events in o
20d0: 75 74 70 75 74 0a 2a 2a 20 20 20 20 70 3d 52 49 utput.** p=RI
20e0: 44 20 20 20 20 20 20 20 20 20 20 61 72 74 69 66 D artif
20f0: 61 63 74 20 52 49 44 20 61 6e 64 20 75 70 20 74 act RID and up t
2100: 6f 20 43 4f 55 4e 54 20 70 61 72 65 6e 74 73 20 o COUNT parents
2110: 61 6e 64 20 61 6e 63 65 73 74 6f 72 73 0a 2a 2a and ancestors.**
2120: 20 20 20 20 64 3d 52 49 44 20 20 20 20 20 20 20 d=RID
2130: 20 20 20 61 72 74 69 66 61 63 74 20 52 49 44 20 artifact RID
2140: 61 6e 64 20 75 70 20 74 6f 20 43 4f 55 4e 54 20 and up to COUNT
2150: 64 65 73 63 65 6e 64 61 6e 74 73 0a 2a 2a 20 20 descendants.**
2160: 20 20 74 3d 54 41 47 49 44 20 20 20 20 20 20 20 t=TAGID
2170: 20 73 68 6f 77 20 6f 6e 6c 79 20 63 68 65 63 6b show only check
2180: 2d 69 6e 73 20 77 69 74 68 20 74 68 65 20 67 69 -ins with the gi
2190: 76 65 6e 20 74 61 67 69 64 0a 2a 2a 20 20 20 20 ven tagid.**
21a0: 75 3d 55 53 45 52 20 20 20 20 20 20 20 20 20 6f u=USER o
21b0: 6e 6c 79 20 69 66 20 62 65 6c 6f 6e 67 69 6e 67 nly if belonging
21c0: 20 74 6f 20 74 68 69 73 20 75 73 65 72 0a 2a 2a to this user.**
21d0: 20 20 20 20 79 3d 54 59 50 45 20 20 20 20 20 20 y=TYPE
21e0: 20 20 20 27 63 69 27 2c 20 27 77 27 2c 20 27 74 'ci', 'w', 't
21f0: 27 0a 2a 2a 0a 2a 2a 20 70 3d 20 61 6e 64 20 64 '.**.** p= and d
2200: 3d 20 63 61 6e 20 61 70 70 65 61 72 20 69 6e 64 = can appear ind
2210: 69 76 69 64 75 61 6c 6c 79 20 6f 72 20 74 6f 67 ividually or tog
2220: 65 74 68 65 72 2e 20 20 49 66 20 65 69 74 68 65 ether. If eithe
2230: 72 20 70 3d 20 6f 72 20 64 3d 0a 2a 2a 20 61 70 r p= or d=.** ap
2240: 70 65 61 72 2c 20 74 68 65 6e 20 75 3d 2c 20 79 pear, then u=, y
2250: 3d 2c 20 61 3d 2c 20 61 6e 64 20 62 3d 20 61 72 =, a=, and b= ar
2260: 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a e ignored..**.**
2270: 20 49 66 20 61 3d 20 61 6e 64 20 62 3d 20 61 70 If a= and b= ap
2280: 70 65 61 72 2c 20 6f 6e 6c 79 20 61 3d 20 69 73 pear, only a= is
2290: 20 75 73 65 64 2e 20 20 49 66 20 6e 65 69 74 68 used. If neith
22a0: 65 72 20 61 70 70 65 61 72 2c 20 74 68 65 20 6d er appear, the m
22b0: 6f 73 74 0a 2a 2a 20 72 65 63 65 6e 74 20 65 76 ost.** recent ev
22c0: 65 6e 74 73 20 61 72 65 20 63 68 6f 6f 73 65 6e ents are choosen
22d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 20 69 73 ..**.** If n= is
22e0: 20 6d 69 73 73 69 6e 67 2c 20 74 68 65 20 64 65 missing, the de
22f0: 66 61 75 6c 74 20 63 6f 75 6e 74 20 69 73 20 32 fault count is 2
2300: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 65 5f 0..*/.void page_
2310: 74 69 6d 65 6c 69 6e 65 28 76 6f 69 64 29 7b 0a timeline(void){.
2320: 20 20 53 74 6d 74 20 71 3b 20 20 20 20 20 20 20 Stmt q;
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2340: 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73 /* Query us
2350: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 ed to generate t
2360: 68 65 20 74 69 6d 65 6c 69 6e 65 20 2a 2f 0a 20 he timeline */.
2370: 20 42 6c 6f 62 20 73 71 6c 3b 20 20 20 20 20 20 Blob sql;
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2390: 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 53 /* text of S
23a0: 51 4c 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 QL used to gener
23b0: 61 74 65 20 74 69 6d 65 6c 69 6e 65 20 2a 2f 0a ate timeline */.
23c0: 20 20 42 6c 6f 62 20 64 65 73 63 3b 20 20 20 20 Blob desc;
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23e0: 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 /* Descript
23f0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 69 6d 65 6c ion of the timel
2400: 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6e ine */. int nEn
2410: 74 72 79 20 3d 20 61 74 6f 69 28 50 44 28 22 6e try = atoi(PD("n
2420: 22 2c 22 32 30 22 29 29 3b 20 20 20 2f 2a 20 4d ","20")); /* M
2430: 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 ax number of ent
2440: 72 69 65 73 20 6f 6e 20 74 69 6d 65 6c 69 6e 65 ries on timeline
2450: 20 2a 2f 0a 20 20 69 6e 74 20 70 5f 72 69 64 20 */. int p_rid
2460: 3d 20 61 74 6f 69 28 50 44 28 22 70 22 2c 22 30 = atoi(PD("p","0
2470: 22 29 29 3b 20 20 20 20 20 2f 2a 20 61 72 74 69 ")); /* arti
2480: 66 61 63 74 20 70 20 61 6e 64 20 69 74 73 20 70 fact p and its p
2490: 61 72 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 arents */. int
24a0: 64 5f 72 69 64 20 3d 20 61 74 6f 69 28 50 44 28 d_rid = atoi(PD(
24b0: 22 64 22 2c 22 30 22 29 29 3b 20 20 20 20 20 2f "d","0")); /
24c0: 2a 20 61 72 74 69 66 61 63 74 20 64 20 61 6e 64 * artifact d and
24d0: 20 69 74 73 20 64 65 73 63 65 6e 64 61 6e 74 73 its descendants
24e0: 20 2a 2f 0a 20 20 69 6e 74 20 74 61 67 69 64 20 */. int tagid
24f0: 3d 20 61 74 6f 69 28 50 44 28 22 74 22 2c 22 30 = atoi(PD("t","0
2500: 22 29 29 3b 20 20 20 20 20 2f 2a 20 53 68 6f 77 ")); /* Show
2510: 20 63 68 65 63 6b 69 6e 73 20 6f 66 20 61 20 67 checkins of a g
2520: 69 76 65 6e 20 74 61 67 20 2a 2f 0a 20 20 63 6f iven tag */. co
2530: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 20 nst char *zUser
2540: 3d 20 50 28 22 75 22 29 3b 20 20 20 20 20 20 20 = P("u");
2550: 20 2f 2a 20 41 6c 6c 20 65 6e 74 72 69 65 73 20 /* All entries
2560: 62 79 20 74 68 69 73 20 75 73 65 72 20 69 66 20 by this user if
2570: 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f not NULL */. co
2580: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 nst char *zType
2590: 3d 20 50 44 28 22 79 22 2c 22 61 6c 6c 22 29 3b = PD("y","all");
25a0: 20 2f 2a 20 54 79 70 65 20 6f 66 20 65 76 65 6e /* Type of even
25b0: 74 73 2e 20 20 41 6c 6c 20 69 66 20 4e 55 4c 4c ts. All if NULL
25c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
25d0: 20 2a 7a 41 66 74 65 72 20 3d 20 50 28 22 61 22 *zAfter = P("a"
25e0: 29 3b 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e ); /* Even
25f0: 74 73 20 61 66 74 65 72 20 74 68 69 73 20 74 69 ts after this ti
2600: 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 me */. const ch
2610: 61 72 20 2a 7a 42 65 66 6f 72 65 20 3d 20 50 28 ar *zBefore = P(
2620: 22 62 22 29 3b 20 20 20 20 20 20 2f 2a 20 45 76 "b"); /* Ev
2630: 65 6e 74 73 20 62 65 66 6f 72 65 20 74 68 69 73 ents before this
2640: 20 74 69 6d 65 20 2a 2f 0a 20 20 48 51 75 65 72 time */. HQuer
2650: 79 20 75 72 6c 3b 20 20 20 20 20 20 20 20 20 20 y url;
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
2670: 20 55 52 4c 20 66 6f 72 20 76 61 72 69 6f 75 73 URL for various
2680: 20 62 72 61 6e 63 68 20 6c 69 6e 6b 73 20 2a 2f branch links */
2690: 0a 0a 20 20 2f 2a 20 54 6f 20 76 69 65 77 20 74 .. /* To view t
26a0: 68 65 20 74 69 6d 65 6c 69 6e 65 2c 20 6d 75 73 he timeline, mus
26b0: 74 20 68 61 76 65 20 70 65 72 6d 69 73 73 69 6f t have permissio
26c0: 6e 20 74 6f 20 72 65 61 64 20 70 72 6f 6a 65 63 n to read projec
26d0: 74 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 6c t data.. */. l
26e0: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 ogin_check_crede
26f0: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 ntials();. if(
2700: 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c 6f 67 !g.okRead ){ log
2710: 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74 in_needed(); ret
2720: 75 72 6e 3b 20 7d 0a 0a 20 20 73 74 79 6c 65 5f urn; }.. style_
2730: 68 65 61 64 65 72 28 22 54 69 6d 65 6c 69 6e 65 header("Timeline
2740: 22 29 3b 0a 20 20 6c 6f 67 69 6e 5f 61 6e 6f 6e ");. login_anon
2750: 79 6d 6f 75 73 5f 61 76 61 69 6c 61 62 6c 65 28 ymous_available(
2760: 29 3b 0a 20 20 74 69 6d 65 6c 69 6e 65 5f 74 65 );. timeline_te
2770: 6d 70 5f 74 61 62 6c 65 28 29 3b 0a 20 20 62 6c mp_table();. bl
2780: 6f 62 5f 7a 65 72 6f 28 26 73 71 6c 29 3b 0a 20 ob_zero(&sql);.
2790: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 64 65 73 63 blob_zero(&desc
27a0: 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 );. blob_append
27b0: 28 26 73 71 6c 2c 20 22 49 4e 53 45 52 54 20 4f (&sql, "INSERT O
27c0: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 69 R IGNORE INTO ti
27d0: 6d 65 6c 69 6e 65 20 22 2c 20 2d 31 29 3b 0a 20 meline ", -1);.
27e0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 73 71 blob_append(&sq
27f0: 6c 2c 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72 l, timeline_quer
2800: 79 5f 66 6f 72 5f 77 77 77 28 29 2c 20 2d 31 29 y_for_www(), -1)
2810: 3b 0a 20 20 69 66 28 20 70 5f 72 69 64 20 7c 7c ;. if( p_rid ||
2820: 20 64 5f 72 69 64 20 29 7b 0a 20 20 20 20 2f 2a d_rid ){. /*
2830: 20 49 66 20 70 3d 20 6f 72 20 64 3d 20 69 73 20 If p= or d= is
2840: 70 72 65 73 65 6e 74 2c 20 69 67 6e 6f 72 65 20 present, ignore
2850: 61 6c 6c 20 6f 74 68 65 72 20 70 61 72 61 6d 65 all other parame
2860: 74 65 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20 ters other than
2870: 6e 3d 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a n= */. char *
2880: 7a 55 75 69 64 3b 0a 20 20 20 20 69 6e 74 20 6e zUuid;. int n
2890: 70 2c 20 6e 64 3b 0a 0a 20 20 20 20 69 66 28 20 p, nd;.. if(
28a0: 70 5f 72 69 64 20 26 26 20 64 5f 72 69 64 20 26 p_rid && d_rid &
28b0: 26 20 70 5f 72 69 64 21 3d 64 5f 72 69 64 20 29 & p_rid!=d_rid )
28c0: 20 70 5f 72 69 64 20 3d 20 64 5f 72 69 64 3b 0a p_rid = d_rid;.
28d0: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 db_multi_exe
28e0: 63 28 0a 20 20 20 20 20 20 20 22 43 52 45 41 54 c(. "CREAT
28f0: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 49 46 20 E TEMP TABLE IF
2900: 4e 4f 54 20 45 58 49 53 54 53 20 6f 6b 28 72 69 NOT EXISTS ok(ri
2910: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR
2920: 59 20 4b 45 59 29 22 0a 20 20 20 20 29 3b 0a 20 Y KEY)". );.
2930: 20 20 20 7a 55 75 69 64 20 3d 20 64 62 5f 74 65 zUuid = db_te
2940: 78 74 28 22 22 2c 20 22 53 45 4c 45 43 54 20 75 xt("", "SELECT u
2950: 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 uid FROM blob WH
2960: 45 52 45 20 72 69 64 3d 25 64 22 2c 0a 20 20 20 ERE rid=%d",.
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2980: 20 20 20 20 20 20 70 5f 72 69 64 20 3f 20 70 5f p_rid ? p_
2990: 72 69 64 20 3a 20 64 5f 72 69 64 29 3b 0a 20 20 rid : d_rid);.
29a0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 blob_appendf(&
29b0: 73 71 6c 2c 20 22 20 41 4e 44 20 65 76 65 6e 74 sql, " AND event
29c0: 2e 6f 62 6a 69 64 20 49 4e 20 6f 6b 22 29 3b 0a .objid IN ok");.
29d0: 20 20 20 20 6e 64 20 3d 20 30 3b 0a 20 20 20 20 nd = 0;.
29e0: 69 66 28 20 64 5f 72 69 64 20 29 7b 0a 20 20 20 if( d_rid ){.
29f0: 20 20 20 63 6f 6d 70 75 74 65 5f 64 65 73 63 65 compute_desce
2a00: 6e 64 61 6e 74 73 28 64 5f 72 69 64 2c 20 6e 45 ndants(d_rid, nE
2a10: 6e 74 72 79 29 3b 0a 20 20 20 20 20 20 6e 64 20 ntry);. nd
2a20: 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c = db_int(0, "SEL
2a30: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2d 31 20 46 ECT count(*)-1 F
2a40: 52 4f 4d 20 6f 6b 22 29 3b 0a 20 20 20 20 20 20 ROM ok");.
2a50: 69 66 28 20 6e 64 3e 30 20 29 7b 0a 20 20 20 20 if( nd>0 ){.
2a60: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 db_multi_exe
2a70: 63 28 22 25 73 22 2c 20 62 6c 6f 62 5f 73 74 72 c("%s", blob_str
2a80: 28 26 73 71 6c 29 29 3b 0a 20 20 20 20 20 20 20 (&sql));.
2a90: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 64 blob_appendf(&d
2aa0: 65 73 63 2c 20 22 25 64 20 64 65 73 63 65 6e 64 esc, "%d descend
2ab0: 61 6e 74 73 22 2c 20 6e 64 29 3b 0a 20 20 20 20 ants", nd);.
2ac0: 20 20 7d 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c }. db_mul
2ad0: 74 69 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 ti_exec("DELETE
2ae0: 46 52 4f 4d 20 6f 6b 22 29 3b 0a 20 20 20 20 7d FROM ok");. }
2af0: 0a 20 20 20 20 69 66 28 20 70 5f 72 69 64 20 29 . if( p_rid )
2b00: 7b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 5f {. compute_
2b10: 61 6e 63 65 73 74 6f 72 73 28 70 5f 72 69 64 2c ancestors(p_rid,
2b20: 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20 20 20 nEntry);.
2b30: 6e 70 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 np = db_int(0, "
2b40: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2d SELECT count(*)-
2b50: 31 20 46 52 4f 4d 20 6f 6b 22 29 3b 0a 20 20 20 1 FROM ok");.
2b60: 20 20 20 69 66 28 20 6e 70 3e 30 20 29 7b 0a 20 if( np>0 ){.
2b70: 20 20 20 20 20 20 20 69 66 28 20 6e 64 3e 30 20 if( nd>0
2b80: 29 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 ) blob_appendf(&
2b90: 64 65 73 63 2c 20 22 20 61 6e 64 20 22 29 3b 0a desc, " and ");.
2ba0: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 blob_app
2bb0: 65 6e 64 66 28 26 64 65 73 63 2c 20 22 25 64 20 endf(&desc, "%d
2bc0: 61 6e 63 65 73 74 6f 72 73 22 2c 20 6e 70 29 3b ancestors", np);
2bd0: 0a 20 20 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 . db_mult
2be0: 69 5f 65 78 65 63 28 22 25 73 22 2c 20 62 6c 6f i_exec("%s", blo
2bf0: 62 5f 73 74 72 28 26 73 71 6c 29 29 3b 0a 20 20 b_str(&sql));.
2c00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 }. }.
2c10: 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20 if( g.okHistory
2c20: 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 ){. blob_ap
2c30: 70 65 6e 64 66 28 26 64 65 73 63 2c 20 22 20 6f pendf(&desc, " o
2c40: 66 20 3c 61 20 68 72 65 66 3d 27 25 73 2f 69 6e f <a href='%s/in
2c50: 66 6f 2f 25 73 27 3e 5b 25 2e 31 30 73 5d 3c 2f fo/%s'>[%.10s]</
2c60: 61 3e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 a>",.
2c70: 20 20 20 20 20 20 20 20 67 2e 7a 42 61 73 65 55 g.zBaseU
2c80: 52 4c 2c 20 7a 55 75 69 64 2c 20 7a 55 75 69 64 RL, zUuid, zUuid
2c90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 );. }else{.
2ca0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 blob_appendf
2cb0: 28 26 64 65 73 63 2c 20 22 20 6f 66 20 5b 25 2e (&desc, " of [%.
2cc0: 31 30 73 5d 22 2c 20 7a 55 75 69 64 29 3b 0a 20 10s]", zUuid);.
2cd0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 }. }else if(
2ce0: 20 74 61 67 69 64 3e 30 20 29 7b 0a 20 20 20 20 tagid>0 ){.
2cf0: 2f 2a 20 49 66 20 74 3d 20 69 73 20 70 72 65 73 /* If t= is pres
2d00: 65 6e 74 2c 20 69 67 6e 6f 72 65 20 61 6c 6c 20 ent, ignore all
2d10: 6f 74 68 65 72 20 70 61 72 61 6d 65 74 65 72 73 other parameters
2d20: 2e 20 20 53 68 6f 77 20 65 76 65 72 79 74 68 69 . Show everythi
2d30: 6e 67 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 ng. ** with t
2d40: 68 61 74 20 74 61 67 2e 20 2a 2f 0a 20 20 20 20 hat tag. */.
2d50: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 71 blob_appendf(&sq
2d60: 6c 2c 20 22 20 41 4e 44 20 65 76 65 6e 74 2e 74 l, " AND event.t
2d70: 79 70 65 3d 27 63 69 27 22 29 3b 0a 20 20 20 20 ype='ci'");.
2d80: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 71 blob_appendf(&sq
2d90: 6c 2c 20 22 20 41 4e 44 20 45 58 49 53 54 53 20 l, " AND EXISTS
2da0: 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 74 (SELECT 1 FROM t
2db0: 61 67 78 72 65 66 20 57 48 45 52 45 20 74 61 67 agxref WHERE tag
2dc0: 69 64 3d 25 64 22 0a 20 20 20 20 20 20 20 20 20 id=%d".
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 41 " A
2df0: 4e 44 20 74 61 67 74 79 70 65 3e 30 20 41 4e 44 ND tagtype>0 AND
2e00: 20 72 69 64 3d 62 6c 6f 62 2e 72 69 64 29 22 2c rid=blob.rid)",
2e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2e20: 20 20 74 61 67 69 64 29 3b 0a 20 20 20 20 64 62 tagid);. db
2e30: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 25 73 22 _multi_exec("%s"
2e40: 2c 20 62 6c 6f 62 5f 73 74 72 28 26 73 71 6c 29 , blob_str(&sql)
2e50: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 );. blob_appe
2e60: 6e 64 66 28 26 64 65 73 63 2c 20 22 41 6c 6c 20 ndf(&desc, "All
2e70: 63 68 65 63 6b 2d 69 6e 73 20 74 61 67 67 65 64 check-ins tagged
2e80: 20 77 69 74 68 20 5c 22 25 68 5c 22 22 2c 0a 20 with \"%h\"",.
2e90: 20 20 20 20 20 20 64 62 5f 74 65 78 74 28 22 3f db_text("?
2ea0: 3f 22 2c 20 22 53 45 4c 45 43 54 20 73 75 62 73 ?", "SELECT subs
2eb0: 74 72 28 74 61 67 6e 61 6d 65 2c 35 29 20 46 52 tr(tagname,5) FR
2ec0: 4f 4d 20 74 61 67 20 57 48 45 52 45 20 74 61 67 OM tag WHERE tag
2ed0: 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 20 20 id=%d",.
2ee0: 20 20 20 20 20 20 20 74 61 67 69 64 29 0a 20 20 tagid).
2ef0: 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 );. }else{.
2f00: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63 6f 6e int n;. con
2f10: 73 74 20 63 68 61 72 20 2a 7a 45 54 79 70 65 20 st char *zEType
2f20: 3d 20 22 65 76 65 6e 74 22 3b 0a 20 20 20 20 63 = "event";. c
2f30: 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 20 20 har *zDate;.
2f40: 63 68 61 72 20 2a 7a 4e 45 6e 74 72 79 20 3d 20 char *zNEntry =
2f50: 6d 70 72 69 6e 74 66 28 22 25 64 22 2c 20 6e 45 mprintf("%d", nE
2f60: 6e 74 72 79 29 3b 0a 20 20 20 20 75 72 6c 5f 69 ntry);. url_i
2f70: 6e 69 74 69 61 6c 69 7a 65 28 26 75 72 6c 2c 20 nitialize(&url,
2f80: 22 74 69 6d 65 6c 69 6e 65 22 29 3b 0a 20 20 20 "timeline");.
2f90: 20 75 72 6c 5f 61 64 64 5f 70 61 72 61 6d 65 74 url_add_paramet
2fa0: 65 72 28 26 75 72 6c 2c 20 22 6e 22 2c 20 7a 4e er(&url, "n", zN
2fb0: 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 Entry);. if(
2fc0: 7a 54 79 70 65 5b 30 5d 21 3d 27 61 27 20 29 7b zType[0]!='a' ){
2fd0: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 . blob_appe
2fe0: 6e 64 66 28 26 73 71 6c 2c 20 22 20 41 4e 44 20 ndf(&sql, " AND
2ff0: 65 76 65 6e 74 2e 74 79 70 65 3d 25 51 22 2c 20 event.type=%Q",
3000: 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 75 72 zType);. ur
3010: 6c 5f 61 64 64 5f 70 61 72 61 6d 65 74 65 72 28 l_add_parameter(
3020: 26 75 72 6c 2c 20 22 79 22 2c 20 7a 54 79 70 65 &url, "y", zType
3030: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 79 );. if( zTy
3040: 70 65 5b 30 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 pe[0]=='c' ){.
3050: 20 20 20 20 20 20 7a 45 54 79 70 65 20 3d 20 22 zEType = "
3060: 63 68 65 63 6b 69 6e 22 3b 0a 20 20 20 20 20 20 checkin";.
3070: 7d 65 6c 73 65 20 69 66 28 20 7a 54 79 70 65 5b }else if( zType[
3080: 30 5d 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 20 0]=='w' ){.
3090: 20 20 20 7a 45 54 79 70 65 20 3d 20 22 77 69 6b zEType = "wik
30a0: 69 20 65 64 69 74 22 3b 0a 20 20 20 20 20 20 7d i edit";. }
30b0: 65 6c 73 65 20 69 66 28 20 7a 54 79 70 65 5b 30 else if( zType[0
30c0: 5d 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20 ]=='t' ){.
30d0: 20 20 7a 45 54 79 70 65 20 3d 20 22 74 69 63 6b zEType = "tick
30e0: 65 74 20 63 68 61 6e 67 65 22 3b 0a 20 20 20 20 et change";.
30f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 }. }. if
3100: 28 20 7a 55 73 65 72 20 29 7b 0a 20 20 20 20 20 ( zUser ){.
3110: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 blob_appendf(&s
3120: 71 6c 2c 20 22 20 41 4e 44 20 65 76 65 6e 74 2e ql, " AND event.
3130: 75 73 65 72 3d 25 51 22 2c 20 7a 55 73 65 72 29 user=%Q", zUser)
3140: 3b 0a 20 20 20 20 20 20 75 72 6c 5f 61 64 64 5f ;. url_add_
3150: 70 61 72 61 6d 65 74 65 72 28 26 75 72 6c 2c 20 parameter(&url,
3160: 22 75 22 2c 20 7a 55 73 65 72 29 3b 0a 20 20 20 "u", zUser);.
3170: 20 7d 0a 20 20 20 20 69 66 28 20 7a 41 66 74 65 }. if( zAfte
3180: 72 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 r ){. while
3190: 28 20 69 73 73 70 61 63 65 28 7a 41 66 74 65 72 ( isspace(zAfter
31a0: 5b 30 5d 29 20 29 7b 20 7a 41 66 74 65 72 2b 2b [0]) ){ zAfter++
31b0: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 41 ; }. if( zA
31c0: 66 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 fter[0] ){.
31d0: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 blob_appendf(
31e0: 26 73 71 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 &sql, .
31f0: 20 20 22 20 41 4e 44 20 65 76 65 6e 74 2e 6d 74 " AND event.mt
3200: 69 6d 65 3e 3d 28 53 45 4c 45 43 54 20 6a 75 6c ime>=(SELECT jul
3210: 69 61 6e 64 61 79 28 25 51 2c 20 27 75 74 63 27 ianday(%Q, 'utc'
3220: 29 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 ))". "
3230: 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 2e ORDER BY event.
3240: 6d 74 69 6d 65 20 41 53 43 22 2c 20 7a 41 66 74 mtime ASC", zAft
3250: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 75 72 6c er);. url
3260: 5f 61 64 64 5f 70 61 72 61 6d 65 74 65 72 28 26 _add_parameter(&
3270: 75 72 6c 2c 20 22 61 22 2c 20 7a 41 66 74 65 72 url, "a", zAfter
3280: 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 65 66 6f );. zBefo
3290: 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 re = 0;. }e
32a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 41 66 lse{. zAf
32b0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d ter = 0;. }
32c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a . }else if( z
32d0: 42 65 66 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 Before ){.
32e0: 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a while( isspace(z
32f0: 42 65 66 6f 72 65 5b 30 5d 29 20 29 7b 20 7a 42 Before[0]) ){ zB
3300: 65 66 6f 72 65 2b 2b 3b 20 7d 0a 20 20 20 20 20 efore++; }.
3310: 20 69 66 28 20 7a 42 65 66 6f 72 65 5b 30 5d 20 if( zBefore[0]
3320: 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f ){. blob_
3330: 61 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 0a 20 appendf(&sql, .
3340: 20 20 20 20 20 20 20 20 20 20 22 20 41 4e 44 20 " AND
3350: 65 76 65 6e 74 2e 6d 74 69 6d 65 3c 3d 28 53 45 event.mtime<=(SE
3360: 4c 45 43 54 20 6a 75 6c 69 61 6e 64 61 79 28 25 LECT julianday(%
3370: 51 2c 20 27 75 74 63 27 29 29 22 0a 20 20 20 20 Q, 'utc'))".
3380: 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 " ORDER B
3390: 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20 44 45 Y event.mtime DE
33a0: 53 43 22 2c 20 7a 42 65 66 6f 72 65 29 3b 0a 20 SC", zBefore);.
33b0: 20 20 20 20 20 20 20 75 72 6c 5f 61 64 64 5f 70 url_add_p
33c0: 61 72 61 6d 65 74 65 72 28 26 75 72 6c 2c 20 22 arameter(&url, "
33d0: 62 22 2c 20 7a 42 65 66 6f 72 65 29 3b 0a 20 20 b", zBefore);.
33e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
33f0: 20 20 20 20 7a 42 65 66 6f 72 65 20 3d 20 30 3b zBefore = 0;
3400: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c . }. }el
3410: 73 65 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 se{. blob_a
3420: 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 22 20 4f ppendf(&sql, " O
3430: 52 44 45 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 RDER BY event.mt
3440: 69 6d 65 20 44 45 53 43 22 29 3b 0a 20 20 20 20 ime DESC");.
3450: 7d 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e }. blob_appen
3460: 64 66 28 26 73 71 6c 2c 20 22 20 4c 49 4d 49 54 df(&sql, " LIMIT
3470: 20 25 64 22 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 %d", nEntry);.
3480: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 db_multi_exec
3490: 28 22 25 73 22 2c 20 62 6c 6f 62 5f 73 74 72 28 ("%s", blob_str(
34a0: 26 73 71 6c 29 29 3b 0a 0a 20 20 20 20 6e 20 3d &sql));.. n =
34b0: 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 db_int(0, "SELE
34c0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d CT count(*) FROM
34d0: 20 74 69 6d 65 6c 69 6e 65 22 29 3b 0a 20 20 20 timeline");.
34e0: 20 69 66 28 20 6e 3c 6e 45 6e 74 72 79 20 26 26 if( n<nEntry &&
34f0: 20 7a 41 66 74 65 72 20 29 7b 0a 20 20 20 20 20 zAfter ){.
3500: 20 63 67 69 5f 72 65 64 69 72 65 63 74 28 75 72 cgi_redirect(ur
3510: 6c 5f 72 65 6e 64 65 72 28 26 75 72 6c 2c 20 22 l_render(&url, "
3520: 61 22 2c 20 30 2c 20 22 62 22 2c 20 30 29 29 3b a", 0, "b", 0));
3530: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a . }. if( z
3540: 41 66 74 65 72 3d 3d 30 20 26 26 20 7a 42 65 66 After==0 && zBef
3550: 6f 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 ore==0 ){.
3560: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 64 65 blob_appendf(&de
3570: 73 63 2c 20 22 25 64 20 6d 6f 73 74 20 72 65 63 sc, "%d most rec
3580: 65 6e 74 20 25 73 73 22 2c 20 6e 2c 20 7a 45 54 ent %ss", n, zET
3590: 79 70 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b ype);. }else{
35a0: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 . blob_appe
35b0: 6e 64 66 28 26 64 65 73 63 2c 20 22 25 64 20 25 ndf(&desc, "%d %
35c0: 73 73 22 2c 20 6e 2c 20 7a 45 54 79 70 65 29 3b ss", n, zEType);
35d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a . }. if( z
35e0: 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20 62 6c User ){. bl
35f0: 6f 62 5f 61 70 70 65 6e 64 66 28 26 64 65 73 63 ob_appendf(&desc
3600: 2c 20 22 20 62 79 20 75 73 65 72 20 25 68 22 2c , " by user %h",
3610: 20 7a 55 73 65 72 29 3b 0a 20 20 20 20 7d 0a 20 zUser);. }.
3620: 20 20 20 69 66 28 20 7a 41 66 74 65 72 20 29 7b if( zAfter ){
3630: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 . blob_appe
3640: 6e 64 66 28 26 64 65 73 63 2c 20 22 20 6f 63 63 ndf(&desc, " occ
3650: 75 72 72 69 6e 67 20 6f 6e 20 6f 72 20 61 66 74 urring on or aft
3660: 65 72 20 25 68 2e 3c 62 72 3e 22 2c 20 7a 41 66 er %h.<br>", zAf
3670: 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 ter);. }else
3680: 69 66 28 20 7a 42 65 66 6f 72 65 20 29 7b 0a 20 if( zBefore ){.
3690: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 blob_append
36a0: 66 28 26 64 65 73 63 2c 20 22 20 6f 63 63 75 72 f(&desc, " occur
36b0: 72 69 6e 67 20 6f 6e 20 6f 72 20 62 65 66 6f 72 ring on or befor
36c0: 65 20 25 68 2e 3c 62 72 3e 22 2c 20 7a 42 65 66 e %h.<br>", zBef
36d0: 6f 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ore);. }.
36e0: 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20 if( g.okHistory
36f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 ){. if( zAf
3700: 74 65 72 20 7c 7c 20 6e 3d 3d 6e 45 6e 74 72 79 ter || n==nEntry
3710: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 61 74 ){. zDat
3720: 65 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 e = db_text(0, "
3730: 53 45 4c 45 43 54 20 6d 69 6e 28 74 69 6d 65 73 SELECT min(times
3740: 74 61 6d 70 29 20 46 52 4f 4d 20 74 69 6d 65 6c tamp) FROM timel
3750: 69 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20 74 ine");. t
3760: 69 6d 65 6c 69 6e 65 5f 73 75 62 6d 65 6e 75 28 imeline_submenu(
3770: 26 75 72 6c 2c 20 22 4f 6c 64 65 72 22 2c 20 22 &url, "Older", "
3780: 62 22 2c 20 7a 44 61 74 65 2c 20 22 61 22 29 3b b", zDate, "a");
3790: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 44 . free(zD
37a0: 61 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 ate);. }.
37b0: 20 20 20 20 69 66 28 20 7a 42 65 66 6f 72 65 20 if( zBefore
37c0: 7c 7c 20 28 7a 41 66 74 65 72 20 26 26 20 6e 3d || (zAfter && n=
37d0: 3d 6e 45 6e 74 72 79 29 20 29 7b 0a 20 20 20 20 =nEntry) ){.
37e0: 20 20 20 20 7a 44 61 74 65 20 3d 20 64 62 5f 74 zDate = db_t
37f0: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 6d ext(0, "SELECT m
3800: 61 78 28 74 69 6d 65 73 74 61 6d 70 29 20 46 52 ax(timestamp) FR
3810: 4f 4d 20 74 69 6d 65 6c 69 6e 65 22 29 3b 0a 20 OM timeline");.
3820: 20 20 20 20 20 20 20 74 69 6d 65 6c 69 6e 65 5f timeline_
3830: 73 75 62 6d 65 6e 75 28 26 75 72 6c 2c 20 22 4e submenu(&url, "N
3840: 65 77 65 72 22 2c 20 22 61 22 2c 20 7a 44 61 74 ewer", "a", zDat
3850: 65 2c 20 22 62 22 29 3b 0a 20 20 20 20 20 20 20 e, "b");.
3860: 20 66 72 65 65 28 7a 44 61 74 65 29 3b 0a 20 20 free(zDate);.
3870: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
3880: 20 20 20 69 66 28 20 7a 54 79 70 65 5b 30 5d 21 if( zType[0]!
3890: 3d 27 61 27 20 29 7b 0a 20 20 20 20 20 20 20 20 ='a' ){.
38a0: 20 20 74 69 6d 65 6c 69 6e 65 5f 73 75 62 6d 65 timeline_subme
38b0: 6e 75 28 26 75 72 6c 2c 20 22 41 6c 6c 20 54 79 nu(&url, "All Ty
38c0: 70 65 73 22 2c 20 22 79 22 2c 20 22 61 6c 6c 22 pes", "y", "all"
38d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a , 0);. }.
38e0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 79 70 if( zTyp
38f0: 65 5b 30 5d 21 3d 27 77 27 20 29 7b 0a 20 20 20 e[0]!='w' ){.
3900: 20 20 20 20 20 20 20 74 69 6d 65 6c 69 6e 65 5f timeline_
3910: 73 75 62 6d 65 6e 75 28 26 75 72 6c 2c 20 22 57 submenu(&url, "W
3920: 69 6b 69 20 4f 6e 6c 79 22 2c 20 22 79 22 2c 20 iki Only", "y",
3930: 22 77 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 "w", 0);.
3940: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a }. if( z
3950: 54 79 70 65 5b 30 5d 21 3d 27 63 27 20 29 7b 0a Type[0]!='c' ){.
3960: 20 20 20 20 20 20 20 20 20 20 74 69 6d 65 6c 69 timeli
3970: 6e 65 5f 73 75 62 6d 65 6e 75 28 26 75 72 6c 2c ne_submenu(&url,
3980: 20 22 43 68 65 63 6b 69 6e 73 20 4f 6e 6c 79 22 "Checkins Only"
3990: 2c 20 22 79 22 2c 20 22 63 69 22 2c 20 30 29 3b , "y", "ci", 0);
39a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
39b0: 20 20 20 69 66 28 20 7a 54 79 70 65 5b 30 5d 21 if( zType[0]!
39c0: 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 ='t' ){.
39d0: 20 20 74 69 6d 65 6c 69 6e 65 5f 73 75 62 6d 65 timeline_subme
39e0: 6e 75 28 26 75 72 6c 2c 20 22 54 69 63 6b 65 74 nu(&url, "Ticket
39f0: 73 20 4f 6e 6c 79 22 2c 20 22 79 22 2c 20 22 74 s Only", "y", "t
3a00: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d ", 0);. }
3a10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 . }. i
3a20: 66 28 20 6e 45 6e 74 72 79 3e 32 30 20 29 7b 0a f( nEntry>20 ){.
3a30: 20 20 20 20 20 20 20 20 74 69 6d 65 6c 69 6e 65 timeline
3a40: 5f 73 75 62 6d 65 6e 75 28 26 75 72 6c 2c 20 22 _submenu(&url, "
3a50: 32 30 20 45 76 65 6e 74 73 22 2c 20 22 6e 22 2c 20 Events", "n",
3a60: 20 22 32 30 22 2c 20 30 29 3b 0a 20 20 20 20 20 "20", 0);.
3a70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 6e }. if( nEn
3a80: 74 72 79 3c 32 30 30 20 29 7b 0a 20 20 20 20 20 try<200 ){.
3a90: 20 20 20 74 69 6d 65 6c 69 6e 65 5f 73 75 62 6d timeline_subm
3aa0: 65 6e 75 28 26 75 72 6c 2c 20 22 32 30 30 20 45 enu(&url, "200 E
3ab0: 76 65 6e 74 73 22 2c 20 22 6e 22 2c 20 22 32 30 vents", "n", "20
3ac0: 30 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0", 0);. }.
3ad0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 6c 6f 62 }. }. blob
3ae0: 5f 7a 65 72 6f 28 26 73 71 6c 29 3b 0a 20 20 64 _zero(&sql);. d
3af0: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22 53 b_prepare(&q, "S
3b00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 69 6d ELECT * FROM tim
3b10: 65 6c 69 6e 65 20 4f 52 44 45 52 20 42 59 20 74 eline ORDER BY t
3b20: 69 6d 65 73 74 61 6d 70 20 44 45 53 43 22 29 3b imestamp DESC");
3b30: 0a 20 20 40 20 3c 68 32 3e 25 62 28 26 64 65 73 . @ <h2>%b(&des
3b40: 63 29 3c 2f 68 32 3e 0a 20 20 62 6c 6f 62 5f 72 c)</h2>. blob_r
3b50: 65 73 65 74 28 26 64 65 73 63 29 3b 0a 20 20 77 eset(&desc);. w
3b60: 77 77 5f 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e ww_print_timelin
3b70: 65 28 26 71 2c 20 30 2c 20 30 29 3b 0a 20 20 64 e(&q, 0, 0);. d
3b80: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a b_finalize(&q);.
3b90: 0a 20 20 40 20 3c 73 63 72 69 70 74 3e 0a 20 20 . @ <script>.
3ba0: 40 20 76 61 72 20 70 61 72 65 6e 74 6f 66 20 3d @ var parentof =
3bb0: 20 6e 65 77 20 4f 62 6a 65 63 74 28 29 3b 0a 20 new Object();.
3bc0: 20 40 20 76 61 72 20 63 68 69 6c 64 6f 66 20 3d @ var childof =
3bd0: 20 6e 65 77 20 4f 62 6a 65 63 74 28 29 3b 0a 20 new Object();.
3be0: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 db_prepare(&q,
3bf0: 22 53 45 4c 45 43 54 20 72 69 64 20 46 52 4f 4d "SELECT rid FROM
3c00: 20 74 69 6d 65 6c 69 6e 65 22 29 3b 0a 20 20 77 timeline");. w
3c10: 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 hile( db_step(&q
3c20: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b )==SQLITE_ROW ){
3c30: 0a 20 20 20 20 69 6e 74 20 72 69 64 20 3d 20 64 . int rid = d
3c40: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c b_column_int(&q,
3c50: 20 30 29 3b 0a 20 20 20 20 53 74 6d 74 20 71 32 0);. Stmt q2
3c60: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
3c70: 20 2a 7a 53 65 70 3b 0a 20 20 20 20 42 6c 6f 62 *zSep;. Blob
3c80: 20 2a 70 4f 75 74 20 3d 20 63 67 69 5f 6f 75 74 *pOut = cgi_out
3c90: 70 75 74 5f 62 6c 6f 62 28 29 3b 0a 0a 20 20 20 put_blob();..
3ca0: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 32 2c db_prepare(&q2,
3cb0: 20 22 53 45 4c 45 43 54 20 70 69 64 20 46 52 4f "SELECT pid FRO
3cc0: 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 63 69 M plink WHERE ci
3cd0: 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 20 d=%d", rid);.
3ce0: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 zSep = "";.
3cf0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 blob_appendf(pOu
3d00: 74 2c 20 22 70 61 72 65 6e 74 6f 66 5b 5c 22 6d t, "parentof[\"m
3d10: 25 64 5c 22 5d 20 3d 20 5b 22 2c 20 72 69 64 29 %d\"] = [", rid)
3d20: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f ;. while( db_
3d30: 73 74 65 70 28 26 71 32 29 3d 3d 53 51 4c 49 54 step(&q2)==SQLIT
3d40: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 E_ROW ){. i
3d50: 6e 74 20 70 69 64 20 3d 20 64 62 5f 63 6f 6c 75 nt pid = db_colu
3d60: 6d 6e 5f 69 6e 74 28 26 71 32 2c 20 30 29 3b 0a mn_int(&q2, 0);.
3d70: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e blob_appen
3d80: 64 66 28 70 4f 75 74 2c 20 22 25 73 5c 22 6d 25 df(pOut, "%s\"m%
3d90: 64 5c 22 22 2c 20 7a 53 65 70 2c 20 70 69 64 29 d\"", zSep, pid)
3da0: 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 ;. zSep = "
3db0: 2c 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 ,";. }. db
3dc0: 5f 66 69 6e 61 6c 69 7a 65 28 26 71 32 29 3b 0a _finalize(&q2);.
3dd0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 blob_appendf
3de0: 28 70 4f 75 74 2c 20 22 5d 3b 5c 6e 22 29 3b 0a (pOut, "];\n");.
3df0: 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 db_prepare(&
3e00: 71 32 2c 20 22 53 45 4c 45 43 54 20 63 69 64 20 q2, "SELECT cid
3e10: 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 FROM plink WHERE
3e20: 20 70 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a pid=%d", rid);.
3e30: 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 zSep = "";.
3e40: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 blob_appendf(
3e50: 70 4f 75 74 2c 20 22 63 68 69 6c 64 6f 66 5b 5c pOut, "childof[\
3e60: 22 6d 25 64 5c 22 5d 20 3d 20 5b 22 2c 20 72 69 "m%d\"] = [", ri
3e70: 64 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 64 d);. while( d
3e80: 62 5f 73 74 65 70 28 26 71 32 29 3d 3d 53 51 4c b_step(&q2)==SQL
3e90: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 ITE_ROW ){.
3ea0: 20 69 6e 74 20 70 69 64 20 3d 20 64 62 5f 63 6f int pid = db_co
3eb0: 6c 75 6d 6e 5f 69 6e 74 28 26 71 32 2c 20 30 29 lumn_int(&q2, 0)
3ec0: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 ;. blob_app
3ed0: 65 6e 64 66 28 70 4f 75 74 2c 20 22 25 73 5c 22 endf(pOut, "%s\"
3ee0: 6d 25 64 5c 22 22 2c 20 7a 53 65 70 2c 20 70 69 m%d\"", zSep, pi
3ef0: 64 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d d);. zSep =
3f00: 20 22 2c 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ",";. }.
3f10: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 32 29 db_finalize(&q2)
3f20: 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e ;. blob_appen
3f30: 64 66 28 70 4f 75 74 2c 20 22 5d 3b 5c 6e 22 29 df(pOut, "];\n")
3f40: 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c ;. }. db_final
3f50: 69 7a 65 28 26 71 29 3b 0a 20 20 40 20 66 75 6e ize(&q);. @ fun
3f60: 63 74 69 6f 6e 20 73 65 74 61 6c 6c 28 76 61 6c ction setall(val
3f70: 75 65 29 7b 0a 20 20 40 20 20 20 66 6f 72 28 76 ue){. @ for(v
3f80: 61 72 20 78 20 69 6e 20 70 61 72 65 6e 74 6f 66 ar x in parentof
3f90: 29 7b 0a 20 20 40 20 20 20 20 20 73 65 74 6f 6e ){. @ seton
3fa0: 65 28 78 2c 76 61 6c 75 65 29 3b 0a 20 20 40 20 e(x,value);. @
3fb0: 20 20 7d 0a 20 20 40 20 7d 0a 20 20 40 20 73 65 }. @ }. @ se
3fc0: 74 61 6c 6c 28 22 23 66 66 66 66 66 66 22 29 3b tall("#ffffff");
3fd0: 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e 20 73 65 . @ function se
3fe0: 74 6f 6e 65 28 69 64 2c 20 63 6c 72 29 7b 0a 20 tone(id, clr){.
3ff0: 20 40 20 20 20 69 66 28 20 70 61 72 65 6e 74 6f @ if( parento
4000: 66 5b 69 64 5d 3d 3d 6e 75 6c 6c 20 29 20 72 65 f[id]==null ) re
4010: 74 75 72 6e 20 30 3b 0a 20 20 40 20 20 20 76 61 turn 0;. @ va
4020: 72 20 77 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 r w = document.g
4030: 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 69 64 etElementById(id
4040: 29 3b 0a 20 20 40 20 20 20 69 66 28 20 77 2e 73 );. @ if( w.s
4050: 74 79 6c 65 2e 63 6f 6c 6f 72 3d 3d 63 6c 72 20 tyle.color==clr
4060: 29 7b 0a 20 20 40 20 20 20 20 20 72 65 74 75 72 ){. @ retur
4070: 6e 20 30 0a 20 20 40 20 20 20 7d 65 6c 73 65 7b n 0. @ }else{
4080: 0a 20 20 40 20 20 20 20 20 77 2e 73 74 79 6c 65 . @ w.style
4090: 2e 63 6f 6c 6f 72 20 3d 20 63 6c 72 0a 20 20 40 .color = clr. @
40a0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 0a 20 20 return 1.
40b0: 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20 40 20 @ }. @ }. @
40c0: 66 75 6e 63 74 69 6f 6e 20 78 69 6e 28 69 64 29 function xin(id)
40d0: 20 7b 0a 20 20 40 20 20 20 73 65 74 61 6c 6c 28 {. @ setall(
40e0: 22 23 66 66 66 66 66 66 22 29 3b 0a 20 20 40 20 "#ffffff");. @
40f0: 20 20 73 65 74 6f 6e 65 28 69 64 2c 22 23 66 66 setone(id,"#ff
4100: 30 30 30 30 22 29 3b 0a 20 20 40 20 20 20 73 65 0000");. @ se
4110: 74 5f 63 68 69 6c 64 72 65 6e 28 69 64 2c 20 22 t_children(id, "
4120: 23 62 30 62 30 62 30 22 29 3b 0a 20 20 40 20 20 #b0b0b0");. @
4130: 20 73 65 74 5f 70 61 72 65 6e 74 73 28 69 64 2c set_parents(id,
4140: 20 22 23 62 30 62 30 62 30 22 29 3b 0a 20 20 40 "#b0b0b0");. @
4150: 20 20 20 66 6f 72 28 76 61 72 20 78 20 69 6e 20 for(var x in
4160: 70 61 72 65 6e 74 6f 66 5b 69 64 5d 29 7b 0a 20 parentof[id]){.
4170: 20 40 20 20 20 20 20 76 61 72 20 70 69 64 20 3d @ var pid =
4180: 20 70 61 72 65 6e 74 6f 66 5b 69 64 5d 5b 78 5d parentof[id][x]
4190: 0a 20 20 40 20 20 20 20 20 76 61 72 20 77 20 3d . @ var w =
41a0: 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 document.getEle
41b0: 6d 65 6e 74 42 79 49 64 28 70 69 64 29 3b 0a 20 mentById(pid);.
41c0: 20 40 20 20 20 20 20 69 66 28 20 77 21 3d 6e 75 @ if( w!=nu
41d0: 6c 6c 20 29 7b 0a 20 20 40 20 20 20 20 20 20 20 ll ){. @
41e0: 77 2e 73 74 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20 w.style.color =
41f0: 22 23 30 30 30 30 30 30 22 3b 0a 20 20 40 20 20 "#000000";. @
4200: 20 20 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40 }. @ }. @
4210: 20 20 20 66 6f 72 28 76 61 72 20 78 20 69 6e 20 for(var x in
4220: 63 68 69 6c 64 6f 66 5b 69 64 5d 29 7b 0a 20 20 childof[id]){.
4230: 40 20 20 20 20 20 76 61 72 20 63 69 64 20 3d 20 @ var cid =
4240: 63 68 69 6c 64 6f 66 5b 69 64 5d 5b 78 5d 0a 20 childof[id][x].
4250: 20 40 20 20 20 20 20 76 61 72 20 77 20 3d 20 64 @ var w = d
4260: 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 ocument.getEleme
4270: 6e 74 42 79 49 64 28 63 69 64 29 3b 0a 20 20 40 ntById(cid);. @
4280: 20 20 20 20 20 69 66 28 20 77 21 3d 6e 75 6c 6c if( w!=null
4290: 20 29 7b 0a 20 20 40 20 20 20 20 20 20 20 77 2e ){. @ w.
42a0: 73 74 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20 22 23 style.color = "#
42b0: 30 30 30 30 30 30 22 3b 0a 20 20 40 20 20 20 20 000000";. @
42c0: 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40 20 7d }. @ }. @ }
42d0: 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e 20 78 6f . @ function xo
42e0: 75 74 28 69 64 29 20 7b 0a 20 20 40 20 20 20 2f ut(id) {. @ /
42f0: 2a 20 73 65 74 61 6c 6c 28 22 23 30 30 30 30 30 * setall("#00000
4300: 30 22 29 3b 20 2a 2f 0a 20 20 40 20 7d 0a 20 20 0"); */. @ }.
4310: 40 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 5f 70 @ function set_p
4320: 61 72 65 6e 74 73 28 69 64 2c 20 63 6c 72 29 7b arents(id, clr){
4330: 0a 20 20 40 20 20 20 76 61 72 20 70 6c 69 73 74 . @ var plist
4340: 20 3d 20 70 61 72 65 6e 74 6f 66 5b 69 64 5d 3b = parentof[id];
4350: 0a 20 20 40 20 20 20 69 66 28 20 70 6c 69 73 74 . @ if( plist
4360: 3d 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72 6e 3b ==null ) return;
4370: 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72 20 78 . @ for(var x
4380: 20 69 6e 20 70 6c 69 73 74 29 7b 0a 20 20 40 20 in plist){. @
4390: 20 20 20 20 76 61 72 20 70 69 64 20 3d 20 70 6c var pid = pl
43a0: 69 73 74 5b 78 5d 3b 0a 20 20 40 20 20 20 20 20 ist[x];. @
43b0: 69 66 28 20 73 65 74 6f 6e 65 28 70 69 64 2c 63 if( setone(pid,c
43c0: 6c 72 29 3d 3d 31 20 29 7b 0a 20 20 40 20 20 20 lr)==1 ){. @
43d0: 20 20 20 20 73 65 74 5f 70 61 72 65 6e 74 73 28 set_parents(
43e0: 70 69 64 2c 63 6c 72 29 3b 0a 20 20 40 20 20 20 pid,clr);. @
43f0: 20 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40 20 }. @ }. @
4400: 7d 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e 20 73 }. @ function s
4410: 65 74 5f 63 68 69 6c 64 72 65 6e 28 69 64 2c 63 et_children(id,c
4420: 6c 72 29 7b 0a 20 20 40 20 20 20 76 61 72 20 63 lr){. @ var c
4430: 6c 69 73 74 20 3d 20 63 68 69 6c 64 6f 66 5b 69 list = childof[i
4440: 64 5d 3b 0a 20 20 40 20 20 20 69 66 28 20 63 6c d];. @ if( cl
4450: 69 73 74 3d 3d 6e 75 6c 6c 20 29 20 72 65 74 75 ist==null ) retu
4460: 72 6e 3b 0a 20 20 40 20 20 20 66 6f 72 28 76 61 rn;. @ for(va
4470: 72 20 78 20 69 6e 20 63 6c 69 73 74 29 7b 0a 20 r x in clist){.
4480: 20 40 20 20 20 20 20 76 61 72 20 63 69 64 20 3d @ var cid =
4490: 20 63 6c 69 73 74 5b 78 5d 3b 0a 20 20 40 20 20 clist[x];. @
44a0: 20 20 20 69 66 28 20 73 65 74 6f 6e 65 28 63 69 if( setone(ci
44b0: 64 2c 63 6c 72 29 3d 3d 31 20 29 7b 0a 20 20 40 d,clr)==1 ){. @
44c0: 20 20 20 20 20 20 20 73 65 74 5f 63 68 69 6c 64 set_child
44d0: 72 65 6e 28 63 69 64 2c 63 6c 72 29 3b 0a 20 20 ren(cid,clr);.
44e0: 40 20 20 20 20 20 7d 0a 20 20 40 20 20 20 7d 0a @ }. @ }.
44f0: 20 20 40 20 7d 0a 20 20 40 20 3c 2f 73 63 72 69 @ }. @ </scri
4500: 70 74 3e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 pt>. style_foot
4510: 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 er();.}../*.** T
4520: 68 65 20 69 6e 70 75 74 20 71 75 65 72 79 20 71 he input query q
4530: 20 73 65 6c 65 63 74 73 20 76 61 72 69 6f 75 73 selects various
4540: 20 72 65 63 6f 72 64 73 2e 20 20 50 72 69 6e 74 records. Print
4550: 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c a human-readabl
4560: 65 0a 2a 2a 20 73 75 6d 6d 61 72 79 20 6f 66 20 e.** summary of
4570: 74 68 6f 73 65 20 72 65 63 6f 72 64 73 2e 0a 2a those records..*
4580: 2a 0a 2a 2a 20 4c 69 6d 69 74 20 74 68 65 20 6e *.** Limit the n
4590: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 umber of entries
45a0: 20 70 72 69 6e 74 65 64 20 74 6f 20 6e 4c 69 6e printed to nLin
45b0: 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 71 75 e..** .** The qu
45c0: 65 72 79 20 73 68 6f 75 6c 64 20 72 65 74 75 72 ery should retur
45d0: 6e 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 3a n these columns:
45e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 30 2e 20 20 72 69 .**.** 0. ri
45f0: 64 0a 2a 2a 20 20 20 20 31 2e 20 20 75 75 69 64 d.** 1. uuid
4600: 0a 2a 2a 20 20 20 20 32 2e 20 20 44 61 74 65 2f .** 2. Date/
4610: 54 69 6d 65 0a 2a 2a 20 20 20 20 33 2e 20 20 43 Time.** 3. C
4620: 6f 6d 6d 65 6e 74 20 73 74 72 69 6e 67 20 61 6e omment string an
4630: 64 20 75 73 65 72 0a 2a 2a 20 20 20 20 34 2e 20 d user.** 4.
4640: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 6d Number of non-m
4650: 65 72 67 65 20 63 68 69 6c 64 72 65 6e 0a 2a 2a erge children.**
4660: 20 20 20 20 35 2e 20 20 4e 75 6d 62 65 72 20 6f 5. Number o
4670: 66 20 70 61 72 65 6e 74 73 0a 2a 2f 0a 76 6f 69 f parents.*/.voi
4680: 64 20 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 d print_timeline
4690: 28 53 74 6d 74 20 2a 71 2c 20 69 6e 74 20 6d 78 (Stmt *q, int mx
46a0: 4c 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 Line){. int nLi
46b0: 6e 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a ne = 0;. char z
46c0: 50 72 65 76 44 61 74 65 5b 32 30 5d 3b 0a 20 20 PrevDate[20];.
46d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 75 72 const char *zCur
46e0: 72 65 6e 74 55 75 69 64 3d 30 3b 0a 20 20 7a 50 rentUuid=0;. zP
46f0: 72 65 76 44 61 74 65 5b 30 5d 20 3d 20 30 3b 0a revDate[0] = 0;.
4700: 0a 20 20 69 66 28 20 67 2e 6c 6f 63 61 6c 4f 70 . if( g.localOp
4710: 65 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 69 en ){. int ri
4720: 64 20 3d 20 64 62 5f 6c 67 65 74 5f 69 6e 74 28 d = db_lget_int(
4730: 22 63 68 65 63 6b 6f 75 74 22 2c 20 30 29 3b 0a "checkout", 0);.
4740: 20 20 20 20 7a 43 75 72 72 65 6e 74 55 75 69 64 zCurrentUuid
4750: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 = db_text(0, "S
4760: 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 ELECT uuid FROM
4770: 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 blob WHERE rid=%
4780: 64 22 2c 20 72 69 64 29 3b 0a 20 20 7d 0a 0a 20 d", rid);. }..
4790: 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 while( db_step(
47a0: 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 q)==SQLITE_ROW &
47b0: 26 20 6e 4c 69 6e 65 3c 3d 6d 78 4c 69 6e 65 20 & nLine<=mxLine
47c0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 69 64 20 3d ){. int rid =
47d0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 71 db_column_int(q
47e0: 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 , 0);. const
47f0: 63 68 61 72 20 2a 7a 49 64 20 3d 20 64 62 5f 63 char *zId = db_c
4800: 6f 6c 75 6d 6e 5f 74 65 78 74 28 71 2c 20 31 29 olumn_text(q, 1)
4810: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
4820: 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c *zDate = db_col
4830: 75 6d 6e 5f 74 65 78 74 28 71 2c 20 32 29 3b 0a umn_text(q, 2);.
4840: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
4850: 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e zCom = db_column
4860: 5f 74 65 78 74 28 71 2c 20 33 29 3b 0a 20 20 20 _text(q, 3);.
4870: 20 69 6e 74 20 6e 43 68 69 6c 64 20 3d 20 64 62 int nChild = db
4880: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 71 2c 20 34 _column_int(q, 4
4890: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 65 );. int nPare
48a0: 6e 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 nt = db_column_i
48b0: 6e 74 28 71 2c 20 35 29 3b 0a 20 20 20 20 63 68 nt(q, 5);. ch
48c0: 61 72 20 2a 7a 46 72 65 65 20 3d 20 30 3b 0a 20 ar *zFree = 0;.
48d0: 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 int n = 0;.
48e0: 20 20 63 68 61 72 20 7a 50 72 65 66 69 78 5b 38 char zPrefix[8
48f0: 30 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a 55 75 0];. char zUu
4900: 69 64 5b 55 55 49 44 5f 53 49 5a 45 2b 31 5d 3b id[UUID_SIZE+1];
4910: 0a 20 20 20 20 0a 20 20 20 20 73 70 72 69 6e 74 . . sprint
4920: 66 28 7a 55 75 69 64 2c 20 22 25 2e 31 30 73 22 f(zUuid, "%.10s"
4930: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 69 66 28 20 , zId);. if(
4940: 6d 65 6d 63 6d 70 28 7a 44 61 74 65 2c 20 7a 50 memcmp(zDate, zP
4950: 72 65 76 44 61 74 65 2c 20 31 30 29 20 29 7b 0a revDate, 10) ){.
4960: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 3d 3d printf("==
4970: 3d 20 25 2e 31 30 73 20 3d 3d 3d 5c 6e 22 2c 20 = %.10s ===\n",
4980: 7a 44 61 74 65 29 3b 0a 20 20 20 20 20 20 6d 65 zDate);. me
4990: 6d 63 70 79 28 7a 50 72 65 76 44 61 74 65 2c 20 mcpy(zPrevDate,
49a0: 7a 44 61 74 65 2c 20 31 30 29 3b 0a 20 20 20 20 zDate, 10);.
49b0: 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 7d nLine++;. }
49c0: 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 3d 3d 30 . if( zCom==0
49d0: 20 29 20 7a 43 6f 6d 20 3d 20 22 22 3b 0a 20 20 ) zCom = "";.
49e0: 20 20 70 72 69 6e 74 66 28 22 25 2e 38 73 20 22 printf("%.8s "
49f0: 2c 20 26 7a 44 61 74 65 5b 31 31 5d 29 3b 0a 20 , &zDate[11]);.
4a00: 20 20 20 7a 50 72 65 66 69 78 5b 30 5d 20 3d 20 zPrefix[0] =
4a10: 30 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 72 65 0;. if( nPare
4a20: 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 73 71 nt>1 ){. sq
4a30: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 lite3_snprintf(s
4a40: 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 izeof(zPrefix),
4a50: 7a 50 72 65 66 69 78 2c 20 22 2a 4d 45 52 47 45 zPrefix, "*MERGE
4a60: 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 * ");. n =
4a70: 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78 29 3b strlen(zPrefix);
4a80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e . }. if( n
4a90: 43 68 69 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 Child>1 ){.
4aa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 72 const char *zBr
4ab0: 54 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 Type;. if(
4ac0: 63 6f 75 6e 74 5f 6e 6f 6e 62 72 61 6e 63 68 5f count_nonbranch_
4ad0: 63 68 69 6c 64 72 65 6e 28 72 69 64 29 3e 31 20 children(rid)>1
4ae0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 72 54 79 ){. zBrTy
4af0: 70 65 20 3d 20 22 2a 46 4f 52 4b 2a 20 22 3b 0a pe = "*FORK* ";.
4b00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
4b10: 20 20 20 20 20 7a 42 72 54 79 70 65 20 3d 20 22 zBrType = "
4b20: 2a 42 52 41 4e 43 48 2a 20 22 3b 0a 20 20 20 20 *BRANCH* ";.
4b30: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 }. sqlite
4b40: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 3_snprintf(sizeo
4b50: 66 28 7a 50 72 65 66 69 78 29 2d 6e 2c 20 26 7a f(zPrefix)-n, &z
4b60: 50 72 65 66 69 78 5b 6e 5d 2c 20 7a 42 72 54 79 Prefix[n], zBrTy
4b70: 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 pe);. n = s
4b80: 74 72 6c 65 6e 28 7a 50 72 65 66 69 78 29 3b 0a trlen(zPrefix);.
4b90: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 43 }. if( zC
4ba0: 75 72 72 65 6e 74 55 75 69 64 20 26 26 20 73 74 urrentUuid && st
4bb0: 72 63 6d 70 28 7a 43 75 72 72 65 6e 74 55 75 69 rcmp(zCurrentUui
4bc0: 64 2c 7a 49 64 29 3d 3d 30 20 29 7b 0a 20 20 20 d,zId)==0 ){.
4bd0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
4be0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65 66 ntf(sizeof(zPref
4bf0: 69 78 29 2d 6e 2c 20 26 7a 50 72 65 66 69 78 5b ix)-n, &zPrefix[
4c00: 6e 5d 2c 20 22 2a 43 55 52 52 45 4e 54 2a 20 22 n], "*CURRENT* "
4c10: 29 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 73 74 );. n += st
4c20: 72 6c 65 6e 28 7a 50 72 65 66 69 78 29 3b 0a 20 rlen(zPrefix);.
4c30: 20 20 20 7d 0a 20 20 20 20 7a 46 72 65 65 20 3d }. zFree =
4c40: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
4c50: 28 22 5b 25 2e 31 30 73 5d 20 25 73 25 73 22 2c ("[%.10s] %s%s",
4c60: 20 7a 55 75 69 64 2c 20 7a 50 72 65 66 69 78 2c zUuid, zPrefix,
4c70: 20 7a 43 6f 6d 29 3b 0a 20 20 20 20 6e 4c 69 6e zCom);. nLin
4c80: 65 20 2b 3d 20 63 6f 6d 6d 65 6e 74 5f 70 72 69 e += comment_pri
4c90: 6e 74 28 7a 46 72 65 65 2c 20 39 2c 20 37 39 29 nt(zFree, 9, 79)
4ca0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 ;. sqlite3_fr
4cb0: 65 65 28 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 7d ee(zFree);. }.}
4cc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 ../*.** Return a
4cd0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 pointer to a st
4ce0: 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 atic string that
4cf0: 20 66 6f 72 6d 73 20 74 68 65 20 62 61 73 69 73 forms the basis
4d00: 20 66 6f 72 0a 2a 2a 20 61 20 74 69 6d 65 6c 69 for.** a timeli
4d10: 6e 65 20 71 75 65 72 79 20 66 6f 72 20 64 69 73 ne query for dis
4d20: 70 6c 61 79 20 6f 6e 20 61 20 54 54 59 2e 0a 2a play on a TTY..*
4d30: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 69 /.const char *ti
4d40: 6d 65 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72 meline_query_for
4d50: 5f 74 74 79 28 76 6f 69 64 29 7b 0a 20 20 73 74 _tty(void){. st
4d60: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
4d70: 7a 42 61 73 65 53 71 6c 5b 5d 20 3d 20 0a 20 20 zBaseSql[] = .
4d80: 20 20 40 20 53 45 4c 45 43 54 0a 20 20 20 20 40 @ SELECT. @
4d90: 20 20 20 62 6c 6f 62 2e 72 69 64 2c 0a 20 20 20 blob.rid,.
4da0: 20 40 20 20 20 75 75 69 64 2c 0a 20 20 20 20 40 @ uuid,. @
4db0: 20 20 20 64 61 74 65 74 69 6d 65 28 65 76 65 6e datetime(even
4dc0: 74 2e 6d 74 69 6d 65 2c 27 6c 6f 63 61 6c 74 69 t.mtime,'localti
4dd0: 6d 65 27 29 2c 0a 20 20 20 20 40 20 20 20 63 6f me'),. @ co
4de0: 61 6c 65 73 63 65 28 65 63 6f 6d 6d 65 6e 74 2c alesce(ecomment,
4df0: 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 40 20 20 comment). @
4e00: 20 20 20 7c 7c 20 27 20 28 75 73 65 72 3a 20 27 || ' (user: '
4e10: 20 7c 7c 20 63 6f 61 6c 65 73 63 65 28 65 75 73 || coalesce(eus
4e20: 65 72 2c 75 73 65 72 2c 27 3f 27 29 0a 20 20 20 er,user,'?').
4e30: 20 40 20 20 20 20 20 7c 7c 20 28 53 45 4c 45 43 @ || (SELEC
4e40: 54 20 63 61 73 65 20 77 68 65 6e 20 6c 65 6e 67 T case when leng
4e50: 74 68 28 78 29 3e 30 20 74 68 65 6e 20 27 20 74 th(x)>0 then ' t
4e60: 61 67 73 3a 20 27 20 7c 7c 20 78 20 65 6c 73 65 ags: ' || x else
4e70: 20 27 27 20 65 6e 64 0a 20 20 20 20 40 20 20 20 '' end. @
4e80: 20 20 20 20 20 20 20 20 46 52 4f 4d 20 28 53 45 FROM (SE
4e90: 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 LECT group_conca
4ea0: 74 28 73 75 62 73 74 72 28 74 61 67 6e 61 6d 65 t(substr(tagname
4eb0: 2c 35 29 2c 20 27 2c 20 27 29 20 41 53 20 78 0a ,5), ', ') AS x.
4ec0: 20 20 20 20 40 20 20 20 20 20 20 20 20 20 20 20 @
4ed0: 20 20 20 20 20 20 20 20 46 52 4f 4d 20 74 61 67 FROM tag
4ee0: 2c 20 74 61 67 78 72 65 66 0a 20 20 20 20 40 20 , tagxref. @
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4f00: 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65 20 47 WHERE tagname G
4f10: 4c 4f 42 20 27 73 79 6d 2d 2a 27 20 41 4e 44 20 LOB 'sym-*' AND
4f20: 74 61 67 2e 74 61 67 69 64 3d 74 61 67 78 72 65 tag.tagid=tagxre
4f30: 66 2e 74 61 67 69 64 0a 20 20 20 20 40 20 20 20 f.tagid. @
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4f50: 20 41 4e 44 20 74 61 67 78 72 65 66 2e 72 69 64 AND tagxref.rid
4f60: 3d 62 6c 6f 62 2e 72 69 64 20 41 4e 44 20 74 61 =blob.rid AND ta
4f70: 67 78 72 65 66 2e 74 61 67 74 79 70 65 3e 30 29 gxref.tagtype>0)
4f80: 29 0a 20 20 20 20 40 20 20 20 20 20 7c 7c 20 27 ). @ || '
4f90: 29 27 2c 0a 20 20 20 20 40 20 20 20 28 53 45 4c )',. @ (SEL
4fa0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f ECT count(*) FRO
4fb0: 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70 69 M plink WHERE pi
4fc0: 64 3d 62 6c 6f 62 2e 72 69 64 20 41 4e 44 20 69 d=blob.rid AND i
4fd0: 73 70 72 69 6d 29 2c 0a 20 20 20 20 40 20 20 20 sprim),. @
4fe0: 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 (SELECT count(*)
4ff0: 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 FROM plink WHER
5000: 45 20 63 69 64 3d 62 6c 6f 62 2e 72 69 64 29 0a E cid=blob.rid).
5010: 20 20 20 20 40 20 46 52 4f 4d 20 65 76 65 6e 74 @ FROM event
5020: 2c 20 62 6c 6f 62 0a 20 20 20 20 40 20 57 48 45 , blob. @ WHE
5030: 52 45 20 62 6c 6f 62 2e 72 69 64 3d 65 76 65 6e RE blob.rid=even
5040: 74 2e 6f 62 6a 69 64 0a 20 20 3b 0a 20 20 72 65 t.objid. ;. re
5050: 74 75 72 6e 20 7a 42 61 73 65 53 71 6c 3b 0a 7d turn zBaseSql;.}
5060: 0a 0a 2f 2a 0a 2a 2a 20 45 71 75 69 76 61 6c 65 ../*.** Equivale
5070: 6e 74 20 74 6f 20 74 69 6d 65 6c 69 6e 65 5f 71 nt to timeline_q
5080: 75 65 72 79 5f 66 6f 72 5f 74 74 79 28 29 2c 20 uery_for_tty(),
5090: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a except that:.**.
50a0: 2a 2a 20 61 29 20 61 63 63 65 70 74 73 20 61 20 ** a) accepts a
50b0: 74 68 65 20 2d 74 79 70 65 3d 58 58 20 66 6c 61 the -type=XX fla
50c0: 67 20 74 6f 20 73 65 74 20 74 68 65 20 65 76 65 g to set the eve
50d0: 6e 74 20 74 79 70 65 20 74 6f 20 66 69 6c 74 65 nt type to filte
50e0: 72 20 6f 6e 2e 0a 2a 2a 20 20 20 20 54 68 65 20 r on..** The
50f0: 76 61 6c 75 65 73 20 6f 66 20 58 58 20 61 72 65 values of XX are
5100: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 75 70 the same as sup
5110: 70 6f 72 74 65 64 20 62 79 20 74 68 65 20 2f 74 ported by the /t
5120: 69 6d 65 6c 69 6e 65 20 70 61 67 65 2e 0a 2a 2a imeline page..**
5130: 0a 2a 2a 20 62 29 20 54 68 65 20 72 65 74 75 72 .** b) The retur
5140: 6e 65 64 20 73 74 72 69 6e 67 20 6d 75 73 74 20 ned string must
5150: 62 65 20 66 72 65 65 64 20 75 73 69 6e 67 20 66 be freed using f
5160: 72 65 65 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a ree()..*/.char *
5170: 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79 5f timeline_query_
5180: 66 6f 72 5f 74 74 79 5f 6d 28 76 6f 69 64 29 7b for_tty_m(void){
5190: 0a 20 20 42 6c 6f 62 20 62 6c 3b 0a 20 20 63 68 . Blob bl;. ch
51a0: 61 72 20 63 6f 6e 73 74 20 2a 20 7a 54 79 70 65 ar const * zType
51b0: 20 3d 20 30 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 = 0;. blob_zer
51c0: 6f 28 26 62 6c 29 3b 0a 20 20 62 6c 6f 62 5f 61 o(&bl);. blob_a
51d0: 70 70 65 6e 64 28 20 26 62 6c 2c 20 74 69 6d 65 ppend( &bl, time
51e0: 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72 5f 74 line_query_for_t
51f0: 74 79 28 29 2c 20 2d 31 20 29 3b 0a 20 20 7a 54 ty(), -1 );. zT
5200: 79 70 65 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f ype = find_optio
5210: 6e 28 20 22 74 79 70 65 22 2c 20 22 74 22 2c 20 n( "type", "t",
5220: 31 20 29 3b 0a 20 20 69 66 28 20 7a 54 79 70 65 1 );. if( zType
5230: 20 26 26 20 2a 7a 54 79 70 65 20 29 0a 20 20 7b && *zType ). {
5240: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 . blob_appe
5250: 6e 64 66 28 20 26 62 6c 2c 20 22 20 41 4e 44 20 ndf( &bl, " AND
5260: 65 76 65 6e 74 2e 74 79 70 65 3d 25 51 22 2c 20 event.type=%Q",
5270: 7a 54 79 70 65 20 29 3b 0a 20 20 7d 0a 20 20 72 zType );. }. r
5280: 65 74 75 72 6e 20 62 6c 6f 62 5f 62 75 66 66 65 eturn blob_buffe
5290: 72 28 26 62 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a r(&bl);.}../*.**
52a0: 20 43 4f 4d 4d 41 4e 44 3a 20 74 69 6d 65 6c 69 COMMAND: timeli
52b0: 6e 65 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 ne.**.** Usage:
52c0: 25 66 6f 73 73 69 6c 20 74 69 6d 65 6c 69 6e 65 %fossil timeline
52d0: 20 3f 57 48 45 4e 3f 20 3f 42 41 53 45 4c 49 4e ?WHEN? ?BASELIN
52e0: 45 7c 44 41 54 45 54 49 4d 45 3f 20 3f 2d 6e 7c E|DATETIME? ?-n|
52f0: 2d 2d 63 6f 75 6e 74 20 4e 3f 20 3f 2d 74 7c 2d --count N? ?-t|-
5300: 2d 74 79 70 65 20 54 59 50 45 3f 0a 2a 2a 0a 2a -type TYPE?.**.*
5310: 2a 20 50 72 69 6e 74 20 61 20 73 75 6d 6d 61 72 * Print a summar
5320: 79 20 6f 66 20 61 63 74 69 76 69 74 79 20 67 6f y of activity go
5330: 69 6e 67 20 62 61 63 6b 77 61 72 64 73 20 69 6e ing backwards in
5340: 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65 0a 2a date and time.*
5350: 2a 20 73 70 65 63 69 66 69 65 64 20 6f 72 20 66 * specified or f
5360: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 rom the current
5370: 64 61 74 65 20 61 6e 64 20 74 69 6d 65 20 69 66 date and time if
5380: 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a no arguments.**
5390: 20 61 72 65 20 67 69 76 65 6e 2e 20 20 53 68 6f are given. Sho
53a0: 77 20 61 73 20 6d 61 6e 79 20 61 73 20 4e 20 28 w as many as N (
53b0: 64 65 66 61 75 6c 74 20 32 30 29 20 63 68 65 63 default 20) chec
53c0: 6b 2d 69 6e 73 2e 20 20 54 68 65 0a 2a 2a 20 57 k-ins. The.** W
53d0: 48 45 4e 20 61 72 67 75 6d 65 6e 74 20 63 61 6e HEN argument can
53e0: 20 62 65 20 61 6e 79 20 75 6e 69 71 75 65 20 61 be any unique a
53f0: 62 62 72 65 76 69 61 74 69 6f 6e 20 6f 66 20 6f bbreviation of o
5400: 6e 65 20 6f 66 20 74 68 65 73 65 0a 2a 2a 20 6b ne of these.** k
5410: 65 79 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 eywords:.**.**
5420: 20 20 20 62 65 66 6f 72 65 0a 2a 2a 20 20 20 20 before.**
5430: 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 64 65 after.** de
5440: 73 63 65 6e 64 61 6e 74 73 20 7c 20 63 68 69 6c scendants | chil
5450: 64 72 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 63 65 dren.** ance
5460: 73 74 6f 72 73 20 7c 20 70 61 72 65 6e 74 73 0a stors | parents.
5470: 2a 2a 0a 2a 2a 20 54 68 65 20 42 41 53 45 4c 49 **.** The BASELI
5480: 4e 45 20 63 61 6e 20 62 65 20 61 6e 79 20 75 6e NE can be any un
5490: 69 71 75 65 20 70 72 65 66 69 78 20 6f 66 20 34 ique prefix of 4
54a0: 20 63 68 61 72 61 63 74 65 72 73 20 6f 72 20 6d characters or m
54b0: 6f 72 65 2e 0a 2a 2a 20 54 68 65 20 44 41 54 45 ore..** The DATE
54c0: 54 49 4d 45 20 73 68 6f 75 6c 64 20 62 65 20 69 TIME should be i
54d0: 6e 20 74 68 65 20 49 53 4f 38 36 30 31 20 66 6f n the ISO8601 fo
54e0: 72 6d 61 74 2e 20 20 46 6f 72 0a 2a 2a 20 65 78 rmat. For.** ex
54f0: 61 6d 70 6c 65 73 3a 20 22 32 30 30 37 2d 30 38 amples: "2007-08
5500: 2d 31 38 20 30 37 3a 32 31 3a 32 31 22 2e 20 20 -18 07:21:21".
5510: 59 6f 75 20 63 61 6e 20 61 6c 73 6f 20 73 61 79 You can also say
5520: 20 22 63 75 72 72 65 6e 74 22 0a 2a 2a 20 66 6f "current".** fo
5530: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 65 r the current ve
5540: 72 73 69 6f 6e 20 6f 72 20 22 6e 6f 77 22 20 66 rsion or "now" f
5550: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 or the current t
5560: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f ime..**.** The o
5570: 70 74 69 6f 6e 61 6c 20 54 59 50 45 20 61 72 67 ptional TYPE arg
5580: 75 6d 65 6e 74 20 6d 61 79 20 61 6e 79 20 74 79 ument may any ty
5590: 70 65 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 pes supported by
55a0: 20 74 68 65 20 2f 74 69 6d 65 6c 69 6e 65 0a 2a the /timeline.*
55b0: 2a 20 70 61 67 65 2e 20 46 6f 72 20 65 78 61 6d * page. For exam
55c0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 77 ple:.**.** w
55d0: 20 20 3d 20 77 69 6b 69 20 63 6f 6d 6d 69 74 73 = wiki commits
55e0: 20 6f 6e 6c 79 0a 2a 2a 20 20 20 20 20 63 69 20 only.** ci
55f0: 3d 20 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20 6f = file commits o
5600: 6e 6c 79 0a 2a 2a 20 20 20 20 20 74 20 20 3d 20 nly.** t =
5610: 74 69 63 6b 65 74 73 20 6f 6e 6c 79 0a 2a 2f 0a tickets only.*/.
5620: 76 6f 69 64 20 74 69 6d 65 6c 69 6e 65 5f 63 6d void timeline_cm
5630: 64 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 d(void){. Stmt
5640: 71 3b 0a 20 20 69 6e 74 20 6e 2c 20 6b 3b 0a 20 q;. int n, k;.
5650: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f const char *zCo
5660: 75 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 unt;. const cha
5670: 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63 68 61 72 r *zType;. char
5680: 20 2a 7a 4f 72 69 67 69 6e 3b 0a 20 20 63 68 61 *zOrigin;. cha
5690: 72 20 2a 7a 44 61 74 65 3b 0a 20 20 63 68 61 72 r *zDate;. char
56a0: 20 2a 7a 53 51 4c 3b 0a 20 20 69 6e 74 20 6f 62 *zSQL;. int ob
56b0: 6a 69 64 20 3d 20 30 3b 0a 20 20 42 6c 6f 62 20 jid = 0;. Blob
56c0: 75 75 69 64 3b 0a 20 20 69 6e 74 20 6d 6f 64 65 uuid;. int mode
56d0: 20 3d 20 31 20 3b 20 20 20 20 20 20 20 2f 2a 20 = 1 ; /*
56e0: 31 3a 20 62 65 66 6f 72 65 20 20 32 3a 61 66 74 1: before 2:aft
56f0: 65 72 20 20 33 3a 63 68 69 6c 64 72 65 6e 20 20 er 3:children
5700: 34 3a 70 61 72 65 6e 74 73 20 2a 2f 0a 20 20 64 4:parents */. d
5710: 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e 5f b_find_and_open_
5720: 72 65 70 6f 73 69 74 6f 72 79 28 31 29 3b 0a 20 repository(1);.
5730: 20 7a 43 6f 75 6e 74 20 3d 20 66 69 6e 64 5f 6f zCount = find_o
5740: 70 74 69 6f 6e 28 22 63 6f 75 6e 74 22 2c 22 6e ption("count","n
5750: 22 2c 31 29 3b 0a 20 20 7a 54 79 70 65 20 3d 20 ",1);. zType =
5760: 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 74 79 70 find_option("typ
5770: 65 22 2c 22 74 22 2c 31 29 3b 0a 20 20 69 66 28 e","t",1);. if(
5780: 20 7a 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 6e zCount ){. n
5790: 20 3d 20 61 74 6f 69 28 7a 43 6f 75 6e 74 29 3b = atoi(zCount);
57a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 20 . }else{. n
57b0: 3d 20 32 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 = 20;. }. if(
57c0: 67 2e 61 72 67 63 3e 3d 34 20 29 7b 0a 20 20 20 g.argc>=4 ){.
57d0: 20 6b 20 3d 20 73 74 72 6c 65 6e 28 67 2e 61 72 k = strlen(g.ar
57e0: 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 gv[2]);. if(
57f0: 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 strncmp(g.argv[2
5800: 5d 2c 22 62 65 66 6f 72 65 22 2c 6b 29 3d 3d 30 ],"before",k)==0
5810: 20 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d ){. mode =
5820: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 1;. }else if
5830: 28 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 ( strncmp(g.argv
5840: 5b 32 5d 2c 22 61 66 74 65 72 22 2c 6b 29 3d 3d [2],"after",k)==
5850: 30 20 26 26 20 6b 3e 31 20 29 7b 0a 20 20 20 20 0 && k>1 ){.
5860: 20 20 6d 6f 64 65 20 3d 20 32 3b 0a 20 20 20 20 mode = 2;.
5870: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d }else if( strncm
5880: 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 64 65 73 p(g.argv[2],"des
5890: 63 65 6e 64 61 6e 74 73 22 2c 6b 29 3d 3d 30 20 cendants",k)==0
58a0: 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 ){. mode =
58b0: 33 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 3;. }else if(
58c0: 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b strncmp(g.argv[
58d0: 32 5d 2c 22 63 68 69 6c 64 72 65 6e 22 2c 6b 29 2],"children",k)
58e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 6f 64 ==0 ){. mod
58f0: 65 20 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 e = 3;. }else
5900: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 67 2e 61 if( strncmp(g.a
5910: 72 67 76 5b 32 5d 2c 22 61 6e 63 65 73 74 6f 72 rgv[2],"ancestor
5920: 73 22 2c 6b 29 3d 3d 30 20 26 26 20 6b 3e 31 20 s",k)==0 && k>1
5930: 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 ){. mode =
5940: 34 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 4;. }else if(
5950: 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b strncmp(g.argv[
5960: 32 5d 2c 22 70 61 72 65 6e 74 73 22 2c 6b 29 3d 2],"parents",k)=
5970: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65 =0 ){. mode
5980: 20 3d 20 34 3b 0a 20 20 20 20 7d 65 6c 73 65 20 = 4;. }else
5990: 69 66 28 21 7a 54 79 70 65 20 26 26 20 21 7a 43 if(!zType && !zC
59a0: 6f 75 6e 74 29 7b 0a 20 20 20 20 20 20 75 73 61 ount){. usa
59b0: 67 65 28 22 3f 57 48 45 4e 3f 20 3f 42 41 53 45 ge("?WHEN? ?BASE
59c0: 4c 49 4e 45 7c 44 41 54 45 54 49 4d 45 3f 20 3f LINE|DATETIME? ?
59d0: 2d 6e 7c 2d 2d 63 6f 75 6e 74 20 4e 3f 20 3f 2d -n|--count N? ?-
59e0: 74 20 54 59 50 45 3f 22 29 3b 0a 20 20 20 20 7d t TYPE?");. }
59f0: 0a 20 20 20 20 69 66 28 20 27 2d 27 20 21 3d 20 . if( '-' !=
5a00: 2a 67 2e 61 72 67 76 5b 33 5d 20 29 7b 0a 09 7a *g.argv[3] ){..z
5a10: 4f 72 69 67 69 6e 20 3d 20 67 2e 61 72 67 76 5b Origin = g.argv[
5a20: 33 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 09 3];. }else{..
5a30: 7a 4f 72 69 67 69 6e 20 3d 20 22 6e 6f 77 22 3b zOrigin = "now";
5a40: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 . }. }else i
5a50: 66 28 20 67 2e 61 72 67 63 3d 3d 33 20 29 7b 0a f( g.argc==3 ){.
5a60: 20 20 20 20 7a 4f 72 69 67 69 6e 20 3d 20 67 2e zOrigin = g.
5a70: 61 72 67 76 5b 32 5d 3b 0a 20 20 7d 65 6c 73 65 argv[2];. }else
5a80: 7b 0a 20 20 20 20 7a 4f 72 69 67 69 6e 20 3d 20 {. zOrigin =
5a90: 22 6e 6f 77 22 3b 0a 20 20 7d 0a 20 20 6b 20 3d "now";. }. k =
5aa0: 20 73 74 72 6c 65 6e 28 7a 4f 72 69 67 69 6e 29 strlen(zOrigin)
5ab0: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 75 ;. blob_zero(&u
5ac0: 75 69 64 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 uid);. blob_app
5ad0: 65 6e 64 28 26 75 75 69 64 2c 20 7a 4f 72 69 67 end(&uuid, zOrig
5ae0: 69 6e 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20 73 in, -1);. if( s
5af0: 74 72 63 6d 70 28 7a 4f 72 69 67 69 6e 2c 20 22 trcmp(zOrigin, "
5b00: 6e 6f 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 now")==0 ){.
5b10: 69 66 28 20 6d 6f 64 65 3d 3d 33 20 7c 7c 20 6d if( mode==3 || m
5b20: 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 ode==4 ){.
5b30: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 63 61 fossil_fatal("ca
5b40: 6e 6e 6f 74 20 63 6f 6d 70 75 74 65 20 64 65 73 nnot compute des
5b50: 63 65 6e 64 61 6e 74 73 20 6f 72 20 61 6e 63 65 cendants or ance
5b60: 73 74 6f 72 73 20 6f 66 20 61 20 64 61 74 65 22 stors of a date"
5b70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 44 61 );. }. zDa
5b80: 74 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 28 53 te = mprintf("(S
5b90: 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28 27 ELECT datetime('
5ba0: 6e 6f 77 27 29 29 22 29 3b 0a 20 20 7d 65 6c 73 now'))");. }els
5bb0: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4f e if( strncmp(zO
5bc0: 72 69 67 69 6e 2c 20 22 63 75 72 72 65 6e 74 22 rigin, "current"
5bd0: 2c 20 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 , k)==0 ){. i
5be0: 66 28 20 21 67 2e 6c 6f 63 61 6c 4f 70 65 6e 20 f( !g.localOpen
5bf0: 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f ){. fossil_
5c00: 66 61 74 61 6c 28 22 6d 75 73 74 20 62 65 20 77 fatal("must be w
5c10: 69 74 68 69 6e 20 61 20 6c 6f 63 61 6c 20 63 68 ithin a local ch
5c20: 65 63 6b 6f 75 74 20 74 6f 20 75 73 65 20 27 63 eckout to use 'c
5c30: 75 72 72 65 6e 74 27 22 29 3b 0a 20 20 20 20 7d urrent'");. }
5c40: 0a 20 20 20 20 6f 62 6a 69 64 20 3d 20 64 62 5f . objid = db_
5c50: 6c 67 65 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f lget_int("checko
5c60: 75 74 22 2c 30 29 3b 0a 20 20 20 20 7a 44 61 74 ut",0);. zDat
5c70: 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 28 53 45 e = mprintf("(SE
5c80: 4c 45 43 54 20 6d 74 69 6d 65 20 46 52 4f 4d 20 LECT mtime FROM
5c90: 70 6c 69 6e 6b 20 57 48 45 52 45 20 63 69 64 3d plink WHERE cid=
5ca0: 25 64 29 22 2c 20 6f 62 6a 69 64 29 3b 0a 20 20 %d)", objid);.
5cb0: 7d 65 6c 73 65 20 69 66 28 20 6e 61 6d 65 5f 74 }else if( name_t
5cc0: 6f 5f 75 75 69 64 28 26 75 75 69 64 2c 20 30 29 o_uuid(&uuid, 0)
5cd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 62 6a 69 64 ==0 ){. objid
5ce0: 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 = db_int(0, "SE
5cf0: 4c 45 43 54 20 72 69 64 20 46 52 4f 4d 20 62 6c LECT rid FROM bl
5d00: 6f 62 20 57 48 45 52 45 20 75 75 69 64 3d 25 42 ob WHERE uuid=%B
5d10: 22 2c 20 26 75 75 69 64 29 3b 0a 20 20 20 20 7a ", &uuid);. z
5d20: 44 61 74 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 Date = mprintf("
5d30: 28 53 45 4c 45 43 54 20 6d 74 69 6d 65 20 46 52 (SELECT mtime FR
5d40: 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 63 OM plink WHERE c
5d50: 69 64 3d 25 64 29 22 2c 20 6f 62 6a 69 64 29 3b id=%d)", objid);
5d60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 . }else{. if
5d70: 28 20 6d 6f 64 65 3d 3d 33 20 7c 7c 20 6d 6f 64 ( mode==3 || mod
5d80: 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 66 6f e==4 ){. fo
5d90: 73 73 69 6c 5f 66 61 74 61 6c 28 22 63 61 6e 6e ssil_fatal("cann
5da0: 6f 74 20 63 6f 6d 70 75 74 65 20 64 65 73 63 65 ot compute desce
5db0: 6e 64 61 6e 74 73 20 6f 72 20 61 6e 63 65 73 74 ndants or ancest
5dc0: 6f 72 73 20 6f 66 20 61 20 64 61 74 65 22 29 3b ors of a date");
5dd0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 44 61 74 65 . }. zDate
5de0: 20 3d 20 6d 70 72 69 6e 74 66 28 22 28 53 45 4c = mprintf("(SEL
5df0: 45 43 54 20 6a 75 6c 69 61 6e 64 61 79 28 25 51 ECT julianday(%Q
5e00: 2c 20 27 75 74 63 27 29 29 22 2c 20 7a 4f 72 69 , 'utc'))", zOri
5e10: 67 69 6e 29 3b 0a 20 20 7d 0a 20 20 7a 53 51 4c gin);. }. zSQL
5e20: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 7a 20 41 = mprintf("%z A
5e30: 4e 44 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20 25 ND event.mtime %
5e40: 73 20 25 73 22 2c 0a 20 20 20 20 20 74 69 6d 65 s %s",. time
5e50: 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72 5f 74 line_query_for_t
5e60: 74 79 5f 6d 28 29 2c 0a 20 20 20 20 20 28 6d 6f ty_m(),. (mo
5e70: 64 65 3d 3d 31 20 7c 7c 20 6d 6f 64 65 3d 3d 34 de==1 || mode==4
5e80: 29 20 3f 20 22 3c 3d 22 20 3a 20 22 3e 3d 22 2c ) ? "<=" : ">=",
5e90: 0a 20 20 20 20 20 7a 44 61 74 65 0a 20 20 29 3b . zDate. );
5ea0: 0a 20 20 69 66 28 20 6d 6f 64 65 3d 3d 33 20 7c . if( mode==3 |
5eb0: 7c 20 6d 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 | mode==4 ){.
5ec0: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 db_multi_exec("
5ed0: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c CREATE TEMP TABL
5ee0: 45 20 6f 6b 28 72 69 64 20 49 4e 54 45 47 45 52 E ok(rid INTEGER
5ef0: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 22 29 3b PRIMARY KEY)");
5f00: 0a 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 33 . if( mode==3
5f10: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 ){. comput
5f20: 65 5f 64 65 73 63 65 6e 64 61 6e 74 73 28 6f 62 e_descendants(ob
5f30: 6a 69 64 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c jid, n);. }el
5f40: 73 65 7b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 se{. comput
5f50: 65 5f 61 6e 63 65 73 74 6f 72 73 28 6f 62 6a 69 e_ancestors(obji
5f60: 64 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 d, n);. }.
5f70: 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66 28 zSQL = mprintf(
5f80: 22 25 7a 20 41 4e 44 20 62 6c 6f 62 2e 72 69 64 "%z AND blob.rid
5f90: 20 49 4e 20 6f 6b 22 2c 20 7a 53 51 4c 29 3b 0a IN ok", zSQL);.
5fa0: 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20 }. if( zType
5fb0: 26 26 20 28 7a 54 79 70 65 5b 30 5d 21 3d 27 61 && (zType[0]!='a
5fc0: 27 29 20 29 7b 0a 20 20 20 20 20 20 7a 53 51 4c ') ){. zSQL
5fd0: 20 3d 20 6d 70 72 69 6e 74 66 28 20 22 25 7a 20 = mprintf( "%z
5fe0: 41 4e 44 20 65 76 65 6e 74 2e 74 79 70 65 3d 25 AND event.type=%
5ff0: 51 20 22 2c 20 7a 53 51 4c 2c 20 7a 54 79 70 65 Q ", zSQL, zType
6000: 29 3b 0a 20 20 7d 0a 0a 20 20 7a 53 51 4c 20 3d );. }.. zSQL =
6010: 20 6d 70 72 69 6e 74 66 28 22 25 7a 20 4f 52 44 mprintf("%z ORD
6020: 45 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d ER BY event.mtim
6030: 65 20 44 45 53 43 22 2c 20 7a 53 51 4c 29 3b 0a e DESC", zSQL);.
6040: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c db_prepare(&q,
6050: 20 7a 53 51 4c 29 3b 0a 20 20 66 72 65 65 28 20 zSQL);. free(
6060: 7a 53 51 4c 20 29 3b 0a 20 20 70 72 69 6e 74 5f zSQL );. print_
6070: 74 69 6d 65 6c 69 6e 65 28 26 71 2c 20 6e 29 3b timeline(&q, n);
6080: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 . db_finalize(&
6090: 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 q);.}../*.** Thi
60a0: 73 20 69 73 20 61 20 76 65 72 73 69 6f 6e 20 6f s is a version o
60b0: 66 20 74 68 65 20 22 6c 6f 63 61 6c 74 69 6d 65 f the "localtime
60c0: 28 29 22 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f ()" function fro
60d0: 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 0a 2a m the standard.*
60e0: 2a 20 43 20 6c 69 62 72 61 72 79 2e 20 20 49 74 * C library. It
60f0: 20 63 6f 6e 76 65 72 74 73 20 61 20 75 6e 69 78 converts a unix
6100: 20 74 69 6d 65 73 74 61 6d 70 20 28 73 65 63 6f timestamp (seco
6110: 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 29 20 nds since 1970)
6120: 69 6e 74 6f 0a 2a 2a 20 61 20 62 72 6f 6b 65 6e into.** a broken
6130: 2d 6f 75 74 20 6c 6f 63 61 6c 20 74 69 6d 65 20 -out local time
6140: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a structure..**.**
6150: 20 54 68 69 73 20 6d 6f 64 69 66 69 65 64 20 76 This modified v
6160: 65 72 73 69 6f 6e 20 6f 66 20 6c 6f 63 61 6c 74 ersion of localt
6170: 69 6d 65 28 29 20 77 6f 72 6b 73 20 6c 69 6b 65 ime() works like
6180: 20 74 68 65 20 6c 69 62 72 61 72 79 20 6c 6f 63 the library loc
6190: 61 6c 74 69 6d 65 28 29 0a 2a 2a 20 62 79 20 64 altime().** by d
61a0: 65 66 61 75 6c 74 2e 20 20 45 78 63 65 70 74 20 efault. Except
61b0: 69 66 20 74 68 65 20 74 69 6d 65 6c 69 6e 65 2d if the timeline-
61c0: 75 74 63 20 70 72 6f 70 65 72 74 79 20 69 73 20 utc property is
61d0: 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e set, this routin
61e0: 65 0a 2a 2a 20 75 73 65 73 20 67 6d 74 74 69 6d e.** uses gmttim
61f0: 65 28 29 20 69 6e 73 74 65 61 64 2e 20 20 54 68 e() instead. Th
6200: 75 73 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 us by setting th
6210: 65 20 74 69 6d 65 6c 69 6e 65 2d 75 74 63 20 70 e timeline-utc p
6220: 72 6f 70 65 72 74 79 2c 20 77 65 0a 2a 2a 20 63 roperty, we.** c
6230: 61 6e 20 67 65 74 20 61 6c 6c 20 6c 6f 63 61 6c an get all local
6240: 74 69 6d 65 73 20 74 6f 20 62 65 20 64 69 73 70 times to be disp
6250: 6c 61 79 65 64 20 61 74 20 55 54 43 20 74 69 6d layed at UTC tim
6260: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 74 6d 20 e..*/.struct tm
6270: 2a 66 6f 73 73 69 6c 5f 6c 6f 63 61 6c 74 69 6d *fossil_localtim
6280: 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a e(const time_t *
6290: 63 6c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 67 2e clock){. if( g.
62a0: 66 54 69 6d 65 46 6f 72 6d 61 74 3d 3d 30 20 29 fTimeFormat==0 )
62b0: 7b 0a 20 20 20 20 69 66 28 20 64 62 5f 67 65 74 {. if( db_get
62c0: 5f 69 6e 74 28 22 74 69 6d 65 6c 69 6e 65 2d 75 _int("timeline-u
62d0: 74 63 22 2c 20 31 29 20 29 7b 0a 20 20 20 20 20 tc", 1) ){.
62e0: 20 67 2e 66 54 69 6d 65 46 6f 72 6d 61 74 20 3d g.fTimeFormat =
62f0: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 1;. }else{.
6300: 20 20 20 20 20 67 2e 66 54 69 6d 65 46 6f 72 6d g.fTimeForm
6310: 61 74 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 at = 2;. }.
6320: 7d 0a 20 20 69 66 28 20 67 2e 66 54 69 6d 65 46 }. if( g.fTimeF
6330: 6f 72 6d 61 74 3d 3d 31 20 29 7b 0a 20 20 20 20 ormat==1 ){.
6340: 72 65 74 75 72 6e 20 67 6d 74 69 6d 65 28 63 6c return gmtime(cl
6350: 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 ock);. }else{.
6360: 20 20 20 72 65 74 75 72 6e 20 6c 6f 63 61 6c 74 return localt
6370: 69 6d 65 28 63 6c 6f 63 6b 29 3b 0a 20 20 7d 0a ime(clock);. }.
6380: 7d 0a }.