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 47 65 6e 65 72 61 74 65 20 ./*.** Generate
0930: 61 20 68 79 70 65 72 6c 69 6e 6b 20 74 6f 20 61 a hyperlink to a
0940: 20 64 61 74 65 20 26 20 74 69 6d 65 2e 0a 2a 2f date & time..*/
0950: 0a 76 6f 69 64 20 68 79 70 65 72 6c 69 6e 6b 5f .void hyperlink_
0960: 74 6f 5f 64 61 74 65 28 63 6f 6e 73 74 20 63 68 to_date(const ch
0970: 61 72 20 2a 7a 44 61 74 65 2c 20 63 6f 6e 73 74 ar *zDate, const
0980: 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78 29 7b char *zSuffix){
0990: 0a 20 20 69 66 28 20 7a 53 75 66 66 69 78 3d 3d . if( zSuffix==
09a0: 30 20 29 20 7a 53 75 66 66 69 78 20 3d 20 22 22 0 ) zSuffix = ""
09b0: 3b 0a 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 ;. if( g.okHist
09c0: 6f 72 79 20 29 7b 0a 20 20 20 20 40 20 3c 61 20 ory ){. @ <a
09d0: 68 72 65 66 3d 22 25 73 28 67 2e 7a 54 6f 70 29 href="%s(g.zTop)
09e0: 2f 74 69 6d 65 6c 69 6e 65 3f 63 3d 25 54 28 7a /timeline?c=%T(z
09f0: 44 61 74 65 29 22 3e 25 73 28 7a 44 61 74 65 29 Date)">%s(zDate)
0a00: 3c 2f 61 3e 25 73 28 7a 53 75 66 66 69 78 29 0a </a>%s(zSuffix).
0a10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 25 }else{. @ %
0a20: 73 28 7a 44 61 74 65 29 25 73 28 7a 53 75 66 66 s(zDate)%s(zSuff
0a30: 69 78 29 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a ix). }.}../*.**
0a40: 20 47 65 6e 65 72 61 74 65 20 61 20 68 79 70 65 Generate a hype
0a50: 72 6c 69 6e 6b 20 74 6f 20 61 20 75 73 65 72 2e rlink to a user.
0a60: 20 20 54 68 69 73 20 77 69 6c 6c 20 6c 69 6e 6b This will link
0a70: 20 74 6f 20 61 20 74 69 6d 65 6c 69 6e 65 20 73 to a timeline s
0a80: 68 6f 77 69 6e 67 0a 2a 2a 20 65 76 65 6e 74 73 howing.** events
0a90: 20 62 79 20 74 68 61 74 20 75 73 65 72 2e 20 20 by that user.
0aa0: 49 66 20 74 68 65 20 64 61 74 65 2b 74 69 6d 65 If the date+time
0ab0: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 is specified, t
0ac0: 68 65 6e 20 74 68 65 20 74 69 6d 65 6c 69 6e 65 hen the timeline
0ad0: 0a 2a 2a 20 69 73 20 63 65 6e 74 65 72 65 64 20 .** is centered
0ae0: 6f 6e 20 74 68 61 74 20 64 61 74 65 2b 74 69 6d on that date+tim
0af0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 68 79 70 65 72 e..*/.void hyper
0b00: 6c 69 6e 6b 5f 74 6f 5f 75 73 65 72 28 63 6f 6e link_to_user(con
0b10: 73 74 20 63 68 61 72 20 2a 7a 55 2c 20 63 6f 6e st char *zU, con
0b20: 73 74 20 63 68 61 72 20 2a 7a 44 2c 20 63 6f 6e st char *zD, con
0b30: 73 74 20 63 68 61 72 20 2a 7a 53 75 66 29 7b 0a st char *zSuf){.
0b40: 20 20 69 66 28 20 7a 53 75 66 3d 3d 30 20 29 20 if( zSuf==0 )
0b50: 7a 53 75 66 20 3d 20 22 22 3b 0a 20 20 69 66 28 zSuf = "";. if(
0b60: 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a g.okHistory ){.
0b70: 20 20 20 20 69 66 28 20 7a 44 20 26 26 20 7a 44 if( zD && zD
0b80: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 40 20 3c [0] ){. @ <
0b90: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 54 6f a href="%s(g.zTo
0ba0: 70 29 2f 74 69 6d 65 6c 69 6e 65 3f 63 3d 25 54 p)/timeline?c=%T
0bb0: 28 7a 44 29 26 75 3d 25 54 28 7a 55 29 22 3e 25 (zD)&u=%T(zU)">%
0bc0: 68 28 7a 55 29 3c 2f 61 3e 25 73 28 7a 53 75 66 h(zU)</a>%s(zSuf
0bd0: 29 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ). }else{.
0be0: 20 20 20 40 20 3c 61 20 68 72 65 66 3d 22 25 73 @ <a href="%s
0bf0: 28 67 2e 7a 54 6f 70 29 2f 74 69 6d 65 6c 69 6e (g.zTop)/timelin
0c00: 65 3f 75 3d 25 54 28 7a 55 29 22 3e 25 68 28 7a e?u=%T(zU)">%h(z
0c10: 55 29 3c 2f 61 3e 25 73 28 7a 53 75 66 29 0a 20 U)</a>%s(zSuf).
0c20: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 }. }else{.
0c30: 20 20 40 20 25 73 28 7a 55 29 0a 20 20 7d 0a 7d @ %s(zU). }.}
0c40: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 ../*.** Count th
0c50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 69 6d e number of prim
0c60: 61 72 79 20 6e 6f 6e 2d 62 72 61 6e 63 68 20 63 ary non-branch c
0c70: 68 69 6c 64 72 65 6e 20 66 6f 72 20 74 68 65 20 hildren for the
0c80: 67 69 76 65 6e 20 63 68 65 63 6b 2d 69 6e 2e 0a given check-in..
0c90: 2a 2a 0a 2a 2a 20 41 20 70 72 69 6d 61 72 79 20 **.** A primary
0ca0: 63 68 69 6c 64 20 69 73 20 6f 6e 65 20 77 68 65 child is one whe
0cb0: 72 65 20 74 68 65 20 70 61 72 65 6e 74 20 69 73 re the parent is
0cc0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 70 61 72 the primary par
0cd0: 65 6e 74 2c 20 6e 6f 74 0a 2a 2a 20 61 20 6d 65 ent, not.** a me
0ce0: 72 67 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a rge parent..**.*
0cf0: 2a 20 41 20 6e 6f 6e 2d 62 72 61 6e 63 68 20 63 * A non-branch c
0d00: 68 69 6c 64 20 69 73 20 6f 6e 65 20 77 68 69 63 hild is one whic
0d10: 68 20 69 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 h is on the same
0d20: 20 62 72 61 6e 63 68 20 61 73 20 74 68 65 20 70 branch as the p
0d30: 61 72 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 63 6f arent..*/.int co
0d40: 75 6e 74 5f 6e 6f 6e 62 72 61 6e 63 68 5f 63 68 unt_nonbranch_ch
0d50: 69 6c 64 72 65 6e 28 69 6e 74 20 70 69 64 29 7b ildren(int pid){
0d60: 0a 20 20 69 6e 74 20 6e 4e 6f 6e 42 72 61 6e 63 . int nNonBranc
0d70: 68 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 h;. static cons
0d80: 74 20 63 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 t char zSql[] =
0d90: 0a 20 20 20 20 40 20 53 45 4c 45 43 54 20 63 6f . @ SELECT co
0da0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 6c 69 6e unt(*) FROM plin
0db0: 6b 0a 20 20 20 20 40 20 20 57 48 45 52 45 20 70 k. @ WHERE p
0dc0: 69 64 3d 25 64 20 41 4e 44 20 69 73 70 72 69 6d id=%d AND isprim
0dd0: 0a 20 20 20 20 40 20 20 20 20 41 4e 44 20 63 6f . @ AND co
0de0: 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54 20 76 alesce((SELECT v
0df0: 61 6c 75 65 20 46 52 4f 4d 20 74 61 67 78 72 65 alue FROM tagxre
0e00: 66 0a 20 20 20 20 40 20 20 20 20 20 20 20 20 20 f. @
0e10: 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20 WHERE
0e20: 74 61 67 69 64 3d 25 64 20 41 4e 44 20 72 69 64 tagid=%d AND rid
0e30: 3d 70 6c 69 6e 6b 2e 70 69 64 29 2c 20 27 74 72 =plink.pid), 'tr
0e40: 75 6e 6b 27 29 0a 20 20 20 20 40 20 20 20 20 20 unk'). @
0e50: 20 20 3d 63 6f 61 6c 65 73 63 65 28 28 53 45 4c =coalesce((SEL
0e60: 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 74 ECT value FROM t
0e70: 61 67 78 72 65 66 0a 20 20 20 20 40 20 20 20 20 agxref. @
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 W
0e90: 48 45 52 45 20 74 61 67 69 64 3d 25 64 20 41 4e HERE tagid=%d AN
0ea0: 44 20 72 69 64 3d 70 6c 69 6e 6b 2e 63 69 64 29 D rid=plink.cid)
0eb0: 2c 20 27 74 72 75 6e 6b 27 29 0a 20 20 3b 0a 20 , 'trunk'). ;.
0ec0: 20 6e 4e 6f 6e 42 72 61 6e 63 68 20 3d 20 64 62 nNonBranch = db
0ed0: 5f 69 6e 74 28 30 2c 20 7a 53 71 6c 2c 20 70 69 _int(0, zSql, pi
0ee0: 64 2c 20 54 41 47 5f 42 52 41 4e 43 48 2c 20 54 d, TAG_BRANCH, T
0ef0: 41 47 5f 42 52 41 4e 43 48 29 3b 0a 20 20 72 65 AG_BRANCH);. re
0f00: 74 75 72 6e 20 6e 4e 6f 6e 42 72 61 6e 63 68 3b turn nNonBranch;
0f10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 .}../*.** Allowe
0f20: 64 20 66 6c 61 67 73 20 66 6f 72 20 74 68 65 20 d flags for the
0f30: 74 6d 46 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 tmFlags argument
0f40: 20 74 6f 20 77 77 77 5f 70 72 69 6e 74 5f 74 69 to www_print_ti
0f50: 6d 65 6c 69 6e 65 0a 2a 2f 0a 23 69 66 20 49 4e meline.*/.#if IN
0f60: 54 45 52 46 41 43 45 0a 23 64 65 66 69 6e 65 20 TERFACE.#define
0f70: 54 49 4d 45 4c 49 4e 45 5f 41 52 54 49 44 20 20 TIMELINE_ARTID
0f80: 20 20 30 78 30 30 30 31 20 20 2f 2a 20 53 68 6f 0x0001 /* Sho
0f90: 77 20 61 72 74 69 66 61 63 74 20 49 44 73 20 6f w artifact IDs o
0fa0: 6e 20 6e 6f 6e 2d 63 68 65 63 6b 2d 69 6e 20 6c n non-check-in l
0fb0: 69 6e 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 ines */.#define
0fc0: 54 49 4d 45 4c 49 4e 45 5f 4c 45 41 46 4f 4e 4c TIMELINE_LEAFONL
0fd0: 59 20 30 78 30 30 30 32 20 20 2f 2a 20 53 68 6f Y 0x0002 /* Sho
0fe0: 77 20 22 4c 65 61 66 22 2c 20 62 75 74 20 6e 6f w "Leaf", but no
0ff0: 74 20 22 4d 65 72 67 65 22 2c 20 22 46 6f 72 6b t "Merge", "Fork
1000: 22 20 65 74 63 20 2a 2f 0a 23 65 6e 64 69 66 0a " etc */.#endif.
1010: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 ./*.** Output a
1020: 74 69 6d 65 6c 69 6e 65 20 69 6e 20 74 68 65 20 timeline in the
1030: 77 65 62 20 66 6f 72 6d 61 74 20 67 69 76 65 6e web format given
1040: 20 61 20 71 75 65 72 79 2e 20 20 54 68 65 20 71 a query. The q
1050: 75 65 72 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 72 uery.** should r
1060: 65 74 75 72 6e 20 74 68 65 73 65 20 63 6f 6c 75 eturn these colu
1070: 6d 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 2e mns:.**.** 0.
1080: 20 20 72 69 64 0a 2a 2a 20 20 20 20 31 2e 20 20 rid.** 1.
1090: 55 55 49 44 0a 2a 2a 20 20 20 20 32 2e 20 20 44 UUID.** 2. D
10a0: 61 74 65 2f 54 69 6d 65 0a 2a 2a 20 20 20 20 33 ate/Time.** 3
10b0: 2e 20 20 43 6f 6d 6d 65 6e 74 20 73 74 72 69 6e . Comment strin
10c0: 67 0a 2a 2a 20 20 20 20 34 2e 20 20 55 73 65 72 g.** 4. User
10d0: 0a 2a 2a 20 20 20 20 35 2e 20 20 4e 75 6d 62 65 .** 5. Numbe
10e0: 72 20 6f 66 20 6e 6f 6e 2d 6d 65 72 67 65 20 63 r of non-merge c
10f0: 68 69 6c 64 72 65 6e 0a 2a 2a 20 20 20 20 36 2e hildren.** 6.
1100: 20 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 65 Number of pare
1110: 6e 74 73 0a 2a 2a 20 20 20 20 37 2e 20 20 54 72 nts.** 7. Tr
1120: 75 65 20 69 66 20 69 73 20 61 20 6c 65 61 66 0a ue if is a leaf.
1130: 2a 2a 20 20 20 20 38 2e 20 20 62 61 63 6b 67 72 ** 8. backgr
1140: 6f 75 6e 64 20 63 6f 6c 6f 72 0a 2a 2a 20 20 20 ound color.**
1150: 20 39 2e 20 20 74 79 70 65 20 28 22 63 69 22 2c 9. type ("ci",
1160: 20 22 77 22 29 0a 2a 2a 20 20 20 31 30 2e 20 20 "w").** 10.
1170: 6c 69 73 74 20 6f 66 20 73 79 6d 62 6f 6c 69 63 list of symbolic
1180: 20 74 61 67 73 2e 0a 2a 2f 0a 76 6f 69 64 20 77 tags..*/.void w
1190: 77 77 5f 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e ww_print_timelin
11a0: 65 28 0a 20 20 53 74 6d 74 20 2a 70 51 75 65 72 e(. Stmt *pQuer
11b0: 79 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 y, /* Q
11c0: 75 65 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e uery to implemen
11d0: 74 20 74 68 65 20 74 69 6d 65 6c 69 6e 65 20 2a t the timeline *
11e0: 2f 0a 20 20 69 6e 74 20 74 6d 46 6c 61 67 73 2c /. int tmFlags,
11f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c /* Fl
1200: 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 ags controlling
1210: 64 69 73 70 6c 61 79 20 62 65 68 61 76 69 6f 72 display behavior
1220: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 45 78 */. void (*xEx
1230: 74 72 61 29 28 69 6e 74 29 20 20 20 20 2f 2a 20 tra)(int) /*
1240: 52 6f 75 74 69 6e 65 20 74 6f 20 63 61 6c 6c 20 Routine to call
1250: 6f 6e 20 65 61 63 68 20 6c 69 6e 65 20 6f 66 20 on each line of
1260: 64 69 73 70 6c 61 79 20 2a 2f 0a 29 7b 0a 20 20 display */.){.
1270: 69 6e 74 20 77 69 6b 69 46 6c 61 67 73 3b 0a 20 int wikiFlags;.
1280: 20 69 6e 74 20 6d 78 57 69 6b 69 4c 65 6e 3b 0a int mxWikiLen;.
1290: 20 20 42 6c 6f 62 20 63 6f 6d 6d 65 6e 74 3b 0a Blob comment;.
12a0: 20 20 63 68 61 72 20 7a 50 72 65 76 44 61 74 65 char zPrevDate
12b0: 5b 32 30 5d 3b 0a 20 20 7a 50 72 65 76 44 61 74 [20];. zPrevDat
12c0: 65 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 6d 78 57 e[0] = 0;.. mxW
12d0: 69 6b 69 4c 65 6e 20 3d 20 64 62 5f 67 65 74 5f ikiLen = db_get_
12e0: 69 6e 74 28 22 74 69 6d 65 6c 69 6e 65 2d 6d 61 int("timeline-ma
12f0: 78 2d 63 6f 6d 6d 65 6e 74 22 2c 20 30 29 3b 0a x-comment", 0);.
1300: 20 20 69 66 28 20 64 62 5f 67 65 74 5f 62 6f 6f if( db_get_boo
1310: 6c 65 61 6e 28 22 74 69 6d 65 6c 69 6e 65 2d 62 lean("timeline-b
1320: 6c 6f 63 6b 2d 6d 61 72 6b 75 70 22 2c 20 30 29 lock-markup", 0)
1330: 20 29 7b 0a 20 20 20 20 77 69 6b 69 46 6c 61 67 ){. wikiFlag
1340: 73 20 3d 20 57 49 4b 49 5f 49 4e 4c 49 4e 45 3b s = WIKI_INLINE;
1350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 . }else{. wi
1360: 6b 69 46 6c 61 67 73 20 3d 20 57 49 4b 49 5f 49 kiFlags = WIKI_I
1370: 4e 4c 49 4e 45 20 7c 20 57 49 4b 49 5f 4e 4f 42 NLINE | WIKI_NOB
1380: 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 20 20 64 62 5f LOCK;. }.. db_
1390: 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 multi_exec(.
13a0: 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 "CREATE TEMP TA
13b0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 BLE IF NOT EXIST
13c0: 53 20 73 65 65 6e 28 72 69 64 20 49 4e 54 45 47 S seen(rid INTEG
13d0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b ER PRIMARY KEY);
13e0: 22 0a 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 ". "DELETE F
13f0: 52 4f 4d 20 73 65 65 6e 3b 22 0a 20 20 29 3b 0a ROM seen;". );.
1400: 20 20 40 20 3c 74 61 62 6c 65 20 63 65 6c 6c 73 @ <table cells
1410: 70 61 63 69 6e 67 3d 30 20 62 6f 72 64 65 72 3d pacing=0 border=
1420: 30 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d 30 3e 0 cellpadding=0>
1430: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 6f . blob_zero(&co
1440: 6d 6d 65 6e 74 29 3b 0a 20 20 77 68 69 6c 65 28 mment);. while(
1450: 20 64 62 5f 73 74 65 70 28 70 51 75 65 72 79 29 db_step(pQuery)
1460: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a ==SQLITE_ROW ){.
1470: 20 20 20 20 69 6e 74 20 72 69 64 20 3d 20 64 62 int rid = db
1480: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 51 75 65 _column_int(pQue
1490: 72 79 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 ry, 0);. cons
14a0: 74 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 t char *zUuid =
14b0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 db_column_text(p
14c0: 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 69 Query, 1);. i
14d0: 6e 74 20 6e 50 43 68 69 6c 64 20 3d 20 64 62 5f nt nPChild = db_
14e0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 51 75 65 72 column_int(pQuer
14f0: 79 2c 20 35 29 3b 0a 20 20 20 20 69 6e 74 20 6e y, 5);. int n
1500: 50 61 72 65 6e 74 20 3d 20 64 62 5f 63 6f 6c 75 Parent = db_colu
1510: 6d 6e 5f 69 6e 74 28 70 51 75 65 72 79 2c 20 36 mn_int(pQuery, 6
1520: 29 3b 0a 20 20 20 20 69 6e 74 20 69 73 4c 65 61 );. int isLea
1530: 66 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e f = db_column_in
1540: 74 28 70 51 75 65 72 79 2c 20 37 29 3b 0a 20 20 t(pQuery, 7);.
1550: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 const char *zB
1560: 67 43 6c 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e gClr = db_column
1570: 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 38 29 _text(pQuery, 8)
1580: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
1590: 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c *zDate = db_col
15a0: 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c umn_text(pQuery,
15b0: 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 2);. const c
15c0: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 64 62 5f har *zType = db_
15d0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 column_text(pQue
15e0: 72 79 2c 20 39 29 3b 0a 20 20 20 20 63 6f 6e 73 ry, 9);. cons
15f0: 74 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 t char *zUser =
1600: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 db_column_text(p
1610: 51 75 65 72 79 2c 20 34 29 3b 0a 20 20 20 20 63 Query, 4);. c
1620: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 67 4c onst char *zTagL
1630: 69 73 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f ist = db_column_
1640: 74 65 78 74 28 70 51 75 65 72 79 2c 20 31 30 29 text(pQuery, 10)
1650: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 ;. if( strcmp
1660: 28 7a 54 79 70 65 2c 22 64 69 76 22 29 3d 3d 30 (zType,"div")==0
1670: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e ){. @ <tr>
1680: 3c 74 64 20 63 6f 6c 73 70 61 6e 3d 33 3e 3c 68 <td colspan=3><h
1690: 72 3e 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 r></td></tr>.
16a0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 continue;.
16b0: 20 7d 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f }. db_multi_
16c0: 65 78 65 63 28 22 49 4e 53 45 52 54 20 4f 52 20 exec("INSERT OR
16d0: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 73 65 65 6e IGNORE INTO seen
16e0: 20 56 41 4c 55 45 53 28 25 64 29 22 2c 20 72 69 VALUES(%d)", ri
16f0: 64 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 d);. if( memc
1700: 6d 70 28 7a 44 61 74 65 2c 20 7a 50 72 65 76 44 mp(zDate, zPrevD
1710: 61 74 65 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 ate, 10) ){.
1720: 20 20 73 70 72 69 6e 74 66 28 7a 50 72 65 76 44 sprintf(zPrevD
1730: 61 74 65 2c 20 22 25 2e 31 30 73 22 2c 20 7a 44 ate, "%.10s", zD
1740: 61 74 65 29 3b 0a 20 20 20 20 20 20 40 20 3c 74 ate);. @ <t
1750: 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e 3d 33 3e r><td colspan=3>
1760: 0a 20 20 20 20 20 20 40 20 20 20 3c 64 69 76 20 . @ <div
1770: 63 6c 61 73 73 3d 22 64 69 76 69 64 65 72 22 3e class="divider">
1780: 25 73 28 7a 50 72 65 76 44 61 74 65 29 3c 2f 64 %s(zPrevDate)</d
1790: 69 76 3e 0a 20 20 20 20 20 20 40 20 3c 2f 74 64 iv>. @ </td
17a0: 3e 3c 2f 74 72 3e 0a 20 20 20 20 7d 0a 20 20 20 ></tr>. }.
17b0: 20 40 20 3c 74 72 3e 0a 20 20 20 20 40 20 3c 74 @ <tr>. @ <t
17c0: 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 25 d valign="top">%
17d0: 73 28 26 7a 44 61 74 65 5b 31 31 5d 29 3c 2f 74 s(&zDate[11])</t
17e0: 64 3e 0a 20 20 20 20 40 20 3c 74 64 20 77 69 64 d>. @ <td wid
17f0: 74 68 3d 22 32 30 22 20 61 6c 69 67 6e 3d 22 63 th="20" align="c
1800: 65 6e 74 65 72 22 20 76 61 6c 69 67 6e 3d 22 74 enter" valign="t
1810: 6f 70 22 3e 0a 20 20 20 20 40 20 3c 66 6f 6e 74 op">. @ <font
1820: 20 69 64 3d 22 6d 25 64 28 72 69 64 29 22 20 73 id="m%d(rid)" s
1830: 69 7a 65 3d 22 2b 31 22 20 63 6f 6c 6f 72 3d 22 ize="+1" color="
1840: 77 68 69 74 65 22 3e 2a 3c 2f 66 6f 6e 74 3e 3c white">*</font><
1850: 2f 74 64 3e 0a 20 20 20 20 69 66 28 20 7a 42 67 /td>. if( zBg
1860: 43 6c 72 20 26 26 20 7a 42 67 43 6c 72 5b 30 5d Clr && zBgClr[0]
1870: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 74 64 20 ){. @ <td
1880: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 20 61 6c 69 valign="top" ali
1890: 67 6e 3d 22 6c 65 66 74 22 20 62 67 63 6f 6c 6f gn="left" bgcolo
18a0: 72 3d 22 25 68 28 7a 42 67 43 6c 72 29 22 3e 0a r="%h(zBgClr)">.
18b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
18c0: 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 @ <td valign="t
18d0: 6f 70 22 20 61 6c 69 67 6e 3d 22 6c 65 66 74 22 op" align="left"
18e0: 3e 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 >. }. if(
18f0: 7a 54 79 70 65 5b 30 5d 3d 3d 27 63 27 20 29 7b zType[0]=='c' ){
1900: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 . const cha
1910: 72 20 2a 61 7a 54 61 67 5b 35 5d 3b 0a 20 20 20 r *azTag[5];.
1920: 20 20 20 69 6e 74 20 6e 54 61 67 20 3d 20 30 3b int nTag = 0;
1930: 0a 20 20 20 20 20 20 68 79 70 65 72 6c 69 6e 6b . hyperlink
1940: 5f 74 6f 5f 75 75 69 64 5f 77 69 74 68 5f 6d 6f _to_uuid_with_mo
1950: 75 73 65 6f 76 65 72 28 7a 55 75 69 64 2c 20 22 useover(zUuid, "
1960: 78 69 6e 22 2c 20 22 78 6f 75 74 22 2c 20 72 69 xin", "xout", ri
1970: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 74 d);. if( (t
1980: 6d 46 6c 61 67 73 20 26 20 54 49 4d 45 4c 49 4e mFlags & TIMELIN
1990: 45 5f 4c 45 41 46 4f 4e 4c 59 29 3d 3d 30 20 29 E_LEAFONLY)==0 )
19a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 {. if( nP
19b0: 61 72 65 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 arent>1 ){.
19c0: 20 20 20 20 20 61 7a 54 61 67 5b 6e 54 61 67 2b azTag[nTag+
19d0: 2b 5d 20 3d 20 22 4d 65 72 67 65 22 3b 0a 20 20 +] = "Merge";.
19e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
19f0: 69 66 28 20 6e 50 43 68 69 6c 64 3e 31 20 29 7b if( nPChild>1 ){
1a00: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 . if( c
1a10: 6f 75 6e 74 5f 6e 6f 6e 62 72 61 6e 63 68 5f 63 ount_nonbranch_c
1a20: 68 69 6c 64 72 65 6e 28 72 69 64 29 3e 31 20 29 hildren(rid)>1 )
1a30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a {. az
1a40: 54 61 67 5b 6e 54 61 67 2b 2b 5d 20 3d 20 22 46 Tag[nTag++] = "F
1a50: 6f 72 6b 22 3b 0a 20 20 20 20 20 20 20 20 20 20 ork";.
1a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 }else{.
1a70: 20 20 20 61 7a 54 61 67 5b 6e 54 61 67 2b 2b 5d azTag[nTag++]
1a80: 20 3d 20 22 42 72 61 6e 63 68 2d 50 6f 69 6e 74 = "Branch-Point
1a90: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 ";. }.
1aa0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d }. }
1ab0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4c 65 61 . if( isLea
1ac0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 f ){. if(
1ad0: 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 db_exists("SELE
1ae0: 43 54 20 31 20 46 52 4f 4d 20 74 61 67 78 72 65 CT 1 FROM tagxre
1af0: 66 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 f".
1b00: 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 " WHERE
1b10: 20 72 69 64 3d 25 64 20 41 4e 44 20 74 61 67 69 rid=%d AND tagi
1b20: 64 3d 25 64 20 41 4e 44 20 74 61 67 74 79 70 65 d=%d AND tagtype
1b30: 3e 30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 >0",.
1b40: 20 20 20 20 20 20 20 20 20 20 20 72 69 64 2c 20 rid,
1b50: 54 41 47 5f 43 4c 4f 53 45 44 29 20 29 7b 0a 20 TAG_CLOSED) ){.
1b60: 20 20 20 20 20 20 20 20 20 61 7a 54 61 67 5b 6e azTag[n
1b70: 54 61 67 2b 2b 5d 20 3d 20 22 43 6c 6f 73 65 64 Tag++] = "Closed
1b80: 2d 4c 65 61 66 22 3b 0a 20 20 20 20 20 20 20 20 -Leaf";.
1b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 }else{.
1ba0: 20 61 7a 54 61 67 5b 6e 54 61 67 2b 2b 5d 20 3d azTag[nTag++] =
1bb0: 20 22 4c 65 61 66 22 3b 0a 20 20 20 20 20 20 20 "Leaf";.
1bc0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }. }.
1bd0: 20 69 66 28 20 6e 54 61 67 3e 30 20 29 7b 0a 20 if( nTag>0 ){.
1be0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 int i;.
1bf0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 for(i=0; i
1c00: 3c 6e 54 61 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 <nTag; i++){.
1c10: 20 20 20 20 20 20 20 40 20 3c 62 3e 25 73 28 61 @ <b>%s(a
1c20: 7a 54 61 67 5b 69 5d 29 25 73 28 69 3d 3d 6e 54 zTag[i])%s(i==nT
1c30: 61 67 2d 31 3f 22 22 3a 22 2c 22 29 3c 2f 62 3e ag-1?"":",")</b>
1c40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
1c50: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 }. }else if(
1c60: 20 28 74 6d 46 6c 61 67 73 20 26 20 54 49 4d 45 (tmFlags & TIME
1c70: 4c 49 4e 45 5f 41 52 54 49 44 29 21 3d 30 20 29 LINE_ARTID)!=0 )
1c80: 7b 0a 20 20 20 20 20 20 68 79 70 65 72 6c 69 6e {. hyperlin
1c90: 6b 5f 74 6f 5f 75 75 69 64 28 7a 55 75 69 64 29 k_to_uuid(zUuid)
1ca0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 63 ;. }. db_c
1cb0: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72 olumn_blob(pQuer
1cc0: 79 2c 20 33 2c 20 26 63 6f 6d 6d 65 6e 74 29 3b y, 3, &comment);
1cd0: 0a 20 20 20 20 69 66 28 20 6d 78 57 69 6b 69 4c . if( mxWikiL
1ce0: 65 6e 3e 30 20 26 26 20 62 6c 6f 62 5f 73 69 7a en>0 && blob_siz
1cf0: 65 28 26 63 6f 6d 6d 65 6e 74 29 3e 6d 78 57 69 e(&comment)>mxWi
1d00: 6b 69 4c 65 6e 20 29 7b 0a 20 20 20 20 20 20 42 kiLen ){. B
1d10: 6c 6f 62 20 74 72 75 6e 63 61 74 65 64 3b 0a 20 lob truncated;.
1d20: 20 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 blob_zero(&
1d30: 74 72 75 6e 63 61 74 65 64 29 3b 0a 20 20 20 20 truncated);.
1d40: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 74 blob_append(&t
1d50: 72 75 6e 63 61 74 65 64 2c 20 62 6c 6f 62 5f 62 runcated, blob_b
1d60: 75 66 66 65 72 28 26 63 6f 6d 6d 65 6e 74 29 2c uffer(&comment),
1d70: 20 6d 78 57 69 6b 69 4c 65 6e 29 3b 0a 20 20 20 mxWikiLen);.
1d80: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 blob_append(&
1d90: 74 72 75 6e 63 61 74 65 64 2c 20 22 2e 2e 2e 22 truncated, "..."
1da0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 77 69 6b 69 , 3);. wiki
1db0: 5f 63 6f 6e 76 65 72 74 28 26 74 72 75 6e 63 61 _convert(&trunca
1dc0: 74 65 64 2c 20 30 2c 20 77 69 6b 69 46 6c 61 67 ted, 0, wikiFlag
1dd0: 73 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 s);. blob_r
1de0: 65 73 65 74 28 26 74 72 75 6e 63 61 74 65 64 29 eset(&truncated)
1df0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
1e00: 20 20 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28 wiki_convert(
1e10: 26 63 6f 6d 6d 65 6e 74 2c 20 30 2c 20 77 69 6b &comment, 0, wik
1e20: 69 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 iFlags);. }.
1e30: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 blob_reset(&c
1e40: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 omment);. if(
1e50: 20 7a 54 61 67 4c 69 73 74 20 26 26 20 7a 54 61 zTagList && zTa
1e60: 67 4c 69 73 74 5b 30 5d 20 29 7b 0a 20 20 20 20 gList[0] ){.
1e70: 20 20 40 20 28 75 73 65 72 3a 20 25 68 28 7a 55 @ (user: %h(zU
1e80: 73 65 72 29 2c 20 74 61 67 73 3a 20 25 68 28 7a ser), tags: %h(z
1e90: 54 61 67 4c 69 73 74 29 29 0a 20 20 20 20 7d 65 TagList)). }e
1ea0: 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 28 75 73 lse{. @ (us
1eb0: 65 72 3a 20 25 68 28 7a 55 73 65 72 29 29 0a 20 er: %h(zUser)).
1ec0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78 45 78 }. if( xEx
1ed0: 74 72 61 20 29 7b 0a 20 20 20 20 20 20 78 45 78 tra ){. xEx
1ee0: 74 72 61 28 72 69 64 29 3b 0a 20 20 20 20 7d 0a tra(rid);. }.
1ef0: 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e @ </td></tr>
1f00: 0a 20 20 7d 0a 20 20 40 20 3c 2f 74 61 62 6c 65 . }. @ </table
1f10: 3e 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 >.}../*.** Creat
1f20: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 e a temporary ta
1f30: 62 6c 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 ble suitable for
1f40: 20 73 74 6f 72 69 6e 67 20 74 69 6d 65 6c 69 6e storing timelin
1f50: 65 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 e data..*/.stati
1f60: 63 20 76 6f 69 64 20 74 69 6d 65 6c 69 6e 65 5f c void timeline_
1f70: 74 65 6d 70 5f 74 61 62 6c 65 28 76 6f 69 64 29 temp_table(void)
1f80: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 {. static const
1f90: 20 63 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 0a char zSql[] = .
1fa0: 20 20 20 20 40 20 43 52 45 41 54 45 20 54 45 4d @ CREATE TEM
1fb0: 50 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 P TABLE IF NOT E
1fc0: 58 49 53 54 53 20 74 69 6d 65 6c 69 6e 65 28 0a XISTS timeline(.
1fd0: 20 20 20 20 40 20 20 20 72 69 64 20 49 4e 54 45 @ rid INTE
1fe0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY,
1ff0: 0a 20 20 20 20 40 20 20 20 75 75 69 64 20 54 45 . @ uuid TE
2000: 58 54 2c 0a 20 20 20 20 40 20 20 20 74 69 6d 65 XT,. @ time
2010: 73 74 61 6d 70 20 54 45 58 54 2c 0a 20 20 20 20 stamp TEXT,.
2020: 40 20 20 20 63 6f 6d 6d 65 6e 74 20 54 45 58 54 @ comment TEXT
2030: 2c 0a 20 20 20 20 40 20 20 20 75 73 65 72 20 54 ,. @ user T
2040: 45 58 54 2c 0a 20 20 20 20 40 20 20 20 6e 63 68 EXT,. @ nch
2050: 69 6c 64 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 ild INTEGER,.
2060: 20 40 20 20 20 6e 70 61 72 65 6e 74 20 49 4e 54 @ nparent INT
2070: 45 47 45 52 2c 0a 20 20 20 20 40 20 20 20 69 73 EGER,. @ is
2080: 6c 65 61 66 20 42 4f 4f 4c 45 41 4e 2c 0a 20 20 leaf BOOLEAN,.
2090: 20 20 40 20 20 20 62 67 63 6f 6c 6f 72 20 54 45 @ bgcolor TE
20a0: 58 54 2c 0a 20 20 20 20 40 20 20 20 65 74 79 70 XT,. @ etyp
20b0: 65 20 54 45 58 54 2c 0a 20 20 20 20 40 20 20 20 e TEXT,. @
20c0: 74 61 67 6c 69 73 74 20 54 45 58 54 0a 20 20 20 taglist TEXT.
20d0: 20 40 20 29 0a 20 20 3b 0a 20 20 64 62 5f 6d 75 @ ). ;. db_mu
20e0: 6c 74 69 5f 65 78 65 63 28 7a 53 71 6c 29 3b 0a lti_exec(zSql);.
20f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 }../*.** Return
2100: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63 a pointer to a c
2110: 6f 6e 73 74 61 6e 74 20 73 74 72 69 6e 67 20 74 onstant string t
2120: 68 61 74 20 66 6f 72 6d 73 20 74 68 65 20 62 61 hat forms the ba
2130: 73 69 73 0a 2a 2a 20 66 6f 72 20 61 20 74 69 6d sis.** for a tim
2140: 65 6c 69 6e 65 20 71 75 65 72 79 20 66 6f 72 20 eline query for
2150: 74 68 65 20 57 57 57 20 69 6e 74 65 72 66 61 63 the WWW interfac
2160: 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 e..*/.const char
2170: 20 2a 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79 *timeline_query
2180: 5f 66 6f 72 5f 77 77 77 28 76 6f 69 64 29 7b 0a _for_www(void){.
2190: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a static char *z
21a0: 42 61 73 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 Base = 0;. stat
21b0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 42 ic const char zB
21c0: 61 73 65 53 71 6c 5b 5d 20 3d 0a 20 20 20 20 40 aseSql[] =. @
21d0: 20 53 45 4c 45 43 54 0a 20 20 20 20 40 20 20 20 SELECT. @
21e0: 62 6c 6f 62 2e 72 69 64 2c 0a 20 20 20 20 40 20 blob.rid,. @
21f0: 20 20 75 75 69 64 2c 0a 20 20 20 20 40 20 20 20 uuid,. @
2200: 64 61 74 65 74 69 6d 65 28 65 76 65 6e 74 2e 6d datetime(event.m
2210: 74 69 6d 65 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 time,'localtime'
2220: 29 20 41 53 20 74 69 6d 65 73 74 61 6d 70 2c 0a ) AS timestamp,.
2230: 20 20 20 20 40 20 20 20 63 6f 61 6c 65 73 63 65 @ coalesce
2240: 28 65 63 6f 6d 6d 65 6e 74 2c 20 63 6f 6d 6d 65 (ecomment, comme
2250: 6e 74 29 2c 0a 20 20 20 20 40 20 20 20 63 6f 61 nt),. @ coa
2260: 6c 65 73 63 65 28 65 75 73 65 72 2c 20 75 73 65 lesce(euser, use
2270: 72 29 2c 0a 20 20 20 20 40 20 20 20 28 53 45 4c r),. @ (SEL
2280: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f ECT count(*) FRO
2290: 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70 69 M plink WHERE pi
22a0: 64 3d 62 6c 6f 62 2e 72 69 64 20 41 4e 44 20 69 d=blob.rid AND i
22b0: 73 70 72 69 6d 3d 31 29 2c 0a 20 20 20 20 40 20 sprim=1),. @
22c0: 20 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 (SELECT count(
22d0: 2a 29 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 *) FROM plink WH
22e0: 45 52 45 20 63 69 64 3d 62 6c 6f 62 2e 72 69 64 ERE cid=blob.rid
22f0: 29 2c 0a 20 20 20 20 40 20 20 20 4e 4f 54 20 45 ),. @ NOT E
2300: 58 49 53 54 53 28 53 45 4c 45 43 54 20 31 20 46 XISTS(SELECT 1 F
2310: 52 4f 4d 20 70 6c 69 6e 6b 0a 20 20 20 20 40 20 ROM plink. @
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 WH
2330: 45 52 45 20 70 69 64 3d 62 6c 6f 62 2e 72 69 64 ERE pid=blob.rid
2340: 0a 20 20 20 20 40 20 20 20 20 20 20 20 20 20 20 . @
2350: 20 20 20 20 20 20 41 4e 44 20 63 6f 61 6c 65 73 AND coales
2360: 63 65 28 28 53 45 4c 45 43 54 20 76 61 6c 75 65 ce((SELECT value
2370: 20 46 52 4f 4d 20 74 61 67 78 72 65 66 0a 20 20 FROM tagxref.
2380: 20 20 40 20 20 20 20 20 20 20 20 20 20 20 20 20 @
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23a0: 20 57 48 45 52 45 20 74 61 67 69 64 3d 25 64 20 WHERE tagid=%d
23b0: 41 4e 44 20 72 69 64 3d 70 6c 69 6e 6b 2e 70 69 AND rid=plink.pi
23c0: 64 29 2c 20 27 74 72 75 6e 6b 27 29 0a 20 20 20 d), 'trunk').
23d0: 20 40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 @
23e0: 20 20 20 20 3d 20 63 6f 61 6c 65 73 63 65 28 28 = coalesce((
23f0: 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f SELECT value FRO
2400: 4d 20 74 61 67 78 72 65 66 0a 20 20 20 20 40 20 M tagxref. @
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 WHE
2430: 52 45 20 74 61 67 69 64 3d 25 64 20 41 4e 44 20 RE tagid=%d AND
2440: 72 69 64 3d 70 6c 69 6e 6b 2e 63 69 64 29 2c 20 rid=plink.cid),
2450: 27 74 72 75 6e 6b 27 29 29 2c 0a 20 20 20 20 40 'trunk')),. @
2460: 20 20 20 62 67 63 6f 6c 6f 72 2c 0a 20 20 20 20 bgcolor,.
2470: 40 20 20 20 65 76 65 6e 74 2e 74 79 70 65 2c 0a @ event.type,.
2480: 20 20 20 20 40 20 20 20 28 53 45 4c 45 43 54 20 @ (SELECT
2490: 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 73 75 62 group_concat(sub
24a0: 73 74 72 28 74 61 67 6e 61 6d 65 2c 35 29 2c 20 str(tagname,5),
24b0: 27 2c 20 27 29 20 46 52 4f 4d 20 74 61 67 2c 20 ', ') FROM tag,
24c0: 74 61 67 78 72 65 66 0a 20 20 20 20 40 20 20 20 tagxref. @
24d0: 20 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65 20 WHERE tagname
24e0: 47 4c 4f 42 20 27 73 79 6d 2d 2a 27 20 41 4e 44 GLOB 'sym-*' AND
24f0: 20 74 61 67 2e 74 61 67 69 64 3d 74 61 67 78 72 tag.tagid=tagxr
2500: 65 66 2e 74 61 67 69 64 0a 20 20 20 20 40 20 20 ef.tagid. @
2510: 20 20 20 20 20 41 4e 44 20 74 61 67 78 72 65 66 AND tagxref
2520: 2e 72 69 64 3d 62 6c 6f 62 2e 72 69 64 20 41 4e .rid=blob.rid AN
2530: 44 20 74 61 67 78 72 65 66 2e 74 61 67 74 79 70 D tagxref.tagtyp
2540: 65 3e 30 29 0a 20 20 20 20 40 20 20 46 52 4f 4d e>0). @ FROM
2550: 20 65 76 65 6e 74 20 4a 4f 49 4e 20 62 6c 6f 62 event JOIN blob
2560: 20 0a 20 20 20 20 40 20 57 48 45 52 45 20 62 6c . @ WHERE bl
2570: 6f 62 2e 72 69 64 3d 65 76 65 6e 74 2e 6f 62 6a ob.rid=event.obj
2580: 69 64 0a 20 20 3b 0a 20 20 69 66 28 20 7a 42 61 id. ;. if( zBa
2590: 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 42 61 se==0 ){. zBa
25a0: 73 65 20 3d 20 6d 70 72 69 6e 74 66 28 7a 42 61 se = mprintf(zBa
25b0: 73 65 53 71 6c 2c 20 54 41 47 5f 42 52 41 4e 43 seSql, TAG_BRANC
25c0: 48 2c 20 54 41 47 5f 42 52 41 4e 43 48 29 3b 0a H, TAG_BRANCH);.
25d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 42 61 }. return zBa
25e0: 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e se;.}../*.** Gen
25f0: 65 72 61 74 65 20 61 20 73 75 62 6d 65 6e 75 20 erate a submenu
2600: 65 6c 65 6d 65 6e 74 20 77 69 74 68 20 61 20 73 element with a s
2610: 69 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 ingle parameter
2620: 63 68 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 change..*/.stati
2630: 63 20 76 6f 69 64 20 74 69 6d 65 6c 69 6e 65 5f c void timeline_
2640: 73 75 62 6d 65 6e 75 28 0a 20 20 48 51 75 65 72 submenu(. HQuer
2650: 79 20 2a 70 55 72 6c 2c 20 20 20 20 20 20 20 20 y *pUrl,
2660: 20 20 20 20 2f 2a 20 42 61 73 65 20 55 52 4c 20 /* Base URL
2670: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
2680: 2a 7a 4d 65 6e 75 4e 61 6d 65 2c 20 20 20 2f 2a *zMenuName, /*
2690: 20 53 75 62 6d 65 6e 75 20 6e 61 6d 65 20 2a 2f Submenu name */
26a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
26b0: 50 61 72 61 6d 2c 20 20 20 20 20 20 2f 2a 20 50 Param, /* P
26c0: 61 72 61 6d 65 74 65 72 20 76 61 6c 75 65 20 74 arameter value t
26d0: 6f 20 61 64 64 20 6f 72 20 63 68 61 6e 67 65 20 o add or change
26e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
26f0: 2a 7a 56 61 6c 75 65 2c 20 20 20 20 20 20 2f 2a *zValue, /*
2700: 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 6e 65 Value of the ne
2710: 77 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 w parameter */.
2720: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 const char *zRe
2730: 6d 6f 76 65 20 20 20 20 20 20 2f 2a 20 50 61 72 move /* Par
2740: 61 6d 65 74 65 72 20 74 6f 20 6f 6d 69 74 20 2a ameter to omit *
2750: 2f 0a 29 7b 0a 20 20 73 74 79 6c 65 5f 73 75 62 /.){. style_sub
2760: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 7a 4d 65 menu_element(zMe
2770: 6e 75 4e 61 6d 65 2c 20 7a 4d 65 6e 75 4e 61 6d nuName, zMenuNam
2780: 65 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 e, "%s",.
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27a0: 20 75 72 6c 5f 72 65 6e 64 65 72 28 70 55 72 6c url_render(pUrl
27b0: 2c 20 7a 50 61 72 61 6d 2c 20 7a 56 61 6c 75 65 , zParam, zValue
27c0: 2c 20 7a 52 65 6d 6f 76 65 2c 20 30 29 29 3b 0a , zRemove, 0));.
27d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 }../*.** WEBPAGE
27e0: 3a 20 74 69 6d 65 6c 69 6e 65 0a 2a 2a 0a 2a 2a : timeline.**.**
27f0: 20 51 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 Query parameter
2800: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 3d 54 49 s:.**.** a=TI
2810: 4d 45 53 54 41 4d 50 20 20 20 20 61 66 74 65 72 MESTAMP after
2820: 20 74 68 69 73 20 64 61 74 65 0a 2a 2a 20 20 20 this date.**
2830: 20 62 3d 54 49 4d 45 53 54 41 4d 50 20 20 20 20 b=TIMESTAMP
2840: 62 65 66 6f 72 65 20 74 68 69 73 20 64 61 74 65 before this date
2850: 2e 0a 2a 2a 20 20 20 20 63 3d 54 49 4d 45 53 54 ..** c=TIMEST
2860: 41 4d 50 20 20 20 20 22 63 69 72 63 61 22 20 74 AMP "circa" t
2870: 68 69 73 20 64 61 74 65 2e 0a 2a 2a 20 20 20 20 his date..**
2880: 6e 3d 43 4f 55 4e 54 20 20 20 20 20 20 20 20 6e n=COUNT n
2890: 75 6d 62 65 72 20 6f 66 20 65 76 65 6e 74 73 20 umber of events
28a0: 69 6e 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 in output.**
28b0: 70 3d 52 49 44 20 20 20 20 20 20 20 20 20 20 61 p=RID a
28c0: 72 74 69 66 61 63 74 20 52 49 44 20 61 6e 64 20 rtifact RID and
28d0: 75 70 20 74 6f 20 43 4f 55 4e 54 20 70 61 72 65 up to COUNT pare
28e0: 6e 74 73 20 61 6e 64 20 61 6e 63 65 73 74 6f 72 nts and ancestor
28f0: 73 0a 2a 2a 20 20 20 20 64 3d 52 49 44 20 20 20 s.** d=RID
2900: 20 20 20 20 20 20 20 61 72 74 69 66 61 63 74 20 artifact
2910: 52 49 44 20 61 6e 64 20 75 70 20 74 6f 20 43 4f RID and up to CO
2920: 55 4e 54 20 64 65 73 63 65 6e 64 61 6e 74 73 0a UNT descendants.
2930: 2a 2a 20 20 20 20 74 3d 54 41 47 49 44 20 20 20 ** t=TAGID
2940: 20 20 20 20 20 73 68 6f 77 20 6f 6e 6c 79 20 63 show only c
2950: 68 65 63 6b 2d 69 6e 73 20 77 69 74 68 20 74 68 heck-ins with th
2960: 65 20 67 69 76 65 6e 20 74 61 67 69 64 0a 2a 2a e given tagid.**
2970: 20 20 20 20 75 3d 55 53 45 52 20 20 20 20 20 20 u=USER
2980: 20 20 20 6f 6e 6c 79 20 69 66 20 62 65 6c 6f 6e only if belon
2990: 67 69 6e 67 20 74 6f 20 74 68 69 73 20 75 73 65 ging to this use
29a0: 72 0a 2a 2a 20 20 20 20 79 3d 54 59 50 45 20 20 r.** y=TYPE
29b0: 20 20 20 20 20 20 20 27 63 69 27 2c 20 27 77 27 'ci', 'w'
29c0: 2c 20 27 74 27 0a 2a 2a 0a 2a 2a 20 70 3d 20 61 , 't'.**.** p= a
29d0: 6e 64 20 64 3d 20 63 61 6e 20 61 70 70 65 61 72 nd d= can appear
29e0: 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 6f 72 individually or
29f0: 20 74 6f 67 65 74 68 65 72 2e 20 20 49 66 20 65 together. If e
2a00: 69 74 68 65 72 20 70 3d 20 6f 72 20 64 3d 0a 2a ither p= or d=.*
2a10: 2a 20 61 70 70 65 61 72 2c 20 74 68 65 6e 20 75 * appear, then u
2a20: 3d 2c 20 79 3d 2c 20 61 3d 2c 20 61 6e 64 20 62 =, y=, a=, and b
2a30: 3d 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a = are ignored..*
2a40: 2a 0a 2a 2a 20 49 66 20 61 3d 20 61 6e 64 20 62 *.** If a= and b
2a50: 3d 20 61 70 70 65 61 72 2c 20 6f 6e 6c 79 20 61 = appear, only a
2a60: 3d 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 6e = is used. If n
2a70: 65 69 74 68 65 72 20 61 70 70 65 61 72 2c 20 74 either appear, t
2a80: 68 65 20 6d 6f 73 74 0a 2a 2a 20 72 65 63 65 6e he most.** recen
2a90: 74 20 65 76 65 6e 74 73 20 61 72 65 20 63 68 6f t events are cho
2aa0: 6f 73 65 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e osen..**.** If n
2ab0: 3d 20 69 73 20 6d 69 73 73 69 6e 67 2c 20 74 68 = is missing, th
2ac0: 65 20 64 65 66 61 75 6c 74 20 63 6f 75 6e 74 20 e default count
2ad0: 69 73 20 32 30 2e 0a 2a 2f 0a 76 6f 69 64 20 70 is 20..*/.void p
2ae0: 61 67 65 5f 74 69 6d 65 6c 69 6e 65 28 76 6f 69 age_timeline(voi
2af0: 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b 20 20 20 d){. Stmt q;
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72 /* Quer
2b20: 79 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 y used to genera
2b30: 74 65 20 74 68 65 20 74 69 6d 65 6c 69 6e 65 20 te the timeline
2b40: 2a 2f 0a 20 20 42 6c 6f 62 20 73 71 6c 3b 20 20 */. Blob sql;
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b60: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 /* text
2b70: 6f 66 20 53 51 4c 20 75 73 65 64 20 74 6f 20 67 of SQL used to g
2b80: 65 6e 65 72 61 74 65 20 74 69 6d 65 6c 69 6e 65 enerate timeline
2b90: 20 2a 2f 0a 20 20 42 6c 6f 62 20 64 65 73 63 3b */. Blob desc;
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 /* Desc
2bc0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 ription of the t
2bd0: 69 6d 65 6c 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 imeline */. int
2be0: 20 6e 45 6e 74 72 79 20 3d 20 61 74 6f 69 28 50 nEntry = atoi(P
2bf0: 44 28 22 6e 22 2c 22 32 30 22 29 29 3b 20 20 20 D("n","20"));
2c00: 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f 66 /* Max number of
2c10: 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 69 6d 65 entries on time
2c20: 6c 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 70 5f line */. int p_
2c30: 72 69 64 20 3d 20 61 74 6f 69 28 50 44 28 22 70 rid = atoi(PD("p
2c40: 22 2c 22 30 22 29 29 3b 20 20 20 20 20 2f 2a 20 ","0")); /*
2c50: 61 72 74 69 66 61 63 74 20 70 20 61 6e 64 20 69 artifact p and i
2c60: 74 73 20 70 61 72 65 6e 74 73 20 2a 2f 0a 20 20 ts parents */.
2c70: 69 6e 74 20 64 5f 72 69 64 20 3d 20 61 74 6f 69 int d_rid = atoi
2c80: 28 50 44 28 22 64 22 2c 22 30 22 29 29 3b 20 20 (PD("d","0"));
2c90: 20 20 20 2f 2a 20 61 72 74 69 66 61 63 74 20 64 /* artifact d
2ca0: 20 61 6e 64 20 69 74 73 20 64 65 73 63 65 6e 64 and its descend
2cb0: 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 ants */. const
2cc0: 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 50 28 char *zUser = P(
2cd0: 22 75 22 29 3b 20 20 20 20 20 20 20 20 2f 2a 20 "u"); /*
2ce0: 41 6c 6c 20 65 6e 74 72 69 65 73 20 62 79 20 74 All entries by t
2cf0: 68 69 73 20 75 73 65 72 20 69 66 20 6e 6f 74 20 his user if not
2d00: 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 NULL */. const
2d10: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 50 44 char *zType = PD
2d20: 28 22 79 22 2c 22 61 6c 6c 22 29 3b 20 2f 2a 20 ("y","all"); /*
2d30: 54 79 70 65 20 6f 66 20 65 76 65 6e 74 73 2e 20 Type of events.
2d40: 20 41 6c 6c 20 69 66 20 4e 55 4c 4c 20 2a 2f 0a All if NULL */.
2d50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 const char *zA
2d60: 66 74 65 72 20 3d 20 50 28 22 61 22 29 3b 20 20 fter = P("a");
2d70: 20 20 20 20 20 2f 2a 20 45 76 65 6e 74 73 20 61 /* Events a
2d80: 66 74 65 72 20 74 68 69 73 20 74 69 6d 65 20 2a fter this time *
2d90: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a /. const char *
2da0: 7a 42 65 66 6f 72 65 20 3d 20 50 28 22 62 22 29 zBefore = P("b")
2db0: 3b 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 74 73 ; /* Events
2dc0: 20 62 65 66 6f 72 65 20 74 68 69 73 20 74 69 6d before this tim
2dd0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 e */. const cha
2de0: 72 20 2a 7a 43 69 72 63 61 20 3d 20 50 28 22 63 r *zCirca = P("c
2df0: 22 29 3b 20 20 20 20 20 20 20 2f 2a 20 45 76 65 "); /* Eve
2e00: 6e 74 73 20 6e 65 61 72 20 74 68 69 73 20 74 69 nts near this ti
2e10: 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 me */. const ch
2e20: 61 72 20 2a 7a 54 61 67 4e 61 6d 65 20 3d 20 50 ar *zTagName = P
2e30: 28 22 74 22 29 3b 20 20 20 20 20 2f 2a 20 53 68 ("t"); /* Sh
2e40: 6f 77 20 65 76 65 6e 74 73 20 77 69 74 68 20 74 ow events with t
2e50: 68 69 73 20 74 61 67 20 2a 2f 0a 20 20 48 51 75 his tag */. HQu
2e60: 65 72 79 20 75 72 6c 3b 20 20 20 20 20 20 20 20 ery url;
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2e80: 2f 2a 20 55 52 4c 20 66 6f 72 20 76 61 72 69 6f /* URL for vario
2e90: 75 73 20 62 72 61 6e 63 68 20 6c 69 6e 6b 73 20 us branch links
2ea0: 2a 2f 0a 20 20 69 6e 74 20 74 61 67 69 64 3b 20 */. int tagid;
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ec0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 67 20 49 /* Tag I
2ed0: 44 20 2a 2f 0a 0a 20 20 2f 2a 20 54 6f 20 76 69 D */.. /* To vi
2ee0: 65 77 20 74 68 65 20 74 69 6d 65 6c 69 6e 65 2c ew the timeline,
2ef0: 20 6d 75 73 74 20 68 61 76 65 20 70 65 72 6d 69 must have permi
2f00: 73 73 69 6f 6e 20 74 6f 20 72 65 61 64 20 70 72 ssion to read pr
2f10: 6f 6a 65 63 74 20 64 61 74 61 2e 0a 20 20 2a 2f oject data.. */
2f20: 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 . login_check_c
2f30: 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 redentials();.
2f40: 69 66 28 20 21 67 2e 6f 6b 52 65 61 64 20 29 7b if( !g.okRead ){
2f50: 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b login_needed();
2f60: 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 69 66 28 return; }. if(
2f70: 20 7a 54 61 67 4e 61 6d 65 20 29 7b 0a 20 20 20 zTagName ){.
2f80: 20 74 61 67 69 64 20 3d 20 64 62 5f 69 6e 74 28 tagid = db_int(
2f90: 30 2c 20 22 53 45 4c 45 43 54 20 74 61 67 69 64 0, "SELECT tagid
2fa0: 20 46 52 4f 4d 20 74 61 67 20 57 48 45 52 45 20 FROM tag WHERE
2fb0: 74 61 67 6e 61 6d 65 3d 27 73 79 6d 2d 25 71 27 tagname='sym-%q'
2fc0: 22 2c 20 7a 54 61 67 4e 61 6d 65 29 3b 0a 20 20 ", zTagName);.
2fd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 74 61 67 69 64 }else{. tagid
2fe0: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 73 74 79 = 0;. }.. sty
2ff0: 6c 65 5f 68 65 61 64 65 72 28 22 54 69 6d 65 6c le_header("Timel
3000: 69 6e 65 22 29 3b 0a 20 20 6c 6f 67 69 6e 5f 61 ine");. login_a
3010: 6e 6f 6e 79 6d 6f 75 73 5f 61 76 61 69 6c 61 62 nonymous_availab
3020: 6c 65 28 29 3b 0a 20 20 74 69 6d 65 6c 69 6e 65 le();. timeline
3030: 5f 74 65 6d 70 5f 74 61 62 6c 65 28 29 3b 0a 20 _temp_table();.
3040: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 71 6c 29 blob_zero(&sql)
3050: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 64 ;. blob_zero(&d
3060: 65 73 63 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 esc);. blob_app
3070: 65 6e 64 28 26 73 71 6c 2c 20 22 49 4e 53 45 52 end(&sql, "INSER
3080: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f T OR IGNORE INTO
3090: 20 74 69 6d 65 6c 69 6e 65 20 22 2c 20 2d 31 29 timeline ", -1)
30a0: 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 ;. blob_append(
30b0: 26 73 71 6c 2c 20 74 69 6d 65 6c 69 6e 65 5f 71 &sql, timeline_q
30c0: 75 65 72 79 5f 66 6f 72 5f 77 77 77 28 29 2c 20 uery_for_www(),
30d0: 2d 31 29 3b 0a 20 20 69 66 28 20 70 5f 72 69 64 -1);. if( p_rid
30e0: 20 7c 7c 20 64 5f 72 69 64 20 29 7b 0a 20 20 20 || d_rid ){.
30f0: 20 2f 2a 20 49 66 20 70 3d 20 6f 72 20 64 3d 20 /* If p= or d=
3100: 69 73 20 70 72 65 73 65 6e 74 2c 20 69 67 6e 6f is present, igno
3110: 72 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 72 re all other par
3120: 61 6d 65 74 65 72 73 20 6f 74 68 65 72 20 74 68 ameters other th
3130: 61 6e 20 6e 3d 20 2a 2f 0a 20 20 20 20 63 68 61 an n= */. cha
3140: 72 20 2a 7a 55 75 69 64 3b 0a 20 20 20 20 69 6e r *zUuid;. in
3150: 74 20 6e 70 2c 20 6e 64 3b 0a 0a 20 20 20 20 69 t np, nd;.. i
3160: 66 28 20 70 5f 72 69 64 20 26 26 20 64 5f 72 69 f( p_rid && d_ri
3170: 64 20 26 26 20 70 5f 72 69 64 21 3d 64 5f 72 69 d && p_rid!=d_ri
3180: 64 20 29 20 70 5f 72 69 64 20 3d 20 64 5f 72 69 d ) p_rid = d_ri
3190: 64 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f d;. db_multi_
31a0: 65 78 65 63 28 0a 20 20 20 20 20 20 20 22 43 52 exec(. "CR
31b0: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 EATE TEMP TABLE
31c0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6f 6b IF NOT EXISTS ok
31d0: 28 72 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 (rid INTEGER PRI
31e0: 4d 41 52 59 20 4b 45 59 29 22 0a 20 20 20 20 29 MARY KEY)". )
31f0: 3b 0a 20 20 20 20 7a 55 75 69 64 20 3d 20 64 62 ;. zUuid = db
3200: 5f 74 65 78 74 28 22 22 2c 20 22 53 45 4c 45 43 _text("", "SELEC
3210: 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 T uuid FROM blob
3220: 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c 0a WHERE rid=%d",.
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3240: 20 20 20 20 20 20 20 20 20 70 5f 72 69 64 20 3f p_rid ?
3250: 20 70 5f 72 69 64 20 3a 20 64 5f 72 69 64 29 3b p_rid : d_rid);
3260: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 . blob_append
3270: 66 28 26 73 71 6c 2c 20 22 20 41 4e 44 20 65 76 f(&sql, " AND ev
3280: 65 6e 74 2e 6f 62 6a 69 64 20 49 4e 20 6f 6b 22 ent.objid IN ok"
3290: 29 3b 0a 20 20 20 20 6e 64 20 3d 20 30 3b 0a 20 );. nd = 0;.
32a0: 20 20 20 69 66 28 20 64 5f 72 69 64 20 29 7b 0a if( d_rid ){.
32b0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 5f 64 65 compute_de
32c0: 73 63 65 6e 64 61 6e 74 73 28 64 5f 72 69 64 2c scendants(d_rid,
32d0: 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20 20 20 nEntry);.
32e0: 6e 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 nd = db_int(0, "
32f0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2d SELECT count(*)-
3300: 31 20 46 52 4f 4d 20 6f 6b 22 29 3b 0a 20 20 20 1 FROM ok");.
3310: 20 20 20 69 66 28 20 6e 64 3e 30 20 29 7b 0a 20 if( nd>0 ){.
3320: 20 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f db_multi_
3330: 65 78 65 63 28 22 25 73 22 2c 20 62 6c 6f 62 5f exec("%s", blob_
3340: 73 74 72 28 26 73 71 6c 29 29 3b 0a 20 20 20 20 str(&sql));.
3350: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 blob_appendf
3360: 28 26 64 65 73 63 2c 20 22 25 64 20 64 65 73 63 (&desc, "%d desc
3370: 65 6e 64 61 6e 74 73 22 2c 20 6e 64 29 3b 0a 20 endants", nd);.
3380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 5f }. db_
3390: 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c 45 multi_exec("DELE
33a0: 54 45 20 46 52 4f 4d 20 6f 6b 22 29 3b 0a 20 20 TE FROM ok");.
33b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 5f 72 69 }. if( p_ri
33c0: 64 20 29 7b 0a 20 20 20 20 20 20 63 6f 6d 70 75 d ){. compu
33d0: 74 65 5f 61 6e 63 65 73 74 6f 72 73 28 70 5f 72 te_ancestors(p_r
33e0: 69 64 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 id, nEntry);.
33f0: 20 20 20 6e 70 20 3d 20 64 62 5f 69 6e 74 28 30 np = db_int(0
3400: 2c 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 , "SELECT count(
3410: 2a 29 2d 31 20 46 52 4f 4d 20 6f 6b 22 29 3b 0a *)-1 FROM ok");.
3420: 20 20 20 20 20 20 69 66 28 20 6e 70 3e 30 20 29 if( np>0 )
3430: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 64 {. if( nd
3440: 3e 30 20 29 20 62 6c 6f 62 5f 61 70 70 65 6e 64 >0 ) blob_append
3450: 66 28 26 64 65 73 63 2c 20 22 20 61 6e 64 20 22 f(&desc, " and "
3460: 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f );. blob_
3470: 61 70 70 65 6e 64 66 28 26 64 65 73 63 2c 20 22 appendf(&desc, "
3480: 25 64 20 61 6e 63 65 73 74 6f 72 73 22 2c 20 6e %d ancestors", n
3490: 70 29 3b 0a 20 20 20 20 20 20 20 20 64 62 5f 6d p);. db_m
34a0: 75 6c 74 69 5f 65 78 65 63 28 22 25 73 22 2c 20 ulti_exec("%s",
34b0: 62 6c 6f 62 5f 73 74 72 28 26 73 71 6c 29 29 3b blob_str(&sql));
34c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
34d0: 20 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f if( g.okHisto
34e0: 72 79 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 ry ){. blob
34f0: 5f 61 70 70 65 6e 64 66 28 26 64 65 73 63 2c 20 _appendf(&desc,
3500: 22 20 6f 66 20 3c 61 20 68 72 65 66 3d 27 25 73 " of <a href='%s
3510: 2f 69 6e 66 6f 2f 25 73 27 3e 5b 25 2e 31 30 73 /info/%s'>[%.10s
3520: 5d 3c 2f 61 3e 22 2c 0a 20 20 20 20 20 20 20 20 ]</a>",.
3530: 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a 42 61 g.zBa
3540: 73 65 55 52 4c 2c 20 7a 55 75 69 64 2c 20 7a 55 seURL, zUuid, zU
3550: 75 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b uid);. }else{
3560: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 . blob_appe
3570: 6e 64 66 28 26 64 65 73 63 2c 20 22 20 6f 66 20 ndf(&desc, " of
3580: 5b 25 2e 31 30 73 5d 22 2c 20 7a 55 75 69 64 29 [%.10s]", zUuid)
3590: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b ;. }. }else{
35a0: 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 . int n;.
35b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 54 79 const char *zETy
35c0: 70 65 20 3d 20 22 65 76 65 6e 74 22 3b 0a 20 20 pe = "event";.
35d0: 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 char *zDate;.
35e0: 20 20 20 63 68 61 72 20 2a 7a 4e 45 6e 74 72 79 char *zNEntry
35f0: 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 64 22 2c = mprintf("%d",
3600: 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20 75 72 nEntry);. ur
3610: 6c 5f 69 6e 69 74 69 61 6c 69 7a 65 28 26 75 72 l_initialize(&ur
3620: 6c 2c 20 22 74 69 6d 65 6c 69 6e 65 22 29 3b 0a l, "timeline");.
3630: 20 20 20 20 75 72 6c 5f 61 64 64 5f 70 61 72 61 url_add_para
3640: 6d 65 74 65 72 28 26 75 72 6c 2c 20 22 6e 22 2c meter(&url, "n",
3650: 20 7a 4e 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 zNEntry);. i
3660: 66 28 20 74 61 67 69 64 3e 30 20 29 7b 0a 20 20 f( tagid>0 ){.
3670: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 63 69 22 zType = "ci"
3680: 3b 0a 20 20 20 20 20 20 75 72 6c 5f 61 64 64 5f ;. url_add_
3690: 70 61 72 61 6d 65 74 65 72 28 26 75 72 6c 2c 20 parameter(&url,
36a0: 22 74 22 2c 20 7a 54 61 67 4e 61 6d 65 29 3b 0a "t", zTagName);.
36b0: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e blob_appen
36c0: 64 66 28 26 73 71 6c 2c 20 22 20 41 4e 44 20 45 df(&sql, " AND E
36d0: 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 31 20 XISTS (SELECT 1
36e0: 46 52 4f 4d 20 74 61 67 78 72 65 66 20 57 48 45 FROM tagxref WHE
36f0: 52 45 20 74 61 67 69 64 3d 25 64 22 0a 20 20 20 RE tagid=%d".
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3720: 20 20 20 20 20 22 20 41 4e 44 20 74 61 67 74 79 " AND tagty
3730: 70 65 3e 30 20 41 4e 44 20 72 69 64 3d 62 6c 6f pe>0 AND rid=blo
3740: 62 2e 72 69 64 29 22 2c 0a 20 20 20 20 20 20 20 b.rid)",.
3750: 20 20 20 20 20 20 20 20 20 20 20 20 74 61 67 69 tagi
3760: 64 29 3b 0a 20 20 20 20 7d 20 20 20 20 0a 20 20 d);. } .
3770: 20 20 69 66 28 20 7a 54 79 70 65 5b 30 5d 21 3d if( zType[0]!=
3780: 27 61 27 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 'a' ){. blo
3790: 62 5f 61 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 b_appendf(&sql,
37a0: 22 20 41 4e 44 20 65 76 65 6e 74 2e 74 79 70 65 " AND event.type
37b0: 3d 25 51 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 =%Q", zType);.
37c0: 20 20 20 20 75 72 6c 5f 61 64 64 5f 70 61 72 61 url_add_para
37d0: 6d 65 74 65 72 28 26 75 72 6c 2c 20 22 79 22 2c meter(&url, "y",
37e0: 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 69 zType);. i
37f0: 66 28 20 7a 54 79 70 65 5b 30 5d 3d 3d 27 63 27 f( zType[0]=='c'
3800: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 54 79 ){. zETy
3810: 70 65 20 3d 20 22 63 68 65 63 6b 69 6e 22 3b 0a pe = "checkin";.
3820: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
3830: 7a 54 79 70 65 5b 30 5d 3d 3d 27 77 27 20 29 7b zType[0]=='w' ){
3840: 0a 20 20 20 20 20 20 20 20 7a 45 54 79 70 65 20 . zEType
3850: 3d 20 22 77 69 6b 69 20 65 64 69 74 22 3b 0a 20 = "wiki edit";.
3860: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a }else if( z
3870: 54 79 70 65 5b 30 5d 3d 3d 27 74 27 20 29 7b 0a Type[0]=='t' ){.
3880: 20 20 20 20 20 20 20 20 7a 45 54 79 70 65 20 3d zEType =
3890: 20 22 74 69 63 6b 65 74 20 63 68 61 6e 67 65 22 "ticket change"
38a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
38b0: 20 20 20 20 69 66 28 20 7a 55 73 65 72 20 29 7b if( zUser ){
38c0: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 . blob_appe
38d0: 6e 64 66 28 26 73 71 6c 2c 20 22 20 41 4e 44 20 ndf(&sql, " AND
38e0: 65 76 65 6e 74 2e 75 73 65 72 3d 25 51 22 2c 20 event.user=%Q",
38f0: 7a 55 73 65 72 29 3b 0a 20 20 20 20 20 20 75 72 zUser);. ur
3900: 6c 5f 61 64 64 5f 70 61 72 61 6d 65 74 65 72 28 l_add_parameter(
3910: 26 75 72 6c 2c 20 22 75 22 2c 20 7a 55 73 65 72 &url, "u", zUser
3920: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 );. }. if(
3930: 20 7a 41 66 74 65 72 20 29 7b 0a 20 20 20 20 20 zAfter ){.
3940: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 while( isspace(
3950: 7a 41 66 74 65 72 5b 30 5d 29 20 29 7b 20 7a 41 zAfter[0]) ){ zA
3960: 66 74 65 72 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 fter++; }.
3970: 69 66 28 20 7a 41 66 74 65 72 5b 30 5d 20 29 7b if( zAfter[0] ){
3980: 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 . blob_ap
3990: 70 65 6e 64 66 28 26 73 71 6c 2c 20 0a 20 20 20 pendf(&sql, .
39a0: 20 20 20 20 20 20 20 20 22 20 41 4e 44 20 65 76 " AND ev
39b0: 65 6e 74 2e 6d 74 69 6d 65 3e 3d 28 53 45 4c 45 ent.mtime>=(SELE
39c0: 43 54 20 6a 75 6c 69 61 6e 64 61 79 28 25 51 2c CT julianday(%Q,
39d0: 20 27 75 74 63 27 29 29 22 0a 20 20 20 20 20 20 'utc'))".
39e0: 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 " ORDER BY
39f0: 65 76 65 6e 74 2e 6d 74 69 6d 65 20 41 53 43 22 event.mtime ASC"
3a00: 2c 20 7a 41 66 74 65 72 29 3b 0a 20 20 20 20 20 , zAfter);.
3a10: 20 20 20 75 72 6c 5f 61 64 64 5f 70 61 72 61 6d url_add_param
3a20: 65 74 65 72 28 26 75 72 6c 2c 20 22 61 22 2c 20 eter(&url, "a",
3a30: 7a 41 66 74 65 72 29 3b 0a 20 20 20 20 20 20 20 zAfter);.
3a40: 20 7a 42 65 66 6f 72 65 20 3d 20 30 3b 0a 20 20 zBefore = 0;.
3a50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
3a60: 20 20 20 7a 41 66 74 65 72 20 3d 20 30 3b 0a 20 zAfter = 0;.
3a70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 }. }else
3a80: 20 69 66 28 20 7a 42 65 66 6f 72 65 20 29 7b 0a if( zBefore ){.
3a90: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 while( iss
3aa0: 70 61 63 65 28 7a 42 65 66 6f 72 65 5b 30 5d 29 pace(zBefore[0])
3ab0: 20 29 7b 20 7a 42 65 66 6f 72 65 2b 2b 3b 20 7d ){ zBefore++; }
3ac0: 0a 20 20 20 20 20 20 69 66 28 20 7a 42 65 66 6f . if( zBefo
3ad0: 72 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 re[0] ){.
3ae0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 blob_appendf(&s
3af0: 71 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 ql, .
3b00: 22 20 41 4e 44 20 65 76 65 6e 74 2e 6d 74 69 6d " AND event.mtim
3b10: 65 3c 3d 28 53 45 4c 45 43 54 20 6a 75 6c 69 61 e<=(SELECT julia
3b20: 6e 64 61 79 28 25 51 2c 20 27 75 74 63 27 29 29 nday(%Q, 'utc'))
3b30: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 4f ". " O
3b40: 52 44 45 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 RDER BY event.mt
3b50: 69 6d 65 20 44 45 53 43 22 2c 20 7a 42 65 66 6f ime DESC", zBefo
3b60: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 75 72 6c re);. url
3b70: 5f 61 64 64 5f 70 61 72 61 6d 65 74 65 72 28 26 _add_parameter(&
3b80: 75 72 6c 2c 20 22 62 22 2c 20 7a 42 65 66 6f 72 url, "b", zBefor
3b90: 65 29 3b 0a 20 20 20 20 20 20 20 7d 65 6c 73 65 e);. }else
3ba0: 7b 0a 20 20 20 20 20 20 20 20 7a 42 65 66 6f 72 {. zBefor
3bb0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 e = 0;. }.
3bc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 43 69 }else if( zCi
3bd0: 72 63 61 20 29 7b 0a 20 20 20 20 20 20 77 68 69 rca ){. whi
3be0: 6c 65 28 20 69 73 73 70 61 63 65 28 7a 43 69 72 le( isspace(zCir
3bf0: 63 61 5b 30 5d 29 20 29 7b 20 7a 43 69 72 63 61 ca[0]) ){ zCirca
3c00: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 ++; }. if(
3c10: 7a 43 69 72 63 61 5b 30 5d 20 29 7b 0a 20 20 20 zCirca[0] ){.
3c20: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 43 69 72 double rCir
3c30: 63 61 20 3d 20 64 62 5f 64 6f 75 62 6c 65 28 30 ca = db_double(0
3c40: 2e 30 2c 20 22 53 45 4c 45 43 54 20 6a 75 6c 69 .0, "SELECT juli
3c50: 61 6e 64 61 79 28 25 51 2c 20 27 75 74 63 27 29 anday(%Q, 'utc')
3c60: 22 2c 20 7a 43 69 72 63 61 29 3b 0a 20 20 20 20 ", zCirca);.
3c70: 20 20 20 20 42 6c 6f 62 20 73 71 6c 32 3b 0a 20 Blob sql2;.
3c80: 20 20 20 20 20 20 20 62 6c 6f 62 5f 69 6e 69 74 blob_init
3c90: 28 26 73 71 6c 32 2c 20 62 6c 6f 62 5f 73 74 72 (&sql2, blob_str
3ca0: 28 26 73 71 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 (&sql), -1);.
3cb0: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 blob_append
3cc0: 66 28 26 73 71 6c 32 2c 0a 20 20 20 20 20 20 20 f(&sql2,.
3cd0: 20 20 20 20 20 22 20 41 4e 44 20 65 76 65 6e 74 " AND event
3ce0: 2e 6d 74 69 6d 65 3c 3d 25 66 20 4f 52 44 45 52 .mtime<=%f ORDER
3cf0: 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20 BY event.mtime
3d00: 44 45 53 43 20 4c 49 4d 49 54 20 25 64 22 2c 0a DESC LIMIT %d",.
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 72 43 69 72 rCir
3d20: 63 61 2c 20 28 6e 45 6e 74 72 79 2b 31 29 2f 32 ca, (nEntry+1)/2
3d30: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 . );.
3d40: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 db_multi_exe
3d50: 63 28 22 25 73 22 2c 20 62 6c 6f 62 5f 73 74 72 c("%s", blob_str
3d60: 28 26 73 71 6c 32 29 29 3b 0a 20 20 20 20 20 20 (&sql2));.
3d70: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 71 blob_reset(&sq
3d80: 6c 32 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f l2);. blo
3d90: 62 5f 61 70 70 65 6e 64 66 28 26 73 71 6c 2c 0a b_appendf(&sql,.
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 41 4e " AN
3db0: 44 20 65 76 65 6e 74 2e 6d 74 69 6d 65 3e 3d 25 D event.mtime>=%
3dc0: 66 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 f ORDER BY event
3dd0: 2e 6d 74 69 6d 65 20 41 53 43 22 2c 0a 20 20 20 .mtime ASC",.
3de0: 20 20 20 20 20 20 20 20 20 72 43 69 72 63 61 0a rCirca.
3df0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 );.
3e00: 20 20 20 6e 45 6e 74 72 79 20 2d 3d 20 28 6e 45 nEntry -= (nE
3e10: 6e 74 72 79 2b 31 29 2f 32 3b 0a 20 20 20 20 20 ntry+1)/2;.
3e20: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 db_multi_exec
3e30: 28 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 (. "INS
3e40: 45 52 54 20 49 4e 54 4f 20 74 69 6d 65 6c 69 6e ERT INTO timelin
3e50: 65 28 72 69 64 2c 74 69 6d 65 73 74 61 6d 70 2c e(rid,timestamp,
3e60: 65 74 79 70 65 29 22 0a 20 20 20 20 20 20 20 20 etype)".
3e70: 20 20 22 56 41 4c 55 45 53 28 2d 31 2c 64 61 74 "VALUES(-1,dat
3e80: 65 74 69 6d 65 28 25 51 2c 27 2d 31 20 73 65 63 etime(%Q,'-1 sec
3e90: 6f 6e 64 27 29 20 7c 7c 20 27 2e 39 27 2c 27 64 ond') || '.9','d
3ea0: 69 76 27 29 22 2c 0a 20 20 20 20 20 20 20 20 20 iv')",.
3eb0: 20 7a 43 69 72 63 61 0a 20 20 20 20 20 20 20 20 zCirca.
3ec0: 29 3b 0a 20 20 20 20 20 20 20 20 64 62 5f 6d 75 );. db_mu
3ed0: 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20 lti_exec(.
3ee0: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f "INSERT INTO
3ef0: 20 74 69 6d 65 6c 69 6e 65 28 72 69 64 2c 74 69 timeline(rid,ti
3f00: 6d 65 73 74 61 6d 70 2c 65 74 79 70 65 29 22 0a mestamp,etype)".
3f10: 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55 45 "VALUE
3f20: 53 28 2d 32 2c 64 61 74 65 74 69 6d 65 28 25 51 S(-2,datetime(%Q
3f30: 29 20 7c 7c 20 27 2e 31 27 2c 27 64 69 76 27 29 ) || '.1','div')
3f40: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 43 69 ",. zCi
3f50: 72 63 61 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 rca. );.
3f60: 20 20 20 20 20 20 20 75 72 6c 5f 61 64 64 5f 70 url_add_p
3f70: 61 72 61 6d 65 74 65 72 28 26 75 72 6c 2c 20 22 arameter(&url, "
3f80: 63 22 2c 20 7a 43 69 72 63 61 29 3b 0a 20 20 20 c", zCirca);.
3f90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
3fa0: 20 20 7a 43 69 72 63 61 20 3d 20 30 3b 0a 20 20 zCirca = 0;.
3fb0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b }. }else{
3fc0: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 . blob_appe
3fd0: 6e 64 66 28 26 73 71 6c 2c 20 22 20 4f 52 44 45 ndf(&sql, " ORDE
3fe0: 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65 R BY event.mtime
3ff0: 20 44 45 53 43 22 29 3b 0a 20 20 20 20 7d 0a 20 DESC");. }.
4000: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 blob_appendf(
4010: 26 73 71 6c 2c 20 22 20 4c 49 4d 49 54 20 25 64 &sql, " LIMIT %d
4020: 22 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20 ", nEntry);.
4030: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 25 db_multi_exec("%
4040: 73 22 2c 20 62 6c 6f 62 5f 73 74 72 28 26 73 71 s", blob_str(&sq
4050: 6c 29 29 3b 0a 0a 20 20 20 20 6e 20 3d 20 64 62 l));.. n = db
4060: 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20 _int(0, "SELECT
4070: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 69 count(*) FROM ti
4080: 6d 65 6c 69 6e 65 22 29 3b 0a 20 20 20 20 69 66 meline");. if
4090: 28 20 6e 3c 6e 45 6e 74 72 79 20 26 26 20 7a 41 ( n<nEntry && zA
40a0: 66 74 65 72 20 29 7b 0a 20 20 20 20 20 20 63 67 fter ){. cg
40b0: 69 5f 72 65 64 69 72 65 63 74 28 75 72 6c 5f 72 i_redirect(url_r
40c0: 65 6e 64 65 72 28 26 75 72 6c 2c 20 22 61 22 2c ender(&url, "a",
40d0: 20 30 2c 20 22 62 22 2c 20 30 29 29 3b 0a 20 20 0, "b", 0));.
40e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 41 66 74 }. if( zAft
40f0: 65 72 3d 3d 30 20 26 26 20 7a 42 65 66 6f 72 65 er==0 && zBefore
4100: 3d 3d 30 20 26 26 20 7a 43 69 72 63 61 3d 3d 30 ==0 && zCirca==0
4110: 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 ){. blob_a
4120: 70 70 65 6e 64 66 28 26 64 65 73 63 2c 20 22 25 ppendf(&desc, "%
4130: 64 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 25 73 d most recent %s
4140: 73 22 2c 20 6e 2c 20 7a 45 54 79 70 65 29 3b 0a s", n, zEType);.
4150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
4160: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 64 blob_appendf(&d
4170: 65 73 63 2c 20 22 25 64 20 25 73 73 22 2c 20 6e esc, "%d %ss", n
4180: 2c 20 7a 45 54 79 70 65 29 3b 0a 20 20 20 20 7d , zEType);. }
4190: 0a 20 20 20 20 69 66 28 20 7a 55 73 65 72 20 29 . if( zUser )
41a0: 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 {. blob_app
41b0: 65 6e 64 66 28 26 64 65 73 63 2c 20 22 20 62 79 endf(&desc, " by
41c0: 20 75 73 65 72 20 25 68 22 2c 20 7a 55 73 65 72 user %h", zUser
41d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 );. }. if(
41e0: 20 74 61 67 69 64 3e 30 20 29 7b 0a 20 20 20 20 tagid>0 ){.
41f0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 blob_appendf(&
4200: 64 65 73 63 2c 20 22 20 74 61 67 67 65 64 20 77 desc, " tagged w
4210: 69 74 68 20 5c 22 25 68 5c 22 22 2c 20 7a 54 61 ith \"%h\"", zTa
4220: 67 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 gName);. }.
4230: 20 20 69 66 28 20 7a 41 66 74 65 72 20 29 7b 0a if( zAfter ){.
4240: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e blob_appen
4250: 64 66 28 26 64 65 73 63 2c 20 22 20 6f 63 63 75 df(&desc, " occu
4260: 72 72 69 6e 67 20 6f 6e 20 6f 72 20 61 66 74 65 rring on or afte
4270: 72 20 25 68 2e 3c 62 72 3e 22 2c 20 7a 41 66 74 r %h.<br>", zAft
4280: 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 er);. }else i
4290: 66 28 20 7a 42 65 66 6f 72 65 20 29 7b 0a 20 20 f( zBefore ){.
42a0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 blob_appendf
42b0: 28 26 64 65 73 63 2c 20 22 20 6f 63 63 75 72 72 (&desc, " occurr
42c0: 69 6e 67 20 6f 6e 20 6f 72 20 62 65 66 6f 72 65 ing on or before
42d0: 20 25 68 2e 3c 62 72 3e 22 2c 20 7a 42 65 66 6f %h.<br>", zBefo
42e0: 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 re);. }else i
42f0: 66 28 20 7a 43 69 72 63 61 20 29 7b 0a 20 20 20 f( zCirca ){.
4300: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 blob_appendf(
4310: 26 64 65 73 63 2c 20 22 20 6f 63 63 75 72 72 69 &desc, " occurri
4320: 6e 67 20 61 72 6f 75 6e 64 20 25 68 2e 3c 62 72 ng around %h.<br
4330: 3e 22 2c 20 7a 43 69 72 63 61 29 3b 0a 20 20 20 >", zCirca);.
4340: 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 48 }. if( g.okH
4350: 69 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 istory ){.
4360: 69 66 28 20 7a 41 66 74 65 72 20 7c 7c 20 6e 3d if( zAfter || n=
4370: 3d 6e 45 6e 74 72 79 20 29 7b 0a 20 20 20 20 20 =nEntry ){.
4380: 20 20 20 7a 44 61 74 65 20 3d 20 64 62 5f 74 65 zDate = db_te
4390: 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 6d 69 xt(0, "SELECT mi
43a0: 6e 28 74 69 6d 65 73 74 61 6d 70 29 20 46 52 4f n(timestamp) FRO
43b0: 4d 20 74 69 6d 65 6c 69 6e 65 22 29 3b 0a 20 20 M timeline");.
43c0: 20 20 20 20 20 20 74 69 6d 65 6c 69 6e 65 5f 73 timeline_s
43d0: 75 62 6d 65 6e 75 28 26 75 72 6c 2c 20 22 4f 6c ubmenu(&url, "Ol
43e0: 64 65 72 22 2c 20 22 62 22 2c 20 7a 44 61 74 65 der", "b", zDate
43f0: 2c 20 22 61 22 29 3b 0a 20 20 20 20 20 20 20 20 , "a");.
4400: 66 72 65 65 28 7a 44 61 74 65 29 3b 0a 20 20 20 free(zDate);.
4410: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a }. if( z
4420: 42 65 66 6f 72 65 20 7c 7c 20 28 7a 41 66 74 65 Before || (zAfte
4430: 72 20 26 26 20 6e 3d 3d 6e 45 6e 74 72 79 29 20 r && n==nEntry)
4440: 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 61 74 65 ){. zDate
4450: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 = db_text(0, "S
4460: 45 4c 45 43 54 20 6d 61 78 28 74 69 6d 65 73 74 ELECT max(timest
4470: 61 6d 70 29 20 46 52 4f 4d 20 74 69 6d 65 6c 69 amp) FROM timeli
4480: 6e 65 22 29 3b 0a 20 20 20 20 20 20 20 20 74 69 ne");. ti
4490: 6d 65 6c 69 6e 65 5f 73 75 62 6d 65 6e 75 28 26 meline_submenu(&
44a0: 75 72 6c 2c 20 22 4e 65 77 65 72 22 2c 20 22 61 url, "Newer", "a
44b0: 22 2c 20 7a 44 61 74 65 2c 20 22 62 22 29 3b 0a ", zDate, "b");.
44c0: 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 44 61 free(zDa
44d0: 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 te);. }else
44e0: 20 69 66 28 20 74 61 67 69 64 3d 3d 30 20 29 7b if( tagid==0 ){
44f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 79 . if( zTy
4500: 70 65 5b 30 5d 21 3d 27 61 27 20 29 7b 0a 20 20 pe[0]!='a' ){.
4510: 20 20 20 20 20 20 20 20 74 69 6d 65 6c 69 6e 65 timeline
4520: 5f 73 75 62 6d 65 6e 75 28 26 75 72 6c 2c 20 22 _submenu(&url, "
4530: 41 6c 6c 20 54 79 70 65 73 22 2c 20 22 79 22 2c All Types", "y",
4540: 20 22 61 6c 6c 22 2c 20 30 29 3b 0a 20 20 20 20 "all", 0);.
4550: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 }. if
4560: 28 20 7a 54 79 70 65 5b 30 5d 21 3d 27 77 27 20 ( zType[0]!='w'
4570: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 69 6d ){. tim
4580: 65 6c 69 6e 65 5f 73 75 62 6d 65 6e 75 28 26 75 eline_submenu(&u
4590: 72 6c 2c 20 22 57 69 6b 69 20 4f 6e 6c 79 22 2c rl, "Wiki Only",
45a0: 20 22 79 22 2c 20 22 77 22 2c 20 30 29 3b 0a 20 "y", "w", 0);.
45b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
45c0: 20 69 66 28 20 7a 54 79 70 65 5b 30 5d 21 3d 27 if( zType[0]!='
45d0: 63 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 c' ){.
45e0: 74 69 6d 65 6c 69 6e 65 5f 73 75 62 6d 65 6e 75 timeline_submenu
45f0: 28 26 75 72 6c 2c 20 22 43 68 65 63 6b 69 6e 73 (&url, "Checkins
4600: 20 4f 6e 6c 79 22 2c 20 22 79 22 2c 20 22 63 69 Only", "y", "ci
4610: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d ", 0);. }
4620: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 79 . if( zTy
4630: 70 65 5b 30 5d 21 3d 27 74 27 20 29 7b 0a 20 20 pe[0]!='t' ){.
4640: 20 20 20 20 20 20 20 20 74 69 6d 65 6c 69 6e 65 timeline
4650: 5f 73 75 62 6d 65 6e 75 28 26 75 72 6c 2c 20 22 _submenu(&url, "
4660: 54 69 63 6b 65 74 73 20 4f 6e 6c 79 22 2c 20 22 Tickets Only", "
4670: 79 22 2c 20 22 74 22 2c 20 30 29 3b 0a 20 20 20 y", "t", 0);.
4680: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 }. }.
4690: 20 20 20 20 20 69 66 28 20 6e 45 6e 74 72 79 3e if( nEntry>
46a0: 32 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 69 20 ){. ti
46b0: 6d 65 6c 69 6e 65 5f 73 75 62 6d 65 6e 75 28 26 meline_submenu(&
46c0: 75 72 6c 2c 20 22 32 30 20 45 76 65 6e 74 73 22 url, "20 Events"
46d0: 2c 20 22 6e 22 2c 20 22 32 30 22 2c 20 30 29 3b , "n", "20", 0);
46e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 . }. i
46f0: 66 28 20 6e 45 6e 74 72 79 3c 32 30 30 20 29 7b f( nEntry<200 ){
4700: 0a 20 20 20 20 20 20 20 20 74 69 6d 65 6c 69 6e . timelin
4710: 65 5f 73 75 62 6d 65 6e 75 28 26 75 72 6c 2c 20 e_submenu(&url,
4720: 22 32 30 30 20 45 76 65 6e 74 73 22 2c 20 22 6e "200 Events", "n
4730: 22 2c 20 22 32 30 30 22 2c 20 30 29 3b 0a 20 20 ", "200", 0);.
4740: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a }. }. }.
4750: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 71 6c blob_zero(&sql
4760: 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 );. db_prepare(
4770: 26 71 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 &q, "SELECT * FR
4780: 4f 4d 20 74 69 6d 65 6c 69 6e 65 20 4f 52 44 45 OM timeline ORDE
4790: 52 20 42 59 20 74 69 6d 65 73 74 61 6d 70 20 44 R BY timestamp D
47a0: 45 53 43 22 29 3b 0a 20 20 40 20 3c 68 32 3e 25 ESC");. @ <h2>%
47b0: 62 28 26 64 65 73 63 29 3c 2f 68 32 3e 0a 20 20 b(&desc)</h2>.
47c0: 62 6c 6f 62 5f 72 65 73 65 74 28 26 64 65 73 63 blob_reset(&desc
47d0: 29 3b 0a 20 20 77 77 77 5f 70 72 69 6e 74 5f 74 );. www_print_t
47e0: 69 6d 65 6c 69 6e 65 28 26 71 2c 20 30 2c 20 30 imeline(&q, 0, 0
47f0: 29 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 );. db_finalize
4800: 28 26 71 29 3b 0a 0a 20 20 40 20 3c 73 63 72 69 (&q);.. @ <scri
4810: 70 74 3e 0a 20 20 40 20 76 61 72 20 70 61 72 65 pt>. @ var pare
4820: 6e 74 6f 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 ntof = new Objec
4830: 74 28 29 3b 0a 20 20 40 20 76 61 72 20 63 68 69 t();. @ var chi
4840: 6c 64 6f 66 20 3d 20 6e 65 77 20 4f 62 6a 65 63 ldof = new Objec
4850: 74 28 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 t();. db_prepar
4860: 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20 72 69 e(&q, "SELECT ri
4870: 64 20 46 52 4f 4d 20 74 69 6d 65 6c 69 6e 65 22 d FROM timeline"
4880: 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 );. while( db_s
4890: 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f tep(&q)==SQLITE_
48a0: 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 ROW ){. int r
48b0: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 id = db_column_i
48c0: 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 53 nt(&q, 0);. S
48d0: 74 6d 74 20 71 32 3b 0a 20 20 20 20 63 6f 6e 73 tmt q2;. cons
48e0: 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 0a 20 20 t char *zSep;.
48f0: 20 20 42 6c 6f 62 20 2a 70 4f 75 74 20 3d 20 63 Blob *pOut = c
4900: 67 69 5f 6f 75 74 70 75 74 5f 62 6c 6f 62 28 29 gi_output_blob()
4910: 3b 0a 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 ;.. db_prepar
4920: 65 28 26 71 32 2c 20 22 53 45 4c 45 43 54 20 70 e(&q2, "SELECT p
4930: 69 64 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 id FROM plink WH
4940: 45 52 45 20 63 69 64 3d 25 64 22 2c 20 72 69 64 ERE cid=%d", rid
4950: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 );. zSep = ""
4960: 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e ;. blob_appen
4970: 64 66 28 70 4f 75 74 2c 20 22 70 61 72 65 6e 74 df(pOut, "parent
4980: 6f 66 5b 5c 22 6d 25 64 5c 22 5d 20 3d 20 5b 22 of[\"m%d\"] = ["
4990: 2c 20 72 69 64 29 3b 0a 20 20 20 20 77 68 69 6c , rid);. whil
49a0: 65 28 20 64 62 5f 73 74 65 70 28 26 71 32 29 3d e( db_step(&q2)=
49b0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 =SQLITE_ROW ){.
49c0: 20 20 20 20 20 69 6e 74 20 70 69 64 20 3d 20 64 int pid = d
49d0: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 32 b_column_int(&q2
49e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 , 0);. blob
49f0: 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 _appendf(pOut, "
4a00: 25 73 5c 22 6d 25 64 5c 22 22 2c 20 7a 53 65 70 %s\"m%d\"", zSep
4a10: 2c 20 70 69 64 29 3b 0a 20 20 20 20 20 20 7a 53 , pid);. zS
4a20: 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7d 0a ep = ",";. }.
4a30: 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 db_finalize(
4a40: 26 71 32 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 &q2);. blob_a
4a50: 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 5d 3b ppendf(pOut, "];
4a60: 5c 6e 22 29 3b 0a 20 20 20 20 64 62 5f 70 72 65 \n");. db_pre
4a70: 70 61 72 65 28 26 71 32 2c 20 22 53 45 4c 45 43 pare(&q2, "SELEC
4a80: 54 20 63 69 64 20 46 52 4f 4d 20 70 6c 69 6e 6b T cid FROM plink
4a90: 20 57 48 45 52 45 20 70 69 64 3d 25 64 22 2c 20 WHERE pid=%d",
4aa0: 72 69 64 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d rid);. zSep =
4ab0: 20 22 22 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 "";. blob_ap
4ac0: 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 63 68 69 pendf(pOut, "chi
4ad0: 6c 64 6f 66 5b 5c 22 6d 25 64 5c 22 5d 20 3d 20 ldof[\"m%d\"] =
4ae0: 5b 22 2c 20 72 69 64 29 3b 0a 20 20 20 20 77 68 [", rid);. wh
4af0: 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 32 ile( db_step(&q2
4b00: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b )==SQLITE_ROW ){
4b10: 0a 20 20 20 20 20 20 69 6e 74 20 70 69 64 20 3d . int pid =
4b20: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 db_column_int(&
4b30: 71 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 6c q2, 0);. bl
4b40: 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c ob_appendf(pOut,
4b50: 20 22 25 73 5c 22 6d 25 64 5c 22 22 2c 20 7a 53 "%s\"m%d\"", zS
4b60: 65 70 2c 20 70 69 64 29 3b 0a 20 20 20 20 20 20 ep, pid);.
4b70: 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20 20 20 zSep = ",";.
4b80: 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a }. db_finaliz
4b90: 65 28 26 71 32 29 3b 0a 20 20 20 20 62 6c 6f 62 e(&q2);. blob
4ba0: 5f 61 70 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 _appendf(pOut, "
4bb0: 5d 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 64 62 ];\n");. }. db
4bc0: 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 _finalize(&q);.
4bd0: 20 40 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 61 @ function seta
4be0: 6c 6c 28 76 61 6c 75 65 29 7b 0a 20 20 40 20 20 ll(value){. @
4bf0: 20 66 6f 72 28 76 61 72 20 78 20 69 6e 20 70 61 for(var x in pa
4c00: 72 65 6e 74 6f 66 29 7b 0a 20 20 40 20 20 20 20 rentof){. @
4c10: 20 73 65 74 6f 6e 65 28 78 2c 76 61 6c 75 65 29 setone(x,value)
4c20: 3b 0a 20 20 40 20 20 20 7d 0a 20 20 40 20 7d 0a ;. @ }. @ }.
4c30: 20 20 40 20 73 65 74 61 6c 6c 28 22 23 66 66 66 @ setall("#fff
4c40: 66 66 66 22 29 3b 0a 20 20 40 20 66 75 6e 63 74 fff");. @ funct
4c50: 69 6f 6e 20 73 65 74 6f 6e 65 28 69 64 2c 20 63 ion setone(id, c
4c60: 6c 72 29 7b 0a 20 20 40 20 20 20 69 66 28 20 70 lr){. @ if( p
4c70: 61 72 65 6e 74 6f 66 5b 69 64 5d 3d 3d 6e 75 6c arentof[id]==nul
4c80: 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 l ) return 0;.
4c90: 40 20 20 20 76 61 72 20 77 20 3d 20 64 6f 63 75 @ var w = docu
4ca0: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 ment.getElementB
4cb0: 79 49 64 28 69 64 29 3b 0a 20 20 40 20 20 20 69 yId(id);. @ i
4cc0: 66 28 20 77 2e 73 74 79 6c 65 2e 63 6f 6c 6f 72 f( w.style.color
4cd0: 3d 3d 63 6c 72 20 29 7b 0a 20 20 40 20 20 20 20 ==clr ){. @
4ce0: 20 72 65 74 75 72 6e 20 30 0a 20 20 40 20 20 20 return 0. @
4cf0: 7d 65 6c 73 65 7b 0a 20 20 40 20 20 20 20 20 77 }else{. @ w
4d00: 2e 73 74 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20 63 .style.color = c
4d10: 6c 72 0a 20 20 40 20 20 20 20 20 72 65 74 75 72 lr. @ retur
4d20: 6e 20 31 0a 20 20 40 20 20 20 7d 0a 20 20 40 20 n 1. @ }. @
4d30: 7d 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e 20 78 }. @ function x
4d40: 69 6e 28 69 64 29 20 7b 0a 20 20 40 20 20 20 73 in(id) {. @ s
4d50: 65 74 61 6c 6c 28 22 23 66 66 66 66 66 66 22 29 etall("#ffffff")
4d60: 3b 0a 20 20 40 20 20 20 73 65 74 6f 6e 65 28 69 ;. @ setone(i
4d70: 64 2c 22 23 66 66 30 30 30 30 22 29 3b 0a 20 20 d,"#ff0000");.
4d80: 40 20 20 20 73 65 74 5f 63 68 69 6c 64 72 65 6e @ set_children
4d90: 28 69 64 2c 20 22 23 62 30 62 30 62 30 22 29 3b (id, "#b0b0b0");
4da0: 0a 20 20 40 20 20 20 73 65 74 5f 70 61 72 65 6e . @ set_paren
4db0: 74 73 28 69 64 2c 20 22 23 62 30 62 30 62 30 22 ts(id, "#b0b0b0"
4dc0: 29 3b 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72 );. @ for(var
4dd0: 20 78 20 69 6e 20 70 61 72 65 6e 74 6f 66 5b 69 x in parentof[i
4de0: 64 5d 29 7b 0a 20 20 40 20 20 20 20 20 76 61 72 d]){. @ var
4df0: 20 70 69 64 20 3d 20 70 61 72 65 6e 74 6f 66 5b pid = parentof[
4e00: 69 64 5d 5b 78 5d 0a 20 20 40 20 20 20 20 20 76 id][x]. @ v
4e10: 61 72 20 77 20 3d 20 64 6f 63 75 6d 65 6e 74 2e ar w = document.
4e20: 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 70 getElementById(p
4e30: 69 64 29 3b 0a 20 20 40 20 20 20 20 20 69 66 28 id);. @ if(
4e40: 20 77 21 3d 6e 75 6c 6c 20 29 7b 0a 20 20 40 20 w!=null ){. @
4e50: 20 20 20 20 20 20 77 2e 73 74 79 6c 65 2e 63 6f w.style.co
4e60: 6c 6f 72 20 3d 20 22 23 30 30 30 30 30 30 22 3b lor = "#000000";
4e70: 0a 20 20 40 20 20 20 20 20 7d 0a 20 20 40 20 20 . @ }. @
4e80: 20 7d 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72 }. @ for(var
4e90: 20 78 20 69 6e 20 63 68 69 6c 64 6f 66 5b 69 64 x in childof[id
4ea0: 5d 29 7b 0a 20 20 40 20 20 20 20 20 76 61 72 20 ]){. @ var
4eb0: 63 69 64 20 3d 20 63 68 69 6c 64 6f 66 5b 69 64 cid = childof[id
4ec0: 5d 5b 78 5d 0a 20 20 40 20 20 20 20 20 76 61 72 ][x]. @ var
4ed0: 20 77 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 w = document.ge
4ee0: 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 63 69 64 tElementById(cid
4ef0: 29 3b 0a 20 20 40 20 20 20 20 20 69 66 28 20 77 );. @ if( w
4f00: 21 3d 6e 75 6c 6c 20 29 7b 0a 20 20 40 20 20 20 !=null ){. @
4f10: 20 20 20 20 77 2e 73 74 79 6c 65 2e 63 6f 6c 6f w.style.colo
4f20: 72 20 3d 20 22 23 30 30 30 30 30 30 22 3b 0a 20 r = "#000000";.
4f30: 20 40 20 20 20 20 20 7d 0a 20 20 40 20 20 20 7d @ }. @ }
4f40: 0a 20 20 40 20 7d 0a 20 20 40 20 66 75 6e 63 74 . @ }. @ funct
4f50: 69 6f 6e 20 78 6f 75 74 28 69 64 29 20 7b 0a 20 ion xout(id) {.
4f60: 20 40 20 20 20 2f 2a 20 73 65 74 61 6c 6c 28 22 @ /* setall("
4f70: 23 30 30 30 30 30 30 22 29 3b 20 2a 2f 0a 20 20 #000000"); */.
4f80: 40 20 7d 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e @ }. @ function
4f90: 20 73 65 74 5f 70 61 72 65 6e 74 73 28 69 64 2c set_parents(id,
4fa0: 20 63 6c 72 29 7b 0a 20 20 40 20 20 20 76 61 72 clr){. @ var
4fb0: 20 70 6c 69 73 74 20 3d 20 70 61 72 65 6e 74 6f plist = parento
4fc0: 66 5b 69 64 5d 3b 0a 20 20 40 20 20 20 69 66 28 f[id];. @ if(
4fd0: 20 70 6c 69 73 74 3d 3d 6e 75 6c 6c 20 29 20 72 plist==null ) r
4fe0: 65 74 75 72 6e 3b 0a 20 20 40 20 20 20 66 6f 72 eturn;. @ for
4ff0: 28 76 61 72 20 78 20 69 6e 20 70 6c 69 73 74 29 (var x in plist)
5000: 7b 0a 20 20 40 20 20 20 20 20 76 61 72 20 70 69 {. @ var pi
5010: 64 20 3d 20 70 6c 69 73 74 5b 78 5d 3b 0a 20 20 d = plist[x];.
5020: 40 20 20 20 20 20 69 66 28 20 73 65 74 6f 6e 65 @ if( setone
5030: 28 70 69 64 2c 63 6c 72 29 3d 3d 31 20 29 7b 0a (pid,clr)==1 ){.
5040: 20 20 40 20 20 20 20 20 20 20 73 65 74 5f 70 61 @ set_pa
5050: 72 65 6e 74 73 28 70 69 64 2c 63 6c 72 29 3b 0a rents(pid,clr);.
5060: 20 20 40 20 20 20 20 20 7d 0a 20 20 40 20 20 20 @ }. @
5070: 7d 0a 20 20 40 20 7d 0a 20 20 40 20 66 75 6e 63 }. @ }. @ func
5080: 74 69 6f 6e 20 73 65 74 5f 63 68 69 6c 64 72 65 tion set_childre
5090: 6e 28 69 64 2c 63 6c 72 29 7b 0a 20 20 40 20 20 n(id,clr){. @
50a0: 20 76 61 72 20 63 6c 69 73 74 20 3d 20 63 68 69 var clist = chi
50b0: 6c 64 6f 66 5b 69 64 5d 3b 0a 20 20 40 20 20 20 ldof[id];. @
50c0: 69 66 28 20 63 6c 69 73 74 3d 3d 6e 75 6c 6c 20 if( clist==null
50d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 40 20 20 20 ) return;. @
50e0: 66 6f 72 28 76 61 72 20 78 20 69 6e 20 63 6c 69 for(var x in cli
50f0: 73 74 29 7b 0a 20 20 40 20 20 20 20 20 76 61 72 st){. @ var
5100: 20 63 69 64 20 3d 20 63 6c 69 73 74 5b 78 5d 3b cid = clist[x];
5110: 0a 20 20 40 20 20 20 20 20 69 66 28 20 73 65 74 . @ if( set
5120: 6f 6e 65 28 63 69 64 2c 63 6c 72 29 3d 3d 31 20 one(cid,clr)==1
5130: 29 7b 0a 20 20 40 20 20 20 20 20 20 20 73 65 74 ){. @ set
5140: 5f 63 68 69 6c 64 72 65 6e 28 63 69 64 2c 63 6c _children(cid,cl
5150: 72 29 3b 0a 20 20 40 20 20 20 20 20 7d 0a 20 20 r);. @ }.
5160: 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20 40 20 @ }. @ }. @
5170: 3c 2f 73 63 72 69 70 74 3e 0a 20 20 73 74 79 6c </script>. styl
5180: 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f e_footer();.}../
5190: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 71 *.** The input q
51a0: 75 65 72 79 20 71 20 73 65 6c 65 63 74 73 20 76 uery q selects v
51b0: 61 72 69 6f 75 73 20 72 65 63 6f 72 64 73 2e 20 arious records.
51c0: 20 50 72 69 6e 74 20 61 20 68 75 6d 61 6e 2d 72 Print a human-r
51d0: 65 61 64 61 62 6c 65 0a 2a 2a 20 73 75 6d 6d 61 eadable.** summa
51e0: 72 79 20 6f 66 20 74 68 6f 73 65 20 72 65 63 6f ry of those reco
51f0: 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 4c 69 6d 69 74 rds..**.** Limit
5200: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 the number of e
5210: 6e 74 72 69 65 73 20 70 72 69 6e 74 65 64 20 74 ntries printed t
5220: 6f 20 6e 4c 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 o nLine..** .**
5230: 54 68 65 20 71 75 65 72 79 20 73 68 6f 75 6c 64 The query should
5240: 20 72 65 74 75 72 6e 20 74 68 65 73 65 20 63 6f return these co
5250: 6c 75 6d 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 lumns:.**.**
5260: 30 2e 20 20 72 69 64 0a 2a 2a 20 20 20 20 31 2e 0. rid.** 1.
5270: 20 20 75 75 69 64 0a 2a 2a 20 20 20 20 32 2e 20 uuid.** 2.
5280: 20 44 61 74 65 2f 54 69 6d 65 0a 2a 2a 20 20 20 Date/Time.**
5290: 20 33 2e 20 20 43 6f 6d 6d 65 6e 74 20 73 74 72 3. Comment str
52a0: 69 6e 67 20 61 6e 64 20 75 73 65 72 0a 2a 2a 20 ing and user.**
52b0: 20 20 20 34 2e 20 20 4e 75 6d 62 65 72 20 6f 66 4. Number of
52c0: 20 6e 6f 6e 2d 6d 65 72 67 65 20 63 68 69 6c 64 non-merge child
52d0: 72 65 6e 0a 2a 2a 20 20 20 20 35 2e 20 20 4e 75 ren.** 5. Nu
52e0: 6d 62 65 72 20 6f 66 20 70 61 72 65 6e 74 73 0a mber of parents.
52f0: 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f 74 69 */.void print_ti
5300: 6d 65 6c 69 6e 65 28 53 74 6d 74 20 2a 71 2c 20 meline(Stmt *q,
5310: 69 6e 74 20 6d 78 4c 69 6e 65 29 7b 0a 20 20 69 int mxLine){. i
5320: 6e 74 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 nt nLine = 0;.
5330: 63 68 61 72 20 7a 50 72 65 76 44 61 74 65 5b 32 char zPrevDate[2
5340: 30 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 0];. const char
5350: 20 2a 7a 43 75 72 72 65 6e 74 55 75 69 64 3d 30 *zCurrentUuid=0
5360: 3b 0a 20 20 7a 50 72 65 76 44 61 74 65 5b 30 5d ;. zPrevDate[0]
5370: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 67 2e 6c = 0;.. if( g.l
5380: 6f 63 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 ocalOpen ){.
5390: 69 6e 74 20 72 69 64 20 3d 20 64 62 5f 6c 67 65 int rid = db_lge
53a0: 74 5f 69 6e 74 28 22 63 68 65 63 6b 6f 75 74 22 t_int("checkout"
53b0: 2c 20 30 29 3b 0a 20 20 20 20 7a 43 75 72 72 65 , 0);. zCurre
53c0: 6e 74 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74 ntUuid = db_text
53d0: 28 30 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 (0, "SELECT uuid
53e0: 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 FROM blob WHERE
53f0: 20 72 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a rid=%d", rid);.
5400: 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 64 62 }.. while( db
5410: 5f 73 74 65 70 28 71 29 3d 3d 53 51 4c 49 54 45 _step(q)==SQLITE
5420: 5f 52 4f 57 20 26 26 20 6e 4c 69 6e 65 3c 3d 6d _ROW && nLine<=m
5430: 78 4c 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 xLine ){. int
5440: 20 72 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e rid = db_column
5450: 5f 69 6e 74 28 71 2c 20 30 29 3b 0a 20 20 20 20 _int(q, 0);.
5460: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 20 const char *zId
5470: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 = db_column_text
5480: 28 71 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 (q, 1);. cons
5490: 74 20 63 68 61 72 20 2a 7a 44 61 74 65 20 3d 20 t char *zDate =
54a0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 71 db_column_text(q
54b0: 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 , 2);. const
54c0: 63 68 61 72 20 2a 7a 43 6f 6d 20 3d 20 64 62 5f char *zCom = db_
54d0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 71 2c 20 33 column_text(q, 3
54e0: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 68 69 6c );. int nChil
54f0: 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e d = db_column_in
5500: 74 28 71 2c 20 34 29 3b 0a 20 20 20 20 69 6e 74 t(q, 4);. int
5510: 20 6e 50 61 72 65 6e 74 20 3d 20 64 62 5f 63 6f nParent = db_co
5520: 6c 75 6d 6e 5f 69 6e 74 28 71 2c 20 35 29 3b 0a lumn_int(q, 5);.
5530: 20 20 20 20 63 68 61 72 20 2a 7a 46 72 65 65 20 char *zFree
5540: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d = 0;. int n =
5550: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 50 72 0;. char zPr
5560: 65 66 69 78 5b 38 30 5d 3b 0a 20 20 20 20 63 68 efix[80];. ch
5570: 61 72 20 7a 55 75 69 64 5b 55 55 49 44 5f 53 49 ar zUuid[UUID_SI
5580: 5a 45 2b 31 5d 3b 0a 20 20 20 20 0a 20 20 20 20 ZE+1];. .
5590: 73 70 72 69 6e 74 66 28 7a 55 75 69 64 2c 20 22 sprintf(zUuid, "
55a0: 25 2e 31 30 73 22 2c 20 7a 49 64 29 3b 0a 20 20 %.10s", zId);.
55b0: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 7a 44 61 if( memcmp(zDa
55c0: 74 65 2c 20 7a 50 72 65 76 44 61 74 65 2c 20 31 te, zPrevDate, 1
55d0: 30 29 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 0) ){. prin
55e0: 74 66 28 22 3d 3d 3d 20 25 2e 31 30 73 20 3d 3d tf("=== %.10s ==
55f0: 3d 5c 6e 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20 =\n", zDate);.
5600: 20 20 20 20 6d 65 6d 63 70 79 28 7a 50 72 65 76 memcpy(zPrev
5610: 44 61 74 65 2c 20 7a 44 61 74 65 2c 20 31 30 29 Date, zDate, 10)
5620: 3b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b ;. nLine++;
5630: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a . }. if( z
5640: 43 6f 6d 3d 3d 30 20 29 20 7a 43 6f 6d 20 3d 20 Com==0 ) zCom =
5650: 22 22 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 "";. printf("
5660: 25 2e 38 73 20 22 2c 20 26 7a 44 61 74 65 5b 31 %.8s ", &zDate[1
5670: 31 5d 29 3b 0a 20 20 20 20 7a 50 72 65 66 69 78 1]);. zPrefix
5680: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 [0] = 0;. if(
5690: 20 6e 50 61 72 65 6e 74 3e 31 20 29 7b 0a 20 20 nParent>1 ){.
56a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 sqlite3_snpr
56b0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65 intf(sizeof(zPre
56c0: 66 69 78 29 2c 20 7a 50 72 65 66 69 78 2c 20 22 fix), zPrefix, "
56d0: 2a 4d 45 52 47 45 2a 20 22 29 3b 0a 20 20 20 20 *MERGE* ");.
56e0: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 72 n = strlen(zPr
56f0: 65 66 69 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 efix);. }.
5700: 20 69 66 28 20 6e 43 68 69 6c 64 3e 31 20 29 7b if( nChild>1 ){
5710: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 . const cha
5720: 72 20 2a 7a 42 72 54 79 70 65 3b 0a 20 20 20 20 r *zBrType;.
5730: 20 20 69 66 28 20 63 6f 75 6e 74 5f 6e 6f 6e 62 if( count_nonb
5740: 72 61 6e 63 68 5f 63 68 69 6c 64 72 65 6e 28 72 ranch_children(r
5750: 69 64 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 id)>1 ){.
5760: 20 7a 42 72 54 79 70 65 20 3d 20 22 2a 46 4f 52 zBrType = "*FOR
5770: 4b 2a 20 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 K* ";. }els
5780: 65 7b 0a 20 20 20 20 20 20 20 20 7a 42 72 54 79 e{. zBrTy
5790: 70 65 20 3d 20 22 2a 42 52 41 4e 43 48 2a 20 22 pe = "*BRANCH* "
57a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
57b0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
57c0: 28 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 (sizeof(zPrefix)
57d0: 2d 6e 2c 20 26 7a 50 72 65 66 69 78 5b 6e 5d 2c -n, &zPrefix[n],
57e0: 20 7a 42 72 54 79 70 65 29 3b 0a 20 20 20 20 20 zBrType);.
57f0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 n = strlen(zPre
5800: 66 69 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 fix);. }.
5810: 69 66 28 20 7a 43 75 72 72 65 6e 74 55 75 69 64 if( zCurrentUuid
5820: 20 26 26 20 73 74 72 63 6d 70 28 7a 43 75 72 72 && strcmp(zCurr
5830: 65 6e 74 55 75 69 64 2c 7a 49 64 29 3d 3d 30 20 entUuid,zId)==0
5840: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
5850: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 _snprintf(sizeof
5860: 28 7a 50 72 65 66 69 78 29 2d 6e 2c 20 26 7a 50 (zPrefix)-n, &zP
5870: 72 65 66 69 78 5b 6e 5d 2c 20 22 2a 43 55 52 52 refix[n], "*CURR
5880: 45 4e 54 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e ENT* ");. n
5890: 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 += strlen(zPref
58a0: 69 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a ix);. }. z
58b0: 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d Free = sqlite3_m
58c0: 70 72 69 6e 74 66 28 22 5b 25 2e 31 30 73 5d 20 printf("[%.10s]
58d0: 25 73 25 73 22 2c 20 7a 55 75 69 64 2c 20 7a 50 %s%s", zUuid, zP
58e0: 72 65 66 69 78 2c 20 7a 43 6f 6d 29 3b 0a 20 20 refix, zCom);.
58f0: 20 20 6e 4c 69 6e 65 20 2b 3d 20 63 6f 6d 6d 65 nLine += comme
5900: 6e 74 5f 70 72 69 6e 74 28 7a 46 72 65 65 2c 20 nt_print(zFree,
5910: 39 2c 20 37 39 29 3b 0a 20 20 20 20 73 71 6c 69 9, 79);. sqli
5920: 74 65 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b te3_free(zFree);
5930: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 . }.}../*.** Re
5940: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 turn a pointer t
5950: 6f 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e o a static strin
5960: 67 20 74 68 61 74 20 66 6f 72 6d 73 20 74 68 65 g that forms the
5970: 20 62 61 73 69 73 20 66 6f 72 0a 2a 2a 20 61 20 basis for.** a
5980: 74 69 6d 65 6c 69 6e 65 20 71 75 65 72 79 20 66 timeline query f
5990: 6f 72 20 64 69 73 70 6c 61 79 20 6f 6e 20 61 20 or display on a
59a0: 54 54 59 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 TTY..*/.const ch
59b0: 61 72 20 2a 74 69 6d 65 6c 69 6e 65 5f 71 75 65 ar *timeline_que
59c0: 72 79 5f 66 6f 72 5f 74 74 79 28 76 6f 69 64 29 ry_for_tty(void)
59d0: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 {. static const
59e0: 20 63 68 61 72 20 7a 42 61 73 65 53 71 6c 5b 5d char zBaseSql[]
59f0: 20 3d 20 0a 20 20 20 20 40 20 53 45 4c 45 43 54 = . @ SELECT
5a00: 0a 20 20 20 20 40 20 20 20 62 6c 6f 62 2e 72 69 . @ blob.ri
5a10: 64 2c 0a 20 20 20 20 40 20 20 20 75 75 69 64 2c d,. @ uuid,
5a20: 0a 20 20 20 20 40 20 20 20 64 61 74 65 74 69 6d . @ datetim
5a30: 65 28 65 76 65 6e 74 2e 6d 74 69 6d 65 2c 27 6c e(event.mtime,'l
5a40: 6f 63 61 6c 74 69 6d 65 27 29 2c 0a 20 20 20 20 ocaltime'),.
5a50: 40 20 20 20 63 6f 61 6c 65 73 63 65 28 65 63 6f @ coalesce(eco
5a60: 6d 6d 65 6e 74 2c 63 6f 6d 6d 65 6e 74 29 0a 20 mment,comment).
5a70: 20 20 20 40 20 20 20 20 20 7c 7c 20 27 20 28 75 @ || ' (u
5a80: 73 65 72 3a 20 27 20 7c 7c 20 63 6f 61 6c 65 73 ser: ' || coales
5a90: 63 65 28 65 75 73 65 72 2c 75 73 65 72 2c 27 3f ce(euser,user,'?
5aa0: 27 29 0a 20 20 20 20 40 20 20 20 20 20 7c 7c 20 '). @ ||
5ab0: 28 53 45 4c 45 43 54 20 63 61 73 65 20 77 68 65 (SELECT case whe
5ac0: 6e 20 6c 65 6e 67 74 68 28 78 29 3e 30 20 74 68 n length(x)>0 th
5ad0: 65 6e 20 27 20 74 61 67 73 3a 20 27 20 7c 7c 20 en ' tags: ' ||
5ae0: 78 20 65 6c 73 65 20 27 27 20 65 6e 64 0a 20 20 x else '' end.
5af0: 20 20 40 20 20 20 20 20 20 20 20 20 20 20 46 52 @ FR
5b00: 4f 4d 20 28 53 45 4c 45 43 54 20 67 72 6f 75 70 OM (SELECT group
5b10: 5f 63 6f 6e 63 61 74 28 73 75 62 73 74 72 28 74 _concat(substr(t
5b20: 61 67 6e 61 6d 65 2c 35 29 2c 20 27 2c 20 27 29 agname,5), ', ')
5b30: 20 41 53 20 78 0a 20 20 20 20 40 20 20 20 20 20 AS x. @
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 52 FR
5b50: 4f 4d 20 74 61 67 2c 20 74 61 67 78 72 65 66 0a OM tag, tagxref.
5b60: 20 20 20 20 40 20 20 20 20 20 20 20 20 20 20 20 @
5b70: 20 20 20 20 20 20 20 57 48 45 52 45 20 74 61 67 WHERE tag
5b80: 6e 61 6d 65 20 47 4c 4f 42 20 27 73 79 6d 2d 2a name GLOB 'sym-*
5b90: 27 20 41 4e 44 20 74 61 67 2e 74 61 67 69 64 3d ' AND tag.tagid=
5ba0: 74 61 67 78 72 65 66 2e 74 61 67 69 64 0a 20 20 tagxref.tagid.
5bb0: 20 20 40 20 20 20 20 20 20 20 20 20 20 20 20 20 @
5bc0: 20 20 20 20 20 20 20 41 4e 44 20 74 61 67 78 72 AND tagxr
5bd0: 65 66 2e 72 69 64 3d 62 6c 6f 62 2e 72 69 64 20 ef.rid=blob.rid
5be0: 41 4e 44 20 74 61 67 78 72 65 66 2e 74 61 67 74 AND tagxref.tagt
5bf0: 79 70 65 3e 30 29 29 0a 20 20 20 20 40 20 20 20 ype>0)). @
5c00: 20 20 7c 7c 20 27 29 27 2c 0a 20 20 20 20 40 20 || ')',. @
5c10: 20 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 (SELECT count(
5c20: 2a 29 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 *) FROM plink WH
5c30: 45 52 45 20 70 69 64 3d 62 6c 6f 62 2e 72 69 64 ERE pid=blob.rid
5c40: 20 41 4e 44 20 69 73 70 72 69 6d 29 2c 0a 20 20 AND isprim),.
5c50: 20 20 40 20 20 20 28 53 45 4c 45 43 54 20 63 6f @ (SELECT co
5c60: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 6c 69 6e unt(*) FROM plin
5c70: 6b 20 57 48 45 52 45 20 63 69 64 3d 62 6c 6f 62 k WHERE cid=blob
5c80: 2e 72 69 64 29 0a 20 20 20 20 40 20 46 52 4f 4d .rid). @ FROM
5c90: 20 65 76 65 6e 74 2c 20 62 6c 6f 62 0a 20 20 20 event, blob.
5ca0: 20 40 20 57 48 45 52 45 20 62 6c 6f 62 2e 72 69 @ WHERE blob.ri
5cb0: 64 3d 65 76 65 6e 74 2e 6f 62 6a 69 64 0a 20 20 d=event.objid.
5cc0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 61 73 65 ;. return zBase
5cd0: 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 71 Sql;.}../*.** Eq
5ce0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 69 6d 65 uivalent to time
5cf0: 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72 5f 74 line_query_for_t
5d00: 74 79 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 ty(), except tha
5d10: 74 3a 0a 2a 2a 0a 2a 2a 20 61 29 20 61 63 63 65 t:.**.** a) acce
5d20: 70 74 73 20 61 20 74 68 65 20 2d 74 79 70 65 3d pts a the -type=
5d30: 58 58 20 66 6c 61 67 20 74 6f 20 73 65 74 20 74 XX flag to set t
5d40: 68 65 20 65 76 65 6e 74 20 74 79 70 65 20 74 6f he event type to
5d50: 20 66 69 6c 74 65 72 20 6f 6e 2e 0a 2a 2a 20 20 filter on..**
5d60: 20 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20 The values of
5d70: 58 58 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 XX are the same
5d80: 61 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 as supported by
5d90: 74 68 65 20 2f 74 69 6d 65 6c 69 6e 65 20 70 61 the /timeline pa
5da0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 62 29 20 54 68 65 ge..**.** b) The
5db0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 returned string
5dc0: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 75 must be freed u
5dd0: 73 69 6e 67 20 66 72 65 65 28 29 2e 0a 2a 2f 0a sing free()..*/.
5de0: 63 68 61 72 20 2a 20 74 69 6d 65 6c 69 6e 65 5f char * timeline_
5df0: 71 75 65 72 79 5f 66 6f 72 5f 74 74 79 5f 6d 28 query_for_tty_m(
5e00: 76 6f 69 64 29 7b 0a 20 20 42 6c 6f 62 20 62 6c void){. Blob bl
5e10: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a ;. char const *
5e20: 20 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 62 6c zType = 0;. bl
5e30: 6f 62 5f 7a 65 72 6f 28 26 62 6c 29 3b 0a 20 20 ob_zero(&bl);.
5e40: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 20 26 62 6c blob_append( &bl
5e50: 2c 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79 , timeline_query
5e60: 5f 66 6f 72 5f 74 74 79 28 29 2c 20 2d 31 20 29 _for_tty(), -1 )
5e70: 3b 0a 20 20 7a 54 79 70 65 20 3d 20 66 69 6e 64 ;. zType = find
5e80: 5f 6f 70 74 69 6f 6e 28 20 22 74 79 70 65 22 2c _option( "type",
5e90: 20 22 74 22 2c 20 31 20 29 3b 0a 20 20 69 66 28 "t", 1 );. if(
5ea0: 20 7a 54 79 70 65 20 26 26 20 2a 7a 54 79 70 65 zType && *zType
5eb0: 20 29 0a 20 20 7b 0a 20 20 20 20 20 20 62 6c 6f ). {. blo
5ec0: 62 5f 61 70 70 65 6e 64 66 28 20 26 62 6c 2c 20 b_appendf( &bl,
5ed0: 22 20 41 4e 44 20 65 76 65 6e 74 2e 74 79 70 65 " AND event.type
5ee0: 3d 25 51 22 2c 20 7a 54 79 70 65 20 29 3b 0a 20 =%Q", zType );.
5ef0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 6c 6f 62 }. return blob
5f00: 5f 62 75 66 66 65 72 28 26 62 6c 29 3b 0a 7d 0a _buffer(&bl);.}.
5f10: 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 ./*.** COMMAND:
5f20: 74 69 6d 65 6c 69 6e 65 0a 2a 2a 0a 2a 2a 20 55 timeline.**.** U
5f30: 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20 74 69 sage: %fossil ti
5f40: 6d 65 6c 69 6e 65 20 3f 57 48 45 4e 3f 20 3f 42 meline ?WHEN? ?B
5f50: 41 53 45 4c 49 4e 45 7c 44 41 54 45 54 49 4d 45 ASELINE|DATETIME
5f60: 3f 20 3f 2d 6e 7c 2d 2d 63 6f 75 6e 74 20 4e 3f ? ?-n|--count N?
5f70: 20 3f 2d 74 7c 2d 2d 74 79 70 65 20 54 59 50 45 ?-t|--type TYPE
5f80: 3f 0a 2a 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 ?.**.** Print a
5f90: 73 75 6d 6d 61 72 79 20 6f 66 20 61 63 74 69 76 summary of activ
5fa0: 69 74 79 20 67 6f 69 6e 67 20 62 61 63 6b 77 61 ity going backwa
5fb0: 72 64 73 20 69 6e 20 64 61 74 65 20 61 6e 64 20 rds in date and
5fc0: 74 69 6d 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 time.** specifie
5fd0: 64 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 63 75 d or from the cu
5fe0: 72 72 65 6e 74 20 64 61 74 65 20 61 6e 64 20 74 rrent date and t
5ff0: 69 6d 65 20 69 66 20 6e 6f 20 61 72 67 75 6d 65 ime if no argume
6000: 6e 74 73 0a 2a 2a 20 61 72 65 20 67 69 76 65 6e nts.** are given
6010: 2e 20 20 53 68 6f 77 20 61 73 20 6d 61 6e 79 20 . Show as many
6020: 61 73 20 4e 20 28 64 65 66 61 75 6c 74 20 32 30 as N (default 20
6030: 29 20 63 68 65 63 6b 2d 69 6e 73 2e 20 20 54 68 ) check-ins. Th
6040: 65 0a 2a 2a 20 57 48 45 4e 20 61 72 67 75 6d 65 e.** WHEN argume
6050: 6e 74 20 63 61 6e 20 62 65 20 61 6e 79 20 75 6e nt can be any un
6060: 69 71 75 65 20 61 62 62 72 65 76 69 61 74 69 6f ique abbreviatio
6070: 6e 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 73 n of one of thes
6080: 65 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 3a 0a 2a e.** keywords:.*
6090: 2a 0a 2a 2a 20 20 20 20 20 62 65 66 6f 72 65 0a *.** before.
60a0: 2a 2a 20 20 20 20 20 61 66 74 65 72 0a 2a 2a 20 ** after.**
60b0: 20 20 20 20 64 65 73 63 65 6e 64 61 6e 74 73 20 descendants
60c0: 7c 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 20 20 | children.**
60d0: 20 20 61 6e 63 65 73 74 6f 72 73 20 7c 20 70 61 ancestors | pa
60e0: 72 65 6e 74 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 rents.**.** The
60f0: 42 41 53 45 4c 49 4e 45 20 63 61 6e 20 62 65 20 BASELINE can be
6100: 61 6e 79 20 75 6e 69 71 75 65 20 70 72 65 66 69 any unique prefi
6110: 78 20 6f 66 20 34 20 63 68 61 72 61 63 74 65 72 x of 4 character
6120: 73 20 6f 72 20 6d 6f 72 65 2e 0a 2a 2a 20 54 68 s or more..** Th
6130: 65 20 44 41 54 45 54 49 4d 45 20 73 68 6f 75 6c e DATETIME shoul
6140: 64 20 62 65 20 69 6e 20 74 68 65 20 49 53 4f 38 d be in the ISO8
6150: 36 30 31 20 66 6f 72 6d 61 74 2e 20 20 46 6f 72 601 format. For
6160: 0a 2a 2a 20 65 78 61 6d 70 6c 65 73 3a 20 22 32 .** examples: "2
6170: 30 30 37 2d 30 38 2d 31 38 20 30 37 3a 32 31 3a 007-08-18 07:21:
6180: 32 31 22 2e 20 20 59 6f 75 20 63 61 6e 20 61 6c 21". You can al
6190: 73 6f 20 73 61 79 20 22 63 75 72 72 65 6e 74 22 so say "current"
61a0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 .** for the curr
61b0: 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 72 20 22 ent version or "
61c0: 6e 6f 77 22 20 66 6f 72 20 74 68 65 20 63 75 72 now" for the cur
61d0: 72 65 6e 74 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a rent time..**.**
61e0: 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 20 54 59 The optional TY
61f0: 50 45 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 20 PE argument may
6200: 61 6e 79 20 74 79 70 65 73 20 73 75 70 70 6f 72 any types suppor
6210: 74 65 64 20 62 79 20 74 68 65 20 2f 74 69 6d 65 ted by the /time
6220: 6c 69 6e 65 0a 2a 2a 20 70 61 67 65 2e 20 46 6f line.** page. Fo
6230: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a r example:.**.**
6240: 20 20 20 20 20 77 20 20 3d 20 77 69 6b 69 20 63 w = wiki c
6250: 6f 6d 6d 69 74 73 20 6f 6e 6c 79 0a 2a 2a 20 20 ommits only.**
6260: 20 20 20 63 69 20 3d 20 66 69 6c 65 20 63 6f 6d ci = file com
6270: 6d 69 74 73 20 6f 6e 6c 79 0a 2a 2a 20 20 20 20 mits only.**
6280: 20 74 20 20 3d 20 74 69 63 6b 65 74 73 20 6f 6e t = tickets on
6290: 6c 79 0a 2a 2f 0a 76 6f 69 64 20 74 69 6d 65 6c ly.*/.void timel
62a0: 69 6e 65 5f 63 6d 64 28 76 6f 69 64 29 7b 0a 20 ine_cmd(void){.
62b0: 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74 20 6e Stmt q;. int n
62c0: 2c 20 6b 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 , k;. const cha
62d0: 72 20 2a 7a 43 6f 75 6e 74 3b 0a 20 20 63 6f 6e r *zCount;. con
62e0: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a st char *zType;.
62f0: 20 20 63 68 61 72 20 2a 7a 4f 72 69 67 69 6e 3b char *zOrigin;
6300: 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a . char *zDate;.
6310: 20 20 63 68 61 72 20 2a 7a 53 51 4c 3b 0a 20 20 char *zSQL;.
6320: 69 6e 74 20 6f 62 6a 69 64 20 3d 20 30 3b 0a 20 int objid = 0;.
6330: 20 42 6c 6f 62 20 75 75 69 64 3b 0a 20 20 69 6e Blob uuid;. in
6340: 74 20 6d 6f 64 65 20 3d 20 31 20 3b 20 20 20 20 t mode = 1 ;
6350: 20 20 20 2f 2a 20 31 3a 20 62 65 66 6f 72 65 20 /* 1: before
6360: 20 32 3a 61 66 74 65 72 20 20 33 3a 63 68 69 6c 2:after 3:chil
6370: 64 72 65 6e 20 20 34 3a 70 61 72 65 6e 74 73 20 dren 4:parents
6380: 2a 2f 0a 20 20 64 62 5f 66 69 6e 64 5f 61 6e 64 */. db_find_and
6390: 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79 _open_repository
63a0: 28 31 29 3b 0a 20 20 7a 43 6f 75 6e 74 20 3d 20 (1);. zCount =
63b0: 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 63 6f 75 find_option("cou
63c0: 6e 74 22 2c 22 6e 22 2c 31 29 3b 0a 20 20 7a 54 nt","n",1);. zT
63d0: 79 70 65 20 3d 20 66 69 6e 64 5f 6f 70 74 69 6f ype = find_optio
63e0: 6e 28 22 74 79 70 65 22 2c 22 74 22 2c 31 29 3b n("type","t",1);
63f0: 0a 20 20 69 66 28 20 7a 43 6f 75 6e 74 20 29 7b . if( zCount ){
6400: 0a 20 20 20 20 6e 20 3d 20 61 74 6f 69 28 7a 43 . n = atoi(zC
6410: 6f 75 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a ount);. }else{.
6420: 20 20 20 20 6e 20 3d 20 32 30 3b 0a 20 20 7d 0a n = 20;. }.
6430: 20 20 69 66 28 20 67 2e 61 72 67 63 3e 3d 34 20 if( g.argc>=4
6440: 29 7b 0a 20 20 20 20 6b 20 3d 20 73 74 72 6c 65 ){. k = strle
6450: 6e 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 n(g.argv[2]);.
6460: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 67 2e if( strncmp(g.
6470: 61 72 67 76 5b 32 5d 2c 22 62 65 66 6f 72 65 22 argv[2],"before"
6480: 2c 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 ,k)==0 ){.
6490: 6d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 mode = 1;. }e
64a0: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 lse if( strncmp(
64b0: 67 2e 61 72 67 76 5b 32 5d 2c 22 61 66 74 65 72 g.argv[2],"after
64c0: 22 2c 6b 29 3d 3d 30 20 26 26 20 6b 3e 31 20 29 ",k)==0 && k>1 )
64d0: 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 32 {. mode = 2
64e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 ;. }else if(
64f0: 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b 32 strncmp(g.argv[2
6500: 5d 2c 22 64 65 73 63 65 6e 64 61 6e 74 73 22 2c ],"descendants",
6510: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d k)==0 ){. m
6520: 6f 64 65 20 3d 20 33 3b 0a 20 20 20 20 7d 65 6c ode = 3;. }el
6530: 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 67 se if( strncmp(g
6540: 2e 61 72 67 76 5b 32 5d 2c 22 63 68 69 6c 64 72 .argv[2],"childr
6550: 65 6e 22 2c 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 en",k)==0 ){.
6560: 20 20 20 6d 6f 64 65 20 3d 20 33 3b 0a 20 20 20 mode = 3;.
6570: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 }else if( strnc
6580: 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 61 6e mp(g.argv[2],"an
6590: 63 65 73 74 6f 72 73 22 2c 6b 29 3d 3d 30 20 26 cestors",k)==0 &
65a0: 26 20 6b 3e 31 20 29 7b 0a 20 20 20 20 20 20 6d & k>1 ){. m
65b0: 6f 64 65 20 3d 20 34 3b 0a 20 20 20 20 7d 65 6c ode = 4;. }el
65c0: 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 67 se if( strncmp(g
65d0: 2e 61 72 67 76 5b 32 5d 2c 22 70 61 72 65 6e 74 .argv[2],"parent
65e0: 73 22 2c 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 s",k)==0 ){.
65f0: 20 20 6d 6f 64 65 20 3d 20 34 3b 0a 20 20 20 20 mode = 4;.
6600: 7d 65 6c 73 65 20 69 66 28 21 7a 54 79 70 65 20 }else if(!zType
6610: 26 26 20 21 7a 43 6f 75 6e 74 29 7b 0a 20 20 20 && !zCount){.
6620: 20 20 20 75 73 61 67 65 28 22 3f 57 48 45 4e 3f usage("?WHEN?
6630: 20 3f 42 41 53 45 4c 49 4e 45 7c 44 41 54 45 54 ?BASELINE|DATET
6640: 49 4d 45 3f 20 3f 2d 6e 7c 2d 2d 63 6f 75 6e 74 IME? ?-n|--count
6650: 20 4e 3f 20 3f 2d 74 20 54 59 50 45 3f 22 29 3b N? ?-t TYPE?");
6660: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 27 . }. if( '
6670: 2d 27 20 21 3d 20 2a 67 2e 61 72 67 76 5b 33 5d -' != *g.argv[3]
6680: 20 29 7b 0a 09 7a 4f 72 69 67 69 6e 20 3d 20 67 ){..zOrigin = g
6690: 2e 61 72 67 76 5b 33 5d 3b 0a 20 20 20 20 7d 65 .argv[3];. }e
66a0: 6c 73 65 7b 0a 09 7a 4f 72 69 67 69 6e 20 3d 20 lse{..zOrigin =
66b0: 22 6e 6f 77 22 3b 0a 20 20 20 20 7d 0a 20 20 7d "now";. }. }
66c0: 65 6c 73 65 20 69 66 28 20 67 2e 61 72 67 63 3d else if( g.argc=
66d0: 3d 33 20 29 7b 0a 20 20 20 20 7a 4f 72 69 67 69 =3 ){. zOrigi
66e0: 6e 20 3d 20 67 2e 61 72 67 76 5b 32 5d 3b 0a 20 n = g.argv[2];.
66f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4f 72 69 }else{. zOri
6700: 67 69 6e 20 3d 20 22 6e 6f 77 22 3b 0a 20 20 7d gin = "now";. }
6710: 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 7a 4f . k = strlen(zO
6720: 72 69 67 69 6e 29 3b 0a 20 20 62 6c 6f 62 5f 7a rigin);. blob_z
6730: 65 72 6f 28 26 75 75 69 64 29 3b 0a 20 20 62 6c ero(&uuid);. bl
6740: 6f 62 5f 61 70 70 65 6e 64 28 26 75 75 69 64 2c ob_append(&uuid,
6750: 20 7a 4f 72 69 67 69 6e 2c 20 2d 31 29 3b 0a 20 zOrigin, -1);.
6760: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 72 69 if( strcmp(zOri
6770: 67 69 6e 2c 20 22 6e 6f 77 22 29 3d 3d 30 20 29 gin, "now")==0 )
6780: 7b 0a 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d {. if( mode==
6790: 33 20 7c 7c 20 6d 6f 64 65 3d 3d 34 20 29 7b 0a 3 || mode==4 ){.
67a0: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 fossil_fat
67b0: 61 6c 28 22 63 61 6e 6e 6f 74 20 63 6f 6d 70 75 al("cannot compu
67c0: 74 65 20 64 65 73 63 65 6e 64 61 6e 74 73 20 6f te descendants o
67d0: 72 20 61 6e 63 65 73 74 6f 72 73 20 6f 66 20 61 r ancestors of a
67e0: 20 64 61 74 65 22 29 3b 0a 20 20 20 20 7d 0a 20 date");. }.
67f0: 20 20 20 7a 44 61 74 65 20 3d 20 6d 70 72 69 6e zDate = mprin
6800: 74 66 28 22 28 53 45 4c 45 43 54 20 64 61 74 65 tf("(SELECT date
6810: 74 69 6d 65 28 27 6e 6f 77 27 29 29 22 29 3b 0a time('now'))");.
6820: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e }else if( strn
6830: 63 6d 70 28 7a 4f 72 69 67 69 6e 2c 20 22 63 75 cmp(zOrigin, "cu
6840: 72 72 65 6e 74 22 2c 20 6b 29 3d 3d 30 20 29 7b rrent", k)==0 ){
6850: 0a 20 20 20 20 69 66 28 20 21 67 2e 6c 6f 63 61 . if( !g.loca
6860: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 66 lOpen ){. f
6870: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 6d 75 73 ossil_fatal("mus
6880: 74 20 62 65 20 77 69 74 68 69 6e 20 61 20 6c 6f t be within a lo
6890: 63 61 6c 20 63 68 65 63 6b 6f 75 74 20 74 6f 20 cal checkout to
68a0: 75 73 65 20 27 63 75 72 72 65 6e 74 27 22 29 3b use 'current'");
68b0: 0a 20 20 20 20 7d 0a 20 20 20 20 6f 62 6a 69 64 . }. objid
68c0: 20 3d 20 64 62 5f 6c 67 65 74 5f 69 6e 74 28 22 = db_lget_int("
68d0: 63 68 65 63 6b 6f 75 74 22 2c 30 29 3b 0a 20 20 checkout",0);.
68e0: 20 20 7a 44 61 74 65 20 3d 20 6d 70 72 69 6e 74 zDate = mprint
68f0: 66 28 22 28 53 45 4c 45 43 54 20 6d 74 69 6d 65 f("(SELECT mtime
6900: 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 FROM plink WHER
6910: 45 20 63 69 64 3d 25 64 29 22 2c 20 6f 62 6a 69 E cid=%d)", obji
6920: 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 d);. }else if(
6930: 6e 61 6d 65 5f 74 6f 5f 75 75 69 64 28 26 75 75 name_to_uuid(&uu
6940: 69 64 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 id, 0)==0 ){.
6950: 20 6f 62 6a 69 64 20 3d 20 64 62 5f 69 6e 74 28 objid = db_int(
6960: 30 2c 20 22 53 45 4c 45 43 54 20 72 69 64 20 46 0, "SELECT rid F
6970: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 75 ROM blob WHERE u
6980: 75 69 64 3d 25 42 22 2c 20 26 75 75 69 64 29 3b uid=%B", &uuid);
6990: 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 6d 70 72 . zDate = mpr
69a0: 69 6e 74 66 28 22 28 53 45 4c 45 43 54 20 6d 74 intf("(SELECT mt
69b0: 69 6d 65 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 ime FROM plink W
69c0: 48 45 52 45 20 63 69 64 3d 25 64 29 22 2c 20 6f HERE cid=%d)", o
69d0: 62 6a 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a bjid);. }else{.
69e0: 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 33 20 if( mode==3
69f0: 7c 7c 20 6d 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 || mode==4 ){.
6a00: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c fossil_fatal
6a10: 28 22 63 61 6e 6e 6f 74 20 63 6f 6d 70 75 74 65 ("cannot compute
6a20: 20 64 65 73 63 65 6e 64 61 6e 74 73 20 6f 72 20 descendants or
6a30: 61 6e 63 65 73 74 6f 72 73 20 6f 66 20 61 20 64 ancestors of a d
6a40: 61 74 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 ate");. }.
6a50: 20 7a 44 61 74 65 20 3d 20 6d 70 72 69 6e 74 66 zDate = mprintf
6a60: 28 22 28 53 45 4c 45 43 54 20 6a 75 6c 69 61 6e ("(SELECT julian
6a70: 64 61 79 28 25 51 2c 20 27 75 74 63 27 29 29 22 day(%Q, 'utc'))"
6a80: 2c 20 7a 4f 72 69 67 69 6e 29 3b 0a 20 20 7d 0a , zOrigin);. }.
6a90: 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66 zSQL = mprintf
6aa0: 28 22 25 7a 20 41 4e 44 20 65 76 65 6e 74 2e 6d ("%z AND event.m
6ab0: 74 69 6d 65 20 25 73 20 25 73 22 2c 0a 20 20 20 time %s %s",.
6ac0: 20 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79 timeline_query
6ad0: 5f 66 6f 72 5f 74 74 79 5f 6d 28 29 2c 0a 20 20 _for_tty_m(),.
6ae0: 20 20 20 28 6d 6f 64 65 3d 3d 31 20 7c 7c 20 6d (mode==1 || m
6af0: 6f 64 65 3d 3d 34 29 20 3f 20 22 3c 3d 22 20 3a ode==4) ? "<=" :
6b00: 20 22 3e 3d 22 2c 0a 20 20 20 20 20 7a 44 61 74 ">=",. zDat
6b10: 65 0a 20 20 29 3b 0a 20 20 69 66 28 20 6d 6f 64 e. );. if( mod
6b20: 65 3d 3d 33 20 7c 7c 20 6d 6f 64 65 3d 3d 34 20 e==3 || mode==4
6b30: 29 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f ){. db_multi_
6b40: 65 78 65 63 28 22 43 52 45 41 54 45 20 54 45 4d exec("CREATE TEM
6b50: 50 20 54 41 42 4c 45 20 6f 6b 28 72 69 64 20 49 P TABLE ok(rid I
6b60: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K
6b70: 45 59 29 22 29 3b 0a 20 20 20 20 69 66 28 20 6d EY)");. if( m
6b80: 6f 64 65 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 ode==3 ){.
6b90: 63 6f 6d 70 75 74 65 5f 64 65 73 63 65 6e 64 61 compute_descenda
6ba0: 6e 74 73 28 6f 62 6a 69 64 2c 20 6e 29 3b 0a 20 nts(objid, n);.
6bb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
6bc0: 63 6f 6d 70 75 74 65 5f 61 6e 63 65 73 74 6f 72 compute_ancestor
6bd0: 73 28 6f 62 6a 69 64 2c 20 6e 29 3b 0a 20 20 20 s(objid, n);.
6be0: 20 7d 0a 20 20 20 20 7a 53 51 4c 20 3d 20 6d 70 }. zSQL = mp
6bf0: 72 69 6e 74 66 28 22 25 7a 20 41 4e 44 20 62 6c rintf("%z AND bl
6c00: 6f 62 2e 72 69 64 20 49 4e 20 6f 6b 22 2c 20 7a ob.rid IN ok", z
6c10: 53 51 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 SQL);. }. if(
6c20: 7a 54 79 70 65 20 26 26 20 28 7a 54 79 70 65 5b zType && (zType[
6c30: 30 5d 21 3d 27 61 27 29 20 29 7b 0a 20 20 20 20 0]!='a') ){.
6c40: 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66 zSQL = mprintf
6c50: 28 20 22 25 7a 20 41 4e 44 20 65 76 65 6e 74 2e ( "%z AND event.
6c60: 74 79 70 65 3d 25 51 20 22 2c 20 7a 53 51 4c 2c type=%Q ", zSQL,
6c70: 20 7a 54 79 70 65 29 3b 0a 20 20 7d 0a 0a 20 20 zType);. }..
6c80: 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66 28 22 zSQL = mprintf("
6c90: 25 7a 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e %z ORDER BY even
6ca0: 74 2e 6d 74 69 6d 65 20 44 45 53 43 22 2c 20 7a t.mtime DESC", z
6cb0: 53 51 4c 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 SQL);. db_prepa
6cc0: 72 65 28 26 71 2c 20 7a 53 51 4c 29 3b 0a 20 20 re(&q, zSQL);.
6cd0: 66 72 65 65 28 20 7a 53 51 4c 20 29 3b 0a 20 20 free( zSQL );.
6ce0: 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 26 print_timeline(&
6cf0: 71 2c 20 6e 29 3b 0a 20 20 64 62 5f 66 69 6e 61 q, n);. db_fina
6d00: 6c 69 7a 65 28 26 71 29 3b 0a 7d 0a 0a 2f 2a 0a lize(&q);.}../*.
6d10: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72 ** This is a ver
6d20: 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 6c 6f 63 sion of the "loc
6d30: 61 6c 74 69 6d 65 28 29 22 20 66 75 6e 63 74 69 altime()" functi
6d40: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e on from the stan
6d50: 64 61 72 64 0a 2a 2a 20 43 20 6c 69 62 72 61 72 dard.** C librar
6d60: 79 2e 20 20 49 74 20 63 6f 6e 76 65 72 74 73 20 y. It converts
6d70: 61 20 75 6e 69 78 20 74 69 6d 65 73 74 61 6d 70 a unix timestamp
6d80: 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 (seconds since
6d90: 31 39 37 30 29 20 69 6e 74 6f 0a 2a 2a 20 61 20 1970) into.** a
6da0: 62 72 6f 6b 65 6e 2d 6f 75 74 20 6c 6f 63 61 6c broken-out local
6db0: 20 74 69 6d 65 20 73 74 72 75 63 74 75 72 65 2e time structure.
6dc0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 69 .**.** This modi
6dd0: 66 69 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 fied version of
6de0: 6c 6f 63 61 6c 74 69 6d 65 28 29 20 77 6f 72 6b localtime() work
6df0: 73 20 6c 69 6b 65 20 74 68 65 20 6c 69 62 72 61 s like the libra
6e00: 72 79 20 6c 6f 63 61 6c 74 69 6d 65 28 29 0a 2a ry localtime().*
6e10: 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 45 * by default. E
6e20: 78 63 65 70 74 20 69 66 20 74 68 65 20 74 69 6d xcept if the tim
6e30: 65 6c 69 6e 65 2d 75 74 63 20 70 72 6f 70 65 72 eline-utc proper
6e40: 74 79 20 69 73 20 73 65 74 2c 20 74 68 69 73 20 ty is set, this
6e50: 72 6f 75 74 69 6e 65 0a 2a 2a 20 75 73 65 73 20 routine.** uses
6e60: 67 6d 74 74 69 6d 65 28 29 20 69 6e 73 74 65 61 gmttime() instea
6e70: 64 2e 20 20 54 68 75 73 20 62 79 20 73 65 74 74 d. Thus by sett
6e80: 69 6e 67 20 74 68 65 20 74 69 6d 65 6c 69 6e 65 ing the timeline
6e90: 2d 75 74 63 20 70 72 6f 70 65 72 74 79 2c 20 77 -utc property, w
6ea0: 65 0a 2a 2a 20 63 61 6e 20 67 65 74 20 61 6c 6c e.** can get all
6eb0: 20 6c 6f 63 61 6c 74 69 6d 65 73 20 74 6f 20 62 localtimes to b
6ec0: 65 20 64 69 73 70 6c 61 79 65 64 20 61 74 20 55 e displayed at U
6ed0: 54 43 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 72 75 TC time..*/.stru
6ee0: 63 74 20 74 6d 20 2a 66 6f 73 73 69 6c 5f 6c 6f ct tm *fossil_lo
6ef0: 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 caltime(const ti
6f00: 6d 65 5f 74 20 2a 63 6c 6f 63 6b 29 7b 0a 20 20 me_t *clock){.
6f10: 69 66 28 20 67 2e 66 54 69 6d 65 46 6f 72 6d 61 if( g.fTimeForma
6f20: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 t==0 ){. if(
6f30: 64 62 5f 67 65 74 5f 69 6e 74 28 22 74 69 6d 65 db_get_int("time
6f40: 6c 69 6e 65 2d 75 74 63 22 2c 20 31 29 20 29 7b line-utc", 1) ){
6f50: 0a 20 20 20 20 20 20 67 2e 66 54 69 6d 65 46 6f . g.fTimeFo
6f60: 72 6d 61 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 rmat = 1;. }e
6f70: 6c 73 65 7b 0a 20 20 20 20 20 20 67 2e 66 54 69 lse{. g.fTi
6f80: 6d 65 46 6f 72 6d 61 74 20 3d 20 32 3b 0a 20 20 meFormat = 2;.
6f90: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e }. }. if( g.
6fa0: 66 54 69 6d 65 46 6f 72 6d 61 74 3d 3d 31 20 29 fTimeFormat==1 )
6fb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 6d 74 {. return gmt
6fc0: 69 6d 65 28 63 6c 6f 63 6b 29 3b 0a 20 20 7d 65 ime(clock);. }e
6fd0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 lse{. return
6fe0: 6c 6f 63 61 6c 74 69 6d 65 28 63 6c 6f 63 6b 29 localtime(clock)
6ff0: 3b 0a 20 20 7d 0a 7d 0a ;. }.}.