Hex Artifact Content
Not logged in

Artifact e44bb517cc515d1c0462e9446df30fcb8f7b8c26:

File src/info.c part of check-in [e631d8af6d] - Improvements to the timeline when displaying check-ins with a given tag. by drh on 2009-01-21 18:42:19.

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: 22 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 20  "info" command. 
03a0: 20 54 68 65 0a 2a 2a 20 22 69 6e 66 6f 22 20 63   The.** "info" c
03b0: 6f 6d 6d 61 6e 64 20 67 69 76 65 73 20 63 6f 6d  ommand gives com
03c0: 6d 61 6e 64 2d 6c 69 6e 65 20 61 63 63 65 73 73  mand-line access
03d0: 20 74 6f 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   to information 
03e0: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 75 72  about.** the cur
03f0: 72 65 6e 74 20 74 72 65 65 2c 20 6f 72 20 61 20  rent tree, or a 
0400: 70 61 72 74 69 63 75 6c 61 72 20 61 72 74 69 66  particular artif
0410: 61 63 74 20 6f 72 20 62 61 73 65 6c 69 6e 65 2e  act or baseline.
0420: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f  .*/.#include "co
0430: 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65  nfig.h".#include
0440: 20 22 69 6e 66 6f 2e 68 22 0a 23 69 6e 63 6c 75   "info.h".#inclu
0450: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 0a  de <assert.h>...
0460: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 63 6f 6d 6d  /*.** Print comm
0470: 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  on information a
0480: 62 6f 75 74 20 61 20 70 61 72 74 69 63 75 6c 61  bout a particula
0490: 72 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  r record..**.** 
04a0: 20 20 20 20 2a 20 20 54 68 65 20 55 55 49 44 0a      *  The UUID.
04b0: 2a 2a 20 20 20 20 20 2a 20 20 54 68 65 20 72 65  **     *  The re
04c0: 63 6f 72 64 20 49 44 0a 2a 2a 20 20 20 20 20 2a  cord ID.**     *
04d0: 20 20 6d 74 69 6d 65 20 61 6e 64 20 63 74 69 6d    mtime and ctim
04e0: 65 0a 2a 2a 20 20 20 20 20 2a 20 20 77 68 6f 20  e.**     *  who 
04f0: 73 69 67 6e 65 64 20 69 74 0a 2a 2f 0a 76 6f 69  signed it.*/.voi
0500: 64 20 73 68 6f 77 5f 63 6f 6d 6d 6f 6e 5f 69 6e  d show_common_in
0510: 66 6f 28 69 6e 74 20 72 69 64 2c 20 63 6f 6e 73  fo(int rid, cons
0520: 74 20 63 68 61 72 20 2a 7a 55 75 69 64 4e 61 6d  t char *zUuidNam
0530: 65 2c 20 69 6e 74 20 73 68 6f 77 43 6f 6d 6d 65  e, int showComme
0540: 6e 74 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20  nt){.  Stmt q;. 
0550: 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 65 6e 74 20   char *zComment 
0560: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61  = 0;.  char *zTa
0570: 67 73 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65  gs;.  db_prepare
0580: 28 26 71 2c 0a 20 20 20 20 22 53 45 4c 45 43 54  (&q,.    "SELECT
0590: 20 75 75 69 64 22 0a 20 20 20 20 22 20 20 46 52   uuid".    "  FR
05a0: 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69  OM blob WHERE ri
05b0: 64 3d 25 64 22 2c 20 72 69 64 0a 20 20 29 3b 0a  d=%d", rid.  );.
05c0: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 71    if( db_step(&q
05d0: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
05e0: 0a 20 20 20 20 20 20 20 20 20 2f 2a 20 30 31 32  .         /* 012
05f0: 33 34 35 36 37 38 39 30 31 32 33 20 2a 2f 0a 20  34567890123 */. 
0600: 20 20 20 70 72 69 6e 74 66 28 22 25 2d 31 33 73     printf("%-13s
0610: 20 25 73 5c 6e 22 2c 20 7a 55 75 69 64 4e 61 6d   %s\n", zUuidNam
0620: 65 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78  e, db_column_tex
0630: 74 28 26 71 2c 20 30 29 29 3b 0a 20 20 7d 0a 20  t(&q, 0));.  }. 
0640: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
0650: 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26  ;.  db_prepare(&
0660: 71 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20  q, "SELECT uuid 
0670: 46 52 4f 4d 20 70 6c 69 6e 6b 20 4a 4f 49 4e 20  FROM plink JOIN 
0680: 62 6c 6f 62 20 4f 4e 20 70 69 64 3d 72 69 64 20  blob ON pid=rid 
0690: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
06a0: 20 20 20 22 20 57 48 45 52 45 20 63 69 64 3d 25     " WHERE cid=%
06b0: 64 22 2c 20 72 69 64 29 3b 0a 20 20 77 68 69 6c  d", rid);.  whil
06c0: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
06d0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
06e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
06f0: 75 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  uid = db_column_
0700: 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20  text(&q, 0);.   
0710: 20 70 72 69 6e 74 66 28 22 70 61 72 65 6e 74 3a   printf("parent:
0720: 20 20 20 20 20 20 20 25 73 5c 6e 22 2c 20 7a 55         %s\n", zU
0730: 75 69 64 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66  uid);.  }.  db_f
0740: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 64  inalize(&q);.  d
0750: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22 53  b_prepare(&q, "S
0760: 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20  ELECT uuid FROM 
0770: 70 6c 69 6e 6b 20 4a 4f 49 4e 20 62 6c 6f 62 20  plink JOIN blob 
0780: 4f 4e 20 63 69 64 3d 72 69 64 20 22 0a 20 20 20  ON cid=rid ".   
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
07a0: 57 48 45 52 45 20 70 69 64 3d 25 64 22 2c 20 72  WHERE pid=%d", r
07b0: 69 64 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62  id);.  while( db
07c0: 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54  _step(&q)==SQLIT
07d0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e  E_ROW ){.    con
07e0: 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d  st char *zUuid =
07f0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
0800: 26 71 2c 20 30 29 3b 0a 20 20 20 20 70 72 69 6e  &q, 0);.    prin
0810: 74 66 28 22 63 68 69 6c 64 3a 20 20 20 20 20 20  tf("child:      
0820: 20 20 25 73 5c 6e 22 2c 20 7a 55 75 69 64 29 3b    %s\n", zUuid);
0830: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
0840: 7a 65 28 26 71 29 3b 0a 20 20 7a 54 61 67 73 20  ze(&q);.  zTags 
0850: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
0860: 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61  LECT group_conca
0870: 74 28 73 75 62 73 74 72 28 74 61 67 6e 61 6d 65  t(substr(tagname
0880: 2c 20 35 29 2c 20 27 2c 20 27 29 22 0a 20 20 20  , 5), ', ')".   
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08a0: 20 20 22 20 20 46 52 4f 4d 20 74 61 67 78 72 65    "  FROM tagxre
08b0: 66 2c 20 74 61 67 22 0a 20 20 20 20 20 20 20 20  f, tag".        
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
08d0: 48 45 52 45 20 74 61 67 78 72 65 66 2e 72 69 64  HERE tagxref.rid
08e0: 3d 25 64 20 41 4e 44 20 74 61 67 78 72 65 66 2e  =%d AND tagxref.
08f0: 74 61 67 74 79 70 65 3e 30 22 0a 20 20 20 20 20  tagtype>0".     
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0910: 22 20 20 20 41 4e 44 20 74 61 67 2e 74 61 67 69  "   AND tag.tagi
0920: 64 3d 74 61 67 78 72 65 66 2e 74 61 67 69 64 22  d=tagxref.tagid"
0930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0940: 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 74 61        "   AND ta
0950: 67 2e 74 61 67 6e 61 6d 65 20 47 4c 4f 42 20 27  g.tagname GLOB '
0960: 73 79 6d 2d 2a 27 22 2c 0a 20 20 20 20 20 20 20  sym-*'",.       
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 69                ri
0980: 64 29 3b 0a 20 20 69 66 28 20 7a 54 61 67 73 20  d);.  if( zTags 
0990: 26 26 20 7a 54 61 67 73 5b 30 5d 20 29 7b 0a 20  && zTags[0] ){. 
09a0: 20 20 20 70 72 69 6e 74 66 28 22 74 61 67 73 3a     printf("tags:
09b0: 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 2c 20           %s\n", 
09c0: 7a 54 61 67 73 29 3b 0a 20 20 7d 0a 20 20 66 72  zTags);.  }.  fr
09d0: 65 65 28 7a 54 61 67 73 29 3b 0a 20 20 69 66 28  ee(zTags);.  if(
09e0: 20 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20   zComment ){.   
09f0: 20 70 72 69 6e 74 66 28 22 63 6f 6d 6d 65 6e 74   printf("comment
0a00: 3a 5c 6e 25 73 5c 6e 22 2c 20 7a 43 6f 6d 6d 65  :\n%s\n", zComme
0a10: 6e 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43  nt);.    free(zC
0a20: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  omment);.  }.}..
0a30: 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20  ./*.** COMMAND: 
0a40: 69 6e 66 6f 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  info.**.** Usage
0a50: 3a 20 25 66 6f 73 73 69 6c 20 69 6e 66 6f 20 3f  : %fossil info ?
0a60: 41 52 54 49 46 41 43 54 2d 49 44 7c 46 49 4c 45  ARTIFACT-ID|FILE
0a70: 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 57 69 74 68  NAME?.**.** With
0a80: 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 70   no arguments, p
0a90: 72 6f 76 69 64 65 20 69 6e 66 6f 72 6d 61 74 69  rovide informati
0aa0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75 72  on about the cur
0ab0: 72 65 6e 74 20 74 72 65 65 2e 0a 2a 2a 20 49 66  rent tree..** If
0ac0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20   an argument is 
0ad0: 73 70 65 63 69 66 69 65 64 2c 20 70 72 6f 76 69  specified, provi
0ae0: 64 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  de information a
0af0: 62 6f 75 74 20 74 68 65 20 6f 62 6a 65 63 74 0a  bout the object.
0b00: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 70 6f 73  ** in the respos
0b10: 69 74 6f 72 79 20 6f 66 20 74 68 65 20 63 75 72  itory of the cur
0b20: 72 65 6e 74 20 74 72 65 65 20 74 68 61 74 20 74  rent tree that t
0b30: 68 65 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65  he argument refe
0b40: 72 73 0a 2a 2a 20 74 6f 2e 20 20 4f 72 20 69 66  rs.** to.  Or if
0b50: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
0b60: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 72   the name of a r
0b70: 65 70 6f 73 69 74 6f 72 79 2c 20 73 68 6f 77 0a  epository, show.
0b80: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** information a
0b90: 62 6f 75 74 20 74 68 61 74 20 72 65 70 6f 73 69  bout that reposi
0ba0: 74 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 69 6e  tory..*/.void in
0bb0: 66 6f 5f 63 6d 64 28 76 6f 69 64 29 7b 0a 20 20  fo_cmd(void){.  
0bc0: 69 36 34 20 66 73 69 7a 65 3b 0a 20 20 69 66 28  i64 fsize;.  if(
0bd0: 20 67 2e 61 72 67 63 21 3d 32 20 26 26 20 67 2e   g.argc!=2 && g.
0be0: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 75  argc!=3 ){.    u
0bf0: 73 61 67 65 28 22 3f 46 49 4c 45 4e 41 4d 45 7c  sage("?FILENAME|
0c00: 41 52 54 49 46 41 43 54 2d 49 44 3f 22 29 3b 0a  ARTIFACT-ID?");.
0c10: 20 20 7d 0a 20 20 69 66 28 20 67 2e 61 72 67 63    }.  if( g.argc
0c20: 3d 3d 33 20 26 26 20 28 66 73 69 7a 65 20 3d 20  ==3 && (fsize = 
0c30: 66 69 6c 65 5f 73 69 7a 65 28 67 2e 61 72 67 76  file_size(g.argv
0c40: 5b 32 5d 29 29 3e 30 20 26 26 20 28 66 73 69 7a  [2]))>0 && (fsiz
0c50: 65 26 30 78 31 66 66 29 3d 3d 30 20 29 7b 0a 20  e&0x1ff)==0 ){. 
0c60: 20 20 20 64 62 5f 6f 70 65 6e 5f 63 6f 6e 66 69     db_open_confi
0c70: 67 28 29 3b 0a 20 20 20 20 64 62 5f 72 65 63 6f  g();.    db_reco
0c80: 72 64 5f 72 65 70 6f 73 69 74 6f 72 79 5f 66 69  rd_repository_fi
0c90: 6c 65 6e 61 6d 65 28 67 2e 61 72 67 76 5b 32 5d  lename(g.argv[2]
0ca0: 29 3b 0a 20 20 20 20 64 62 5f 6f 70 65 6e 5f 72  );.    db_open_r
0cb0: 65 70 6f 73 69 74 6f 72 79 28 67 2e 61 72 67 76  epository(g.argv
0cc0: 5b 32 5d 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  [2]);.    printf
0cd0: 28 22 70 72 6f 6a 65 63 74 2d 63 6f 64 65 3a 20  ("project-code: 
0ce0: 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22 70  %s\n", db_get("p
0cf0: 72 6f 6a 65 63 74 2d 63 6f 64 65 22 2c 20 22 3c  roject-code", "<
0d00: 6e 6f 6e 65 3e 22 29 29 3b 0a 20 20 20 20 70 72  none>"));.    pr
0d10: 69 6e 74 66 28 22 70 72 6f 6a 65 63 74 2d 6e 61  intf("project-na
0d20: 6d 65 3a 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65  me: %s\n", db_ge
0d30: 74 28 22 70 72 6f 6a 65 63 74 2d 6e 61 6d 65 22  t("project-name"
0d40: 2c 20 22 3c 75 6e 6e 61 6d 65 64 3e 22 29 29 3b  , "<unnamed>"));
0d50: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 73 65 72  .    printf("ser
0d60: 76 65 72 2d 63 6f 64 65 3a 20 20 25 73 5c 6e 22  ver-code:  %s\n"
0d70: 2c 20 64 62 5f 67 65 74 28 22 73 65 72 76 65 72  , db_get("server
0d80: 2d 63 6f 64 65 22 2c 20 22 3c 6e 6f 6e 65 3e 22  -code", "<none>"
0d90: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ));.    return;.
0da0: 20 20 7d 0a 20 20 64 62 5f 6d 75 73 74 5f 62 65    }.  db_must_be
0db0: 5f 77 69 74 68 69 6e 5f 74 72 65 65 28 29 3b 0a  _within_tree();.
0dc0: 20 20 69 66 28 20 67 2e 61 72 67 63 3d 3d 32 20    if( g.argc==2 
0dd0: 29 7b 0a 20 20 20 20 69 6e 74 20 76 69 64 3b 0a  ){.    int vid;.
0de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 31 32 33           /* 0123
0df0: 34 35 36 37 38 39 30 31 32 33 34 20 2a 2f 0a 20  45678901234 */. 
0e00: 20 20 20 64 62 5f 72 65 63 6f 72 64 5f 72 65 70     db_record_rep
0e10: 6f 73 69 74 6f 72 79 5f 66 69 6c 65 6e 61 6d 65  ository_filename
0e20: 28 30 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  (0);.    printf(
0e30: 22 72 65 70 6f 73 69 74 6f 72 79 3a 20 20 20 25  "repository:   %
0e40: 73 5c 6e 22 2c 20 64 62 5f 6c 67 65 74 28 22 72  s\n", db_lget("r
0e50: 65 70 6f 73 69 74 6f 72 79 22 2c 20 22 22 29 29  epository", ""))
0e60: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 6c 6f  ;.    printf("lo
0e70: 63 61 6c 2d 72 6f 6f 74 3a 20 20 20 25 73 5c 6e  cal-root:   %s\n
0e80: 22 2c 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29  ", g.zLocalRoot)
0e90: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 70 72  ;.    printf("pr
0ea0: 6f 6a 65 63 74 2d 63 6f 64 65 3a 20 25 73 5c 6e  oject-code: %s\n
0eb0: 22 2c 20 64 62 5f 67 65 74 28 22 70 72 6f 6a 65  ", db_get("proje
0ec0: 63 74 2d 63 6f 64 65 22 2c 20 22 22 29 29 3b 0a  ct-code", ""));.
0ed0: 20 20 20 20 70 72 69 6e 74 66 28 22 73 65 72 76      printf("serv
0ee0: 65 72 2d 63 6f 64 65 3a 20 20 25 73 5c 6e 22 2c  er-code:  %s\n",
0ef0: 20 64 62 5f 67 65 74 28 22 73 65 72 76 65 72 2d   db_get("server-
0f00: 63 6f 64 65 22 2c 20 22 22 29 29 3b 0a 20 20 20  code", ""));.   
0f10: 20 76 69 64 20 3d 20 64 62 5f 6c 67 65 74 5f 69   vid = db_lget_i
0f20: 6e 74 28 22 63 68 65 63 6b 6f 75 74 22 2c 20 30  nt("checkout", 0
0f30: 29 3b 0a 20 20 20 20 69 66 28 20 76 69 64 3d 3d  );.    if( vid==
0f40: 30 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  0 ){.      print
0f50: 66 28 22 63 68 65 63 6b 6f 75 74 3a 20 20 20 20  f("checkout:    
0f60: 20 6e 69 6c 5c 6e 22 29 3b 0a 20 20 20 20 7d 65   nil\n");.    }e
0f70: 6c 73 65 7b 0a 20 20 20 20 20 20 73 68 6f 77 5f  lse{.      show_
0f80: 63 6f 6d 6d 6f 6e 5f 69 6e 66 6f 28 76 69 64 2c  common_info(vid,
0f90: 20 22 63 68 65 63 6b 6f 75 74 3a 22 2c 20 31 29   "checkout:", 1)
0fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
0fb0: 0a 20 20 20 20 69 6e 74 20 72 69 64 3b 0a 20 20  .    int rid;.  
0fc0: 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74 6f 5f    rid = name_to_
0fd0: 72 69 64 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a  rid(g.argv[2]);.
0fe0: 20 20 20 20 69 66 28 20 72 69 64 3d 3d 30 20 29      if( rid==0 )
0ff0: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70  {.      fossil_p
1000: 61 6e 69 63 28 22 6e 6f 20 73 75 63 68 20 6f 62  anic("no such ob
1010: 6a 65 63 74 3a 20 25 73 5c 6e 22 2c 20 67 2e 61  ject: %s\n", g.a
1020: 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20  rgv[2]);.    }. 
1030: 20 20 20 73 68 6f 77 5f 63 6f 6d 6d 6f 6e 5f 69     show_common_i
1040: 6e 66 6f 28 72 69 64 2c 20 22 75 75 69 64 3a 22  nfo(rid, "uuid:"
1050: 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
1060: 2a 2a 20 53 68 6f 77 20 69 6e 66 6f 72 6d 61 74  ** Show informat
1070: 69 6f 6e 20 61 62 6f 75 74 20 64 65 73 63 65 6e  ion about descen
1080: 64 61 6e 74 73 20 6f 66 20 61 20 62 61 73 65 6c  dants of a basel
1090: 69 6e 65 2e 20 20 44 6f 20 74 68 69 73 20 72 65  ine.  Do this re
10a0: 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 6f 20  cursively.** to 
10b0: 61 20 64 65 70 74 68 20 6f 66 20 4e 2e 20 20 52  a depth of N.  R
10c0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 64 65  eturn true if de
10d0: 73 63 65 6e 64 61 6e 74 73 20 61 72 65 20 73 68  scendants are sh
10e0: 6f 77 6e 20 61 6e 64 20 66 61 6c 73 65 20 69 66  own and false if
10f0: 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
1100: 69 6e 74 20 73 68 6f 77 44 65 73 63 65 6e 64 61  int showDescenda
1110: 6e 74 73 28 69 6e 74 20 70 69 64 2c 20 69 6e 74  nts(int pid, int
1120: 20 64 65 70 74 68 2c 20 63 6f 6e 73 74 20 63 68   depth, const ch
1130: 61 72 20 2a 7a 54 69 74 6c 65 29 7b 0a 20 20 53  ar *zTitle){.  S
1140: 74 6d 74 20 71 3b 0a 20 20 69 6e 74 20 63 6e 74  tmt q;.  int cnt
1150: 20 3d 20 30 3b 0a 20 20 64 62 5f 70 72 65 70 61   = 0;.  db_prepa
1160: 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45 4c 45  re(&q,.    "SELE
1170: 43 54 20 70 6c 69 6e 6b 2e 63 69 64 2c 20 62 6c  CT plink.cid, bl
1180: 6f 62 2e 75 75 69 64 2c 20 64 61 74 65 74 69 6d  ob.uuid, datetim
1190: 65 28 70 6c 69 6e 6b 2e 6d 74 69 6d 65 2c 20 27  e(plink.mtime, '
11a0: 6c 6f 63 61 6c 74 69 6d 65 27 29 2c 22 0a 20 20  localtime'),".  
11b0: 20 20 22 20 20 20 20 20 20 20 63 6f 61 6c 65 73    "       coales
11c0: 63 65 28 65 76 65 6e 74 2e 65 75 73 65 72 2c 65  ce(event.euser,e
11d0: 76 65 6e 74 2e 75 73 65 72 29 2c 22 0a 20 20 20  vent.user),".   
11e0: 20 22 20 20 20 20 20 20 20 63 6f 61 6c 65 73 63   "       coalesc
11f0: 65 28 65 76 65 6e 74 2e 65 63 6f 6d 6d 65 6e 74  e(event.ecomment
1200: 2c 65 76 65 6e 74 2e 63 6f 6d 6d 65 6e 74 29 22  ,event.comment)"
1210: 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 70 6c 69  .    "  FROM pli
1220: 6e 6b 2c 20 62 6c 6f 62 2c 20 65 76 65 6e 74 22  nk, blob, event"
1230: 0a 20 20 20 20 22 20 57 48 45 52 45 20 70 6c 69  .    " WHERE pli
1240: 6e 6b 2e 70 69 64 3d 25 64 22 0a 20 20 20 20 22  nk.pid=%d".    "
1250: 20 20 20 41 4e 44 20 62 6c 6f 62 2e 72 69 64 3d     AND blob.rid=
1260: 70 6c 69 6e 6b 2e 63 69 64 22 0a 20 20 20 20 22  plink.cid".    "
1270: 20 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a     AND event.obj
1280: 69 64 3d 70 6c 69 6e 6b 2e 63 69 64 22 0a 20 20  id=plink.cid".  
1290: 20 20 22 20 4f 52 44 45 52 20 42 59 20 70 6c 69    " ORDER BY pli
12a0: 6e 6b 2e 6d 74 69 6d 65 20 41 53 43 22 2c 0a 20  nk.mtime ASC",. 
12b0: 20 20 20 70 69 64 0a 20 20 29 3b 0a 20 20 77 68     pid.  );.  wh
12c0: 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29  ile( db_step(&q)
12d0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
12e0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
12f0: 6e 74 20 63 69 64 20 3d 20 64 62 5f 63 6f 6c 75  nt cid = db_colu
1300: 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a 20  mn_int(&q, 0);. 
1310: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1320: 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  Uuid = db_column
1330: 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20  _text(&q, 1);.  
1340: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1350: 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ate = db_column_
1360: 74 65 78 74 28 26 71 2c 20 32 29 3b 0a 20 20 20  text(&q, 2);.   
1370: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
1380: 65 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  er = db_column_t
1390: 65 78 74 28 26 71 2c 20 33 29 3b 0a 20 20 20 20  ext(&q, 3);.    
13a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d  const char *zCom
13b0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
13c0: 74 28 26 71 2c 20 34 29 3b 0a 20 20 20 20 63 6e  t(&q, 4);.    cn
13d0: 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 63 6e 74  t++;.    if( cnt
13e0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
13f0: 20 7a 54 69 74 6c 65 20 29 7b 0a 20 20 20 20 20   zTitle ){.     
1400: 20 20 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d     @ <div class=
1410: 22 73 65 63 74 69 6f 6e 22 3e 25 73 28 7a 54 69  "section">%s(zTi
1420: 74 6c 65 29 3c 2f 64 69 76 3e 0a 20 20 20 20 20  tle)</div>.     
1430: 20 7d 0a 20 20 20 20 20 20 40 20 3c 75 6c 3e 0a   }.      @ <ul>.
1440: 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 6c 69 3e      }.    @ <li>
1450: 0a 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74  .    hyperlink_t
1460: 6f 5f 75 75 69 64 28 7a 55 75 69 64 29 3b 0a 20  o_uuid(zUuid);. 
1470: 20 20 20 40 20 25 77 28 7a 43 6f 6d 29 20 28 62     @ %w(zCom) (b
1480: 79 20 25 73 28 7a 55 73 65 72 29 20 6f 6e 20 25  y %s(zUser) on %
1490: 73 28 7a 44 61 74 65 29 29 0a 20 20 20 20 69 66  s(zDate)).    if
14a0: 28 20 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20  ( depth ){.     
14b0: 20 6e 20 3d 20 73 68 6f 77 44 65 73 63 65 6e 64   n = showDescend
14c0: 61 6e 74 73 28 63 69 64 2c 20 64 65 70 74 68 2d  ants(cid, depth-
14d0: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  1, 0);.    }else
14e0: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 64 62 5f 69  {.      n = db_i
14f0: 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20 31 20  nt(0, "SELECT 1 
1500: 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45  FROM plink WHERE
1510: 20 70 69 64 3d 25 64 22 2c 20 63 69 64 29 3b 0a   pid=%d", cid);.
1520: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d      }.    if( n=
1530: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 6d  =0 ){.      db_m
1540: 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c 45 54  ulti_exec("DELET
1550: 45 20 46 52 4f 4d 20 6c 65 61 76 65 73 20 57 48  E FROM leaves WH
1560: 45 52 45 20 72 69 64 3d 25 64 22 2c 20 63 69 64  ERE rid=%d", cid
1570: 29 3b 0a 20 20 20 20 20 20 40 20 3c 62 3e 6c 65  );.      @ <b>le
1580: 61 66 3c 2f 62 3e 0a 20 20 20 20 7d 0a 20 20 7d  af</b>.    }.  }
1590: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
15a0: 71 29 3b 0a 20 20 69 66 28 20 63 6e 74 20 29 7b  q);.  if( cnt ){
15b0: 0a 20 20 20 20 40 20 3c 2f 75 6c 3e 0a 20 20 7d  .    @ </ul>.  }
15c0: 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a 7d  .  return cnt;.}
15d0: 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 69 6e 66  ../*.** Show inf
15e0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
15f0: 6e 63 65 73 74 6f 72 73 20 6f 66 20 61 20 62 61  ncestors of a ba
1600: 73 65 6c 69 6e 65 2e 20 20 44 6f 20 74 68 69 73  seline.  Do this
1610: 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20   recursively.** 
1620: 74 6f 20 61 20 64 65 70 74 68 20 6f 66 20 4e 2e  to a depth of N.
1630: 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
1640: 20 61 6e 63 65 73 74 6f 72 73 20 61 72 65 20 73   ancestors are s
1650: 68 6f 77 6e 20 61 6e 64 20 66 61 6c 73 65 20 69  hown and false i
1660: 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
1670: 20 76 6f 69 64 20 73 68 6f 77 41 6e 63 65 73 74   void showAncest
1680: 6f 72 73 28 69 6e 74 20 70 69 64 2c 20 69 6e 74  ors(int pid, int
1690: 20 64 65 70 74 68 2c 20 63 6f 6e 73 74 20 63 68   depth, const ch
16a0: 61 72 20 2a 7a 54 69 74 6c 65 29 7b 0a 20 20 53  ar *zTitle){.  S
16b0: 74 6d 74 20 71 3b 0a 20 20 69 6e 74 20 63 6e 74  tmt q;.  int cnt
16c0: 20 3d 20 30 3b 0a 20 20 64 62 5f 70 72 65 70 61   = 0;.  db_prepa
16d0: 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45 4c 45  re(&q,.    "SELE
16e0: 43 54 20 70 6c 69 6e 6b 2e 70 69 64 2c 20 62 6c  CT plink.pid, bl
16f0: 6f 62 2e 75 75 69 64 2c 20 64 61 74 65 74 69 6d  ob.uuid, datetim
1700: 65 28 65 76 65 6e 74 2e 6d 74 69 6d 65 2c 20 27  e(event.mtime, '
1710: 6c 6f 63 61 6c 74 69 6d 65 27 29 2c 22 0a 20 20  localtime'),".  
1720: 20 20 22 20 20 20 20 20 20 20 63 6f 61 6c 65 73    "       coales
1730: 63 65 28 65 76 65 6e 74 2e 65 75 73 65 72 2c 65  ce(event.euser,e
1740: 76 65 6e 74 2e 75 73 65 72 29 2c 22 0a 20 20 20  vent.user),".   
1750: 20 22 20 20 20 20 20 20 20 63 6f 61 6c 65 73 63   "       coalesc
1760: 65 28 65 76 65 6e 74 2e 65 63 6f 6d 6d 65 6e 74  e(event.ecomment
1770: 2c 65 76 65 6e 74 2e 63 6f 6d 6d 65 6e 74 29 22  ,event.comment)"
1780: 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 70 6c 69  .    "  FROM pli
1790: 6e 6b 2c 20 62 6c 6f 62 2c 20 65 76 65 6e 74 22  nk, blob, event"
17a0: 0a 20 20 20 20 22 20 57 48 45 52 45 20 70 6c 69  .    " WHERE pli
17b0: 6e 6b 2e 63 69 64 3d 25 64 22 0a 20 20 20 20 22  nk.cid=%d".    "
17c0: 20 20 20 41 4e 44 20 62 6c 6f 62 2e 72 69 64 3d     AND blob.rid=
17d0: 70 6c 69 6e 6b 2e 70 69 64 22 0a 20 20 20 20 22  plink.pid".    "
17e0: 20 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a     AND event.obj
17f0: 69 64 3d 70 6c 69 6e 6b 2e 70 69 64 22 0a 20 20  id=plink.pid".  
1800: 20 20 22 20 4f 52 44 45 52 20 42 59 20 65 76 65    " ORDER BY eve
1810: 6e 74 2e 6d 74 69 6d 65 20 44 45 53 43 22 2c 0a  nt.mtime DESC",.
1820: 20 20 20 20 70 69 64 0a 20 20 29 3b 0a 20 20 77      pid.  );.  w
1830: 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71  hile( db_step(&q
1840: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1850: 0a 20 20 20 20 69 6e 74 20 63 69 64 20 3d 20 64  .    int cid = d
1860: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c  b_column_int(&q,
1870: 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   0);.    const c
1880: 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f  har *zUuid = db_
1890: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
18a0: 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  1);.    const ch
18b0: 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63  ar *zDate = db_c
18c0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32  olumn_text(&q, 2
18d0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
18e0: 72 20 2a 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f  r *zUser = db_co
18f0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29  lumn_text(&q, 3)
1900: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1910: 20 2a 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c 75   *zCom = db_colu
1920: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 34 29 3b 0a  mn_text(&q, 4);.
1930: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 69      cnt++;.    i
1940: 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20  f( cnt==1 ){.   
1950: 20 20 20 69 66 28 20 7a 54 69 74 6c 65 20 29 7b     if( zTitle ){
1960: 0a 20 20 20 20 20 20 20 20 40 20 3c 64 69 76 20  .        @ <div 
1970: 63 6c 61 73 73 3d 22 73 65 63 74 69 6f 6e 22 3e  class="section">
1980: 25 73 28 7a 54 69 74 6c 65 29 3c 2f 64 69 76 3e  %s(zTitle)</div>
1990: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 40  .      }.      @
19a0: 20 3c 75 6c 3e 0a 20 20 20 20 7d 0a 20 20 20 20   <ul>.    }.    
19b0: 40 20 3c 6c 69 3e 0a 20 20 20 20 68 79 70 65 72  @ <li>.    hyper
19c0: 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 28 7a 55 75  link_to_uuid(zUu
19d0: 69 64 29 3b 0a 20 20 20 20 40 20 25 77 28 7a 43  id);.    @ %w(zC
19e0: 6f 6d 29 20 28 62 79 20 25 73 28 7a 55 73 65 72  om) (by %s(zUser
19f0: 29 20 6f 6e 20 25 73 28 7a 44 61 74 65 29 29 0a  ) on %s(zDate)).
1a00: 20 20 20 20 69 66 28 20 64 65 70 74 68 20 29 7b      if( depth ){
1a10: 0a 20 20 20 20 20 20 73 68 6f 77 41 6e 63 65 73  .      showAnces
1a20: 74 6f 72 73 28 63 69 64 2c 20 64 65 70 74 68 2d  tors(cid, depth-
1a30: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  1, 0);.    }.  }
1a40: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
1a50: 71 29 3b 0a 20 20 69 66 28 20 63 6e 74 20 29 7b  q);.  if( cnt ){
1a60: 0a 20 20 20 20 40 20 3c 2f 75 6c 3e 0a 20 20 7d  .    @ </ul>.  }
1a70: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20  .}.../*.** Show 
1a80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
1a90: 74 20 62 61 73 65 6c 69 6e 65 73 20 6d 65 6e 74  t baselines ment
1aa0: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 22 6c 65  ioned in the "le
1ab0: 61 76 65 73 22 20 74 61 62 6c 65 2e 0a 2a 2f 0a  aves" table..*/.
1ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 6f 77  static void show
1ad0: 4c 65 61 76 65 73 28 76 6f 69 64 29 7b 0a 20 20  Leaves(void){.  
1ae0: 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74 20 63 6e  Stmt q;.  int cn
1af0: 74 20 3d 20 30 3b 0a 20 20 64 62 5f 70 72 65 70  t = 0;.  db_prep
1b00: 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45 4c  are(&q,.    "SEL
1b10: 45 43 54 20 62 6c 6f 62 2e 75 75 69 64 2c 20 64  ECT blob.uuid, d
1b20: 61 74 65 74 69 6d 65 28 65 76 65 6e 74 2e 6d 74  atetime(event.mt
1b30: 69 6d 65 2c 20 27 6c 6f 63 61 6c 74 69 6d 65 27  ime, 'localtime'
1b40: 29 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  ),".    "       
1b50: 63 6f 61 6c 65 73 63 65 28 65 76 65 6e 74 2e 65  coalesce(event.e
1b60: 75 73 65 72 2c 20 65 76 65 6e 74 2e 75 73 65 72  user, event.user
1b70: 29 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  ),".    "       
1b80: 63 6f 61 6c 65 73 63 65 28 65 76 65 6e 74 2e 65  coalesce(event.e
1b90: 63 6f 6d 6d 65 6e 74 2c 65 76 65 6e 74 2e 63 6f  comment,event.co
1ba0: 6d 6d 65 6e 74 29 22 0a 20 20 20 20 22 20 20 46  mment)".    "  F
1bb0: 52 4f 4d 20 6c 65 61 76 65 73 2c 20 62 6c 6f 62  ROM leaves, blob
1bc0: 2c 20 65 76 65 6e 74 22 0a 20 20 20 20 22 20 57  , event".    " W
1bd0: 48 45 52 45 20 62 6c 6f 62 2e 72 69 64 3d 6c 65  HERE blob.rid=le
1be0: 61 76 65 73 2e 72 69 64 22 0a 20 20 20 20 22 20  aves.rid".    " 
1bf0: 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69    AND event.obji
1c00: 64 3d 6c 65 61 76 65 73 2e 72 69 64 22 0a 20 20  d=leaves.rid".  
1c10: 20 20 22 20 4f 52 44 45 52 20 42 59 20 65 76 65    " ORDER BY eve
1c20: 6e 74 2e 6d 74 69 6d 65 20 44 45 53 43 22 0a 20  nt.mtime DESC". 
1c30: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f   );.  while( db_
1c40: 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45  step(&q)==SQLITE
1c50: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
1c60: 74 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20  t char *zUuid = 
1c70: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
1c80: 71 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74  q, 0);.    const
1c90: 20 63 68 61 72 20 2a 7a 44 61 74 65 20 3d 20 64   char *zDate = d
1ca0: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
1cb0: 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 1);.    const 
1cc0: 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 64 62  char *zUser = db
1cd0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
1ce0: 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   2);.    const c
1cf0: 68 61 72 20 2a 7a 43 6f 6d 20 3d 20 64 62 5f 63  har *zCom = db_c
1d00: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33  olumn_text(&q, 3
1d10: 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  );.    cnt++;.  
1d20: 20 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a    if( cnt==1 ){.
1d30: 20 20 20 20 20 20 40 20 3c 64 69 76 20 63 6c 61        @ <div cla
1d40: 73 73 3d 22 73 65 63 74 69 6f 6e 22 3e 4c 65 61  ss="section">Lea
1d50: 76 65 73 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20  ves</div>.      
1d60: 40 20 3c 75 6c 3e 0a 20 20 20 20 7d 0a 20 20 20  @ <ul>.    }.   
1d70: 20 40 20 3c 6c 69 3e 0a 20 20 20 20 68 79 70 65   @ <li>.    hype
1d80: 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 28 7a 55  rlink_to_uuid(zU
1d90: 75 69 64 29 3b 0a 20 20 20 20 40 20 25 77 28 7a  uid);.    @ %w(z
1da0: 43 6f 6d 29 20 28 62 79 20 25 73 28 7a 55 73 65  Com) (by %s(zUse
1db0: 72 29 20 6f 6e 20 25 73 28 7a 44 61 74 65 29 29  r) on %s(zDate))
1dc0: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
1dd0: 7a 65 28 26 71 29 3b 0a 20 20 69 66 28 20 63 6e  ze(&q);.  if( cn
1de0: 74 20 29 7b 0a 20 20 20 20 40 20 3c 2f 75 6c 3e  t ){.    @ </ul>
1df0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68  .  }.}../*.** Sh
1e00: 6f 77 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ow information a
1e10: 62 6f 75 74 20 61 6c 6c 20 74 61 67 73 20 6f 6e  bout all tags on
1e20: 20 61 20 67 69 76 65 6e 20 6e 6f 64 65 2e 0a 2a   a given node..*
1e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
1e40: 6f 77 54 61 67 73 28 69 6e 74 20 72 69 64 2c 20  owTags(int rid, 
1e50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 6f 74  const char *zNot
1e60: 47 6c 6f 62 29 7b 0a 20 20 53 74 6d 74 20 71 3b  Glob){.  Stmt q;
1e70: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
1e80: 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c    db_prepare(&q,
1e90: 0a 20 20 20 20 22 53 45 4c 45 43 54 20 74 61 67  .    "SELECT tag
1ea0: 2e 74 61 67 69 64 2c 20 74 61 67 6e 61 6d 65 2c  .tagid, tagname,
1eb0: 20 73 72 63 69 64 2c 20 62 6c 6f 62 2e 75 75 69   srcid, blob.uui
1ec0: 64 2c 20 76 61 6c 75 65 2c 22 0a 20 20 20 20 22  d, value,".    "
1ed0: 20 20 20 20 20 20 20 64 61 74 65 74 69 6d 65 28         datetime(
1ee0: 74 61 67 78 72 65 66 2e 6d 74 69 6d 65 2c 27 6c  tagxref.mtime,'l
1ef0: 6f 63 61 6c 74 69 6d 65 27 29 2c 20 74 61 67 74  ocaltime'), tagt
1f00: 79 70 65 22 0a 20 20 20 20 22 20 20 46 52 4f 4d  ype".    "  FROM
1f10: 20 74 61 67 78 72 65 66 20 4a 4f 49 4e 20 74 61   tagxref JOIN ta
1f20: 67 20 4f 4e 20 74 61 67 78 72 65 66 2e 74 61 67  g ON tagxref.tag
1f30: 69 64 3d 74 61 67 2e 74 61 67 69 64 22 0a 20 20  id=tag.tagid".  
1f40: 20 20 22 20 20 20 20 20 20 20 4c 45 46 54 20 4a    "       LEFT J
1f50: 4f 49 4e 20 62 6c 6f 62 20 4f 4e 20 62 6c 6f 62  OIN blob ON blob
1f60: 2e 72 69 64 3d 74 61 67 78 72 65 66 2e 73 72 63  .rid=tagxref.src
1f70: 69 64 22 0a 20 20 20 20 22 20 57 48 45 52 45 20  id".    " WHERE 
1f80: 74 61 67 78 72 65 66 2e 72 69 64 3d 25 64 20 41  tagxref.rid=%d A
1f90: 4e 44 20 74 61 67 6e 61 6d 65 20 4e 4f 54 20 47  ND tagname NOT G
1fa0: 4c 4f 42 20 27 25 73 27 22 0a 20 20 20 20 22 20  LOB '%s'".    " 
1fb0: 4f 52 44 45 52 20 42 59 20 74 61 67 6e 61 6d 65  ORDER BY tagname
1fc0: 22 2c 20 72 69 64 2c 20 7a 4e 6f 74 47 6c 6f 62  ", rid, zNotGlob
1fd0: 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 64  .  );.  while( d
1fe0: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49  b_step(&q)==SQLI
1ff0: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f  TE_ROW ){.    co
2000: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 67 6e 61  nst char *zTagna
2010: 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  me = db_column_t
2020: 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20 20 20  ext(&q, 1);.    
2030: 69 6e 74 20 73 72 63 69 64 20 3d 20 64 62 5f 63  int srcid = db_c
2040: 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 32 29  olumn_int(&q, 2)
2050: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
2060: 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c   *zUuid = db_col
2070: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29 3b  umn_text(&q, 3);
2080: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2090: 2a 7a 56 61 6c 75 65 20 3d 20 64 62 5f 63 6f 6c  *zValue = db_col
20a0: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 34 29 3b  umn_text(&q, 4);
20b0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
20c0: 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75  *zDate = db_colu
20d0: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 35 29 3b 0a  mn_text(&q, 5);.
20e0: 20 20 20 20 69 6e 74 20 74 61 67 74 79 70 65 20      int tagtype 
20f0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  = db_column_int(
2100: 26 71 2c 20 36 29 3b 0a 20 20 20 20 63 6e 74 2b  &q, 6);.    cnt+
2110: 2b 3b 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  +;.    if( cnt==
2120: 31 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 64 69  1 ){.      @ <di
2130: 76 20 63 6c 61 73 73 3d 22 73 65 63 74 69 6f 6e  v class="section
2140: 22 3e 54 61 67 73 20 41 6e 64 20 50 72 6f 70 65  ">Tags And Prope
2150: 72 74 69 65 73 3c 2f 64 69 76 3e 0a 20 20 20 20  rties</div>.    
2160: 20 20 40 20 3c 75 6c 3e 0a 20 20 20 20 7d 0a 20    @ <ul>.    }. 
2170: 20 20 20 40 20 3c 6c 69 3e 0a 20 20 20 20 40 20     @ <li>.    @ 
2180: 3c 62 3e 25 68 28 7a 54 61 67 6e 61 6d 65 29 3c  <b>%h(zTagname)<
2190: 2f 62 3e 0a 20 20 20 20 69 66 28 20 7a 56 61 6c  /b>.    if( zVal
21a0: 75 65 20 29 7b 0a 20 20 20 20 20 20 40 20 3d 20  ue ){.      @ = 
21b0: 25 68 28 7a 56 61 6c 75 65 29 3c 69 3e 0a 20 20  %h(zValue)<i>.  
21c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 74 61 67 74    }else if( tagt
21d0: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
21e0: 40 20 3c 69 3e 43 61 6e 63 65 6c 6c 65 64 0a 20  @ <i>Cancelled. 
21f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2200: 40 20 3c 69 3e 0a 20 20 20 20 7d 0a 20 20 20 20  @ <i>.    }.    
2210: 69 66 28 20 73 72 63 69 64 3d 3d 30 20 29 7b 0a  if( srcid==0 ){.
2220: 20 20 20 20 20 20 40 20 49 6e 68 65 72 69 74 65        @ Inherite
2230: 64 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  d.    }else if( 
2240: 7a 55 75 69 64 20 29 7b 0a 20 20 20 20 20 20 40  zUuid ){.      @
2250: 20 46 72 6f 6d 0a 20 20 20 20 20 20 68 79 70 65   From.      hype
2260: 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 28 7a 55  rlink_to_uuid(zU
2270: 75 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uid);.    }.    
2280: 40 20 6f 6e 20 25 73 28 7a 44 61 74 65 29 3c 2f  @ on %s(zDate)</
2290: 69 3e 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61  i>.  }.  db_fina
22a0: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 69 66 28 20  lize(&q);.  if( 
22b0: 63 6e 74 20 29 7b 0a 20 20 20 20 40 20 3c 2f 75  cnt ){.    @ </u
22c0: 6c 3e 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  l>.  }.}.../*.**
22d0: 20 57 45 42 50 41 47 45 3a 20 76 69 6e 66 6f 0a   WEBPAGE: vinfo.
22e0: 2a 2a 20 55 52 4c 3a 20 20 2f 76 69 6e 66 6f 3f  ** URL:  /vinfo?
22f0: 6e 61 6d 65 3d 52 49 44 7c 41 52 54 49 46 41 43  name=RID|ARTIFAC
2300: 54 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TID.**.** Return
2310: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
2320: 75 74 20 61 20 62 61 73 65 6c 69 6e 65 0a 2a 2f  ut a baseline.*/
2330: 0a 76 6f 69 64 20 76 69 6e 66 6f 5f 70 61 67 65  .void vinfo_page
2340: 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71  (void){.  Stmt q
2350: 3b 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 69  ;.  int rid;.  i
2360: 6e 74 20 69 73 4c 65 61 66 3b 0a 0a 20 20 6c 6f  nt isLeaf;..  lo
2370: 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e  gin_check_creden
2380: 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21  tials();.  if( !
2390: 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c 6f 67 69  g.okRead ){ logi
23a0: 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75  n_needed(); retu
23b0: 72 6e 3b 20 7d 0a 20 20 72 69 64 20 3d 20 6e 61  rn; }.  rid = na
23c0: 6d 65 5f 74 6f 5f 72 69 64 28 50 44 28 22 6e 61  me_to_rid(PD("na
23d0: 6d 65 22 2c 22 30 22 29 29 3b 0a 20 20 69 66 28  me","0"));.  if(
23e0: 20 72 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73   rid==0 ){.    s
23f0: 74 79 6c 65 5f 68 65 61 64 65 72 28 22 43 68 65  tyle_header("Che
2400: 63 6b 2d 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f  ck-in Informatio
2410: 6e 20 45 72 72 6f 72 22 29 3b 0a 20 20 20 20 40  n Error");.    @
2420: 20 4e 6f 20 73 75 63 68 20 6f 62 6a 65 63 74 3a   No such object:
2430: 20 25 68 28 67 2e 61 72 67 76 5b 32 5d 29 0a 20   %h(g.argv[2]). 
2440: 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28     style_footer(
2450: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2460: 20 7d 0a 20 20 69 73 4c 65 61 66 20 3d 20 21 64   }.  isLeaf = !d
2470: 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54  b_exists("SELECT
2480: 20 31 20 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48   1 FROM plink WH
2490: 45 52 45 20 70 69 64 3d 25 64 22 2c 20 72 69 64  ERE pid=%d", rid
24a0: 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28  );.  db_prepare(
24b0: 26 71 2c 20 0a 20 20 20 20 20 22 53 45 4c 45 43  &q, .     "SELEC
24c0: 54 20 75 75 69 64 2c 20 64 61 74 65 74 69 6d 65  T uuid, datetime
24d0: 28 6d 74 69 6d 65 2c 20 27 6c 6f 63 61 6c 74 69  (mtime, 'localti
24e0: 6d 65 27 29 2c 20 75 73 65 72 2c 20 63 6f 6d 6d  me'), user, comm
24f0: 65 6e 74 22 0a 20 20 20 20 20 22 20 20 46 52 4f  ent".     "  FRO
2500: 4d 20 62 6c 6f 62 2c 20 65 76 65 6e 74 22 0a 20  M blob, event". 
2510: 20 20 20 20 22 20 57 48 45 52 45 20 62 6c 6f 62      " WHERE blob
2520: 2e 72 69 64 3d 25 64 22 0a 20 20 20 20 20 22 20  .rid=%d".     " 
2530: 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69    AND event.obji
2540: 64 3d 25 64 22 2c 0a 20 20 20 20 20 72 69 64 2c  d=%d",.     rid,
2550: 20 72 69 64 0a 20 20 29 3b 0a 20 20 69 66 28 20   rid.  );.  if( 
2560: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c  db_step(&q)==SQL
2570: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
2580: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64  onst char *zUuid
2590: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
25a0: 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 63 68  t(&q, 0);.    ch
25b0: 61 72 20 2a 7a 54 69 74 6c 65 20 3d 20 6d 70 72  ar *zTitle = mpr
25c0: 69 6e 74 66 28 22 43 68 65 63 6b 2d 69 6e 20 5b  intf("Check-in [
25d0: 25 2e 31 30 73 5d 22 2c 20 7a 55 75 69 64 29 3b  %.10s]", zUuid);
25e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 55 73 65  .    char *zEUse
25f0: 72 2c 20 2a 7a 45 43 6f 6d 6d 65 6e 74 3b 0a 20  r, *zEComment;. 
2600: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2610: 55 73 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  User;.    const 
2620: 63 68 61 72 20 2a 7a 43 6f 6d 6d 65 6e 74 3b 0a  char *zComment;.
2630: 20 20 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72      style_header
2640: 28 7a 54 69 74 6c 65 29 3b 0a 20 20 20 20 6c 6f  (zTitle);.    lo
2650: 67 69 6e 5f 61 6e 6f 6e 79 6d 6f 75 73 5f 61 76  gin_anonymous_av
2660: 61 69 6c 61 62 6c 65 28 29 3b 0a 20 20 20 20 66  ailable();.    f
2670: 72 65 65 28 7a 54 69 74 6c 65 29 3b 0a 20 20 20  ree(zTitle);.   
2680: 20 7a 45 55 73 65 72 20 3d 20 64 62 5f 74 65 78   zEUser = db_tex
2690: 74 28 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t(0,.           
26a0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
26b0: 76 61 6c 75 65 20 46 52 4f 4d 20 74 61 67 78 72  value FROM tagxr
26c0: 65 66 20 57 48 45 52 45 20 74 61 67 69 64 3d 25  ef WHERE tagid=%
26d0: 64 20 41 4e 44 20 72 69 64 3d 25 64 22 2c 0a 20  d AND rid=%d",. 
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 20 20 20 54 41 47 5f 55 53 45 52 2c 20 72 69 64     TAG_USER, rid
2700: 29 3b 0a 20 20 20 20 7a 45 43 6f 6d 6d 65 6e 74  );.    zEComment
2710: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 0a 20   = db_text(0, . 
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20    "SELECT value 
2740: 46 52 4f 4d 20 74 61 67 78 72 65 66 20 57 48 45  FROM tagxref WHE
2750: 52 45 20 74 61 67 69 64 3d 25 64 20 41 4e 44 20  RE tagid=%d AND 
2760: 72 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 20  rid=%d",.       
2770: 20 20 20 20 20 20 20 20 20 20 20 20 54 41 47 5f              TAG_
2780: 43 4f 4d 4d 45 4e 54 2c 20 72 69 64 29 3b 0a 20  COMMENT, rid);. 
2790: 20 20 20 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f     zUser = db_co
27a0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29  lumn_text(&q, 2)
27b0: 3b 0a 20 20 20 20 7a 43 6f 6d 6d 65 6e 74 20 3d  ;.    zComment =
27c0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
27d0: 26 71 2c 20 33 29 3b 0a 20 20 20 20 40 20 3c 64  &q, 3);.    @ <d
27e0: 69 76 20 63 6c 61 73 73 3d 22 73 65 63 74 69 6f  iv class="sectio
27f0: 6e 22 3e 4f 76 65 72 76 69 65 77 3c 2f 64 69 76  n">Overview</div
2800: 3e 0a 20 20 20 20 40 20 3c 70 3e 3c 74 61 62 6c  >.    @ <p><tabl
2810: 65 20 63 6c 61 73 73 3d 22 6c 61 62 65 6c 2d 76  e class="label-v
2820: 61 6c 75 65 22 3e 0a 20 20 20 20 40 20 3c 74 72  alue">.    @ <tr
2830: 3e 3c 74 68 3e 53 48 41 31 26 6e 62 73 70 3b 48  ><th>SHA1&nbsp;H
2840: 61 73 68 3a 3c 2f 74 68 3e 3c 74 64 3e 25 73 28  ash:</th><td>%s(
2850: 7a 55 75 69 64 29 3c 2f 74 64 3e 3c 2f 74 72 3e  zUuid)</td></tr>
2860: 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 44  .    @ <tr><th>D
2870: 61 74 65 3a 3c 2f 74 68 3e 3c 74 64 3e 25 73 28  ate:</th><td>%s(
2880: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
2890: 71 2c 20 31 29 29 3c 2f 74 64 3e 3c 2f 74 72 3e  q, 1))</td></tr>
28a0: 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 53 65 74  .    if( g.okSet
28b0: 75 70 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 74  up ){.      @ <t
28c0: 72 3e 3c 74 68 3e 52 65 63 6f 72 64 20 49 44 3a  r><th>Record ID:
28d0: 3c 2f 74 68 3e 3c 74 64 3e 25 64 28 72 69 64 29  </th><td>%d(rid)
28e0: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 7d  </td></tr>.    }
28f0: 0a 20 20 20 20 69 66 28 20 7a 45 55 73 65 72 20  .    if( zEUser 
2900: 29 7b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c  ){.      @ <tr><
2910: 74 68 3e 45 64 69 74 65 64 26 6e 62 73 70 3b 55  th>Edited&nbsp;U
2920: 73 65 72 3a 3c 2f 74 64 3e 3c 74 64 3e 25 68 28  ser:</td><td>%h(
2930: 7a 45 55 73 65 72 29 3c 2f 74 64 3e 3c 2f 74 72  zEUser)</td></tr
2940: 3e 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74  >.      @ <tr><t
2950: 68 3e 4f 72 69 67 69 6e 61 6c 26 6e 62 73 70 3b  h>Original&nbsp;
2960: 55 73 65 72 3a 3c 2f 74 68 3e 3c 74 64 3e 25 68  User:</th><td>%h
2970: 28 7a 55 73 65 72 29 3c 2f 74 64 3e 3c 2f 74 72  (zUser)</td></tr
2980: 3e 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  >.    }else{.   
2990: 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 55 73 65     @ <tr><th>Use
29a0: 72 3a 3c 2f 74 64 3e 3c 74 64 3e 25 68 28 7a 55  r:</td><td>%h(zU
29b0: 73 65 72 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20  ser)</td></tr>. 
29c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 43     }.    if( zEC
29d0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
29e0: 40 20 3c 74 72 3e 3c 74 68 3e 45 64 69 74 65 64  @ <tr><th>Edited
29f0: 26 6e 62 73 70 3b 43 6f 6d 6d 65 6e 74 3a 3c 2f  &nbsp;Comment:</
2a00: 74 68 3e 3c 74 64 3e 25 77 28 7a 45 43 6f 6d 6d  th><td>%w(zEComm
2a10: 65 6e 74 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20  ent)</td></tr>. 
2a20: 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 4f       @ <tr><th>O
2a30: 72 69 67 69 6e 61 6c 26 6e 62 73 70 3b 43 6f 6d  riginal&nbsp;Com
2a40: 6d 65 6e 74 3a 3c 2f 74 68 3e 3c 74 64 3e 25 77  ment:</th><td>%w
2a50: 28 7a 43 6f 6d 6d 65 6e 74 29 3c 2f 74 64 3e 3c  (zComment)</td><
2a60: 2f 74 72 3e 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  /tr>.    }else{.
2a70: 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e        @ <tr><th>
2a80: 43 6f 6d 6d 65 6e 74 3a 3c 2f 74 68 3e 3c 74 64  Comment:</th><td
2a90: 3e 25 77 28 7a 43 6f 6d 6d 65 6e 74 29 3c 2f 74  >%w(zComment)</t
2aa0: 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 7d 0a 20 20  d></tr>.    }.  
2ab0: 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20    @ </td></tr>. 
2ac0: 20 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f     if( g.okHisto
2ad0: 72 79 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ry ){.      char
2ae0: 20 2a 7a 53 68 6f 72 74 55 75 69 64 20 3d 20 6d   *zShortUuid = m
2af0: 70 72 69 6e 74 66 28 22 25 2e 31 30 73 22 2c 20  printf("%.10s", 
2b00: 7a 55 75 69 64 29 3b 0a 20 20 20 20 20 20 63 6f  zUuid);.      co
2b10: 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 6f 6a 4e  nst char *zProjN
2b20: 61 6d 65 20 3d 20 64 62 5f 67 65 74 28 22 70 72  ame = db_get("pr
2b30: 6f 6a 65 63 74 2d 6e 61 6d 65 22 2c 20 22 75 6e  oject-name", "un
2b40: 6e 61 6d 65 64 22 29 3b 0a 20 20 20 20 20 20 53  named");.      S
2b50: 74 6d 74 20 71 3b 0a 20 20 20 20 20 20 40 20 3c  tmt q;.      @ <
2b60: 74 72 3e 3c 74 68 3e 54 69 6d 65 6c 69 6e 65 73  tr><th>Timelines
2b70: 3a 3c 2f 74 68 3e 3c 74 64 3e 0a 20 20 20 20 20  :</th><td>.     
2b80: 20 40 20 20 20 20 3c 61 20 68 72 65 66 3d 22 25   @    <a href="%
2b90: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 74 69  s(g.zBaseURL)/ti
2ba0: 6d 65 6c 69 6e 65 3f 70 3d 25 64 28 72 69 64 29  meline?p=%d(rid)
2bb0: 22 3e 61 6e 63 65 73 74 6f 72 73 3c 2f 61 3e 0a  ">ancestors</a>.
2bc0: 20 20 20 20 20 20 40 20 20 20 20 7c 20 3c 61 20        @    | <a 
2bd0: 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65  href="%s(g.zBase
2be0: 55 52 4c 29 2f 74 69 6d 65 6c 69 6e 65 3f 64 3d  URL)/timeline?d=
2bf0: 25 64 28 72 69 64 29 22 3e 64 65 73 63 65 6e 64  %d(rid)">descend
2c00: 61 6e 74 73 3c 2f 61 3e 0a 20 20 20 20 20 20 40  ants</a>.      @
2c10: 20 20 20 20 7c 20 3c 61 20 68 72 65 66 3d 22 25      | <a href="%
2c20: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 74 69  s(g.zBaseURL)/ti
2c30: 6d 65 6c 69 6e 65 3f 64 3d 25 64 28 72 69 64 29  meline?d=%d(rid)
2c40: 26 70 3d 25 64 28 72 69 64 29 22 3e 62 6f 74 68  &p=%d(rid)">both
2c50: 3c 2f 61 3e 0a 20 20 20 20 20 20 64 62 5f 70 72  </a>.      db_pr
2c60: 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43  epare(&q, "SELEC
2c70: 54 20 73 75 62 73 74 72 28 74 61 67 2e 74 61 67  T substr(tag.tag
2c80: 6e 61 6d 65 2c 35 29 20 46 52 4f 4d 20 74 61 67  name,5) FROM tag
2c90: 78 72 65 66 2c 20 74 61 67 20 22 0a 20 20 20 20  xref, tag ".    
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 22 20 57 48 45 52 45 20 72 69 64 3d 25 64 20   " WHERE rid=%d 
2cc0: 41 4e 44 20 74 61 67 74 79 70 65 3e 30 20 22 0a  AND tagtype>0 ".
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 20 20 20 20 20 22 20 20 20 41 4e 44 20 74 61 67       "   AND tag
2cf0: 2e 74 61 67 69 64 3d 74 61 67 78 72 65 66 2e 74  .tagid=tagxref.t
2d00: 61 67 69 64 20 22 0a 20 20 20 20 20 20 20 20 20  agid ".         
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20              "   
2d20: 41 4e 44 20 2b 74 61 67 2e 74 61 67 6e 61 6d 65  AND +tag.tagname
2d30: 20 47 4c 4f 42 20 27 73 79 6d 2d 2a 27 22 2c 20   GLOB 'sym-*'", 
2d40: 72 69 64 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  rid);.      whil
2d50: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
2d60: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
2d70: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2d80: 20 2a 7a 54 61 67 4e 61 6d 65 20 3d 20 64 62 5f   *zTagName = db_
2d90: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
2da0: 30 29 3b 0a 20 20 20 20 20 20 20 20 40 20 20 7c  0);.        @  |
2db0: 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a   <a href="%s(g.z
2dc0: 42 61 73 65 55 52 4c 29 2f 74 69 6d 65 6c 69 6e  BaseURL)/timelin
2dd0: 65 3f 74 3d 25 54 28 7a 54 61 67 4e 61 6d 65 29  e?t=%T(zTagName)
2de0: 22 3e 25 68 28 7a 54 61 67 4e 61 6d 65 29 3c 2f  ">%h(zTagName)</
2df0: 61 3e 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  a>.      }.     
2e00: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
2e10: 3b 0a 20 20 20 20 20 20 40 20 3c 2f 74 64 3e 3c  ;.      @ </td><
2e20: 2f 74 72 3e 0a 20 20 20 20 20 20 40 20 3c 74 72  /tr>.      @ <tr
2e30: 3e 3c 74 68 3e 43 6f 6d 6d 61 6e 64 73 3a 3c 2f  ><th>Commands:</
2e40: 74 68 3e 0a 20 20 20 20 20 20 40 20 20 20 3c 74  th>.      @   <t
2e50: 64 3e 0a 20 20 20 20 20 20 40 20 20 20 20 20 3c  d>.      @     <
2e60: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
2e70: 73 65 55 52 4c 29 2f 76 64 69 66 66 2f 25 64 28  seURL)/vdiff/%d(
2e80: 72 69 64 29 22 3e 64 69 66 66 3c 2f 61 3e 0a 20  rid)">diff</a>. 
2e90: 20 20 20 20 20 40 20 20 20 20 20 7c 20 3c 61 20       @     | <a 
2ea0: 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65  href="%s(g.zBase
2eb0: 55 52 4c 29 2f 7a 69 70 2f 25 73 28 7a 50 72 6f  URL)/zip/%s(zPro
2ec0: 6a 4e 61 6d 65 29 2d 25 73 28 7a 53 68 6f 72 74  jName)-%s(zShort
2ed0: 55 75 69 64 29 2e 7a 69 70 3f 75 75 69 64 3d 25  Uuid).zip?uuid=%
2ee0: 73 28 7a 55 75 69 64 29 22 3e 0a 20 20 20 20 20  s(zUuid)">.     
2ef0: 20 40 20 20 20 20 20 20 20 20 20 5a 49 50 20 61   @         ZIP a
2f00: 72 63 68 69 76 65 3c 2f 61 3e 0a 20 20 20 20 20  rchive</a>.     
2f10: 20 40 20 20 20 20 20 7c 20 3c 61 20 68 72 65 66   @     | <a href
2f20: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
2f30: 2f 61 72 74 69 66 61 63 74 2f 25 64 28 72 69 64  /artifact/%d(rid
2f40: 29 22 3e 6d 61 6e 69 66 65 73 74 3c 2f 61 3e 0a  )">manifest</a>.
2f50: 20 20 20 20 20 20 69 66 28 20 67 2e 6f 6b 57 72        if( g.okWr
2f60: 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 40  ite ){.        @
2f70: 20 20 20 20 20 7c 20 3c 61 20 68 72 65 66 3d 22       | <a href="
2f80: 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 76  %s(g.zBaseURL)/v
2f90: 65 64 69 74 3f 72 3d 25 64 28 72 69 64 29 22 3e  edit?r=%d(rid)">
2fa0: 65 64 69 74 3c 2f 61 3e 0a 20 20 20 20 20 20 7d  edit</a>.      }
2fb0: 0a 20 20 20 20 20 20 40 20 20 20 3c 2f 74 64 3e  .      @   </td>
2fc0: 0a 20 20 20 20 20 20 40 20 3c 2f 74 72 3e 0a 20  .      @ </tr>. 
2fd0: 20 20 20 20 20 66 72 65 65 28 7a 53 68 6f 72 74       free(zShort
2fe0: 55 75 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Uuid);.    }.   
2ff0: 20 40 20 3c 2f 74 61 62 6c 65 3e 3c 2f 70 3e 0a   @ </table></p>.
3000: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 79    }else{.    sty
3010: 6c 65 5f 68 65 61 64 65 72 28 22 42 61 73 65 6c  le_header("Basel
3020: 69 6e 65 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 22  ine Information"
3030: 29 3b 0a 20 20 20 20 6c 6f 67 69 6e 5f 61 6e 6f  );.    login_ano
3040: 6e 79 6d 6f 75 73 5f 61 76 61 69 6c 61 62 6c 65  nymous_available
3050: 28 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e  ();.  }.  db_fin
3060: 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 73 68 6f  alize(&q);.  sho
3070: 77 54 61 67 73 28 72 69 64 2c 20 22 22 29 3b 0a  wTags(rid, "");.
3080: 20 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22    @ <div class="
3090: 73 65 63 74 69 6f 6e 22 3e 46 69 6c 65 20 43 68  section">File Ch
30a0: 61 6e 67 65 73 3c 2f 64 69 76 3e 0a 20 20 40 20  anges</div>.  @ 
30b0: 3c 75 6c 3e 0a 20 20 64 62 5f 70 72 65 70 61 72  <ul>.  db_prepar
30c0: 65 28 26 71 2c 20 0a 20 20 20 20 20 22 53 45 4c  e(&q, .     "SEL
30d0: 45 43 54 20 61 2e 6e 61 6d 65 2c 20 62 2e 6e 61  ECT a.name, b.na
30e0: 6d 65 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d  me".     "  FROM
30f0: 20 6d 6c 69 6e 6b 2c 20 66 69 6c 65 6e 61 6d 65   mlink, filename
3100: 20 41 53 20 61 2c 20 66 69 6c 65 6e 61 6d 65 20   AS a, filename 
3110: 41 53 20 62 22 0a 20 20 20 20 20 22 20 57 48 45  AS b".     " WHE
3120: 52 45 20 6d 69 64 3d 25 64 22 0a 20 20 20 20 20  RE mid=%d".     
3130: 22 20 20 20 41 4e 44 20 61 2e 66 6e 69 64 3d 6d  "   AND a.fnid=m
3140: 6c 69 6e 6b 2e 66 6e 69 64 22 0a 20 20 20 20 20  link.fnid".     
3150: 22 20 20 20 41 4e 44 20 62 2e 66 6e 69 64 3d 6d  "   AND b.fnid=m
3160: 6c 69 6e 6b 2e 70 66 6e 69 64 22 2c 0a 20 20 20  link.pfnid",.   
3170: 20 20 72 69 64 0a 20 20 29 3b 0a 20 20 77 68 69    rid.  );.  whi
3180: 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d  le( db_step(&q)=
3190: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
31a0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
31b0: 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  Name = db_column
31c0: 5f 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20  _text(&q, 0);.  
31d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
31e0: 72 69 6f 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  rior = db_column
31f0: 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20  _text(&q, 1);.  
3200: 20 20 40 20 3c 6c 69 3e 3c 62 3e 52 65 6e 61 6d    @ <li><b>Renam
3210: 65 64 3a 3c 2f 62 3e 0a 20 20 20 20 69 66 28 20  ed:</b>.    if( 
3220: 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20  g.okHistory ){. 
3230: 20 20 20 20 20 40 20 3c 61 20 68 72 65 66 3d 22       @ <a href="
3240: 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 66  %s(g.zBaseURL)/f
3250: 69 6e 66 6f 3f 6e 61 6d 65 3d 25 54 28 7a 4e 61  info?name=%T(zNa
3260: 6d 65 29 22 3e 25 68 28 7a 50 72 69 6f 72 29 3c  me)">%h(zPrior)<
3270: 2f 61 3e 20 74 6f 0a 20 20 20 20 20 20 40 20 3c  /a> to.      @ <
3280: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
3290: 73 65 55 52 4c 29 2f 66 69 6e 66 6f 3f 6e 61 6d  seURL)/finfo?nam
32a0: 65 3d 25 54 28 7a 4e 61 6d 65 29 22 3e 25 68 28  e=%T(zName)">%h(
32b0: 7a 4e 61 6d 65 29 3c 2f 61 3e 3c 2f 6c 69 3e 0a  zName)</a></li>.
32c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32d0: 20 40 20 25 68 28 7a 50 72 69 6f 72 29 20 74 6f   @ %h(zPrior) to
32e0: 20 25 68 28 7a 4e 61 6d 65 29 3c 2f 6c 69 3e 0a   %h(zName)</li>.
32f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 66      }.  }.  db_f
3300: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 64  inalize(&q);.  d
3310: 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 0a 20  b_prepare(&q, . 
3320: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
3330: 2c 20 70 69 64 2c 20 66 69 64 20 22 0a 20 20 20  , pid, fid ".   
3340: 20 20 22 20 20 46 52 4f 4d 20 6d 6c 69 6e 6b 2c    "  FROM mlink,
3350: 20 66 69 6c 65 6e 61 6d 65 22 0a 20 20 20 20 20   filename".     
3360: 22 20 57 48 45 52 45 20 6d 69 64 3d 25 64 22 0a  " WHERE mid=%d".
3370: 20 20 20 20 20 22 20 20 20 41 4e 44 20 66 69 64       "   AND fid
3380: 21 3d 70 69 64 22 0a 20 20 20 20 20 22 20 20 20  !=pid".     "   
3390: 41 4e 44 20 66 69 6c 65 6e 61 6d 65 2e 66 6e 69  AND filename.fni
33a0: 64 3d 6d 6c 69 6e 6b 2e 66 6e 69 64 22 2c 0a 20  d=mlink.fnid",. 
33b0: 20 20 20 20 72 69 64 0a 20 20 29 3b 0a 20 20 77      rid.  );.  w
33c0: 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71  hile( db_step(&q
33d0: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
33e0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
33f0: 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75  *zName = db_colu
3400: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b 0a  mn_text(&q, 0);.
3410: 20 20 20 20 69 6e 74 20 70 69 64 20 3d 20 64 62      int pid = db
3420: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20  _column_int(&q, 
3430: 31 29 3b 0a 20 20 20 20 69 6e 74 20 66 69 64 20  1);.    int fid 
3440: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  = db_column_int(
3450: 26 71 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20  &q, 2);.    if( 
3460: 70 69 64 20 26 26 20 66 69 64 20 29 7b 0a 20 20  pid && fid ){.  
3470: 20 20 20 20 40 20 3c 6c 69 3e 3c 62 3e 4d 6f 64      @ <li><b>Mod
3480: 69 66 69 65 64 3a 3c 2f 62 3e 0a 20 20 20 20 7d  ified:</b>.    }
3490: 65 6c 73 65 20 69 66 28 20 66 69 64 20 29 7b 0a  else if( fid ){.
34a0: 20 20 20 20 20 20 40 20 3c 6c 69 3e 3c 62 3e 41        @ <li><b>A
34b0: 64 64 65 64 3a 3c 2f 62 3e 0a 20 20 20 20 7d 65  dded:</b>.    }e
34c0: 6c 73 65 20 69 66 28 20 70 69 64 20 29 7b 0a 20  lse if( pid ){. 
34d0: 20 20 20 20 20 40 20 3c 6c 69 3e 3c 62 3e 44 65       @ <li><b>De
34e0: 6c 65 74 65 64 3a 3c 2f 62 3e 0a 20 20 20 20 7d  leted:</b>.    }
34f0: 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 48 69 73  .    if( g.okHis
3500: 74 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 40 20  tory ){.      @ 
3510: 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42  <a href="%s(g.zB
3520: 61 73 65 55 52 4c 29 2f 66 69 6e 66 6f 3f 6e 61  aseURL)/finfo?na
3530: 6d 65 3d 25 54 28 7a 4e 61 6d 65 29 22 3e 25 68  me=%T(zName)">%h
3540: 28 7a 4e 61 6d 65 29 3c 2f 61 3e 3c 2f 6c 69 3e  (zName)</a></li>
3550: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3560: 20 20 40 20 25 68 28 7a 4e 61 6d 65 29 3c 2f 6c    @ %h(zName)</l
3570: 69 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 40  i>.    }.  }.  @
3580: 20 3c 2f 75 6c 3e 0a 20 20 63 6f 6d 70 75 74 65   </ul>.  compute
3590: 5f 6c 65 61 76 65 73 28 72 69 64 2c 20 30 29 3b  _leaves(rid, 0);
35a0: 0a 20 20 73 68 6f 77 44 65 73 63 65 6e 64 61 6e  .  showDescendan
35b0: 74 73 28 72 69 64 2c 20 32 2c 20 22 44 65 73 63  ts(rid, 2, "Desc
35c0: 65 6e 64 61 6e 74 73 22 29 3b 0a 20 20 73 68 6f  endants");.  sho
35d0: 77 4c 65 61 76 65 73 28 29 3b 0a 20 20 73 68 6f  wLeaves();.  sho
35e0: 77 41 6e 63 65 73 74 6f 72 73 28 72 69 64 2c 20  wAncestors(rid, 
35f0: 32 2c 20 22 41 6e 63 65 73 74 6f 72 73 22 29 3b  2, "Ancestors");
3600: 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28  .  style_footer(
3610: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50  );.}../*.** WEBP
3620: 41 47 45 3a 20 77 69 6e 66 6f 0a 2a 2a 20 55 52  AGE: winfo.** UR
3630: 4c 3a 20 20 2f 77 69 6e 66 6f 3f 6e 61 6d 65 3d  L:  /winfo?name=
3640: 52 49 44 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  RID.**.** Return
3650: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
3660: 75 74 20 61 20 77 69 6b 69 20 70 61 67 65 2e 0a  ut a wiki page..
3670: 2a 2f 0a 76 6f 69 64 20 77 69 6e 66 6f 5f 70 61  */.void winfo_pa
3680: 67 65 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74  ge(void){.  Stmt
3690: 20 71 3b 0a 20 20 69 6e 74 20 72 69 64 3b 0a 0a   q;.  int rid;..
36a0: 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72    login_check_cr
36b0: 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69  edentials();.  i
36c0: 66 28 20 21 67 2e 6f 6b 52 64 57 69 6b 69 20 29  f( !g.okRdWiki )
36d0: 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29  { login_needed()
36e0: 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 72 69  ; return; }.  ri
36f0: 64 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 28  d = name_to_rid(
3700: 50 44 28 22 6e 61 6d 65 22 2c 22 30 22 29 29 3b  PD("name","0"));
3710: 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20 29 7b  .  if( rid==0 ){
3720: 0a 20 20 20 20 73 74 79 6c 65 5f 68 65 61 64 65  .    style_heade
3730: 72 28 22 57 69 6b 69 20 50 61 67 65 20 49 6e 66  r("Wiki Page Inf
3740: 6f 72 6d 61 74 69 6f 6e 20 45 72 72 6f 72 22 29  ormation Error")
3750: 3b 0a 20 20 20 20 40 20 4e 6f 20 73 75 63 68 20  ;.    @ No such 
3760: 6f 62 6a 65 63 74 3a 20 25 68 28 67 2e 61 72 67  object: %h(g.arg
3770: 76 5b 32 5d 29 0a 20 20 20 20 73 74 79 6c 65 5f  v[2]).    style_
3780: 66 6f 6f 74 65 72 28 29 3b 0a 20 20 20 20 72 65  footer();.    re
3790: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62 5f 70  turn;.  }.  db_p
37a0: 72 65 70 61 72 65 28 26 71 2c 20 0a 20 20 20 20  repare(&q, .    
37b0: 20 22 53 45 4c 45 43 54 20 73 75 62 73 74 72 28   "SELECT substr(
37c0: 74 61 67 6e 61 6d 65 2c 20 36 2c 20 31 30 30 30  tagname, 6, 1000
37d0: 29 2c 20 75 75 69 64 2c 22 0a 20 20 20 20 20 22  ), uuid,".     "
37e0: 20 20 20 20 20 20 20 64 61 74 65 74 69 6d 65 28         datetime(
37f0: 65 76 65 6e 74 2e 6d 74 69 6d 65 2c 20 27 6c 6f  event.mtime, 'lo
3800: 63 61 6c 74 69 6d 65 27 29 2c 20 75 73 65 72 22  caltime'), user"
3810: 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20 74 61  .     "  FROM ta
3820: 67 78 72 65 66 2c 20 74 61 67 2c 20 62 6c 6f 62  gxref, tag, blob
3830: 2c 20 65 76 65 6e 74 22 0a 20 20 20 20 20 22 20  , event".     " 
3840: 57 48 45 52 45 20 74 61 67 78 72 65 66 2e 72 69  WHERE tagxref.ri
3850: 64 3d 25 64 22 0a 20 20 20 20 20 22 20 20 20 41  d=%d".     "   A
3860: 4e 44 20 74 61 67 2e 74 61 67 69 64 3d 74 61 67  ND tag.tagid=tag
3870: 78 72 65 66 2e 74 61 67 69 64 22 0a 20 20 20 20  xref.tagid".    
3880: 20 22 20 20 20 41 4e 44 20 74 61 67 2e 74 61 67   "   AND tag.tag
3890: 6e 61 6d 65 20 4c 49 4b 45 20 27 77 69 6b 69 2d  name LIKE 'wiki-
38a0: 25 25 27 22 0a 20 20 20 20 20 22 20 20 20 41 4e  %%'".     "   AN
38b0: 44 20 62 6c 6f 62 2e 72 69 64 3d 25 64 22 0a 20  D blob.rid=%d". 
38c0: 20 20 20 20 22 20 20 20 41 4e 44 20 65 76 65 6e      "   AND even
38d0: 74 2e 6f 62 6a 69 64 3d 25 64 22 2c 0a 20 20 20  t.objid=%d",.   
38e0: 20 20 72 69 64 2c 20 72 69 64 2c 20 72 69 64 0a    rid, rid, rid.
38f0: 20 20 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74    );.  if( db_st
3900: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
3910: 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OW ){.    const 
3920: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 64 62  char *zName = db
3930: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
3940: 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   0);.    const c
3950: 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f  har *zUuid = db_
3960: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
3970: 31 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  1);.    char *zT
3980: 69 74 6c 65 20 3d 20 6d 70 72 69 6e 74 66 28 22  itle = mprintf("
3990: 57 69 6b 69 20 50 61 67 65 20 25 73 22 2c 20 7a  Wiki Page %s", z
39a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 73 74 79 6c 65  Name);.    style
39b0: 5f 68 65 61 64 65 72 28 7a 54 69 74 6c 65 29 3b  _header(zTitle);
39c0: 0a 20 20 20 20 66 72 65 65 28 7a 54 69 74 6c 65  .    free(zTitle
39d0: 29 3b 0a 20 20 20 20 6c 6f 67 69 6e 5f 61 6e 6f  );.    login_ano
39e0: 6e 79 6d 6f 75 73 5f 61 76 61 69 6c 61 62 6c 65  nymous_available
39f0: 28 29 3b 0a 20 20 20 20 40 20 3c 64 69 76 20 63  ();.    @ <div c
3a00: 6c 61 73 73 3d 22 73 65 63 74 69 6f 6e 22 3e 4f  lass="section">O
3a10: 76 65 72 76 69 65 77 3c 2f 64 69 76 3e 0a 20 20  verview</div>.  
3a20: 20 20 40 20 3c 70 3e 3c 74 61 62 6c 65 20 63 6c    @ <p><table cl
3a30: 61 73 73 3d 22 6c 61 62 65 6c 2d 76 61 6c 75 65  ass="label-value
3a40: 22 3e 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 68  ">.    @ <tr><th
3a50: 3e 56 65 72 73 69 6f 6e 3a 3c 2f 74 68 3e 3c 74  >Version:</th><t
3a60: 64 3e 25 73 28 7a 55 75 69 64 29 3c 2f 74 64 3e  d>%s(zUuid)</td>
3a70: 3c 2f 74 72 3e 0a 20 20 20 20 40 20 3c 74 72 3e  </tr>.    @ <tr>
3a80: 3c 74 68 3e 44 61 74 65 3a 3c 2f 74 68 3e 3c 74  <th>Date:</th><t
3a90: 64 3e 25 73 28 64 62 5f 63 6f 6c 75 6d 6e 5f 74  d>%s(db_column_t
3aa0: 65 78 74 28 26 71 2c 20 32 29 29 3c 2f 74 64 3e  ext(&q, 2))</td>
3ab0: 3c 2f 74 72 3e 0a 20 20 20 20 69 66 28 20 67 2e  </tr>.    if( g.
3ac0: 6f 6b 53 65 74 75 70 20 29 7b 0a 20 20 20 20 20  okSetup ){.     
3ad0: 20 40 20 3c 74 72 3e 3c 74 68 3e 52 65 63 6f 72   @ <tr><th>Recor
3ae0: 64 20 49 44 3a 3c 2f 74 68 3e 3c 74 64 3e 25 64  d ID:</th><td>%d
3af0: 28 72 69 64 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a  (rid)</td></tr>.
3b00: 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 74 72 3e      }.    @ <tr>
3b10: 3c 74 68 3e 4f 72 69 67 69 6e 61 6c 26 6e 62 73  <th>Original&nbs
3b20: 70 3b 55 73 65 72 3a 3c 2f 74 68 3e 3c 74 64 3e  p;User:</th><td>
3b30: 25 73 28 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78  %s(db_column_tex
3b40: 74 28 26 71 2c 20 33 29 29 3c 2f 74 64 3e 3c 2f  t(&q, 3))</td></
3b50: 74 72 3e 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b  tr>.    if( g.ok
3b60: 48 69 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 20  History ){.     
3b70: 20 40 20 3c 74 72 3e 3c 74 68 3e 43 6f 6d 6d 61   @ <tr><th>Comma
3b80: 6e 64 73 3a 3c 2f 74 68 3e 0a 20 20 20 20 20 20  nds:</th>.      
3b90: 40 20 20 20 3c 74 64 3e 0a 20 20 20 20 20 20 2f  @   <td>.      /
3ba0: 2a 20 40 20 20 20 20 20 3c 61 20 68 72 65 66 3d  * @     <a href=
3bb0: 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f  "%s(g.zBaseURL)/
3bc0: 77 64 69 66 66 2f 25 64 28 72 69 64 29 22 3e 64  wdiff/%d(rid)">d
3bd0: 69 66 66 3c 2f 61 3e 20 7c 20 2a 2f 0a 20 20 20  iff</a> | */.   
3be0: 20 20 20 40 20 20 20 20 20 3c 61 20 68 72 65 66     @     <a href
3bf0: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
3c00: 2f 77 68 69 73 74 6f 72 79 3f 6e 61 6d 65 3d 25  /whistory?name=%
3c10: 74 28 7a 4e 61 6d 65 29 22 3e 68 69 73 74 6f 72  t(zName)">histor
3c20: 79 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 20 20  y</a>.      @   
3c30: 20 20 7c 20 3c 61 20 68 72 65 66 3d 22 25 73 28    | <a href="%s(
3c40: 67 2e 7a 42 61 73 65 55 52 4c 29 2f 61 72 74 69  g.zBaseURL)/arti
3c50: 66 61 63 74 2f 25 64 28 72 69 64 29 22 3e 72 61  fact/%d(rid)">ra
3c60: 77 2d 74 65 78 74 3c 2f 61 3e 0a 20 20 20 20 20  w-text</a>.     
3c70: 20 40 20 20 20 3c 2f 74 64 3e 0a 20 20 20 20 20   @   </td>.     
3c80: 20 40 20 3c 2f 74 72 3e 0a 20 20 20 20 7d 0a 20   @ </tr>.    }. 
3c90: 20 20 20 40 20 3c 2f 74 61 62 6c 65 3e 3c 2f 70     @ </table></p
3ca0: 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  >.  }else{.    s
3cb0: 74 79 6c 65 5f 68 65 61 64 65 72 28 22 57 69 6b  tyle_header("Wik
3cc0: 69 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 22 29 3b  i Information");
3cd0: 0a 20 20 20 20 72 69 64 20 3d 20 30 3b 0a 20 20  .    rid = 0;.  
3ce0: 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28  }.  db_finalize(
3cf0: 26 71 29 3b 0a 20 20 73 68 6f 77 54 61 67 73 28  &q);.  showTags(
3d00: 72 69 64 2c 20 22 77 69 6b 69 2d 2a 22 29 3b 0a  rid, "wiki-*");.
3d10: 20 20 69 66 28 20 72 69 64 20 29 7b 0a 20 20 20    if( rid ){.   
3d20: 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20   Blob content;. 
3d30: 20 20 20 4d 61 6e 69 66 65 73 74 20 6d 3b 0a 20     Manifest m;. 
3d40: 20 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c     memset(&m, 0,
3d50: 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 20   sizeof(m));.   
3d60: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6d 2e 63 6f   blob_zero(&m.co
3d70: 6e 74 65 6e 74 29 3b 0a 20 20 20 20 63 6f 6e 74  ntent);.    cont
3d80: 65 6e 74 5f 67 65 74 28 72 69 64 2c 20 26 63 6f  ent_get(rid, &co
3d90: 6e 74 65 6e 74 29 3b 0a 20 20 20 20 6d 61 6e 69  ntent);.    mani
3da0: 66 65 73 74 5f 70 61 72 73 65 28 26 6d 2c 20 26  fest_parse(&m, &
3db0: 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66  content);.    if
3dc0: 28 20 6d 2e 74 79 70 65 3d 3d 43 46 54 59 50 45  ( m.type==CFTYPE
3dd0: 5f 57 49 4b 49 20 29 7b 0a 20 20 20 20 20 20 42  _WIKI ){.      B
3de0: 6c 6f 62 20 77 69 6b 69 3b 0a 20 20 20 20 20 20  lob wiki;.      
3df0: 62 6c 6f 62 5f 69 6e 69 74 28 26 77 69 6b 69 2c  blob_init(&wiki,
3e00: 20 6d 2e 7a 57 69 6b 69 2c 20 2d 31 29 3b 0a 20   m.zWiki, -1);. 
3e10: 20 20 20 20 20 40 20 3c 64 69 76 20 63 6c 61 73       @ <div clas
3e20: 73 3d 22 73 65 63 74 69 6f 6e 22 3e 43 6f 6e 74  s="section">Cont
3e30: 65 6e 74 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20  ent</div>.      
3e40: 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28 26 77 69  wiki_convert(&wi
3e50: 6b 69 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ki, 0, 0);.     
3e60: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 77 69 6b   blob_reset(&wik
3e70: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61  i);.    }.    ma
3e80: 6e 69 66 65 73 74 5f 63 6c 65 61 72 28 26 6d 29  nifest_clear(&m)
3e90: 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 66 6f  ;.  }.  style_fo
3ea0: 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  oter();.}../*.**
3eb0: 20 57 45 42 50 41 47 45 3a 20 66 69 6e 66 6f 0a   WEBPAGE: finfo.
3ec0: 2a 2a 20 55 52 4c 3a 20 2f 66 69 6e 66 6f 3f 6e  ** URL: /finfo?n
3ed0: 61 6d 65 3d 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a  ame=FILENAME.**.
3ee0: 2a 2a 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70  ** Show the comp
3ef0: 6c 65 74 65 20 63 68 61 6e 67 65 20 68 69 73 74  lete change hist
3f00: 6f 72 79 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ory for a single
3f10: 20 66 69 6c 65 2e 20 0a 2a 2f 0a 76 6f 69 64 20   file. .*/.void 
3f20: 66 69 6e 66 6f 5f 70 61 67 65 28 76 6f 69 64 29  finfo_page(void)
3f30: 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 63 6f  {.  Stmt q;.  co
3f40: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
3f50: 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 50 72 65  ame;.  char zPre
3f60: 76 44 61 74 65 5b 32 30 5d 3b 0a 20 20 42 6c 6f  vDate[20];.  Blo
3f70: 62 20 74 69 74 6c 65 3b 0a 0a 20 20 6c 6f 67 69  b title;..  logi
3f80: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69  n_check_credenti
3f90: 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e  als();.  if( !g.
3fa0: 6f 6b 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f  okRead ){ login_
3fb0: 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e  needed(); return
3fc0: 3b 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61 64  ; }.  style_head
3fd0: 65 72 28 22 46 69 6c 65 20 48 69 73 74 6f 72 79  er("File History
3fe0: 22 29 3b 0a 20 20 6c 6f 67 69 6e 5f 61 6e 6f 6e  ");.  login_anon
3ff0: 79 6d 6f 75 73 5f 61 76 61 69 6c 61 62 6c 65 28  ymous_available(
4000: 29 3b 0a 0a 20 20 7a 50 72 65 76 44 61 74 65 5b  );..  zPrevDate[
4010: 30 5d 20 3d 20 30 3b 0a 20 20 7a 46 69 6c 65 6e  0] = 0;.  zFilen
4020: 61 6d 65 20 3d 20 50 44 28 22 6e 61 6d 65 22 2c  ame = PD("name",
4030: 22 22 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72  "");.  db_prepar
4040: 65 28 26 71 2c 0a 20 20 20 20 22 53 45 4c 45 43  e(&q,.    "SELEC
4050: 54 20 61 2e 75 75 69 64 2c 20 73 75 62 73 74 72  T a.uuid, substr
4060: 28 62 2e 75 75 69 64 2c 31 2c 31 30 29 2c 20 64  (b.uuid,1,10), d
4070: 61 74 65 74 69 6d 65 28 65 76 65 6e 74 2e 6d 74  atetime(event.mt
4080: 69 6d 65 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29  ime,'localtime')
4090: 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 63  ,".    "       c
40a0: 6f 61 6c 65 73 63 65 28 65 76 65 6e 74 2e 65 63  oalesce(event.ec
40b0: 6f 6d 6d 65 6e 74 2c 20 65 76 65 6e 74 2e 63 6f  omment, event.co
40c0: 6d 6d 65 6e 74 29 2c 22 0a 20 20 20 20 22 20 20  mment),".    "  
40d0: 20 20 20 20 20 63 6f 61 6c 65 73 63 65 28 65 76       coalesce(ev
40e0: 65 6e 74 2e 65 75 73 65 72 2c 20 65 76 65 6e 74  ent.euser, event
40f0: 2e 75 73 65 72 29 2c 22 0a 20 20 20 20 22 20 20  .user),".    "  
4100: 20 20 20 20 20 6d 6c 69 6e 6b 2e 70 69 64 2c 20       mlink.pid, 
4110: 6d 6c 69 6e 6b 2e 66 69 64 2c 20 6d 6c 69 6e 6b  mlink.fid, mlink
4120: 2e 6d 69 64 2c 20 6d 6c 69 6e 6b 2e 66 6e 69 64  .mid, mlink.fnid
4130: 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 6d 6c  ".    "  FROM ml
4140: 69 6e 6b 2c 20 62 6c 6f 62 20 61 2c 20 62 6c 6f  ink, blob a, blo
4150: 62 20 62 2c 20 65 76 65 6e 74 22 0a 20 20 20 20  b b, event".    
4160: 22 20 57 48 45 52 45 20 6d 6c 69 6e 6b 2e 66 6e  " WHERE mlink.fn
4170: 69 64 3d 28 53 45 4c 45 43 54 20 66 6e 69 64 20  id=(SELECT fnid 
4180: 46 52 4f 4d 20 66 69 6c 65 6e 61 6d 65 20 57 48  FROM filename WH
4190: 45 52 45 20 6e 61 6d 65 3d 25 51 29 22 0a 20 20  ERE name=%Q)".  
41a0: 20 20 22 20 20 20 41 4e 44 20 61 2e 72 69 64 3d    "   AND a.rid=
41b0: 6d 6c 69 6e 6b 2e 6d 69 64 22 0a 20 20 20 20 22  mlink.mid".    "
41c0: 20 20 20 41 4e 44 20 62 2e 72 69 64 3d 6d 6c 69     AND b.rid=mli
41d0: 6e 6b 2e 66 69 64 22 0a 20 20 20 20 22 20 20 20  nk.fid".    "   
41e0: 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64 3d  AND event.objid=
41f0: 6d 6c 69 6e 6b 2e 6d 69 64 22 0a 20 20 20 20 22  mlink.mid".    "
4200: 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 2e   ORDER BY event.
4210: 6d 74 69 6d 65 20 44 45 53 43 22 2c 0a 20 20 20  mtime DESC",.   
4220: 20 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 29 3b 0a   zFilename.  );.
4230: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 74 69 74    blob_zero(&tit
4240: 6c 65 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65  le);.  blob_appe
4250: 6e 64 66 28 26 74 69 74 6c 65 2c 20 22 48 69 73  ndf(&title, "His
4260: 74 6f 72 79 20 6f 66 20 22 29 3b 0a 20 20 68 79  tory of ");.  hy
4270: 70 65 72 6c 69 6e 6b 65 64 5f 70 61 74 68 28 7a  perlinked_path(z
4280: 46 69 6c 65 6e 61 6d 65 2c 20 26 74 69 74 6c 65  Filename, &title
4290: 29 3b 0a 20 20 40 20 3c 68 32 3e 25 62 28 26 74  );.  @ <h2>%b(&t
42a0: 69 74 6c 65 29 3c 2f 68 32 3e 0a 20 20 62 6c 6f  itle)</h2>.  blo
42b0: 62 5f 72 65 73 65 74 28 26 74 69 74 6c 65 29 3b  b_reset(&title);
42c0: 0a 20 20 40 20 3c 74 61 62 6c 65 20 63 65 6c 6c  .  @ <table cell
42d0: 73 70 61 63 69 6e 67 3d 30 20 62 6f 72 64 65 72  spacing=0 border
42e0: 3d 30 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d 30  =0 cellpadding=0
42f0: 3e 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74  >.  while( db_st
4300: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
4310: 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OW ){.    const 
4320: 63 68 61 72 20 2a 7a 56 65 72 73 20 3d 20 64 62  char *zVers = db
4330: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
4340: 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   0);.    const c
4350: 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f  har *zUuid = db_
4360: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
4370: 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  1);.    const ch
4380: 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63  ar *zDate = db_c
4390: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32  olumn_text(&q, 2
43a0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
43b0: 72 20 2a 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c  r *zCom = db_col
43c0: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29 3b  umn_text(&q, 3);
43d0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
43e0: 2a 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f 6c 75  *zUser = db_colu
43f0: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 34 29 3b 0a  mn_text(&q, 4);.
4400: 20 20 20 20 69 6e 74 20 66 70 69 64 20 3d 20 64      int fpid = d
4410: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c  b_column_int(&q,
4420: 20 35 29 3b 0a 20 20 20 20 69 6e 74 20 66 72 69   5);.    int fri
4430: 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e  d = db_column_in
4440: 74 28 26 71 2c 20 36 29 3b 0a 20 20 20 20 69 6e  t(&q, 6);.    in
4450: 74 20 6d 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d  t mid = db_colum
4460: 6e 5f 69 6e 74 28 26 71 2c 20 37 29 3b 0a 20 20  n_int(&q, 7);.  
4470: 20 20 69 6e 74 20 66 6e 69 64 20 3d 20 64 62 5f    int fnid = db_
4480: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 38  column_int(&q, 8
4490: 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  );.    if( memcm
44a0: 70 28 7a 44 61 74 65 2c 20 7a 50 72 65 76 44 61  p(zDate, zPrevDa
44b0: 74 65 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 20  te, 10) ){.     
44c0: 20 73 70 72 69 6e 74 66 28 7a 50 72 65 76 44 61   sprintf(zPrevDa
44d0: 74 65 2c 20 22 25 2e 31 30 73 22 2c 20 7a 44 61  te, "%.10s", zDa
44e0: 74 65 29 3b 0a 20 20 20 20 20 20 40 20 3c 74 72  te);.      @ <tr
44f0: 3e 3c 74 64 20 63 6f 6c 73 70 61 6e 3d 33 3e 0a  ><td colspan=3>.
4500: 20 20 20 20 20 20 40 20 3c 74 61 62 6c 65 20 63        @ <table c
4510: 65 6c 6c 70 61 64 64 69 6e 67 3d 32 20 62 6f 72  ellpadding=2 bor
4520: 64 65 72 3d 30 3e 0a 20 20 20 20 20 20 40 20 3c  der=0>.      @ <
4530: 74 72 3e 3c 74 64 20 62 67 63 6f 6c 6f 72 3d 22  tr><td bgcolor="
4540: 23 61 30 62 35 66 34 22 20 63 6c 61 73 73 3d 22  #a0b5f4" class="
4550: 62 6f 72 64 65 72 31 22 3e 0a 20 20 20 20 20 20  border1">.      
4560: 40 20 3c 74 61 62 6c 65 20 63 65 6c 6c 70 61 64  @ <table cellpad
4570: 64 69 6e 67 3d 32 20 63 65 6c 6c 73 70 61 63 69  ding=2 cellspaci
4580: 6e 67 3d 30 20 62 6f 72 64 65 72 3d 30 3e 3c 74  ng=0 border=0><t
4590: 72 3e 0a 20 20 20 20 20 20 40 20 3c 74 64 20 62  r>.      @ <td b
45a0: 67 63 6f 6c 6f 72 3d 22 23 64 30 64 39 66 34 22  gcolor="#d0d9f4"
45b0: 20 63 6c 61 73 73 3d 22 62 6b 67 6e 64 31 22 3e   class="bkgnd1">
45c0: 25 73 28 7a 50 72 65 76 44 61 74 65 29 3c 2f 74  %s(zPrevDate)</t
45d0: 64 3e 0a 20 20 20 20 20 20 40 20 3c 2f 74 72 3e  d>.      @ </tr>
45e0: 3c 2f 74 61 62 6c 65 3e 0a 20 20 20 20 20 20 40  </table>.      @
45f0: 20 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74 61 62   </td></tr></tab
4600: 6c 65 3e 0a 20 20 20 20 20 20 40 20 3c 2f 74 64  le>.      @ </td
4610: 3e 3c 2f 74 72 3e 0a 20 20 20 20 7d 0a 20 20 20  ></tr>.    }.   
4620: 20 40 20 3c 74 72 3e 3c 74 64 20 76 61 6c 69 67   @ <tr><td valig
4630: 6e 3d 22 74 6f 70 22 3e 25 73 28 26 7a 44 61 74  n="top">%s(&zDat
4640: 65 5b 31 31 5d 29 3c 2f 74 64 3e 0a 20 20 20 20  e[11])</td>.    
4650: 40 20 3c 74 64 20 77 69 64 74 68 3d 22 32 30 22  @ <td width="20"
4660: 3e 3c 2f 74 64 3e 0a 20 20 20 20 40 20 3c 74 64  ></td>.    @ <td
4670: 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 20 61 6c   valign="top" al
4680: 69 67 6e 3d 22 6c 65 66 74 22 3e 0a 20 20 20 20  ign="left">.    
4690: 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69  hyperlink_to_uui
46a0: 64 28 7a 56 65 72 73 29 3b 0a 20 20 20 20 40 20  d(zVers);.    @ 
46b0: 25 68 28 7a 43 6f 6d 29 20 28 42 79 3a 20 25 68  %h(zCom) (By: %h
46c0: 28 7a 55 73 65 72 29 29 0a 20 20 20 20 40 20 49  (zUser)).    @ I
46d0: 64 3a 20 25 73 28 7a 55 75 69 64 29 2f 25 64 28  d: %s(zUuid)/%d(
46e0: 66 72 69 64 29 0a 20 20 20 20 69 66 28 20 67 2e  frid).    if( g.
46f0: 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20 20 20  okHistory ){.   
4700: 20 20 20 40 20 3c 61 20 68 72 65 66 3d 22 25 73     @ <a href="%s
4710: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 61 72 74  (g.zBaseURL)/art
4720: 69 66 61 63 74 2f 25 64 28 66 72 69 64 29 22 3e  ifact/%d(frid)">
4730: 5b 76 69 65 77 5d 3c 2f 61 3e 0a 20 20 20 20 20  [view]</a>.     
4740: 20 69 66 28 20 66 70 69 64 20 29 7b 0a 20 20 20   if( fpid ){.   
4750: 20 20 20 20 20 40 20 3c 61 20 68 72 65 66 3d 22       @ <a href="
4760: 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 66  %s(g.zBaseURL)/f
4770: 64 69 66 66 3f 76 31 3d 25 64 28 66 70 69 64 29  diff?v1=%d(fpid)
4780: 26 61 6d 70 3b 76 32 3d 25 64 28 66 72 69 64 29  &amp;v2=%d(frid)
4790: 22 3e 5b 64 69 66 66 5d 3c 2f 61 3e 0a 20 20 20  ">[diff]</a>.   
47a0: 20 20 20 7d 0a 20 20 20 20 20 20 40 20 3c 61 20     }.      @ <a 
47b0: 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65  href="%s(g.zBase
47c0: 55 52 4c 29 2f 61 6e 6e 6f 74 61 74 65 3f 6d 69  URL)/annotate?mi
47d0: 64 3d 25 64 28 6d 69 64 29 26 61 6d 70 3b 66 6e  d=%d(mid)&amp;fn
47e0: 69 64 3d 25 64 28 66 6e 69 64 29 22 3e 0a 20 20  id=%d(fnid)">.  
47f0: 20 20 20 20 40 20 5b 61 6e 6e 6f 74 61 74 65 5d      @ [annotate]
4800: 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 3c 2f 74  </a>.      @ </t
4810: 64 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64  d>.    }.  }.  d
4820: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a  b_finalize(&q);.
4830: 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 20 20 73    @ </table>.  s
4840: 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d  tyle_footer();.}
4850: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  .../*.** Append 
4860: 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  the difference b
4870: 65 74 77 65 65 6e 20 74 77 6f 20 52 49 44 73 20  etween two RIDs 
4880: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2f  to the output.*/
4890: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70  .static void app
48a0: 65 6e 64 5f 64 69 66 66 28 69 6e 74 20 66 72 6f  end_diff(int fro
48b0: 6d 69 64 2c 20 69 6e 74 20 74 6f 69 64 29 7b 0a  mid, int toid){.
48c0: 20 20 42 6c 6f 62 20 66 72 6f 6d 2c 20 74 6f 2c    Blob from, to,
48d0: 20 6f 75 74 3b 0a 20 20 63 6f 6e 74 65 6e 74 5f   out;.  content_
48e0: 67 65 74 28 66 72 6f 6d 69 64 2c 20 26 66 72 6f  get(fromid, &fro
48f0: 6d 29 3b 0a 20 20 63 6f 6e 74 65 6e 74 5f 67 65  m);.  content_ge
4900: 74 28 74 6f 69 64 2c 20 26 74 6f 29 3b 0a 20 20  t(toid, &to);.  
4910: 62 6c 6f 62 5f 7a 65 72 6f 28 26 6f 75 74 29 3b  blob_zero(&out);
4920: 0a 20 20 74 65 78 74 5f 64 69 66 66 28 26 66 72  .  text_diff(&fr
4930: 6f 6d 2c 20 26 74 6f 2c 20 26 6f 75 74 2c 20 35  om, &to, &out, 5
4940: 29 3b 0a 20 20 40 20 25 68 28 62 6c 6f 62 5f 73  );.  @ %h(blob_s
4950: 74 72 28 26 6f 75 74 29 29 0a 20 20 62 6c 6f 62  tr(&out)).  blob
4960: 5f 72 65 73 65 74 28 26 66 72 6f 6d 29 3b 0a 20  _reset(&from);. 
4970: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 74 6f 29   blob_reset(&to)
4980: 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26  ;.  blob_reset(&
4990: 6f 75 74 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  out);  .}../*.**
49a0: 20 57 45 42 50 41 47 45 3a 20 76 64 69 66 66 0a   WEBPAGE: vdiff.
49b0: 2a 2a 20 55 52 4c 3a 20 2f 76 64 69 66 66 3f 6e  ** URL: /vdiff?n
49c0: 61 6d 65 3d 52 49 44 0a 2a 2a 0a 2a 2a 20 53 68  ame=RID.**.** Sh
49d0: 6f 77 20 61 6c 6c 20 64 69 66 66 65 72 65 6e 63  ow all differenc
49e0: 65 73 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  es for a particu
49f0: 6c 61 72 20 63 68 65 63 6b 2d 69 6e 2e 0a 2a 2f  lar check-in..*/
4a00: 0a 76 6f 69 64 20 76 64 69 66 66 5f 70 61 67 65  .void vdiff_page
4a10: 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72 69  (void){.  int ri
4a20: 64 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 63  d;.  Stmt q;.  c
4a30: 68 61 72 20 2a 7a 55 75 69 64 3b 0a 0a 20 20 6c  har *zUuid;..  l
4a40: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65  ogin_check_crede
4a50: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20  ntials();.  if( 
4a60: 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c 6f 67  !g.okRead ){ log
4a70: 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74  in_needed(); ret
4a80: 75 72 6e 3b 20 7d 0a 20 20 73 74 79 6c 65 5f 68  urn; }.  style_h
4a90: 65 61 64 65 72 28 22 42 61 73 65 6c 69 6e 65 20  eader("Baseline 
4aa0: 43 68 61 6e 67 65 73 22 29 3b 0a 20 20 6c 6f 67  Changes");.  log
4ab0: 69 6e 5f 61 6e 6f 6e 79 6d 6f 75 73 5f 61 76 61  in_anonymous_ava
4ac0: 69 6c 61 62 6c 65 28 29 3b 0a 0a 20 20 72 69 64  ilable();..  rid
4ad0: 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 50   = name_to_rid(P
4ae0: 44 28 22 6e 61 6d 65 22 2c 22 22 29 29 3b 0a 20  D("name",""));. 
4af0: 20 69 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a 20   if( rid==0 ){. 
4b00: 20 20 20 66 6f 73 73 69 6c 5f 72 65 64 69 72 65     fossil_redire
4b10: 63 74 5f 68 6f 6d 65 28 29 3b 0a 20 20 7d 0a 20  ct_home();.  }. 
4b20: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a   db_prepare(&q,.
4b30: 20 20 20 20 20 22 53 45 4c 45 43 54 20 70 69 64       "SELECT pid
4b40: 2c 20 66 69 64 2c 20 6e 61 6d 65 22 0a 20 20 20  , fid, name".   
4b50: 20 20 22 20 20 46 52 4f 4d 20 6d 6c 69 6e 6b 2c    "  FROM mlink,
4b60: 20 66 69 6c 65 6e 61 6d 65 22 0a 20 20 20 20 20   filename".     
4b70: 22 20 57 48 45 52 45 20 6d 6c 69 6e 6b 2e 6d 69  " WHERE mlink.mi
4b80: 64 3d 25 64 22 0a 20 20 20 20 20 22 20 20 20 41  d=%d".     "   A
4b90: 4e 44 20 66 69 6c 65 6e 61 6d 65 2e 66 6e 69 64  ND filename.fnid
4ba0: 3d 6d 6c 69 6e 6b 2e 66 6e 69 64 22 0a 20 20 20  =mlink.fnid".   
4bb0: 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d    " ORDER BY nam
4bc0: 65 22 2c 0a 20 20 20 20 20 72 69 64 0a 20 20 29  e",.     rid.  )
4bd0: 3b 0a 20 20 7a 55 75 69 64 20 3d 20 64 62 5f 74  ;.  zUuid = db_t
4be0: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 75  ext(0, "SELECT u
4bf0: 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48  uid FROM blob WH
4c00: 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72 69 64  ERE rid=%d", rid
4c10: 29 3b 0a 20 20 40 20 3c 68 32 3e 41 6c 6c 20 43  );.  @ <h2>All C
4c20: 68 61 6e 67 65 73 20 49 6e 20 42 61 73 65 6c 69  hanges In Baseli
4c30: 6e 65 0a 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74  ne.  hyperlink_t
4c40: 6f 5f 75 75 69 64 28 7a 55 75 69 64 29 3b 0a 20  o_uuid(zUuid);. 
4c50: 20 40 20 3c 2f 68 32 3e 0a 20 20 77 68 69 6c 65   @ </h2>.  while
4c60: 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53  ( db_step(&q)==S
4c70: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
4c80: 20 69 6e 74 20 70 69 64 20 3d 20 64 62 5f 63 6f   int pid = db_co
4c90: 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 30 29 3b 0a  lumn_int(&q,0);.
4ca0: 20 20 20 20 69 6e 74 20 66 69 64 20 3d 20 64 62      int fid = db
4cb0: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 31  _column_int(&q,1
4cc0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
4cd0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f  r *zName = db_co
4ce0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 32 29 3b  lumn_text(&q,2);
4cf0: 0a 20 20 20 20 40 20 3c 70 3e 3c 61 20 68 72 65  .    @ <p><a hre
4d00: 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  f="%s(g.zBaseURL
4d10: 29 2f 66 69 6e 66 6f 3f 6e 61 6d 65 3d 25 54 28  )/finfo?name=%T(
4d20: 7a 4e 61 6d 65 29 22 3e 25 68 28 7a 4e 61 6d 65  zName)">%h(zName
4d30: 29 3c 2f 61 3e 3c 2f 70 3e 0a 20 20 20 20 40 20  )</a></p>.    @ 
4d40: 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65  <blockquote><pre
4d50: 3e 0a 20 20 20 20 61 70 70 65 6e 64 5f 64 69 66  >.    append_dif
4d60: 66 28 70 69 64 2c 20 66 69 64 29 3b 0a 20 20 20  f(pid, fid);.   
4d70: 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b   @ </pre></block
4d80: 71 75 6f 74 65 3e 0a 20 20 7d 0a 20 20 64 62 5f  quote>.  }.  db_
4d90: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
4da0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
4db0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
4dc0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
4dd0: 20 61 6e 20 6f 62 6a 65 63 74 20 74 6f 20 74 68   an object to th
4de0: 65 20 77 77 77 20 72 65 70 6c 79 2e 0a 2a 2a 0a  e www reply..**.
4df0: 2a 2a 20 49 66 20 74 68 65 20 6f 62 6a 65 63 74  ** If the object
4e00: 20 69 73 20 61 20 66 69 6c 65 20 74 68 65 6e 20   is a file then 
4e10: 6d 65 6e 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20  mention:.**.**  
4e20: 20 20 20 2a 20 49 74 27 73 20 75 75 69 64 0a 2a     * It's uuid.*
4e30: 2a 20 20 20 20 20 2a 20 41 6c 6c 20 69 74 73 20  *     * All its 
4e40: 66 69 6c 65 6e 61 6d 65 73 0a 2a 2a 20 20 20 20  filenames.**    
4e50: 20 2a 20 54 68 65 20 62 61 73 65 6c 69 6e 65 73   * The baselines
4e60: 20 69 74 20 77 61 73 20 63 68 65 63 6b 65 64 2d   it was checked-
4e70: 69 6e 20 6f 6e 2c 20 77 69 74 68 20 74 69 6d 65  in on, with time
4e80: 73 20 61 6e 64 20 75 73 65 72 73 0a 2a 2a 0a 2a  s and users.**.*
4e90: 2a 20 49 66 20 74 68 65 20 6f 62 6a 65 63 74 20  * If the object 
4ea0: 69 73 20 61 20 6d 61 6e 69 66 65 73 74 2c 20 74  is a manifest, t
4eb0: 68 65 6e 20 6d 65 6e 74 69 6f 6e 3a 0a 2a 2a 0a  hen mention:.**.
4ec0: 2a 2a 20 20 20 20 20 2a 20 49 74 27 73 20 75 75  **     * It's uu
4ed0: 69 64 0a 2a 2a 20 20 20 20 20 2a 20 64 61 74 65  id.**     * date
4ee0: 20 6f 66 20 63 68 65 63 6b 2d 69 6e 0a 2a 2a 20   of check-in.** 
4ef0: 20 20 20 20 2a 20 43 6f 6d 6d 65 6e 74 20 26 20      * Comment & 
4f00: 75 73 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76  user.*/.static v
4f10: 6f 69 64 20 6f 62 6a 65 63 74 5f 64 65 73 63 72  oid object_descr
4f20: 69 70 74 69 6f 6e 28 0a 20 20 69 6e 74 20 72 69  iption(.  int ri
4f30: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
4f40: 20 20 20 2f 2a 20 54 68 65 20 61 72 74 69 66 61     /* The artifa
4f50: 63 74 20 49 44 20 2a 2f 0a 20 20 69 6e 74 20 6c  ct ID */.  int l
4f60: 69 6e 6b 54 6f 56 69 65 77 20 20 20 20 20 20 20  inkToView       
4f70: 20 20 20 20 2f 2a 20 41 64 64 20 76 69 65 77 65      /* Add viewe
4f80: 72 20 6c 69 6e 6b 20 69 66 20 74 72 75 65 20 2a  r link if true *
4f90: 2f 0a 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20  /.){.  Stmt q;. 
4fa0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
4fb0: 69 6e 74 20 6e 57 69 6b 69 20 3d 20 30 3b 0a 20  int nWiki = 0;. 
4fc0: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a   db_prepare(&q,.
4fd0: 20 20 20 20 22 53 45 4c 45 43 54 20 66 69 6c 65      "SELECT file
4fe0: 6e 61 6d 65 2e 6e 61 6d 65 2c 20 64 61 74 65 74  name.name, datet
4ff0: 69 6d 65 28 65 76 65 6e 74 2e 6d 74 69 6d 65 29  ime(event.mtime)
5000: 2c 20 73 75 62 73 74 72 28 61 2e 75 75 69 64 2c  , substr(a.uuid,
5010: 31 2c 31 30 29 2c 22 0a 20 20 20 20 22 20 20 20  1,10),".    "   
5020: 20 20 20 20 63 6f 61 6c 65 73 63 65 28 65 76 65      coalesce(eve
5030: 6e 74 2e 65 63 6f 6d 6d 65 6e 74 2c 65 76 65 6e  nt.ecomment,even
5040: 74 2e 63 6f 6d 6d 65 6e 74 29 2c 22 0a 20 20 20  t.comment),".   
5050: 20 22 20 20 20 20 20 20 20 63 6f 61 6c 65 73 63   "       coalesc
5060: 65 28 65 76 65 6e 74 2e 65 75 73 65 72 2c 65 76  e(event.euser,ev
5070: 65 6e 74 2e 75 73 65 72 29 2c 22 0a 20 20 20 20  ent.user),".    
5080: 22 20 20 20 20 20 20 20 62 2e 75 75 69 64 22 0a  "       b.uuid".
5090: 20 20 20 20 22 20 20 46 52 4f 4d 20 6d 6c 69 6e      "  FROM mlin
50a0: 6b 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 65 76 65  k, filename, eve
50b0: 6e 74 2c 20 62 6c 6f 62 20 61 2c 20 62 6c 6f 62  nt, blob a, blob
50c0: 20 62 22 0a 20 20 20 20 22 20 57 48 45 52 45 20   b".    " WHERE 
50d0: 66 69 6c 65 6e 61 6d 65 2e 66 6e 69 64 3d 6d 6c  filename.fnid=ml
50e0: 69 6e 6b 2e 66 6e 69 64 22 0a 20 20 20 20 22 20  ink.fnid".    " 
50f0: 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69    AND event.obji
5100: 64 3d 6d 6c 69 6e 6b 2e 6d 69 64 22 0a 20 20 20  d=mlink.mid".   
5110: 20 22 20 20 20 41 4e 44 20 61 2e 72 69 64 3d 6d   "   AND a.rid=m
5120: 6c 69 6e 6b 2e 66 69 64 22 0a 20 20 20 20 22 20  link.fid".    " 
5130: 20 20 41 4e 44 20 62 2e 72 69 64 3d 6d 6c 69 6e    AND b.rid=mlin
5140: 6b 2e 6d 69 64 22 0a 20 20 20 20 22 20 20 20 41  k.mid".    "   A
5150: 4e 44 20 6d 6c 69 6e 6b 2e 66 69 64 3d 25 64 22  ND mlink.fid=%d"
5160: 2c 0a 20 20 20 20 72 69 64 0a 20 20 29 3b 0a 20  ,.    rid.  );. 
5170: 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28   while( db_step(
5180: 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)==SQLITE_ROW 
5190: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
51a0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f  r *zName = db_co
51b0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29  lumn_text(&q, 0)
51c0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
51d0: 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c   *zDate = db_col
51e0: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b  umn_text(&q, 1);
51f0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5200: 2a 7a 46 75 75 69 64 20 3d 20 64 62 5f 63 6f 6c  *zFuuid = db_col
5210: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29 3b  umn_text(&q, 2);
5220: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5230: 2a 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c 75 6d  *zCom = db_colum
5240: 6e 5f 74 65 78 74 28 26 71 2c 20 33 29 3b 0a 20  n_text(&q, 3);. 
5250: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5260: 55 73 65 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  User = db_column
5270: 5f 74 65 78 74 28 26 71 2c 20 34 29 3b 0a 20 20  _text(&q, 4);.  
5280: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
5290: 65 72 73 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ers = db_column_
52a0: 74 65 78 74 28 26 71 2c 20 35 29 3b 0a 20 20 20  text(&q, 5);.   
52b0: 20 69 66 28 20 63 6e 74 3e 30 20 29 7b 0a 20 20   if( cnt>0 ){.  
52c0: 20 20 20 20 40 20 41 6c 73 6f 20 66 69 6c 65 0a      @ Also file.
52d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
52e0: 20 40 20 46 69 6c 65 0a 20 20 20 20 7d 0a 20 20   @ File.    }.  
52f0: 20 20 40 20 3c 61 20 68 72 65 66 3d 22 25 73 28    @ <a href="%s(
5300: 67 2e 7a 42 61 73 65 55 52 4c 29 2f 66 69 6e 66  g.zBaseURL)/finf
5310: 6f 3f 6e 61 6d 65 3d 25 54 28 7a 4e 61 6d 65 29  o?name=%T(zName)
5320: 22 3e 25 68 28 7a 4e 61 6d 65 29 3c 2f 61 3e 0a  ">%h(zName)</a>.
5330: 20 20 20 20 40 20 75 75 69 64 20 25 73 28 7a 46      @ uuid %s(zF
5340: 75 75 69 64 29 20 70 61 72 74 20 6f 66 20 63 68  uuid) part of ch
5350: 65 63 6b 2d 69 6e 0a 20 20 20 20 68 79 70 65 72  eck-in.    hyper
5360: 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 28 7a 56 65  link_to_uuid(zVe
5370: 72 73 29 3b 0a 20 20 20 20 40 20 25 77 28 7a 43  rs);.    @ %w(zC
5380: 6f 6d 29 20 62 79 20 25 68 28 7a 55 73 65 72 29  om) by %h(zUser)
5390: 20 6f 6e 20 25 73 28 7a 44 61 74 65 29 2e 0a 20   on %s(zDate).. 
53a0: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20     cnt++;.  }.  
53b0: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
53c0: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71  .  db_prepare(&q
53d0: 2c 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20 73  , .    "SELECT s
53e0: 75 62 73 74 72 28 74 61 67 6e 61 6d 65 2c 20 36  ubstr(tagname, 6
53f0: 2c 20 31 30 30 30 30 29 2c 20 64 61 74 65 74 69  , 10000), dateti
5400: 6d 65 28 65 76 65 6e 74 2e 6d 74 69 6d 65 29 2c  me(event.mtime),
5410: 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 63 6f  ".    "       co
5420: 61 6c 65 73 63 65 28 65 76 65 6e 74 2e 65 75 73  alesce(event.eus
5430: 65 72 2c 20 65 76 65 6e 74 2e 75 73 65 72 29 2c  er, event.user),
5440: 20 75 75 69 64 22 0a 20 20 20 20 22 20 20 46 52   uuid".    "  FR
5450: 4f 4d 20 74 61 67 78 72 65 66 2c 20 74 61 67 2c  OM tagxref, tag,
5460: 20 65 76 65 6e 74 2c 20 62 6c 6f 62 22 0a 20 20   event, blob".  
5470: 20 20 22 20 57 48 45 52 45 20 74 61 67 78 72 65    " WHERE tagxre
5480: 66 2e 72 69 64 3d 25 64 22 0a 20 20 20 20 22 20  f.rid=%d".    " 
5490: 20 20 41 4e 44 20 74 61 67 2e 74 61 67 69 64 3d    AND tag.tagid=
54a0: 74 61 67 78 72 65 66 2e 74 61 67 69 64 22 20 0a  tagxref.tagid" .
54b0: 20 20 20 20 22 20 20 20 41 4e 44 20 74 61 67 2e      "   AND tag.
54c0: 74 61 67 6e 61 6d 65 20 4c 49 4b 45 20 27 77 69  tagname LIKE 'wi
54d0: 6b 69 2d 25 25 27 22 0a 20 20 20 20 22 20 20 20  ki-%%'".    "   
54e0: 41 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64 3d  AND event.objid=
54f0: 74 61 67 78 72 65 66 2e 72 69 64 22 0a 20 20 20  tagxref.rid".   
5500: 20 22 20 20 20 41 4e 44 20 62 6c 6f 62 2e 72 69   "   AND blob.ri
5510: 64 3d 74 61 67 78 72 65 66 2e 72 69 64 22 2c 0a  d=tagxref.rid",.
5520: 20 20 20 20 72 69 64 0a 20 20 29 3b 0a 20 20 77      rid.  );.  w
5530: 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71  hile( db_step(&q
5540: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
5550: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5560: 2a 7a 50 61 67 65 6e 61 6d 65 20 3d 20 64 62 5f  *zPagename = db_
5570: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
5580: 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  0);.    const ch
5590: 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63  ar *zDate = db_c
55a0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31  olumn_text(&q, 1
55b0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
55c0: 72 20 2a 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f  r *zUser = db_co
55d0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29  lumn_text(&q, 2)
55e0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
55f0: 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c   *zUuid = db_col
5600: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29 3b  umn_text(&q, 3);
5610: 0a 20 20 20 20 69 66 28 20 63 6e 74 3e 30 20 29  .    if( cnt>0 )
5620: 7b 0a 20 20 20 20 20 20 40 20 41 6c 73 6f 20 77  {.      @ Also w
5630: 69 6b 69 20 70 61 67 65 0a 20 20 20 20 7d 65 6c  iki page.    }el
5640: 73 65 7b 0a 20 20 20 20 20 20 40 20 57 69 6b 69  se{.      @ Wiki
5650: 20 70 61 67 65 0a 20 20 20 20 7d 0a 20 20 20 20   page.    }.    
5660: 40 20 5b 3c 61 20 68 72 65 66 3d 22 25 73 28 67  @ [<a href="%s(g
5670: 2e 7a 42 61 73 65 55 52 4c 29 2f 77 69 6b 69 3f  .zBaseURL)/wiki?
5680: 6e 61 6d 65 3d 25 74 28 7a 50 61 67 65 6e 61 6d  name=%t(zPagenam
5690: 65 29 22 3e 25 68 28 7a 50 61 67 65 6e 61 6d 65  e)">%h(zPagename
56a0: 29 3c 2f 61 3e 5d 0a 20 20 20 20 40 20 75 75 69  )</a>].    @ uui
56b0: 64 20 25 73 28 7a 55 75 69 64 29 20 62 79 20 25  d %s(zUuid) by %
56c0: 68 28 7a 55 73 65 72 29 20 6f 6e 20 25 73 28 7a  h(zUser) on %s(z
56d0: 44 61 74 65 29 2e 0a 20 20 20 20 6e 57 69 6b 69  Date)..    nWiki
56e0: 2b 2b 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  ++;.    cnt++;. 
56f0: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65   }.  db_finalize
5700: 28 26 71 29 3b 0a 20 20 69 66 28 20 6e 57 69 6b  (&q);.  if( nWik
5710: 69 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f 70  i==0 ){.    db_p
5720: 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 20  repare(&q,.     
5730: 20 22 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d   "SELECT datetim
5740: 65 28 6d 74 69 6d 65 29 2c 20 75 73 65 72 2c 20  e(mtime), user, 
5750: 63 6f 6d 6d 65 6e 74 2c 20 75 75 69 64 2c 20 74  comment, uuid, t
5760: 79 70 65 22 0a 20 20 20 20 20 20 22 20 20 46 52  ype".      "  FR
5770: 4f 4d 20 65 76 65 6e 74 2c 20 62 6c 6f 62 22 0a  OM event, blob".
5780: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 65 76        " WHERE ev
5790: 65 6e 74 2e 6f 62 6a 69 64 3d 25 64 22 0a 20 20  ent.objid=%d".  
57a0: 20 20 20 20 22 20 20 20 41 4e 44 20 62 6c 6f 62      "   AND blob
57b0: 2e 72 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20  .rid=%d",.      
57c0: 72 69 64 2c 20 72 69 64 0a 20 20 20 20 29 3b 0a  rid, rid.    );.
57d0: 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74      while( db_st
57e0: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
57f0: 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  OW ){.      cons
5800: 74 20 63 68 61 72 20 2a 7a 44 61 74 65 20 3d 20  t char *zDate = 
5810: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
5820: 71 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e  q, 0);.      con
5830: 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d  st char *zUuid =
5840: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
5850: 26 71 2c 20 33 29 3b 0a 20 20 20 20 20 20 63 6f  &q, 3);.      co
5860: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 20  nst char *zUser 
5870: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
5880: 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 63  (&q, 1);.      c
5890: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 20  onst char *zCom 
58a0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
58b0: 28 26 71 2c 20 32 29 3b 0a 20 20 20 20 20 20 63  (&q, 2);.      c
58c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
58d0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
58e0: 74 28 26 71 2c 20 34 29 3b 0a 20 20 20 20 20 20  t(&q, 4);.      
58f0: 69 66 28 20 63 6e 74 3e 30 20 29 7b 0a 20 20 20  if( cnt>0 ){.   
5900: 20 20 20 20 20 40 20 41 6c 73 6f 0a 20 20 20 20       @ Also.    
5910: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 54    }.      if( zT
5920: 79 70 65 5b 30 5d 3d 3d 27 77 27 20 29 7b 0a 20  ype[0]=='w' ){. 
5930: 20 20 20 20 20 20 20 40 20 57 69 6b 69 20 65 64         @ Wiki ed
5940: 69 74 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  it.      }else i
5950: 66 28 20 7a 54 79 70 65 5b 30 5d 3d 3d 27 74 27  f( zType[0]=='t'
5960: 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20 54 69   ){.        @ Ti
5970: 63 6b 65 74 20 63 68 61 6e 67 65 0a 20 20 20 20  cket change.    
5980: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 79 70    }else if( zTyp
5990: 65 5b 30 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20  e[0]=='c' ){.   
59a0: 20 20 20 20 20 40 20 4d 61 6e 69 66 65 73 74 20       @ Manifest 
59b0: 6f 66 20 62 61 73 65 6c 69 6e 65 0a 20 20 20 20  of baseline.    
59c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
59d0: 20 40 20 43 6f 6e 74 72 6f 6c 20 66 69 6c 65 20   @ Control file 
59e0: 72 65 66 65 72 65 6e 63 69 6e 67 0a 20 20 20 20  referencing.    
59f0: 20 20 7d 0a 20 20 20 20 20 20 68 79 70 65 72 6c    }.      hyperl
5a00: 69 6e 6b 5f 74 6f 5f 75 75 69 64 28 7a 55 75 69  ink_to_uuid(zUui
5a10: 64 29 3b 0a 20 20 20 20 20 20 40 20 25 77 28 7a  d);.      @ %w(z
5a20: 43 6f 6d 29 20 62 79 20 25 68 28 7a 55 73 65 72  Com) by %h(zUser
5a30: 29 20 6f 6e 20 25 73 28 7a 44 61 74 65 29 2e 0a  ) on %s(zDate)..
5a40: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
5a50: 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69   }.    db_finali
5a60: 7a 65 28 26 71 29 3b 0a 20 20 7d 0a 20 20 69 66  ze(&q);.  }.  if
5a70: 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( cnt==0 ){.    
5a80: 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62  char *zUuid = db
5a90: 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54  _text(0, "SELECT
5aa0: 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20   uuid FROM blob 
5ab0: 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72  WHERE rid=%d", r
5ac0: 69 64 29 3b 0a 20 20 20 20 40 20 43 6f 6e 74 72  id);.    @ Contr
5ad0: 6f 6c 20 66 69 6c 65 20 25 73 28 7a 55 75 69 64  ol file %s(zUuid
5ae0: 29 2e 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  )..  }else if( l
5af0: 69 6e 6b 54 6f 56 69 65 77 20 29 7b 0a 20 20 20  inkToView ){.   
5b00: 20 40 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67   @ <a href="%s(g
5b10: 2e 7a 42 61 73 65 55 52 4c 29 2f 61 72 74 69 66  .zBaseURL)/artif
5b20: 61 63 74 2f 25 64 28 72 69 64 29 22 3e 5b 76 69  act/%d(rid)">[vi
5b30: 65 77 5d 3c 2f 61 3e 0a 20 20 7d 0a 7d 0a 0a 2f  ew]</a>.  }.}../
5b40: 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 66 64  *.** WEBPAGE: fd
5b50: 69 66 66 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 61 72  iff.**.** Two ar
5b60: 67 75 6d 65 6e 74 73 2c 20 76 31 20 61 6e 64 20  guments, v1 and 
5b70: 76 32 2c 20 61 72 65 20 69 6e 74 65 67 65 72 73  v2, are integers
5b80: 2e 20 20 53 68 6f 77 20 74 68 65 20 64 69 66 66  .  Show the diff
5b90: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a  erence between.*
5ba0: 2a 20 74 68 65 20 74 77 6f 20 72 65 63 6f 72 64  * the two record
5bb0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 64 69 66 66 5f  s..*/.void diff_
5bc0: 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e  page(void){.  in
5bd0: 74 20 76 31 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72  t v1 = name_to_r
5be0: 69 64 28 50 44 28 22 76 31 22 2c 22 30 22 29 29  id(PD("v1","0"))
5bf0: 3b 0a 20 20 69 6e 74 20 76 32 20 3d 20 6e 61 6d  ;.  int v2 = nam
5c00: 65 5f 74 6f 5f 72 69 64 28 50 44 28 22 76 32 22  e_to_rid(PD("v2"
5c10: 2c 22 30 22 29 29 3b 0a 20 20 42 6c 6f 62 20 63  ,"0"));.  Blob c
5c20: 31 2c 20 63 32 2c 20 64 69 66 66 3b 0a 0a 20 20  1, c2, diff;..  
5c30: 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64  login_check_cred
5c40: 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28  entials();.  if(
5c50: 20 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c 6f   !g.okRead ){ lo
5c60: 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65  gin_needed(); re
5c70: 74 75 72 6e 3b 20 7d 0a 20 20 73 74 79 6c 65 5f  turn; }.  style_
5c80: 68 65 61 64 65 72 28 22 44 69 66 66 22 29 3b 0a  header("Diff");.
5c90: 20 20 40 20 3c 68 32 3e 44 69 66 66 65 72 65 6e    @ <h2>Differen
5ca0: 63 65 73 20 46 72 6f 6d 3a 3c 2f 68 32 3e 0a 20  ces From:</h2>. 
5cb0: 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a   @ <blockquote>.
5cc0: 20 20 6f 62 6a 65 63 74 5f 64 65 73 63 72 69 70    object_descrip
5cd0: 74 69 6f 6e 28 76 31 2c 20 31 29 3b 0a 20 20 40  tion(v1, 1);.  @
5ce0: 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20   </blockquote>. 
5cf0: 20 40 20 3c 68 32 3e 54 6f 3a 3c 2f 68 32 3e 0a   @ <h2>To:</h2>.
5d00: 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e    @ <blockquote>
5d10: 0a 20 20 6f 62 6a 65 63 74 5f 64 65 73 63 72 69  .  object_descri
5d20: 70 74 69 6f 6e 28 76 32 2c 20 31 29 3b 0a 20 20  ption(v2, 1);.  
5d30: 40 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a  @ </blockquote>.
5d40: 20 20 40 20 3c 68 72 3e 0a 20 20 40 20 3c 62 6c    @ <hr>.  @ <bl
5d50: 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 20  ockquote><pre>. 
5d60: 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 76 31 2c   content_get(v1,
5d70: 20 26 63 31 29 3b 0a 20 20 63 6f 6e 74 65 6e 74   &c1);.  content
5d80: 5f 67 65 74 28 76 32 2c 20 26 63 32 29 3b 0a 20  _get(v2, &c2);. 
5d90: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 64 69 66 66   blob_zero(&diff
5da0: 29 3b 0a 20 20 74 65 78 74 5f 64 69 66 66 28 26  );.  text_diff(&
5db0: 63 31 2c 20 26 63 32 2c 20 26 64 69 66 66 2c 20  c1, &c2, &diff, 
5dc0: 34 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74  4);.  blob_reset
5dd0: 28 26 63 31 29 3b 0a 20 20 62 6c 6f 62 5f 72 65  (&c1);.  blob_re
5de0: 73 65 74 28 26 63 32 29 3b 0a 20 20 40 20 25 68  set(&c2);.  @ %h
5df0: 28 62 6c 6f 62 5f 73 74 72 28 26 64 69 66 66 29  (blob_str(&diff)
5e00: 29 0a 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c  ).  @ </pre></bl
5e10: 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 62 6c 6f 62  ockquote>.  blob
5e20: 5f 72 65 73 65 74 28 26 64 69 66 66 29 3b 0a 20  _reset(&diff);. 
5e30: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
5e40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47  .}../*.** WEBPAG
5e50: 45 3a 20 72 61 77 0a 2a 2a 20 55 52 4c 3a 20 2f  E: raw.** URL: /
5e60: 72 61 77 3f 6e 61 6d 65 3d 41 52 54 49 46 41 43  raw?name=ARTIFAC
5e70: 54 49 44 26 6d 3d 54 59 50 45 0a 2a 2a 20 0a 2a  TID&m=TYPE.** .*
5e80: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69  * Return the uni
5e90: 6e 74 65 72 70 72 65 74 65 64 20 63 6f 6e 74 65  nterpreted conte
5ea0: 6e 74 20 6f 66 20 61 6e 20 61 72 74 69 66 61 63  nt of an artifac
5eb0: 74 2e 20 20 55 73 65 64 20 70 72 69 6d 61 72 69  t.  Used primari
5ec0: 6c 79 0a 2a 2a 20 74 6f 20 76 69 65 77 20 61 72  ly.** to view ar
5ed0: 74 69 66 61 63 74 73 20 74 68 61 74 20 61 72 65  tifacts that are
5ee0: 20 69 6d 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64   images..*/.void
5ef0: 20 72 61 77 61 72 74 69 66 61 63 74 5f 70 61 67   rawartifact_pag
5f00: 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72  e(void){.  int r
5f10: 69 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  id;.  const char
5f20: 20 2a 7a 4d 69 6d 65 3b 0a 20 20 42 6c 6f 62 20   *zMime;.  Blob 
5f30: 63 6f 6e 74 65 6e 74 3b 0a 0a 20 20 72 69 64 20  content;..  rid 
5f40: 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44  = name_to_rid(PD
5f50: 28 22 6e 61 6d 65 22 2c 22 30 22 29 29 3b 0a 20  ("name","0"));. 
5f60: 20 7a 4d 69 6d 65 20 3d 20 50 44 28 22 6d 22 2c   zMime = PD("m",
5f70: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66  "application/x-f
5f80: 6f 73 73 69 6c 2d 61 72 74 69 66 61 63 74 22 29  ossil-artifact")
5f90: 3b 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f  ;.  login_check_
5fa0: 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20  credentials();. 
5fb0: 20 69 66 28 20 21 67 2e 6f 6b 52 65 61 64 20 29   if( !g.okRead )
5fc0: 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29  { login_needed()
5fd0: 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 69 66  ; return; }.  if
5fe0: 28 20 72 69 64 3d 3d 30 20 29 7b 20 63 67 69 5f  ( rid==0 ){ cgi_
5ff0: 72 65 64 69 72 65 63 74 28 22 2f 68 6f 6d 65 22  redirect("/home"
6000: 29 3b 20 7d 0a 20 20 63 6f 6e 74 65 6e 74 5f 67  ); }.  content_g
6010: 65 74 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74  et(rid, &content
6020: 29 3b 0a 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e  );.  cgi_set_con
6030: 74 65 6e 74 5f 74 79 70 65 28 7a 4d 69 6d 65 29  tent_type(zMime)
6040: 3b 0a 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74  ;.  cgi_set_cont
6050: 65 6e 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 7d  ent(&content);.}
6060: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 61  ../*.** Render a
6070: 20 68 65 78 20 64 75 6d 70 20 6f 66 20 61 20 66   hex dump of a f
6080: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ile..*/.static v
6090: 6f 69 64 20 68 65 78 64 75 6d 70 28 42 6c 6f 62  oid hexdump(Blob
60a0: 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 63 6f 6e 73   *pBlob){.  cons
60b0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
60c0: 2a 78 3b 0a 20 20 69 6e 74 20 6e 2c 20 69 2c 20  *x;.  int n, i, 
60d0: 6a 2c 20 6b 3b 0a 20 20 63 68 61 72 20 7a 4c 69  j, k;.  char zLi
60e0: 6e 65 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69  ne[100];.  stati
60f0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 48 65  c const char zHe
6100: 78 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  x[] = "012345678
6110: 39 61 62 63 64 65 66 22 3b 0a 0a 20 20 78 20 3d  9abcdef";..  x =
6120: 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
6130: 20 63 68 61 72 2a 29 62 6c 6f 62 5f 62 75 66 66   char*)blob_buff
6140: 65 72 28 70 42 6c 6f 62 29 3b 0a 20 20 6e 20 3d  er(pBlob);.  n =
6150: 20 62 6c 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62   blob_size(pBlob
6160: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6170: 6e 3b 20 69 2b 3d 31 36 29 7b 0a 20 20 20 20 6a  n; i+=16){.    j
6180: 20 3d 20 30 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b   = 0;.    zLine[
6190: 30 5d 20 3d 20 7a 48 65 78 5b 28 69 3e 3e 32 34  0] = zHex[(i>>24
61a0: 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e  )&0xf];.    zLin
61b0: 65 5b 31 5d 20 3d 20 7a 48 65 78 5b 28 69 3e 3e  e[1] = zHex[(i>>
61c0: 31 36 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a 4c  16)&0xf];.    zL
61d0: 69 6e 65 5b 32 5d 20 3d 20 7a 48 65 78 5b 28 69  ine[2] = zHex[(i
61e0: 3e 3e 38 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a  >>8)&0xf];.    z
61f0: 4c 69 6e 65 5b 33 5d 20 3d 20 7a 48 65 78 5b 69  Line[3] = zHex[i
6200: 26 30 78 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e 65  &0xf];.    zLine
6210: 5b 34 5d 20 3d 20 27 3a 27 3b 0a 20 20 20 20 73  [4] = ':';.    s
6220: 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25  printf(zLine, "%
6230: 30 34 78 3a 20 22 2c 20 69 29 3b 0a 20 20 20 20  04x: ", i);.    
6240: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 36 3b 20 6a  for(j=0; j<16; j
6250: 2b 2b 29 7b 0a 20 20 20 20 20 20 6b 20 3d 20 35  ++){.      k = 5
6260: 2b 6a 2a 33 3b 0a 20 20 20 20 20 20 7a 4c 69 6e  +j*3;.      zLin
6270: 65 5b 6b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  e[k] = ' ';.    
6280: 20 20 69 66 28 20 69 2b 6a 3c 6e 20 29 7b 0a 20    if( i+j<n ){. 
6290: 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
62a0: 63 68 61 72 20 63 20 3d 20 78 5b 69 2b 6a 5d 3b  char c = x[i+j];
62b0: 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b  .        zLine[k
62c0: 2b 31 5d 20 3d 20 7a 48 65 78 5b 63 3e 3e 34 5d  +1] = zHex[c>>4]
62d0: 3b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b  ;.        zLine[
62e0: 6b 2b 32 5d 20 3d 20 7a 48 65 78 5b 63 26 30 78  k+2] = zHex[c&0x
62f0: 66 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  f];.      }else{
6300: 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b  .        zLine[k
6310: 2b 31 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  +1] = ' ';.     
6320: 20 20 20 7a 4c 69 6e 65 5b 6b 2b 32 5d 20 3d 20     zLine[k+2] = 
6330: 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ' ';.      }.   
6340: 20 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b 35 33 5d   }.    zLine[53]
6350: 20 3d 20 27 20 27 3b 0a 20 20 20 20 7a 4c 69 6e   = ' ';.    zLin
6360: 65 5b 35 34 5d 20 3d 20 27 20 27 3b 0a 20 20 20  e[54] = ' ';.   
6370: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 36 3b 20   for(j=0; j<16; 
6380: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 6b 20 3d 20  j++){.      k = 
6390: 6a 2b 35 35 3b 0a 20 20 20 20 20 20 69 66 28 20  j+55;.      if( 
63a0: 69 2b 6a 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  i+j<n ){.       
63b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
63c0: 20 3d 20 78 5b 69 2b 6a 5d 3b 0a 20 20 20 20 20   = x[i+j];.     
63d0: 20 20 20 69 66 28 20 63 3e 3d 30 78 32 30 20 26     if( c>=0x20 &
63e0: 26 20 63 3c 3d 30 78 37 65 20 29 7b 0a 20 20 20  & c<=0x7e ){.   
63f0: 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b 5d 20         zLine[k] 
6400: 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = c;.        }el
6410: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c  se{.          zL
6420: 69 6e 65 5b 6b 5d 20 3d 20 27 2e 27 3b 0a 20 20  ine[k] = '.';.  
6430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
6440: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  lse{.        zLi
6450: 6e 65 5b 6b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ne[k] = 0;.     
6460: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69   }.    }.    zLi
6470: 6e 65 5b 37 31 5d 20 3d 20 30 3b 0a 20 20 20 20  ne[71] = 0;.    
6480: 40 20 25 68 28 7a 4c 69 6e 65 29 0a 20 20 7d 0a  @ %h(zLine).  }.
6490: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45  }../*.** WEBPAGE
64a0: 3a 20 68 65 78 64 75 6d 70 0a 2a 2a 20 55 52 4c  : hexdump.** URL
64b0: 3a 20 2f 68 65 78 64 75 6d 70 3f 6e 61 6d 65 3d  : /hexdump?name=
64c0: 41 52 54 49 46 41 43 54 49 44 0a 2a 2a 20 0a 2a  ARTIFACTID.** .*
64d0: 2a 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c  * Show the compl
64e0: 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ete content of a
64f0: 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65 64   file identified
6500: 20 62 79 20 41 52 54 49 46 41 43 54 49 44 0a 2a   by ARTIFACTID.*
6510: 2a 20 61 73 20 70 72 65 66 6f 72 6d 61 74 74 65  * as preformatte
6520: 64 20 74 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20  d text..*/.void 
6530: 68 65 78 64 75 6d 70 5f 70 61 67 65 28 76 6f 69  hexdump_page(voi
6540: 64 29 7b 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20  d){.  int rid;. 
6550: 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 0a   Blob content;..
6560: 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74 6f 5f    rid = name_to_
6570: 72 69 64 28 50 44 28 22 6e 61 6d 65 22 2c 22 30  rid(PD("name","0
6580: 22 29 29 3b 0a 20 20 6c 6f 67 69 6e 5f 63 68 65  "));.  login_che
6590: 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29  ck_credentials()
65a0: 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52 65 61  ;.  if( !g.okRea
65b0: 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65  d ){ login_neede
65c0: 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20  d(); return; }. 
65d0: 20 69 66 28 20 72 69 64 3d 3d 30 20 29 7b 20 63   if( rid==0 ){ c
65e0: 67 69 5f 72 65 64 69 72 65 63 74 28 22 2f 68 6f  gi_redirect("/ho
65f0: 6d 65 22 29 3b 20 7d 0a 20 20 69 66 28 20 67 2e  me"); }.  if( g.
6600: 6f 6b 41 64 6d 69 6e 20 29 7b 0a 20 20 20 20 63  okAdmin ){.    c
6610: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64  onst char *zUuid
6620: 20 3d 20 64 62 5f 74 65 78 74 28 22 22 2c 20 22   = db_text("", "
6630: 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d  SELECT uuid FROM
6640: 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d   blob WHERE rid=
6650: 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 20 20 69  %d", rid);.    i
6660: 66 28 20 64 62 5f 65 78 69 73 74 73 28 22 53 45  f( db_exists("SE
6670: 4c 45 43 54 20 31 20 46 52 4f 4d 20 73 68 75 6e  LECT 1 FROM shun
6680: 20 57 48 45 52 45 20 75 75 69 64 3d 27 25 73 27   WHERE uuid='%s'
6690: 22 2c 20 7a 55 75 69 64 29 20 29 7b 0a 20 20 20  ", zUuid) ){.   
66a0: 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75     style_submenu
66b0: 5f 65 6c 65 6d 65 6e 74 28 22 55 6e 73 68 75 6e  _element("Unshun
66c0: 22 2c 22 55 6e 73 68 75 6e 22 2c 20 22 25 73 2f  ","Unshun", "%s/
66d0: 73 68 75 6e 3f 75 75 69 64 3d 25 73 26 73 75 62  shun?uuid=%s&sub
66e0: 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  =1",.           
66f0: 20 67 2e 7a 54 6f 70 2c 20 7a 55 75 69 64 29 3b   g.zTop, zUuid);
6700: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6710: 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f    style_submenu_
6720: 65 6c 65 6d 65 6e 74 28 22 53 68 75 6e 22 2c 22  element("Shun","
6730: 53 68 75 6e 22 2c 20 22 25 73 2f 73 68 75 6e 3f  Shun", "%s/shun?
6740: 73 68 75 6e 3d 25 73 23 61 64 64 73 68 75 6e 22  shun=%s#addshun"
6750: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 2e  ,.            g.
6760: 7a 54 6f 70 2c 20 7a 55 75 69 64 29 3b 0a 20 20  zTop, zUuid);.  
6770: 20 20 7d 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f    }.  }.  style_
6780: 68 65 61 64 65 72 28 22 48 65 78 20 41 72 74 69  header("Hex Arti
6790: 66 61 63 74 20 43 6f 6e 74 65 6e 74 22 29 3b 0a  fact Content");.
67a0: 20 20 40 20 3c 68 32 3e 48 65 78 61 64 65 63 69    @ <h2>Hexadeci
67b0: 6d 61 6c 20 43 6f 6e 74 65 6e 74 20 4f 66 3a 3c  mal Content Of:<
67c0: 2f 68 32 3e 0a 20 20 40 20 3c 62 6c 6f 63 6b 71  /h2>.  @ <blockq
67d0: 75 6f 74 65 3e 0a 20 20 6f 62 6a 65 63 74 5f 64  uote>.  object_d
67e0: 65 73 63 72 69 70 74 69 6f 6e 28 72 69 64 2c 20  escription(rid, 
67f0: 30 29 3b 0a 20 20 40 20 3c 2f 62 6c 6f 63 6b 71  0);.  @ </blockq
6800: 75 6f 74 65 3e 0a 20 20 40 20 3c 68 72 3e 0a 20  uote>.  @ <hr>. 
6810: 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69 64   content_get(rid
6820: 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 40  , &content);.  @
6830: 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72   <blockquote><pr
6840: 65 3e 0a 20 20 68 65 78 64 75 6d 70 28 26 63 6f  e>.  hexdump(&co
6850: 6e 74 65 6e 74 29 3b 0a 20 20 40 20 3c 2f 70 72  ntent);.  @ </pr
6860: 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a  e></blockquote>.
6870: 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29    style_footer()
6880: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41  ;.}../*.** WEBPA
6890: 47 45 3a 20 61 72 74 69 66 61 63 74 0a 2a 2a 20  GE: artifact.** 
68a0: 55 52 4c 3a 20 2f 61 72 74 69 66 61 63 74 3f 6e  URL: /artifact?n
68b0: 61 6d 65 3d 41 52 54 49 46 41 43 54 49 44 0a 2a  ame=ARTIFACTID.*
68c0: 2a 20 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20 63  * .** Show the c
68d0: 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
68e0: 6f 66 20 61 20 66 69 6c 65 20 69 64 65 6e 74 69  of a file identi
68f0: 66 69 65 64 20 62 79 20 41 52 54 49 46 41 43 54  fied by ARTIFACT
6900: 49 44 0a 2a 2a 20 61 73 20 70 72 65 66 6f 72 6d  ID.** as preform
6910: 61 74 74 65 64 20 74 65 78 74 2e 0a 2a 2f 0a 76  atted text..*/.v
6920: 6f 69 64 20 61 72 74 69 66 61 63 74 5f 70 61 67  oid artifact_pag
6930: 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72  e(void){.  int r
6940: 69 64 3b 0a 20 20 42 6c 6f 62 20 63 6f 6e 74 65  id;.  Blob conte
6950: 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  nt;.  const char
6960: 20 2a 7a 4d 69 6d 65 3b 0a 0a 20 20 72 69 64 20   *zMime;..  rid 
6970: 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44  = name_to_rid(PD
6980: 28 22 6e 61 6d 65 22 2c 22 30 22 29 29 3b 0a 20  ("name","0"));. 
6990: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65   login_check_cre
69a0: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66  dentials();.  if
69b0: 28 20 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c  ( !g.okRead ){ l
69c0: 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72  ogin_needed(); r
69d0: 65 74 75 72 6e 3b 20 7d 0a 20 20 69 66 28 20 72  eturn; }.  if( r
69e0: 69 64 3d 3d 30 20 29 7b 20 63 67 69 5f 72 65 64  id==0 ){ cgi_red
69f0: 69 72 65 63 74 28 22 2f 68 6f 6d 65 22 29 3b 20  irect("/home"); 
6a00: 7d 0a 20 20 69 66 28 20 67 2e 6f 6b 41 64 6d 69  }.  if( g.okAdmi
6a10: 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  n ){.    const c
6a20: 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f  har *zUuid = db_
6a30: 74 65 78 74 28 22 22 2c 20 22 53 45 4c 45 43 54  text("", "SELECT
6a40: 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20   uuid FROM blob 
6a50: 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72  WHERE rid=%d", r
6a60: 69 64 29 3b 0a 20 20 20 20 69 66 28 20 64 62 5f  id);.    if( db_
6a70: 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31  exists("SELECT 1
6a80: 20 46 52 4f 4d 20 73 68 75 6e 20 57 48 45 52 45   FROM shun WHERE
6a90: 20 75 75 69 64 3d 27 25 73 27 22 2c 20 7a 55 75   uuid='%s'", zUu
6aa0: 69 64 29 20 29 7b 0a 20 20 20 20 20 20 73 74 79  id) ){.      sty
6ab0: 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65  le_submenu_eleme
6ac0: 6e 74 28 22 55 6e 73 68 75 6e 22 2c 22 55 6e 73  nt("Unshun","Uns
6ad0: 68 75 6e 22 2c 20 22 25 73 2f 73 68 75 6e 3f 75  hun", "%s/shun?u
6ae0: 75 69 64 3d 25 73 26 73 75 62 3d 31 22 2c 0a 20  uid=%s&sub=1",. 
6af0: 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a 54 6f             g.zTo
6b00: 70 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 7d  p, zUuid);.    }
6b10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 79 6c  else{.      styl
6b20: 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e  e_submenu_elemen
6b30: 74 28 22 53 68 75 6e 22 2c 22 53 68 75 6e 22 2c  t("Shun","Shun",
6b40: 20 22 25 73 2f 73 68 75 6e 3f 73 68 75 6e 3d 25   "%s/shun?shun=%
6b50: 73 23 61 64 64 73 68 75 6e 22 2c 0a 20 20 20 20  s#addshun",.    
6b60: 20 20 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20          g.zTop, 
6b70: 7a 55 75 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  zUuid);.    }.  
6b80: 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72  }.  style_header
6b90: 28 22 41 72 74 69 66 61 63 74 20 43 6f 6e 74 65  ("Artifact Conte
6ba0: 6e 74 22 29 3b 0a 20 20 40 20 3c 68 32 3e 43 6f  nt");.  @ <h2>Co
6bb0: 6e 74 65 6e 74 20 4f 66 3a 3c 2f 68 32 3e 0a 20  ntent Of:</h2>. 
6bc0: 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a   @ <blockquote>.
6bd0: 20 20 6f 62 6a 65 63 74 5f 64 65 73 63 72 69 70    object_descrip
6be0: 74 69 6f 6e 28 72 69 64 2c 20 30 29 3b 0a 20 20  tion(rid, 0);.  
6bf0: 40 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a  @ </blockquote>.
6c00: 20 20 40 20 3c 68 72 3e 0a 20 20 40 20 3c 62 6c    @ <hr>.  @ <bl
6c10: 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 63 6f 6e 74  ockquote>.  cont
6c20: 65 6e 74 5f 67 65 74 28 72 69 64 2c 20 26 63 6f  ent_get(rid, &co
6c30: 6e 74 65 6e 74 29 3b 0a 20 20 7a 4d 69 6d 65 20  ntent);.  zMime 
6c40: 3d 20 6d 69 6d 65 74 79 70 65 5f 66 72 6f 6d 5f  = mimetype_from_
6c50: 63 6f 6e 74 65 6e 74 28 26 63 6f 6e 74 65 6e 74  content(&content
6c60: 29 3b 0a 20 20 69 66 28 20 7a 4d 69 6d 65 3d 3d  );.  if( zMime==
6c70: 30 20 29 7b 0a 20 20 20 20 40 20 3c 70 72 65 3e  0 ){.    @ <pre>
6c80: 0a 20 20 20 20 40 20 25 68 28 62 6c 6f 62 5f 73  .    @ %h(blob_s
6c90: 74 72 28 26 63 6f 6e 74 65 6e 74 29 29 0a 20 20  tr(&content)).  
6ca0: 20 20 40 20 3c 2f 70 72 65 3e 0a 20 20 20 20 73    @ </pre>.    s
6cb0: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65  tyle_submenu_ele
6cc0: 6d 65 6e 74 28 22 48 65 78 22 2c 22 48 65 78 22  ment("Hex","Hex"
6cd0: 2c 20 22 25 73 2f 68 65 78 64 75 6d 70 3f 6e 61  , "%s/hexdump?na
6ce0: 6d 65 3d 25 64 22 2c 20 67 2e 7a 54 6f 70 2c 20  me=%d", g.zTop, 
6cf0: 72 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rid);.  }else if
6d00: 28 20 73 74 72 6e 63 6d 70 28 7a 4d 69 6d 65 2c  ( strncmp(zMime,
6d10: 20 22 69 6d 61 67 65 2f 22 2c 20 36 29 3d 3d 30   "image/", 6)==0
6d20: 20 29 7b 0a 20 20 20 20 40 20 3c 69 6d 67 20 73   ){.    @ <img s
6d30: 72 63 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52  rc="%s(g.zBaseUR
6d40: 4c 29 2f 72 61 77 3f 6e 61 6d 65 3d 25 64 28 72  L)/raw?name=%d(r
6d50: 69 64 29 26 6d 3d 25 73 28 7a 4d 69 6d 65 29 22  id)&m=%s(zMime)"
6d60: 3e 3c 2f 69 6d 67 3e 0a 20 20 20 20 73 74 79 6c  ></img>.    styl
6d70: 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e  e_submenu_elemen
6d80: 74 28 22 48 65 78 22 2c 22 48 65 78 22 2c 20 22  t("Hex","Hex", "
6d90: 25 73 2f 68 65 78 64 75 6d 70 3f 6e 61 6d 65 3d  %s/hexdump?name=
6da0: 25 64 22 2c 20 67 2e 7a 54 6f 70 2c 20 72 69 64  %d", g.zTop, rid
6db0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6dc0: 40 20 3c 70 72 65 3e 0a 20 20 20 20 68 65 78 64  @ <pre>.    hexd
6dd0: 75 6d 70 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20  ump(&content);. 
6de0: 20 20 20 40 20 3c 2f 70 72 65 3e 0a 20 20 7d 0a     @ </pre>.  }.
6df0: 20 20 40 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65    @ </blockquote
6e00: 3e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72  >.  style_footer
6e10: 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42  ();.}../*.** WEB
6e20: 50 41 47 45 3a 20 74 69 6e 66 6f 0a 2a 2a 20 55  PAGE: tinfo.** U
6e30: 52 4c 3a 20 2f 74 69 6e 66 6f 3f 6e 61 6d 65 3d  RL: /tinfo?name=
6e40: 41 52 54 49 46 41 43 54 49 44 0a 2a 2a 0a 2a 2a  ARTIFACTID.**.**
6e50: 20 53 68 6f 77 20 74 68 65 20 64 65 74 61 69 6c   Show the detail
6e60: 73 20 6f 66 20 61 20 74 69 63 6b 65 74 20 63 68  s of a ticket ch
6e70: 61 6e 67 65 20 63 6f 6e 74 72 6f 6c 20 61 72 74  ange control art
6e80: 69 66 61 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 74  ifact..*/.void t
6e90: 69 6e 66 6f 5f 70 61 67 65 28 76 6f 69 64 29 7b  info_page(void){
6ea0: 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 42 6c  .  int rid;.  Bl
6eb0: 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 63 68  ob content;.  ch
6ec0: 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20 63 6f 6e  ar *zDate;.  con
6ed0: 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64 3b 0a  st char *zUuid;.
6ee0: 20 20 63 68 61 72 20 7a 54 6b 74 4e 61 6d 65 5b    char zTktName[
6ef0: 32 30 5d 3b 0a 20 20 4d 61 6e 69 66 65 73 74 20  20];.  Manifest 
6f00: 6d 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63  m;..  login_chec
6f10: 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b  k_credentials();
6f20: 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52 64 54 6b  .  if( !g.okRdTk
6f30: 74 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65  t ){ login_neede
6f40: 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20  d(); return; }. 
6f50: 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72   rid = name_to_r
6f60: 69 64 28 50 44 28 22 6e 61 6d 65 22 2c 22 30 22  id(PD("name","0"
6f70: 29 29 3b 0a 20 20 69 66 28 20 72 69 64 3d 3d 30  ));.  if( rid==0
6f80: 20 29 7b 20 66 6f 73 73 69 6c 5f 72 65 64 69 72   ){ fossil_redir
6f90: 65 63 74 5f 68 6f 6d 65 28 29 3b 20 7d 0a 20 20  ect_home(); }.  
6fa0: 7a 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28  zUuid = db_text(
6fb0: 22 22 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64  "", "SELECT uuid
6fc0: 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45   FROM blob WHERE
6fd0: 20 72 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a   rid=%d", rid);.
6fe0: 20 20 69 66 28 20 67 2e 6f 6b 41 64 6d 69 6e 20    if( g.okAdmin 
6ff0: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 5f 65 78  ){.    if( db_ex
7000: 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46  ists("SELECT 1 F
7010: 52 4f 4d 20 73 68 75 6e 20 57 48 45 52 45 20 75  ROM shun WHERE u
7020: 75 69 64 3d 27 25 73 27 22 2c 20 7a 55 75 69 64  uid='%s'", zUuid
7030: 29 20 29 7b 0a 20 20 20 20 20 20 73 74 79 6c 65  ) ){.      style
7040: 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74  _submenu_element
7050: 28 22 55 6e 73 68 75 6e 22 2c 22 55 6e 73 68 75  ("Unshun","Unshu
7060: 6e 22 2c 20 22 25 73 2f 73 68 75 6e 3f 75 75 69  n", "%s/shun?uui
7070: 64 3d 25 73 26 73 75 62 3d 31 22 2c 0a 20 20 20  d=%s&sub=1",.   
7080: 20 20 20 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c           g.zTop,
7090: 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 7d 65 6c   zUuid);.    }el
70a0: 73 65 7b 0a 20 20 20 20 20 20 73 74 79 6c 65 5f  se{.      style_
70b0: 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28  submenu_element(
70c0: 22 53 68 75 6e 22 2c 22 53 68 75 6e 22 2c 20 22  "Shun","Shun", "
70d0: 25 73 2f 73 68 75 6e 3f 73 68 75 6e 3d 25 73 23  %s/shun?shun=%s#
70e0: 61 64 64 73 68 75 6e 22 2c 0a 20 20 20 20 20 20  addshun",.      
70f0: 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 55        g.zTop, zU
7100: 75 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  uid);.    }.  }.
7110: 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69    content_get(ri
7120: 64 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20  d, &content);.  
7130: 69 66 28 20 6d 61 6e 69 66 65 73 74 5f 70 61 72  if( manifest_par
7140: 73 65 28 26 6d 2c 20 26 63 6f 6e 74 65 6e 74 29  se(&m, &content)
7150: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69  ==0 ){.    fossi
7160: 6c 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28  l_redirect_home(
7170: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 2e 74  );.  }.  if( m.t
7180: 79 70 65 21 3d 43 46 54 59 50 45 5f 54 49 43 4b  ype!=CFTYPE_TICK
7190: 45 54 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c  ET ){.    fossil
71a0: 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29  _redirect_home()
71b0: 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65  ;.  }.  style_he
71c0: 61 64 65 72 28 22 54 69 63 6b 65 74 20 43 68 61  ader("Ticket Cha
71d0: 6e 67 65 20 44 65 74 61 69 6c 73 22 29 3b 0a 20  nge Details");. 
71e0: 20 7a 44 61 74 65 20 3d 20 64 62 5f 74 65 78 74   zDate = db_text
71f0: 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65  (0, "SELECT date
7200: 74 69 6d 65 28 25 2e 31 32 66 29 22 2c 20 6d 2e  time(%.12f)", m.
7210: 72 44 61 74 65 29 3b 0a 20 20 6d 65 6d 63 70 79  rDate);.  memcpy
7220: 28 7a 54 6b 74 4e 61 6d 65 2c 20 6d 2e 7a 54 69  (zTktName, m.zTi
7230: 63 6b 65 74 55 75 69 64 2c 20 31 30 29 3b 0a 20  cketUuid, 10);. 
7240: 20 7a 54 6b 74 4e 61 6d 65 5b 31 30 5d 20 3d 20   zTktName[10] = 
7250: 30 3b 0a 20 20 40 20 3c 68 32 3e 43 68 61 6e 67  0;.  @ <h2>Chang
7260: 65 73 20 74 6f 20 74 69 63 6b 65 74 20 3c 61 20  es to ticket <a 
7270: 68 72 65 66 3d 22 25 73 28 6d 2e 7a 54 69 63 6b  href="%s(m.zTick
7280: 65 74 55 75 69 64 29 22 3e 25 73 28 7a 54 6b 74  etUuid)">%s(zTkt
7290: 4e 61 6d 65 29 3c 2f 61 3e 3c 2f 68 32 3e 0a 20  Name)</a></h2>. 
72a0: 20 40 0a 20 20 40 20 3c 70 3e 42 79 20 25 68 28   @.  @ <p>By %h(
72b0: 6d 2e 7a 55 73 65 72 29 20 6f 6e 20 25 73 28 7a  m.zUser) on %s(z
72c0: 44 61 74 65 29 2e 20 20 53 65 65 20 61 6c 73 6f  Date).  See also
72d0: 3a 0a 20 20 40 20 3c 61 20 68 72 65 66 3d 22 25  :.  @ <a href="%
72e0: 73 28 67 2e 7a 54 6f 70 29 2f 61 72 74 69 66 61  s(g.zTop)/artifa
72f0: 63 74 2f 25 54 28 7a 55 75 69 64 29 22 3e 61 72  ct/%T(zUuid)">ar
7300: 74 69 66 61 63 74 20 63 6f 6e 74 65 6e 74 3c 2f  tifact content</
7310: 61 3e 2c 20 61 6e 64 0a 20 20 40 20 3c 61 20 68  a>, and.  @ <a h
7320: 72 65 66 3d 22 25 73 28 67 2e 7a 54 6f 70 29 2f  ref="%s(g.zTop)/
7330: 74 6b 74 68 69 73 74 6f 72 79 2f 25 73 28 6d 2e  tkthistory/%s(m.
7340: 7a 54 69 63 6b 65 74 55 75 69 64 29 22 3e 74 69  zTicketUuid)">ti
7350: 63 6b 65 74 20 68 69 73 74 6f 72 79 3c 2f 61 3e  cket history</a>
7360: 0a 20 20 40 20 3c 2f 70 3e 0a 20 20 40 0a 20 20  .  @ </p>.  @.  
7370: 40 20 3c 6f 6c 3e 0a 20 20 66 72 65 65 28 7a 44  @ <ol>.  free(zD
7380: 61 74 65 29 3b 0a 20 20 74 69 63 6b 65 74 5f 6f  ate);.  ticket_o
7390: 75 74 70 75 74 5f 63 68 61 6e 67 65 5f 61 72 74  utput_change_art
73a0: 69 66 61 63 74 28 26 6d 29 3b 0a 20 20 6d 61 6e  ifact(&m);.  man
73b0: 69 66 65 73 74 5f 63 6c 65 61 72 28 26 6d 29 3b  ifest_clear(&m);
73c0: 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28  .  style_footer(
73d0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42  );.}.../*.** WEB
73e0: 50 41 47 45 3a 20 69 6e 66 6f 0a 2a 2a 20 55 52  PAGE: info.** UR
73f0: 4c 3a 20 69 6e 66 6f 2f 41 52 54 49 46 41 43 54  L: info/ARTIFACT
7400: 49 44 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67  ID.**.** The arg
7410: 75 6d 65 6e 74 20 69 73 20 61 20 61 72 74 69 66  ument is a artif
7420: 61 63 74 20 49 44 20 77 68 69 63 68 20 6d 69 67  act ID which mig
7430: 68 74 20 62 65 20 61 20 62 61 73 65 6c 69 6e 65  ht be a baseline
7440: 20 6f 72 20 61 20 66 69 6c 65 20 6f 72 0a 2a 2a   or a file or.**
7450: 20 61 20 74 69 63 6b 65 74 20 63 68 61 6e 67 65   a ticket change
7460: 73 20 6f 72 20 61 20 77 69 6b 69 20 65 64 69 74  s or a wiki edit
7470: 6f 72 20 6f 72 20 73 6f 6d 65 74 68 69 6e 67 20  or or something 
7480: 65 6c 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 46 69 67  else. .**.** Fig
7490: 75 72 65 20 6f 75 74 20 77 68 61 74 20 74 68 65  ure out what the
74a0: 20 61 72 74 69 66 61 63 74 20 49 44 20 69 73 20   artifact ID is 
74b0: 61 6e 64 20 6a 75 6d 70 20 74 6f 20 69 74 2e 0a  and jump to it..
74c0: 2a 2f 0a 76 6f 69 64 20 69 6e 66 6f 5f 70 61 67  */.void info_pag
74d0: 65 28 76 6f 69 64 29 7b 0a 20 20 63 6f 6e 73 74  e(void){.  const
74e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
74f0: 42 6c 6f 62 20 75 75 69 64 3b 0a 20 20 69 6e 74  Blob uuid;.  int
7500: 20 72 69 64 2c 20 6e 4e 61 6d 65 3b 0a 20 20 0a   rid, nName;.  .
7510: 20 20 7a 4e 61 6d 65 20 3d 20 50 28 22 6e 61 6d    zName = P("nam
7520: 65 22 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  e");.  if( zName
7530: 3d 3d 30 20 29 20 66 6f 73 73 69 6c 5f 72 65 64  ==0 ) fossil_red
7540: 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b 0a 20 20  irect_home();.  
7550: 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  nName = strlen(z
7560: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 4e 61  Name);.  if( nNa
7570: 6d 65 3c 34 20 7c 7c 20 6e 4e 61 6d 65 3e 55 55  me<4 || nName>UU
7580: 49 44 5f 53 49 5a 45 20 7c 7c 20 21 76 61 6c 69  ID_SIZE || !vali
7590: 64 61 74 65 31 36 28 7a 4e 61 6d 65 2c 20 6e 4e  date16(zName, nN
75a0: 61 6d 65 29 20 29 7b 0a 20 20 20 20 73 77 69 74  ame) ){.    swit
75b0: 63 68 28 20 73 79 6d 5f 74 61 67 5f 74 6f 5f 75  ch( sym_tag_to_u
75c0: 75 69 64 28 7a 4e 61 6d 65 2c 20 26 75 75 69 64  uid(zName, &uuid
75d0: 29 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  ) ){.      case 
75e0: 31 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1: {.        /* 
75f0: 67 6f 74 20 6f 6e 65 20 55 55 49 44 2c 20 75 73  got one UUID, us
7600: 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  e it */.        
7610: 7a 4e 61 6d 65 20 3d 20 62 6c 6f 62 5f 73 74 72  zName = blob_str
7620: 28 26 75 75 69 64 29 3b 0a 20 20 20 20 20 20 20  (&uuid);.       
7630: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7640: 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 7b 0a        case 2: {.
7650: 20 20 20 20 20 20 20 20 2f 2a 20 67 6f 20 73 6f          /* go so
7660: 6d 65 77 68 65 72 65 20 74 6f 20 73 68 6f 77 20  mewhere to show 
7670: 74 68 65 20 6d 75 6c 74 69 70 6c 65 20 55 55 49  the multiple UUI
7680: 44 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 61  Ds */.        ta
7690: 67 76 69 65 77 5f 70 61 67 65 28 29 3b 0a 20 20  gview_page();.  
76a0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
76b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
76c0: 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75     }.      defau
76d0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 6f  lt: {.        fo
76e0: 73 73 69 6c 5f 72 65 64 69 72 65 63 74 5f 68 6f  ssil_redirect_ho
76f0: 6d 65 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72  me();.        br
7700: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
7710: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 5f   }.  }.  if( db_
7720: 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31  exists("SELECT 1
7730: 20 46 52 4f 4d 20 74 69 63 6b 65 74 20 57 48 45   FROM ticket WHE
7740: 52 45 20 74 6b 74 5f 75 75 69 64 20 47 4c 4f 42  RE tkt_uuid GLOB
7750: 20 27 25 73 2a 27 22 2c 20 7a 4e 61 6d 65 29 20   '%s*'", zName) 
7760: 29 7b 0a 20 20 20 20 74 6b 74 76 69 65 77 5f 70  ){.    tktview_p
7770: 61 67 65 28 29 3b 0a 20 20 20 20 72 65 74 75 72  age();.    retur
7780: 6e 3b 0a 20 20 7d 0a 20 20 72 69 64 20 3d 20 64  n;.  }.  rid = d
7790: 62 5f 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 54  b_int(0, "SELECT
77a0: 20 72 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57   rid FROM blob W
77b0: 48 45 52 45 20 75 75 69 64 20 47 4c 4f 42 20 27  HERE uuid GLOB '
77c0: 25 73 2a 27 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  %s*'", zName);. 
77d0: 20 69 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a 20   if( rid==0 ){. 
77e0: 20 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28     style_header(
77f0: 22 42 72 6f 6b 65 6e 20 4c 69 6e 6b 22 29 3b 0a  "Broken Link");.
7800: 20 20 20 20 40 20 3c 70 3e 4e 6f 20 73 75 63 68      @ <p>No such
7810: 20 6f 62 6a 65 63 74 3a 20 25 68 28 7a 4e 61 6d   object: %h(zNam
7820: 65 29 3c 2f 70 3e 0a 20 20 20 20 73 74 79 6c 65  e)</p>.    style
7830: 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20 20 20 72  _footer();.    r
7840: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
7850: 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45   db_exists("SELE
7860: 43 54 20 31 20 46 52 4f 4d 20 6d 6c 69 6e 6b 20  CT 1 FROM mlink 
7870: 57 48 45 52 45 20 6d 69 64 3d 25 64 22 2c 20 72  WHERE mid=%d", r
7880: 69 64 29 20 29 7b 0a 20 20 20 20 76 69 6e 66 6f  id) ){.    vinfo
7890: 5f 70 61 67 65 28 29 3b 0a 20 20 7d 65 6c 73 65  _page();.  }else
78a0: 0a 20 20 69 66 28 20 64 62 5f 65 78 69 73 74 73  .  if( db_exists
78b0: 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  ("SELECT 1 FROM 
78c0: 6d 6c 69 6e 6b 20 57 48 45 52 45 20 66 69 64 3d  mlink WHERE fid=
78d0: 25 64 22 2c 20 72 69 64 29 20 29 7b 0a 20 20 20  %d", rid) ){.   
78e0: 20 66 69 6e 66 6f 5f 70 61 67 65 28 29 3b 0a 20   finfo_page();. 
78f0: 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 64 62 5f   }else.  if( db_
7900: 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31  exists("SELECT 1
7910: 20 46 52 4f 4d 20 74 61 67 78 72 65 66 20 4a 4f   FROM tagxref JO
7920: 49 4e 20 74 61 67 20 55 53 49 4e 47 28 74 61 67  IN tag USING(tag
7930: 69 64 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  id)".           
7940: 20 20 20 20 20 22 20 57 48 45 52 45 20 72 69 64       " WHERE rid
7950: 3d 25 64 20 41 4e 44 20 74 61 67 6e 61 6d 65 20  =%d AND tagname 
7960: 4c 49 4b 45 20 27 77 69 6b 69 2d 25 25 27 22 2c  LIKE 'wiki-%%'",
7970: 20 72 69 64 29 20 29 7b 0a 20 20 20 20 77 69 6e   rid) ){.    win
7980: 66 6f 5f 70 61 67 65 28 29 3b 0a 20 20 7d 65 6c  fo_page();.  }el
7990: 73 65 0a 20 20 69 66 28 20 64 62 5f 65 78 69 73  se.  if( db_exis
79a0: 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f  ts("SELECT 1 FRO
79b0: 4d 20 74 61 67 78 72 65 66 20 4a 4f 49 4e 20 74  M tagxref JOIN t
79c0: 61 67 20 55 53 49 4e 47 28 74 61 67 69 64 29 22  ag USING(tagid)"
79d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
79e0: 20 22 20 57 48 45 52 45 20 72 69 64 3d 25 64 20   " WHERE rid=%d 
79f0: 41 4e 44 20 74 61 67 6e 61 6d 65 20 4c 49 4b 45  AND tagname LIKE
7a00: 20 27 74 6b 74 2d 25 25 27 22 2c 20 72 69 64 29   'tkt-%%'", rid)
7a10: 20 29 7b 0a 20 20 20 20 74 69 6e 66 6f 5f 70 61   ){.    tinfo_pa
7a20: 67 65 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20  ge();.  }else.  
7a30: 69 66 28 20 64 62 5f 65 78 69 73 74 73 28 22 53  if( db_exists("S
7a40: 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 6c 69  ELECT 1 FROM pli
7a50: 6e 6b 20 57 48 45 52 45 20 63 69 64 3d 25 64 22  nk WHERE cid=%d"
7a60: 2c 20 72 69 64 29 20 29 7b 0a 20 20 20 20 76 69  , rid) ){.    vi
7a70: 6e 66 6f 5f 70 61 67 65 28 29 3b 0a 20 20 7d 65  nfo_page();.  }e
7a80: 6c 73 65 0a 20 20 7b 0a 20 20 20 20 61 72 74 69  lse.  {.    arti
7a90: 66 61 63 74 5f 70 61 67 65 28 29 3b 0a 20 20 7d  fact_page();.  }
7aa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47  .}../*.** WEBPAG
7ab0: 45 3a 20 76 65 64 69 74 0a 2a 2a 20 55 52 4c 3a  E: vedit.** URL:
7ac0: 20 20 76 65 64 69 74 3f 72 3d 52 49 44 26 63 3d    vedit?r=RID&c=
7ad0: 4e 45 57 43 4f 4d 4d 45 4e 54 26 75 3d 4e 45 57  NEWCOMMENT&u=NEW
7ae0: 55 53 45 52 0a 2a 2a 0a 2a 2a 20 50 72 65 73 65  USER.**.** Prese
7af0: 6e 74 20 61 20 64 69 61 6c 6f 67 20 66 6f 72 20  nt a dialog for 
7b00: 75 70 64 61 74 69 6e 67 20 70 72 6f 70 65 72 74  updating propert
7b10: 69 65 73 20 6f 66 20 61 20 62 61 73 65 6c 69 6e  ies of a baselin
7b20: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20  e:.**.**     *  
7b30: 54 68 65 20 63 68 65 63 6b 2d 69 6e 20 75 73 65  The check-in use
7b40: 72 0a 2a 2a 20 20 20 20 20 2a 20 20 54 68 65 20  r.**     *  The 
7b50: 63 68 65 63 6b 2d 69 6e 20 63 6f 6d 6d 65 6e 74  check-in comment
7b60: 0a 2a 2a 20 20 20 20 20 2a 20 20 54 68 65 20 62  .**     *  The b
7b70: 61 63 6b 67 72 6f 75 6e 64 20 63 6f 6c 6f 72 2e  ackground color.
7b80: 0a 2a 2f 0a 76 6f 69 64 20 76 65 64 69 74 5f 70  .*/.void vedit_p
7b90: 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  age(void){.  int
7ba0: 20 72 69 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68   rid;.  const ch
7bb0: 61 72 20 2a 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  ar *zComment;.  
7bc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77  const char *zNew
7bd0: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 63 6f 6e 73 74  Comment;.  const
7be0: 20 63 68 61 72 20 2a 7a 55 73 65 72 3b 0a 20 20   char *zUser;.  
7bf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77  const char *zNew
7c00: 55 73 65 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68  User;.  const ch
7c10: 61 72 20 2a 7a 43 6f 6c 6f 72 3b 0a 20 20 63 6f  ar *zColor;.  co
7c20: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 43 6f  nst char *zNewCo
7c30: 6c 6f 72 3b 0a 20 20 69 6e 74 20 66 50 72 6f 70  lor;.  int fProp
7c40: 61 67 61 74 65 43 6f 6c 6f 72 3b 0a 20 20 63 68  agateColor;.  ch
7c50: 61 72 20 2a 7a 55 75 69 64 3b 0a 20 20 42 6c 6f  ar *zUuid;.  Blo
7c60: 62 20 63 6f 6d 6d 65 6e 74 3b 0a 20 20 73 74 61  b comment;.  sta
7c70: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
7c80: 20 53 61 6d 70 6c 65 43 6f 6c 6f 72 73 20 7b 0a   SampleColors {.
7c90: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
7ca0: 2a 7a 43 4e 61 6d 65 3b 0a 20 20 20 20 20 63 6f  *zCName;.     co
7cb0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6f 72  nst char *zColor
7cc0: 3b 0a 20 20 7d 20 61 43 6f 6c 6f 72 5b 5d 20 3d  ;.  } aColor[] =
7cd0: 20 7b 0a 20 20 20 20 20 7b 20 22 28 6e 6f 6e 65   {.     { "(none
7ce0: 29 22 2c 20 20 22 22 20 7d 2c 0a 20 20 20 20 20  )",  "" },.     
7cf0: 7b 20 22 23 66 32 64 63 64 63 22 2c 20 22 23 66  { "#f2dcdc", "#f
7d00: 32 64 63 64 63 22 20 7d 2c 0a 20 20 20 20 20 7b  2dcdc" },.     {
7d10: 20 22 23 66 30 66 66 63 30 22 2c 20 22 23 66 30   "#f0ffc0", "#f0
7d20: 66 66 63 30 22 20 7d 2c 0a 20 20 20 20 20 7b 20  ffc0" },.     { 
7d30: 22 23 62 64 65 35 64 36 22 2c 20 22 23 62 64 65  "#bde5d6", "#bde
7d40: 35 64 36 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22  5d6" },.     { "
7d50: 23 63 30 66 66 63 30 22 2c 20 22 23 63 30 66 66  #c0ffc0", "#c0ff
7d60: 63 30 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23  c0" },.     { "#
7d70: 63 30 66 66 66 30 22 2c 20 22 23 63 30 66 66 66  c0fff0", "#c0fff
7d80: 30 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23 63  0" },.     { "#c
7d90: 30 66 30 66 66 22 2c 20 22 23 63 30 66 30 66 66  0f0ff", "#c0f0ff
7da0: 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23 64 30  " },.     { "#d0
7db0: 63 30 66 66 22 2c 20 22 23 64 30 63 30 66 66 22  c0ff", "#d0c0ff"
7dc0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23 66 66 63   },.     { "#ffc
7dd0: 30 66 66 22 2c 20 22 23 66 66 63 30 66 66 22 20  0ff", "#ffc0ff" 
7de0: 7d 2c 0a 20 20 20 20 20 7b 20 22 23 66 66 63 30  },.     { "#ffc0
7df0: 64 30 22 2c 20 22 23 66 66 63 30 64 30 22 20 7d  d0", "#ffc0d0" }
7e00: 2c 0a 20 20 20 20 20 7b 20 22 23 66 66 66 30 63  ,.     { "#fff0c
7e10: 30 22 2c 20 22 23 66 66 66 30 63 30 22 20 7d 2c  0", "#fff0c0" },
7e20: 0a 20 20 20 20 20 7b 20 22 23 63 30 63 30 63 30  .     { "#c0c0c0
7e30: 22 2c 20 22 23 63 30 63 30 63 30 22 20 7d 2c 0a  ", "#c0c0c0" },.
7e40: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
7e50: 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63  .  login_check_c
7e60: 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20  redentials();.  
7e70: 69 66 28 20 21 67 2e 6f 6b 57 72 69 74 65 20 29  if( !g.okWrite )
7e80: 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29  { login_needed()
7e90: 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 72 69  ; return; }.  ri
7ea0: 64 20 3d 20 61 74 6f 69 28 50 44 28 22 72 22 2c  d = atoi(PD("r",
7eb0: 22 30 22 29 29 3b 0a 20 20 7a 43 6f 6d 6d 65 6e  "0"));.  zCommen
7ec0: 74 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22  t = db_text(0, "
7ed0: 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28  SELECT coalesce(
7ee0: 65 63 6f 6d 6d 65 6e 74 2c 63 6f 6d 6d 65 6e 74  ecomment,comment
7ef0: 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )".             
7f00: 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52             "  FR
7f10: 4f 4d 20 65 76 65 6e 74 20 57 48 45 52 45 20 6f  OM event WHERE o
7f20: 62 6a 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a  bjid=%d", rid);.
7f30: 20 20 69 66 28 20 7a 43 6f 6d 6d 65 6e 74 3d 3d    if( zComment==
7f40: 30 20 29 20 66 6f 73 73 69 6c 5f 72 65 64 69 72  0 ) fossil_redir
7f50: 65 63 74 5f 68 6f 6d 65 28 29 3b 0a 20 20 7a 4e  ect_home();.  zN
7f60: 65 77 43 6f 6d 6d 65 6e 74 20 3d 20 50 44 28 22  ewComment = PD("
7f70: 63 22 2c 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  c",zComment);.  
7f80: 7a 55 73 65 72 20 3d 20 64 62 5f 74 65 78 74 28  zUser = db_text(
7f90: 30 2c 20 22 53 45 4c 45 43 54 20 63 6f 61 6c 65  0, "SELECT coale
7fa0: 73 63 65 28 65 75 73 65 72 2c 75 73 65 72 29 22  sce(euser,user)"
7fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7fc0: 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 65 76        "  FROM ev
7fd0: 65 6e 74 20 57 48 45 52 45 20 6f 62 6a 69 64 3d  ent WHERE objid=
7fe0: 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 69 66 28  %d", rid);.  if(
7ff0: 20 7a 55 73 65 72 3d 3d 30 20 29 20 66 6f 73 73   zUser==0 ) foss
8000: 69 6c 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65  il_redirect_home
8010: 28 29 3b 0a 20 20 7a 4e 65 77 55 73 65 72 20 3d  ();.  zNewUser =
8020: 20 50 44 28 22 75 22 2c 7a 55 73 65 72 29 3b 0a   PD("u",zUser);.
8030: 20 20 7a 43 6f 6c 6f 72 20 3d 20 64 62 5f 74 65    zColor = db_te
8040: 78 74 28 22 22 2c 20 22 53 45 4c 45 43 54 20 62  xt("", "SELECT b
8050: 67 63 6f 6c 6f 72 22 0a 20 20 20 20 20 20 20 20  gcolor".        
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8070: 22 20 20 46 52 4f 4d 20 65 76 65 6e 74 20 57 48  "  FROM event WH
8080: 45 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c 20 72  ERE objid=%d", r
8090: 69 64 29 3b 0a 20 20 7a 4e 65 77 43 6f 6c 6f 72  id);.  zNewColor
80a0: 20 3d 20 50 44 28 22 63 6c 72 22 2c 7a 43 6f 6c   = PD("clr",zCol
80b0: 6f 72 29 3b 0a 20 20 66 50 72 6f 70 61 67 61 74  or);.  fPropagat
80c0: 65 43 6f 6c 6f 72 20 3d 20 50 28 22 70 63 6c 72  eColor = P("pclr
80d0: 22 29 21 3d 30 3b 0a 20 20 7a 55 75 69 64 20 3d  ")!=0;.  zUuid =
80e0: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
80f0: 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c  ECT uuid FROM bl
8100: 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22  ob WHERE rid=%d"
8110: 2c 20 72 69 64 29 3b 0a 20 20 69 66 28 20 50 28  , rid);.  if( P(
8120: 22 63 61 6e 63 65 6c 22 29 20 29 7b 0a 20 20 20  "cancel") ){.   
8130: 20 63 67 69 5f 72 65 64 69 72 65 63 74 66 28 22   cgi_redirectf("
8140: 76 69 6e 66 6f 3f 6e 61 6d 65 3d 25 64 22 2c 20  vinfo?name=%d", 
8150: 72 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rid);.  }.  if( 
8160: 50 28 22 61 70 70 6c 79 22 29 20 29 7b 0a 20 20  P("apply") ){.  
8170: 20 20 42 6c 6f 62 20 63 74 72 6c 3b 0a 20 20 20    Blob ctrl;.   
8180: 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a 20 20   char *zDate;.  
8190: 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b    int nChng = 0;
81a0: 0a 0a 20 20 20 20 6c 6f 67 69 6e 5f 76 65 72 69  ..    login_veri
81b0: 66 79 5f 63 73 72 66 5f 73 65 63 72 65 74 28 29  fy_csrf_secret()
81c0: 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28  ;.    blob_zero(
81d0: 26 63 74 72 6c 29 3b 0a 20 20 20 20 7a 44 61 74  &ctrl);.    zDat
81e0: 65 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22  e = db_text(0, "
81f0: 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28  SELECT datetime(
8200: 27 6e 6f 77 27 29 22 29 3b 0a 20 20 20 20 7a 44  'now')");.    zD
8210: 61 74 65 5b 31 30 5d 20 3d 20 27 54 27 3b 0a 20  ate[10] = 'T';. 
8220: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
8230: 26 63 74 72 6c 2c 20 22 44 20 25 73 5c 6e 22 2c  &ctrl, "D %s\n",
8240: 20 7a 44 61 74 65 29 3b 0a 20 20 20 20 69 66 28   zDate);.    if(
8250: 20 7a 4e 65 77 43 6f 6c 6f 72 5b 30 5d 20 26 26   zNewColor[0] &&
8260: 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6f 72 2c 7a   strcmp(zColor,z
8270: 4e 65 77 43 6f 6c 6f 72 29 21 3d 30 20 29 7b 0a  NewColor)!=0 ){.
8280: 20 20 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20        nChng++;. 
8290: 20 20 20 20 20 69 66 28 20 66 50 72 6f 70 61 67       if( fPropag
82a0: 61 74 65 43 6f 6c 6f 72 20 29 7b 0a 20 20 20 20  ateColor ){.    
82b0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
82c0: 28 26 63 74 72 6c 2c 20 22 54 20 2a 62 67 63 6f  (&ctrl, "T *bgco
82d0: 6c 6f 72 20 25 73 20 25 46 5c 6e 22 2c 20 7a 55  lor %s %F\n", zU
82e0: 75 69 64 2c 20 7a 4e 65 77 43 6f 6c 6f 72 29 3b  uid, zNewColor);
82f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8300: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
8310: 64 66 28 26 63 74 72 6c 2c 20 22 54 20 2b 62 67  df(&ctrl, "T +bg
8320: 63 6f 6c 6f 72 20 25 73 20 25 46 5c 6e 22 2c 20  color %s %F\n", 
8330: 7a 55 75 69 64 2c 20 7a 4e 65 77 43 6f 6c 6f 72  zUuid, zNewColor
8340: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8350: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
8360: 7a 43 6f 6d 6d 65 6e 74 2c 7a 4e 65 77 43 6f 6d  zComment,zNewCom
8370: 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  ment)!=0 ){.    
8380: 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 20    nChng++;.     
8390: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 63   blob_appendf(&c
83a0: 74 72 6c 2c 20 22 54 20 2b 63 6f 6d 6d 65 6e 74  trl, "T +comment
83b0: 20 25 73 20 25 46 5c 6e 22 2c 20 7a 55 75 69 64   %s %F\n", zUuid
83c0: 2c 20 7a 4e 65 77 43 6f 6d 6d 65 6e 74 29 3b 0a  , zNewComment);.
83d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
83e0: 72 63 6d 70 28 7a 55 73 65 72 2c 7a 4e 65 77 55  rcmp(zUser,zNewU
83f0: 73 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ser)!=0 ){.     
8400: 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 20 20   nChng++;.      
8410: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 63 74  blob_appendf(&ct
8420: 72 6c 2c 20 22 54 20 2b 75 73 65 72 20 25 73 20  rl, "T +user %s 
8430: 25 46 5c 6e 22 2c 20 7a 55 75 69 64 2c 20 7a 4e  %F\n", zUuid, zN
8440: 65 77 55 73 65 72 29 3b 0a 20 20 20 20 7d 0a 20  ewUser);.    }. 
8450: 20 20 20 69 66 28 20 7a 4e 65 77 43 6f 6c 6f 72     if( zNewColor
8460: 5b 30 5d 3d 3d 30 20 26 26 20 7a 43 6f 6c 6f 72  [0]==0 && zColor
8470: 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]!=0 ){.      
8480: 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 62  nChng++;.      b
8490: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 63 74 72  lob_appendf(&ctr
84a0: 6c 2c 20 22 54 20 2d 62 67 63 6f 6c 6f 72 20 25  l, "T -bgcolor %
84b0: 73 5c 6e 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20  s\n", zUuid);.  
84c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 43 68 6e    }.    if( nChn
84d0: 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  g>0 ){.      int
84e0: 20 6e 72 69 64 3b 0a 20 20 20 20 20 20 42 6c 6f   nrid;.      Blo
84f0: 62 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 62  b cksum;.      b
8500: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 63 74 72  lob_appendf(&ctr
8510: 6c 2c 20 22 55 20 25 46 5c 6e 22 2c 20 67 2e 7a  l, "U %F\n", g.z
8520: 4c 6f 67 69 6e 29 3b 0a 20 20 20 20 20 20 6d 64  Login);.      md
8530: 35 73 75 6d 5f 62 6c 6f 62 28 26 63 74 72 6c 2c  5sum_blob(&ctrl,
8540: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20   &cksum);.      
8550: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 63 74  blob_appendf(&ct
8560: 72 6c 2c 20 22 5a 20 25 62 5c 6e 22 2c 20 26 63  rl, "Z %b\n", &c
8570: 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 64 62 5f  ksum);.      db_
8580: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
8590: 6e 28 29 3b 0a 20 20 20 20 20 20 6e 72 69 64 20  n();.      nrid 
85a0: 3d 20 63 6f 6e 74 65 6e 74 5f 70 75 74 28 26 63  = content_put(&c
85b0: 74 72 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  trl, 0, 0);.    
85c0: 20 20 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73 73    manifest_cross
85d0: 6c 69 6e 6b 28 6e 72 69 64 2c 20 26 63 74 72 6c  link(nrid, &ctrl
85e0: 29 3b 0a 20 20 20 20 20 20 64 62 5f 65 6e 64 5f  );.      db_end_
85f0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 30 29 3b 0a  transaction(0);.
8600: 20 20 20 20 7d 0a 20 20 20 20 63 67 69 5f 72 65      }.    cgi_re
8610: 64 69 72 65 63 74 66 28 22 76 69 6e 66 6f 3f 6e  directf("vinfo?n
8620: 61 6d 65 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20  ame=%d", rid);. 
8630: 20 7d 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26   }.  blob_zero(&
8640: 63 6f 6d 6d 65 6e 74 29 3b 0a 20 20 62 6c 6f 62  comment);.  blob
8650: 5f 61 70 70 65 6e 64 28 26 63 6f 6d 6d 65 6e 74  _append(&comment
8660: 2c 20 7a 4e 65 77 43 6f 6d 6d 65 6e 74 2c 20 2d  , zNewComment, -
8670: 31 29 3b 0a 20 20 7a 55 75 69 64 5b 31 30 5d 20  1);.  zUuid[10] 
8680: 3d 20 30 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61  = 0;.  style_hea
8690: 64 65 72 28 22 45 64 69 74 20 42 61 73 65 6c 69  der("Edit Baseli
86a0: 6e 65 20 5b 25 73 5d 22 2c 20 7a 55 75 69 64 29  ne [%s]", zUuid)
86b0: 3b 0a 20 20 69 66 28 20 50 28 22 70 72 65 76 69  ;.  if( P("previ
86c0: 65 77 22 29 20 29 7b 0a 20 20 20 20 40 20 3c 62  ew") ){.    @ <b
86d0: 3e 50 72 65 76 69 65 77 3a 3c 2f 62 3e 0a 20 20  >Preview:</b>.  
86e0: 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e    @ <blockquote>
86f0: 0a 20 20 20 20 40 20 3c 74 61 62 6c 65 20 62 6f  .    @ <table bo
8700: 72 64 65 72 3d 30 3e 0a 20 20 20 20 69 66 28 20  rder=0>.    if( 
8710: 7a 4e 65 77 43 6f 6c 6f 72 20 26 26 20 7a 4e 65  zNewColor && zNe
8720: 77 43 6f 6c 6f 72 5b 30 5d 20 29 7b 0a 20 20 20  wColor[0] ){.   
8730: 20 20 20 40 20 3c 74 72 3e 3c 74 64 20 62 67 63     @ <tr><td bgc
8740: 6f 6c 6f 72 3d 22 25 68 28 7a 4e 65 77 43 6f 6c  olor="%h(zNewCol
8750: 6f 72 29 22 3e 0a 20 20 20 20 7d 65 6c 73 65 7b  or)">.    }else{
8760: 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 64  .      @ <tr><td
8770: 3e 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6b 69  >.    }.    wiki
8780: 5f 63 6f 6e 76 65 72 74 28 26 63 6f 6d 6d 65 6e  _convert(&commen
8790: 74 2c 20 30 2c 20 57 49 4b 49 5f 49 4e 4c 49 4e  t, 0, WIKI_INLIN
87a0: 45 29 3b 0a 20 20 20 20 40 20 28 75 73 65 72 3a  E);.    @ (user:
87b0: 20 25 68 28 7a 4e 65 77 55 73 65 72 29 29 0a 20   %h(zNewUser)). 
87c0: 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 3c     @ </td></tr><
87d0: 2f 74 61 62 6c 65 3e 0a 20 20 20 20 40 20 3c 2f  /table>.    @ </
87e0: 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 20 20  blockquote>.    
87f0: 40 20 3c 68 72 3e 0a 20 20 7d 0a 20 20 40 20 3c  @ <hr>.  }.  @ <
8800: 70 3e 4d 61 6b 65 20 63 68 61 6e 67 65 73 20 74  p>Make changes t
8810: 6f 20 61 74 74 72 69 62 75 74 65 73 20 6f 66 20  o attributes of 
8820: 63 68 65 63 6b 2d 69 6e 0a 20 20 40 20 5b 3c 61  check-in.  @ [<a
8830: 20 68 72 65 66 3d 22 76 69 6e 66 6f 3f 6e 61 6d   href="vinfo?nam
8840: 65 3d 25 64 28 72 69 64 29 22 3e 25 73 28 7a 55  e=%d(rid)">%s(zU
8850: 75 69 64 29 3c 2f 61 3e 5d 3a 3c 2f 70 3e 0a 20  uid)</a>]:</p>. 
8860: 20 40 20 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d   @ <form action=
8870: 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f  "%s(g.zBaseURL)/
8880: 76 65 64 69 74 22 20 6d 65 74 68 6f 64 3d 22 50  vedit" method="P
8890: 4f 53 54 22 3e 0a 20 20 6c 6f 67 69 6e 5f 69 6e  OST">.  login_in
88a0: 73 65 72 74 5f 63 73 72 66 5f 73 65 63 72 65 74  sert_csrf_secret
88b0: 28 29 3b 0a 20 20 40 20 3c 69 6e 70 75 74 20 74  ();.  @ <input t
88c0: 79 70 65 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d  ype="hidden" nam
88d0: 65 3d 22 72 22 20 76 61 6c 75 65 3d 22 25 64 28  e="r" value="%d(
88e0: 72 69 64 29 22 3e 0a 20 20 40 20 3c 74 61 62 6c  rid)">.  @ <tabl
88f0: 65 20 62 6f 72 64 65 72 3d 22 30 22 20 63 65 6c  e border="0" cel
8900: 6c 73 70 61 63 69 6e 67 3d 22 31 30 22 3e 0a 0a  lspacing="10">..
8910: 20 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67    @ <tr><td alig
8920: 6e 3d 22 72 69 67 68 74 22 20 76 61 6c 69 67 6e  n="right" valign
8930: 3d 22 74 6f 70 22 3e 3c 62 3e 55 73 65 72 3a 3c  ="top"><b>User:<
8940: 2f 62 3e 3c 2f 74 64 3e 0a 20 20 40 20 3c 74 64  /b></td>.  @ <td
8950: 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20   valign="top">. 
8960: 20 40 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65   @   <input type
8970: 3d 22 74 65 78 74 22 20 6e 61 6d 65 3d 22 75 22  ="text" name="u"
8980: 20 73 69 7a 65 3d 22 32 30 22 20 76 61 6c 75 65   size="20" value
8990: 3d 22 25 68 28 7a 4e 65 77 55 73 65 72 29 22 3e  ="%h(zNewUser)">
89a0: 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a  .  @ </td></tr>.
89b0: 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69  .  @ <tr><td ali
89c0: 67 6e 3d 22 72 69 67 68 74 22 20 76 61 6c 69 67  gn="right" valig
89d0: 6e 3d 22 74 6f 70 22 3e 3c 62 3e 43 6f 6d 6d 65  n="top"><b>Comme
89e0: 6e 74 3a 3c 2f 62 3e 3c 2f 74 64 3e 0a 20 20 40  nt:</b></td>.  @
89f0: 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70   <td valign="top
8a00: 22 3e 0a 20 20 40 20 3c 74 65 78 74 61 72 65 61  ">.  @ <textarea
8a10: 20 6e 61 6d 65 3d 22 63 22 20 72 6f 77 73 3d 22   name="c" rows="
8a20: 31 30 22 20 63 6f 6c 73 3d 22 38 30 22 3e 25 68  10" cols="80">%h
8a30: 28 7a 4e 65 77 43 6f 6d 6d 65 6e 74 29 3c 2f 74  (zNewComment)</t
8a40: 65 78 74 61 72 65 61 3e 0a 20 20 40 20 3c 2f 74  extarea>.  @ </t
8a50: 64 3e 3c 2f 74 72 3e 0a 0a 20 20 40 20 3c 74 72  d></tr>..  @ <tr
8a60: 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 67 68  ><td align="righ
8a70: 74 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e  t" valign="top">
8a80: 3c 62 3e 42 61 63 6b 67 72 6f 75 6e 64 20 43 6f  <b>Background Co
8a90: 6c 6f 72 3a 3c 2f 62 3e 3c 2f 74 64 3e 0a 20 20  lor:</b></td>.  
8aa0: 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f  @ <td valign="to
8ab0: 70 22 3e 0a 20 20 40 20 3c 74 61 62 6c 65 20 62  p">.  @ <table b
8ac0: 6f 72 64 65 72 3d 30 20 63 65 6c 6c 70 61 64 64  order=0 cellpadd
8ad0: 69 6e 67 3d 30 20 63 65 6c 6c 73 70 61 63 69 6e  ing=0 cellspacin
8ae0: 67 3d 31 3e 0a 20 20 40 20 3c 74 72 3e 0a 20 20  g=1>.  @ <tr>.  
8af0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
8b00: 66 28 61 43 6f 6c 6f 72 29 2f 73 69 7a 65 6f 66  f(aColor)/sizeof
8b10: 28 61 43 6f 6c 6f 72 5b 30 5d 29 3b 20 69 2b 2b  (aColor[0]); i++
8b20: 29 7b 0a 20 20 20 20 69 66 28 20 61 43 6f 6c 6f  ){.    if( aColo
8b30: 72 5b 69 5d 2e 7a 43 6f 6c 6f 72 5b 30 5d 20 29  r[i].zColor[0] )
8b40: 7b 0a 20 20 20 20 20 20 40 20 3c 74 64 20 62 67  {.      @ <td bg
8b50: 63 6f 6c 6f 72 3d 22 25 68 28 61 43 6f 6c 6f 72  color="%h(aColor
8b60: 5b 69 5d 2e 7a 43 6f 6c 6f 72 29 22 3e 0a 20 20  [i].zColor)">.  
8b70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40    }else{.      @
8b80: 20 3c 74 64 3e 0a 20 20 20 20 7d 0a 20 20 20 20   <td>.    }.    
8b90: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 65 77 43  if( strcmp(zNewC
8ba0: 6f 6c 6f 72 2c 20 61 43 6f 6c 6f 72 5b 69 5d 2e  olor, aColor[i].
8bb0: 7a 43 6f 6c 6f 72 29 3d 3d 30 20 29 7b 0a 20 20  zColor)==0 ){.  
8bc0: 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70      @ <input typ
8bd0: 65 3d 22 72 61 64 69 6f 22 20 6e 61 6d 65 3d 22  e="radio" name="
8be0: 63 6c 72 22 20 76 61 6c 75 65 3d 22 25 68 28 61  clr" value="%h(a
8bf0: 43 6f 6c 6f 72 5b 69 5d 2e 7a 43 6f 6c 6f 72 29  Color[i].zColor)
8c00: 22 20 63 68 65 63 6b 65 64 3e 0a 20 20 20 20 7d  " checked>.    }
8c10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 3c 69  else{.      @ <i
8c20: 6e 70 75 74 20 74 79 70 65 3d 22 72 61 64 69 6f  nput type="radio
8c30: 22 20 6e 61 6d 65 3d 22 63 6c 72 22 20 76 61 6c  " name="clr" val
8c40: 75 65 3d 22 25 68 28 61 43 6f 6c 6f 72 5b 69 5d  ue="%h(aColor[i]
8c50: 2e 7a 43 6f 6c 6f 72 29 22 3e 0a 20 20 20 20 7d  .zColor)">.    }
8c60: 0a 20 20 20 20 40 20 25 68 28 61 43 6f 6c 6f 72  .    @ %h(aColor
8c70: 5b 69 5d 2e 7a 43 4e 61 6d 65 29 3c 2f 69 6e 70  [i].zCName)</inp
8c80: 75 74 3e 3c 2f 74 64 3e 0a 20 20 7d 0a 20 20 40  ut></td>.  }.  @
8c90: 20 3c 2f 74 72 3e 3c 74 72 3e 3c 74 64 20 63 6f   </tr><tr><td co
8ca0: 6c 73 70 61 6e 3d 22 39 22 20 61 6c 69 67 6e 3d  lspan="9" align=
8cb0: 22 6c 65 66 74 22 3e 0a 20 20 69 66 28 20 66 50  "left">.  if( fP
8cc0: 72 6f 70 61 67 61 74 65 43 6f 6c 6f 72 20 29 7b  ropagateColor ){
8cd0: 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79  .    @ <input ty
8ce0: 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20 6e 61  pe="checkbox" na
8cf0: 6d 65 3d 22 70 63 6c 72 22 20 63 68 65 63 6b 65  me="pclr" checke
8d00: 64 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d>.  }else{.    
8d10: 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63  @ <input type="c
8d20: 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 70  heckbox" name="p
8d30: 63 6c 72 22 3e 0a 20 20 7d 0a 20 20 40 20 50 72  clr">.  }.  @ Pr
8d40: 6f 70 61 67 61 74 65 20 63 6f 6c 6f 72 20 74 6f  opagate color to
8d50: 20 64 65 73 63 65 6e 64 61 6e 74 73 3c 2f 69 6e   descendants</in
8d60: 70 75 74 3e 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20  put></td></tr>. 
8d70: 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 20 20 40 20   @ </table>.  @ 
8d80: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 0a 20 20 40 20  </td></tr>..  @ 
8d90: 3c 74 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e 3d  <tr><td colspan=
8da0: 22 32 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20  "2">.  @ <input 
8db0: 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61  type="submit" na
8dc0: 6d 65 3d 22 70 72 65 76 69 65 77 22 20 76 61 6c  me="preview" val
8dd0: 75 65 3d 22 50 72 65 76 69 65 77 22 3e 0a 20 20  ue="Preview">.  
8de0: 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73  @ <input type="s
8df0: 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 61 70 70  ubmit" name="app
8e00: 6c 79 22 20 76 61 6c 75 65 3d 22 41 70 70 6c 79  ly" value="Apply
8e10: 20 43 68 61 6e 67 65 73 22 3e 0a 20 20 40 20 3c   Changes">.  @ <
8e20: 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d  input type="subm
8e30: 69 74 22 20 6e 61 6d 65 3d 22 63 61 6e 63 65 6c  it" name="cancel
8e40: 22 20 76 61 6c 75 65 3d 22 43 61 6e 63 65 6c 22  " value="Cancel"
8e50: 3e 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e  >.  @ </td></tr>
8e60: 0a 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 20 20  .  @ </table>.  
8e70: 40 20 3c 2f 66 6f 72 6d 3e 0a 20 20 73 74 79 6c  @ </form>.  styl
8e80: 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a        e_footer();.}.