Hex Artifact Content
Not logged in

Artifact d7de735b93dbe6eb0c40dba8f783d76b37056a8e:

File src/timeline.c part of check-in [8cf8ed785e] - Formatting changes to the similar event suppression in the timeline. by drh on 2009-09-14 16:09:18.

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 64 65 66 69 6e 65  " etc */.#define
1010: 20 54 49 4d 45 4c 49 4e 45 5f 42 52 49 45 46 20   TIMELINE_BRIEF 
1020: 20 20 20 30 78 30 30 30 34 20 20 2f 2a 20 43 6f     0x0004  /* Co
1030: 6d 62 69 6e 65 20 61 64 6a 61 63 65 6e 74 20 65  mbine adjacent e
1040: 6c 65 6d 65 6e 74 73 20 6f 66 20 73 61 6d 65 20  lements of same 
1050: 6f 62 6a 65 63 74 20 2a 2f 0a 23 65 6e 64 69 66  object */.#endif
1060: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61  ../*.** Output a
1070: 20 74 69 6d 65 6c 69 6e 65 20 69 6e 20 74 68 65   timeline in the
1080: 20 77 65 62 20 66 6f 72 6d 61 74 20 67 69 76 65   web format give
1090: 6e 20 61 20 71 75 65 72 79 2e 20 20 54 68 65 20  n a query.  The 
10a0: 71 75 65 72 79 0a 2a 2a 20 73 68 6f 75 6c 64 20  query.** should 
10b0: 72 65 74 75 72 6e 20 74 68 65 73 65 20 63 6f 6c  return these col
10c0: 75 6d 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30  umns:.**.**    0
10d0: 2e 20 20 72 69 64 0a 2a 2a 20 20 20 20 31 2e 20  .  rid.**    1. 
10e0: 20 55 55 49 44 0a 2a 2a 20 20 20 20 32 2e 20 20   UUID.**    2.  
10f0: 44 61 74 65 2f 54 69 6d 65 0a 2a 2a 20 20 20 20  Date/Time.**    
1100: 33 2e 20 20 43 6f 6d 6d 65 6e 74 20 73 74 72 69  3.  Comment stri
1110: 6e 67 0a 2a 2a 20 20 20 20 34 2e 20 20 55 73 65  ng.**    4.  Use
1120: 72 0a 2a 2a 20 20 20 20 35 2e 20 20 4e 75 6d 62  r.**    5.  Numb
1130: 65 72 20 6f 66 20 6e 6f 6e 2d 6d 65 72 67 65 20  er of non-merge 
1140: 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 20 20 20 36  children.**    6
1150: 2e 20 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72  .  Number of par
1160: 65 6e 74 73 0a 2a 2a 20 20 20 20 37 2e 20 20 54  ents.**    7.  T
1170: 72 75 65 20 69 66 20 69 73 20 61 20 6c 65 61 66  rue if is a leaf
1180: 0a 2a 2a 20 20 20 20 38 2e 20 20 62 61 63 6b 67  .**    8.  backg
1190: 72 6f 75 6e 64 20 63 6f 6c 6f 72 0a 2a 2a 20 20  round color.**  
11a0: 20 20 39 2e 20 20 74 79 70 65 20 28 22 63 69 22    9.  type ("ci"
11b0: 2c 20 22 77 22 2c 20 22 74 22 29 0a 2a 2a 20 20  , "w", "t").**  
11c0: 20 31 30 2e 20 20 6c 69 73 74 20 6f 66 20 73 79   10.  list of sy
11d0: 6d 62 6f 6c 69 63 20 74 61 67 73 2e 0a 2a 2a 20  mbolic tags..** 
11e0: 20 20 31 31 2e 20 20 74 61 67 69 64 20 66 6f 72    11.  tagid for
11f0: 20 74 69 63 6b 65 74 20 6f 72 20 77 69 6b 69 0a   ticket or wiki.
1200: 2a 2a 20 20 20 31 32 2e 20 20 53 68 6f 72 74 20  **   12.  Short 
1210: 63 6f 6d 6d 65 6e 74 20 74 6f 20 75 73 65 72 20  comment to user 
1220: 66 6f 72 20 72 65 70 65 61 74 65 64 20 74 69 63  for repeated tic
1230: 6b 65 74 73 20 61 6e 64 20 77 69 6b 69 0a 2a 2f  kets and wiki.*/
1240: 0a 76 6f 69 64 20 77 77 77 5f 70 72 69 6e 74 5f  .void www_print_
1250: 74 69 6d 65 6c 69 6e 65 28 0a 20 20 53 74 6d 74  timeline(.  Stmt
1260: 20 2a 70 51 75 65 72 79 2c 20 20 20 20 20 20 20   *pQuery,       
1270: 20 20 20 2f 2a 20 51 75 65 72 79 20 74 6f 20 69     /* Query to i
1280: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 69 6d  mplement the tim
1290: 65 6c 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 74  eline */.  int t
12a0: 6d 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  mFlags,         
12b0: 20 20 2f 2a 20 46 6c 61 67 73 20 63 6f 6e 74 72    /* Flags contr
12c0: 6f 6c 6c 69 6e 67 20 64 69 73 70 6c 61 79 20 62  olling display b
12d0: 65 68 61 76 69 6f 72 20 2a 2f 0a 20 20 76 6f 69  ehavior */.  voi
12e0: 64 20 28 2a 78 45 78 74 72 61 29 28 69 6e 74 29  d (*xExtra)(int)
12f0: 20 20 20 20 2f 2a 20 52 6f 75 74 69 6e 65 20 74      /* Routine t
1300: 6f 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20 6c  o call on each l
1310: 69 6e 65 20 6f 66 20 64 69 73 70 6c 61 79 20 2a  ine of display *
1320: 2f 0a 29 7b 0a 20 20 69 6e 74 20 77 69 6b 69 46  /.){.  int wikiF
1330: 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6d 78 57 69  lags;.  int mxWi
1340: 6b 69 4c 65 6e 3b 0a 20 20 42 6c 6f 62 20 63 6f  kiLen;.  Blob co
1350: 6d 6d 65 6e 74 3b 0a 20 20 63 68 61 72 20 7a 50  mment;.  char zP
1360: 72 65 76 44 61 74 65 5b 32 30 5d 3b 0a 20 20 7a  revDate[20];.  z
1370: 50 72 65 76 44 61 74 65 5b 30 5d 20 3d 20 30 3b  PrevDate[0] = 0;
1380: 0a 20 20 69 6e 74 20 70 72 65 76 54 61 67 69 64  .  int prevTagid
1390: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 75 70 70   = 0;.  int supp
13a0: 72 65 73 73 43 6e 74 20 3d 20 30 3b 0a 0a 20 20  ressCnt = 0;..  
13b0: 6d 78 57 69 6b 69 4c 65 6e 20 3d 20 64 62 5f 67  mxWikiLen = db_g
13c0: 65 74 5f 69 6e 74 28 22 74 69 6d 65 6c 69 6e 65  et_int("timeline
13d0: 2d 6d 61 78 2d 63 6f 6d 6d 65 6e 74 22 2c 20 30  -max-comment", 0
13e0: 29 3b 0a 20 20 69 66 28 20 64 62 5f 67 65 74 5f  );.  if( db_get_
13f0: 62 6f 6f 6c 65 61 6e 28 22 74 69 6d 65 6c 69 6e  boolean("timelin
1400: 65 2d 62 6c 6f 63 6b 2d 6d 61 72 6b 75 70 22 2c  e-block-markup",
1410: 20 30 29 20 29 7b 0a 20 20 20 20 77 69 6b 69 46   0) ){.    wikiF
1420: 6c 61 67 73 20 3d 20 57 49 4b 49 5f 49 4e 4c 49  lags = WIKI_INLI
1430: 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1440: 20 77 69 6b 69 46 6c 61 67 73 20 3d 20 57 49 4b   wikiFlags = WIK
1450: 49 5f 49 4e 4c 49 4e 45 20 7c 20 57 49 4b 49 5f  I_INLINE | WIKI_
1460: 4e 4f 42 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 20 20  NOBLOCK;.  }..  
1470: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20  db_multi_exec(. 
1480: 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50      "CREATE TEMP
1490: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
14a0: 49 53 54 53 20 73 65 65 6e 28 72 69 64 20 49 4e  ISTS seen(rid IN
14b0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
14c0: 59 29 3b 22 0a 20 20 20 20 20 22 44 45 4c 45 54  Y);".     "DELET
14d0: 45 20 46 52 4f 4d 20 73 65 65 6e 3b 22 0a 20 20  E FROM seen;".  
14e0: 29 3b 0a 20 20 40 20 3c 74 61 62 6c 65 20 63 65  );.  @ <table ce
14f0: 6c 6c 73 70 61 63 69 6e 67 3d 30 20 62 6f 72 64  llspacing=0 bord
1500: 65 72 3d 30 20 63 65 6c 6c 70 61 64 64 69 6e 67  er=0 cellpadding
1510: 3d 30 3e 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  =0>.  blob_zero(
1520: 26 63 6f 6d 6d 65 6e 74 29 3b 0a 20 20 77 68 69  &comment);.  whi
1530: 6c 65 28 20 64 62 5f 73 74 65 70 28 70 51 75 65  le( db_step(pQue
1540: 72 79 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  ry)==SQLITE_ROW 
1550: 29 7b 0a 20 20 20 20 69 6e 74 20 72 69 64 20 3d  ){.    int rid =
1560: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70   db_column_int(p
1570: 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 63  Query, 0);.    c
1580: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64  onst char *zUuid
1590: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
15a0: 74 28 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20  t(pQuery, 1);.  
15b0: 20 20 69 6e 74 20 6e 50 43 68 69 6c 64 20 3d 20    int nPChild = 
15c0: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 51  db_column_int(pQ
15d0: 75 65 72 79 2c 20 35 29 3b 0a 20 20 20 20 69 6e  uery, 5);.    in
15e0: 74 20 6e 50 61 72 65 6e 74 20 3d 20 64 62 5f 63  t nParent = db_c
15f0: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 51 75 65 72 79  olumn_int(pQuery
1600: 2c 20 36 29 3b 0a 20 20 20 20 69 6e 74 20 69 73  , 6);.    int is
1610: 4c 65 61 66 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  Leaf = db_column
1620: 5f 69 6e 74 28 70 51 75 65 72 79 2c 20 37 29 3b  _int(pQuery, 7);
1630: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1640: 2a 7a 42 67 43 6c 72 20 3d 20 64 62 5f 63 6f 6c  *zBgClr = db_col
1650: 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
1660: 20 38 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   8);.    const c
1670: 68 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f  har *zDate = db_
1680: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
1690: 72 79 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73  ry, 2);.    cons
16a0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20  t char *zType = 
16b0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  db_column_text(p
16c0: 51 75 65 72 79 2c 20 39 29 3b 0a 20 20 20 20 63  Query, 9);.    c
16d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72  onst char *zUser
16e0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
16f0: 74 28 70 51 75 65 72 79 2c 20 34 29 3b 0a 20 20  t(pQuery, 4);.  
1700: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1710: 61 67 4c 69 73 74 20 3d 20 64 62 5f 63 6f 6c 75  agList = db_colu
1720: 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20  mn_text(pQuery, 
1730: 31 30 29 3b 0a 20 20 20 20 69 6e 74 20 74 61 67  10);.    int tag
1740: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  id = db_column_i
1750: 6e 74 28 70 51 75 65 72 79 2c 20 31 31 29 3b 0a  nt(pQuery, 11);.
1760: 20 20 20 20 69 6e 74 20 63 6f 6d 6d 65 6e 74 43      int commentC
1770: 6f 6c 75 6d 6e 20 3d 20 33 3b 20 20 20 20 2f 2a  olumn = 3;    /*
1780: 20 43 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69   Column containi
1790: 6e 67 20 63 6f 6d 6d 65 6e 74 20 74 65 78 74 20  ng comment text 
17a0: 2a 2f 0a 20 20 20 20 69 66 28 20 74 61 67 69 64  */.    if( tagid
17b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74 61   ){.      if( ta
17c0: 67 69 64 3d 3d 70 72 65 76 54 61 67 69 64 20 29  gid==prevTagid )
17d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6d  {.        if( tm
17e0: 46 6c 61 67 73 20 26 20 54 49 4d 45 4c 49 4e 45  Flags & TIMELINE
17f0: 5f 42 52 49 45 46 20 29 7b 0a 20 20 20 20 20 20  _BRIEF ){.      
1800: 20 20 20 20 73 75 70 70 72 65 73 73 43 6e 74 2b      suppressCnt+
1810: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  +;.          con
1820: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
1830: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1840: 63 6f 6d 6d 65 6e 74 43 6f 6c 75 6d 6e 20 3d 20  commentColumn = 
1850: 31 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  12;.        }.  
1860: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1870: 70 72 65 76 54 61 67 69 64 20 3d 20 74 61 67 69  prevTagid = tagi
1880: 64 3b 0a 20 20 20 20 69 66 28 20 73 75 70 70 72  d;.    if( suppr
1890: 65 73 73 43 6e 74 20 29 7b 0a 20 20 20 20 20 20  essCnt ){.      
18a0: 40 20 3c 74 72 3e 3c 74 64 3e 3c 74 64 3e 3c 74  @ <tr><td><td><t
18b0: 64 3e 0a 20 20 20 20 20 20 40 20 3c 73 6d 61 6c  d>.      @ <smal
18c0: 6c 3e 3c 69 3e 2e 2e 2e 20 25 64 28 73 75 70 70  l><i>... %d(supp
18d0: 72 65 73 73 43 6e 74 29 20 73 69 6d 69 6c 61 72  ressCnt) similar
18e0: 0a 20 20 20 20 20 20 40 20 65 76 65 6e 74 25 73  .      @ event%s
18f0: 28 73 75 70 70 72 65 73 73 43 6e 74 3e 31 3f 22  (suppressCnt>1?"
1900: 73 22 3a 22 22 29 20 6f 6d 69 74 74 65 64 2e 3c  s":"") omitted.<
1910: 2f 69 3e 3c 2f 73 6d 61 6c 6c 3e 3c 2f 74 72 3e  /i></small></tr>
1920: 0a 20 20 20 20 20 20 73 75 70 70 72 65 73 73 43  .      suppressC
1930: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nt = 0;.    }.  
1940: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 79    if( strcmp(zTy
1950: 70 65 2c 22 64 69 76 22 29 3d 3d 30 20 29 7b 0a  pe,"div")==0 ){.
1960: 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20        @ <tr><td 
1970: 63 6f 6c 73 70 61 6e 3d 33 3e 3c 68 72 3e 3c 2f  colspan=3><hr></
1980: 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 20 20 63  td></tr>.      c
1990: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
19a0: 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63     db_multi_exec
19b0: 28 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f  ("INSERT OR IGNO
19c0: 52 45 20 49 4e 54 4f 20 73 65 65 6e 20 56 41 4c  RE INTO seen VAL
19d0: 55 45 53 28 25 64 29 22 2c 20 72 69 64 29 3b 0a  UES(%d)", rid);.
19e0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 7a      if( memcmp(z
19f0: 44 61 74 65 2c 20 7a 50 72 65 76 44 61 74 65 2c  Date, zPrevDate,
1a00: 20 31 30 29 20 29 7b 0a 20 20 20 20 20 20 73 70   10) ){.      sp
1a10: 72 69 6e 74 66 28 7a 50 72 65 76 44 61 74 65 2c  rintf(zPrevDate,
1a20: 20 22 25 2e 31 30 73 22 2c 20 7a 44 61 74 65 29   "%.10s", zDate)
1a30: 3b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74  ;.      @ <tr><t
1a40: 64 20 63 6f 6c 73 70 61 6e 3d 33 3e 0a 20 20 20  d colspan=3>.   
1a50: 20 20 20 40 20 20 20 3c 64 69 76 20 63 6c 61 73     @   <div clas
1a60: 73 3d 22 64 69 76 69 64 65 72 22 3e 25 73 28 7a  s="divider">%s(z
1a70: 50 72 65 76 44 61 74 65 29 3c 2f 64 69 76 3e 0a  PrevDate)</div>.
1a80: 20 20 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74        @ </td></t
1a90: 72 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 3c  r>.    }.    @ <
1aa0: 74 72 3e 0a 20 20 20 20 40 20 3c 74 64 20 76 61  tr>.    @ <td va
1ab0: 6c 69 67 6e 3d 22 74 6f 70 22 3e 25 73 28 26 7a  lign="top">%s(&z
1ac0: 44 61 74 65 5b 31 31 5d 29 3c 2f 74 64 3e 0a 20  Date[11])</td>. 
1ad0: 20 20 20 40 20 3c 74 64 20 77 69 64 74 68 3d 22     @ <td width="
1ae0: 32 30 22 20 61 6c 69 67 6e 3d 22 63 65 6e 74 65  20" align="cente
1af0: 72 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e  r" valign="top">
1b00: 0a 20 20 20 20 40 20 3c 66 6f 6e 74 20 69 64 3d  .    @ <font id=
1b10: 22 6d 25 64 28 72 69 64 29 22 20 73 69 7a 65 3d  "m%d(rid)" size=
1b20: 22 2b 31 22 20 63 6f 6c 6f 72 3d 22 77 68 69 74  "+1" color="whit
1b30: 65 22 3e 2a 3c 2f 66 6f 6e 74 3e 3c 2f 74 64 3e  e">*</font></td>
1b40: 0a 20 20 20 20 69 66 28 20 7a 42 67 43 6c 72 20  .    if( zBgClr 
1b50: 26 26 20 7a 42 67 43 6c 72 5b 30 5d 20 29 7b 0a  && zBgClr[0] ){.
1b60: 20 20 20 20 20 20 40 20 3c 74 64 20 76 61 6c 69        @ <td vali
1b70: 67 6e 3d 22 74 6f 70 22 20 61 6c 69 67 6e 3d 22  gn="top" align="
1b80: 6c 65 66 74 22 20 62 67 63 6f 6c 6f 72 3d 22 25  left" bgcolor="%
1b90: 68 28 7a 42 67 43 6c 72 29 22 3e 0a 20 20 20 20  h(zBgClr)">.    
1ba0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 3c  }else{.      @ <
1bb0: 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 20  td valign="top" 
1bc0: 61 6c 69 67 6e 3d 22 6c 65 66 74 22 3e 0a 20 20  align="left">.  
1bd0: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 54 79 70    }.    if( zTyp
1be0: 65 5b 30 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20  e[0]=='c' ){.   
1bf0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61     const char *a
1c00: 7a 54 61 67 5b 35 5d 3b 0a 20 20 20 20 20 20 69  zTag[5];.      i
1c10: 6e 74 20 6e 54 61 67 20 3d 20 30 3b 0a 20 20 20  nt nTag = 0;.   
1c20: 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f     hyperlink_to_
1c30: 75 75 69 64 5f 77 69 74 68 5f 6d 6f 75 73 65 6f  uuid_with_mouseo
1c40: 76 65 72 28 7a 55 75 69 64 2c 20 22 78 69 6e 22  ver(zUuid, "xin"
1c50: 2c 20 22 78 6f 75 74 22 2c 20 72 69 64 29 3b 0a  , "xout", rid);.
1c60: 20 20 20 20 20 20 69 66 28 20 28 74 6d 46 6c 61        if( (tmFla
1c70: 67 73 20 26 20 54 49 4d 45 4c 49 4e 45 5f 4c 45  gs & TIMELINE_LE
1c80: 41 46 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  AFONLY)==0 ){.  
1c90: 20 20 20 20 20 20 69 66 28 20 6e 50 61 72 65 6e        if( nParen
1ca0: 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  t>1 ){.         
1cb0: 20 61 7a 54 61 67 5b 6e 54 61 67 2b 2b 5d 20 3d   azTag[nTag++] =
1cc0: 20 22 4d 65 72 67 65 22 3b 0a 20 20 20 20 20 20   "Merge";.      
1cd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1ce0: 6e 50 43 68 69 6c 64 3e 31 20 29 7b 0a 20 20 20  nPChild>1 ){.   
1cf0: 20 20 20 20 20 20 20 69 66 28 20 63 6f 75 6e 74         if( count
1d00: 5f 6e 6f 6e 62 72 61 6e 63 68 5f 63 68 69 6c 64  _nonbranch_child
1d10: 72 65 6e 28 72 69 64 29 3e 31 20 29 7b 0a 20 20  ren(rid)>1 ){.  
1d20: 20 20 20 20 20 20 20 20 20 20 61 7a 54 61 67 5b            azTag[
1d30: 6e 54 61 67 2b 2b 5d 20 3d 20 22 46 6f 72 6b 22  nTag++] = "Fork"
1d40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1d50: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  e{.            a
1d60: 7a 54 61 67 5b 6e 54 61 67 2b 2b 5d 20 3d 20 22  zTag[nTag++] = "
1d70: 42 72 61 6e 63 68 2d 50 6f 69 6e 74 22 3b 0a 20  Branch-Point";. 
1d80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1da0: 20 20 20 69 66 28 20 69 73 4c 65 61 66 20 29 7b     if( isLeaf ){
1db0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 5f  .        if( db_
1dc0: 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31  exists("SELECT 1
1dd0: 20 46 52 4f 4d 20 74 61 67 78 72 65 66 22 0a 20   FROM tagxref". 
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 20 20 20 22 20 57 48 45 52 45 20 72 69 64       " WHERE rid
1e00: 3d 25 64 20 41 4e 44 20 74 61 67 69 64 3d 25 64  =%d AND tagid=%d
1e10: 20 41 4e 44 20 74 61 67 74 79 70 65 3e 30 22 2c   AND tagtype>0",
1e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e30: 20 20 20 20 20 20 20 72 69 64 2c 20 54 41 47 5f         rid, TAG_
1e40: 43 4c 4f 53 45 44 29 20 29 7b 0a 20 20 20 20 20  CLOSED) ){.     
1e50: 20 20 20 20 20 61 7a 54 61 67 5b 6e 54 61 67 2b       azTag[nTag+
1e60: 2b 5d 20 3d 20 22 43 6c 6f 73 65 64 2d 4c 65 61  +] = "Closed-Lea
1e70: 66 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  f";.        }els
1e80: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 7a 54  e{.          azT
1e90: 61 67 5b 6e 54 61 67 2b 2b 5d 20 3d 20 22 4c 65  ag[nTag++] = "Le
1ea0: 61 66 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  af";.        }. 
1eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1ec0: 20 6e 54 61 67 3e 30 20 29 7b 0a 20 20 20 20 20   nTag>0 ){.     
1ed0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1ee0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 61    for(i=0; i<nTa
1ef0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
1f00: 20 20 20 40 20 3c 62 3e 25 73 28 61 7a 54 61 67     @ <b>%s(azTag
1f10: 5b 69 5d 29 25 73 28 69 3d 3d 6e 54 61 67 2d 31  [i])%s(i==nTag-1
1f20: 3f 22 22 3a 22 2c 22 29 3c 2f 62 3e 0a 20 20 20  ?"":",")</b>.   
1f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 74 6d     }else if( (tm
1f50: 46 6c 61 67 73 20 26 20 54 49 4d 45 4c 49 4e 45  Flags & TIMELINE
1f60: 5f 41 52 54 49 44 29 21 3d 30 20 29 7b 0a 20 20  _ARTID)!=0 ){.  
1f70: 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f      hyperlink_to
1f80: 5f 75 75 69 64 28 7a 55 75 69 64 29 3b 0a 20 20  _uuid(zUuid);.  
1f90: 20 20 7d 0a 20 20 20 20 64 62 5f 63 6f 6c 75 6d    }.    db_colum
1fa0: 6e 5f 62 6c 6f 62 28 70 51 75 65 72 79 2c 20 63  n_blob(pQuery, c
1fb0: 6f 6d 6d 65 6e 74 43 6f 6c 75 6d 6e 2c 20 26 63  ommentColumn, &c
1fc0: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  omment);.    if(
1fd0: 20 6d 78 57 69 6b 69 4c 65 6e 3e 30 20 26 26 20   mxWikiLen>0 && 
1fe0: 62 6c 6f 62 5f 73 69 7a 65 28 26 63 6f 6d 6d 65  blob_size(&comme
1ff0: 6e 74 29 3e 6d 78 57 69 6b 69 4c 65 6e 20 29 7b  nt)>mxWikiLen ){
2000: 0a 20 20 20 20 20 20 42 6c 6f 62 20 74 72 75 6e  .      Blob trun
2010: 63 61 74 65 64 3b 0a 20 20 20 20 20 20 62 6c 6f  cated;.      blo
2020: 62 5f 7a 65 72 6f 28 26 74 72 75 6e 63 61 74 65  b_zero(&truncate
2030: 64 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61  d);.      blob_a
2040: 70 70 65 6e 64 28 26 74 72 75 6e 63 61 74 65 64  ppend(&truncated
2050: 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 63  , blob_buffer(&c
2060: 6f 6d 6d 65 6e 74 29 2c 20 6d 78 57 69 6b 69 4c  omment), mxWikiL
2070: 65 6e 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f  en);.      blob_
2080: 61 70 70 65 6e 64 28 26 74 72 75 6e 63 61 74 65  append(&truncate
2090: 64 2c 20 22 2e 2e 2e 22 2c 20 33 29 3b 0a 20 20  d, "...", 3);.  
20a0: 20 20 20 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74      wiki_convert
20b0: 28 26 74 72 75 6e 63 61 74 65 64 2c 20 30 2c 20  (&truncated, 0, 
20c0: 77 69 6b 69 46 6c 61 67 73 29 3b 0a 20 20 20 20  wikiFlags);.    
20d0: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 74 72    blob_reset(&tr
20e0: 75 6e 63 61 74 65 64 29 3b 0a 20 20 20 20 7d 65  uncated);.    }e
20f0: 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6b 69 5f  lse{.      wiki_
2100: 63 6f 6e 76 65 72 74 28 26 63 6f 6d 6d 65 6e 74  convert(&comment
2110: 2c 20 30 2c 20 77 69 6b 69 46 6c 61 67 73 29 3b  , 0, wikiFlags);
2120: 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f  .    }.    blob_
2130: 72 65 73 65 74 28 26 63 6f 6d 6d 65 6e 74 29 3b  reset(&comment);
2140: 0a 20 20 20 20 69 66 28 20 7a 54 61 67 4c 69 73  .    if( zTagLis
2150: 74 20 26 26 20 7a 54 61 67 4c 69 73 74 5b 30 5d  t && zTagList[0]
2160: 20 29 7b 0a 20 20 20 20 20 20 40 20 28 75 73 65   ){.      @ (use
2170: 72 3a 20 25 68 28 7a 55 73 65 72 29 2c 20 74 61  r: %h(zUser), ta
2180: 67 73 3a 20 25 68 28 7a 54 61 67 4c 69 73 74 29  gs: %h(zTagList)
2190: 29 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ).    }else{.   
21a0: 20 20 20 40 20 28 75 73 65 72 3a 20 25 68 28 7a     @ (user: %h(z
21b0: 55 73 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20  User)).    }.   
21c0: 20 69 66 28 20 78 45 78 74 72 61 20 29 7b 0a 20   if( xExtra ){. 
21d0: 20 20 20 20 20 78 45 78 74 72 61 28 72 69 64 29       xExtra(rid)
21e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 2f  ;.    }.    @ </
21f0: 74 64 3e 3c 2f 74 72 3e 0a 20 20 7d 0a 20 20 40  td></tr>.  }.  @
2200: 20 3c 2f 74 61 62 6c 65 3e 0a 7d 0a 0a 2f 2a 0a   </table>.}../*.
2210: 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
2220: 6f 72 61 72 79 20 74 61 62 6c 65 20 73 75 69 74  orary table suit
2230: 61 62 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  able for storing
2240: 20 74 69 6d 65 6c 69 6e 65 20 64 61 74 61 2e 0a   timeline data..
2250: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
2260: 69 6d 65 6c 69 6e 65 5f 74 65 6d 70 5f 74 61 62  imeline_temp_tab
2270: 6c 65 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  le(void){.  stat
2280: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 53  ic const char zS
2290: 71 6c 5b 5d 20 3d 20 0a 20 20 20 20 40 20 43 52  ql[] = .    @ CR
22a0: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
22b0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 69  IF NOT EXISTS ti
22c0: 6d 65 6c 69 6e 65 28 0a 20 20 20 20 40 20 20 20  meline(.    @   
22d0: 72 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  rid INTEGER PRIM
22e0: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 40 20 20  ARY KEY,.    @  
22f0: 20 75 75 69 64 20 54 45 58 54 2c 0a 20 20 20 20   uuid TEXT,.    
2300: 40 20 20 20 74 69 6d 65 73 74 61 6d 70 20 54 45  @   timestamp TE
2310: 58 54 2c 0a 20 20 20 20 40 20 20 20 63 6f 6d 6d  XT,.    @   comm
2320: 65 6e 74 20 54 45 58 54 2c 0a 20 20 20 20 40 20  ent TEXT,.    @ 
2330: 20 20 75 73 65 72 20 54 45 58 54 2c 0a 20 20 20    user TEXT,.   
2340: 20 40 20 20 20 6e 63 68 69 6c 64 20 49 4e 54 45   @   nchild INTE
2350: 47 45 52 2c 0a 20 20 20 20 40 20 20 20 6e 70 61  GER,.    @   npa
2360: 72 65 6e 74 20 49 4e 54 45 47 45 52 2c 0a 20 20  rent INTEGER,.  
2370: 20 20 40 20 20 20 69 73 6c 65 61 66 20 42 4f 4f    @   isleaf BOO
2380: 4c 45 41 4e 2c 0a 20 20 20 20 40 20 20 20 62 67  LEAN,.    @   bg
2390: 63 6f 6c 6f 72 20 54 45 58 54 2c 0a 20 20 20 20  color TEXT,.    
23a0: 40 20 20 20 65 74 79 70 65 20 54 45 58 54 2c 0a  @   etype TEXT,.
23b0: 20 20 20 20 40 20 20 20 74 61 67 6c 69 73 74 20      @   taglist 
23c0: 54 45 58 54 2c 0a 20 20 20 20 40 20 20 20 74 61  TEXT,.    @   ta
23d0: 67 69 64 20 49 4e 54 45 47 45 52 2c 0a 20 20 20  gid INTEGER,.   
23e0: 20 40 20 20 20 73 68 6f 72 74 20 54 45 58 54 0a   @   short TEXT.
23f0: 20 20 20 20 40 20 29 0a 20 20 3b 0a 20 20 64 62      @ ).  ;.  db
2400: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 7a 53 71 6c  _multi_exec(zSql
2410: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2420: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2430: 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 72 69 6e  a constant strin
2440: 67 20 74 68 61 74 20 66 6f 72 6d 73 20 74 68 65  g that forms the
2450: 20 62 61 73 69 73 0a 2a 2a 20 66 6f 72 20 61 20   basis.** for a 
2460: 74 69 6d 65 6c 69 6e 65 20 71 75 65 72 79 20 66  timeline query f
2470: 6f 72 20 74 68 65 20 57 57 57 20 69 6e 74 65 72  or the WWW inter
2480: 66 61 63 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  face..*/.const c
2490: 68 61 72 20 2a 74 69 6d 65 6c 69 6e 65 5f 71 75  har *timeline_qu
24a0: 65 72 79 5f 66 6f 72 5f 77 77 77 28 76 6f 69 64  ery_for_www(void
24b0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
24c0: 20 2a 7a 42 61 73 65 20 3d 20 30 3b 0a 20 20 73   *zBase = 0;.  s
24d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
24e0: 20 7a 42 61 73 65 53 71 6c 5b 5d 20 3d 0a 20 20   zBaseSql[] =.  
24f0: 20 20 40 20 53 45 4c 45 43 54 0a 20 20 20 20 40    @ SELECT.    @
2500: 20 20 20 62 6c 6f 62 2e 72 69 64 2c 0a 20 20 20     blob.rid,.   
2510: 20 40 20 20 20 75 75 69 64 2c 0a 20 20 20 20 40   @   uuid,.    @
2520: 20 20 20 64 61 74 65 74 69 6d 65 28 65 76 65 6e     datetime(even
2530: 74 2e 6d 74 69 6d 65 2c 27 6c 6f 63 61 6c 74 69  t.mtime,'localti
2540: 6d 65 27 29 20 41 53 20 74 69 6d 65 73 74 61 6d  me') AS timestam
2550: 70 2c 0a 20 20 20 20 40 20 20 20 63 6f 61 6c 65  p,.    @   coale
2560: 73 63 65 28 65 63 6f 6d 6d 65 6e 74 2c 20 63 6f  sce(ecomment, co
2570: 6d 6d 65 6e 74 29 2c 0a 20 20 20 20 40 20 20 20  mment),.    @   
2580: 63 6f 61 6c 65 73 63 65 28 65 75 73 65 72 2c 20  coalesce(euser, 
2590: 75 73 65 72 29 2c 0a 20 20 20 20 40 20 20 20 28  user),.    @   (
25a0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
25b0: 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45  FROM plink WHERE
25c0: 20 70 69 64 3d 62 6c 6f 62 2e 72 69 64 20 41 4e   pid=blob.rid AN
25d0: 44 20 69 73 70 72 69 6d 3d 31 29 2c 0a 20 20 20  D isprim=1),.   
25e0: 20 40 20 20 20 28 53 45 4c 45 43 54 20 63 6f 75   @   (SELECT cou
25f0: 6e 74 28 2a 29 20 46 52 4f 4d 20 70 6c 69 6e 6b  nt(*) FROM plink
2600: 20 57 48 45 52 45 20 63 69 64 3d 62 6c 6f 62 2e   WHERE cid=blob.
2610: 72 69 64 29 2c 0a 20 20 20 20 40 20 20 20 4e 4f  rid),.    @   NO
2620: 54 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20  T EXISTS(SELECT 
2630: 31 20 46 52 4f 4d 20 70 6c 69 6e 6b 0a 20 20 20  1 FROM plink.   
2640: 20 40 20 20 20 20 20 20 20 20 20 20 20 20 20 20   @              
2650: 20 57 48 45 52 45 20 70 69 64 3d 62 6c 6f 62 2e   WHERE pid=blob.
2660: 72 69 64 0a 20 20 20 20 40 20 20 20 20 20 20 20  rid.    @       
2670: 20 20 20 20 20 20 20 20 20 41 4e 44 20 63 6f 61           AND coa
2680: 6c 65 73 63 65 28 28 53 45 4c 45 43 54 20 76 61  lesce((SELECT va
2690: 6c 75 65 20 46 52 4f 4d 20 74 61 67 78 72 65 66  lue FROM tagxref
26a0: 0a 20 20 20 20 40 20 20 20 20 20 20 20 20 20 20  .    @          
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 20 57 48 45 52 45 20 74 61 67 69 64 3d      WHERE tagid=
26d0: 25 64 20 41 4e 44 20 72 69 64 3d 70 6c 69 6e 6b  %d AND rid=plink
26e0: 2e 70 69 64 29 2c 20 27 74 72 75 6e 6b 27 29 0a  .pid), 'trunk').
26f0: 20 20 20 20 40 20 20 20 20 20 20 20 20 20 20 20      @           
2700: 20 20 20 20 20 20 20 3d 20 63 6f 61 6c 65 73 63         = coalesc
2710: 65 28 28 53 45 4c 45 43 54 20 76 61 6c 75 65 20  e((SELECT value 
2720: 46 52 4f 4d 20 74 61 67 78 72 65 66 0a 20 20 20  FROM tagxref.   
2730: 20 40 20 20 20 20 20 20 20 20 20 20 20 20 20 20   @              
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 57 48 45 52 45 20 74 61 67 69 64 3d 25 64 20 41  WHERE tagid=%d A
2760: 4e 44 20 72 69 64 3d 70 6c 69 6e 6b 2e 63 69 64  ND rid=plink.cid
2770: 29 2c 20 27 74 72 75 6e 6b 27 29 29 2c 0a 20 20  ), 'trunk')),.  
2780: 20 20 40 20 20 20 62 67 63 6f 6c 6f 72 2c 0a 20    @   bgcolor,. 
2790: 20 20 20 40 20 20 20 65 76 65 6e 74 2e 74 79 70     @   event.typ
27a0: 65 2c 0a 20 20 20 20 40 20 20 20 28 53 45 4c 45  e,.    @   (SELE
27b0: 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  CT group_concat(
27c0: 73 75 62 73 74 72 28 74 61 67 6e 61 6d 65 2c 35  substr(tagname,5
27d0: 29 2c 20 27 2c 20 27 29 20 46 52 4f 4d 20 74 61  ), ', ') FROM ta
27e0: 67 2c 20 74 61 67 78 72 65 66 0a 20 20 20 20 40  g, tagxref.    @
27f0: 20 20 20 20 20 57 48 45 52 45 20 74 61 67 6e 61       WHERE tagna
2800: 6d 65 20 47 4c 4f 42 20 27 73 79 6d 2d 2a 27 20  me GLOB 'sym-*' 
2810: 41 4e 44 20 74 61 67 2e 74 61 67 69 64 3d 74 61  AND tag.tagid=ta
2820: 67 78 72 65 66 2e 74 61 67 69 64 0a 20 20 20 20  gxref.tagid.    
2830: 40 20 20 20 20 20 20 20 41 4e 44 20 74 61 67 78  @       AND tagx
2840: 72 65 66 2e 72 69 64 3d 62 6c 6f 62 2e 72 69 64  ref.rid=blob.rid
2850: 20 41 4e 44 20 74 61 67 78 72 65 66 2e 74 61 67   AND tagxref.tag
2860: 74 79 70 65 3e 30 29 2c 0a 20 20 20 20 40 20 20  type>0),.    @  
2870: 20 74 61 67 69 64 2c 0a 20 20 20 20 40 20 20 20   tagid,.    @   
2880: 62 72 69 65 66 0a 20 20 20 20 40 20 20 46 52 4f  brief.    @  FRO
2890: 4d 20 65 76 65 6e 74 20 4a 4f 49 4e 20 62 6c 6f  M event JOIN blo
28a0: 62 20 0a 20 20 20 20 40 20 57 48 45 52 45 20 62  b .    @ WHERE b
28b0: 6c 6f 62 2e 72 69 64 3d 65 76 65 6e 74 2e 6f 62  lob.rid=event.ob
28c0: 6a 69 64 0a 20 20 3b 0a 20 20 69 66 28 20 7a 42  jid.  ;.  if( zB
28d0: 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 42  ase==0 ){.    zB
28e0: 61 73 65 20 3d 20 6d 70 72 69 6e 74 66 28 7a 42  ase = mprintf(zB
28f0: 61 73 65 53 71 6c 2c 20 54 41 47 5f 42 52 41 4e  aseSql, TAG_BRAN
2900: 43 48 2c 20 54 41 47 5f 42 52 41 4e 43 48 29 3b  CH, TAG_BRANCH);
2910: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 42  .  }.  return zB
2920: 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ase;.}../*.** Ge
2930: 6e 65 72 61 74 65 20 61 20 73 75 62 6d 65 6e 75  nerate a submenu
2940: 20 65 6c 65 6d 65 6e 74 20 77 69 74 68 20 61 20   element with a 
2950: 73 69 6e 67 6c 65 20 70 61 72 61 6d 65 74 65 72  single parameter
2960: 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74   change..*/.stat
2970: 69 63 20 76 6f 69 64 20 74 69 6d 65 6c 69 6e 65  ic void timeline
2980: 5f 73 75 62 6d 65 6e 75 28 0a 20 20 48 51 75 65  _submenu(.  HQue
2990: 72 79 20 2a 70 55 72 6c 2c 20 20 20 20 20 20 20  ry *pUrl,       
29a0: 20 20 20 20 20 2f 2a 20 42 61 73 65 20 55 52 4c       /* Base URL
29b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
29c0: 20 2a 7a 4d 65 6e 75 4e 61 6d 65 2c 20 20 20 2f   *zMenuName,   /
29d0: 2a 20 53 75 62 6d 65 6e 75 20 6e 61 6d 65 20 2a  * Submenu name *
29e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
29f0: 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 2f 2a 20  zParam,      /* 
2a00: 50 61 72 61 6d 65 74 65 72 20 76 61 6c 75 65 20  Parameter value 
2a10: 74 6f 20 61 64 64 20 6f 72 20 63 68 61 6e 67 65  to add or change
2a20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2a30: 20 2a 7a 56 61 6c 75 65 2c 20 20 20 20 20 20 2f   *zValue,      /
2a40: 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 6e  * Value of the n
2a50: 65 77 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  ew parameter */.
2a60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
2a70: 65 6d 6f 76 65 20 20 20 20 20 20 2f 2a 20 50 61  emove      /* Pa
2a80: 72 61 6d 65 74 65 72 20 74 6f 20 6f 6d 69 74 20  rameter to omit 
2a90: 2a 2f 0a 29 7b 0a 20 20 73 74 79 6c 65 5f 73 75  */.){.  style_su
2aa0: 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 7a 4d  bmenu_element(zM
2ab0: 65 6e 75 4e 61 6d 65 2c 20 7a 4d 65 6e 75 4e 61  enuName, zMenuNa
2ac0: 6d 65 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20  me, "%s",.      
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 75 72 6c 5f 72 65 6e 64 65 72 28 70 55 72    url_render(pUr
2af0: 6c 2c 20 7a 50 61 72 61 6d 2c 20 7a 56 61 6c 75  l, zParam, zValu
2b00: 65 2c 20 7a 52 65 6d 6f 76 65 2c 20 30 29 29 3b  e, zRemove, 0));
2b10: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 7a 44 61 74 65  .}.../*.** zDate
2b20: 20 69 73 20 61 20 6c 6f 63 61 6c 74 69 6d 65 20   is a localtime 
2b30: 64 61 74 65 2e 20 20 49 6e 73 65 72 74 20 72 65  date.  Insert re
2b40: 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 0a 2a  cords into the.*
2b50: 2a 20 22 74 69 6d 65 6c 69 6e 65 22 20 74 61 62  * "timeline" tab
2b60: 6c 65 20 74 6f 20 63 61 75 73 65 20 3c 68 72 3e  le to cause <hr>
2b70: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20   to be inserted 
2b80: 62 65 66 6f 72 65 20 61 6e 64 20 61 66 74 65 72  before and after
2b90: 0a 2a 2a 20 65 6e 74 72 69 65 73 20 6f 66 20 74  .** entries of t
2ba0: 68 61 74 20 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  hat date..*/.sta
2bb0: 74 69 63 20 76 6f 69 64 20 74 69 6d 65 6c 69 6e  tic void timelin
2bc0: 65 5f 61 64 64 5f 64 69 76 69 64 65 72 73 28 63  e_add_dividers(c
2bd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65  onst char *zDate
2be0: 29 7b 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  ){.  db_multi_ex
2bf0: 65 63 28 0a 20 20 20 20 22 49 4e 53 45 52 54 20  ec(.    "INSERT 
2c00: 49 4e 54 4f 20 74 69 6d 65 6c 69 6e 65 28 72 69  INTO timeline(ri
2c10: 64 2c 74 69 6d 65 73 74 61 6d 70 2c 65 74 79 70  d,timestamp,etyp
2c20: 65 29 22 0a 20 20 20 20 22 56 41 4c 55 45 53 28  e)".    "VALUES(
2c30: 2d 31 2c 64 61 74 65 74 69 6d 65 28 25 51 2c 27  -1,datetime(%Q,'
2c40: 2d 31 20 73 65 63 6f 6e 64 27 29 20 7c 7c 20 27  -1 second') || '
2c50: 2e 39 27 2c 27 64 69 76 27 29 22 2c 0a 20 20 20  .9','div')",.   
2c60: 20 7a 44 61 74 65 0a 20 20 29 3b 0a 20 20 64 62   zDate.  );.  db
2c70: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20  _multi_exec(.   
2c80: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 69   "INSERT INTO ti
2c90: 6d 65 6c 69 6e 65 28 72 69 64 2c 74 69 6d 65 73  meline(rid,times
2ca0: 74 61 6d 70 2c 65 74 79 70 65 29 22 0a 20 20 20  tamp,etype)".   
2cb0: 20 22 56 41 4c 55 45 53 28 2d 32 2c 64 61 74 65   "VALUES(-2,date
2cc0: 74 69 6d 65 28 25 51 29 20 7c 7c 20 27 2e 31 27  time(%Q) || '.1'
2cd0: 2c 27 64 69 76 27 29 22 2c 0a 20 20 20 20 20 7a  ,'div')",.     z
2ce0: 44 61 74 65 0a 20 20 29 3b 0a 7d 0a 0a 0a 2f 2a  Date.  );.}.../*
2cf0: 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 74 69 6d  .** WEBPAGE: tim
2d00: 65 6c 69 6e 65 0a 2a 2a 0a 2a 2a 20 51 75 65 72  eline.**.** Quer
2d10: 79 20 70 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a  y parameters:.**
2d20: 0a 2a 2a 20 20 20 20 61 3d 54 49 4d 45 53 54 41  .**    a=TIMESTA
2d30: 4d 50 20 20 20 20 61 66 74 65 72 20 74 68 69 73  MP    after this
2d40: 20 64 61 74 65 0a 2a 2a 20 20 20 20 62 3d 54 49   date.**    b=TI
2d50: 4d 45 53 54 41 4d 50 20 20 20 20 62 65 66 6f 72  MESTAMP    befor
2d60: 65 20 74 68 69 73 20 64 61 74 65 2e 0a 2a 2a 20  e this date..** 
2d70: 20 20 20 63 3d 54 49 4d 45 53 54 41 4d 50 20 20     c=TIMESTAMP  
2d80: 20 20 22 63 69 72 63 61 22 20 74 68 69 73 20 64    "circa" this d
2d90: 61 74 65 2e 0a 2a 2a 20 20 20 20 6e 3d 43 4f 55  ate..**    n=COU
2da0: 4e 54 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  NT        number
2db0: 20 6f 66 20 65 76 65 6e 74 73 20 69 6e 20 6f 75   of events in ou
2dc0: 74 70 75 74 0a 2a 2a 20 20 20 20 70 3d 52 49 44  tput.**    p=RID
2dd0: 20 20 20 20 20 20 20 20 20 20 61 72 74 69 66 61            artifa
2de0: 63 74 20 52 49 44 20 61 6e 64 20 75 70 20 74 6f  ct RID and up to
2df0: 20 43 4f 55 4e 54 20 70 61 72 65 6e 74 73 20 61   COUNT parents a
2e00: 6e 64 20 61 6e 63 65 73 74 6f 72 73 0a 2a 2a 20  nd ancestors.** 
2e10: 20 20 20 64 3d 52 49 44 20 20 20 20 20 20 20 20     d=RID        
2e20: 20 20 61 72 74 69 66 61 63 74 20 52 49 44 20 61    artifact RID a
2e30: 6e 64 20 75 70 20 74 6f 20 43 4f 55 4e 54 20 64  nd up to COUNT d
2e40: 65 73 63 65 6e 64 61 6e 74 73 0a 2a 2a 20 20 20  escendants.**   
2e50: 20 74 3d 54 41 47 49 44 20 20 20 20 20 20 20 20   t=TAGID        
2e60: 73 68 6f 77 20 6f 6e 6c 79 20 63 68 65 63 6b 2d  show only check-
2e70: 69 6e 73 20 77 69 74 68 20 74 68 65 20 67 69 76  ins with the giv
2e80: 65 6e 20 74 61 67 69 64 0a 2a 2a 20 20 20 20 75  en tagid.**    u
2e90: 3d 55 53 45 52 20 20 20 20 20 20 20 20 20 6f 6e  =USER         on
2ea0: 6c 79 20 69 66 20 62 65 6c 6f 6e 67 69 6e 67 20  ly if belonging 
2eb0: 74 6f 20 74 68 69 73 20 75 73 65 72 0a 2a 2a 20  to this user.** 
2ec0: 20 20 20 79 3d 54 59 50 45 20 20 20 20 20 20 20     y=TYPE       
2ed0: 20 20 27 63 69 27 2c 20 27 77 27 2c 20 27 74 27    'ci', 'w', 't'
2ee0: 0a 2a 2a 0a 2a 2a 20 70 3d 20 61 6e 64 20 64 3d  .**.** p= and d=
2ef0: 20 63 61 6e 20 61 70 70 65 61 72 20 69 6e 64 69   can appear indi
2f00: 76 69 64 75 61 6c 6c 79 20 6f 72 20 74 6f 67 65  vidually or toge
2f10: 74 68 65 72 2e 20 20 49 66 20 65 69 74 68 65 72  ther.  If either
2f20: 20 70 3d 20 6f 72 20 64 3d 0a 2a 2a 20 61 70 70   p= or d=.** app
2f30: 65 61 72 2c 20 74 68 65 6e 20 75 3d 2c 20 79 3d  ear, then u=, y=
2f40: 2c 20 61 3d 2c 20 61 6e 64 20 62 3d 20 61 72 65  , a=, and b= are
2f50: 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
2f60: 49 66 20 61 3d 20 61 6e 64 20 62 3d 20 61 70 70  If a= and b= app
2f70: 65 61 72 2c 20 6f 6e 6c 79 20 61 3d 20 69 73 20  ear, only a= is 
2f80: 75 73 65 64 2e 20 20 49 66 20 6e 65 69 74 68 65  used.  If neithe
2f90: 72 20 61 70 70 65 61 72 2c 20 74 68 65 20 6d 6f  r appear, the mo
2fa0: 73 74 0a 2a 2a 20 72 65 63 65 6e 74 20 65 76 65  st.** recent eve
2fb0: 6e 74 73 20 61 72 65 20 63 68 6f 6f 73 65 6e 2e  nts are choosen.
2fc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 20 69 73 20  .**.** If n= is 
2fd0: 6d 69 73 73 69 6e 67 2c 20 74 68 65 20 64 65 66  missing, the def
2fe0: 61 75 6c 74 20 63 6f 75 6e 74 20 69 73 20 32 30  ault count is 20
2ff0: 2e 0a 2a 2f 0a 76 6f 69 64 20 70 61 67 65 5f 74  ..*/.void page_t
3000: 69 6d 65 6c 69 6e 65 28 76 6f 69 64 29 7b 0a 20  imeline(void){. 
3010: 20 53 74 6d 74 20 71 3b 20 20 20 20 20 20 20 20   Stmt q;        
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3030: 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65      /* Query use
3040: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68  d to generate th
3050: 65 20 74 69 6d 65 6c 69 6e 65 20 2a 2f 0a 20 20  e timeline */.  
3060: 42 6c 6f 62 20 73 71 6c 3b 20 20 20 20 20 20 20  Blob sql;       
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 53 51     /* text of SQ
3090: 4c 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  L used to genera
30a0: 74 65 20 74 69 6d 65 6c 69 6e 65 20 2a 2f 0a 20  te timeline */. 
30b0: 20 42 6c 6f 62 20 64 65 73 63 3b 20 20 20 20 20   Blob desc;     
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
30e0: 6f 6e 20 6f 66 20 74 68 65 20 74 69 6d 65 6c 69  on of the timeli
30f0: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6e 74  ne */.  int nEnt
3100: 72 79 20 3d 20 61 74 6f 69 28 50 44 28 22 6e 22  ry = atoi(PD("n"
3110: 2c 22 32 30 22 29 29 3b 20 20 20 2f 2a 20 4d 61  ,"20"));   /* Ma
3120: 78 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  x number of entr
3130: 69 65 73 20 6f 6e 20 74 69 6d 65 6c 69 6e 65 20  ies on timeline 
3140: 2a 2f 0a 20 20 69 6e 74 20 70 5f 72 69 64 20 3d  */.  int p_rid =
3150: 20 61 74 6f 69 28 50 44 28 22 70 22 2c 22 30 22   atoi(PD("p","0"
3160: 29 29 3b 20 20 20 20 20 2f 2a 20 61 72 74 69 66  ));     /* artif
3170: 61 63 74 20 70 20 61 6e 64 20 69 74 73 20 70 61  act p and its pa
3180: 72 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rents */.  int d
3190: 5f 72 69 64 20 3d 20 61 74 6f 69 28 50 44 28 22  _rid = atoi(PD("
31a0: 64 22 2c 22 30 22 29 29 3b 20 20 20 20 20 2f 2a  d","0"));     /*
31b0: 20 61 72 74 69 66 61 63 74 20 64 20 61 6e 64 20   artifact d and 
31c0: 69 74 73 20 64 65 73 63 65 6e 64 61 6e 74 73 20  its descendants 
31d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
31e0: 2a 7a 55 73 65 72 20 3d 20 50 28 22 75 22 29 3b  *zUser = P("u");
31f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 65          /* All e
3200: 6e 74 72 69 65 73 20 62 79 20 74 68 69 73 20 75  ntries by this u
3210: 73 65 72 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ser if not NULL 
3220: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
3230: 2a 7a 54 79 70 65 20 3d 20 50 44 28 22 79 22 2c  *zType = PD("y",
3240: 22 61 6c 6c 22 29 3b 20 2f 2a 20 54 79 70 65 20  "all"); /* Type 
3250: 6f 66 20 65 76 65 6e 74 73 2e 20 20 41 6c 6c 20  of events.  All 
3260: 69 66 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  if NULL */.  con
3270: 73 74 20 63 68 61 72 20 2a 7a 41 66 74 65 72 20  st char *zAfter 
3280: 3d 20 50 28 22 61 22 29 3b 20 20 20 20 20 20 20  = P("a");       
3290: 2f 2a 20 45 76 65 6e 74 73 20 61 66 74 65 72 20  /* Events after 
32a0: 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 63  this time */.  c
32b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 65 66 6f  onst char *zBefo
32c0: 72 65 20 3d 20 50 28 22 62 22 29 3b 20 20 20 20  re = P("b");    
32d0: 20 20 2f 2a 20 45 76 65 6e 74 73 20 62 65 66 6f    /* Events befo
32e0: 72 65 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  re this time */.
32f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
3300: 69 72 63 61 20 3d 20 50 28 22 63 22 29 3b 20 20  irca = P("c");  
3310: 20 20 20 20 20 2f 2a 20 45 76 65 6e 74 73 20 6e       /* Events n
3320: 65 61 72 20 74 68 69 73 20 74 69 6d 65 20 2a 2f  ear this time */
3330: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3340: 54 61 67 4e 61 6d 65 20 3d 20 50 28 22 74 22 29  TagName = P("t")
3350: 3b 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 65 76  ;     /* Show ev
3360: 65 6e 74 73 20 77 69 74 68 20 74 68 69 73 20 74  ents with this t
3370: 61 67 20 2a 2f 0a 20 20 48 51 75 65 72 79 20 75  ag */.  HQuery u
3380: 72 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rl;             
3390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 52             /* UR
33a0: 4c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 62 72  L for various br
33b0: 61 6e 63 68 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20  anch links */.  
33c0: 69 6e 74 20 74 61 67 69 64 3b 20 20 20 20 20 20  int tagid;      
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e0: 20 20 20 2f 2a 20 54 61 67 20 49 44 20 2a 2f 0a     /* Tag ID */.
33f0: 20 20 69 6e 74 20 74 6d 46 6c 61 67 73 3b 20 20    int tmFlags;  
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3410: 20 20 20 20 20 2f 2a 20 54 69 6d 65 6c 69 6e 65       /* Timeline
3420: 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 2f 2a 20   flags */..  /* 
3430: 54 6f 20 76 69 65 77 20 74 68 65 20 74 69 6d 65  To view the time
3440: 6c 69 6e 65 2c 20 6d 75 73 74 20 68 61 76 65 20  line, must have 
3450: 70 65 72 6d 69 73 73 69 6f 6e 20 74 6f 20 72 65  permission to re
3460: 61 64 20 70 72 6f 6a 65 63 74 20 64 61 74 61 2e  ad project data.
3470: 0a 20 20 2a 2f 0a 20 20 6c 6f 67 69 6e 5f 63 68  .  */.  login_ch
3480: 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28  eck_credentials(
3490: 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52 65  );.  if( !g.okRe
34a0: 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64  ad ){ login_need
34b0: 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  ed(); return; }.
34c0: 20 20 69 66 28 20 7a 54 61 67 4e 61 6d 65 20 29    if( zTagName )
34d0: 7b 0a 20 20 20 20 74 61 67 69 64 20 3d 20 64 62  {.    tagid = db
34e0: 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20  _int(0, "SELECT 
34f0: 74 61 67 69 64 20 46 52 4f 4d 20 74 61 67 20 57  tagid FROM tag W
3500: 48 45 52 45 20 74 61 67 6e 61 6d 65 3d 27 73 79  HERE tagname='sy
3510: 6d 2d 25 71 27 22 2c 20 7a 54 61 67 4e 61 6d 65  m-%q'", zTagName
3520: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3530: 74 61 67 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  tagid = 0;.  }. 
3540: 20 69 66 28 20 7a 54 79 70 65 5b 30 5d 3d 3d 27   if( zType[0]=='
3550: 61 27 20 29 7b 0a 20 20 20 20 74 6d 46 6c 61 67  a' ){.    tmFlag
3560: 73 20 3d 20 54 49 4d 45 4c 49 4e 45 5f 42 52 49  s = TIMELINE_BRI
3570: 45 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EF;.  }else{.   
3580: 20 74 6d 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20   tmFlags = 0;.  
3590: 7d 0a 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65  }..  style_heade
35a0: 72 28 22 54 69 6d 65 6c 69 6e 65 22 29 3b 0a 20  r("Timeline");. 
35b0: 20 6c 6f 67 69 6e 5f 61 6e 6f 6e 79 6d 6f 75 73   login_anonymous
35c0: 5f 61 76 61 69 6c 61 62 6c 65 28 29 3b 0a 20 20  _available();.  
35d0: 74 69 6d 65 6c 69 6e 65 5f 74 65 6d 70 5f 74 61  timeline_temp_ta
35e0: 62 6c 65 28 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65  ble();.  blob_ze
35f0: 72 6f 28 26 73 71 6c 29 3b 0a 20 20 62 6c 6f 62  ro(&sql);.  blob
3600: 5f 7a 65 72 6f 28 26 64 65 73 63 29 3b 0a 20 20  _zero(&desc);.  
3610: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 73 71 6c  blob_append(&sql
3620: 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e  , "INSERT OR IGN
3630: 4f 52 45 20 49 4e 54 4f 20 74 69 6d 65 6c 69 6e  ORE INTO timelin
3640: 65 20 22 2c 20 2d 31 29 3b 0a 20 20 62 6c 6f 62  e ", -1);.  blob
3650: 5f 61 70 70 65 6e 64 28 26 73 71 6c 2c 20 74 69  _append(&sql, ti
3660: 6d 65 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72  meline_query_for
3670: 5f 77 77 77 28 29 2c 20 2d 31 29 3b 0a 20 20 69  _www(), -1);.  i
3680: 66 28 20 70 5f 72 69 64 20 7c 7c 20 64 5f 72 69  f( p_rid || d_ri
3690: 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 70  d ){.    /* If p
36a0: 3d 20 6f 72 20 64 3d 20 69 73 20 70 72 65 73 65  = or d= is prese
36b0: 6e 74 2c 20 69 67 6e 6f 72 65 20 61 6c 6c 20 6f  nt, ignore all o
36c0: 74 68 65 72 20 70 61 72 61 6d 65 74 65 72 73 20  ther parameters 
36d0: 6f 74 68 65 72 20 74 68 61 6e 20 6e 3d 20 2a 2f  other than n= */
36e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 75 69 64  .    char *zUuid
36f0: 3b 0a 20 20 20 20 69 6e 74 20 6e 70 2c 20 6e 64  ;.    int np, nd
3700: 3b 0a 0a 20 20 20 20 69 66 28 20 70 5f 72 69 64  ;..    if( p_rid
3710: 20 26 26 20 64 5f 72 69 64 20 29 7b 0a 20 20 20   && d_rid ){.   
3720: 20 20 20 69 66 28 20 70 5f 72 69 64 21 3d 64 5f     if( p_rid!=d_
3730: 72 69 64 20 29 20 70 5f 72 69 64 20 3d 20 64 5f  rid ) p_rid = d_
3740: 72 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 50  rid;.      if( P
3750: 28 22 6e 22 29 3d 3d 30 20 29 20 6e 45 6e 74 72  ("n")==0 ) nEntr
3760: 79 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20  y = 10;.    }.  
3770: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
3780: 0a 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20  .       "CREATE 
3790: 54 45 4d 50 20 54 41 42 4c 45 20 49 46 20 4e 4f  TEMP TABLE IF NO
37a0: 54 20 45 58 49 53 54 53 20 6f 6b 28 72 69 64 20  T EXISTS ok(rid 
37b0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
37c0: 4b 45 59 29 22 0a 20 20 20 20 29 3b 0a 20 20 20  KEY)".    );.   
37d0: 20 7a 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74   zUuid = db_text
37e0: 28 22 22 2c 20 22 53 45 4c 45 43 54 20 75 75 69  ("", "SELECT uui
37f0: 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52  d FROM blob WHER
3800: 45 20 72 69 64 3d 25 64 22 2c 0a 20 20 20 20 20  E rid=%d",.     
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 20 20 70 5f 72 69 64 20 3f 20 70 5f 72 69      p_rid ? p_ri
3830: 64 20 3a 20 64 5f 72 69 64 29 3b 0a 20 20 20 20  d : d_rid);.    
3840: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 71  blob_appendf(&sq
3850: 6c 2c 20 22 20 41 4e 44 20 65 76 65 6e 74 2e 6f  l, " AND event.o
3860: 62 6a 69 64 20 49 4e 20 6f 6b 22 29 3b 0a 20 20  bjid IN ok");.  
3870: 20 20 6e 64 20 3d 20 30 3b 0a 20 20 20 20 69 66    nd = 0;.    if
3880: 28 20 64 5f 72 69 64 20 29 7b 0a 20 20 20 20 20  ( d_rid ){.     
3890: 20 63 6f 6d 70 75 74 65 5f 64 65 73 63 65 6e 64   compute_descend
38a0: 61 6e 74 73 28 64 5f 72 69 64 2c 20 6e 45 6e 74  ants(d_rid, nEnt
38b0: 72 79 2b 31 29 3b 0a 20 20 20 20 20 20 6e 64 20  ry+1);.      nd 
38c0: 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c  = db_int(0, "SEL
38d0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2d 31 20 46  ECT count(*)-1 F
38e0: 52 4f 4d 20 6f 6b 22 29 3b 0a 20 20 20 20 20 20  ROM ok");.      
38f0: 69 66 28 20 6e 64 3e 30 20 29 7b 0a 20 20 20 20  if( nd>0 ){.    
3900: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
3910: 63 28 22 25 73 22 2c 20 62 6c 6f 62 5f 73 74 72  c("%s", blob_str
3920: 28 26 73 71 6c 29 29 3b 0a 20 20 20 20 20 20 20  (&sql));.       
3930: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 64   blob_appendf(&d
3940: 65 73 63 2c 20 22 25 64 20 64 65 73 63 65 6e 64  esc, "%d descend
3950: 61 6e 74 73 22 2c 20 6e 64 29 3b 0a 20 20 20 20  ants", nd);.    
3960: 20 20 7d 0a 20 20 20 20 20 20 74 69 6d 65 6c 69    }.      timeli
3970: 6e 65 5f 61 64 64 5f 64 69 76 69 64 65 72 73 28  ne_add_dividers(
3980: 20 20 0a 20 20 20 20 20 20 20 20 64 62 5f 74 65    .        db_te
3990: 78 74 28 22 31 22 2c 22 53 45 4c 45 43 54 20 64  xt("1","SELECT d
39a0: 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 27 6c  atetime(mtime,'l
39b0: 6f 63 61 6c 74 69 6d 65 27 29 20 46 52 4f 4d 20  ocaltime') FROM 
39c0: 65 76 65 6e 74 22 0a 20 20 20 20 20 20 20 20 20  event".         
39d0: 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
39e0: 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c 20 64 5f  RE objid=%d", d_
39f0: 72 69 64 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  rid).      );.  
3a00: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
3a10: 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 6f  c("DELETE FROM o
3a20: 6b 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  k");.    }.    i
3a30: 66 28 20 70 5f 72 69 64 20 29 7b 0a 20 20 20 20  f( p_rid ){.    
3a40: 20 20 63 6f 6d 70 75 74 65 5f 61 6e 63 65 73 74    compute_ancest
3a50: 6f 72 73 28 70 5f 72 69 64 2c 20 6e 45 6e 74 72  ors(p_rid, nEntr
3a60: 79 2b 31 29 3b 0a 20 20 20 20 20 20 6e 70 20 3d  y+1);.      np =
3a70: 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45   db_int(0, "SELE
3a80: 43 54 20 63 6f 75 6e 74 28 2a 29 2d 31 20 46 52  CT count(*)-1 FR
3a90: 4f 4d 20 6f 6b 22 29 3b 0a 20 20 20 20 20 20 69  OM ok");.      i
3aa0: 66 28 20 6e 70 3e 30 20 29 7b 0a 20 20 20 20 20  f( np>0 ){.     
3ab0: 20 20 20 69 66 28 20 6e 64 3e 30 20 29 20 62 6c     if( nd>0 ) bl
3ac0: 6f 62 5f 61 70 70 65 6e 64 66 28 26 64 65 73 63  ob_appendf(&desc
3ad0: 2c 20 22 20 61 6e 64 20 22 29 3b 0a 20 20 20 20  , " and ");.    
3ae0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
3af0: 28 26 64 65 73 63 2c 20 22 25 64 20 61 6e 63 65  (&desc, "%d ance
3b00: 73 74 6f 72 73 22 2c 20 6e 70 29 3b 0a 20 20 20  stors", np);.   
3b10: 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78       db_multi_ex
3b20: 65 63 28 22 25 73 22 2c 20 62 6c 6f 62 5f 73 74  ec("%s", blob_st
3b30: 72 28 26 73 71 6c 29 29 3b 0a 20 20 20 20 20 20  r(&sql));.      
3b40: 7d 0a 20 20 20 20 20 20 69 66 28 20 64 5f 72 69  }.      if( d_ri
3b50: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
3b60: 74 69 6d 65 6c 69 6e 65 5f 61 64 64 5f 64 69 76  timeline_add_div
3b70: 69 64 65 72 73 28 20 20 0a 20 20 20 20 20 20 20  iders(  .       
3b80: 20 20 20 64 62 5f 74 65 78 74 28 22 31 22 2c 22     db_text("1","
3b90: 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28  SELECT datetime(
3ba0: 6d 74 69 6d 65 2c 27 6c 6f 63 61 6c 74 69 6d 65  mtime,'localtime
3bb0: 27 29 20 46 52 4f 4d 20 65 76 65 6e 74 22 0a 20  ') FROM event". 
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bd0: 20 20 20 20 20 22 20 57 48 45 52 45 20 6f 62 6a       " WHERE obj
3be0: 69 64 3d 25 64 22 2c 20 70 5f 72 69 64 29 0a 20  id=%d", p_rid). 
3bf0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
3c00: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
3c10: 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20  g.okHistory ){. 
3c20: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64       blob_append
3c30: 66 28 26 64 65 73 63 2c 20 22 20 6f 66 20 3c 61  f(&desc, " of <a
3c40: 20 68 72 65 66 3d 27 25 73 2f 69 6e 66 6f 2f 25   href='%s/info/%
3c50: 73 27 3e 5b 25 2e 31 30 73 5d 3c 2f 61 3e 22 2c  s'>[%.10s]</a>",
3c60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3c70: 20 20 20 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20      g.zBaseURL, 
3c80: 7a 55 75 69 64 2c 20 7a 55 75 69 64 29 3b 0a 20  zUuid, zUuid);. 
3c90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3ca0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 64 65  blob_appendf(&de
3cb0: 73 63 2c 20 22 20 6f 66 20 63 68 65 63 6b 2d 69  sc, " of check-i
3cc0: 6e 20 5b 25 2e 31 30 73 5d 22 2c 20 7a 55 75 69  n [%.10s]", zUui
3cd0: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  d);.    }.  }els
3ce0: 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  e{.    int n;.  
3cf0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
3d00: 54 79 70 65 20 3d 20 22 65 76 65 6e 74 22 3b 0a  Type = "event";.
3d10: 20 20 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b      char *zDate;
3d20: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 45 6e 74  .    char *zNEnt
3d30: 72 79 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 64  ry = mprintf("%d
3d40: 22 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20  ", nEntry);.    
3d50: 75 72 6c 5f 69 6e 69 74 69 61 6c 69 7a 65 28 26  url_initialize(&
3d60: 75 72 6c 2c 20 22 74 69 6d 65 6c 69 6e 65 22 29  url, "timeline")
3d70: 3b 0a 20 20 20 20 75 72 6c 5f 61 64 64 5f 70 61  ;.    url_add_pa
3d80: 72 61 6d 65 74 65 72 28 26 75 72 6c 2c 20 22 6e  rameter(&url, "n
3d90: 22 2c 20 7a 4e 45 6e 74 72 79 29 3b 0a 20 20 20  ", zNEntry);.   
3da0: 20 69 66 28 20 74 61 67 69 64 3e 30 20 29 7b 0a   if( tagid>0 ){.
3db0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 63        zType = "c
3dc0: 69 22 3b 0a 20 20 20 20 20 20 75 72 6c 5f 61 64  i";.      url_ad
3dd0: 64 5f 70 61 72 61 6d 65 74 65 72 28 26 75 72 6c  d_parameter(&url
3de0: 2c 20 22 74 22 2c 20 7a 54 61 67 4e 61 6d 65 29  , "t", zTagName)
3df0: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  ;.      blob_app
3e00: 65 6e 64 66 28 26 73 71 6c 2c 20 22 20 41 4e 44  endf(&sql, " AND
3e10: 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
3e20: 31 20 46 52 4f 4d 20 74 61 67 78 72 65 66 20 57  1 FROM tagxref W
3e30: 48 45 52 45 20 74 61 67 69 64 3d 25 64 22 0a 20  HERE tagid=%d". 
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 20 20 20 20 20 20 22 20 41 4e 44 20 74 61 67         " AND tag
3e70: 74 79 70 65 3e 30 20 41 4e 44 20 72 69 64 3d 62  type>0 AND rid=b
3e80: 6c 6f 62 2e 72 69 64 29 22 2c 0a 20 20 20 20 20  lob.rid)",.     
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61                ta
3ea0: 67 69 64 29 3b 0a 20 20 20 20 7d 20 20 20 20 0a  gid);.    }    .
3eb0: 20 20 20 20 69 66 28 20 7a 54 79 70 65 5b 30 5d      if( zType[0]
3ec0: 21 3d 27 61 27 20 29 7b 0a 20 20 20 20 20 20 62  !='a' ){.      b
3ed0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 71 6c  lob_appendf(&sql
3ee0: 2c 20 22 20 41 4e 44 20 65 76 65 6e 74 2e 74 79  , " AND event.ty
3ef0: 70 65 3d 25 51 22 2c 20 7a 54 79 70 65 29 3b 0a  pe=%Q", zType);.
3f00: 20 20 20 20 20 20 75 72 6c 5f 61 64 64 5f 70 61        url_add_pa
3f10: 72 61 6d 65 74 65 72 28 26 75 72 6c 2c 20 22 79  rameter(&url, "y
3f20: 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 20  ", zType);.     
3f30: 20 69 66 28 20 7a 54 79 70 65 5b 30 5d 3d 3d 27   if( zType[0]=='
3f40: 63 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  c' ){.        zE
3f50: 54 79 70 65 20 3d 20 22 63 68 65 63 6b 69 6e 22  Type = "checkin"
3f60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
3f70: 28 20 7a 54 79 70 65 5b 30 5d 3d 3d 27 77 27 20  ( zType[0]=='w' 
3f80: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 54 79 70  ){.        zETyp
3f90: 65 20 3d 20 22 77 69 6b 69 20 65 64 69 74 22 3b  e = "wiki edit";
3fa0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
3fb0: 20 7a 54 79 70 65 5b 30 5d 3d 3d 27 74 27 20 29   zType[0]=='t' )
3fc0: 7b 0a 20 20 20 20 20 20 20 20 7a 45 54 79 70 65  {.        zEType
3fd0: 20 3d 20 22 74 69 63 6b 65 74 20 63 68 61 6e 67   = "ticket chang
3fe0: 65 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e";.      }.    
3ff0: 7d 0a 20 20 20 20 69 66 28 20 7a 55 73 65 72 20  }.    if( zUser 
4000: 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  ){.      blob_ap
4010: 70 65 6e 64 66 28 26 73 71 6c 2c 20 22 20 41 4e  pendf(&sql, " AN
4020: 44 20 65 76 65 6e 74 2e 75 73 65 72 3d 25 51 22  D event.user=%Q"
4030: 2c 20 7a 55 73 65 72 29 3b 0a 20 20 20 20 20 20  , zUser);.      
4040: 75 72 6c 5f 61 64 64 5f 70 61 72 61 6d 65 74 65  url_add_paramete
4050: 72 28 26 75 72 6c 2c 20 22 75 22 2c 20 7a 55 73  r(&url, "u", zUs
4060: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  er);.    }.    i
4070: 66 28 20 7a 41 66 74 65 72 20 29 7b 0a 20 20 20  f( zAfter ){.   
4080: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
4090: 65 28 7a 41 66 74 65 72 5b 30 5d 29 20 29 7b 20  e(zAfter[0]) ){ 
40a0: 7a 41 66 74 65 72 2b 2b 3b 20 7d 0a 20 20 20 20  zAfter++; }.    
40b0: 20 20 69 66 28 20 7a 41 66 74 65 72 5b 30 5d 20    if( zAfter[0] 
40c0: 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  ){.        blob_
40d0: 61 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 0a 20  appendf(&sql, . 
40e0: 20 20 20 20 20 20 20 20 20 20 22 20 41 4e 44 20            " AND 
40f0: 65 76 65 6e 74 2e 6d 74 69 6d 65 3e 3d 28 53 45  event.mtime>=(SE
4100: 4c 45 43 54 20 6a 75 6c 69 61 6e 64 61 79 28 25  LECT julianday(%
4110: 51 2c 20 27 75 74 63 27 29 29 22 0a 20 20 20 20  Q, 'utc'))".    
4120: 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42         " ORDER B
4130: 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20 41 53  Y event.mtime AS
4140: 43 22 2c 20 7a 41 66 74 65 72 29 3b 0a 20 20 20  C", zAfter);.   
4150: 20 20 20 20 20 75 72 6c 5f 61 64 64 5f 70 61 72       url_add_par
4160: 61 6d 65 74 65 72 28 26 75 72 6c 2c 20 22 61 22  ameter(&url, "a"
4170: 2c 20 7a 41 66 74 65 72 29 3b 0a 20 20 20 20 20  , zAfter);.     
4180: 20 20 20 7a 42 65 66 6f 72 65 20 3d 20 30 3b 0a     zBefore = 0;.
4190: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
41a0: 20 20 20 20 20 7a 41 66 74 65 72 20 3d 20 30 3b       zAfter = 0;
41b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
41c0: 73 65 20 69 66 28 20 7a 42 65 66 6f 72 65 20 29  se if( zBefore )
41d0: 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
41e0: 73 73 70 61 63 65 28 7a 42 65 66 6f 72 65 5b 30  sspace(zBefore[0
41f0: 5d 29 20 29 7b 20 7a 42 65 66 6f 72 65 2b 2b 3b  ]) ){ zBefore++;
4200: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 42 65   }.      if( zBe
4210: 66 6f 72 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20  fore[0] ){.     
4220: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
4230: 26 73 71 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  &sql, .         
4240: 20 20 22 20 41 4e 44 20 65 76 65 6e 74 2e 6d 74    " AND event.mt
4250: 69 6d 65 3c 3d 28 53 45 4c 45 43 54 20 6a 75 6c  ime<=(SELECT jul
4260: 69 61 6e 64 61 79 28 25 51 2c 20 27 75 74 63 27  ianday(%Q, 'utc'
4270: 29 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  ))".           "
4280: 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 2e   ORDER BY event.
4290: 6d 74 69 6d 65 20 44 45 53 43 22 2c 20 7a 42 65  mtime DESC", zBe
42a0: 66 6f 72 65 29 3b 0a 20 20 20 20 20 20 20 20 75  fore);.        u
42b0: 72 6c 5f 61 64 64 5f 70 61 72 61 6d 65 74 65 72  rl_add_parameter
42c0: 28 26 75 72 6c 2c 20 22 62 22 2c 20 7a 42 65 66  (&url, "b", zBef
42d0: 6f 72 65 29 3b 0a 20 20 20 20 20 20 20 7d 65 6c  ore);.       }el
42e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 42 65 66  se{.        zBef
42f0: 6f 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ore = 0;.      }
4300: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
4310: 43 69 72 63 61 20 29 7b 0a 20 20 20 20 20 20 77  Circa ){.      w
4320: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a 43  hile( isspace(zC
4330: 69 72 63 61 5b 30 5d 29 20 29 7b 20 7a 43 69 72  irca[0]) ){ zCir
4340: 63 61 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66  ca++; }.      if
4350: 28 20 7a 43 69 72 63 61 5b 30 5d 20 29 7b 0a 20  ( zCirca[0] ){. 
4360: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 43         double rC
4370: 69 72 63 61 20 3d 20 64 62 5f 64 6f 75 62 6c 65  irca = db_double
4380: 28 30 2e 30 2c 20 22 53 45 4c 45 43 54 20 6a 75  (0.0, "SELECT ju
4390: 6c 69 61 6e 64 61 79 28 25 51 2c 20 27 75 74 63  lianday(%Q, 'utc
43a0: 27 29 22 2c 20 7a 43 69 72 63 61 29 3b 0a 20 20  ')", zCirca);.  
43b0: 20 20 20 20 20 20 42 6c 6f 62 20 73 71 6c 32 3b        Blob sql2;
43c0: 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 69 6e  .        blob_in
43d0: 69 74 28 26 73 71 6c 32 2c 20 62 6c 6f 62 5f 73  it(&sql2, blob_s
43e0: 74 72 28 26 73 71 6c 29 2c 20 2d 31 29 3b 0a 20  tr(&sql), -1);. 
43f0: 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65         blob_appe
4400: 6e 64 66 28 26 73 71 6c 32 2c 0a 20 20 20 20 20  ndf(&sql2,.     
4410: 20 20 20 20 20 20 20 22 20 41 4e 44 20 65 76 65         " AND eve
4420: 6e 74 2e 6d 74 69 6d 65 3c 3d 25 66 20 4f 52 44  nt.mtime<=%f ORD
4430: 45 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d  ER BY event.mtim
4440: 65 20 44 45 53 43 20 4c 49 4d 49 54 20 25 64 22  e DESC LIMIT %d"
4450: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 43  ,.            rC
4460: 69 72 63 61 2c 20 28 6e 45 6e 74 72 79 2b 31 29  irca, (nEntry+1)
4470: 2f 32 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  /2.        );.  
4480: 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65        db_multi_e
4490: 78 65 63 28 22 25 73 22 2c 20 62 6c 6f 62 5f 73  xec("%s", blob_s
44a0: 74 72 28 26 73 71 6c 32 29 29 3b 0a 20 20 20 20  tr(&sql2));.    
44b0: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26      blob_reset(&
44c0: 73 71 6c 32 29 3b 0a 20 20 20 20 20 20 20 20 62  sql2);.        b
44d0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 71 6c  lob_appendf(&sql
44e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20  ,.            " 
44f0: 41 4e 44 20 65 76 65 6e 74 2e 6d 74 69 6d 65 3e  AND event.mtime>
4500: 3d 25 66 20 4f 52 44 45 52 20 42 59 20 65 76 65  =%f ORDER BY eve
4510: 6e 74 2e 6d 74 69 6d 65 20 41 53 43 22 2c 0a 20  nt.mtime ASC",. 
4520: 20 20 20 20 20 20 20 20 20 20 20 72 43 69 72 63             rCirc
4530: 61 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  a.        );.   
4540: 20 20 20 20 20 6e 45 6e 74 72 79 20 2d 3d 20 28       nEntry -= (
4550: 6e 45 6e 74 72 79 2b 31 29 2f 32 3b 0a 20 20 20  nEntry+1)/2;.   
4560: 20 20 20 20 20 74 69 6d 65 6c 69 6e 65 5f 61 64       timeline_ad
4570: 64 5f 64 69 76 69 64 65 72 73 28 7a 43 69 72 63  d_dividers(zCirc
4580: 61 29 3b 0a 20 20 20 20 20 20 20 20 75 72 6c 5f  a);.        url_
4590: 61 64 64 5f 70 61 72 61 6d 65 74 65 72 28 26 75  add_parameter(&u
45a0: 72 6c 2c 20 22 63 22 2c 20 7a 43 69 72 63 61 29  rl, "c", zCirca)
45b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
45c0: 20 20 20 20 20 20 20 7a 43 69 72 63 61 20 3d 20         zCirca = 
45d0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
45e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 6c 6f 62  else{.      blob
45f0: 5f 61 70 70 65 6e 64 66 28 26 73 71 6c 2c 20 22  _appendf(&sql, "
4600: 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 2e   ORDER BY event.
4610: 6d 74 69 6d 65 20 44 45 53 43 22 29 3b 0a 20 20  mtime DESC");.  
4620: 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70    }.    blob_app
4630: 65 6e 64 66 28 26 73 71 6c 2c 20 22 20 4c 49 4d  endf(&sql, " LIM
4640: 49 54 20 25 64 22 2c 20 6e 45 6e 74 72 79 29 3b  IT %d", nEntry);
4650: 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78  .    db_multi_ex
4660: 65 63 28 22 25 73 22 2c 20 62 6c 6f 62 5f 73 74  ec("%s", blob_st
4670: 72 28 26 73 71 6c 29 29 3b 0a 0a 20 20 20 20 6e  r(&sql));..    n
4680: 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 45   = db_int(0, "SE
4690: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
46a0: 4f 4d 20 74 69 6d 65 6c 69 6e 65 22 29 3b 0a 20  OM timeline");. 
46b0: 20 20 20 69 66 28 20 6e 3c 6e 45 6e 74 72 79 20     if( n<nEntry 
46c0: 26 26 20 7a 41 66 74 65 72 20 29 7b 0a 20 20 20  && zAfter ){.   
46d0: 20 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 28     cgi_redirect(
46e0: 75 72 6c 5f 72 65 6e 64 65 72 28 26 75 72 6c 2c  url_render(&url,
46f0: 20 22 61 22 2c 20 30 2c 20 22 62 22 2c 20 30 29   "a", 0, "b", 0)
4700: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
4710: 20 7a 41 66 74 65 72 3d 3d 30 20 26 26 20 7a 42   zAfter==0 && zB
4720: 65 66 6f 72 65 3d 3d 30 20 26 26 20 7a 43 69 72  efore==0 && zCir
4730: 63 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  ca==0 ){.      b
4740: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 64 65 73  lob_appendf(&des
4750: 63 2c 20 22 25 64 20 6d 6f 73 74 20 72 65 63 65  c, "%d most rece
4760: 6e 74 20 25 73 73 22 2c 20 6e 2c 20 7a 45 54 79  nt %ss", n, zETy
4770: 70 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pe);.    }else{.
4780: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
4790: 64 66 28 26 64 65 73 63 2c 20 22 25 64 20 25 73  df(&desc, "%d %s
47a0: 73 22 2c 20 6e 2c 20 7a 45 54 79 70 65 29 3b 0a  s", n, zEType);.
47b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 55      }.    if( zU
47c0: 73 65 72 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f  ser ){.      blo
47d0: 62 5f 61 70 70 65 6e 64 66 28 26 64 65 73 63 2c  b_appendf(&desc,
47e0: 20 22 20 62 79 20 75 73 65 72 20 25 68 22 2c 20   " by user %h", 
47f0: 7a 55 73 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  zUser);.    }.  
4800: 20 20 69 66 28 20 74 61 67 69 64 3e 30 20 29 7b    if( tagid>0 ){
4810: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
4820: 6e 64 66 28 26 64 65 73 63 2c 20 22 20 74 61 67  ndf(&desc, " tag
4830: 67 65 64 20 77 69 74 68 20 5c 22 25 68 5c 22 22  ged with \"%h\""
4840: 2c 20 7a 54 61 67 4e 61 6d 65 29 3b 0a 20 20 20  , zTagName);.   
4850: 20 7d 0a 20 20 20 20 69 66 28 20 7a 41 66 74 65   }.    if( zAfte
4860: 72 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f  r ){.      blob_
4870: 61 70 70 65 6e 64 66 28 26 64 65 73 63 2c 20 22  appendf(&desc, "
4880: 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20 6f 72   occurring on or
4890: 20 61 66 74 65 72 20 25 68 2e 3c 62 72 3e 22 2c   after %h.<br>",
48a0: 20 7a 41 66 74 65 72 29 3b 0a 20 20 20 20 7d 65   zAfter);.    }e
48b0: 6c 73 65 20 69 66 28 20 7a 42 65 66 6f 72 65 20  lse if( zBefore 
48c0: 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  ){.      blob_ap
48d0: 70 65 6e 64 66 28 26 64 65 73 63 2c 20 22 20 6f  pendf(&desc, " o
48e0: 63 63 75 72 72 69 6e 67 20 6f 6e 20 6f 72 20 62  ccurring on or b
48f0: 65 66 6f 72 65 20 25 68 2e 3c 62 72 3e 22 2c 20  efore %h.<br>", 
4900: 7a 42 65 66 6f 72 65 29 3b 0a 20 20 20 20 7d 65  zBefore);.    }e
4910: 6c 73 65 20 69 66 28 20 7a 43 69 72 63 61 20 29  lse if( zCirca )
4920: 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  {.      blob_app
4930: 65 6e 64 66 28 26 64 65 73 63 2c 20 22 20 6f 63  endf(&desc, " oc
4940: 63 75 72 72 69 6e 67 20 61 72 6f 75 6e 64 20 25  curring around %
4950: 68 2e 3c 62 72 3e 22 2c 20 7a 43 69 72 63 61 29  h.<br>", zCirca)
4960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4970: 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20  g.okHistory ){. 
4980: 20 20 20 20 20 69 66 28 20 7a 41 66 74 65 72 20       if( zAfter 
4990: 7c 7c 20 6e 3d 3d 6e 45 6e 74 72 79 20 29 7b 0a  || n==nEntry ){.
49a0: 20 20 20 20 20 20 20 20 7a 44 61 74 65 20 3d 20          zDate = 
49b0: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
49c0: 43 54 20 6d 69 6e 28 74 69 6d 65 73 74 61 6d 70  CT min(timestamp
49d0: 29 20 46 52 4f 4d 20 74 69 6d 65 6c 69 6e 65 22  ) FROM timeline"
49e0: 29 3b 0a 20 20 20 20 20 20 20 20 74 69 6d 65 6c  );.        timel
49f0: 69 6e 65 5f 73 75 62 6d 65 6e 75 28 26 75 72 6c  ine_submenu(&url
4a00: 2c 20 22 4f 6c 64 65 72 22 2c 20 22 62 22 2c 20  , "Older", "b", 
4a10: 7a 44 61 74 65 2c 20 22 61 22 29 3b 0a 20 20 20  zDate, "a");.   
4a20: 20 20 20 20 20 66 72 65 65 28 7a 44 61 74 65 29       free(zDate)
4a30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4a40: 69 66 28 20 7a 42 65 66 6f 72 65 20 7c 7c 20 28  if( zBefore || (
4a50: 7a 41 66 74 65 72 20 26 26 20 6e 3d 3d 6e 45 6e  zAfter && n==nEn
4a60: 74 72 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  try) ){.        
4a70: 7a 44 61 74 65 20 3d 20 64 62 5f 74 65 78 74 28  zDate = db_text(
4a80: 30 2c 20 22 53 45 4c 45 43 54 20 6d 61 78 28 74  0, "SELECT max(t
4a90: 69 6d 65 73 74 61 6d 70 29 20 46 52 4f 4d 20 74  imestamp) FROM t
4aa0: 69 6d 65 6c 69 6e 65 22 29 3b 0a 20 20 20 20 20  imeline");.     
4ab0: 20 20 20 74 69 6d 65 6c 69 6e 65 5f 73 75 62 6d     timeline_subm
4ac0: 65 6e 75 28 26 75 72 6c 2c 20 22 4e 65 77 65 72  enu(&url, "Newer
4ad0: 22 2c 20 22 61 22 2c 20 7a 44 61 74 65 2c 20 22  ", "a", zDate, "
4ae0: 62 22 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65  b");.        fre
4af0: 65 28 7a 44 61 74 65 29 3b 0a 20 20 20 20 20 20  e(zDate);.      
4b00: 7d 65 6c 73 65 20 69 66 28 20 74 61 67 69 64 3d  }else if( tagid=
4b10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
4b20: 28 20 7a 54 79 70 65 5b 30 5d 21 3d 27 61 27 20  ( zType[0]!='a' 
4b30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 69 6d  ){.          tim
4b40: 65 6c 69 6e 65 5f 73 75 62 6d 65 6e 75 28 26 75  eline_submenu(&u
4b50: 72 6c 2c 20 22 41 6c 6c 20 54 79 70 65 73 22 2c  rl, "All Types",
4b60: 20 22 79 22 2c 20 22 61 6c 6c 22 2c 20 30 29 3b   "y", "all", 0);
4b70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4b80: 20 20 20 69 66 28 20 7a 54 79 70 65 5b 30 5d 21     if( zType[0]!
4b90: 3d 27 77 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='w' ){.        
4ba0: 20 20 74 69 6d 65 6c 69 6e 65 5f 73 75 62 6d 65    timeline_subme
4bb0: 6e 75 28 26 75 72 6c 2c 20 22 57 69 6b 69 20 4f  nu(&url, "Wiki O
4bc0: 6e 6c 79 22 2c 20 22 79 22 2c 20 22 77 22 2c 20  nly", "y", "w", 
4bd0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
4be0: 20 20 20 20 20 20 69 66 28 20 7a 54 79 70 65 5b        if( zType[
4bf0: 30 5d 21 3d 27 63 27 20 29 7b 0a 20 20 20 20 20  0]!='c' ){.     
4c00: 20 20 20 20 20 74 69 6d 65 6c 69 6e 65 5f 73 75       timeline_su
4c10: 62 6d 65 6e 75 28 26 75 72 6c 2c 20 22 43 68 65  bmenu(&url, "Che
4c20: 63 6b 69 6e 73 20 4f 6e 6c 79 22 2c 20 22 79 22  ckins Only", "y"
4c30: 2c 20 22 63 69 22 2c 20 30 29 3b 0a 20 20 20 20  , "ci", 0);.    
4c40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
4c50: 28 20 7a 54 79 70 65 5b 30 5d 21 3d 27 74 27 20  ( zType[0]!='t' 
4c60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 69 6d  ){.          tim
4c70: 65 6c 69 6e 65 5f 73 75 62 6d 65 6e 75 28 26 75  eline_submenu(&u
4c80: 72 6c 2c 20 22 54 69 63 6b 65 74 73 20 4f 6e 6c  rl, "Tickets Onl
4c90: 79 22 2c 20 22 79 22 2c 20 22 74 22 2c 20 30 29  y", "y", "t", 0)
4ca0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4cb0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45    }.      if( nE
4cc0: 6e 74 72 79 3e 32 30 20 29 7b 0a 20 20 20 20 20  ntry>20 ){.     
4cd0: 20 20 20 74 69 6d 65 6c 69 6e 65 5f 73 75 62 6d     timeline_subm
4ce0: 65 6e 75 28 26 75 72 6c 2c 20 22 32 30 20 45 76  enu(&url, "20 Ev
4cf0: 65 6e 74 73 22 2c 20 22 6e 22 2c 20 22 32 30 22  ents", "n", "20"
4d00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
4d10: 20 20 20 20 69 66 28 20 6e 45 6e 74 72 79 3c 32      if( nEntry<2
4d20: 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 69  00 ){.        ti
4d30: 6d 65 6c 69 6e 65 5f 73 75 62 6d 65 6e 75 28 26  meline_submenu(&
4d40: 75 72 6c 2c 20 22 32 30 30 20 45 76 65 6e 74 73  url, "200 Events
4d50: 22 2c 20 22 6e 22 2c 20 22 32 30 30 22 2c 20 30  ", "n", "200", 0
4d60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4d70: 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f  .  }.  blob_zero
4d80: 28 26 73 71 6c 29 3b 0a 20 20 64 62 5f 70 72 65  (&sql);.  db_pre
4d90: 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54  pare(&q, "SELECT
4da0: 20 2a 20 46 52 4f 4d 20 74 69 6d 65 6c 69 6e 65   * FROM timeline
4db0: 20 4f 52 44 45 52 20 42 59 20 74 69 6d 65 73 74   ORDER BY timest
4dc0: 61 6d 70 20 44 45 53 43 22 29 3b 0a 20 20 40 20  amp DESC");.  @ 
4dd0: 3c 68 32 3e 25 62 28 26 64 65 73 63 29 3c 2f 68  <h2>%b(&desc)</h
4de0: 32 3e 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  2>.  blob_reset(
4df0: 26 64 65 73 63 29 3b 0a 20 20 77 77 77 5f 70 72  &desc);.  www_pr
4e00: 69 6e 74 5f 74 69 6d 65 6c 69 6e 65 28 26 71 2c  int_timeline(&q,
4e10: 20 74 6d 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20   tmFlags, 0);.  
4e20: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
4e30: 0a 0a 20 20 40 20 3c 73 63 72 69 70 74 3e 0a 20  ..  @ <script>. 
4e40: 20 40 20 76 61 72 20 70 61 72 65 6e 74 6f 66 20   @ var parentof 
4e50: 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28 29 3b 0a  = new Object();.
4e60: 20 20 40 20 76 61 72 20 63 68 69 6c 64 6f 66 20    @ var childof 
4e70: 3d 20 6e 65 77 20 4f 62 6a 65 63 74 28 29 3b 0a  = new Object();.
4e80: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
4e90: 20 22 53 45 4c 45 43 54 20 72 69 64 20 46 52 4f   "SELECT rid FRO
4ea0: 4d 20 74 69 6d 65 6c 69 6e 65 22 29 3b 0a 20 20  M timeline");.  
4eb0: 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26  while( db_step(&
4ec0: 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  q)==SQLITE_ROW )
4ed0: 7b 0a 20 20 20 20 69 6e 74 20 72 69 64 20 3d 20  {.    int rid = 
4ee0: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71  db_column_int(&q
4ef0: 2c 20 30 29 3b 0a 20 20 20 20 53 74 6d 74 20 71  , 0);.    Stmt q
4f00: 32 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  2;.    const cha
4f10: 72 20 2a 7a 53 65 70 3b 0a 20 20 20 20 42 6c 6f  r *zSep;.    Blo
4f20: 62 20 2a 70 4f 75 74 20 3d 20 63 67 69 5f 6f 75  b *pOut = cgi_ou
4f30: 74 70 75 74 5f 62 6c 6f 62 28 29 3b 0a 0a 20 20  tput_blob();..  
4f40: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 32    db_prepare(&q2
4f50: 2c 20 22 53 45 4c 45 43 54 20 70 69 64 20 46 52  , "SELECT pid FR
4f60: 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 63  OM plink WHERE c
4f70: 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20  id=%d", rid);.  
4f80: 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20    zSep = "";.   
4f90: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 4f   blob_appendf(pO
4fa0: 75 74 2c 20 22 70 61 72 65 6e 74 6f 66 5b 5c 22  ut, "parentof[\"
4fb0: 6d 25 64 5c 22 5d 20 3d 20 5b 22 2c 20 72 69 64  m%d\"] = [", rid
4fc0: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 64 62  );.    while( db
4fd0: 5f 73 74 65 70 28 26 71 32 29 3d 3d 53 51 4c 49  _step(&q2)==SQLI
4fe0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
4ff0: 69 6e 74 20 70 69 64 20 3d 20 64 62 5f 63 6f 6c  int pid = db_col
5000: 75 6d 6e 5f 69 6e 74 28 26 71 32 2c 20 30 29 3b  umn_int(&q2, 0);
5010: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
5020: 6e 64 66 28 70 4f 75 74 2c 20 22 25 73 5c 22 6d  ndf(pOut, "%s\"m
5030: 25 64 5c 22 22 2c 20 7a 53 65 70 2c 20 70 69 64  %d\"", zSep, pid
5040: 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  );.      zSep = 
5050: 22 2c 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ",";.    }.    d
5060: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 32 29 3b  b_finalize(&q2);
5070: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  .    blob_append
5080: 66 28 70 4f 75 74 2c 20 22 5d 3b 5c 6e 22 29 3b  f(pOut, "];\n");
5090: 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28  .    db_prepare(
50a0: 26 71 32 2c 20 22 53 45 4c 45 43 54 20 63 69 64  &q2, "SELECT cid
50b0: 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52   FROM plink WHER
50c0: 45 20 70 69 64 3d 25 64 22 2c 20 72 69 64 29 3b  E pid=%d", rid);
50d0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
50e0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
50f0: 28 70 4f 75 74 2c 20 22 63 68 69 6c 64 6f 66 5b  (pOut, "childof[
5100: 5c 22 6d 25 64 5c 22 5d 20 3d 20 5b 22 2c 20 72  \"m%d\"] = [", r
5110: 69 64 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  id);.    while( 
5120: 64 62 5f 73 74 65 70 28 26 71 32 29 3d 3d 53 51  db_step(&q2)==SQ
5130: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
5140: 20 20 69 6e 74 20 70 69 64 20 3d 20 64 62 5f 63    int pid = db_c
5150: 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 32 2c 20 30  olumn_int(&q2, 0
5160: 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  );.      blob_ap
5170: 70 65 6e 64 66 28 70 4f 75 74 2c 20 22 25 73 5c  pendf(pOut, "%s\
5180: 22 6d 25 64 5c 22 22 2c 20 7a 53 65 70 2c 20 70  "m%d\"", zSep, p
5190: 69 64 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20  id);.      zSep 
51a0: 3d 20 22 2c 22 3b 0a 20 20 20 20 7d 0a 20 20 20  = ",";.    }.   
51b0: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 32   db_finalize(&q2
51c0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  );.    blob_appe
51d0: 6e 64 66 28 70 4f 75 74 2c 20 22 5d 3b 5c 6e 22  ndf(pOut, "];\n"
51e0: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61  );.  }.  db_fina
51f0: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 40 20 66 75  lize(&q);.  @ fu
5200: 6e 63 74 69 6f 6e 20 73 65 74 61 6c 6c 28 76 61  nction setall(va
5210: 6c 75 65 29 7b 0a 20 20 40 20 20 20 66 6f 72 28  lue){.  @   for(
5220: 76 61 72 20 78 20 69 6e 20 70 61 72 65 6e 74 6f  var x in parento
5230: 66 29 7b 0a 20 20 40 20 20 20 20 20 73 65 74 6f  f){.  @     seto
5240: 6e 65 28 78 2c 76 61 6c 75 65 29 3b 0a 20 20 40  ne(x,value);.  @
5250: 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20 40 20 73     }.  @ }.  @ s
5260: 65 74 61 6c 6c 28 22 23 66 66 66 66 66 66 22 29  etall("#ffffff")
5270: 3b 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e 20 73  ;.  @ function s
5280: 65 74 6f 6e 65 28 69 64 2c 20 63 6c 72 29 7b 0a  etone(id, clr){.
5290: 20 20 40 20 20 20 69 66 28 20 70 61 72 65 6e 74    @   if( parent
52a0: 6f 66 5b 69 64 5d 3d 3d 6e 75 6c 6c 20 29 20 72  of[id]==null ) r
52b0: 65 74 75 72 6e 20 30 3b 0a 20 20 40 20 20 20 76  eturn 0;.  @   v
52c0: 61 72 20 77 20 3d 20 64 6f 63 75 6d 65 6e 74 2e  ar w = document.
52d0: 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 69  getElementById(i
52e0: 64 29 3b 0a 20 20 40 20 20 20 69 66 28 20 77 2e  d);.  @   if( w.
52f0: 73 74 79 6c 65 2e 63 6f 6c 6f 72 3d 3d 63 6c 72  style.color==clr
5300: 20 29 7b 0a 20 20 40 20 20 20 20 20 72 65 74 75   ){.  @     retu
5310: 72 6e 20 30 0a 20 20 40 20 20 20 7d 65 6c 73 65  rn 0.  @   }else
5320: 7b 0a 20 20 40 20 20 20 20 20 77 2e 73 74 79 6c  {.  @     w.styl
5330: 65 2e 63 6f 6c 6f 72 20 3d 20 63 6c 72 0a 20 20  e.color = clr.  
5340: 40 20 20 20 20 20 72 65 74 75 72 6e 20 31 0a 20  @     return 1. 
5350: 20 40 20 20 20 7d 0a 20 20 40 20 7d 0a 20 20 40   @   }.  @ }.  @
5360: 20 66 75 6e 63 74 69 6f 6e 20 78 69 6e 28 69 64   function xin(id
5370: 29 20 7b 0a 20 20 40 20 20 20 73 65 74 61 6c 6c  ) {.  @   setall
5380: 28 22 23 66 66 66 66 66 66 22 29 3b 0a 20 20 40  ("#ffffff");.  @
5390: 20 20 20 73 65 74 6f 6e 65 28 69 64 2c 22 23 66     setone(id,"#f
53a0: 66 30 30 30 30 22 29 3b 0a 20 20 40 20 20 20 73  f0000");.  @   s
53b0: 65 74 5f 63 68 69 6c 64 72 65 6e 28 69 64 2c 20  et_children(id, 
53c0: 22 23 62 30 62 30 62 30 22 29 3b 0a 20 20 40 20  "#b0b0b0");.  @ 
53d0: 20 20 73 65 74 5f 70 61 72 65 6e 74 73 28 69 64    set_parents(id
53e0: 2c 20 22 23 62 30 62 30 62 30 22 29 3b 0a 20 20  , "#b0b0b0");.  
53f0: 40 20 20 20 66 6f 72 28 76 61 72 20 78 20 69 6e  @   for(var x in
5400: 20 70 61 72 65 6e 74 6f 66 5b 69 64 5d 29 7b 0a   parentof[id]){.
5410: 20 20 40 20 20 20 20 20 76 61 72 20 70 69 64 20    @     var pid 
5420: 3d 20 70 61 72 65 6e 74 6f 66 5b 69 64 5d 5b 78  = parentof[id][x
5430: 5d 0a 20 20 40 20 20 20 20 20 76 61 72 20 77 20  ].  @     var w 
5440: 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c  = document.getEl
5450: 65 6d 65 6e 74 42 79 49 64 28 70 69 64 29 3b 0a  ementById(pid);.
5460: 20 20 40 20 20 20 20 20 69 66 28 20 77 21 3d 6e    @     if( w!=n
5470: 75 6c 6c 20 29 7b 0a 20 20 40 20 20 20 20 20 20  ull ){.  @      
5480: 20 77 2e 73 74 79 6c 65 2e 63 6f 6c 6f 72 20 3d   w.style.color =
5490: 20 22 23 30 30 30 30 30 30 22 3b 0a 20 20 40 20   "#000000";.  @ 
54a0: 20 20 20 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20      }.  @   }.  
54b0: 40 20 20 20 66 6f 72 28 76 61 72 20 78 20 69 6e  @   for(var x in
54c0: 20 63 68 69 6c 64 6f 66 5b 69 64 5d 29 7b 0a 20   childof[id]){. 
54d0: 20 40 20 20 20 20 20 76 61 72 20 63 69 64 20 3d   @     var cid =
54e0: 20 63 68 69 6c 64 6f 66 5b 69 64 5d 5b 78 5d 0a   childof[id][x].
54f0: 20 20 40 20 20 20 20 20 76 61 72 20 77 20 3d 20    @     var w = 
5500: 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d  document.getElem
5510: 65 6e 74 42 79 49 64 28 63 69 64 29 3b 0a 20 20  entById(cid);.  
5520: 40 20 20 20 20 20 69 66 28 20 77 21 3d 6e 75 6c  @     if( w!=nul
5530: 6c 20 29 7b 0a 20 20 40 20 20 20 20 20 20 20 77  l ){.  @       w
5540: 2e 73 74 79 6c 65 2e 63 6f 6c 6f 72 20 3d 20 22  .style.color = "
5550: 23 30 30 30 30 30 30 22 3b 0a 20 20 40 20 20 20  #000000";.  @   
5560: 20 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40 20    }.  @   }.  @ 
5570: 7d 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e 20 78  }.  @ function x
5580: 6f 75 74 28 69 64 29 20 7b 0a 20 20 40 20 20 20  out(id) {.  @   
5590: 2f 2a 20 73 65 74 61 6c 6c 28 22 23 30 30 30 30  /* setall("#0000
55a0: 30 30 22 29 3b 20 2a 2f 0a 20 20 40 20 7d 0a 20  00"); */.  @ }. 
55b0: 20 40 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 5f   @ function set_
55c0: 70 61 72 65 6e 74 73 28 69 64 2c 20 63 6c 72 29  parents(id, clr)
55d0: 7b 0a 20 20 40 20 20 20 76 61 72 20 70 6c 69 73  {.  @   var plis
55e0: 74 20 3d 20 70 61 72 65 6e 74 6f 66 5b 69 64 5d  t = parentof[id]
55f0: 3b 0a 20 20 40 20 20 20 69 66 28 20 70 6c 69 73  ;.  @   if( plis
5600: 74 3d 3d 6e 75 6c 6c 20 29 20 72 65 74 75 72 6e  t==null ) return
5610: 3b 0a 20 20 40 20 20 20 66 6f 72 28 76 61 72 20  ;.  @   for(var 
5620: 78 20 69 6e 20 70 6c 69 73 74 29 7b 0a 20 20 40  x in plist){.  @
5630: 20 20 20 20 20 76 61 72 20 70 69 64 20 3d 20 70       var pid = p
5640: 6c 69 73 74 5b 78 5d 3b 0a 20 20 40 20 20 20 20  list[x];.  @    
5650: 20 69 66 28 20 73 65 74 6f 6e 65 28 70 69 64 2c   if( setone(pid,
5660: 63 6c 72 29 3d 3d 31 20 29 7b 0a 20 20 40 20 20  clr)==1 ){.  @  
5670: 20 20 20 20 20 73 65 74 5f 70 61 72 65 6e 74 73       set_parents
5680: 28 70 69 64 2c 63 6c 72 29 3b 0a 20 20 40 20 20  (pid,clr);.  @  
5690: 20 20 20 7d 0a 20 20 40 20 20 20 7d 0a 20 20 40     }.  @   }.  @
56a0: 20 7d 0a 20 20 40 20 66 75 6e 63 74 69 6f 6e 20   }.  @ function 
56b0: 73 65 74 5f 63 68 69 6c 64 72 65 6e 28 69 64 2c  set_children(id,
56c0: 63 6c 72 29 7b 0a 20 20 40 20 20 20 76 61 72 20  clr){.  @   var 
56d0: 63 6c 69 73 74 20 3d 20 63 68 69 6c 64 6f 66 5b  clist = childof[
56e0: 69 64 5d 3b 0a 20 20 40 20 20 20 69 66 28 20 63  id];.  @   if( c
56f0: 6c 69 73 74 3d 3d 6e 75 6c 6c 20 29 20 72 65 74  list==null ) ret
5700: 75 72 6e 3b 0a 20 20 40 20 20 20 66 6f 72 28 76  urn;.  @   for(v
5710: 61 72 20 78 20 69 6e 20 63 6c 69 73 74 29 7b 0a  ar x in clist){.
5720: 20 20 40 20 20 20 20 20 76 61 72 20 63 69 64 20    @     var cid 
5730: 3d 20 63 6c 69 73 74 5b 78 5d 3b 0a 20 20 40 20  = clist[x];.  @ 
5740: 20 20 20 20 69 66 28 20 73 65 74 6f 6e 65 28 63      if( setone(c
5750: 69 64 2c 63 6c 72 29 3d 3d 31 20 29 7b 0a 20 20  id,clr)==1 ){.  
5760: 40 20 20 20 20 20 20 20 73 65 74 5f 63 68 69 6c  @       set_chil
5770: 64 72 65 6e 28 63 69 64 2c 63 6c 72 29 3b 0a 20  dren(cid,clr);. 
5780: 20 40 20 20 20 20 20 7d 0a 20 20 40 20 20 20 7d   @     }.  @   }
5790: 0a 20 20 40 20 7d 0a 20 20 40 20 3c 2f 73 63 72  .  @ }.  @ </scr
57a0: 69 70 74 3e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f  ipt>.  style_foo
57b0: 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ter();.}../*.** 
57c0: 54 68 65 20 69 6e 70 75 74 20 71 75 65 72 79 20  The input query 
57d0: 71 20 73 65 6c 65 63 74 73 20 76 61 72 69 6f 75  q selects variou
57e0: 73 20 72 65 63 6f 72 64 73 2e 20 20 50 72 69 6e  s records.  Prin
57f0: 74 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  t a human-readab
5800: 6c 65 0a 2a 2a 20 73 75 6d 6d 61 72 79 20 6f 66  le.** summary of
5810: 20 74 68 6f 73 65 20 72 65 63 6f 72 64 73 2e 0a   those records..
5820: 2a 2a 0a 2a 2a 20 4c 69 6d 69 74 20 74 68 65 20  **.** Limit the 
5830: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
5840: 73 20 70 72 69 6e 74 65 64 20 74 6f 20 6e 4c 69  s printed to nLi
5850: 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 71  ne..** .** The q
5860: 75 65 72 79 20 73 68 6f 75 6c 64 20 72 65 74 75  uery should retu
5870: 72 6e 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  rn these columns
5880: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 2e 20 20 72  :.**.**    0.  r
5890: 69 64 0a 2a 2a 20 20 20 20 31 2e 20 20 75 75 69  id.**    1.  uui
58a0: 64 0a 2a 2a 20 20 20 20 32 2e 20 20 44 61 74 65  d.**    2.  Date
58b0: 2f 54 69 6d 65 0a 2a 2a 20 20 20 20 33 2e 20 20  /Time.**    3.  
58c0: 43 6f 6d 6d 65 6e 74 20 73 74 72 69 6e 67 20 61  Comment string a
58d0: 6e 64 20 75 73 65 72 0a 2a 2a 20 20 20 20 34 2e  nd user.**    4.
58e0: 20 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d    Number of non-
58f0: 6d 65 72 67 65 20 63 68 69 6c 64 72 65 6e 0a 2a  merge children.*
5900: 2a 20 20 20 20 35 2e 20 20 4e 75 6d 62 65 72 20  *    5.  Number 
5910: 6f 66 20 70 61 72 65 6e 74 73 0a 2a 2f 0a 76 6f  of parents.*/.vo
5920: 69 64 20 70 72 69 6e 74 5f 74 69 6d 65 6c 69 6e  id print_timelin
5930: 65 28 53 74 6d 74 20 2a 71 2c 20 69 6e 74 20 6d  e(Stmt *q, int m
5940: 78 4c 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e 4c  xLine){.  int nL
5950: 69 6e 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ine = 0;.  char 
5960: 7a 50 72 65 76 44 61 74 65 5b 32 30 5d 3b 0a 20  zPrevDate[20];. 
5970: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 75   const char *zCu
5980: 72 72 65 6e 74 55 75 69 64 3d 30 3b 0a 20 20 7a  rrentUuid=0;.  z
5990: 50 72 65 76 44 61 74 65 5b 30 5d 20 3d 20 30 3b  PrevDate[0] = 0;
59a0: 0a 0a 20 20 69 66 28 20 67 2e 6c 6f 63 61 6c 4f  ..  if( g.localO
59b0: 70 65 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  pen ){.    int r
59c0: 69 64 20 3d 20 64 62 5f 6c 67 65 74 5f 69 6e 74  id = db_lget_int
59d0: 28 22 63 68 65 63 6b 6f 75 74 22 2c 20 30 29 3b  ("checkout", 0);
59e0: 0a 20 20 20 20 7a 43 75 72 72 65 6e 74 55 75 69  .    zCurrentUui
59f0: 64 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22  d = db_text(0, "
5a00: 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d  SELECT uuid FROM
5a10: 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d   blob WHERE rid=
5a20: 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 7d 0a 0a  %d", rid);.  }..
5a30: 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70    while( db_step
5a40: 28 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  (q)==SQLITE_ROW 
5a50: 26 26 20 6e 4c 69 6e 65 3c 3d 6d 78 4c 69 6e 65  && nLine<=mxLine
5a60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 69 64 20   ){.    int rid 
5a70: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  = db_column_int(
5a80: 71 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74  q, 0);.    const
5a90: 20 63 68 61 72 20 2a 7a 49 64 20 3d 20 64 62 5f   char *zId = db_
5aa0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 71 2c 20 31  column_text(q, 1
5ab0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
5ac0: 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f  r *zDate = db_co
5ad0: 6c 75 6d 6e 5f 74 65 78 74 28 71 2c 20 32 29 3b  lumn_text(q, 2);
5ae0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5af0: 2a 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c 75 6d  *zCom = db_colum
5b00: 6e 5f 74 65 78 74 28 71 2c 20 33 29 3b 0a 20 20  n_text(q, 3);.  
5b10: 20 20 69 6e 74 20 6e 43 68 69 6c 64 20 3d 20 64    int nChild = d
5b20: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 71 2c 20  b_column_int(q, 
5b30: 34 29 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72  4);.    int nPar
5b40: 65 6e 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ent = db_column_
5b50: 69 6e 74 28 71 2c 20 35 29 3b 0a 20 20 20 20 63  int(q, 5);.    c
5b60: 68 61 72 20 2a 7a 46 72 65 65 20 3d 20 30 3b 0a  har *zFree = 0;.
5b70: 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
5b80: 20 20 20 63 68 61 72 20 7a 50 72 65 66 69 78 5b     char zPrefix[
5b90: 38 30 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a 55  80];.    char zU
5ba0: 75 69 64 5b 55 55 49 44 5f 53 49 5a 45 2b 31 5d  uid[UUID_SIZE+1]
5bb0: 3b 0a 20 20 20 20 0a 20 20 20 20 73 70 72 69 6e  ;.    .    sprin
5bc0: 74 66 28 7a 55 75 69 64 2c 20 22 25 2e 31 30 73  tf(zUuid, "%.10s
5bd0: 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 69 66 28  ", zId);.    if(
5be0: 20 6d 65 6d 63 6d 70 28 7a 44 61 74 65 2c 20 7a   memcmp(zDate, z
5bf0: 50 72 65 76 44 61 74 65 2c 20 31 30 29 20 29 7b  PrevDate, 10) ){
5c00: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 3d  .      printf("=
5c10: 3d 3d 20 25 2e 31 30 73 20 3d 3d 3d 5c 6e 22 2c  == %.10s ===\n",
5c20: 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 20 20 6d   zDate);.      m
5c30: 65 6d 63 70 79 28 7a 50 72 65 76 44 61 74 65 2c  emcpy(zPrevDate,
5c40: 20 7a 44 61 74 65 2c 20 31 30 29 3b 0a 20 20 20   zDate, 10);.   
5c50: 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20     nLine++;.    
5c60: 7d 0a 20 20 20 20 69 66 28 20 7a 43 6f 6d 3d 3d  }.    if( zCom==
5c70: 30 20 29 20 7a 43 6f 6d 20 3d 20 22 22 3b 0a 20  0 ) zCom = "";. 
5c80: 20 20 20 70 72 69 6e 74 66 28 22 25 2e 38 73 20     printf("%.8s 
5c90: 22 2c 20 26 7a 44 61 74 65 5b 31 31 5d 29 3b 0a  ", &zDate[11]);.
5ca0: 20 20 20 20 7a 50 72 65 66 69 78 5b 30 5d 20 3d      zPrefix[0] =
5cb0: 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 72   0;.    if( nPar
5cc0: 65 6e 74 3e 31 20 29 7b 0a 20 20 20 20 20 20 73  ent>1 ){.      s
5cd0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
5ce0: 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c  sizeof(zPrefix),
5cf0: 20 7a 50 72 65 66 69 78 2c 20 22 2a 4d 45 52 47   zPrefix, "*MERG
5d00: 45 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e 20 3d  E* ");.      n =
5d10: 20 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78 29   strlen(zPrefix)
5d20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5d30: 6e 43 68 69 6c 64 3e 31 20 29 7b 0a 20 20 20 20  nChild>1 ){.    
5d40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
5d50: 72 54 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28  rType;.      if(
5d60: 20 63 6f 75 6e 74 5f 6e 6f 6e 62 72 61 6e 63 68   count_nonbranch
5d70: 5f 63 68 69 6c 64 72 65 6e 28 72 69 64 29 3e 31  _children(rid)>1
5d80: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 72 54   ){.        zBrT
5d90: 79 70 65 20 3d 20 22 2a 46 4f 52 4b 2a 20 22 3b  ype = "*FORK* ";
5da0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5db0: 20 20 20 20 20 20 7a 42 72 54 79 70 65 20 3d 20        zBrType = 
5dc0: 22 2a 42 52 41 4e 43 48 2a 20 22 3b 0a 20 20 20  "*BRANCH* ";.   
5dd0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
5de0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
5df0: 6f 66 28 7a 50 72 65 66 69 78 29 2d 6e 2c 20 26  of(zPrefix)-n, &
5e00: 7a 50 72 65 66 69 78 5b 6e 5d 2c 20 7a 42 72 54  zPrefix[n], zBrT
5e10: 79 70 65 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  ype);.      n = 
5e20: 73 74 72 6c 65 6e 28 7a 50 72 65 66 69 78 29 3b  strlen(zPrefix);
5e30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
5e40: 43 75 72 72 65 6e 74 55 75 69 64 20 26 26 20 73  CurrentUuid && s
5e50: 74 72 63 6d 70 28 7a 43 75 72 72 65 6e 74 55 75  trcmp(zCurrentUu
5e60: 69 64 2c 7a 49 64 29 3d 3d 30 20 29 7b 0a 20 20  id,zId)==0 ){.  
5e70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5e80: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65  intf(sizeof(zPre
5e90: 66 69 78 29 2d 6e 2c 20 26 7a 50 72 65 66 69 78  fix)-n, &zPrefix
5ea0: 5b 6e 5d 2c 20 22 2a 43 55 52 52 45 4e 54 2a 20  [n], "*CURRENT* 
5eb0: 22 29 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 73  ");.      n += s
5ec0: 74 72 6c 65 6e 28 7a 50 72 65 66 69 78 29 3b 0a  trlen(zPrefix);.
5ed0: 20 20 20 20 7d 0a 20 20 20 20 7a 46 72 65 65 20      }.    zFree 
5ee0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5ef0: 66 28 22 5b 25 2e 31 30 73 5d 20 25 73 25 73 22  f("[%.10s] %s%s"
5f00: 2c 20 7a 55 75 69 64 2c 20 7a 50 72 65 66 69 78  , zUuid, zPrefix
5f10: 2c 20 7a 43 6f 6d 29 3b 0a 20 20 20 20 6e 4c 69  , zCom);.    nLi
5f20: 6e 65 20 2b 3d 20 63 6f 6d 6d 65 6e 74 5f 70 72  ne += comment_pr
5f30: 69 6e 74 28 7a 46 72 65 65 2c 20 39 2c 20 37 39  int(zFree, 9, 79
5f40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
5f50: 72 65 65 28 7a 46 72 65 65 29 3b 0a 20 20 7d 0a  ree(zFree);.  }.
5f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5f70: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
5f80: 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61  tatic string tha
5f90: 74 20 66 6f 72 6d 73 20 74 68 65 20 62 61 73 69  t forms the basi
5fa0: 73 20 66 6f 72 0a 2a 2a 20 61 20 74 69 6d 65 6c  s for.** a timel
5fb0: 69 6e 65 20 71 75 65 72 79 20 66 6f 72 20 64 69  ine query for di
5fc0: 73 70 6c 61 79 20 6f 6e 20 61 20 54 54 59 2e 0a  splay on a TTY..
5fd0: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 74  */.const char *t
5fe0: 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f  imeline_query_fo
5ff0: 72 5f 74 74 79 28 76 6f 69 64 29 7b 0a 20 20 73  r_tty(void){.  s
6000: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6010: 20 7a 42 61 73 65 53 71 6c 5b 5d 20 3d 20 0a 20   zBaseSql[] = . 
6020: 20 20 20 40 20 53 45 4c 45 43 54 0a 20 20 20 20     @ SELECT.    
6030: 40 20 20 20 62 6c 6f 62 2e 72 69 64 2c 0a 20 20  @   blob.rid,.  
6040: 20 20 40 20 20 20 75 75 69 64 2c 0a 20 20 20 20    @   uuid,.    
6050: 40 20 20 20 64 61 74 65 74 69 6d 65 28 65 76 65  @   datetime(eve
6060: 6e 74 2e 6d 74 69 6d 65 2c 27 6c 6f 63 61 6c 74  nt.mtime,'localt
6070: 69 6d 65 27 29 2c 0a 20 20 20 20 40 20 20 20 63  ime'),.    @   c
6080: 6f 61 6c 65 73 63 65 28 65 63 6f 6d 6d 65 6e 74  oalesce(ecomment
6090: 2c 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 40 20  ,comment).    @ 
60a0: 20 20 20 20 7c 7c 20 27 20 28 75 73 65 72 3a 20      || ' (user: 
60b0: 27 20 7c 7c 20 63 6f 61 6c 65 73 63 65 28 65 75  ' || coalesce(eu
60c0: 73 65 72 2c 75 73 65 72 2c 27 3f 27 29 0a 20 20  ser,user,'?').  
60d0: 20 20 40 20 20 20 20 20 7c 7c 20 28 53 45 4c 45    @     || (SELE
60e0: 43 54 20 63 61 73 65 20 77 68 65 6e 20 6c 65 6e  CT case when len
60f0: 67 74 68 28 78 29 3e 30 20 74 68 65 6e 20 27 20  gth(x)>0 then ' 
6100: 74 61 67 73 3a 20 27 20 7c 7c 20 78 20 65 6c 73  tags: ' || x els
6110: 65 20 27 27 20 65 6e 64 0a 20 20 20 20 40 20 20  e '' end.    @  
6120: 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 28 53           FROM (S
6130: 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63  ELECT group_conc
6140: 61 74 28 73 75 62 73 74 72 28 74 61 67 6e 61 6d  at(substr(tagnam
6150: 65 2c 35 29 2c 20 27 2c 20 27 29 20 41 53 20 78  e,5), ', ') AS x
6160: 0a 20 20 20 20 40 20 20 20 20 20 20 20 20 20 20  .    @          
6170: 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 74 61           FROM ta
6180: 67 2c 20 74 61 67 78 72 65 66 0a 20 20 20 20 40  g, tagxref.    @
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 20 20 57 48 45 52 45 20 74 61 67 6e 61 6d 65 20    WHERE tagname 
61b0: 47 4c 4f 42 20 27 73 79 6d 2d 2a 27 20 41 4e 44  GLOB 'sym-*' AND
61c0: 20 74 61 67 2e 74 61 67 69 64 3d 74 61 67 78 72   tag.tagid=tagxr
61d0: 65 66 2e 74 61 67 69 64 0a 20 20 20 20 40 20 20  ef.tagid.    @  
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61f0: 20 20 41 4e 44 20 74 61 67 78 72 65 66 2e 72 69    AND tagxref.ri
6200: 64 3d 62 6c 6f 62 2e 72 69 64 20 41 4e 44 20 74  d=blob.rid AND t
6210: 61 67 78 72 65 66 2e 74 61 67 74 79 70 65 3e 30  agxref.tagtype>0
6220: 29 29 0a 20 20 20 20 40 20 20 20 20 20 7c 7c 20  )).    @     || 
6230: 27 29 27 2c 0a 20 20 20 20 40 20 20 20 28 53 45  ')',.    @   (SE
6240: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
6250: 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70  OM plink WHERE p
6260: 69 64 3d 62 6c 6f 62 2e 72 69 64 20 41 4e 44 20  id=blob.rid AND 
6270: 69 73 70 72 69 6d 29 2c 0a 20 20 20 20 40 20 20  isprim),.    @  
6280: 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
6290: 29 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45  ) FROM plink WHE
62a0: 52 45 20 63 69 64 3d 62 6c 6f 62 2e 72 69 64 29  RE cid=blob.rid)
62b0: 0a 20 20 20 20 40 20 46 52 4f 4d 20 65 76 65 6e  .    @ FROM even
62c0: 74 2c 20 62 6c 6f 62 0a 20 20 20 20 40 20 57 48  t, blob.    @ WH
62d0: 45 52 45 20 62 6c 6f 62 2e 72 69 64 3d 65 76 65  ERE blob.rid=eve
62e0: 6e 74 2e 6f 62 6a 69 64 0a 20 20 3b 0a 20 20 72  nt.objid.  ;.  r
62f0: 65 74 75 72 6e 20 7a 42 61 73 65 53 71 6c 3b 0a  eturn zBaseSql;.
6300: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 71 75 69 76 61 6c  }../*.** Equival
6310: 65 6e 74 20 74 6f 20 74 69 6d 65 6c 69 6e 65 5f  ent to timeline_
6320: 71 75 65 72 79 5f 66 6f 72 5f 74 74 79 28 29 2c  query_for_tty(),
6330: 20 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a   except that:.**
6340: 0a 2a 2a 20 61 29 20 61 63 63 65 70 74 73 20 61  .** a) accepts a
6350: 20 74 68 65 20 2d 74 79 70 65 3d 58 58 20 66 6c   the -type=XX fl
6360: 61 67 20 74 6f 20 73 65 74 20 74 68 65 20 65 76  ag to set the ev
6370: 65 6e 74 20 74 79 70 65 20 74 6f 20 66 69 6c 74  ent type to filt
6380: 65 72 20 6f 6e 2e 0a 2a 2a 20 20 20 20 54 68 65  er on..**    The
6390: 20 76 61 6c 75 65 73 20 6f 66 20 58 58 20 61 72   values of XX ar
63a0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 75  e the same as su
63b0: 70 70 6f 72 74 65 64 20 62 79 20 74 68 65 20 2f  pported by the /
63c0: 74 69 6d 65 6c 69 6e 65 20 70 61 67 65 2e 0a 2a  timeline page..*
63d0: 2a 0a 2a 2a 20 62 29 20 54 68 65 20 72 65 74 75  *.** b) The retu
63e0: 72 6e 65 64 20 73 74 72 69 6e 67 20 6d 75 73 74  rned string must
63f0: 20 62 65 20 66 72 65 65 64 20 75 73 69 6e 67 20   be freed using 
6400: 66 72 65 65 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  free()..*/.char 
6410: 2a 20 74 69 6d 65 6c 69 6e 65 5f 71 75 65 72 79  * timeline_query
6420: 5f 66 6f 72 5f 74 74 79 5f 6d 28 76 6f 69 64 29  _for_tty_m(void)
6430: 7b 0a 20 20 42 6c 6f 62 20 62 6c 3b 0a 20 20 63  {.  Blob bl;.  c
6440: 68 61 72 20 63 6f 6e 73 74 20 2a 20 7a 54 79 70  har const * zTyp
6450: 65 20 3d 20 30 3b 0a 20 20 62 6c 6f 62 5f 7a 65  e = 0;.  blob_ze
6460: 72 6f 28 26 62 6c 29 3b 0a 20 20 62 6c 6f 62 5f  ro(&bl);.  blob_
6470: 61 70 70 65 6e 64 28 20 26 62 6c 2c 20 74 69 6d  append( &bl, tim
6480: 65 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72 5f  eline_query_for_
6490: 74 74 79 28 29 2c 20 2d 31 20 29 3b 0a 20 20 7a  tty(), -1 );.  z
64a0: 54 79 70 65 20 3d 20 66 69 6e 64 5f 6f 70 74 69  Type = find_opti
64b0: 6f 6e 28 20 22 74 79 70 65 22 2c 20 22 74 22 2c  on( "type", "t",
64c0: 20 31 20 29 3b 0a 20 20 69 66 28 20 7a 54 79 70   1 );.  if( zTyp
64d0: 65 20 26 26 20 2a 7a 54 79 70 65 20 29 0a 20 20  e && *zType ).  
64e0: 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  {.      blob_app
64f0: 65 6e 64 66 28 20 26 62 6c 2c 20 22 20 41 4e 44  endf( &bl, " AND
6500: 20 65 76 65 6e 74 2e 74 79 70 65 3d 25 51 22 2c   event.type=%Q",
6510: 20 7a 54 79 70 65 20 29 3b 0a 20 20 7d 0a 20 20   zType );.  }.  
6520: 72 65 74 75 72 6e 20 62 6c 6f 62 5f 62 75 66 66  return blob_buff
6530: 65 72 28 26 62 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  er(&bl);.}../*.*
6540: 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 69 6d 65 6c  * COMMAND: timel
6550: 69 6e 65 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  ine.**.** Usage:
6560: 20 25 66 6f 73 73 69 6c 20 74 69 6d 65 6c 69 6e   %fossil timelin
6570: 65 20 3f 57 48 45 4e 3f 20 3f 42 41 53 45 4c 49  e ?WHEN? ?BASELI
6580: 4e 45 7c 44 41 54 45 54 49 4d 45 3f 20 3f 2d 6e  NE|DATETIME? ?-n
6590: 7c 2d 2d 63 6f 75 6e 74 20 4e 3f 20 3f 2d 74 7c  |--count N? ?-t|
65a0: 2d 2d 74 79 70 65 20 54 59 50 45 3f 0a 2a 2a 0a  --type TYPE?.**.
65b0: 2a 2a 20 50 72 69 6e 74 20 61 20 73 75 6d 6d 61  ** Print a summa
65c0: 72 79 20 6f 66 20 61 63 74 69 76 69 74 79 20 67  ry of activity g
65d0: 6f 69 6e 67 20 62 61 63 6b 77 61 72 64 73 20 69  oing backwards i
65e0: 6e 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65 0a  n date and time.
65f0: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6f 72 20  ** specified or 
6600: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
6610: 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65 20 69   date and time i
6620: 66 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 0a 2a  f no arguments.*
6630: 2a 20 61 72 65 20 67 69 76 65 6e 2e 20 20 53 68  * are given.  Sh
6640: 6f 77 20 61 73 20 6d 61 6e 79 20 61 73 20 4e 20  ow as many as N 
6650: 28 64 65 66 61 75 6c 74 20 32 30 29 20 63 68 65  (default 20) che
6660: 63 6b 2d 69 6e 73 2e 20 20 54 68 65 0a 2a 2a 20  ck-ins.  The.** 
6670: 57 48 45 4e 20 61 72 67 75 6d 65 6e 74 20 63 61  WHEN argument ca
6680: 6e 20 62 65 20 61 6e 79 20 75 6e 69 71 75 65 20  n be any unique 
6690: 61 62 62 72 65 76 69 61 74 69 6f 6e 20 6f 66 20  abbreviation of 
66a0: 6f 6e 65 20 6f 66 20 74 68 65 73 65 0a 2a 2a 20  one of these.** 
66b0: 6b 65 79 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  keywords:.**.** 
66c0: 20 20 20 20 62 65 66 6f 72 65 0a 2a 2a 20 20 20      before.**   
66d0: 20 20 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 64    after.**     d
66e0: 65 73 63 65 6e 64 61 6e 74 73 20 7c 20 63 68 69  escendants | chi
66f0: 6c 64 72 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 63  ldren.**     anc
6700: 65 73 74 6f 72 73 20 7c 20 70 61 72 65 6e 74 73  estors | parents
6710: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 41 53 45 4c  .**.** The BASEL
6720: 49 4e 45 20 63 61 6e 20 62 65 20 61 6e 79 20 75  INE can be any u
6730: 6e 69 71 75 65 20 70 72 65 66 69 78 20 6f 66 20  nique prefix of 
6740: 34 20 63 68 61 72 61 63 74 65 72 73 20 6f 72 20  4 characters or 
6750: 6d 6f 72 65 2e 0a 2a 2a 20 54 68 65 20 44 41 54  more..** The DAT
6760: 45 54 49 4d 45 20 73 68 6f 75 6c 64 20 62 65 20  ETIME should be 
6770: 69 6e 20 74 68 65 20 49 53 4f 38 36 30 31 20 66  in the ISO8601 f
6780: 6f 72 6d 61 74 2e 20 20 46 6f 72 0a 2a 2a 20 65  ormat.  For.** e
6790: 78 61 6d 70 6c 65 73 3a 20 22 32 30 30 37 2d 30  xamples: "2007-0
67a0: 38 2d 31 38 20 30 37 3a 32 31 3a 32 31 22 2e 20  8-18 07:21:21". 
67b0: 20 59 6f 75 20 63 61 6e 20 61 6c 73 6f 20 73 61   You can also sa
67c0: 79 20 22 63 75 72 72 65 6e 74 22 0a 2a 2a 20 66  y "current".** f
67d0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  or the current v
67e0: 65 72 73 69 6f 6e 20 6f 72 20 22 6e 6f 77 22 20  ersion or "now" 
67f0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
6800: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  time..**.** The 
6810: 6f 70 74 69 6f 6e 61 6c 20 54 59 50 45 20 61 72  optional TYPE ar
6820: 67 75 6d 65 6e 74 20 6d 61 79 20 61 6e 79 20 74  gument may any t
6830: 79 70 65 73 20 73 75 70 70 6f 72 74 65 64 20 62  ypes supported b
6840: 79 20 74 68 65 20 2f 74 69 6d 65 6c 69 6e 65 0a  y the /timeline.
6850: 2a 2a 20 70 61 67 65 2e 20 46 6f 72 20 65 78 61  ** page. For exa
6860: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
6870: 77 20 20 3d 20 77 69 6b 69 20 63 6f 6d 6d 69 74  w  = wiki commit
6880: 73 20 6f 6e 6c 79 0a 2a 2a 20 20 20 20 20 63 69  s only.**     ci
6890: 20 3d 20 66 69 6c 65 20 63 6f 6d 6d 69 74 73 20   = file commits 
68a0: 6f 6e 6c 79 0a 2a 2a 20 20 20 20 20 74 20 20 3d  only.**     t  =
68b0: 20 74 69 63 6b 65 74 73 20 6f 6e 6c 79 0a 2a 2f   tickets only.*/
68c0: 0a 76 6f 69 64 20 74 69 6d 65 6c 69 6e 65 5f 63  .void timeline_c
68d0: 6d 64 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74  md(void){.  Stmt
68e0: 20 71 3b 0a 20 20 69 6e 74 20 6e 2c 20 6b 3b 0a   q;.  int n, k;.
68f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
6900: 6f 75 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ount;.  const ch
6910: 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63 68 61  ar *zType;.  cha
6920: 72 20 2a 7a 4f 72 69 67 69 6e 3b 0a 20 20 63 68  r *zOrigin;.  ch
6930: 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 63 68 61  ar *zDate;.  cha
6940: 72 20 2a 7a 53 51 4c 3b 0a 20 20 69 6e 74 20 6f  r *zSQL;.  int o
6950: 62 6a 69 64 20 3d 20 30 3b 0a 20 20 42 6c 6f 62  bjid = 0;.  Blob
6960: 20 75 75 69 64 3b 0a 20 20 69 6e 74 20 6d 6f 64   uuid;.  int mod
6970: 65 20 3d 20 31 20 3b 20 20 20 20 20 20 20 2f 2a  e = 1 ;       /*
6980: 20 31 3a 20 62 65 66 6f 72 65 20 20 32 3a 61 66   1: before  2:af
6990: 74 65 72 20 20 33 3a 63 68 69 6c 64 72 65 6e 20  ter  3:children 
69a0: 20 34 3a 70 61 72 65 6e 74 73 20 2a 2f 0a 20 20   4:parents */.  
69b0: 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 6e  db_find_and_open
69c0: 5f 72 65 70 6f 73 69 74 6f 72 79 28 31 29 3b 0a  _repository(1);.
69d0: 20 20 7a 43 6f 75 6e 74 20 3d 20 66 69 6e 64 5f    zCount = find_
69e0: 6f 70 74 69 6f 6e 28 22 63 6f 75 6e 74 22 2c 22  option("count","
69f0: 6e 22 2c 31 29 3b 0a 20 20 7a 54 79 70 65 20 3d  n",1);.  zType =
6a00: 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 74 79   find_option("ty
6a10: 70 65 22 2c 22 74 22 2c 31 29 3b 0a 20 20 69 66  pe","t",1);.  if
6a20: 28 20 7a 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ( zCount ){.    
6a30: 6e 20 3d 20 61 74 6f 69 28 7a 43 6f 75 6e 74 29  n = atoi(zCount)
6a40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
6a50: 20 3d 20 32 30 3b 0a 20 20 7d 0a 20 20 69 66 28   = 20;.  }.  if(
6a60: 20 67 2e 61 72 67 63 3e 3d 34 20 29 7b 0a 20 20   g.argc>=4 ){.  
6a70: 20 20 6b 20 3d 20 73 74 72 6c 65 6e 28 67 2e 61    k = strlen(g.a
6a80: 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[2]);.    if(
6a90: 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76 5b   strncmp(g.argv[
6aa0: 32 5d 2c 22 62 65 66 6f 72 65 22 2c 6b 29 3d 3d  2],"before",k)==
6ab0: 30 20 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20  0 ){.      mode 
6ac0: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
6ad0: 66 28 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67  f( strncmp(g.arg
6ae0: 76 5b 32 5d 2c 22 61 66 74 65 72 22 2c 6b 29 3d  v[2],"after",k)=
6af0: 3d 30 20 26 26 20 6b 3e 31 20 29 7b 0a 20 20 20  =0 && k>1 ){.   
6b00: 20 20 20 6d 6f 64 65 20 3d 20 32 3b 0a 20 20 20     mode = 2;.   
6b10: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
6b20: 6d 70 28 67 2e 61 72 67 76 5b 32 5d 2c 22 64 65  mp(g.argv[2],"de
6b30: 73 63 65 6e 64 61 6e 74 73 22 2c 6b 29 3d 3d 30  scendants",k)==0
6b40: 20 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d   ){.      mode =
6b50: 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   3;.    }else if
6b60: 28 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76  ( strncmp(g.argv
6b70: 5b 32 5d 2c 22 63 68 69 6c 64 72 65 6e 22 2c 6b  [2],"children",k
6b80: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 6f  )==0 ){.      mo
6b90: 64 65 20 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73  de = 3;.    }els
6ba0: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 67 2e  e if( strncmp(g.
6bb0: 61 72 67 76 5b 32 5d 2c 22 61 6e 63 65 73 74 6f  argv[2],"ancesto
6bc0: 72 73 22 2c 6b 29 3d 3d 30 20 26 26 20 6b 3e 31  rs",k)==0 && k>1
6bd0: 20 29 7b 0a 20 20 20 20 20 20 6d 6f 64 65 20 3d   ){.      mode =
6be0: 20 34 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   4;.    }else if
6bf0: 28 20 73 74 72 6e 63 6d 70 28 67 2e 61 72 67 76  ( strncmp(g.argv
6c00: 5b 32 5d 2c 22 70 61 72 65 6e 74 73 22 2c 6b 29  [2],"parents",k)
6c10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 6f 64  ==0 ){.      mod
6c20: 65 20 3d 20 34 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 4;.    }else
6c30: 20 69 66 28 21 7a 54 79 70 65 20 26 26 20 21 7a   if(!zType && !z
6c40: 43 6f 75 6e 74 29 7b 0a 20 20 20 20 20 20 75 73  Count){.      us
6c50: 61 67 65 28 22 3f 57 48 45 4e 3f 20 3f 42 41 53  age("?WHEN? ?BAS
6c60: 45 4c 49 4e 45 7c 44 41 54 45 54 49 4d 45 3f 20  ELINE|DATETIME? 
6c70: 3f 2d 6e 7c 2d 2d 63 6f 75 6e 74 20 4e 3f 20 3f  ?-n|--count N? ?
6c80: 2d 74 20 54 59 50 45 3f 22 29 3b 0a 20 20 20 20  -t TYPE?");.    
6c90: 7d 0a 20 20 20 20 69 66 28 20 27 2d 27 20 21 3d  }.    if( '-' !=
6ca0: 20 2a 67 2e 61 72 67 76 5b 33 5d 20 29 7b 0a 09   *g.argv[3] ){..
6cb0: 7a 4f 72 69 67 69 6e 20 3d 20 67 2e 61 72 67 76  zOrigin = g.argv
6cc0: 5b 33 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [3];.    }else{.
6cd0: 09 7a 4f 72 69 67 69 6e 20 3d 20 22 6e 6f 77 22  .zOrigin = "now"
6ce0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
6cf0: 69 66 28 20 67 2e 61 72 67 63 3d 3d 33 20 29 7b  if( g.argc==3 ){
6d00: 0a 20 20 20 20 7a 4f 72 69 67 69 6e 20 3d 20 67  .    zOrigin = g
6d10: 2e 61 72 67 76 5b 32 5d 3b 0a 20 20 7d 65 6c 73  .argv[2];.  }els
6d20: 65 7b 0a 20 20 20 20 7a 4f 72 69 67 69 6e 20 3d  e{.    zOrigin =
6d30: 20 22 6e 6f 77 22 3b 0a 20 20 7d 0a 20 20 6b 20   "now";.  }.  k 
6d40: 3d 20 73 74 72 6c 65 6e 28 7a 4f 72 69 67 69 6e  = strlen(zOrigin
6d50: 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26  );.  blob_zero(&
6d60: 75 75 69 64 29 3b 0a 20 20 62 6c 6f 62 5f 61 70  uuid);.  blob_ap
6d70: 70 65 6e 64 28 26 75 75 69 64 2c 20 7a 4f 72 69  pend(&uuid, zOri
6d80: 67 69 6e 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20  gin, -1);.  if( 
6d90: 73 74 72 63 6d 70 28 7a 4f 72 69 67 69 6e 2c 20  strcmp(zOrigin, 
6da0: 22 6e 6f 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "now")==0 ){.   
6db0: 20 69 66 28 20 6d 6f 64 65 3d 3d 33 20 7c 7c 20   if( mode==3 || 
6dc0: 6d 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20  mode==4 ){.     
6dd0: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 63   fossil_fatal("c
6de0: 61 6e 6e 6f 74 20 63 6f 6d 70 75 74 65 20 64 65  annot compute de
6df0: 73 63 65 6e 64 61 6e 74 73 20 6f 72 20 61 6e 63  scendants or anc
6e00: 65 73 74 6f 72 73 20 6f 66 20 61 20 64 61 74 65  estors of a date
6e10: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 44  ");.    }.    zD
6e20: 61 74 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 28  ate = mprintf("(
6e30: 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28  SELECT datetime(
6e40: 27 6e 6f 77 27 29 29 22 29 3b 0a 20 20 7d 65 6c  'now'))");.  }el
6e50: 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
6e60: 4f 72 69 67 69 6e 2c 20 22 63 75 72 72 65 6e 74  Origin, "current
6e70: 22 2c 20 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", k)==0 ){.    
6e80: 69 66 28 20 21 67 2e 6c 6f 63 61 6c 4f 70 65 6e  if( !g.localOpen
6e90: 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c   ){.      fossil
6ea0: 5f 66 61 74 61 6c 28 22 6d 75 73 74 20 62 65 20  _fatal("must be 
6eb0: 77 69 74 68 69 6e 20 61 20 6c 6f 63 61 6c 20 63  within a local c
6ec0: 68 65 63 6b 6f 75 74 20 74 6f 20 75 73 65 20 27  heckout to use '
6ed0: 63 75 72 72 65 6e 74 27 22 29 3b 0a 20 20 20 20  current'");.    
6ee0: 7d 0a 20 20 20 20 6f 62 6a 69 64 20 3d 20 64 62  }.    objid = db
6ef0: 5f 6c 67 65 74 5f 69 6e 74 28 22 63 68 65 63 6b  _lget_int("check
6f00: 6f 75 74 22 2c 30 29 3b 0a 20 20 20 20 7a 44 61  out",0);.    zDa
6f10: 74 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 28 53  te = mprintf("(S
6f20: 45 4c 45 43 54 20 6d 74 69 6d 65 20 46 52 4f 4d  ELECT mtime FROM
6f30: 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 63 69 64   plink WHERE cid
6f40: 3d 25 64 29 22 2c 20 6f 62 6a 69 64 29 3b 0a 20  =%d)", objid);. 
6f50: 20 7d 65 6c 73 65 20 69 66 28 20 6e 61 6d 65 5f   }else if( name_
6f60: 74 6f 5f 75 75 69 64 28 26 75 75 69 64 2c 20 30  to_uuid(&uuid, 0
6f70: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 62 6a 69  )==0 ){.    obji
6f80: 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53  d = db_int(0, "S
6f90: 45 4c 45 43 54 20 72 69 64 20 46 52 4f 4d 20 62  ELECT rid FROM b
6fa0: 6c 6f 62 20 57 48 45 52 45 20 75 75 69 64 3d 25  lob WHERE uuid=%
6fb0: 42 22 2c 20 26 75 75 69 64 29 3b 0a 20 20 20 20  B", &uuid);.    
6fc0: 7a 44 61 74 65 20 3d 20 6d 70 72 69 6e 74 66 28  zDate = mprintf(
6fd0: 22 28 53 45 4c 45 43 54 20 6d 74 69 6d 65 20 46  "(SELECT mtime F
6fe0: 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20  ROM plink WHERE 
6ff0: 63 69 64 3d 25 64 29 22 2c 20 6f 62 6a 69 64 29  cid=%d)", objid)
7000: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
7010: 66 28 20 6d 6f 64 65 3d 3d 33 20 7c 7c 20 6d 6f  f( mode==3 || mo
7020: 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 66  de==4 ){.      f
7030: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 63 61 6e  ossil_fatal("can
7040: 6e 6f 74 20 63 6f 6d 70 75 74 65 20 64 65 73 63  not compute desc
7050: 65 6e 64 61 6e 74 73 20 6f 72 20 61 6e 63 65 73  endants or ances
7060: 74 6f 72 73 20 6f 66 20 61 20 64 61 74 65 22 29  tors of a date")
7070: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 44 61 74  ;.    }.    zDat
7080: 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 28 53 45  e = mprintf("(SE
7090: 4c 45 43 54 20 6a 75 6c 69 61 6e 64 61 79 28 25  LECT julianday(%
70a0: 51 2c 20 27 75 74 63 27 29 29 22 2c 20 7a 4f 72  Q, 'utc'))", zOr
70b0: 69 67 69 6e 29 3b 0a 20 20 7d 0a 20 20 7a 53 51  igin);.  }.  zSQ
70c0: 4c 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 7a 20  L = mprintf("%z 
70d0: 41 4e 44 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20  AND event.mtime 
70e0: 25 73 20 25 73 22 2c 0a 20 20 20 20 20 74 69 6d  %s %s",.     tim
70f0: 65 6c 69 6e 65 5f 71 75 65 72 79 5f 66 6f 72 5f  eline_query_for_
7100: 74 74 79 5f 6d 28 29 2c 0a 20 20 20 20 20 28 6d  tty_m(),.     (m
7110: 6f 64 65 3d 3d 31 20 7c 7c 20 6d 6f 64 65 3d 3d  ode==1 || mode==
7120: 34 29 20 3f 20 22 3c 3d 22 20 3a 20 22 3e 3d 22  4) ? "<=" : ">="
7130: 2c 0a 20 20 20 20 20 7a 44 61 74 65 0a 20 20 29  ,.     zDate.  )
7140: 3b 0a 20 20 69 66 28 20 6d 6f 64 65 3d 3d 33 20  ;.  if( mode==3 
7150: 7c 7c 20 6d 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  || mode==4 ){.  
7160: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
7170: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
7180: 4c 45 20 6f 6b 28 72 69 64 20 49 4e 54 45 47 45  LE ok(rid INTEGE
7190: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 29 22 29  R PRIMARY KEY)")
71a0: 3b 0a 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d  ;.    if( mode==
71b0: 33 20 29 7b 0a 20 20 20 20 20 20 63 6f 6d 70 75  3 ){.      compu
71c0: 74 65 5f 64 65 73 63 65 6e 64 61 6e 74 73 28 6f  te_descendants(o
71d0: 62 6a 69 64 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  bjid, n);.    }e
71e0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6d 70 75  lse{.      compu
71f0: 74 65 5f 61 6e 63 65 73 74 6f 72 73 28 6f 62 6a  te_ancestors(obj
7200: 69 64 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  id, n);.    }.  
7210: 20 20 7a 53 51 4c 20 3d 20 6d 70 72 69 6e 74 66    zSQL = mprintf
7220: 28 22 25 7a 20 41 4e 44 20 62 6c 6f 62 2e 72 69  ("%z AND blob.ri
7230: 64 20 49 4e 20 6f 6b 22 2c 20 7a 53 51 4c 29 3b  d IN ok", zSQL);
7240: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70 65  .  }.  if( zType
7250: 20 26 26 20 28 7a 54 79 70 65 5b 30 5d 21 3d 27   && (zType[0]!='
7260: 61 27 29 20 29 7b 0a 20 20 20 20 20 20 7a 53 51  a') ){.      zSQ
7270: 4c 20 3d 20 6d 70 72 69 6e 74 66 28 20 22 25 7a  L = mprintf( "%z
7280: 20 41 4e 44 20 65 76 65 6e 74 2e 74 79 70 65 3d   AND event.type=
7290: 25 51 20 22 2c 20 7a 53 51 4c 2c 20 7a 54 79 70  %Q ", zSQL, zTyp
72a0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 7a 53 51 4c 20  e);.  }..  zSQL 
72b0: 3d 20 6d 70 72 69 6e 74 66 28 22 25 7a 20 4f 52  = mprintf("%z OR
72c0: 44 45 52 20 42 59 20 65 76 65 6e 74 2e 6d 74 69  DER BY event.mti
72d0: 6d 65 20 44 45 53 43 22 2c 20 7a 53 51 4c 29 3b  me DESC", zSQL);
72e0: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71  .  db_prepare(&q
72f0: 2c 20 7a 53 51 4c 29 3b 0a 20 20 66 72 65 65 28  , zSQL);.  free(
7300: 20 7a 53 51 4c 20 29 3b 0a 20 20 70 72 69 6e 74   zSQL );.  print
7310: 5f 74 69 6d 65 6c 69 6e 65 28 26 71 2c 20 6e 29  _timeline(&q, n)
7320: 3b 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  ;.  db_finalize(
7330: 26 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  &q);.}../*.** Th
7340: 69 73 20 69 73 20 61 20 76 65 72 73 69 6f 6e 20  is is a version 
7350: 6f 66 20 74 68 65 20 22 6c 6f 63 61 6c 74 69 6d  of the "localtim
7360: 65 28 29 22 20 66 75 6e 63 74 69 6f 6e 20 66 72  e()" function fr
7370: 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 0a  om the standard.
7380: 2a 2a 20 43 20 6c 69 62 72 61 72 79 2e 20 20 49  ** C library.  I
7390: 74 20 63 6f 6e 76 65 72 74 73 20 61 20 75 6e 69  t converts a uni
73a0: 78 20 74 69 6d 65 73 74 61 6d 70 20 28 73 65 63  x timestamp (sec
73b0: 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 29  onds since 1970)
73c0: 20 69 6e 74 6f 0a 2a 2a 20 61 20 62 72 6f 6b 65   into.** a broke
73d0: 6e 2d 6f 75 74 20 6c 6f 63 61 6c 20 74 69 6d 65  n-out local time
73e0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
73f0: 2a 20 54 68 69 73 20 6d 6f 64 69 66 69 65 64 20  * This modified 
7400: 76 65 72 73 69 6f 6e 20 6f 66 20 6c 6f 63 61 6c  version of local
7410: 74 69 6d 65 28 29 20 77 6f 72 6b 73 20 6c 69 6b  time() works lik
7420: 65 20 74 68 65 20 6c 69 62 72 61 72 79 20 6c 6f  e the library lo
7430: 63 61 6c 74 69 6d 65 28 29 0a 2a 2a 20 62 79 20  caltime().** by 
7440: 64 65 66 61 75 6c 74 2e 20 20 45 78 63 65 70 74  default.  Except
7450: 20 69 66 20 74 68 65 20 74 69 6d 65 6c 69 6e 65   if the timeline
7460: 2d 75 74 63 20 70 72 6f 70 65 72 74 79 20 69 73  -utc property is
7470: 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69   set, this routi
7480: 6e 65 0a 2a 2a 20 75 73 65 73 20 67 6d 74 74 69  ne.** uses gmtti
7490: 6d 65 28 29 20 69 6e 73 74 65 61 64 2e 20 20 54  me() instead.  T
74a0: 68 75 73 20 62 79 20 73 65 74 74 69 6e 67 20 74  hus by setting t
74b0: 68 65 20 74 69 6d 65 6c 69 6e 65 2d 75 74 63 20  he timeline-utc 
74c0: 70 72 6f 70 65 72 74 79 2c 20 77 65 0a 2a 2a 20  property, we.** 
74d0: 63 61 6e 20 67 65 74 20 61 6c 6c 20 6c 6f 63 61  can get all loca
74e0: 6c 74 69 6d 65 73 20 74 6f 20 62 65 20 64 69 73  ltimes to be dis
74f0: 70 6c 61 79 65 64 20 61 74 20 55 54 43 20 74 69  played at UTC ti
7500: 6d 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 74 6d  me..*/.struct tm
7510: 20 2a 66 6f 73 73 69 6c 5f 6c 6f 63 61 6c 74 69   *fossil_localti
7520: 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20  me(const time_t 
7530: 2a 63 6c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 67  *clock){.  if( g
7540: 2e 66 54 69 6d 65 46 6f 72 6d 61 74 3d 3d 30 20  .fTimeFormat==0 
7550: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 5f 67 65  ){.    if( db_ge
7560: 74 5f 69 6e 74 28 22 74 69 6d 65 6c 69 6e 65 2d  t_int("timeline-
7570: 75 74 63 22 2c 20 31 29 20 29 7b 0a 20 20 20 20  utc", 1) ){.    
7580: 20 20 67 2e 66 54 69 6d 65 46 6f 72 6d 61 74 20    g.fTimeFormat 
7590: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
75a0: 20 20 20 20 20 20 67 2e 66 54 69 6d 65 46 6f 72        g.fTimeFor
75b0: 6d 61 74 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  mat = 2;.    }. 
75c0: 20 7d 0a 20 20 69 66 28 20 67 2e 66 54 69 6d 65   }.  if( g.fTime
75d0: 46 6f 72 6d 61 74 3d 3d 31 20 29 7b 0a 20 20 20  Format==1 ){.   
75e0: 20 72 65 74 75 72 6e 20 67 6d 74 69 6d 65 28 63   return gmtime(c
75f0: 6c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lock);.  }else{.
7600: 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 63 61 6c      return local
7610: 74 69 6d 65 28 63 6c 6f 63 6b 29 3b 0a 20 20 7d  time(clock);.  }
7620: 0a 7d 0a                                         .}.