Hex Artifact Content
Not logged in

Artifact 7e388fb12792b16afd1ce9929845aa4756eed78f:

File src/timeline.c part of check-in [580d6ad8c7] - Suppress the display of the artificate ID on the timeline which showing changes to wiki or tickets. by drh on 2009-01-21 01:23:40.

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