Hex Artifact Content
Not logged in

Artifact 0ecd2849ac0b653e9994b18dc42b447289397146:

File src/timeline.c part of check-in [58903a0fec] - Add more hyperlinks on dates and userids. by drh on 2009-08-29 22:39:44.

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