Hex Artifact Content
Not logged in

Artifact 9956b9b09c2471401e69780dc0a179213d2706c8:

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

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74   contains code t
0380: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
0390: 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 63 68 65 63 6b 2d 69 6e 2e  act or check-in.
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 63 68 61 72 20 2a 7a 44 61 74  gs;.  char *zDat
0580: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 55 75 69 64  e;.  char *zUuid
0590: 3b 0a 20 20 7a 55 75 69 64 20 3d 20 64 62 5f 74  ;.  zUuid = db_t
05a0: 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 75  ext(0, "SELECT u
05b0: 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48  uid FROM blob WH
05c0: 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72 69 64  ERE rid=%d", rid
05d0: 29 3b 0a 20 20 69 66 28 20 7a 55 75 69 64 20 29  );.  if( zUuid )
05e0: 7b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 64 62  {.    zDate = db
05f0: 5f 74 65 78 74 28 22 22 2c 20 0a 20 20 20 20 20  _text("", .     
0600: 20 22 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d   "SELECT datetim
0610: 65 28 6d 74 69 6d 65 29 20 7c 7c 20 27 20 55 54  e(mtime) || ' UT
0620: 43 27 20 46 52 4f 4d 20 65 76 65 6e 74 20 57 48  C' FROM event WH
0630: 45 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c 0a 20  ERE objid=%d",. 
0640: 20 20 20 20 20 72 69 64 0a 20 20 20 20 29 3b 0a       rid.    );.
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 31 32 33           /* 0123
0660: 34 35 36 37 38 39 30 31 32 33 20 2a 2f 0a 20 20  4567890123 */.  
0670: 20 20 70 72 69 6e 74 66 28 22 25 2d 31 33 73 20    printf("%-13s 
0680: 25 73 20 25 73 5c 6e 22 2c 20 7a 55 75 69 64 4e  %s %s\n", zUuidN
0690: 61 6d 65 2c 20 7a 55 75 69 64 2c 20 7a 44 61 74  ame, zUuid, zDat
06a0: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 55 75  e);.    free(zUu
06b0: 69 64 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 44  id);.    free(zD
06c0: 61 74 65 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 70  ate);.  }.  db_p
06d0: 72 65 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45  repare(&q, "SELE
06e0: 43 54 20 75 75 69 64 2c 20 70 69 64 20 46 52 4f  CT uuid, pid FRO
06f0: 4d 20 70 6c 69 6e 6b 20 4a 4f 49 4e 20 62 6c 6f  M plink JOIN blo
0700: 62 20 4f 4e 20 70 69 64 3d 72 69 64 20 22 0a 20  b ON pid=rid ". 
0710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0720: 22 20 57 48 45 52 45 20 63 69 64 3d 25 64 22 2c  " WHERE cid=%d",
0730: 20 72 69 64 29 3b 0a 20 20 77 68 69 6c 65 28 20   rid);.  while( 
0740: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c  db_step(&q)==SQL
0750: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
0760: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64  onst char *zUuid
0770: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
0780: 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 7a 44  t(&q, 0);.    zD
0790: 61 74 65 20 3d 20 64 62 5f 74 65 78 74 28 22 22  ate = db_text(""
07a0: 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
07b0: 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 29   datetime(mtime)
07c0: 20 7c 7c 20 27 20 55 54 43 27 20 46 52 4f 4d 20   || ' UTC' FROM 
07d0: 65 76 65 6e 74 20 57 48 45 52 45 20 6f 62 6a 69  event WHERE obji
07e0: 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 64 62 5f  d=%d",.      db_
07f0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 31  column_int(&q, 1
0800: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 72 69  ).    );.    pri
0810: 6e 74 66 28 22 70 61 72 65 6e 74 3a 20 20 20 20  ntf("parent:    
0820: 20 20 20 25 73 20 25 73 5c 6e 22 2c 20 7a 55 75     %s %s\n", zUu
0830: 69 64 2c 20 7a 44 61 74 65 29 3b 0a 20 20 20 20  id, zDate);.    
0840: 66 72 65 65 28 7a 44 61 74 65 29 3b 0a 20 20 7d  free(zDate);.  }
0850: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
0860: 71 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65  q);.  db_prepare
0870: 28 26 71 2c 20 22 53 45 4c 45 43 54 20 75 75 69  (&q, "SELECT uui
0880: 64 2c 20 63 69 64 20 46 52 4f 4d 20 70 6c 69 6e  d, cid FROM plin
0890: 6b 20 4a 4f 49 4e 20 62 6c 6f 62 20 4f 4e 20 63  k JOIN blob ON c
08a0: 69 64 3d 72 69 64 20 22 0a 20 20 20 20 20 20 20  id=rid ".       
08b0: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
08c0: 45 20 70 69 64 3d 25 64 22 2c 20 72 69 64 29 3b  E pid=%d", rid);
08d0: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
08e0: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
08f0: 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  W ){.    const c
0900: 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f  har *zUuid = db_
0910: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
0920: 30 29 3b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20  0);.    zDate = 
0930: 64 62 5f 74 65 78 74 28 22 22 2c 20 0a 20 20 20  db_text("", .   
0940: 20 20 20 22 53 45 4c 45 43 54 20 64 61 74 65 74     "SELECT datet
0950: 69 6d 65 28 6d 74 69 6d 65 29 20 7c 7c 20 27 20  ime(mtime) || ' 
0960: 55 54 43 27 20 46 52 4f 4d 20 65 76 65 6e 74 20  UTC' FROM event 
0970: 57 48 45 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c  WHERE objid=%d",
0980: 0a 20 20 20 20 20 20 64 62 5f 63 6f 6c 75 6d 6e  .      db_column
0990: 5f 69 6e 74 28 26 71 2c 20 31 29 0a 20 20 20 20  _int(&q, 1).    
09a0: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 63  );.    printf("c
09b0: 68 69 6c 64 3a 20 20 20 20 20 20 20 20 25 73 20  hild:        %s 
09c0: 25 73 5c 6e 22 2c 20 7a 55 75 69 64 2c 20 7a 44  %s\n", zUuid, zD
09d0: 61 74 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  ate);.    free(z
09e0: 44 61 74 65 29 3b 0a 20 20 7d 0a 20 20 64 62 5f  Date);.  }.  db_
09f0: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
0a00: 7a 54 61 67 73 20 3d 20 64 62 5f 74 65 78 74 28  zTags = db_text(
0a10: 30 2c 20 22 53 45 4c 45 43 54 20 67 72 6f 75 70  0, "SELECT group
0a20: 5f 63 6f 6e 63 61 74 28 73 75 62 73 74 72 28 74  _concat(substr(t
0a30: 61 67 6e 61 6d 65 2c 20 35 29 2c 20 27 2c 20 27  agname, 5), ', '
0a40: 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )".             
0a50: 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20          "  FROM 
0a60: 74 61 67 78 72 65 66 2c 20 74 61 67 22 0a 20 20  tagxref, tag".  
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 20 22 20 57 48 45 52 45 20 74 61 67 78 72     " WHERE tagxr
0a90: 65 66 2e 72 69 64 3d 25 64 20 41 4e 44 20 74 61  ef.rid=%d AND ta
0aa0: 67 78 72 65 66 2e 74 61 67 74 79 70 65 3e 30 22  gxref.tagtype>0"
0ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ac0: 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 74 61        "   AND ta
0ad0: 67 2e 74 61 67 69 64 3d 74 61 67 78 72 65 66 2e  g.tagid=tagxref.
0ae0: 74 61 67 69 64 22 0a 20 20 20 20 20 20 20 20 20  tagid".         
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20              "   
0b00: 41 4e 44 20 74 61 67 2e 74 61 67 6e 61 6d 65 20  AND tag.tagname 
0b10: 47 4c 4f 42 20 27 73 79 6d 2d 2a 27 22 2c 0a 20  GLOB 'sym-*'",. 
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 20 20 20 72 69 64 29 3b 0a 20 20 69 66 28 20      rid);.  if( 
0b40: 7a 54 61 67 73 20 26 26 20 7a 54 61 67 73 5b 30  zTags && zTags[0
0b50: 5d 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  ] ){.    printf(
0b60: 22 74 61 67 73 3a 20 20 20 20 20 20 20 20 20 25  "tags:         %
0b70: 73 5c 6e 22 2c 20 7a 54 61 67 73 29 3b 0a 20 20  s\n", zTags);.  
0b80: 7d 0a 20 20 66 72 65 65 28 7a 54 61 67 73 29 3b  }.  free(zTags);
0b90: 0a 20 20 69 66 28 20 7a 43 6f 6d 6d 65 6e 74 20  .  if( zComment 
0ba0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 63  ){.    printf("c
0bb0: 6f 6d 6d 65 6e 74 3a 5c 6e 25 73 5c 6e 22 2c 20  omment:\n%s\n", 
0bc0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 66  zComment);.    f
0bd0: 72 65 65 28 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  ree(zComment);. 
0be0: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 4f 4d   }.}.../*.** COM
0bf0: 4d 41 4e 44 3a 20 69 6e 66 6f 0a 2a 2a 0a 2a 2a  MAND: info.**.**
0c00: 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69 6c 20   Usage: %fossil 
0c10: 69 6e 66 6f 20 3f 41 52 54 49 46 41 43 54 2d 49  info ?ARTIFACT-I
0c20: 44 7c 46 49 4c 45 4e 41 4d 45 3f 0a 2a 2a 0a 2a  D|FILENAME?.**.*
0c30: 2a 20 57 69 74 68 20 6e 6f 20 61 72 67 75 6d 65  * With no argume
0c40: 6e 74 73 2c 20 70 72 6f 76 69 64 65 20 69 6e 66  nts, provide inf
0c50: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
0c60: 68 65 20 63 75 72 72 65 6e 74 20 74 72 65 65 2e  he current tree.
0c70: 0a 2a 2a 20 49 66 20 61 6e 20 61 72 67 75 6d 65  .** If an argume
0c80: 6e 74 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  nt is specified,
0c90: 20 70 72 6f 76 69 64 65 20 69 6e 66 6f 72 6d 61   provide informa
0ca0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 6f  tion about the o
0cb0: 62 6a 65 63 74 0a 2a 2a 20 69 6e 20 74 68 65 20  bject.** in the 
0cc0: 72 65 73 70 6f 73 69 74 6f 72 79 20 6f 66 20 74  respository of t
0cd0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 65 65 20  he current tree 
0ce0: 74 68 61 74 20 74 68 65 20 61 72 67 75 6d 65 6e  that the argumen
0cf0: 74 20 72 65 66 65 72 73 0a 2a 2a 20 74 6f 2e 20  t refers.** to. 
0d00: 20 4f 72 20 69 66 20 74 68 65 20 61 72 67 75 6d   Or if the argum
0d10: 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
0d20: 6f 66 20 61 20 72 65 70 6f 73 69 74 6f 72 79 2c  of a repository,
0d30: 20 73 68 6f 77 0a 2a 2a 20 69 6e 66 6f 72 6d 61   show.** informa
0d40: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 61 74 20  tion about that 
0d50: 72 65 70 6f 73 69 74 6f 72 79 2e 0a 2a 2f 0a 76  repository..*/.v
0d60: 6f 69 64 20 69 6e 66 6f 5f 63 6d 64 28 76 6f 69  oid info_cmd(voi
0d70: 64 29 7b 0a 20 20 69 36 34 20 66 73 69 7a 65 3b  d){.  i64 fsize;
0d80: 0a 20 20 69 66 28 20 67 2e 61 72 67 63 21 3d 32  .  if( g.argc!=2
0d90: 20 26 26 20 67 2e 61 72 67 63 21 3d 33 20 29 7b   && g.argc!=3 ){
0da0: 0a 20 20 20 20 75 73 61 67 65 28 22 3f 46 49 4c  .    usage("?FIL
0db0: 45 4e 41 4d 45 7c 41 52 54 49 46 41 43 54 2d 49  ENAME|ARTIFACT-I
0dc0: 44 3f 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  D?");.  }.  if( 
0dd0: 67 2e 61 72 67 63 3d 3d 33 20 26 26 20 28 66 73  g.argc==3 && (fs
0de0: 69 7a 65 20 3d 20 66 69 6c 65 5f 73 69 7a 65 28  ize = file_size(
0df0: 67 2e 61 72 67 76 5b 32 5d 29 29 3e 30 20 26 26  g.argv[2]))>0 &&
0e00: 20 28 66 73 69 7a 65 26 30 78 31 66 66 29 3d 3d   (fsize&0x1ff)==
0e10: 30 20 29 7b 0a 20 20 20 20 64 62 5f 6f 70 65 6e  0 ){.    db_open
0e20: 5f 63 6f 6e 66 69 67 28 30 29 3b 0a 20 20 20 20  _config(0);.    
0e30: 64 62 5f 72 65 63 6f 72 64 5f 72 65 70 6f 73 69  db_record_reposi
0e40: 74 6f 72 79 5f 66 69 6c 65 6e 61 6d 65 28 67 2e  tory_filename(g.
0e50: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 64 62  argv[2]);.    db
0e60: 5f 6f 70 65 6e 5f 72 65 70 6f 73 69 74 6f 72 79  _open_repository
0e70: 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  (g.argv[2]);.   
0e80: 20 70 72 69 6e 74 66 28 22 70 72 6f 6a 65 63 74   printf("project
0e90: 2d 63 6f 64 65 3a 20 25 73 5c 6e 22 2c 20 64 62  -code: %s\n", db
0ea0: 5f 67 65 74 28 22 70 72 6f 6a 65 63 74 2d 63 6f  _get("project-co
0eb0: 64 65 22 2c 20 22 3c 6e 6f 6e 65 3e 22 29 29 3b  de", "<none>"));
0ec0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 70 72 6f  .    printf("pro
0ed0: 6a 65 63 74 2d 6e 61 6d 65 3a 20 25 73 5c 6e 22  ject-name: %s\n"
0ee0: 2c 20 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 63  , db_get("projec
0ef0: 74 2d 6e 61 6d 65 22 2c 20 22 3c 75 6e 6e 61 6d  t-name", "<unnam
0f00: 65 64 3e 22 29 29 3b 0a 20 20 20 20 70 72 69 6e  ed>"));.    prin
0f10: 74 66 28 22 73 65 72 76 65 72 2d 63 6f 64 65 3a  tf("server-code:
0f20: 20 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28    %s\n", db_get(
0f30: 22 73 65 72 76 65 72 2d 63 6f 64 65 22 2c 20 22  "server-code", "
0f40: 3c 6e 6f 6e 65 3e 22 29 29 3b 0a 20 20 20 20 72  <none>"));.    r
0f50: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 64 62 5f  eturn;.  }.  db_
0f60: 6d 75 73 74 5f 62 65 5f 77 69 74 68 69 6e 5f 74  must_be_within_t
0f70: 72 65 65 28 29 3b 0a 20 20 69 66 28 20 67 2e 61  ree();.  if( g.a
0f80: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e  rgc==2 ){.    in
0f90: 74 20 76 69 64 3b 0a 20 20 20 20 20 20 20 20 20  t vid;.         
0fa0: 2f 2a 20 30 31 32 33 34 35 36 37 38 39 30 31 32  /* 0123456789012
0fb0: 33 34 20 2a 2f 0a 20 20 20 20 64 62 5f 72 65 63  34 */.    db_rec
0fc0: 6f 72 64 5f 72 65 70 6f 73 69 74 6f 72 79 5f 66  ord_repository_f
0fd0: 69 6c 65 6e 61 6d 65 28 30 29 3b 0a 20 20 20 20  ilename(0);.    
0fe0: 70 72 69 6e 74 66 28 22 72 65 70 6f 73 69 74 6f  printf("reposito
0ff0: 72 79 3a 20 20 20 25 73 5c 6e 22 2c 20 64 62 5f  ry:   %s\n", db_
1000: 6c 67 65 74 28 22 72 65 70 6f 73 69 74 6f 72 79  lget("repository
1010: 22 2c 20 22 22 29 29 3b 0a 20 20 20 20 70 72 69  ", ""));.    pri
1020: 6e 74 66 28 22 6c 6f 63 61 6c 2d 72 6f 6f 74 3a  ntf("local-root:
1030: 20 20 20 25 73 5c 6e 22 2c 20 67 2e 7a 4c 6f 63     %s\n", g.zLoc
1040: 61 6c 52 6f 6f 74 29 3b 0a 20 20 20 20 70 72 69  alRoot);.    pri
1050: 6e 74 66 28 22 70 72 6f 6a 65 63 74 2d 63 6f 64  ntf("project-cod
1060: 65 3a 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74  e: %s\n", db_get
1070: 28 22 70 72 6f 6a 65 63 74 2d 63 6f 64 65 22 2c  ("project-code",
1080: 20 22 22 29 29 3b 0a 20 20 20 20 70 72 69 6e 74   ""));.    print
1090: 66 28 22 73 65 72 76 65 72 2d 63 6f 64 65 3a 20  f("server-code: 
10a0: 20 25 73 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22   %s\n", db_get("
10b0: 73 65 72 76 65 72 2d 63 6f 64 65 22 2c 20 22 22  server-code", ""
10c0: 29 29 3b 0a 20 20 20 20 76 69 64 20 3d 20 64 62  ));.    vid = db
10d0: 5f 6c 67 65 74 5f 69 6e 74 28 22 63 68 65 63 6b  _lget_int("check
10e0: 6f 75 74 22 2c 20 30 29 3b 0a 20 20 20 20 69 66  out", 0);.    if
10f0: 28 20 76 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ( vid==0 ){.    
1100: 20 20 70 72 69 6e 74 66 28 22 63 68 65 63 6b 6f    printf("checko
1110: 75 74 3a 20 20 20 20 20 6e 69 6c 5c 6e 22 29 3b  ut:     nil\n");
1120: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1130: 20 20 73 68 6f 77 5f 63 6f 6d 6d 6f 6e 5f 69 6e    show_common_in
1140: 66 6f 28 76 69 64 2c 20 22 63 68 65 63 6b 6f 75  fo(vid, "checkou
1150: 74 3a 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  t:", 1);.    }. 
1160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1170: 72 69 64 3b 0a 20 20 20 20 72 69 64 20 3d 20 6e  rid;.    rid = n
1180: 61 6d 65 5f 74 6f 5f 72 69 64 28 67 2e 61 72 67  ame_to_rid(g.arg
1190: 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  v[2]);.    if( r
11a0: 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  id==0 ){.      f
11b0: 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 6e 6f 20  ossil_panic("no 
11c0: 73 75 63 68 20 6f 62 6a 65 63 74 3a 20 25 73 5c  such object: %s\
11d0: 6e 22 2c 20 67 2e 61 72 67 76 5b 32 5d 29 3b 0a  n", g.argv[2]);.
11e0: 20 20 20 20 7d 0a 20 20 20 20 73 68 6f 77 5f 63      }.    show_c
11f0: 6f 6d 6d 6f 6e 5f 69 6e 66 6f 28 72 69 64 2c 20  ommon_info(rid, 
1200: 22 75 75 69 64 3a 22 2c 20 31 29 3b 0a 20 20 7d  "uuid:", 1);.  }
1210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 69  .}../*.** Show i
1220: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
1230: 20 61 6c 6c 20 74 61 67 73 20 6f 6e 20 61 20 67   all tags on a g
1240: 69 76 65 6e 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74  iven node..*/.st
1250: 61 74 69 63 20 76 6f 69 64 20 73 68 6f 77 54 61  atic void showTa
1260: 67 73 28 69 6e 74 20 72 69 64 2c 20 63 6f 6e 73  gs(int rid, cons
1270: 74 20 63 68 61 72 20 2a 7a 4e 6f 74 47 6c 6f 62  t char *zNotGlob
1280: 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69  ){.  Stmt q;.  i
1290: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 64 62  nt cnt = 0;.  db
12a0: 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20  _prepare(&q,.   
12b0: 20 22 53 45 4c 45 43 54 20 74 61 67 2e 74 61 67   "SELECT tag.tag
12c0: 69 64 2c 20 74 61 67 6e 61 6d 65 2c 20 22 0a 20  id, tagname, ". 
12d0: 20 20 20 22 20 20 20 20 20 20 20 28 53 45 4c 45     "       (SELE
12e0: 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f  CT uuid FROM blo
12f0: 62 20 57 48 45 52 45 20 72 69 64 3d 74 61 67 78  b WHERE rid=tagx
1300: 72 65 66 2e 73 72 63 69 64 20 41 4e 44 20 72 69  ref.srcid AND ri
1310: 64 21 3d 25 64 29 2c 22 0a 20 20 20 20 22 20 20  d!=%d),".    "  
1320: 20 20 20 20 20 76 61 6c 75 65 2c 20 64 61 74 65       value, date
1330: 74 69 6d 65 28 74 61 67 78 72 65 66 2e 6d 74 69  time(tagxref.mti
1340: 6d 65 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c  me,'localtime'),
1350: 20 74 61 67 74 79 70 65 2c 22 0a 20 20 20 20 22   tagtype,".    "
1360: 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 75         (SELECT u
1370: 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48  uid FROM blob WH
1380: 45 52 45 20 72 69 64 3d 74 61 67 78 72 65 66 2e  ERE rid=tagxref.
1390: 6f 72 69 67 69 64 20 41 4e 44 20 72 69 64 21 3d  origid AND rid!=
13a0: 25 64 29 22 0a 20 20 20 20 22 20 20 46 52 4f 4d  %d)".    "  FROM
13b0: 20 74 61 67 78 72 65 66 20 4a 4f 49 4e 20 74 61   tagxref JOIN ta
13c0: 67 20 4f 4e 20 74 61 67 78 72 65 66 2e 74 61 67  g ON tagxref.tag
13d0: 69 64 3d 74 61 67 2e 74 61 67 69 64 22 0a 20 20  id=tag.tagid".  
13e0: 20 20 22 20 57 48 45 52 45 20 74 61 67 78 72 65    " WHERE tagxre
13f0: 66 2e 72 69 64 3d 25 64 20 41 4e 44 20 74 61 67  f.rid=%d AND tag
1400: 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f 42 20 27 25  name NOT GLOB '%
1410: 73 27 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20  s'".    " ORDER 
1420: 42 59 20 74 61 67 6e 61 6d 65 22 2c 20 72 69 64  BY tagname", rid
1430: 2c 20 72 69 64 2c 20 72 69 64 2c 20 7a 4e 6f 74  , rid, rid, zNot
1440: 47 6c 6f 62 0a 20 20 29 3b 0a 20 20 77 68 69 6c  Glob.  );.  whil
1450: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
1460: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1470: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1480: 61 67 6e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75  agname = db_colu
1490: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a  mn_text(&q, 1);.
14a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14b0: 7a 53 72 63 55 75 69 64 20 3d 20 64 62 5f 63 6f  zSrcUuid = db_co
14c0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29  lumn_text(&q, 2)
14d0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
14e0: 20 2a 7a 56 61 6c 75 65 20 3d 20 64 62 5f 63 6f   *zValue = db_co
14f0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29  lumn_text(&q, 3)
1500: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1510: 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c   *zDate = db_col
1520: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 34 29 3b  umn_text(&q, 4);
1530: 0a 20 20 20 20 69 6e 74 20 74 61 67 74 79 70 65  .    int tagtype
1540: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
1550: 28 26 71 2c 20 35 29 3b 0a 20 20 20 20 63 6f 6e  (&q, 5);.    con
1560: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 55 75  st char *zOrigUu
1570: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  id = db_column_t
1580: 65 78 74 28 26 71 2c 20 36 29 3b 0a 20 20 20 20  ext(&q, 6);.    
1590: 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 63  cnt++;.    if( c
15a0: 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 40  nt==1 ){.      @
15b0: 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 65 63   <div class="sec
15c0: 74 69 6f 6e 22 3e 54 61 67 73 20 41 6e 64 20 50  tion">Tags And P
15d0: 72 6f 70 65 72 74 69 65 73 3c 2f 64 69 76 3e 0a  roperties</div>.
15e0: 20 20 20 20 20 20 40 20 3c 75 6c 3e 0a 20 20 20        @ <ul>.   
15f0: 20 7d 0a 20 20 20 20 40 20 3c 6c 69 3e 0a 20 20   }.    @ <li>.  
1600: 20 20 69 66 28 20 74 61 67 74 79 70 65 3d 3d 30    if( tagtype==0
1610: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 62 3e 3c   ){.      @ <b><
1620: 73 3e 25 68 28 7a 54 61 67 6e 61 6d 65 29 3c 2f  s>%h(zTagname)</
1630: 73 3e 3c 2f 62 3e 20 63 61 6e 63 65 6c 6c 65 64  s></b> cancelled
1640: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
1650: 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 40  Value ){.      @
1660: 20 3c 62 3e 25 68 28 7a 54 61 67 6e 61 6d 65 29   <b>%h(zTagname)
1670: 3d 25 68 28 7a 56 61 6c 75 65 29 3c 2f 62 3e 0a  =%h(zValue)</b>.
1680: 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20      }else {.    
1690: 20 20 40 20 3c 62 3e 25 68 28 7a 54 61 67 6e 61    @ <b>%h(zTagna
16a0: 6d 65 29 3c 2f 62 3e 0a 20 20 20 20 7d 0a 20 20  me)</b>.    }.  
16b0: 20 20 69 66 28 20 74 61 67 74 79 70 65 3d 3d 32    if( tagtype==2
16c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f   ){.      if( zO
16d0: 72 69 67 55 75 69 64 20 26 26 20 7a 4f 72 69 67  rigUuid && zOrig
16e0: 55 75 69 64 5b 30 5d 20 29 7b 0a 20 20 20 20 20  Uuid[0] ){.     
16f0: 20 20 20 40 20 69 6e 68 65 72 69 74 65 64 20 66     @ inherited f
1700: 72 6f 6d 0a 20 20 20 20 20 20 20 20 68 79 70 65  rom.        hype
1710: 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64 28 7a 4f  rlink_to_uuid(zO
1720: 72 69 67 55 75 69 64 29 3b 0a 20 20 20 20 20 20  rigUuid);.      
1730: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 40  }else{.        @
1740: 20 70 72 6f 70 61 67 61 74 65 73 20 74 6f 20 64   propagates to d
1750: 65 73 63 65 6e 64 61 6e 74 73 0a 20 20 20 20 20  escendants.     
1760: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1770: 20 7a 53 72 63 55 75 69 64 20 26 26 20 7a 53 72   zSrcUuid && zSr
1780: 63 55 75 69 64 5b 30 5d 20 29 7b 0a 20 20 20 20  cUuid[0] ){.    
1790: 20 20 69 66 28 20 74 61 67 74 79 70 65 3d 3d 30    if( tagtype==0
17a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20 62 79   ){.        @ by
17b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17c0: 20 20 20 20 20 20 40 20 61 64 64 65 64 20 62 79        @ added by
17d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 68  .      }.      h
17e0: 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 75 69 64  yperlink_to_uuid
17f0: 28 7a 53 72 63 55 75 69 64 29 3b 0a 20 20 20 20  (zSrcUuid);.    
1800: 20 20 40 20 6f 6e 0a 20 20 20 20 20 20 68 79 70    @ on.      hyp
1810: 65 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a  erlink_to_date(z
1820: 44 61 74 65 2c 30 29 3b 0a 20 20 20 20 7d 0a 20  Date,0);.    }. 
1830: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65   }.  db_finalize
1840: 28 26 71 29 3b 0a 20 20 69 66 28 20 63 6e 74 20  (&q);.  if( cnt 
1850: 29 7b 0a 20 20 20 20 40 20 3c 2f 75 6c 3e 0a 20  ){.    @ </ul>. 
1860: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70   }.}.../*.** App
1870: 65 6e 64 20 74 68 65 20 64 69 66 66 65 72 65 6e  end the differen
1880: 63 65 20 62 65 74 77 65 65 6e 20 74 77 6f 20 52  ce between two R
1890: 49 44 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75  IDs to the outpu
18a0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
18b0: 20 61 70 70 65 6e 64 5f 64 69 66 66 28 69 6e 74   append_diff(int
18c0: 20 66 72 6f 6d 69 64 2c 20 69 6e 74 20 74 6f 69   fromid, int toi
18d0: 64 29 7b 0a 20 20 42 6c 6f 62 20 66 72 6f 6d 2c  d){.  Blob from,
18e0: 20 74 6f 2c 20 6f 75 74 3b 0a 20 20 63 6f 6e 74   to, out;.  cont
18f0: 65 6e 74 5f 67 65 74 28 66 72 6f 6d 69 64 2c 20  ent_get(fromid, 
1900: 26 66 72 6f 6d 29 3b 0a 20 20 63 6f 6e 74 65 6e  &from);.  conten
1910: 74 5f 67 65 74 28 74 6f 69 64 2c 20 26 74 6f 29  t_get(toid, &to)
1920: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6f  ;.  blob_zero(&o
1930: 75 74 29 3b 0a 20 20 74 65 78 74 5f 64 69 66 66  ut);.  text_diff
1940: 28 26 66 72 6f 6d 2c 20 26 74 6f 2c 20 26 6f 75  (&from, &to, &ou
1950: 74 2c 20 35 29 3b 0a 20 20 40 20 25 68 28 62 6c  t, 5);.  @ %h(bl
1960: 6f 62 5f 73 74 72 28 26 6f 75 74 29 29 0a 20 20  ob_str(&out)).  
1970: 62 6c 6f 62 5f 72 65 73 65 74 28 26 66 72 6f 6d  blob_reset(&from
1980: 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28  );.  blob_reset(
1990: 26 74 6f 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73  &to);.  blob_res
19a0: 65 74 28 26 6f 75 74 29 3b 20 20 0a 7d 0a 0a 0a  et(&out);  .}...
19b0: 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20 76  /*.** WEBPAGE: v
19c0: 69 6e 66 6f 0a 2a 2a 20 57 45 42 50 41 47 45 3a  info.** WEBPAGE:
19d0: 20 63 69 0a 2a 2a 20 55 52 4c 3a 20 20 2f 63 69   ci.** URL:  /ci
19e0: 3f 6e 61 6d 65 3d 52 49 44 7c 41 52 54 49 46 41  ?name=RID|ARTIFA
19f0: 43 54 49 44 0a 2a 2a 0a 2a 2a 20 44 69 73 70 6c  CTID.**.** Displ
1a00: 61 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ay information a
1a10: 62 6f 75 74 20 61 20 70 61 72 74 69 63 75 6c 61  bout a particula
1a20: 72 20 63 68 65 63 6b 2d 69 6e 2e 0a 2a 2f 0a 76  r check-in..*/.v
1a30: 6f 69 64 20 63 69 5f 70 61 67 65 28 76 6f 69 64  oid ci_page(void
1a40: 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69  ){.  Stmt q;.  i
1a50: 6e 74 20 72 69 64 3b 0a 20 20 69 6e 74 20 69 73  nt rid;.  int is
1a60: 4c 65 61 66 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63  Leaf;..  login_c
1a70: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
1a80: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52  ();.  if( !g.okR
1a90: 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65  ead ){ login_nee
1aa0: 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d  ded(); return; }
1ab0: 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74 6f  .  rid = name_to
1ac0: 5f 72 69 64 28 50 44 28 22 6e 61 6d 65 22 2c 22  _rid(PD("name","
1ad0: 30 22 29 29 3b 0a 20 20 69 66 28 20 72 69 64 3d  0"));.  if( rid=
1ae0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 79 6c 65 5f  =0 ){.    style_
1af0: 68 65 61 64 65 72 28 22 43 68 65 63 6b 2d 69 6e  header("Check-in
1b00: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 45 72 72   Information Err
1b10: 6f 72 22 29 3b 0a 20 20 20 20 40 20 4e 6f 20 73  or");.    @ No s
1b20: 75 63 68 20 6f 62 6a 65 63 74 3a 20 25 68 28 67  uch object: %h(g
1b30: 2e 61 72 67 76 5b 32 5d 29 0a 20 20 20 20 73 74  .argv[2]).    st
1b40: 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 20 20  yle_footer();.  
1b50: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1b60: 69 73 4c 65 61 66 20 3d 20 21 64 62 5f 65 78 69  isLeaf = !db_exi
1b70: 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52  sts("SELECT 1 FR
1b80: 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 70  OM plink WHERE p
1b90: 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20  id=%d", rid);.  
1ba0: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 0a  db_prepare(&q, .
1bb0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 75 75 69       "SELECT uui
1bc0: 64 2c 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d  d, datetime(mtim
1bd0: 65 2c 20 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c  e, 'localtime'),
1be0: 20 75 73 65 72 2c 20 63 6f 6d 6d 65 6e 74 22 0a   user, comment".
1bf0: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 62 6c 6f       "  FROM blo
1c00: 62 2c 20 65 76 65 6e 74 22 0a 20 20 20 20 20 22  b, event".     "
1c10: 20 57 48 45 52 45 20 62 6c 6f 62 2e 72 69 64 3d   WHERE blob.rid=
1c20: 25 64 22 0a 20 20 20 20 20 22 20 20 20 41 4e 44  %d".     "   AND
1c30: 20 65 76 65 6e 74 2e 6f 62 6a 69 64 3d 25 64 22   event.objid=%d"
1c40: 2c 0a 20 20 20 20 20 72 69 64 2c 20 72 69 64 0a  ,.     rid, rid.
1c50: 20 20 29 3b 0a 20 20 69 66 28 20 64 62 5f 73 74    );.  if( db_st
1c60: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
1c70: 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OW ){.    const 
1c80: 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62  char *zUuid = db
1c90: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
1ca0: 20 30 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   0);.    char *z
1cb0: 54 69 74 6c 65 20 3d 20 6d 70 72 69 6e 74 66 28  Title = mprintf(
1cc0: 22 43 68 65 63 6b 2d 69 6e 20 5b 25 2e 31 30 73  "Check-in [%.10s
1cd0: 5d 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20  ]", zUuid);.    
1ce0: 63 68 61 72 20 2a 7a 45 55 73 65 72 2c 20 2a 7a  char *zEUser, *z
1cf0: 45 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 63 6f  EComment;.    co
1d00: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 3b  nst char *zUser;
1d10: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d20: 2a 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 63  *zComment;.    c
1d30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65  onst char *zDate
1d40: 3b 0a 20 20 20 20 73 74 79 6c 65 5f 68 65 61 64  ;.    style_head
1d50: 65 72 28 7a 54 69 74 6c 65 29 3b 0a 20 20 20 20  er(zTitle);.    
1d60: 6c 6f 67 69 6e 5f 61 6e 6f 6e 79 6d 6f 75 73 5f  login_anonymous_
1d70: 61 76 61 69 6c 61 62 6c 65 28 29 3b 0a 20 20 20  available();.   
1d80: 20 66 72 65 65 28 7a 54 69 74 6c 65 29 3b 0a 20   free(zTitle);. 
1d90: 20 20 20 7a 45 55 73 65 72 20 3d 20 64 62 5f 74     zEUser = db_t
1da0: 65 78 74 28 30 2c 0a 20 20 20 20 20 20 20 20 20  ext(0,.         
1db0: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
1dc0: 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 74 61 67  T value FROM tag
1dd0: 78 72 65 66 20 57 48 45 52 45 20 74 61 67 69 64  xref WHERE tagid
1de0: 3d 25 64 20 41 4e 44 20 72 69 64 3d 25 64 22 2c  =%d AND rid=%d",
1df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e00: 20 20 20 20 20 54 41 47 5f 55 53 45 52 2c 20 72       TAG_USER, r
1e10: 69 64 29 3b 0a 20 20 20 20 7a 45 43 6f 6d 6d 65  id);.    zEComme
1e20: 6e 74 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20  nt = db_text(0, 
1e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e40: 20 20 20 20 22 53 45 4c 45 43 54 20 76 61 6c 75      "SELECT valu
1e50: 65 20 46 52 4f 4d 20 74 61 67 78 72 65 66 20 57  e FROM tagxref W
1e60: 48 45 52 45 20 74 61 67 69 64 3d 25 64 20 41 4e  HERE tagid=%d AN
1e70: 44 20 72 69 64 3d 25 64 22 2c 0a 20 20 20 20 20  D rid=%d",.     
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 41                TA
1e90: 47 5f 43 4f 4d 4d 45 4e 54 2c 20 72 69 64 29 3b  G_COMMENT, rid);
1ea0: 0a 20 20 20 20 7a 55 73 65 72 20 3d 20 64 62 5f  .    zUser = db_
1eb0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
1ec0: 32 29 3b 0a 20 20 20 20 7a 43 6f 6d 6d 65 6e 74  2);.    zComment
1ed0: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
1ee0: 74 28 26 71 2c 20 33 29 3b 0a 20 20 20 20 7a 44  t(&q, 3);.    zD
1ef0: 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ate = db_column_
1f00: 74 65 78 74 28 26 71 2c 31 29 3b 0a 20 20 20 20  text(&q,1);.    
1f10: 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 73 65  @ <div class="se
1f20: 63 74 69 6f 6e 22 3e 4f 76 65 72 76 69 65 77 3c  ction">Overview<
1f30: 2f 64 69 76 3e 0a 20 20 20 20 40 20 3c 70 3e 3c  /div>.    @ <p><
1f40: 74 61 62 6c 65 20 63 6c 61 73 73 3d 22 6c 61 62  table class="lab
1f50: 65 6c 2d 76 61 6c 75 65 22 3e 0a 20 20 20 20 40  el-value">.    @
1f60: 20 3c 74 72 3e 3c 74 68 3e 53 48 41 31 26 6e 62   <tr><th>SHA1&nb
1f70: 73 70 3b 48 61 73 68 3a 3c 2f 74 68 3e 3c 74 64  sp;Hash:</th><td
1f80: 3e 25 73 28 7a 55 75 69 64 29 0a 20 20 20 20 69  >%s(zUuid).    i
1f90: 66 28 20 67 2e 6f 6b 53 65 74 75 70 20 29 7b 0a  f( g.okSetup ){.
1fa0: 20 20 20 20 20 20 40 20 28 52 65 63 6f 72 64 20        @ (Record 
1fb0: 49 44 3a 20 25 64 28 72 69 64 29 29 0a 20 20 20  ID: %d(rid)).   
1fc0: 20 7d 0a 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f   }.    @ </td></
1fd0: 74 72 3e 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74  tr>.    @ <tr><t
1fe0: 68 3e 44 61 74 65 3a 3c 2f 74 68 3e 3c 74 64 3e  h>Date:</th><td>
1ff0: 0a 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74  .    hyperlink_t
2000: 6f 5f 64 61 74 65 28 7a 44 61 74 65 2c 20 22 3c  o_date(zDate, "<
2010: 2f 74 64 3e 3c 2f 74 72 3e 22 29 3b 0a 20 20 20  /td></tr>");.   
2020: 20 69 66 28 20 7a 45 55 73 65 72 20 29 7b 0a 20   if( zEUser ){. 
2030: 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 45       @ <tr><th>E
2040: 64 69 74 65 64 26 6e 62 73 70 3b 55 73 65 72 3a  dited&nbsp;User:
2050: 3c 2f 74 64 3e 3c 74 64 3e 0a 20 20 20 20 20 20  </td><td>.      
2060: 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65  hyperlink_to_use
2070: 72 28 7a 45 55 73 65 72 2c 7a 44 61 74 65 2c 22  r(zEUser,zDate,"
2080: 3c 2f 74 64 3e 3c 2f 74 72 3e 22 29 3b 0a 20 20  </td></tr>");.  
2090: 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 4f 72      @ <tr><th>Or
20a0: 69 67 69 6e 61 6c 26 6e 62 73 70 3b 55 73 65 72  iginal&nbsp;User
20b0: 3a 3c 2f 74 68 3e 3c 74 64 3e 0a 20 20 20 20 20  :</th><td>.     
20c0: 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73   hyperlink_to_us
20d0: 65 72 28 7a 55 73 65 72 2c 7a 44 61 74 65 2c 22  er(zUser,zDate,"
20e0: 3c 2f 74 64 3e 3c 2f 74 72 3e 22 29 3b 0a 20 20  </td></tr>");.  
20f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40    }else{.      @
2100: 20 3c 74 72 3e 3c 74 68 3e 55 73 65 72 3a 3c 2f   <tr><th>User:</
2110: 74 64 3e 3c 74 64 3e 0a 20 20 20 20 20 20 68 79  td><td>.      hy
2120: 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65 72 28  perlink_to_user(
2130: 7a 55 73 65 72 2c 7a 44 61 74 65 2c 22 3c 2f 74  zUser,zDate,"</t
2140: 64 3e 3c 2f 74 72 3e 22 29 3b 0a 20 20 20 20 7d  d></tr>");.    }
2150: 0a 20 20 20 20 69 66 28 20 7a 45 43 6f 6d 6d 65  .    if( zEComme
2160: 6e 74 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 74  nt ){.      @ <t
2170: 72 3e 3c 74 68 3e 45 64 69 74 65 64 26 6e 62 73  r><th>Edited&nbs
2180: 70 3b 43 6f 6d 6d 65 6e 74 3a 3c 2f 74 68 3e 3c  p;Comment:</th><
2190: 74 64 3e 25 77 28 7a 45 43 6f 6d 6d 65 6e 74 29  td>%w(zEComment)
21a0: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 20  </td></tr>.     
21b0: 20 40 20 3c 74 72 3e 3c 74 68 3e 4f 72 69 67 69   @ <tr><th>Origi
21c0: 6e 61 6c 26 6e 62 73 70 3b 43 6f 6d 6d 65 6e 74  nal&nbsp;Comment
21d0: 3a 3c 2f 74 68 3e 3c 74 64 3e 25 77 28 7a 43 6f  :</th><td>%w(zCo
21e0: 6d 6d 65 6e 74 29 3c 2f 74 64 3e 3c 2f 74 72 3e  mment)</td></tr>
21f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2200: 20 20 40 20 3c 74 72 3e 3c 74 68 3e 43 6f 6d 6d    @ <tr><th>Comm
2210: 65 6e 74 3a 3c 2f 74 68 3e 3c 74 64 3e 25 77 28  ent:</th><td>%w(
2220: 7a 43 6f 6d 6d 65 6e 74 29 3c 2f 74 64 3e 3c 2f  zComment)</td></
2230: 74 72 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20  tr>.    }.    @ 
2240: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 69  </td></tr>.    i
2250: 66 28 20 67 2e 6f 6b 41 64 6d 69 6e 20 29 7b 0a  f( g.okAdmin ){.
2260: 20 20 20 20 20 20 64 62 5f 70 72 65 70 61 72 65        db_prepare
2270: 28 26 71 2c 20 0a 20 20 20 20 20 20 20 20 20 22  (&q, .         "
2280: 53 45 4c 45 43 54 20 72 63 76 66 72 6f 6d 2e 69  SELECT rcvfrom.i
2290: 70 61 64 64 72 2c 20 75 73 65 72 2e 6c 6f 67 69  paddr, user.logi
22a0: 6e 2c 20 64 61 74 65 74 69 6d 65 28 72 63 76 66  n, datetime(rcvf
22b0: 72 6f 6d 2e 6d 74 69 6d 65 29 22 0a 20 20 20 20  rom.mtime)".    
22c0: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 62 6c 6f       "  FROM blo
22d0: 62 20 4a 4f 49 4e 20 72 63 76 66 72 6f 6d 20 55  b JOIN rcvfrom U
22e0: 53 49 4e 47 28 72 63 76 69 64 29 20 4c 45 46 54  SING(rcvid) LEFT
22f0: 20 4a 4f 49 4e 20 75 73 65 72 20 55 53 49 4e 47   JOIN user USING
2300: 28 75 69 64 29 22 0a 20 20 20 20 20 20 20 20 20  (uid)".         
2310: 22 20 57 48 45 52 45 20 62 6c 6f 62 2e 72 69 64  " WHERE blob.rid
2320: 3d 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 72  =%d",.         r
2330: 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  id.      );.    
2340: 20 20 69 66 28 20 64 62 5f 73 74 65 70 28 26 71    if( db_step(&q
2350: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
2360: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2370: 68 61 72 20 2a 7a 49 70 41 64 64 72 20 3d 20 64  har *zIpAddr = d
2380: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
2390: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 0);.        co
23a0: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 20  nst char *zUser 
23b0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
23c0: 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  (&q, 1);.       
23d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
23e0: 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  te = db_column_t
23f0: 65 78 74 28 26 71 2c 20 32 29 3b 0a 20 20 20 20  ext(&q, 2);.    
2400: 20 20 20 20 69 66 28 20 7a 55 73 65 72 3d 3d 30      if( zUser==0
2410: 20 7c 7c 20 7a 55 73 65 72 5b 30 5d 3d 3d 30 20   || zUser[0]==0 
2420: 29 20 7a 55 73 65 72 20 3d 20 22 75 6e 6b 6e 6f  ) zUser = "unkno
2430: 77 6e 22 3b 0a 20 20 20 20 20 20 20 20 40 20 3c  wn";.        @ <
2440: 74 72 3e 3c 74 68 3e 52 65 63 65 69 76 65 64 26  tr><th>Received&
2450: 6e 62 73 70 3b 46 72 6f 6d 3a 3c 2f 74 68 3e 0a  nbsp;From:</th>.
2460: 20 20 20 20 20 20 20 20 40 20 3c 74 64 3e 25 68          @ <td>%h
2470: 28 7a 55 73 65 72 29 20 40 20 25 68 28 7a 49 70  (zUser) @ %h(zIp
2480: 41 64 64 72 29 20 6f 6e 20 25 73 28 7a 44 61 74  Addr) on %s(zDat
2490: 65 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20  e)</td></tr>.   
24a0: 20 20 20 7d 0a 20 20 20 20 20 20 64 62 5f 66 69     }.      db_fi
24b0: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20 20  nalize(&q);.    
24c0: 7d 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 48 69  }.    if( g.okHi
24d0: 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 63  story ){.      c
24e0: 68 61 72 20 2a 7a 53 68 6f 72 74 55 75 69 64 20  har *zShortUuid 
24f0: 3d 20 6d 70 72 69 6e 74 66 28 22 25 2e 31 30 73  = mprintf("%.10s
2500: 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 20  ", zUuid);.     
2510: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
2520: 6f 6a 4e 61 6d 65 20 3d 20 64 62 5f 67 65 74 28  ojName = db_get(
2530: 22 70 72 6f 6a 65 63 74 2d 6e 61 6d 65 22 2c 20  "project-name", 
2540: 22 75 6e 6e 61 6d 65 64 22 29 3b 0a 20 20 20 20  "unnamed");.    
2550: 20 20 40 20 3c 74 72 3e 3c 74 68 3e 54 69 6d 65    @ <tr><th>Time
2560: 6c 69 6e 65 73 3a 3c 2f 74 68 3e 3c 74 64 3e 0a  lines:</th><td>.
2570: 20 20 20 20 20 20 40 20 20 20 20 3c 61 20 68 72        @    <a hr
2580: 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52  ef="%s(g.zBaseUR
2590: 4c 29 2f 74 69 6d 65 6c 69 6e 65 3f 70 3d 25 64  L)/timeline?p=%d
25a0: 28 72 69 64 29 22 3e 61 6e 63 65 73 74 6f 72 73  (rid)">ancestors
25b0: 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 20 20 20  </a>.      @    
25c0: 7c 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e  | <a href="%s(g.
25d0: 7a 42 61 73 65 55 52 4c 29 2f 74 69 6d 65 6c 69  zBaseURL)/timeli
25e0: 6e 65 3f 64 3d 25 64 28 72 69 64 29 22 3e 64 65  ne?d=%d(rid)">de
25f0: 73 63 65 6e 64 61 6e 74 73 3c 2f 61 3e 0a 20 20  scendants</a>.  
2600: 20 20 20 20 40 20 20 20 20 7c 20 3c 61 20 68 72      @    | <a hr
2610: 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52  ef="%s(g.zBaseUR
2620: 4c 29 2f 74 69 6d 65 6c 69 6e 65 3f 64 3d 25 64  L)/timeline?d=%d
2630: 28 72 69 64 29 26 70 3d 25 64 28 72 69 64 29 22  (rid)&p=%d(rid)"
2640: 3e 62 6f 74 68 3c 2f 61 3e 0a 20 20 20 20 20 20  >both</a>.      
2650: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22  db_prepare(&q, "
2660: 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 61  SELECT substr(ta
2670: 67 2e 74 61 67 6e 61 6d 65 2c 35 29 20 46 52 4f  g.tagname,5) FRO
2680: 4d 20 74 61 67 78 72 65 66 2c 20 74 61 67 20 22  M tagxref, tag "
2690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26a0: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 72 69        " WHERE ri
26b0: 64 3d 25 64 20 41 4e 44 20 74 61 67 74 79 70 65  d=%d AND tagtype
26c0: 3e 30 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  >0 ".           
26d0: 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e            "   AN
26e0: 44 20 74 61 67 2e 74 61 67 69 64 3d 74 61 67 78  D tag.tagid=tagx
26f0: 72 65 66 2e 74 61 67 69 64 20 22 0a 20 20 20 20  ref.tagid ".    
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 22 20 20 20 41 4e 44 20 2b 74 61 67 2e 74 61   "   AND +tag.ta
2720: 67 6e 61 6d 65 20 47 4c 4f 42 20 27 73 79 6d 2d  gname GLOB 'sym-
2730: 2a 27 22 2c 20 72 69 64 29 3b 0a 20 20 20 20 20  *'", rid);.     
2740: 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28   while( db_step(
2750: 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)==SQLITE_ROW 
2760: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2770: 20 63 68 61 72 20 2a 7a 54 61 67 4e 61 6d 65 20   char *zTagName 
2780: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
2790: 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  (&q, 0);.       
27a0: 20 40 20 20 7c 20 3c 61 20 68 72 65 66 3d 22 25   @  | <a href="%
27b0: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 74 69  s(g.zBaseURL)/ti
27c0: 6d 65 6c 69 6e 65 3f 74 3d 25 54 28 7a 54 61 67  meline?t=%T(zTag
27d0: 4e 61 6d 65 29 22 3e 25 68 28 7a 54 61 67 4e 61  Name)">%h(zTagNa
27e0: 6d 65 29 3c 2f 61 3e 0a 20 20 20 20 20 20 7d 0a  me)</a>.      }.
27f0: 20 20 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a        db_finaliz
2800: 65 28 26 71 29 3b 0a 20 20 20 20 20 20 40 20 3c  e(&q);.      @ <
2810: 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 20 20  /td></tr>.      
2820: 40 20 3c 74 72 3e 3c 74 68 3e 4f 74 68 65 72 26  @ <tr><th>Other&
2830: 6e 62 73 70 3b 4c 69 6e 6b 73 3a 3c 2f 74 68 3e  nbsp;Links:</th>
2840: 0a 20 20 20 20 20 20 40 20 20 20 3c 74 64 3e 0a  .      @   <td>.
2850: 20 20 20 20 20 20 40 20 20 20 20 20 3c 61 20 68        @     <a h
2860: 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55  ref="%s(g.zBaseU
2870: 52 4c 29 2f 64 69 72 3f 63 69 3d 25 73 28 7a 53  RL)/dir?ci=%s(zS
2880: 68 6f 72 74 55 75 69 64 29 22 3e 66 69 6c 65 73  hortUuid)">files
2890: 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 20 20 20  </a>.      @    
28a0: 20 7c 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67   | <a href="%s(g
28b0: 2e 7a 42 61 73 65 55 52 4c 29 2f 7a 69 70 2f 25  .zBaseURL)/zip/%
28c0: 73 28 7a 50 72 6f 6a 4e 61 6d 65 29 2d 25 73 28  s(zProjName)-%s(
28d0: 7a 53 68 6f 72 74 55 75 69 64 29 2e 7a 69 70 3f  zShortUuid).zip?
28e0: 75 75 69 64 3d 25 73 28 7a 55 75 69 64 29 22 3e  uuid=%s(zUuid)">
28f0: 0a 20 20 20 20 20 20 40 20 20 20 20 20 20 20 20  .      @        
2900: 20 5a 49 50 20 61 72 63 68 69 76 65 3c 2f 61 3e   ZIP archive</a>
2910: 0a 20 20 20 20 20 20 40 20 20 20 20 20 7c 20 3c  .      @     | <
2920: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
2930: 73 65 55 52 4c 29 2f 61 72 74 69 66 61 63 74 2f  seURL)/artifact/
2940: 25 64 28 72 69 64 29 22 3e 6d 61 6e 69 66 65 73  %d(rid)">manifes
2950: 74 3c 2f 61 3e 0a 20 20 20 20 20 20 69 66 28 20  t</a>.      if( 
2960: 67 2e 6f 6b 57 72 69 74 65 20 29 7b 0a 20 20 20  g.okWrite ){.   
2970: 20 20 20 20 20 40 20 20 20 20 20 7c 20 3c 61 20       @     | <a 
2980: 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65  href="%s(g.zBase
2990: 55 52 4c 29 2f 63 69 5f 65 64 69 74 3f 72 3d 25  URL)/ci_edit?r=%
29a0: 64 28 72 69 64 29 22 3e 65 64 69 74 3c 2f 61 3e  d(rid)">edit</a>
29b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 40  .      }.      @
29c0: 20 20 20 3c 2f 74 64 3e 0a 20 20 20 20 20 20 40     </td>.      @
29d0: 20 3c 2f 74 72 3e 0a 20 20 20 20 20 20 66 72 65   </tr>.      fre
29e0: 65 28 7a 53 68 6f 72 74 55 75 69 64 29 3b 0a 20  e(zShortUuid);. 
29f0: 20 20 20 7d 0a 20 20 20 20 40 20 3c 2f 74 61 62     }.    @ </tab
2a00: 6c 65 3e 3c 2f 70 3e 0a 20 20 7d 65 6c 73 65 7b  le></p>.  }else{
2a10: 0a 20 20 20 20 73 74 79 6c 65 5f 68 65 61 64 65  .    style_heade
2a20: 72 28 22 43 68 65 63 6b 2d 69 6e 20 49 6e 66 6f  r("Check-in Info
2a30: 72 6d 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20 6c  rmation");.    l
2a40: 6f 67 69 6e 5f 61 6e 6f 6e 79 6d 6f 75 73 5f 61  ogin_anonymous_a
2a50: 76 61 69 6c 61 62 6c 65 28 29 3b 0a 20 20 7d 0a  vailable();.  }.
2a60: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71    db_finalize(&q
2a70: 29 3b 0a 20 20 73 68 6f 77 54 61 67 73 28 72 69  );.  showTags(ri
2a80: 64 2c 20 22 22 29 3b 0a 20 20 40 20 3c 64 69 76  d, "");.  @ <div
2a90: 20 63 6c 61 73 73 3d 22 73 65 63 74 69 6f 6e 22   class="section"
2aa0: 3e 43 68 61 6e 67 65 73 3c 2f 64 69 76 3e 0a 20  >Changes</div>. 
2ab0: 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a   db_prepare(&q,.
2ac0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 70 69 64       "SELECT pid
2ad0: 2c 20 66 69 64 2c 20 6e 61 6d 65 2c 20 73 75 62  , fid, name, sub
2ae0: 73 74 72 28 61 2e 75 75 69 64 2c 31 2c 31 30 29  str(a.uuid,1,10)
2af0: 2c 20 73 75 62 73 74 72 28 62 2e 75 75 69 64 2c  , substr(b.uuid,
2b00: 31 2c 31 30 29 22 0a 20 20 20 20 20 22 20 20 46  1,10)".     "  F
2b10: 52 4f 4d 20 6d 6c 69 6e 6b 20 4a 4f 49 4e 20 66  ROM mlink JOIN f
2b20: 69 6c 65 6e 61 6d 65 20 4f 4e 20 66 69 6c 65 6e  ilename ON filen
2b30: 61 6d 65 2e 66 6e 69 64 3d 6d 6c 69 6e 6b 2e 66  ame.fnid=mlink.f
2b40: 6e 69 64 22 0a 20 20 20 20 20 22 20 20 20 20 20  nid".     "     
2b50: 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 62 6c      LEFT JOIN bl
2b60: 6f 62 20 61 20 4f 4e 20 61 2e 72 69 64 3d 70 69  ob a ON a.rid=pi
2b70: 64 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 20  d".     "       
2b80: 20 20 4c 45 46 54 20 4a 4f 49 4e 20 62 6c 6f 62    LEFT JOIN blob
2b90: 20 62 20 4f 4e 20 62 2e 72 69 64 3d 66 69 64 22   b ON b.rid=fid"
2ba0: 0a 20 20 20 20 20 22 20 57 48 45 52 45 20 6d 6c  .     " WHERE ml
2bb0: 69 6e 6b 2e 6d 69 64 3d 25 64 22 0a 20 20 20 20  ink.mid=%d".    
2bc0: 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65   " ORDER BY name
2bd0: 22 2c 0a 20 20 20 20 20 72 69 64 0a 20 20 29 3b  ",.     rid.  );
2be0: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
2bf0: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
2c00: 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 69 64  W ){.    int pid
2c10: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
2c20: 28 26 71 2c 30 29 3b 0a 20 20 20 20 69 6e 74 20  (&q,0);.    int 
2c30: 66 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  fid = db_column_
2c40: 69 6e 74 28 26 71 2c 31 29 3b 0a 20 20 20 20 63  int(&q,1);.    c
2c50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2c60: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
2c70: 74 28 26 71 2c 32 29 3b 0a 20 20 20 20 63 6f 6e  t(&q,2);.    con
2c80: 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20  st char *zOld = 
2c90: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
2ca0: 71 2c 33 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  q,3);.    const 
2cb0: 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 64 62 5f  char *zNew = db_
2cc0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 34  column_text(&q,4
2cd0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4f 6c 64 20  );.    if( zOld 
2ce0: 26 26 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20  && zNew ){.     
2cf0: 20 40 20 3c 70 3e 4d 6f 64 69 66 69 65 64 20 3c   @ <p>Modified <
2d00: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
2d10: 73 65 55 52 4c 29 2f 66 69 6e 66 6f 3f 6e 61 6d  seURL)/finfo?nam
2d20: 65 3d 25 54 28 7a 4e 61 6d 65 29 22 3e 25 68 28  e=%T(zName)">%h(
2d30: 7a 4e 61 6d 65 29 3c 2f 61 3e 0a 20 20 20 20 20  zName)</a>.     
2d40: 20 40 20 66 72 6f 6d 20 3c 61 20 68 72 65 66 3d   @ from <a href=
2d50: 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f  "%s(g.zBaseURL)/
2d60: 61 72 74 69 66 61 63 74 2f 25 73 28 7a 4f 6c 64  artifact/%s(zOld
2d70: 29 22 3e 5b 25 73 28 7a 4f 6c 64 29 5d 3c 2f 61  )">[%s(zOld)]</a
2d80: 3e 0a 20 20 20 20 20 20 40 20 74 6f 20 3c 61 20  >.      @ to <a 
2d90: 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65  href="%s(g.zBase
2da0: 55 52 4c 29 2f 61 72 74 69 66 61 63 74 2f 25 73  URL)/artifact/%s
2db0: 28 7a 4e 65 77 29 22 3e 5b 25 73 28 7a 4e 65 77  (zNew)">[%s(zNew
2dc0: 29 5d 3c 2f 61 3e 3c 2f 70 3e 0a 20 20 20 20 7d  )]</a></p>.    }
2dd0: 65 6c 73 65 20 69 66 28 20 7a 4f 6c 64 20 29 7b  else if( zOld ){
2de0: 0a 20 20 20 20 20 20 40 20 3c 70 3e 44 65 6c 65  .      @ <p>Dele
2df0: 74 65 64 20 3c 61 20 68 72 65 66 3d 22 25 73 28  ted <a href="%s(
2e00: 67 2e 7a 42 61 73 65 55 52 4c 29 2f 66 69 6e 66  g.zBaseURL)/finf
2e10: 6f 3f 6e 61 6d 65 3d 25 54 28 7a 4e 61 6d 65 29  o?name=%T(zName)
2e20: 22 3e 25 68 28 7a 4e 61 6d 65 29 3c 2f 61 3e 0a  ">%h(zName)</a>.
2e30: 20 20 20 20 20 20 40 20 76 65 72 73 69 6f 6e 20        @ version 
2e40: 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42  <a href="%s(g.zB
2e50: 61 73 65 55 52 4c 29 2f 61 72 74 69 66 61 63 74  aseURL)/artifact
2e60: 2f 25 73 28 7a 4f 6c 64 29 22 3e 5b 25 73 28 7a  /%s(zOld)">[%s(z
2e70: 4f 6c 64 29 5d 3c 2f 61 3e 3c 2f 70 3e 0a 20 20  Old)]</a></p>.  
2e80: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2e90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40    }else{.      @
2ea0: 20 3c 70 3e 41 64 64 65 64 20 3c 61 20 68 72 65   <p>Added <a hre
2eb0: 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  f="%s(g.zBaseURL
2ec0: 29 2f 66 69 6e 66 6f 3f 6e 61 6d 65 3d 25 54 28  )/finfo?name=%T(
2ed0: 7a 4e 61 6d 65 29 22 3e 25 68 28 7a 4e 61 6d 65  zName)">%h(zName
2ee0: 29 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 76 65  )</a>.      @ ve
2ef0: 72 73 69 6f 6e 20 3c 61 20 68 72 65 66 3d 22 25  rsion <a href="%
2f00: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 61 72  s(g.zBaseURL)/ar
2f10: 74 69 66 61 63 74 2f 25 73 28 7a 4e 65 77 29 22  tifact/%s(zNew)"
2f20: 3e 5b 25 73 28 7a 4e 65 77 29 5d 3c 2f 61 3e 3c  >[%s(zNew)]</a><
2f30: 2f 70 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20  /p>.    }.    @ 
2f40: 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65  <blockquote><pre
2f50: 3e 0a 20 20 20 20 61 70 70 65 6e 64 5f 64 69 66  >.    append_dif
2f60: 66 28 70 69 64 2c 20 66 69 64 29 3b 0a 20 20 20  f(pid, fid);.   
2f70: 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b   @ </pre></block
2f80: 71 75 6f 74 65 3e 0a 20 20 7d 0a 20 20 64 62 5f  quote>.  }.  db_
2f90: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
2fa0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
2fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45  }../*.** WEBPAGE
2fc0: 3a 20 77 69 6e 66 6f 0a 2a 2a 20 55 52 4c 3a 20  : winfo.** URL: 
2fd0: 20 2f 77 69 6e 66 6f 3f 6e 61 6d 65 3d 52 49 44   /winfo?name=RID
2fe0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 69 6e  .**.** Return in
2ff0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
3000: 61 20 77 69 6b 69 20 70 61 67 65 2e 0a 2a 2f 0a  a wiki page..*/.
3010: 76 6f 69 64 20 77 69 6e 66 6f 5f 70 61 67 65 28  void winfo_page(
3020: 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b  void){.  Stmt q;
3030: 0a 20 20 69 6e 74 20 72 69 64 3b 0a 0a 20 20 6c  .  int rid;..  l
3040: 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65  ogin_check_crede
3050: 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20  ntials();.  if( 
3060: 21 67 2e 6f 6b 52 64 57 69 6b 69 20 29 7b 20 6c  !g.okRdWiki ){ l
3070: 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72  ogin_needed(); r
3080: 65 74 75 72 6e 3b 20 7d 0a 20 20 72 69 64 20 3d  eturn; }.  rid =
3090: 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44 28   name_to_rid(PD(
30a0: 22 6e 61 6d 65 22 2c 22 30 22 29 29 3b 0a 20 20  "name","0"));.  
30b0: 69 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a 20 20  if( rid==0 ){.  
30c0: 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22    style_header("
30d0: 57 69 6b 69 20 50 61 67 65 20 49 6e 66 6f 72 6d  Wiki Page Inform
30e0: 61 74 69 6f 6e 20 45 72 72 6f 72 22 29 3b 0a 20  ation Error");. 
30f0: 20 20 20 40 20 4e 6f 20 73 75 63 68 20 6f 62 6a     @ No such obj
3100: 65 63 74 3a 20 25 68 28 67 2e 61 72 67 76 5b 32  ect: %h(g.argv[2
3110: 5d 29 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f  ]).    style_foo
3120: 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72  ter();.    retur
3130: 6e 3b 0a 20 20 7d 0a 20 20 64 62 5f 70 72 65 70  n;.  }.  db_prep
3140: 61 72 65 28 26 71 2c 20 0a 20 20 20 20 20 22 53  are(&q, .     "S
3150: 45 4c 45 43 54 20 73 75 62 73 74 72 28 74 61 67  ELECT substr(tag
3160: 6e 61 6d 65 2c 20 36 2c 20 31 30 30 30 29 2c 20  name, 6, 1000), 
3170: 75 75 69 64 2c 22 0a 20 20 20 20 20 22 20 20 20  uuid,".     "   
3180: 20 20 20 20 64 61 74 65 74 69 6d 65 28 65 76 65      datetime(eve
3190: 6e 74 2e 6d 74 69 6d 65 2c 20 27 6c 6f 63 61 6c  nt.mtime, 'local
31a0: 74 69 6d 65 27 29 2c 20 75 73 65 72 22 0a 20 20  time'), user".  
31b0: 20 20 20 22 20 20 46 52 4f 4d 20 74 61 67 78 72     "  FROM tagxr
31c0: 65 66 2c 20 74 61 67 2c 20 62 6c 6f 62 2c 20 65  ef, tag, blob, e
31d0: 76 65 6e 74 22 0a 20 20 20 20 20 22 20 57 48 45  vent".     " WHE
31e0: 52 45 20 74 61 67 78 72 65 66 2e 72 69 64 3d 25  RE tagxref.rid=%
31f0: 64 22 0a 20 20 20 20 20 22 20 20 20 41 4e 44 20  d".     "   AND 
3200: 74 61 67 2e 74 61 67 69 64 3d 74 61 67 78 72 65  tag.tagid=tagxre
3210: 66 2e 74 61 67 69 64 22 0a 20 20 20 20 20 22 20  f.tagid".     " 
3220: 20 20 41 4e 44 20 74 61 67 2e 74 61 67 6e 61 6d    AND tag.tagnam
3230: 65 20 4c 49 4b 45 20 27 77 69 6b 69 2d 25 25 27  e LIKE 'wiki-%%'
3240: 22 0a 20 20 20 20 20 22 20 20 20 41 4e 44 20 62  ".     "   AND b
3250: 6c 6f 62 2e 72 69 64 3d 25 64 22 0a 20 20 20 20  lob.rid=%d".    
3260: 20 22 20 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f   "   AND event.o
3270: 62 6a 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 72  bjid=%d",.     r
3280: 69 64 2c 20 72 69 64 2c 20 72 69 64 0a 20 20 29  id, rid, rid.  )
3290: 3b 0a 20 20 69 66 28 20 64 62 5f 73 74 65 70 28  ;.  if( db_step(
32a0: 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)==SQLITE_ROW 
32b0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
32c0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f  r *zName = db_co
32d0: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29  lumn_text(&q, 0)
32e0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
32f0: 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c   *zUuid = db_col
3300: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b  umn_text(&q, 1);
3310: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 69 74 6c  .    char *zTitl
3320: 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 57 69 6b  e = mprintf("Wik
3330: 69 20 50 61 67 65 20 25 73 22 2c 20 7a 4e 61 6d  i Page %s", zNam
3340: 65 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  e);.    const ch
3350: 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63  ar *zDate = db_c
3360: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 32 29  olumn_text(&q,2)
3370: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
3380: 20 2a 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f 6c   *zUser = db_col
3390: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 33 29 3b 0a  umn_text(&q,3);.
33a0: 20 20 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72      style_header
33b0: 28 7a 54 69 74 6c 65 29 3b 0a 20 20 20 20 66 72  (zTitle);.    fr
33c0: 65 65 28 7a 54 69 74 6c 65 29 3b 0a 20 20 20 20  ee(zTitle);.    
33d0: 6c 6f 67 69 6e 5f 61 6e 6f 6e 79 6d 6f 75 73 5f  login_anonymous_
33e0: 61 76 61 69 6c 61 62 6c 65 28 29 3b 0a 20 20 20  available();.   
33f0: 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 73   @ <div class="s
3400: 65 63 74 69 6f 6e 22 3e 4f 76 65 72 76 69 65 77  ection">Overview
3410: 3c 2f 64 69 76 3e 0a 20 20 20 20 40 20 3c 70 3e  </div>.    @ <p>
3420: 3c 74 61 62 6c 65 20 63 6c 61 73 73 3d 22 6c 61  <table class="la
3430: 62 65 6c 2d 76 61 6c 75 65 22 3e 0a 20 20 20 20  bel-value">.    
3440: 40 20 3c 74 72 3e 3c 74 68 3e 56 65 72 73 69 6f  @ <tr><th>Versio
3450: 6e 3a 3c 2f 74 68 3e 3c 74 64 3e 25 73 28 7a 55  n:</th><td>%s(zU
3460: 75 69 64 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20  uid)</td></tr>. 
3470: 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 44 61 74     @ <tr><th>Dat
3480: 65 3a 3c 2f 74 68 3e 3c 74 64 3e 0a 20 20 20 20  e:</th><td>.    
3490: 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74  hyperlink_to_dat
34a0: 65 28 7a 44 61 74 65 2c 20 22 3c 2f 74 64 3e 3c  e(zDate, "</td><
34b0: 2f 74 72 3e 22 29 3b 0a 20 20 20 20 69 66 28 20  /tr>");.    if( 
34c0: 67 2e 6f 6b 53 65 74 75 70 20 29 7b 0a 20 20 20  g.okSetup ){.   
34d0: 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 52 65 63     @ <tr><th>Rec
34e0: 6f 72 64 20 49 44 3a 3c 2f 74 68 3e 3c 74 64 3e  ord ID:</th><td>
34f0: 25 64 28 72 69 64 29 3c 2f 74 64 3e 3c 2f 74 72  %d(rid)</td></tr
3500: 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 74  >.    }.    @ <t
3510: 72 3e 3c 74 68 3e 4f 72 69 67 69 6e 61 6c 26 6e  r><th>Original&n
3520: 62 73 70 3b 55 73 65 72 3a 3c 2f 74 68 3e 3c 74  bsp;User:</th><t
3530: 64 3e 0a 20 20 20 20 68 79 70 65 72 6c 69 6e 6b  d>.    hyperlink
3540: 5f 74 6f 5f 75 73 65 72 28 7a 55 73 65 72 2c 20  _to_user(zUser, 
3550: 7a 44 61 74 65 2c 20 22 3c 2f 74 64 3e 3c 2f 74  zDate, "</td></t
3560: 72 3e 22 29 3b 0a 20 20 20 20 69 66 28 20 67 2e  r>");.    if( g.
3570: 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20 20 20  okHistory ){.   
3580: 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 43 6f 6d     @ <tr><th>Com
3590: 6d 61 6e 64 73 3a 3c 2f 74 68 3e 0a 20 20 20 20  mands:</th>.    
35a0: 20 20 40 20 20 20 3c 74 64 3e 0a 20 20 20 20 20    @   <td>.     
35b0: 20 2f 2a 20 40 20 20 20 20 20 3c 61 20 68 72 65   /* @     <a hre
35c0: 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  f="%s(g.zBaseURL
35d0: 29 2f 77 64 69 66 66 2f 25 64 28 72 69 64 29 22  )/wdiff/%d(rid)"
35e0: 3e 64 69 66 66 3c 2f 61 3e 20 7c 20 2a 2f 0a 20  >diff</a> | */. 
35f0: 20 20 20 20 20 40 20 20 20 20 20 3c 61 20 68 72       @     <a hr
3600: 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52  ef="%s(g.zBaseUR
3610: 4c 29 2f 77 68 69 73 74 6f 72 79 3f 6e 61 6d 65  L)/whistory?name
3620: 3d 25 74 28 7a 4e 61 6d 65 29 22 3e 68 69 73 74  =%t(zName)">hist
3630: 6f 72 79 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20  ory</a>.      @ 
3640: 20 20 20 20 7c 20 3c 61 20 68 72 65 66 3d 22 25      | <a href="%
3650: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 61 72  s(g.zBaseURL)/ar
3660: 74 69 66 61 63 74 2f 25 64 28 72 69 64 29 22 3e  tifact/%d(rid)">
3670: 72 61 77 2d 74 65 78 74 3c 2f 61 3e 0a 20 20 20  raw-text</a>.   
3680: 20 20 20 40 20 20 20 3c 2f 74 64 3e 0a 20 20 20     @   </td>.   
3690: 20 20 20 40 20 3c 2f 74 72 3e 0a 20 20 20 20 7d     @ </tr>.    }
36a0: 0a 20 20 20 20 40 20 3c 2f 74 61 62 6c 65 3e 3c  .    @ </table><
36b0: 2f 70 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /p>.  }else{.   
36c0: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 57   style_header("W
36d0: 69 6b 69 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 22  iki Information"
36e0: 29 3b 0a 20 20 20 20 72 69 64 20 3d 20 30 3b 0a  );.    rid = 0;.
36f0: 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a    }.  db_finaliz
3700: 65 28 26 71 29 3b 0a 20 20 73 68 6f 77 54 61 67  e(&q);.  showTag
3710: 73 28 72 69 64 2c 20 22 77 69 6b 69 2d 2a 22 29  s(rid, "wiki-*")
3720: 3b 0a 20 20 69 66 28 20 72 69 64 20 29 7b 0a 20  ;.  if( rid ){. 
3730: 20 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b     Blob content;
3740: 0a 20 20 20 20 4d 61 6e 69 66 65 73 74 20 6d 3b  .    Manifest m;
3750: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20  .    memset(&m, 
3760: 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20  0, sizeof(m));. 
3770: 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 6d 2e     blob_zero(&m.
3780: 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 63 6f  content);.    co
3790: 6e 74 65 6e 74 5f 67 65 74 28 72 69 64 2c 20 26  ntent_get(rid, &
37a0: 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 6d 61  content);.    ma
37b0: 6e 69 66 65 73 74 5f 70 61 72 73 65 28 26 6d 2c  nifest_parse(&m,
37c0: 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20   &content);.    
37d0: 69 66 28 20 6d 2e 74 79 70 65 3d 3d 43 46 54 59  if( m.type==CFTY
37e0: 50 45 5f 57 49 4b 49 20 29 7b 0a 20 20 20 20 20  PE_WIKI ){.     
37f0: 20 42 6c 6f 62 20 77 69 6b 69 3b 0a 20 20 20 20   Blob wiki;.    
3800: 20 20 62 6c 6f 62 5f 69 6e 69 74 28 26 77 69 6b    blob_init(&wik
3810: 69 2c 20 6d 2e 7a 57 69 6b 69 2c 20 2d 31 29 3b  i, m.zWiki, -1);
3820: 0a 20 20 20 20 20 20 40 20 3c 64 69 76 20 63 6c  .      @ <div cl
3830: 61 73 73 3d 22 73 65 63 74 69 6f 6e 22 3e 43 6f  ass="section">Co
3840: 6e 74 65 6e 74 3c 2f 64 69 76 3e 0a 20 20 20 20  ntent</div>.    
3850: 20 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74 28 26    wiki_convert(&
3860: 77 69 6b 69 2c 20 30 2c 20 30 29 3b 0a 20 20 20  wiki, 0, 0);.   
3870: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 77     blob_reset(&w
3880: 69 6b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iki);.    }.    
3890: 6d 61 6e 69 66 65 73 74 5f 63 6c 65 61 72 28 26  manifest_clear(&
38a0: 6d 29 3b 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f  m);.  }.  style_
38b0: 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a  footer();.}../*.
38c0: 2a 2a 20 57 45 42 50 41 47 45 3a 20 66 69 6e 66  ** WEBPAGE: finf
38d0: 6f 0a 2a 2a 20 55 52 4c 3a 20 2f 66 69 6e 66 6f  o.** URL: /finfo
38e0: 3f 6e 61 6d 65 3d 46 49 4c 45 4e 41 4d 45 0a 2a  ?name=FILENAME.*
38f0: 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20 63 6f  *.** Show the co
3900: 6d 70 6c 65 74 65 20 63 68 61 6e 67 65 20 68 69  mplete change hi
3910: 73 74 6f 72 79 20 66 6f 72 20 61 20 73 69 6e 67  story for a sing
3920: 6c 65 20 66 69 6c 65 2e 20 0a 2a 2f 0a 76 6f 69  le file. .*/.voi
3930: 64 20 66 69 6e 66 6f 5f 70 61 67 65 28 76 6f 69  d finfo_page(voi
3940: 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20  d){.  Stmt q;.  
3950: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
3960: 65 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 50  ename;.  char zP
3970: 72 65 76 44 61 74 65 5b 32 30 5d 3b 0a 20 20 42  revDate[20];.  B
3980: 6c 6f 62 20 74 69 74 6c 65 3b 0a 0a 20 20 6c 6f  lob title;..  lo
3990: 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e  gin_check_creden
39a0: 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21  tials();.  if( !
39b0: 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c 6f 67 69  g.okRead ){ logi
39c0: 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75  n_needed(); retu
39d0: 72 6e 3b 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65  rn; }.  style_he
39e0: 61 64 65 72 28 22 46 69 6c 65 20 48 69 73 74 6f  ader("File Histo
39f0: 72 79 22 29 3b 0a 20 20 6c 6f 67 69 6e 5f 61 6e  ry");.  login_an
3a00: 6f 6e 79 6d 6f 75 73 5f 61 76 61 69 6c 61 62 6c  onymous_availabl
3a10: 65 28 29 3b 0a 0a 20 20 7a 50 72 65 76 44 61 74  e();..  zPrevDat
3a20: 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 7a 46 69 6c  e[0] = 0;.  zFil
3a30: 65 6e 61 6d 65 20 3d 20 50 44 28 22 6e 61 6d 65  ename = PD("name
3a40: 22 2c 22 22 29 3b 0a 20 20 64 62 5f 70 72 65 70  ","");.  db_prep
3a50: 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45 4c  are(&q,.    "SEL
3a60: 45 43 54 20 73 75 62 73 74 72 28 62 2e 75 75 69  ECT substr(b.uui
3a70: 64 2c 31 2c 31 30 29 2c 20 64 61 74 65 74 69 6d  d,1,10), datetim
3a80: 65 28 65 76 65 6e 74 2e 6d 74 69 6d 65 2c 27 6c  e(event.mtime,'l
3a90: 6f 63 61 6c 74 69 6d 65 27 29 2c 22 0a 20 20 20  ocaltime'),".   
3aa0: 20 22 20 20 20 20 20 20 20 63 6f 61 6c 65 73 63   "       coalesc
3ab0: 65 28 65 76 65 6e 74 2e 65 63 6f 6d 6d 65 6e 74  e(event.ecomment
3ac0: 2c 20 65 76 65 6e 74 2e 63 6f 6d 6d 65 6e 74 29  , event.comment)
3ad0: 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 63  ,".    "       c
3ae0: 6f 61 6c 65 73 63 65 28 65 76 65 6e 74 2e 65 75  oalesce(event.eu
3af0: 73 65 72 2c 20 65 76 65 6e 74 2e 75 73 65 72 29  ser, event.user)
3b00: 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 6d  ,".    "       m
3b10: 6c 69 6e 6b 2e 70 69 64 2c 20 6d 6c 69 6e 6b 2e  link.pid, mlink.
3b20: 66 69 64 2c 20 6d 6c 69 6e 6b 2e 6d 69 64 2c 20  fid, mlink.mid, 
3b30: 6d 6c 69 6e 6b 2e 66 6e 69 64 22 0a 20 20 20 20  mlink.fnid".    
3b40: 22 20 20 46 52 4f 4d 20 6d 6c 69 6e 6b 2c 20 62  "  FROM mlink, b
3b50: 6c 6f 62 20 62 2c 20 65 76 65 6e 74 22 0a 20 20  lob b, event".  
3b60: 20 20 22 20 57 48 45 52 45 20 6d 6c 69 6e 6b 2e    " WHERE mlink.
3b70: 66 6e 69 64 3d 28 53 45 4c 45 43 54 20 66 6e 69  fnid=(SELECT fni
3b80: 64 20 46 52 4f 4d 20 66 69 6c 65 6e 61 6d 65 20  d FROM filename 
3b90: 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 29 22 0a  WHERE name=%Q)".
3ba0: 20 20 20 20 22 20 20 20 41 4e 44 20 62 2e 72 69      "   AND b.ri
3bb0: 64 3d 6d 6c 69 6e 6b 2e 66 69 64 22 0a 20 20 20  d=mlink.fid".   
3bc0: 20 22 20 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f   "   AND event.o
3bd0: 62 6a 69 64 3d 6d 6c 69 6e 6b 2e 6d 69 64 22 0a  bjid=mlink.mid".
3be0: 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 65      " ORDER BY e
3bf0: 76 65 6e 74 2e 6d 74 69 6d 65 20 44 45 53 43 22  vent.mtime DESC"
3c00: 2c 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a  ,.    zFilename.
3c10: 20 20 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f    );.  blob_zero
3c20: 28 26 74 69 74 6c 65 29 3b 0a 20 20 62 6c 6f 62  (&title);.  blob
3c30: 5f 61 70 70 65 6e 64 66 28 26 74 69 74 6c 65 2c  _appendf(&title,
3c40: 20 22 48 69 73 74 6f 72 79 20 6f 66 20 22 29 3b   "History of ");
3c50: 0a 20 20 68 79 70 65 72 6c 69 6e 6b 65 64 5f 70  .  hyperlinked_p
3c60: 61 74 68 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  ath(zFilename, &
3c70: 74 69 74 6c 65 29 3b 0a 20 20 40 20 3c 68 32 3e  title);.  @ <h2>
3c80: 25 62 28 26 74 69 74 6c 65 29 3c 2f 68 32 3e 0a  %b(&title)</h2>.
3c90: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 74 69    blob_reset(&ti
3ca0: 74 6c 65 29 3b 0a 20 20 40 20 3c 74 61 62 6c 65  tle);.  @ <table
3cb0: 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d 30 20 62   cellspacing=0 b
3cc0: 6f 72 64 65 72 3d 30 20 63 65 6c 6c 70 61 64 64  order=0 cellpadd
3cd0: 69 6e 67 3d 30 3e 0a 20 20 77 68 69 6c 65 28 20  ing=0>.  while( 
3ce0: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c  db_step(&q)==SQL
3cf0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
3d00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64  onst char *zUuid
3d10: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
3d20: 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 63 6f  t(&q, 0);.    co
3d30: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65 20  nst char *zDate 
3d40: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
3d50: 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e  (&q, 1);.    con
3d60: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 20 3d 20  st char *zCom = 
3d70: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
3d80: 71 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74  q, 2);.    const
3d90: 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 64   char *zUser = d
3da0: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
3db0: 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 66 70  , 3);.    int fp
3dc0: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69  id = db_column_i
3dd0: 6e 74 28 26 71 2c 20 34 29 3b 0a 20 20 20 20 69  nt(&q, 4);.    i
3de0: 6e 74 20 66 72 69 64 20 3d 20 64 62 5f 63 6f 6c  nt frid = db_col
3df0: 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 35 29 3b 0a  umn_int(&q, 5);.
3e00: 20 20 20 20 69 6e 74 20 6d 69 64 20 3d 20 64 62      int mid = db
3e10: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20  _column_int(&q, 
3e20: 36 29 3b 0a 20 20 20 20 69 6e 74 20 66 6e 69 64  6);.    int fnid
3e30: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   = db_column_int
3e40: 28 26 71 2c 20 37 29 3b 0a 20 20 20 20 63 68 61  (&q, 7);.    cha
3e50: 72 20 7a 53 68 6f 72 74 5b 32 30 5d 3b 0a 20 20  r zShort[20];.  
3e60: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 7a 44 61    if( memcmp(zDa
3e70: 74 65 2c 20 7a 50 72 65 76 44 61 74 65 2c 20 31  te, zPrevDate, 1
3e80: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69  0) ){.      spri
3e90: 6e 74 66 28 7a 50 72 65 76 44 61 74 65 2c 20 22  ntf(zPrevDate, "
3ea0: 25 2e 31 30 73 22 2c 20 7a 44 61 74 65 29 3b 0a  %.10s", zDate);.
3eb0: 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20        @ <tr><td 
3ec0: 63 6f 6c 73 70 61 6e 3d 33 3e 0a 20 20 20 20 20  colspan=3>.     
3ed0: 20 40 20 20 20 3c 64 69 76 20 63 6c 61 73 73 3d   @   <div class=
3ee0: 22 64 69 76 69 64 65 72 22 3e 25 73 28 7a 50 72  "divider">%s(zPr
3ef0: 65 76 44 61 74 65 29 3c 2f 64 69 76 3e 0a 20 20  evDate)</div>.  
3f00: 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e      @ </td></tr>
3f10: 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 74 72  .    }.    @ <tr
3f20: 3e 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70  ><td valign="top
3f30: 22 3e 25 73 28 26 7a 44 61 74 65 5b 31 31 5d 29  ">%s(&zDate[11])
3f40: 3c 2f 74 64 3e 0a 20 20 20 20 40 20 3c 74 64 20  </td>.    @ <td 
3f50: 77 69 64 74 68 3d 22 32 30 22 3e 3c 2f 74 64 3e  width="20"></td>
3f60: 0a 20 20 20 20 40 20 3c 74 64 20 76 61 6c 69 67  .    @ <td valig
3f70: 6e 3d 22 74 6f 70 22 20 61 6c 69 67 6e 3d 22 6c  n="top" align="l
3f80: 65 66 74 22 3e 0a 20 20 20 20 73 71 6c 69 74 65  eft">.    sqlite
3f90: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
3fa0: 66 28 7a 53 68 6f 72 74 29 2c 20 7a 53 68 6f 72  f(zShort), zShor
3fb0: 74 2c 20 22 25 2e 31 30 73 22 2c 20 7a 55 75 69  t, "%.10s", zUui
3fc0: 64 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b  d);.    if( g.ok
3fd0: 48 69 73 74 6f 72 79 20 29 7b 0a 20 20 20 20 20  History ){.     
3fe0: 20 40 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67   @ <a href="%s(g
3ff0: 2e 7a 54 6f 70 29 2f 61 72 74 69 66 61 63 74 2f  .zTop)/artifact/
4000: 25 73 28 7a 55 75 69 64 29 22 3e 5b 25 73 28 7a  %s(zUuid)">[%s(z
4010: 53 68 6f 72 74 29 5d 3c 2f 61 3e 0a 20 20 20 20  Short)]</a>.    
4020: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 5b  }else{.      @ [
4030: 25 73 28 7a 53 68 6f 72 74 29 5d 0a 20 20 20 20  %s(zShort)].    
4040: 7d 0a 20 20 20 20 40 20 25 68 28 7a 43 6f 6d 29  }.    @ %h(zCom)
4050: 20 28 42 79 3a 20 0a 20 20 20 20 68 79 70 65 72   (By: .    hyper
4060: 6c 69 6e 6b 5f 74 6f 5f 75 73 65 72 28 7a 55 73  link_to_user(zUs
4070: 65 72 2c 20 7a 44 61 74 65 2c 20 22 20 6f 6e 22  er, zDate, " on"
4080: 29 3b 0a 20 20 20 20 68 79 70 65 72 6c 69 6e 6b  );.    hyperlink
4090: 5f 74 6f 5f 64 61 74 65 28 7a 44 61 74 65 2c 20  _to_date(zDate, 
40a0: 22 29 22 29 3b 0a 20 20 20 20 69 66 28 20 67 2e  ")");.    if( g.
40b0: 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20 20 20  okHistory ){.   
40c0: 20 20 20 69 66 28 20 66 70 69 64 20 29 7b 0a 20     if( fpid ){. 
40d0: 20 20 20 20 20 20 20 40 20 3c 61 20 68 72 65 66         @ <a href
40e0: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
40f0: 2f 66 64 69 66 66 3f 76 31 3d 25 64 28 66 70 69  /fdiff?v1=%d(fpi
4100: 64 29 26 61 6d 70 3b 76 32 3d 25 64 28 66 72 69  d)&amp;v2=%d(fri
4110: 64 29 22 3e 5b 64 69 66 66 5d 3c 2f 61 3e 0a 20  d)">[diff]</a>. 
4120: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 40 20 3c       }.      @ <
4130: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
4140: 73 65 55 52 4c 29 2f 61 6e 6e 6f 74 61 74 65 3f  seURL)/annotate?
4150: 6d 69 64 3d 25 64 28 6d 69 64 29 26 61 6d 70 3b  mid=%d(mid)&amp;
4160: 66 6e 69 64 3d 25 64 28 66 6e 69 64 29 22 3e 0a  fnid=%d(fnid)">.
4170: 20 20 20 20 20 20 40 20 5b 61 6e 6e 6f 74 61 74        @ [annotat
4180: 65 5d 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 3c  e]</a>.      @ <
4190: 2f 74 64 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  /td>.    }.  }. 
41a0: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29   db_finalize(&q)
41b0: 3b 0a 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 20  ;.  @ </table>. 
41c0: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
41d0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41  .}.../*.** WEBPA
41e0: 47 45 3a 20 76 64 69 66 66 0a 2a 2a 20 55 52 4c  GE: vdiff.** URL
41f0: 3a 20 2f 76 64 69 66 66 3f 6e 61 6d 65 3d 52 49  : /vdiff?name=RI
4200: 44 0a 2a 2a 0a 2a 2a 20 53 68 6f 77 20 61 6c 6c  D.**.** Show all
4210: 20 64 69 66 66 65 72 65 6e 63 65 73 20 66 6f 72   differences for
4220: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 68   a particular ch
4230: 65 63 6b 2d 69 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  eck-in..*/.void 
4240: 76 64 69 66 66 5f 70 61 67 65 28 76 6f 69 64 29  vdiff_page(void)
4250: 7b 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 53  {.  int rid;.  S
4260: 74 6d 74 20 71 3b 0a 20 20 63 68 61 72 20 2a 7a  tmt q;.  char *z
4270: 55 75 69 64 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63  Uuid;..  login_c
4280: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
4290: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52  ();.  if( !g.okR
42a0: 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65  ead ){ login_nee
42b0: 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d  ded(); return; }
42c0: 0a 20 20 6c 6f 67 69 6e 5f 61 6e 6f 6e 79 6d 6f  .  login_anonymo
42d0: 75 73 5f 61 76 61 69 6c 61 62 6c 65 28 29 3b 0a  us_available();.
42e0: 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74 6f  .  rid = name_to
42f0: 5f 72 69 64 28 50 44 28 22 6e 61 6d 65 22 2c 22  _rid(PD("name","
4300: 22 29 29 3b 0a 20 20 69 66 28 20 72 69 64 3d 3d  "));.  if( rid==
4310: 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  0 ){.    fossil_
4320: 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b  redirect_home();
4330: 0a 20 20 7d 0a 20 20 7a 55 75 69 64 20 3d 20 64  .  }.  zUuid = d
4340: 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43  b_text(0, "SELEC
4350: 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62  T uuid FROM blob
4360: 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20   WHERE rid=%d", 
4370: 72 69 64 29 3b 0a 20 20 73 74 79 6c 65 5f 68 65  rid);.  style_he
4380: 61 64 65 72 28 22 43 68 65 63 6b 2d 69 6e 20 5b  ader("Check-in [
4390: 25 2e 31 30 73 5d 22 2c 20 7a 55 75 69 64 29 3b  %.10s]", zUuid);
43a0: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71  .  db_prepare(&q
43b0: 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20 64 61  ,.    "SELECT da
43c0: 74 65 74 69 6d 65 28 6d 74 69 6d 65 29 2c 20 22  tetime(mtime), "
43d0: 0a 20 20 20 20 22 20 20 20 20 20 20 20 63 6f 61  .    "       coa
43e0: 6c 65 73 63 65 28 65 76 65 6e 74 2e 65 63 6f 6d  lesce(event.ecom
43f0: 6d 65 6e 74 2c 65 76 65 6e 74 2e 63 6f 6d 6d 65  ment,event.comme
4400: 6e 74 29 2c 22 0a 20 20 20 20 22 20 20 20 20 20  nt),".    "     
4410: 20 20 63 6f 61 6c 65 73 63 65 28 65 76 65 6e 74    coalesce(event
4420: 2e 65 75 73 65 72 2c 65 76 65 6e 74 2e 75 73 65  .euser,event.use
4430: 72 29 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20  r)".    "  FROM 
4440: 65 76 65 6e 74 20 57 48 45 52 45 20 74 79 70 65  event WHERE type
4450: 3d 27 63 69 27 20 41 4e 44 20 6f 62 6a 69 64 3d  ='ci' AND objid=
4460: 25 64 22 2c 0a 20 20 20 20 72 69 64 0a 20 20 29  %d",.    rid.  )
4470: 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74  ;.  while( db_st
4480: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
4490: 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OW ){.    const 
44a0: 63 68 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62  char *zDate = db
44b0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
44c0: 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   0);.    const c
44d0: 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 64 62 5f  har *zUser = db_
44e0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
44f0: 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  2);.    const ch
4500: 61 72 20 2a 7a 43 6f 6d 6d 65 6e 74 20 3d 20 64  ar *zComment = d
4510: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
4520: 2c 20 31 29 3b 0a 20 20 20 20 40 20 3c 68 32 3e  , 1);.    @ <h2>
4530: 43 68 65 63 6b 2d 69 6e 20 25 73 28 7a 55 75 69  Check-in %s(zUui
4540: 64 29 3c 2f 68 32 3e 0a 20 20 20 20 40 20 3c 70  d)</h2>.    @ <p
4550: 3e 4d 61 64 65 20 62 79 0a 20 20 20 20 68 79 70  >Made by.    hyp
4560: 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65 72 28 7a  erlink_to_user(z
4570: 55 73 65 72 2c 7a 44 61 74 65 2c 22 20 6f 6e 22  User,zDate," on"
4580: 29 3b 0a 20 20 20 20 68 79 70 65 72 6c 69 6e 6b  );.    hyperlink
4590: 5f 74 6f 5f 64 61 74 65 28 7a 44 61 74 65 2c 20  _to_date(zDate, 
45a0: 22 3a 22 29 3b 0a 20 20 20 20 40 20 25 77 28 7a  ":");.    @ %w(z
45b0: 43 6f 6d 6d 65 6e 74 29 2e 20 3c 61 20 68 72 65  Comment). <a hre
45c0: 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  f="%s(g.zBaseURL
45d0: 29 2f 63 69 2f 25 73 28 7a 55 75 69 64 29 22 3e  )/ci/%s(zUuid)">
45e0: 5b 64 65 74 61 69 6c 73 5d 3c 2f 61 3e 3c 2f 70  [details]</a></p
45f0: 3e 0a 20 20 20 20 40 20 3c 68 72 3e 0a 20 20 7d  >.    @ <hr>.  }
4600: 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26  .  db_finalize(&
4610: 71 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65  q);.  db_prepare
4620: 28 26 71 2c 0a 20 20 20 20 20 22 53 45 4c 45 43  (&q,.     "SELEC
4630: 54 20 70 69 64 2c 20 66 69 64 2c 20 6e 61 6d 65  T pid, fid, name
4640: 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20 6d  ".     "  FROM m
4650: 6c 69 6e 6b 2c 20 66 69 6c 65 6e 61 6d 65 22 0a  link, filename".
4660: 20 20 20 20 20 22 20 57 48 45 52 45 20 6d 6c 69       " WHERE mli
4670: 6e 6b 2e 6d 69 64 3d 25 64 22 0a 20 20 20 20 20  nk.mid=%d".     
4680: 22 20 20 20 41 4e 44 20 66 69 6c 65 6e 61 6d 65  "   AND filename
4690: 2e 66 6e 69 64 3d 6d 6c 69 6e 6b 2e 66 6e 69 64  .fnid=mlink.fnid
46a0: 22 0a 20 20 20 20 20 22 20 4f 52 44 45 52 20 42  ".     " ORDER B
46b0: 59 20 6e 61 6d 65 22 2c 0a 20 20 20 20 20 72 69  Y name",.     ri
46c0: 64 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  d.  );.  while( 
46d0: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c  db_step(&q)==SQL
46e0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
46f0: 6e 74 20 70 69 64 20 3d 20 64 62 5f 63 6f 6c 75  nt pid = db_colu
4700: 6d 6e 5f 69 6e 74 28 26 71 2c 30 29 3b 0a 20 20  mn_int(&q,0);.  
4710: 20 20 69 6e 74 20 66 69 64 20 3d 20 64 62 5f 63    int fid = db_c
4720: 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 31 29 3b  olumn_int(&q,1);
4730: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
4740: 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75  *zName = db_colu
4750: 6d 6e 5f 74 65 78 74 28 26 71 2c 32 29 3b 0a 20  mn_text(&q,2);. 
4760: 20 20 20 40 20 3c 70 3e 3c 61 20 68 72 65 66 3d     @ <p><a href=
4770: 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f  "%s(g.zBaseURL)/
4780: 66 69 6e 66 6f 3f 6e 61 6d 65 3d 25 54 28 7a 4e  finfo?name=%T(zN
4790: 61 6d 65 29 22 3e 25 68 28 7a 4e 61 6d 65 29 3c  ame)">%h(zName)<
47a0: 2f 61 3e 3c 2f 70 3e 0a 20 20 20 20 40 20 3c 62  /a></p>.    @ <b
47b0: 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a  lockquote><pre>.
47c0: 20 20 20 20 61 70 70 65 6e 64 5f 64 69 66 66 28      append_diff(
47d0: 70 69 64 2c 20 66 69 64 29 3b 0a 20 20 20 20 40  pid, fid);.    @
47e0: 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75   </pre></blockqu
47f0: 6f 74 65 3e 0a 20 20 7d 0a 20 20 64 62 5f 66 69  ote>.  }.  db_fi
4800: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 73 74  nalize(&q);.  st
4810: 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a  yle_footer();.}.
4820: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 64  ./*.** Write a d
4830: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 6e  escription of an
4840: 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 77   object to the w
4850: 77 77 20 72 65 70 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ww reply..**.** 
4860: 49 66 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  If the object is
4870: 20 61 20 66 69 6c 65 20 74 68 65 6e 20 6d 65 6e   a file then men
4880: 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tion:.**.**     
4890: 2a 20 49 74 27 73 20 61 72 74 69 66 61 63 74 20  * It's artifact 
48a0: 49 44 0a 2a 2a 20 20 20 20 20 2a 20 41 6c 6c 20  ID.**     * All 
48b0: 69 74 73 20 66 69 6c 65 6e 61 6d 65 73 0a 2a 2a  its filenames.**
48c0: 20 20 20 20 20 2a 20 54 68 65 20 63 68 65 63 6b       * The check
48d0: 2d 69 6e 20 69 74 20 77 61 73 20 70 61 72 74 20  -in it was part 
48e0: 6f 66 2c 20 77 69 74 68 20 74 69 6d 65 73 20 61  of, with times a
48f0: 6e 64 20 75 73 65 72 73 0a 2a 2a 0a 2a 2a 20 49  nd users.**.** I
4900: 66 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  f the object is 
4910: 61 20 6d 61 6e 69 66 65 73 74 2c 20 74 68 65 6e  a manifest, then
4920: 20 6d 65 6e 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20   mention:.**.** 
4930: 20 20 20 20 2a 20 49 74 27 73 20 61 72 74 69 66      * It's artif
4940: 61 63 74 20 49 44 0a 2a 2a 20 20 20 20 20 2a 20  act ID.**     * 
4950: 64 61 74 65 20 6f 66 20 63 68 65 63 6b 2d 69 6e  date of check-in
4960: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 6d 6d 65 6e  .**     * Commen
4970: 74 20 26 20 75 73 65 72 0a 2a 2f 0a 73 74 61 74  t & user.*/.stat
4980: 69 63 20 76 6f 69 64 20 6f 62 6a 65 63 74 5f 64  ic void object_d
4990: 65 73 63 72 69 70 74 69 6f 6e 28 0a 20 20 69 6e  escription(.  in
49a0: 74 20 72 69 64 2c 20 20 20 20 20 20 20 20 20 20  t rid,          
49b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72         /* The ar
49c0: 74 69 66 61 63 74 20 49 44 20 2a 2f 0a 20 20 69  tifact ID */.  i
49d0: 6e 74 20 6c 69 6e 6b 54 6f 56 69 65 77 2c 20 20  nt linkToView,  
49e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 76          /* Add v
49f0: 69 65 77 65 72 20 6c 69 6e 6b 20 69 66 20 74 72  iewer link if tr
4a00: 75 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 44  ue */.  Blob *pD
4a10: 6f 77 6e 6c 6f 61 64 4e 61 6d 65 20 20 20 20 20  ownloadName     
4a20: 20 2f 2a 20 46 69 6c 6c 20 77 69 74 68 20 61 6e   /* Fill with an
4a30: 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 6f 77   appropriate dow
4a40: 6e 6c 6f 61 64 20 6e 61 6d 65 20 2a 2f 0a 29 7b  nload name */.){
4a50: 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74  .  Stmt q;.  int
4a60: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
4a70: 6e 57 69 6b 69 20 3d 20 30 3b 0a 20 20 64 62 5f  nWiki = 0;.  db_
4a80: 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20  prepare(&q,.    
4a90: 22 53 45 4c 45 43 54 20 66 69 6c 65 6e 61 6d 65  "SELECT filename
4aa0: 2e 6e 61 6d 65 2c 20 64 61 74 65 74 69 6d 65 28  .name, datetime(
4ab0: 65 76 65 6e 74 2e 6d 74 69 6d 65 29 2c 22 0a 20  event.mtime),". 
4ac0: 20 20 20 22 20 20 20 20 20 20 20 63 6f 61 6c 65     "       coale
4ad0: 73 63 65 28 65 76 65 6e 74 2e 65 63 6f 6d 6d 65  sce(event.ecomme
4ae0: 6e 74 2c 65 76 65 6e 74 2e 63 6f 6d 6d 65 6e 74  nt,event.comment
4af0: 29 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  ),".    "       
4b00: 63 6f 61 6c 65 73 63 65 28 65 76 65 6e 74 2e 65  coalesce(event.e
4b10: 75 73 65 72 2c 65 76 65 6e 74 2e 75 73 65 72 29  user,event.user)
4b20: 2c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 62  ,".    "       b
4b30: 2e 75 75 69 64 22 0a 20 20 20 20 22 20 20 46 52  .uuid".    "  FR
4b40: 4f 4d 20 6d 6c 69 6e 6b 2c 20 66 69 6c 65 6e 61  OM mlink, filena
4b50: 6d 65 2c 20 65 76 65 6e 74 2c 20 62 6c 6f 62 20  me, event, blob 
4b60: 61 2c 20 62 6c 6f 62 20 62 22 0a 20 20 20 20 22  a, blob b".    "
4b70: 20 57 48 45 52 45 20 66 69 6c 65 6e 61 6d 65 2e   WHERE filename.
4b80: 66 6e 69 64 3d 6d 6c 69 6e 6b 2e 66 6e 69 64 22  fnid=mlink.fnid"
4b90: 0a 20 20 20 20 22 20 20 20 41 4e 44 20 65 76 65  .    "   AND eve
4ba0: 6e 74 2e 6f 62 6a 69 64 3d 6d 6c 69 6e 6b 2e 6d  nt.objid=mlink.m
4bb0: 69 64 22 0a 20 20 20 20 22 20 20 20 41 4e 44 20  id".    "   AND 
4bc0: 61 2e 72 69 64 3d 6d 6c 69 6e 6b 2e 66 69 64 22  a.rid=mlink.fid"
4bd0: 0a 20 20 20 20 22 20 20 20 41 4e 44 20 62 2e 72  .    "   AND b.r
4be0: 69 64 3d 6d 6c 69 6e 6b 2e 6d 69 64 22 0a 20 20  id=mlink.mid".  
4bf0: 20 20 22 20 20 20 41 4e 44 20 6d 6c 69 6e 6b 2e    "   AND mlink.
4c00: 66 69 64 3d 25 64 22 2c 0a 20 20 20 20 72 69 64  fid=%d",.    rid
4c10: 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 64  .  );.  while( d
4c20: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49  b_step(&q)==SQLI
4c30: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f  TE_ROW ){.    co
4c40: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
4c50: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
4c60: 28 26 71 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e  (&q, 0);.    con
4c70: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65 20 3d  st char *zDate =
4c80: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
4c90: 26 71 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73  &q, 1);.    cons
4ca0: 74 20 63 68 61 72 20 2a 7a 43 6f 6d 20 3d 20 64  t char *zCom = d
4cb0: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
4cc0: 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 2);.    const 
4cd0: 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 64 62  char *zUser = db
4ce0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
4cf0: 20 33 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   3);.    const c
4d00: 68 61 72 20 2a 7a 56 65 72 73 20 3d 20 64 62 5f  har *zVers = db_
4d10: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
4d20: 34 29 3b 0a 20 20 20 20 69 66 28 20 63 6e 74 3e  4);.    if( cnt>
4d30: 30 20 29 7b 0a 20 20 20 20 20 20 40 20 41 6c 73  0 ){.      @ Als
4d40: 6f 20 66 69 6c 65 0a 20 20 20 20 7d 65 6c 73 65  o file.    }else
4d50: 7b 0a 20 20 20 20 20 20 40 20 46 69 6c 65 0a 20  {.      @ File. 
4d60: 20 20 20 7d 0a 20 20 20 20 40 20 3c 61 20 68 72     }.    @ <a hr
4d70: 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52  ef="%s(g.zBaseUR
4d80: 4c 29 2f 66 69 6e 66 6f 3f 6e 61 6d 65 3d 25 54  L)/finfo?name=%T
4d90: 28 7a 4e 61 6d 65 29 22 3e 25 68 28 7a 4e 61 6d  (zName)">%h(zNam
4da0: 65 29 3c 2f 61 3e 0a 20 20 20 20 40 20 70 61 72  e)</a>.    @ par
4db0: 74 20 6f 66 20 63 68 65 63 6b 2d 69 6e 0a 20 20  t of check-in.  
4dc0: 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75    hyperlink_to_u
4dd0: 75 69 64 28 7a 56 65 72 73 29 3b 0a 20 20 20 20  uid(zVers);.    
4de0: 40 20 2d 20 25 77 28 7a 43 6f 6d 29 20 62 79 20  @ - %w(zCom) by 
4df0: 0a 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74  .    hyperlink_t
4e00: 6f 5f 75 73 65 72 28 7a 55 73 65 72 2c 7a 44 61  o_user(zUser,zDa
4e10: 74 65 2c 22 20 6f 6e 22 29 3b 0a 20 20 20 20 68  te," on");.    h
4e20: 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65  yperlink_to_date
4e30: 28 7a 44 61 74 65 2c 22 2e 22 29 3b 0a 20 20 20  (zDate,".");.   
4e40: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20   cnt++;.    if( 
4e50: 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 20 26 26  pDownloadName &&
4e60: 20 62 6c 6f 62 5f 73 69 7a 65 28 70 44 6f 77 6e   blob_size(pDown
4e70: 6c 6f 61 64 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  loadName)==0 ){.
4e80: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
4e90: 64 28 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 2c  d(pDownloadName,
4ea0: 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 20   zName, -1);.   
4eb0: 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61   }.  }.  db_fina
4ec0: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 64 62 5f 70  lize(&q);.  db_p
4ed0: 72 65 70 61 72 65 28 26 71 2c 20 0a 20 20 20 20  repare(&q, .    
4ee0: 22 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 74  "SELECT substr(t
4ef0: 61 67 6e 61 6d 65 2c 20 36 2c 20 31 30 30 30 30  agname, 6, 10000
4f00: 29 2c 20 64 61 74 65 74 69 6d 65 28 65 76 65 6e  ), datetime(even
4f10: 74 2e 6d 74 69 6d 65 29 2c 22 0a 20 20 20 20 22  t.mtime),".    "
4f20: 20 20 20 20 20 20 20 63 6f 61 6c 65 73 63 65 28         coalesce(
4f30: 65 76 65 6e 74 2e 65 75 73 65 72 2c 20 65 76 65  event.euser, eve
4f40: 6e 74 2e 75 73 65 72 29 22 0a 20 20 20 20 22 20  nt.user)".    " 
4f50: 20 46 52 4f 4d 20 74 61 67 78 72 65 66 2c 20 74   FROM tagxref, t
4f60: 61 67 2c 20 65 76 65 6e 74 22 0a 20 20 20 20 22  ag, event".    "
4f70: 20 57 48 45 52 45 20 74 61 67 78 72 65 66 2e 72   WHERE tagxref.r
4f80: 69 64 3d 25 64 22 0a 20 20 20 20 22 20 20 20 41  id=%d".    "   A
4f90: 4e 44 20 74 61 67 2e 74 61 67 69 64 3d 74 61 67  ND tag.tagid=tag
4fa0: 78 72 65 66 2e 74 61 67 69 64 22 20 0a 20 20 20  xref.tagid" .   
4fb0: 20 22 20 20 20 41 4e 44 20 74 61 67 2e 74 61 67   "   AND tag.tag
4fc0: 6e 61 6d 65 20 4c 49 4b 45 20 27 77 69 6b 69 2d  name LIKE 'wiki-
4fd0: 25 25 27 22 0a 20 20 20 20 22 20 20 20 41 4e 44  %%'".    "   AND
4fe0: 20 65 76 65 6e 74 2e 6f 62 6a 69 64 3d 74 61 67   event.objid=tag
4ff0: 78 72 65 66 2e 72 69 64 22 2c 0a 20 20 20 20 72  xref.rid",.    r
5000: 69 64 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  id.  );.  while(
5010: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
5020: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
5030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 67  const char *zPag
5040: 65 6e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d  ename = db_colum
5050: 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20  n_text(&q, 0);. 
5060: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5070: 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  Date = db_column
5080: 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a 20 20  _text(&q, 1);.  
5090: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
50a0: 73 65 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ser = db_column_
50b0: 74 65 78 74 28 26 71 2c 20 32 29 3b 0a 20 20 20  text(&q, 2);.   
50c0: 20 69 66 28 20 63 6e 74 3e 30 20 29 7b 0a 20 20   if( cnt>0 ){.  
50d0: 20 20 20 20 40 20 41 6c 73 6f 20 77 69 6b 69 20      @ Also wiki 
50e0: 70 61 67 65 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  page.    }else{.
50f0: 20 20 20 20 20 20 40 20 57 69 6b 69 20 70 61 67        @ Wiki pag
5100: 65 0a 20 20 20 20 7d 0a 20 20 20 20 40 20 5b 3c  e.    }.    @ [<
5110: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
5120: 73 65 55 52 4c 29 2f 77 69 6b 69 3f 6e 61 6d 65  seURL)/wiki?name
5130: 3d 25 74 28 7a 50 61 67 65 6e 61 6d 65 29 22 3e  =%t(zPagename)">
5140: 25 68 28 7a 50 61 67 65 6e 61 6d 65 29 3c 2f 61  %h(zPagename)</a
5150: 3e 5d 0a 20 20 20 20 40 20 62 79 0a 20 20 20 20  >].    @ by.    
5160: 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65  hyperlink_to_use
5170: 72 28 7a 55 73 65 72 2c 7a 44 61 74 65 2c 22 20  r(zUser,zDate," 
5180: 6f 6e 22 29 3b 0a 20 20 20 20 68 79 70 65 72 6c  on");.    hyperl
5190: 69 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a 44 61 74  ink_to_date(zDat
51a0: 65 2c 22 2e 22 29 3b 0a 20 20 20 20 6e 57 69 6b  e,".");.    nWik
51b0: 69 2b 2b 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a  i++;.    cnt++;.
51c0: 20 20 20 20 69 66 28 20 70 44 6f 77 6e 6c 6f 61      if( pDownloa
51d0: 64 4e 61 6d 65 20 26 26 20 62 6c 6f 62 5f 73 69  dName && blob_si
51e0: 7a 65 28 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65  ze(pDownloadName
51f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 6c  )==0 ){.      bl
5200: 6f 62 5f 61 70 70 65 6e 64 28 70 44 6f 77 6e 6c  ob_append(pDownl
5210: 6f 61 64 4e 61 6d 65 2c 20 7a 50 61 67 65 6e 61  oadName, zPagena
5220: 6d 65 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  me, -1);.    }. 
5230: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65   }.  db_finalize
5240: 28 26 71 29 3b 0a 20 20 69 66 28 20 6e 57 69 6b  (&q);.  if( nWik
5250: 69 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 5f 70  i==0 ){.    db_p
5260: 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20 20 20  repare(&q,.     
5270: 20 22 53 45 4c 45 43 54 20 64 61 74 65 74 69 6d   "SELECT datetim
5280: 65 28 6d 74 69 6d 65 29 2c 20 75 73 65 72 2c 20  e(mtime), user, 
5290: 63 6f 6d 6d 65 6e 74 2c 20 74 79 70 65 2c 20 75  comment, type, u
52a0: 75 69 64 22 0a 20 20 20 20 20 20 22 20 20 46 52  uid".      "  FR
52b0: 4f 4d 20 65 76 65 6e 74 2c 20 62 6c 6f 62 22 0a  OM event, blob".
52c0: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 65 76        " WHERE ev
52d0: 65 6e 74 2e 6f 62 6a 69 64 3d 25 64 22 0a 20 20  ent.objid=%d".  
52e0: 20 20 20 20 22 20 20 20 41 4e 44 20 62 6c 6f 62      "   AND blob
52f0: 2e 72 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20  .rid=%d",.      
5300: 72 69 64 2c 20 72 69 64 0a 20 20 20 20 29 3b 0a  rid, rid.    );.
5310: 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74      while( db_st
5320: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
5330: 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  OW ){.      cons
5340: 74 20 63 68 61 72 20 2a 7a 44 61 74 65 20 3d 20  t char *zDate = 
5350: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
5360: 71 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e  q, 0);.      con
5370: 73 74 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d  st char *zUser =
5380: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
5390: 26 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f  &q, 1);.      co
53a0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 20 3d  nst char *zCom =
53b0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
53c0: 26 71 2c 20 32 29 3b 0a 20 20 20 20 20 20 63 6f  &q, 2);.      co
53d0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
53e0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
53f0: 28 26 71 2c 20 33 29 3b 0a 20 20 20 20 20 20 63  (&q, 3);.      c
5400: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64  onst char *zUuid
5410: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78   = db_column_tex
5420: 74 28 26 71 2c 20 34 29 3b 0a 20 20 20 20 20 20  t(&q, 4);.      
5430: 69 66 28 20 63 6e 74 3e 30 20 29 7b 0a 20 20 20  if( cnt>0 ){.   
5440: 20 20 20 20 20 40 20 41 6c 73 6f 0a 20 20 20 20       @ Also.    
5450: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 54    }.      if( zT
5460: 79 70 65 5b 30 5d 3d 3d 27 77 27 20 29 7b 0a 20  ype[0]=='w' ){. 
5470: 20 20 20 20 20 20 20 40 20 57 69 6b 69 20 65 64         @ Wiki ed
5480: 69 74 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  it.      }else i
5490: 66 28 20 7a 54 79 70 65 5b 30 5d 3d 3d 27 74 27  f( zType[0]=='t'
54a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20 54 69   ){.        @ Ti
54b0: 63 6b 65 74 20 63 68 61 6e 67 65 0a 20 20 20 20  cket change.    
54c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 79 70    }else if( zTyp
54d0: 65 5b 30 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20  e[0]=='c' ){.   
54e0: 20 20 20 20 20 40 20 4d 61 6e 69 66 65 73 74 20       @ Manifest 
54f0: 6f 66 20 63 68 65 63 6b 2d 69 6e 0a 20 20 20 20  of check-in.    
5500: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5510: 20 40 20 43 6f 6e 74 72 6f 6c 20 66 69 6c 65 20   @ Control file 
5520: 72 65 66 65 72 65 6e 63 69 6e 67 0a 20 20 20 20  referencing.    
5530: 20 20 7d 0a 20 20 20 20 20 20 68 79 70 65 72 6c    }.      hyperl
5540: 69 6e 6b 5f 74 6f 5f 75 75 69 64 28 7a 55 75 69  ink_to_uuid(zUui
5550: 64 29 3b 0a 20 20 20 20 20 20 40 20 2d 20 25 77  d);.      @ - %w
5560: 28 7a 43 6f 6d 29 20 62 79 0a 20 20 20 20 20 20  (zCom) by.      
5570: 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65  hyperlink_to_use
5580: 72 28 7a 55 73 65 72 2c 7a 44 61 74 65 2c 22 20  r(zUser,zDate," 
5590: 6f 6e 22 29 3b 0a 20 20 20 20 20 20 68 79 70 65  on");.      hype
55a0: 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a 44  rlink_to_date(zD
55b0: 61 74 65 2c 20 22 2e 22 29 3b 0a 20 20 20 20 20  ate, ".");.     
55c0: 20 69 66 28 20 70 44 6f 77 6e 6c 6f 61 64 4e 61   if( pDownloadNa
55d0: 6d 65 20 26 26 20 62 6c 6f 62 5f 73 69 7a 65 28  me && blob_size(
55e0: 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29 3d 3d  pDownloadName)==
55f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f  0 ){.        blo
5600: 62 5f 61 70 70 65 6e 64 28 70 44 6f 77 6e 6c 6f  b_append(pDownlo
5610: 61 64 4e 61 6d 65 2c 20 7a 55 75 69 64 2c 20 2d  adName, zUuid, -
5620: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
5630: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20    cnt++;.    }. 
5640: 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26     db_finalize(&
5650: 71 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6e  q);.  }.  if( cn
5660: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  t==0 ){.    char
5670: 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f 74 65 78   *zUuid = db_tex
5680: 74 28 30 2c 20 22 53 45 4c 45 43 54 20 75 75 69  t(0, "SELECT uui
5690: 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52  d FROM blob WHER
56a0: 45 20 72 69 64 3d 25 64 22 2c 20 72 69 64 29 3b  E rid=%d", rid);
56b0: 0a 20 20 20 20 40 20 43 6f 6e 74 72 6f 6c 20 61  .    @ Control a
56c0: 72 74 69 66 61 63 74 2e 0a 20 20 20 20 69 66 28  rtifact..    if(
56d0: 20 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 20 26   pDownloadName &
56e0: 26 20 62 6c 6f 62 5f 73 69 7a 65 28 70 44 6f 77  & blob_size(pDow
56f0: 6e 6c 6f 61 64 4e 61 6d 65 29 3d 3d 30 20 29 7b  nloadName)==0 ){
5700: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
5710: 6e 64 28 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65  nd(pDownloadName
5720: 2c 20 7a 55 75 69 64 2c 20 2d 31 29 3b 0a 20 20  , zUuid, -1);.  
5730: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
5740: 6c 69 6e 6b 54 6f 56 69 65 77 20 29 7b 0a 20 20  linkToView ){.  
5750: 20 20 40 20 3c 61 20 68 72 65 66 3d 22 25 73 28    @ <a href="%s(
5760: 67 2e 7a 42 61 73 65 55 52 4c 29 2f 61 72 74 69  g.zBaseURL)/arti
5770: 66 61 63 74 2f 25 64 28 72 69 64 29 22 3e 5b 76  fact/%d(rid)">[v
5780: 69 65 77 5d 3c 2f 61 3e 0a 20 20 7d 0a 7d 0a 0a  iew]</a>.  }.}..
5790: 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45 3a 20  ./*.** WEBPAGE: 
57a0: 66 64 69 66 66 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  fdiff.**.** Two 
57b0: 61 72 67 75 6d 65 6e 74 73 2c 20 76 31 20 61 6e  arguments, v1 an
57c0: 64 20 76 32 2c 20 61 72 65 20 69 6e 74 65 67 65  d v2, are intege
57d0: 72 73 2e 20 20 53 68 6f 77 20 74 68 65 20 64 69  rs.  Show the di
57e0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
57f0: 0a 2a 2a 20 74 68 65 20 74 77 6f 20 72 65 63 6f  .** the two reco
5800: 72 64 73 2e 0a 2a 2f 0a 76 6f 69 64 20 64 69 66  rds..*/.void dif
5810: 66 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20  f_page(void){.  
5820: 69 6e 74 20 76 31 20 3d 20 6e 61 6d 65 5f 74 6f  int v1 = name_to
5830: 5f 72 69 64 28 50 44 28 22 76 31 22 2c 22 30 22  _rid(PD("v1","0"
5840: 29 29 3b 0a 20 20 69 6e 74 20 76 32 20 3d 20 6e  ));.  int v2 = n
5850: 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44 28 22 76  ame_to_rid(PD("v
5860: 32 22 2c 22 30 22 29 29 3b 0a 20 20 42 6c 6f 62  2","0"));.  Blob
5870: 20 63 31 2c 20 63 32 2c 20 64 69 66 66 3b 0a 0a   c1, c2, diff;..
5880: 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72    login_check_cr
5890: 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69  edentials();.  i
58a0: 66 28 20 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20  f( !g.okRead ){ 
58b0: 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20  login_needed(); 
58c0: 72 65 74 75 72 6e 3b 20 7d 0a 20 20 73 74 79 6c  return; }.  styl
58d0: 65 5f 68 65 61 64 65 72 28 22 44 69 66 66 22 29  e_header("Diff")
58e0: 3b 0a 20 20 40 20 3c 68 32 3e 44 69 66 66 65 72  ;.  @ <h2>Differ
58f0: 65 6e 63 65 73 20 46 72 6f 6d 3a 3c 2f 68 32 3e  ences From:</h2>
5900: 0a 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65  .  @ <blockquote
5910: 3e 0a 20 20 6f 62 6a 65 63 74 5f 64 65 73 63 72  >.  object_descr
5920: 69 70 74 69 6f 6e 28 76 31 2c 20 31 2c 20 30 29  iption(v1, 1, 0)
5930: 3b 0a 20 20 40 20 3c 2f 62 6c 6f 63 6b 71 75 6f  ;.  @ </blockquo
5940: 74 65 3e 0a 20 20 40 20 3c 68 32 3e 54 6f 3a 3c  te>.  @ <h2>To:<
5950: 2f 68 32 3e 0a 20 20 40 20 3c 62 6c 6f 63 6b 71  /h2>.  @ <blockq
5960: 75 6f 74 65 3e 0a 20 20 6f 62 6a 65 63 74 5f 64  uote>.  object_d
5970: 65 73 63 72 69 70 74 69 6f 6e 28 76 32 2c 20 31  escription(v2, 1
5980: 2c 20 30 29 3b 0a 20 20 40 20 3c 2f 62 6c 6f 63  , 0);.  @ </bloc
5990: 6b 71 75 6f 74 65 3e 0a 20 20 40 20 3c 68 72 3e  kquote>.  @ <hr>
59a0: 0a 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65  .  @ <blockquote
59b0: 3e 3c 70 72 65 3e 0a 20 20 63 6f 6e 74 65 6e 74  ><pre>.  content
59c0: 5f 67 65 74 28 76 31 2c 20 26 63 31 29 3b 0a 20  _get(v1, &c1);. 
59d0: 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 76 32 2c   content_get(v2,
59e0: 20 26 63 32 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65   &c2);.  blob_ze
59f0: 72 6f 28 26 64 69 66 66 29 3b 0a 20 20 74 65 78  ro(&diff);.  tex
5a00: 74 5f 64 69 66 66 28 26 63 31 2c 20 26 63 32 2c  t_diff(&c1, &c2,
5a10: 20 26 64 69 66 66 2c 20 34 29 3b 0a 20 20 62 6c   &diff, 4);.  bl
5a20: 6f 62 5f 72 65 73 65 74 28 26 63 31 29 3b 0a 20  ob_reset(&c1);. 
5a30: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 32 29   blob_reset(&c2)
5a40: 3b 0a 20 20 40 20 25 68 28 62 6c 6f 62 5f 73 74  ;.  @ %h(blob_st
5a50: 72 28 26 64 69 66 66 29 29 0a 20 20 40 20 3c 2f  r(&diff)).  @ </
5a60: 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65  pre></blockquote
5a70: 3e 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26  >.  blob_reset(&
5a80: 64 69 66 66 29 3b 0a 20 20 73 74 79 6c 65 5f 66  diff);.  style_f
5a90: 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ooter();.}../*.*
5aa0: 2a 20 57 45 42 50 41 47 45 3a 20 72 61 77 0a 2a  * WEBPAGE: raw.*
5ab0: 2a 20 55 52 4c 3a 20 2f 72 61 77 3f 6e 61 6d 65  * URL: /raw?name
5ac0: 3d 41 52 54 49 46 41 43 54 49 44 26 6d 3d 54 59  =ARTIFACTID&m=TY
5ad0: 50 45 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e  PE.** .** Return
5ae0: 20 74 68 65 20 75 6e 69 6e 74 65 72 70 72 65 74   the uninterpret
5af0: 65 64 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  ed content of an
5b00: 20 61 72 74 69 66 61 63 74 2e 20 20 55 73 65 64   artifact.  Used
5b10: 20 70 72 69 6d 61 72 69 6c 79 0a 2a 2a 20 74 6f   primarily.** to
5b20: 20 76 69 65 77 20 61 72 74 69 66 61 63 74 73 20   view artifacts 
5b30: 74 68 61 74 20 61 72 65 20 69 6d 61 67 65 73 2e  that are images.
5b40: 0a 2a 2f 0a 76 6f 69 64 20 72 61 77 61 72 74 69  .*/.void rawarti
5b50: 66 61 63 74 5f 70 61 67 65 28 76 6f 69 64 29 7b  fact_page(void){
5b60: 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 63 6f  .  int rid;.  co
5b70: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65 3b  nst char *zMime;
5b80: 0a 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b  .  Blob content;
5b90: 0a 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74  ..  rid = name_t
5ba0: 6f 5f 72 69 64 28 50 44 28 22 6e 61 6d 65 22 2c  o_rid(PD("name",
5bb0: 22 30 22 29 29 3b 0a 20 20 7a 4d 69 6d 65 20 3d  "0"));.  zMime =
5bc0: 20 50 44 28 22 6d 22 2c 22 61 70 70 6c 69 63 61   PD("m","applica
5bd0: 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d 61 72  tion/x-fossil-ar
5be0: 74 69 66 61 63 74 22 29 3b 0a 20 20 6c 6f 67 69  tifact");.  logi
5bf0: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69  n_check_credenti
5c00: 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e  als();.  if( !g.
5c10: 6f 6b 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f  okRead ){ login_
5c20: 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e  needed(); return
5c30: 3b 20 7d 0a 20 20 69 66 28 20 72 69 64 3d 3d 30  ; }.  if( rid==0
5c40: 20 29 7b 20 63 67 69 5f 72 65 64 69 72 65 63 74   ){ cgi_redirect
5c50: 28 22 2f 68 6f 6d 65 22 29 3b 20 7d 0a 20 20 63  ("/home"); }.  c
5c60: 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69 64 2c 20  ontent_get(rid, 
5c70: 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 63 67 69  &content);.  cgi
5c80: 5f 73 65 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70  _set_content_typ
5c90: 65 28 7a 4d 69 6d 65 29 3b 0a 20 20 63 67 69 5f  e(zMime);.  cgi_
5ca0: 73 65 74 5f 63 6f 6e 74 65 6e 74 28 26 63 6f 6e  set_content(&con
5cb0: 74 65 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tent);.}../*.** 
5cc0: 52 65 6e 64 65 72 20 61 20 68 65 78 20 64 75 6d  Render a hex dum
5cd0: 70 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  p of a file..*/.
5ce0: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 64  static void hexd
5cf0: 75 6d 70 28 42 6c 6f 62 20 2a 70 42 6c 6f 62 29  ump(Blob *pBlob)
5d00: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
5d10: 65 64 20 63 68 61 72 20 2a 78 3b 0a 20 20 69 6e  ed char *x;.  in
5d20: 74 20 6e 2c 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20  t n, i, j, k;.  
5d30: 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 5d 3b  char zLine[100];
5d40: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
5d50: 63 68 61 72 20 7a 48 65 78 5b 5d 20 3d 20 22 30  char zHex[] = "0
5d60: 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22  123456789abcdef"
5d70: 3b 0a 0a 20 20 78 20 3d 20 28 63 6f 6e 73 74 20  ;..  x = (const 
5d80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 62  unsigned char*)b
5d90: 6c 6f 62 5f 62 75 66 66 65 72 28 70 42 6c 6f 62  lob_buffer(pBlob
5da0: 29 3b 0a 20 20 6e 20 3d 20 62 6c 6f 62 5f 73 69  );.  n = blob_si
5db0: 7a 65 28 70 42 6c 6f 62 29 3b 0a 20 20 66 6f 72  ze(pBlob);.  for
5dc0: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 3d 31 36  (i=0; i<n; i+=16
5dd0: 29 7b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  ){.    j = 0;.  
5de0: 20 20 7a 4c 69 6e 65 5b 30 5d 20 3d 20 7a 48 65    zLine[0] = zHe
5df0: 78 5b 28 69 3e 3e 32 34 29 26 30 78 66 5d 3b 0a  x[(i>>24)&0xf];.
5e00: 20 20 20 20 7a 4c 69 6e 65 5b 31 5d 20 3d 20 7a      zLine[1] = z
5e10: 48 65 78 5b 28 69 3e 3e 31 36 29 26 30 78 66 5d  Hex[(i>>16)&0xf]
5e20: 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b 32 5d 20 3d  ;.    zLine[2] =
5e30: 20 7a 48 65 78 5b 28 69 3e 3e 38 29 26 30 78 66   zHex[(i>>8)&0xf
5e40: 5d 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b 33 5d 20  ];.    zLine[3] 
5e50: 3d 20 7a 48 65 78 5b 69 26 30 78 66 5d 3b 0a 20  = zHex[i&0xf];. 
5e60: 20 20 20 7a 4c 69 6e 65 5b 34 5d 20 3d 20 27 3a     zLine[4] = ':
5e70: 27 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ';.    sprintf(z
5e80: 4c 69 6e 65 2c 20 22 25 30 34 78 3a 20 22 2c 20  Line, "%04x: ", 
5e90: 69 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  i);.    for(j=0;
5ea0: 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20 20   j<16; j++){.   
5eb0: 20 20 20 6b 20 3d 20 35 2b 6a 2a 33 3b 0a 20 20     k = 5+j*3;.  
5ec0: 20 20 20 20 7a 4c 69 6e 65 5b 6b 5d 20 3d 20 27      zLine[k] = '
5ed0: 20 27 3b 0a 20 20 20 20 20 20 69 66 28 20 69 2b   ';.      if( i+
5ee0: 6a 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75  j<n ){.        u
5ef0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d  nsigned char c =
5f00: 20 78 5b 69 2b 6a 5d 3b 0a 20 20 20 20 20 20 20   x[i+j];.       
5f10: 20 7a 4c 69 6e 65 5b 6b 2b 31 5d 20 3d 20 7a 48   zLine[k+1] = zH
5f20: 65 78 5b 63 3e 3e 34 5d 3b 0a 20 20 20 20 20 20  ex[c>>4];.      
5f30: 20 20 7a 4c 69 6e 65 5b 6b 2b 32 5d 20 3d 20 7a    zLine[k+2] = z
5f40: 48 65 78 5b 63 26 30 78 66 5d 3b 0a 20 20 20 20  Hex[c&0xf];.    
5f50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5f60: 20 7a 4c 69 6e 65 5b 6b 2b 31 5d 20 3d 20 27 20   zLine[k+1] = ' 
5f70: 27 3b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65  ';.        zLine
5f80: 5b 6b 2b 32 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [k+2] = ' ';.   
5f90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
5fa0: 4c 69 6e 65 5b 35 33 5d 20 3d 20 27 20 27 3b 0a  Line[53] = ' ';.
5fb0: 20 20 20 20 7a 4c 69 6e 65 5b 35 34 5d 20 3d 20      zLine[54] = 
5fc0: 27 20 27 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  ' ';.    for(j=0
5fd0: 3b 20 6a 3c 31 36 3b 20 6a 2b 2b 29 7b 0a 20 20  ; j<16; j++){.  
5fe0: 20 20 20 20 6b 20 3d 20 6a 2b 35 35 3b 0a 20 20      k = j+55;.  
5ff0: 20 20 20 20 69 66 28 20 69 2b 6a 3c 6e 20 29 7b      if( i+j<n ){
6000: 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
6010: 64 20 63 68 61 72 20 63 20 3d 20 78 5b 69 2b 6a  d char c = x[i+j
6020: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ];.        if( c
6030: 3e 3d 30 78 32 30 20 26 26 20 63 3c 3d 30 78 37  >=0x20 && c<=0x7
6040: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  e ){.          z
6050: 4c 69 6e 65 5b 6b 5d 20 3d 20 63 3b 0a 20 20 20  Line[k] = c;.   
6060: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6070: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b 5d 20 3d        zLine[k] =
6080: 20 27 2e 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   '.';.        }.
6090: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
60a0: 20 20 20 20 20 7a 4c 69 6e 65 5b 6b 5d 20 3d 20       zLine[k] = 
60b0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
60c0: 0a 20 20 20 20 7a 4c 69 6e 65 5b 37 31 5d 20 3d  .    zLine[71] =
60d0: 20 30 3b 0a 20 20 20 20 40 20 25 68 28 7a 4c 69   0;.    @ %h(zLi
60e0: 6e 65 29 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ne).  }.}../*.**
60f0: 20 57 45 42 50 41 47 45 3a 20 68 65 78 64 75 6d   WEBPAGE: hexdum
6100: 70 0a 2a 2a 20 55 52 4c 3a 20 2f 68 65 78 64 75  p.** URL: /hexdu
6110: 6d 70 3f 6e 61 6d 65 3d 41 52 54 49 46 41 43 54  mp?name=ARTIFACT
6120: 49 44 0a 2a 2a 20 0a 2a 2a 20 53 68 6f 77 20 74  ID.** .** Show t
6130: 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
6140: 65 6e 74 20 6f 66 20 61 20 66 69 6c 65 20 69 64  ent of a file id
6150: 65 6e 74 69 66 69 65 64 20 62 79 20 41 52 54 49  entified by ARTI
6160: 46 41 43 54 49 44 0a 2a 2a 20 61 73 20 70 72 65  FACTID.** as pre
6170: 66 6f 72 6d 61 74 74 65 64 20 74 65 78 74 2e 0a  formatted text..
6180: 2a 2f 0a 76 6f 69 64 20 68 65 78 64 75 6d 70 5f  */.void hexdump_
6190: 70 61 67 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e  page(void){.  in
61a0: 74 20 72 69 64 3b 0a 20 20 42 6c 6f 62 20 63 6f  t rid;.  Blob co
61b0: 6e 74 65 6e 74 3b 0a 20 20 42 6c 6f 62 20 64 6f  ntent;.  Blob do
61c0: 77 6e 6c 6f 61 64 4e 61 6d 65 3b 0a 20 20 63 68  wnloadName;.  ch
61d0: 61 72 20 2a 7a 55 75 69 64 3b 0a 0a 20 20 72 69  ar *zUuid;..  ri
61e0: 64 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 28  d = name_to_rid(
61f0: 50 44 28 22 6e 61 6d 65 22 2c 22 30 22 29 29 3b  PD("name","0"));
6200: 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63  .  login_check_c
6210: 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20  redentials();.  
6220: 69 66 28 20 21 67 2e 6f 6b 52 65 61 64 20 29 7b  if( !g.okRead ){
6230: 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b   login_needed();
6240: 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 69 66 28   return; }.  if(
6250: 20 72 69 64 3d 3d 30 20 29 7b 20 63 67 69 5f 72   rid==0 ){ cgi_r
6260: 65 64 69 72 65 63 74 28 22 2f 68 6f 6d 65 22 29  edirect("/home")
6270: 3b 20 7d 0a 20 20 69 66 28 20 67 2e 6f 6b 41 64  ; }.  if( g.okAd
6280: 6d 69 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  min ){.    const
6290: 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64   char *zUuid = d
62a0: 62 5f 74 65 78 74 28 22 22 2c 20 22 53 45 4c 45  b_text("", "SELE
62b0: 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f  CT uuid FROM blo
62c0: 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c  b WHERE rid=%d",
62d0: 20 72 69 64 29 3b 0a 20 20 20 20 69 66 28 20 64   rid);.    if( d
62e0: 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54  b_exists("SELECT
62f0: 20 31 20 46 52 4f 4d 20 73 68 75 6e 20 57 48 45   1 FROM shun WHE
6300: 52 45 20 75 75 69 64 3d 27 25 73 27 22 2c 20 7a  RE uuid='%s'", z
6310: 55 75 69 64 29 20 29 7b 0a 20 20 20 20 20 20 73  Uuid) ){.      s
6320: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65  tyle_submenu_ele
6330: 6d 65 6e 74 28 22 55 6e 73 68 75 6e 22 2c 22 55  ment("Unshun","U
6340: 6e 73 68 75 6e 22 2c 20 22 25 73 2f 73 68 75 6e  nshun", "%s/shun
6350: 3f 75 75 69 64 3d 25 73 26 73 75 62 3d 31 22 2c  ?uuid=%s&sub=1",
6360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a  .            g.z
6370: 54 6f 70 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20  Top, zUuid);.   
6380: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
6390: 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d  yle_submenu_elem
63a0: 65 6e 74 28 22 53 68 75 6e 22 2c 22 53 68 75 6e  ent("Shun","Shun
63b0: 22 2c 20 22 25 73 2f 73 68 75 6e 3f 73 68 75 6e  ", "%s/shun?shun
63c0: 3d 25 73 23 61 64 64 73 68 75 6e 22 2c 0a 20 20  =%s#addshun",.  
63d0: 20 20 20 20 20 20 20 20 20 20 67 2e 7a 54 6f 70            g.zTop
63e0: 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 7d 0a  , zUuid);.    }.
63f0: 20 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61 64    }.  style_head
6400: 65 72 28 22 48 65 78 20 41 72 74 69 66 61 63 74  er("Hex Artifact
6410: 20 43 6f 6e 74 65 6e 74 22 29 3b 0a 20 20 7a 55   Content");.  zU
6420: 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 22 3f  uid = db_text("?
6430: 22 2c 22 53 45 4c 45 43 54 20 75 75 69 64 20 46  ","SELECT uuid F
6440: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72  ROM blob WHERE r
6450: 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20  id=%d", rid);.  
6460: 40 20 3c 68 32 3e 41 72 74 69 66 61 63 74 20 25  @ <h2>Artifact %
6470: 73 28 7a 55 75 69 64 29 3a 3c 2f 68 32 3e 0a 20  s(zUuid):</h2>. 
6480: 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a   @ <blockquote>.
6490: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 64 6f 77    blob_zero(&dow
64a0: 6e 6c 6f 61 64 4e 61 6d 65 29 3b 0a 20 20 6f 62  nloadName);.  ob
64b0: 6a 65 63 74 5f 64 65 73 63 72 69 70 74 69 6f 6e  ject_description
64c0: 28 72 69 64 2c 20 30 2c 20 26 64 6f 77 6e 6c 6f  (rid, 0, &downlo
64d0: 61 64 4e 61 6d 65 29 3b 0a 20 20 73 74 79 6c 65  adName);.  style
64e0: 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74  _submenu_element
64f0: 28 22 44 6f 77 6e 6c 6f 61 64 22 2c 20 22 44 6f  ("Download", "Do
6500: 77 6e 6c 6f 61 64 22 2c 20 0a 20 20 20 20 20 20  wnload", .      
6510: 20 20 22 25 73 2f 72 61 77 2f 25 54 3f 6e 61 6d    "%s/raw/%T?nam
6520: 65 3d 25 64 22 2c 20 67 2e 7a 42 61 73 65 55 52  e=%d", g.zBaseUR
6530: 4c 2c 20 62 6c 6f 62 5f 73 74 72 28 26 64 6f 77  L, blob_str(&dow
6540: 6e 6c 6f 61 64 4e 61 6d 65 29 2c 20 72 69 64 29  nloadName), rid)
6550: 3b 0a 20 20 40 20 3c 2f 62 6c 6f 63 6b 71 75 6f  ;.  @ </blockquo
6560: 74 65 3e 0a 20 20 40 20 3c 68 72 3e 0a 20 20 63  te>.  @ <hr>.  c
6570: 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69 64 2c 20  ontent_get(rid, 
6580: 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 40 20 3c  &content);.  @ <
6590: 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e  blockquote><pre>
65a0: 0a 20 20 68 65 78 64 75 6d 70 28 26 63 6f 6e 74  .  hexdump(&cont
65b0: 65 6e 74 29 3b 0a 20 20 40 20 3c 2f 70 72 65 3e  ent);.  @ </pre>
65c0: 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20  </blockquote>.  
65d0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
65e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45  }../*.** WEBPAGE
65f0: 3a 20 61 72 74 69 66 61 63 74 0a 2a 2a 20 55 52  : artifact.** UR
6600: 4c 3a 20 2f 61 72 74 69 66 61 63 74 3f 6e 61 6d  L: /artifact?nam
6610: 65 3d 41 52 54 49 46 41 43 54 49 44 0a 2a 2a 20  e=ARTIFACTID.** 
6620: 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20 63 6f 6d  .** Show the com
6630: 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
6640: 20 61 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69   a file identifi
6650: 65 64 20 62 79 20 41 52 54 49 46 41 43 54 49 44  ed by ARTIFACTID
6660: 0a 2a 2a 20 61 73 20 70 72 65 66 6f 72 6d 61 74  .** as preformat
6670: 74 65 64 20 74 65 78 74 2e 0a 2a 2f 0a 76 6f 69  ted text..*/.voi
6680: 64 20 61 72 74 69 66 61 63 74 5f 70 61 67 65 28  d artifact_page(
6690: 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72 69 64  void){.  int rid
66a0: 3b 0a 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74  ;.  Blob content
66b0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
66c0: 7a 4d 69 6d 65 3b 0a 20 20 42 6c 6f 62 20 64 6f  zMime;.  Blob do
66d0: 77 6e 6c 6f 61 64 4e 61 6d 65 3b 0a 20 20 69 6e  wnloadName;.  in
66e0: 74 20 72 65 6e 64 65 72 41 73 57 69 6b 69 20 3d  t renderAsWiki =
66f0: 20 30 3b 0a 20 20 69 6e 74 20 72 65 6e 64 65 72   0;.  int render
6700: 41 73 48 74 6d 6c 20 3d 20 30 3b 0a 20 20 63 6f  AsHtml = 0;.  co
6710: 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69 64 3b  nst char *zUuid;
6720: 0a 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f 74  ..  rid = name_t
6730: 6f 5f 72 69 64 28 50 44 28 22 6e 61 6d 65 22 2c  o_rid(PD("name",
6740: 22 30 22 29 29 3b 0a 20 20 6c 6f 67 69 6e 5f 63  "0"));.  login_c
6750: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
6760: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52  ();.  if( !g.okR
6770: 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65  ead ){ login_nee
6780: 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d  ded(); return; }
6790: 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20 29 7b  .  if( rid==0 ){
67a0: 20 63 67 69 5f 72 65 64 69 72 65 63 74 28 22 2f   cgi_redirect("/
67b0: 68 6f 6d 65 22 29 3b 20 7d 0a 20 20 69 66 28 20  home"); }.  if( 
67c0: 67 2e 6f 6b 41 64 6d 69 6e 20 29 7b 0a 20 20 20  g.okAdmin ){.   
67d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75   const char *zUu
67e0: 69 64 20 3d 20 64 62 5f 74 65 78 74 28 22 22 2c  id = db_text("",
67f0: 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52   "SELECT uuid FR
6800: 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69  OM blob WHERE ri
6810: 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 20  d=%d", rid);.   
6820: 20 69 66 28 20 64 62 5f 65 78 69 73 74 73 28 22   if( db_exists("
6830: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 73 68  SELECT 1 FROM sh
6840: 75 6e 20 57 48 45 52 45 20 75 75 69 64 3d 27 25  un WHERE uuid='%
6850: 73 27 22 2c 20 7a 55 75 69 64 29 20 29 7b 0a 20  s'", zUuid) ){. 
6860: 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65       style_subme
6870: 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 55 6e 73 68  nu_element("Unsh
6880: 75 6e 22 2c 22 55 6e 73 68 75 6e 22 2c 20 22 25  un","Unshun", "%
6890: 73 2f 73 68 75 6e 3f 75 75 69 64 3d 25 73 26 73  s/shun?uuid=%s&s
68a0: 75 62 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20  ub=1",.         
68b0: 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 55 75 69 64     g.zTop, zUuid
68c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
68d0: 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e      style_submen
68e0: 75 5f 65 6c 65 6d 65 6e 74 28 22 53 68 75 6e 22  u_element("Shun"
68f0: 2c 22 53 68 75 6e 22 2c 20 22 25 73 2f 73 68 75  ,"Shun", "%s/shu
6900: 6e 3f 73 68 75 6e 3d 25 73 23 61 64 64 73 68 75  n?shun=%s#addshu
6910: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
6920: 67 2e 7a 54 6f 70 2c 20 7a 55 75 69 64 29 3b 0a  g.zTop, zUuid);.
6930: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 79 6c      }.  }.  styl
6940: 65 5f 68 65 61 64 65 72 28 22 41 72 74 69 66 61  e_header("Artifa
6950: 63 74 20 43 6f 6e 74 65 6e 74 22 29 3b 0a 20 20  ct Content");.  
6960: 7a 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28  zUuid = db_text(
6970: 22 3f 22 2c 20 22 53 45 4c 45 43 54 20 75 75 69  "?", "SELECT uui
6980: 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52  d FROM blob WHER
6990: 45 20 72 69 64 3d 25 64 22 2c 20 72 69 64 29 3b  E rid=%d", rid);
69a0: 0a 20 20 40 20 3c 68 32 3e 41 72 74 69 66 61 63  .  @ <h2>Artifac
69b0: 74 20 25 73 28 7a 55 75 69 64 29 3c 2f 68 32 3e  t %s(zUuid)</h2>
69c0: 0a 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65  .  @ <blockquote
69d0: 3e 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 64  >.  blob_zero(&d
69e0: 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29 3b 0a 20 20  ownloadName);.  
69f0: 6f 62 6a 65 63 74 5f 64 65 73 63 72 69 70 74 69  object_descripti
6a00: 6f 6e 28 72 69 64 2c 20 30 2c 20 26 64 6f 77 6e  on(rid, 0, &down
6a10: 6c 6f 61 64 4e 61 6d 65 29 3b 0a 20 20 73 74 79  loadName);.  sty
6a20: 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65  le_submenu_eleme
6a30: 6e 74 28 22 44 6f 77 6e 6c 6f 61 64 22 2c 20 22  nt("Download", "
6a40: 44 6f 77 6e 6c 6f 61 64 22 2c 20 0a 20 20 20 20  Download", .    
6a50: 20 20 20 20 20 20 22 25 73 2f 72 61 77 2f 25 54        "%s/raw/%T
6a60: 3f 6e 61 6d 65 3d 25 64 22 2c 20 67 2e 7a 54 6f  ?name=%d", g.zTo
6a70: 70 2c 20 62 6c 6f 62 5f 73 74 72 28 26 64 6f 77  p, blob_str(&dow
6a80: 6e 6c 6f 61 64 4e 61 6d 65 29 2c 20 72 69 64 29  nloadName), rid)
6a90: 3b 0a 20 20 7a 4d 69 6d 65 20 3d 20 6d 69 6d 65  ;.  zMime = mime
6aa0: 74 79 70 65 5f 66 72 6f 6d 5f 6e 61 6d 65 28 62  type_from_name(b
6ab0: 6c 6f 62 5f 73 74 72 28 26 64 6f 77 6e 6c 6f 61  lob_str(&downloa
6ac0: 64 4e 61 6d 65 29 29 3b 0a 20 20 69 66 28 20 7a  dName));.  if( z
6ad0: 4d 69 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Mime ){.    if( 
6ae0: 73 74 72 63 6d 70 28 7a 4d 69 6d 65 2c 20 22 74  strcmp(zMime, "t
6af0: 65 78 74 2f 68 74 6d 6c 22 29 3d 3d 30 20 29 7b  ext/html")==0 ){
6b00: 0a 20 20 20 20 20 20 69 66 28 20 50 28 22 74 78  .      if( P("tx
6b10: 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  t") ){.        s
6b20: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65  tyle_submenu_ele
6b30: 6d 65 6e 74 28 22 48 74 6d 6c 22 2c 20 22 48 74  ment("Html", "Ht
6b40: 6d 6c 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ml",.           
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b60: 20 20 20 22 25 73 2f 61 72 74 69 66 61 63 74 3f     "%s/artifact?
6b70: 6e 61 6d 65 3d 25 64 22 2c 20 67 2e 7a 54 6f 70  name=%d", g.zTop
6b80: 2c 20 72 69 64 29 3b 0a 20 20 20 20 20 20 7d 65  , rid);.      }e
6b90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 6e  lse{.        ren
6ba0: 64 65 72 41 73 48 74 6d 6c 20 3d 20 31 3b 0a 20  derAsHtml = 1;. 
6bb0: 20 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62         style_sub
6bc0: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 54 65  menu_element("Te
6bd0: 78 74 22 2c 20 22 54 65 78 74 22 2c 0a 20 20 20  xt", "Text",.   
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bf0: 20 20 20 20 20 20 20 20 20 20 20 22 25 73 2f 61             "%s/a
6c00: 72 74 69 66 61 63 74 3f 6e 61 6d 65 3d 25 64 26  rtifact?name=%d&
6c10: 74 78 74 3d 31 22 2c 20 67 2e 7a 54 6f 70 2c 20  txt=1", g.zTop, 
6c20: 72 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rid);.      }.  
6c30: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
6c40: 6d 70 28 7a 4d 69 6d 65 2c 20 22 61 70 70 6c 69  mp(zMime, "appli
6c50: 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d  cation/x-fossil-
6c60: 77 69 6b 69 22 29 3d 3d 30 20 29 7b 0a 20 20 20  wiki")==0 ){.   
6c70: 20 20 20 69 66 28 20 50 28 22 74 78 74 22 29 20     if( P("txt") 
6c80: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 79 6c 65  ){.        style
6c90: 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74  _submenu_element
6ca0: 28 22 57 69 6b 69 22 2c 20 22 57 69 6b 69 22 2c  ("Wiki", "Wiki",
6cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
6cd0: 25 73 2f 61 72 74 69 66 61 63 74 3f 6e 61 6d 65  %s/artifact?name
6ce0: 3d 25 64 22 2c 20 67 2e 7a 54 6f 70 2c 20 72 69  =%d", g.zTop, ri
6cf0: 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d);.      }else{
6d00: 0a 20 20 20 20 20 20 20 20 72 65 6e 64 65 72 41  .        renderA
6d10: 73 57 69 6b 69 20 3d 20 31 3b 0a 20 20 20 20 20  sWiki = 1;.     
6d20: 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75     style_submenu
6d30: 5f 65 6c 65 6d 65 6e 74 28 22 54 65 78 74 22 2c  _element("Text",
6d40: 20 22 54 65 78 74 22 2c 0a 20 20 20 20 20 20 20   "Text",.       
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d60: 20 20 20 20 20 20 20 22 25 73 2f 61 72 74 69 66         "%s/artif
6d70: 61 63 74 3f 6e 61 6d 65 3d 25 64 26 74 78 74 3d  act?name=%d&txt=
6d80: 31 22 2c 20 67 2e 7a 54 6f 70 2c 20 72 69 64 29  1", g.zTop, rid)
6d90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6da0: 20 20 7d 0a 20 20 40 20 3c 2f 62 6c 6f 63 6b 71    }.  @ </blockq
6db0: 75 6f 74 65 3e 0a 20 20 40 20 3c 68 72 3e 0a 20  uote>.  @ <hr>. 
6dc0: 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69 64   content_get(rid
6dd0: 2c 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 69  , &content);.  i
6de0: 66 28 20 72 65 6e 64 65 72 41 73 57 69 6b 69 20  f( renderAsWiki 
6df0: 29 7b 0a 20 20 20 20 77 69 6b 69 5f 63 6f 6e 76  ){.    wiki_conv
6e00: 65 72 74 28 26 63 6f 6e 74 65 6e 74 2c 20 30 2c  ert(&content, 0,
6e10: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
6e20: 20 72 65 6e 64 65 72 41 73 48 74 6d 6c 20 29 7b   renderAsHtml ){
6e30: 0a 20 20 20 20 40 20 3c 64 69 76 3e 0a 20 20 20  .    @ <div>.   
6e40: 20 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74   cgi_append_cont
6e50: 65 6e 74 28 62 6c 6f 62 5f 62 75 66 66 65 72 28  ent(blob_buffer(
6e60: 26 63 6f 6e 74 65 6e 74 29 2c 20 62 6c 6f 62 5f  &content), blob_
6e70: 73 69 7a 65 28 26 63 6f 6e 74 65 6e 74 29 29 3b  size(&content));
6e80: 0a 20 20 20 20 40 20 3c 2f 64 69 76 3e 0a 20 20  .    @ </div>.  
6e90: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 69 6d 65  }else{.    zMime
6ea0: 20 3d 20 6d 69 6d 65 74 79 70 65 5f 66 72 6f 6d   = mimetype_from
6eb0: 5f 63 6f 6e 74 65 6e 74 28 26 63 6f 6e 74 65 6e  _content(&conten
6ec0: 74 29 3b 0a 20 20 20 20 40 20 3c 62 6c 6f 63 6b  t);.    @ <block
6ed0: 71 75 6f 74 65 3e 0a 20 20 20 20 69 66 28 20 7a  quote>.    if( z
6ee0: 4d 69 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Mime==0 ){.     
6ef0: 20 40 20 3c 70 72 65 3e 0a 20 20 20 20 20 20 40   @ <pre>.      @
6f00: 20 25 68 28 62 6c 6f 62 5f 73 74 72 28 26 63 6f   %h(blob_str(&co
6f10: 6e 74 65 6e 74 29 29 0a 20 20 20 20 20 20 40 20  ntent)).      @ 
6f20: 3c 2f 70 72 65 3e 0a 20 20 20 20 20 20 73 74 79  </pre>.      sty
6f30: 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65  le_submenu_eleme
6f40: 6e 74 28 22 48 65 78 22 2c 22 48 65 78 22 2c 20  nt("Hex","Hex", 
6f50: 22 25 73 2f 68 65 78 64 75 6d 70 3f 6e 61 6d 65  "%s/hexdump?name
6f60: 3d 25 64 22 2c 20 67 2e 7a 54 6f 70 2c 20 72 69  =%d", g.zTop, ri
6f70: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
6f80: 28 20 73 74 72 6e 63 6d 70 28 7a 4d 69 6d 65 2c  ( strncmp(zMime,
6f90: 20 22 69 6d 61 67 65 2f 22 2c 20 36 29 3d 3d 30   "image/", 6)==0
6fa0: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 69 6d 67   ){.      @ <img
6fb0: 20 73 72 63 3d 22 25 73 28 67 2e 7a 42 61 73 65   src="%s(g.zBase
6fc0: 55 52 4c 29 2f 72 61 77 3f 6e 61 6d 65 3d 25 64  URL)/raw?name=%d
6fd0: 28 72 69 64 29 26 6d 3d 25 73 28 7a 4d 69 6d 65  (rid)&m=%s(zMime
6fe0: 29 22 3e 3c 2f 69 6d 67 3e 0a 20 20 20 20 20 20  )"></img>.      
6ff0: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c  style_submenu_el
7000: 65 6d 65 6e 74 28 22 48 65 78 22 2c 22 48 65 78  ement("Hex","Hex
7010: 22 2c 20 22 25 73 2f 68 65 78 64 75 6d 70 3f 6e  ", "%s/hexdump?n
7020: 61 6d 65 3d 25 64 22 2c 20 67 2e 7a 54 6f 70 2c  ame=%d", g.zTop,
7030: 20 72 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65   rid);.    }else
7040: 7b 0a 20 20 20 20 20 20 40 20 3c 70 72 65 3e 0a  {.      @ <pre>.
7050: 20 20 20 20 20 20 68 65 78 64 75 6d 70 28 26 63        hexdump(&c
7060: 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 40  ontent);.      @
7070: 20 3c 2f 70 72 65 3e 0a 20 20 20 20 7d 0a 20 20   </pre>.    }.  
7080: 20 20 40 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65    @ </blockquote
7090: 3e 0a 20 20 7d 0a 20 20 73 74 79 6c 65 5f 66 6f  >.  }.  style_fo
70a0: 6f 74 65 72 28 29 3b 0a 7d 20 20 0a 0a 2f 2a 0a  oter();.}  ../*.
70b0: 2a 2a 20 57 45 42 50 41 47 45 3a 20 74 69 6e 66  ** WEBPAGE: tinf
70c0: 6f 0a 2a 2a 20 55 52 4c 3a 20 2f 74 69 6e 66 6f  o.** URL: /tinfo
70d0: 3f 6e 61 6d 65 3d 41 52 54 49 46 41 43 54 49 44  ?name=ARTIFACTID
70e0: 0a 2a 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20  .**.** Show the 
70f0: 64 65 74 61 69 6c 73 20 6f 66 20 61 20 74 69 63  details of a tic
7100: 6b 65 74 20 63 68 61 6e 67 65 20 63 6f 6e 74 72  ket change contr
7110: 6f 6c 20 61 72 74 69 66 61 63 74 2e 0a 2a 2f 0a  ol artifact..*/.
7120: 76 6f 69 64 20 74 69 6e 66 6f 5f 70 61 67 65 28  void tinfo_page(
7130: 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72 69 64  void){.  int rid
7140: 3b 0a 20 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74  ;.  Blob content
7150: 3b 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b  ;.  char *zDate;
7160: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7170: 55 75 69 64 3b 0a 20 20 63 68 61 72 20 7a 54 6b  Uuid;.  char zTk
7180: 74 4e 61 6d 65 5b 32 30 5d 3b 0a 20 20 4d 61 6e  tName[20];.  Man
7190: 69 66 65 73 74 20 6d 3b 0a 0a 20 20 6c 6f 67 69  ifest m;..  logi
71a0: 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69  n_check_credenti
71b0: 61 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e  als();.  if( !g.
71c0: 6f 6b 52 64 54 6b 74 20 29 7b 20 6c 6f 67 69 6e  okRdTkt ){ login
71d0: 5f 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75 72  _needed(); retur
71e0: 6e 3b 20 7d 0a 20 20 72 69 64 20 3d 20 6e 61 6d  n; }.  rid = nam
71f0: 65 5f 74 6f 5f 72 69 64 28 50 44 28 22 6e 61 6d  e_to_rid(PD("nam
7200: 65 22 2c 22 30 22 29 29 3b 0a 20 20 69 66 28 20  e","0"));.  if( 
7210: 72 69 64 3d 3d 30 20 29 7b 20 66 6f 73 73 69 6c  rid==0 ){ fossil
7220: 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29  _redirect_home()
7230: 3b 20 7d 0a 20 20 7a 55 75 69 64 20 3d 20 64 62  ; }.  zUuid = db
7240: 5f 74 65 78 74 28 22 22 2c 20 22 53 45 4c 45 43  _text("", "SELEC
7250: 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62  T uuid FROM blob
7260: 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20   WHERE rid=%d", 
7270: 72 69 64 29 3b 0a 20 20 69 66 28 20 67 2e 6f 6b  rid);.  if( g.ok
7280: 41 64 6d 69 6e 20 29 7b 0a 20 20 20 20 69 66 28  Admin ){.    if(
7290: 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45   db_exists("SELE
72a0: 43 54 20 31 20 46 52 4f 4d 20 73 68 75 6e 20 57  CT 1 FROM shun W
72b0: 48 45 52 45 20 75 75 69 64 3d 27 25 73 27 22 2c  HERE uuid='%s'",
72c0: 20 7a 55 75 69 64 29 20 29 7b 0a 20 20 20 20 20   zUuid) ){.     
72d0: 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65   style_submenu_e
72e0: 6c 65 6d 65 6e 74 28 22 55 6e 73 68 75 6e 22 2c  lement("Unshun",
72f0: 22 55 6e 73 68 75 6e 22 2c 20 22 25 73 2f 73 68  "Unshun", "%s/sh
7300: 75 6e 3f 75 75 69 64 3d 25 73 26 73 75 62 3d 31  un?uuid=%s&sub=1
7310: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ",.            g
7320: 2e 7a 54 6f 70 2c 20 7a 55 75 69 64 29 3b 0a 20  .zTop, zUuid);. 
7330: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7340: 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c  style_submenu_el
7350: 65 6d 65 6e 74 28 22 53 68 75 6e 22 2c 22 53 68  ement("Shun","Sh
7360: 75 6e 22 2c 20 22 25 73 2f 73 68 75 6e 3f 73 68  un", "%s/shun?sh
7370: 75 6e 3d 25 73 23 61 64 64 73 68 75 6e 22 2c 0a  un=%s#addshun",.
7380: 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a 54              g.zT
7390: 6f 70 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20  op, zUuid);.    
73a0: 7d 0a 20 20 7d 0a 20 20 63 6f 6e 74 65 6e 74 5f  }.  }.  content_
73b0: 67 65 74 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e  get(rid, &conten
73c0: 74 29 3b 0a 20 20 69 66 28 20 6d 61 6e 69 66 65  t);.  if( manife
73d0: 73 74 5f 70 61 72 73 65 28 26 6d 2c 20 26 63 6f  st_parse(&m, &co
73e0: 6e 74 65 6e 74 29 3d 3d 30 20 29 7b 0a 20 20 20  ntent)==0 ){.   
73f0: 20 66 6f 73 73 69 6c 5f 72 65 64 69 72 65 63 74   fossil_redirect
7400: 5f 68 6f 6d 65 28 29 3b 0a 20 20 7d 0a 20 20 69  _home();.  }.  i
7410: 66 28 20 6d 2e 74 79 70 65 21 3d 43 46 54 59 50  f( m.type!=CFTYP
7420: 45 5f 54 49 43 4b 45 54 20 29 7b 0a 20 20 20 20  E_TICKET ){.    
7430: 66 6f 73 73 69 6c 5f 72 65 64 69 72 65 63 74 5f  fossil_redirect_
7440: 68 6f 6d 65 28 29 3b 0a 20 20 7d 0a 20 20 73 74  home();.  }.  st
7450: 79 6c 65 5f 68 65 61 64 65 72 28 22 54 69 63 6b  yle_header("Tick
7460: 65 74 20 43 68 61 6e 67 65 20 44 65 74 61 69 6c  et Change Detail
7470: 73 22 29 3b 0a 20 20 7a 44 61 74 65 20 3d 20 64  s");.  zDate = d
7480: 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43  b_text(0, "SELEC
7490: 54 20 64 61 74 65 74 69 6d 65 28 25 2e 31 32 66  T datetime(%.12f
74a0: 29 22 2c 20 6d 2e 72 44 61 74 65 29 3b 0a 20 20  )", m.rDate);.  
74b0: 6d 65 6d 63 70 79 28 7a 54 6b 74 4e 61 6d 65 2c  memcpy(zTktName,
74c0: 20 6d 2e 7a 54 69 63 6b 65 74 55 75 69 64 2c 20   m.zTicketUuid, 
74d0: 31 30 29 3b 0a 20 20 7a 54 6b 74 4e 61 6d 65 5b  10);.  zTktName[
74e0: 31 30 5d 20 3d 20 30 3b 0a 20 20 40 20 3c 68 32  10] = 0;.  @ <h2
74f0: 3e 43 68 61 6e 67 65 73 20 74 6f 20 74 69 63 6b  >Changes to tick
7500: 65 74 20 3c 61 20 68 72 65 66 3d 22 25 73 28 6d  et <a href="%s(m
7510: 2e 7a 54 69 63 6b 65 74 55 75 69 64 29 22 3e 25  .zTicketUuid)">%
7520: 73 28 7a 54 6b 74 4e 61 6d 65 29 3c 2f 61 3e 3c  s(zTktName)</a><
7530: 2f 68 32 3e 0a 20 20 40 0a 20 20 40 20 3c 70 3e  /h2>.  @.  @ <p>
7540: 42 79 20 25 68 28 6d 2e 7a 55 73 65 72 29 20 6f  By %h(m.zUser) o
7550: 6e 20 25 73 28 7a 44 61 74 65 29 2e 20 20 53 65  n %s(zDate).  Se
7560: 65 20 61 6c 73 6f 3a 0a 20 20 40 20 3c 61 20 68  e also:.  @ <a h
7570: 72 65 66 3d 22 25 73 28 67 2e 7a 54 6f 70 29 2f  ref="%s(g.zTop)/
7580: 61 72 74 69 66 61 63 74 2f 25 54 28 7a 55 75 69  artifact/%T(zUui
7590: 64 29 22 3e 61 72 74 69 66 61 63 74 20 63 6f 6e  d)">artifact con
75a0: 74 65 6e 74 3c 2f 61 3e 2c 20 61 6e 64 0a 20 20  tent</a>, and.  
75b0: 40 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e  @ <a href="%s(g.
75c0: 7a 54 6f 70 29 2f 74 6b 74 68 69 73 74 6f 72 79  zTop)/tkthistory
75d0: 2f 25 73 28 6d 2e 7a 54 69 63 6b 65 74 55 75 69  /%s(m.zTicketUui
75e0: 64 29 22 3e 74 69 63 6b 65 74 20 68 69 73 74 6f  d)">ticket histo
75f0: 72 79 3c 2f 61 3e 0a 20 20 40 20 3c 2f 70 3e 0a  ry</a>.  @ </p>.
7600: 20 20 40 0a 20 20 40 20 3c 6f 6c 3e 0a 20 20 66    @.  @ <ol>.  f
7610: 72 65 65 28 7a 44 61 74 65 29 3b 0a 20 20 74 69  ree(zDate);.  ti
7620: 63 6b 65 74 5f 6f 75 74 70 75 74 5f 63 68 61 6e  cket_output_chan
7630: 67 65 5f 61 72 74 69 66 61 63 74 28 26 6d 29 3b  ge_artifact(&m);
7640: 0a 20 20 6d 61 6e 69 66 65 73 74 5f 63 6c 65 61  .  manifest_clea
7650: 72 28 26 6d 29 3b 0a 20 20 73 74 79 6c 65 5f 66  r(&m);.  style_f
7660: 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ooter();.}.../*.
7670: 2a 2a 20 57 45 42 50 41 47 45 3a 20 69 6e 66 6f  ** WEBPAGE: info
7680: 0a 2a 2a 20 55 52 4c 3a 20 69 6e 66 6f 2f 41 52  .** URL: info/AR
7690: 54 49 46 41 43 54 49 44 0a 2a 2a 0a 2a 2a 20 54  TIFACTID.**.** T
76a0: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
76b0: 20 61 72 74 69 66 61 63 74 20 49 44 20 77 68 69   artifact ID whi
76c0: 63 68 20 6d 69 67 68 74 20 62 65 20 61 20 62 61  ch might be a ba
76d0: 73 65 6c 69 6e 65 20 6f 72 20 61 20 66 69 6c 65  seline or a file
76e0: 20 6f 72 0a 2a 2a 20 61 20 74 69 63 6b 65 74 20   or.** a ticket 
76f0: 63 68 61 6e 67 65 73 20 6f 72 20 61 20 77 69 6b  changes or a wik
7700: 69 20 65 64 69 74 6f 72 20 6f 72 20 73 6f 6d 65  i editor or some
7710: 74 68 69 6e 67 20 65 6c 73 65 2e 20 0a 2a 2a 0a  thing else. .**.
7720: 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  ** Figure out wh
7730: 61 74 20 74 68 65 20 61 72 74 69 66 61 63 74 20  at the artifact 
7740: 49 44 20 69 73 20 61 6e 64 20 6a 75 6d 70 20 74  ID is and jump t
7750: 6f 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 69 6e  o it..*/.void in
7760: 66 6f 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20  fo_page(void){. 
7770: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7780: 6d 65 3b 0a 20 20 42 6c 6f 62 20 75 75 69 64 3b  me;.  Blob uuid;
7790: 0a 20 20 69 6e 74 20 72 69 64 2c 20 6e 4e 61 6d  .  int rid, nNam
77a0: 65 3b 0a 20 20 0a 20 20 7a 4e 61 6d 65 20 3d 20  e;.  .  zName = 
77b0: 50 28 22 6e 61 6d 65 22 29 3b 0a 20 20 69 66 28  P("name");.  if(
77c0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 66 6f 73 73   zName==0 ) foss
77d0: 69 6c 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65  il_redirect_home
77e0: 28 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74  ();.  nName = st
77f0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  rlen(zName);.  i
7800: 66 28 20 6e 4e 61 6d 65 3c 34 20 7c 7c 20 6e 4e  f( nName<4 || nN
7810: 61 6d 65 3e 55 55 49 44 5f 53 49 5a 45 20 7c 7c  ame>UUID_SIZE ||
7820: 20 21 76 61 6c 69 64 61 74 65 31 36 28 7a 4e 61   !validate16(zNa
7830: 6d 65 2c 20 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  me, nName) ){.  
7840: 20 20 73 77 69 74 63 68 28 20 73 79 6d 5f 74 61    switch( sym_ta
7850: 67 5f 74 6f 5f 75 75 69 64 28 7a 4e 61 6d 65 2c  g_to_uuid(zName,
7860: 20 26 75 75 69 64 29 20 29 7b 0a 20 20 20 20 20   &uuid) ){.     
7870: 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20   case 1: {.     
7880: 20 20 20 2f 2a 20 67 6f 74 20 6f 6e 65 20 55 55     /* got one UU
7890: 49 44 2c 20 75 73 65 20 69 74 20 2a 2f 0a 20 20  ID, use it */.  
78a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 62 6c        zName = bl
78b0: 6f 62 5f 73 74 72 28 26 75 75 69 64 29 3b 0a 20  ob_str(&uuid);. 
78c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
78d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
78e0: 20 32 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a   2: {.        /*
78f0: 20 67 6f 20 73 6f 6d 65 77 68 65 72 65 20 74 6f   go somewhere to
7900: 20 73 68 6f 77 20 74 68 65 20 6d 75 6c 74 69 70   show the multip
7910: 6c 65 20 55 55 49 44 73 20 2a 2f 0a 20 20 20 20  le UUIDs */.    
7920: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
7930: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7940: 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
7950: 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 73 73  : {.        foss
7960: 69 6c 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65  il_redirect_home
7970: 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ();.        brea
7980: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
7990: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 5f 65 78  .  }.  if( db_ex
79a0: 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46  ists("SELECT 1 F
79b0: 52 4f 4d 20 74 69 63 6b 65 74 20 57 48 45 52 45  ROM ticket WHERE
79c0: 20 74 6b 74 5f 75 75 69 64 20 47 4c 4f 42 20 27   tkt_uuid GLOB '
79d0: 25 73 2a 27 22 2c 20 7a 4e 61 6d 65 29 20 29 7b  %s*'", zName) ){
79e0: 0a 20 20 20 20 74 6b 74 76 69 65 77 5f 70 61 67  .    tktview_pag
79f0: 65 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  e();.    return;
7a00: 0a 20 20 7d 0a 20 20 72 69 64 20 3d 20 64 62 5f  .  }.  rid = db_
7a10: 69 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20 72  int(0, "SELECT r
7a20: 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45  id FROM blob WHE
7a30: 52 45 20 75 75 69 64 20 47 4c 4f 42 20 27 25 73  RE uuid GLOB '%s
7a40: 2a 27 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  *'", zName);.  i
7a50: 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a 20 20 20  f( rid==0 ){.   
7a60: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 42   style_header("B
7a70: 72 6f 6b 65 6e 20 4c 69 6e 6b 22 29 3b 0a 20 20  roken Link");.  
7a80: 20 20 40 20 3c 70 3e 4e 6f 20 73 75 63 68 20 6f    @ <p>No such o
7a90: 62 6a 65 63 74 3a 20 25 68 28 7a 4e 61 6d 65 29  bject: %h(zName)
7aa0: 3c 2f 70 3e 0a 20 20 20 20 73 74 79 6c 65 5f 66  </p>.    style_f
7ab0: 6f 6f 74 65 72 28 29 3b 0a 20 20 20 20 72 65 74  ooter();.    ret
7ac0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  urn;.  }.  if( d
7ad0: 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54  b_exists("SELECT
7ae0: 20 31 20 46 52 4f 4d 20 6d 6c 69 6e 6b 20 57 48   1 FROM mlink WH
7af0: 45 52 45 20 6d 69 64 3d 25 64 22 2c 20 72 69 64  ERE mid=%d", rid
7b00: 29 20 29 7b 0a 20 20 20 20 63 69 5f 70 61 67 65  ) ){.    ci_page
7b10: 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66  ();.  }else.  if
7b20: 28 20 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c  ( db_exists("SEL
7b30: 45 43 54 20 31 20 46 52 4f 4d 20 74 61 67 78 72  ECT 1 FROM tagxr
7b40: 65 66 20 4a 4f 49 4e 20 74 61 67 20 55 53 49 4e  ef JOIN tag USIN
7b50: 47 28 74 61 67 69 64 29 22 0a 20 20 20 20 20 20  G(tagid)".      
7b60: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
7b70: 45 20 72 69 64 3d 25 64 20 41 4e 44 20 74 61 67  E rid=%d AND tag
7b80: 6e 61 6d 65 20 4c 49 4b 45 20 27 77 69 6b 69 2d  name LIKE 'wiki-
7b90: 25 25 27 22 2c 20 72 69 64 29 20 29 7b 0a 20 20  %%'", rid) ){.  
7ba0: 20 20 77 69 6e 66 6f 5f 70 61 67 65 28 29 3b 0a    winfo_page();.
7bb0: 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 64 62    }else.  if( db
7bc0: 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20  _exists("SELECT 
7bd0: 31 20 46 52 4f 4d 20 74 61 67 78 72 65 66 20 4a  1 FROM tagxref J
7be0: 4f 49 4e 20 74 61 67 20 55 53 49 4e 47 28 74 61  OIN tag USING(ta
7bf0: 67 69 64 29 22 0a 20 20 20 20 20 20 20 20 20 20  gid)".          
7c00: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 72 69        " WHERE ri
7c10: 64 3d 25 64 20 41 4e 44 20 74 61 67 6e 61 6d 65  d=%d AND tagname
7c20: 20 4c 49 4b 45 20 27 74 6b 74 2d 25 25 27 22 2c   LIKE 'tkt-%%'",
7c30: 20 72 69 64 29 20 29 7b 0a 20 20 20 20 74 69 6e   rid) ){.    tin
7c40: 66 6f 5f 70 61 67 65 28 29 3b 0a 20 20 7d 65 6c  fo_page();.  }el
7c50: 73 65 0a 20 20 69 66 28 20 64 62 5f 65 78 69 73  se.  if( db_exis
7c60: 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f  ts("SELECT 1 FRO
7c70: 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 63 69  M plink WHERE ci
7c80: 64 3d 25 64 22 2c 20 72 69 64 29 20 29 7b 0a 20  d=%d", rid) ){. 
7c90: 20 20 20 63 69 5f 70 61 67 65 28 29 3b 0a 20 20     ci_page();.  
7ca0: 7d 65 6c 73 65 0a 20 20 69 66 28 20 64 62 5f 65  }else.  if( db_e
7cb0: 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 20  xists("SELECT 1 
7cc0: 46 52 4f 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45  FROM plink WHERE
7cd0: 20 70 69 64 3d 25 64 22 2c 20 72 69 64 29 20 29   pid=%d", rid) )
7ce0: 7b 0a 20 20 20 20 63 69 5f 70 61 67 65 28 29 3b  {.    ci_page();
7cf0: 0a 20 20 7d 65 6c 73 65 0a 20 20 7b 0a 20 20 20  .  }else.  {.   
7d00: 20 61 72 74 69 66 61 63 74 5f 70 61 67 65 28 29   artifact_page()
7d10: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ;.  }.}../*.** W
7d20: 45 42 50 41 47 45 3a 20 63 69 5f 65 64 69 74 0a  EBPAGE: ci_edit.
7d30: 2a 2a 20 55 52 4c 3a 20 20 63 69 5f 65 64 69 74  ** URL:  ci_edit
7d40: 3f 72 3d 52 49 44 26 63 3d 4e 45 57 43 4f 4d 4d  ?r=RID&c=NEWCOMM
7d50: 45 4e 54 26 75 3d 4e 45 57 55 53 45 52 0a 2a 2a  ENT&u=NEWUSER.**
7d60: 0a 2a 2a 20 50 72 65 73 65 6e 74 20 61 20 64 69  .** Present a di
7d70: 61 6c 6f 67 20 66 6f 72 20 75 70 64 61 74 69 6e  alog for updatin
7d80: 67 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 20  g properties of 
7d90: 61 20 62 61 73 65 6c 69 6e 65 3a 0a 2a 2a 0a 2a  a baseline:.**.*
7da0: 2a 20 20 20 20 20 2a 20 20 54 68 65 20 63 68 65  *     *  The che
7db0: 63 6b 2d 69 6e 20 75 73 65 72 0a 2a 2a 20 20 20  ck-in user.**   
7dc0: 20 20 2a 20 20 54 68 65 20 63 68 65 63 6b 2d 69    *  The check-i
7dd0: 6e 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 20 20 20  n comment.**    
7de0: 20 2a 20 20 54 68 65 20 62 61 63 6b 67 72 6f 75   *  The backgrou
7df0: 6e 64 20 63 6f 6c 6f 72 2e 0a 2a 2f 0a 76 6f 69  nd color..*/.voi
7e00: 64 20 63 69 5f 65 64 69 74 5f 70 61 67 65 28 76  d ci_edit_page(v
7e10: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72 69 64 3b  oid){.  int rid;
7e20: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7e30: 43 6f 6d 6d 65 6e 74 3b 20 20 20 20 20 20 20 20  Comment;        
7e40: 20 2f 2a 20 43 75 72 72 65 6e 74 20 63 6f 6d 6d   /* Current comm
7e50: 65 6e 74 20 6f 6e 20 74 68 65 20 63 68 65 63 6b  ent on the check
7e60: 2d 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  -in */.  const c
7e70: 68 61 72 20 2a 7a 4e 65 77 43 6f 6d 6d 65 6e 74  har *zNewComment
7e80: 3b 20 20 20 20 20 20 2f 2a 20 52 65 76 69 73 65  ;      /* Revise
7e90: 64 20 63 68 65 63 6b 2d 69 6e 20 63 6f 6d 6d 65  d check-in comme
7ea0: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
7eb0: 61 72 20 2a 7a 55 73 65 72 3b 20 20 20 20 20 20  ar *zUser;      
7ec0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
7ed0: 20 75 73 65 72 20 66 6f 72 20 74 68 65 20 63 68   user for the ch
7ee0: 65 63 6b 2d 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73  eck-in */.  cons
7ef0: 74 20 63 68 61 72 20 2a 7a 4e 65 77 55 73 65 72  t char *zNewUser
7f00: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76  ;         /* Rev
7f10: 69 73 65 64 20 75 73 65 72 20 2a 2f 0a 20 20 63  ised user */.  c
7f20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65  onst char *zDate
7f30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7f40: 43 75 72 72 65 6e 74 20 64 61 74 65 20 6f 66 20  Current date of 
7f50: 74 68 65 20 63 68 65 63 6b 2d 69 6e 20 2a 2f 0a  the check-in */.
7f60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
7f70: 65 77 44 61 74 65 3b 20 20 20 20 20 20 20 20 20  ewDate;         
7f80: 2f 2a 20 52 65 76 69 73 65 64 20 63 68 65 63 6b  /* Revised check
7f90: 2d 69 6e 20 64 61 74 65 20 2a 2f 0a 20 20 63 6f  -in date */.  co
7fa0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6f 72  nst char *zColor
7fb0: 3b 20 20 20 20 20 20 20 0a 20 20 63 6f 6e 73 74  ;       .  const
7fc0: 20 63 68 61 72 20 2a 7a 4e 65 77 43 6f 6c 6f 72   char *zNewColor
7fd0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7fe0: 7a 4e 65 77 54 61 67 46 6c 61 67 3b 0a 20 20 63  zNewTagFlag;.  c
7ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 54  onst char *zNewT
8000: 61 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ag;.  const char
8010: 20 2a 7a 4e 65 77 42 72 46 6c 61 67 3b 0a 20 20   *zNewBrFlag;.  
8020: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77  const char *zNew
8030: 42 72 61 6e 63 68 3b 0a 20 20 63 6f 6e 73 74 20  Branch;.  const 
8040: 63 68 61 72 20 2a 7a 43 6c 6f 73 65 46 6c 61 67  char *zCloseFlag
8050: 3b 0a 20 20 69 6e 74 20 66 50 72 6f 70 61 67 61  ;.  int fPropaga
8060: 74 65 43 6f 6c 6f 72 3b 0a 20 20 63 68 61 72 20  teColor;.  char 
8070: 2a 7a 55 75 69 64 3b 0a 20 20 42 6c 6f 62 20 63  *zUuid;.  Blob c
8080: 6f 6d 6d 65 6e 74 3b 0a 20 20 53 74 6d 74 20 71  omment;.  Stmt q
8090: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
80a0: 20 73 74 72 75 63 74 20 53 61 6d 70 6c 65 43 6f   struct SampleCo
80b0: 6c 6f 72 73 20 7b 0a 20 20 20 20 20 63 6f 6e 73  lors {.     cons
80c0: 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65 3b 0a  t char *zCName;.
80d0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
80e0: 2a 7a 43 6f 6c 6f 72 3b 0a 20 20 7d 20 61 43 6f  *zColor;.  } aCo
80f0: 6c 6f 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  lor[] = {.     {
8100: 20 22 28 6e 6f 6e 65 29 22 2c 20 20 22 22 20 7d   "(none)",  "" }
8110: 2c 0a 20 20 20 20 20 7b 20 22 23 66 32 64 63 64  ,.     { "#f2dcd
8120: 63 22 2c 20 22 23 66 32 64 63 64 63 22 20 7d 2c  c", "#f2dcdc" },
8130: 0a 20 20 20 20 20 7b 20 22 23 66 30 66 66 63 30  .     { "#f0ffc0
8140: 22 2c 20 22 23 66 30 66 66 63 30 22 20 7d 2c 0a  ", "#f0ffc0" },.
8150: 20 20 20 20 20 7b 20 22 23 62 64 65 35 64 36 22       { "#bde5d6"
8160: 2c 20 22 23 62 64 65 35 64 36 22 20 7d 2c 0a 20  , "#bde5d6" },. 
8170: 20 20 20 20 7b 20 22 23 63 30 66 66 63 30 22 2c      { "#c0ffc0",
8180: 20 22 23 63 30 66 66 63 30 22 20 7d 2c 0a 20 20   "#c0ffc0" },.  
8190: 20 20 20 7b 20 22 23 63 30 66 66 66 30 22 2c 20     { "#c0fff0", 
81a0: 22 23 63 30 66 66 66 30 22 20 7d 2c 0a 20 20 20  "#c0fff0" },.   
81b0: 20 20 7b 20 22 23 63 30 66 30 66 66 22 2c 20 22    { "#c0f0ff", "
81c0: 23 63 30 66 30 66 66 22 20 7d 2c 0a 20 20 20 20  #c0f0ff" },.    
81d0: 20 7b 20 22 23 64 30 63 30 66 66 22 2c 20 22 23   { "#d0c0ff", "#
81e0: 64 30 63 30 66 66 22 20 7d 2c 0a 20 20 20 20 20  d0c0ff" },.     
81f0: 7b 20 22 23 66 66 63 30 66 66 22 2c 20 22 23 66  { "#ffc0ff", "#f
8200: 66 63 30 66 66 22 20 7d 2c 0a 20 20 20 20 20 7b  fc0ff" },.     {
8210: 20 22 23 66 66 63 30 64 30 22 2c 20 22 23 66 66   "#ffc0d0", "#ff
8220: 63 30 64 30 22 20 7d 2c 0a 20 20 20 20 20 7b 20  c0d0" },.     { 
8230: 22 23 66 66 66 30 63 30 22 2c 20 22 23 66 66 66  "#fff0c0", "#fff
8240: 30 63 30 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22  0c0" },.     { "
8250: 23 63 30 63 30 63 30 22 2c 20 22 23 63 30 63 30  #c0c0c0", "#c0c0
8260: 63 30 22 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e  c0" },.  };.  in
8270: 74 20 6e 43 6f 6c 6f 72 20 3d 20 73 69 7a 65 6f  t nColor = sizeo
8280: 66 28 61 43 6f 6c 6f 72 29 2f 73 69 7a 65 6f 66  f(aColor)/sizeof
8290: 28 61 43 6f 6c 6f 72 5b 30 5d 29 3b 0a 20 20 69  (aColor[0]);.  i
82a0: 6e 74 20 69 3b 0a 20 20 0a 20 20 6c 6f 67 69 6e  nt i;.  .  login
82b0: 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61  _check_credentia
82c0: 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f  ls();.  if( !g.o
82d0: 6b 57 72 69 74 65 20 29 7b 20 6c 6f 67 69 6e 5f  kWrite ){ login_
82e0: 6e 65 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e  needed(); return
82f0: 3b 20 7d 0a 20 20 72 69 64 20 3d 20 61 74 6f 69  ; }.  rid = atoi
8300: 28 50 44 28 22 72 22 2c 22 30 22 29 29 3b 0a 20  (PD("r","0"));. 
8310: 20 7a 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74   zUuid = db_text
8320: 28 30 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64  (0, "SELECT uuid
8330: 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45   FROM blob WHERE
8340: 20 72 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a   rid=%d", rid);.
8350: 20 20 7a 43 6f 6d 6d 65 6e 74 20 3d 20 64 62 5f    zComment = db_
8360: 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20  text(0, "SELECT 
8370: 63 6f 61 6c 65 73 63 65 28 65 63 6f 6d 6d 65 6e  coalesce(ecommen
8380: 74 2c 63 6f 6d 6d 65 6e 74 29 22 0a 20 20 20 20  t,comment)".    
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 20 20 22 20 20 46 52 4f 4d 20 65 76 65 6e      "  FROM even
83b0: 74 20 57 48 45 52 45 20 6f 62 6a 69 64 3d 25 64  t WHERE objid=%d
83c0: 22 2c 20 72 69 64 29 3b 0a 20 20 69 66 28 20 7a  ", rid);.  if( z
83d0: 43 6f 6d 6d 65 6e 74 3d 3d 30 20 29 20 66 6f 73  Comment==0 ) fos
83e0: 73 69 6c 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d  sil_redirect_hom
83f0: 65 28 29 3b 0a 20 20 69 66 28 20 50 28 22 63 61  e();.  if( P("ca
8400: 6e 63 65 6c 22 29 20 29 7b 0a 20 20 20 20 63 67  ncel") ){.    cg
8410: 69 5f 72 65 64 69 72 65 63 74 66 28 22 63 69 3f  i_redirectf("ci?
8420: 6e 61 6d 65 3d 25 64 22 2c 20 72 69 64 29 3b 0a  name=%d", rid);.
8430: 20 20 7d 0a 20 20 7a 4e 65 77 43 6f 6d 6d 65 6e    }.  zNewCommen
8440: 74 20 3d 20 50 44 28 22 63 22 2c 7a 43 6f 6d 6d  t = PD("c",zComm
8450: 65 6e 74 29 3b 0a 20 20 7a 55 73 65 72 20 3d 20  ent);.  zUser = 
8460: 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45  db_text(0, "SELE
8470: 43 54 20 63 6f 61 6c 65 73 63 65 28 65 75 73 65  CT coalesce(euse
8480: 72 2c 75 73 65 72 29 22 0a 20 20 20 20 20 20 20  r,user)".       
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
84a0: 20 46 52 4f 4d 20 65 76 65 6e 74 20 57 48 45 52   FROM event WHER
84b0: 45 20 6f 62 6a 69 64 3d 25 64 22 2c 20 72 69 64  E objid=%d", rid
84c0: 29 3b 0a 20 20 69 66 28 20 7a 55 73 65 72 3d 3d  );.  if( zUser==
84d0: 30 20 29 20 66 6f 73 73 69 6c 5f 72 65 64 69 72  0 ) fossil_redir
84e0: 65 63 74 5f 68 6f 6d 65 28 29 3b 0a 20 20 7a 4e  ect_home();.  zN
84f0: 65 77 55 73 65 72 20 3d 20 50 44 28 22 75 22 2c  ewUser = PD("u",
8500: 7a 55 73 65 72 29 3b 0a 20 20 7a 44 61 74 65 20  zUser);.  zDate 
8510: 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45  = db_text(0, "SE
8520: 4c 45 43 54 20 64 61 74 65 74 69 6d 65 28 6d 74  LECT datetime(mt
8530: 69 6d 65 29 22 0a 20 20 20 20 20 20 20 20 20 20  ime)".          
8540: 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52             "  FR
8550: 4f 4d 20 65 76 65 6e 74 20 57 48 45 52 45 20 6f  OM event WHERE o
8560: 62 6a 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a  bjid=%d", rid);.
8570: 20 20 69 66 28 20 7a 44 61 74 65 3d 3d 30 20 29    if( zDate==0 )
8580: 20 66 6f 73 73 69 6c 5f 72 65 64 69 72 65 63 74   fossil_redirect
8590: 5f 68 6f 6d 65 28 29 3b 0a 20 20 7a 4e 65 77 44  _home();.  zNewD
85a0: 61 74 65 20 3d 20 50 44 28 22 64 74 22 2c 7a 44  ate = PD("dt",zD
85b0: 61 74 65 29 3b 0a 20 20 7a 43 6f 6c 6f 72 20 3d  ate);.  zColor =
85c0: 20 64 62 5f 74 65 78 74 28 22 22 2c 20 22 53 45   db_text("", "SE
85d0: 4c 45 43 54 20 62 67 63 6f 6c 6f 72 22 0a 20 20  LECT bgcolor".  
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 65 76        "  FROM ev
8600: 65 6e 74 20 57 48 45 52 45 20 6f 62 6a 69 64 3d  ent WHERE objid=
8610: 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 7a 4e 65  %d", rid);.  zNe
8620: 77 43 6f 6c 6f 72 20 3d 20 50 44 28 22 63 6c 72  wColor = PD("clr
8630: 22 2c 7a 43 6f 6c 6f 72 29 3b 0a 20 20 66 50 72  ",zColor);.  fPr
8640: 6f 70 61 67 61 74 65 43 6f 6c 6f 72 20 3d 20 50  opagateColor = P
8650: 28 22 70 63 6c 72 22 29 21 3d 30 3b 0a 20 20 7a  ("pclr")!=0;.  z
8660: 4e 65 77 54 61 67 46 6c 61 67 20 3d 20 50 28 22  NewTagFlag = P("
8670: 6e 65 77 74 61 67 22 29 20 3f 20 22 20 63 68 65  newtag") ? " che
8680: 63 6b 65 64 22 20 3a 20 22 22 3b 0a 20 20 7a 4e  cked" : "";.  zN
8690: 65 77 54 61 67 20 3d 20 50 44 28 22 74 61 67 6e  ewTag = PD("tagn
86a0: 61 6d 65 22 2c 22 22 29 3b 0a 20 20 7a 4e 65 77  ame","");.  zNew
86b0: 42 72 46 6c 61 67 20 3d 20 50 28 22 6e 65 77 62  BrFlag = P("newb
86c0: 72 22 29 20 3f 20 22 20 63 68 65 63 6b 65 64 22  r") ? " checked"
86d0: 20 3a 20 22 22 3b 0a 20 20 7a 4e 65 77 42 72 61   : "";.  zNewBra
86e0: 6e 63 68 20 3d 20 50 44 28 22 62 72 6e 61 6d 65  nch = PD("brname
86f0: 22 2c 22 22 29 3b 0a 20 20 7a 43 6c 6f 73 65 46  ","");.  zCloseF
8700: 6c 61 67 20 3d 20 50 28 22 63 6c 6f 73 65 22 29  lag = P("close")
8710: 20 3f 20 22 20 63 68 65 63 6b 65 64 22 20 3a 20   ? " checked" : 
8720: 22 22 3b 0a 20 20 69 66 28 20 50 28 22 61 70 70  "";.  if( P("app
8730: 6c 79 22 29 20 29 7b 0a 20 20 20 20 42 6c 6f 62  ly") ){.    Blob
8740: 20 63 74 72 6c 3b 0a 20 20 20 20 63 68 61 72 20   ctrl;.    char 
8750: 2a 7a 44 61 74 65 3b 0a 20 20 20 20 69 6e 74 20  *zDate;.    int 
8760: 6e 43 68 6e 67 20 3d 20 30 3b 0a 0a 20 20 20 20  nChng = 0;..    
8770: 6c 6f 67 69 6e 5f 76 65 72 69 66 79 5f 63 73 72  login_verify_csr
8780: 66 5f 73 65 63 72 65 74 28 29 3b 0a 20 20 20 20  f_secret();.    
8790: 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 74 72 6c 29  blob_zero(&ctrl)
87a0: 3b 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 64 62  ;.    zDate = db
87b0: 5f 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54  _text(0, "SELECT
87c0: 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29   datetime('now')
87d0: 22 29 3b 0a 20 20 20 20 7a 44 61 74 65 5b 31 30  ");.    zDate[10
87e0: 5d 20 3d 20 27 54 27 3b 0a 20 20 20 20 62 6c 6f  ] = 'T';.    blo
87f0: 62 5f 61 70 70 65 6e 64 66 28 26 63 74 72 6c 2c  b_appendf(&ctrl,
8800: 20 22 44 20 25 73 5c 6e 22 2c 20 7a 44 61 74 65   "D %s\n", zDate
8810: 29 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  );.    db_multi_
8820: 65 78 65 63 28 22 43 52 45 41 54 45 20 54 45 4d  exec("CREATE TEM
8830: 50 20 54 41 42 4c 45 20 6e 65 77 74 61 67 73 28  P TABLE newtags(
8840: 74 61 67 20 55 4e 49 51 55 45 2c 20 70 72 65 66  tag UNIQUE, pref
8850: 69 78 2c 20 76 61 6c 75 65 29 22 29 3b 0a 20 20  ix, value)");.  
8860: 20 20 69 66 28 20 7a 4e 65 77 43 6f 6c 6f 72 5b    if( zNewColor[
8870: 30 5d 20 26 26 20 73 74 72 63 6d 70 28 7a 43 6f  0] && strcmp(zCo
8880: 6c 6f 72 2c 7a 4e 65 77 43 6f 6c 6f 72 29 21 3d  lor,zNewColor)!=
8890: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
88a0: 2a 7a 50 72 65 66 69 78 20 3d 20 22 2b 22 3b 0a  *zPrefix = "+";.
88b0: 20 20 20 20 20 20 69 66 28 20 66 50 72 6f 70 61        if( fPropa
88c0: 67 61 74 65 43 6f 6c 6f 72 20 29 7b 0a 20 20 20  gateColor ){.   
88d0: 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22       zPrefix = "
88e0: 2a 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  *";.      }.    
88f0: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
8900: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6e 65  "REPLACE INTO ne
8910: 77 74 61 67 73 20 56 41 4c 55 45 53 28 27 62 67  wtags VALUES('bg
8920: 63 6f 6c 6f 72 27 2c 25 51 2c 25 51 29 22 2c 0a  color',%Q,%Q)",.
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 20 20 20 7a 50 72 65 66 69 78 2c 20 7a 4e 65      zPrefix, zNe
8950: 77 43 6f 6c 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  wColor);.    }. 
8960: 20 20 20 69 66 28 20 7a 4e 65 77 43 6f 6c 6f 72     if( zNewColor
8970: 5b 30 5d 3d 3d 30 20 26 26 20 7a 43 6f 6c 6f 72  [0]==0 && zColor
8980: 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]!=0 ){.      
8990: 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 52  db_multi_exec("R
89a0: 45 50 4c 41 43 45 20 49 4e 54 4f 20 6e 65 77 74  EPLACE INTO newt
89b0: 61 67 73 20 56 41 4c 55 45 53 28 27 62 67 63 6f  ags VALUES('bgco
89c0: 6c 6f 72 27 2c 27 2d 27 2c 4e 55 4c 4c 29 22 29  lor','-',NULL)")
89d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
89e0: 73 74 72 63 6d 70 28 7a 43 6f 6d 6d 65 6e 74 2c  strcmp(zComment,
89f0: 7a 4e 65 77 43 6f 6d 6d 65 6e 74 29 21 3d 30 20  zNewComment)!=0 
8a00: 29 7b 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c 74  ){.      db_mult
8a10: 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45 20  i_exec("REPLACE 
8a20: 49 4e 54 4f 20 6e 65 77 74 61 67 73 20 56 41 4c  INTO newtags VAL
8a30: 55 45 53 28 27 63 6f 6d 6d 65 6e 74 27 2c 27 2b  UES('comment','+
8a40: 27 2c 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20  ',%Q)",.        
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 65 77              zNew
8a60: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a  Comment);.    }.
8a70: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
8a80: 44 61 74 65 2c 7a 4e 65 77 44 61 74 65 29 21 3d  Date,zNewDate)!=
8a90: 30 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 6d 75  0 ){.      db_mu
8aa0: 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43  lti_exec("REPLAC
8ab0: 45 20 49 4e 54 4f 20 6e 65 77 74 61 67 73 20 56  E INTO newtags V
8ac0: 41 4c 55 45 53 28 27 64 61 74 65 27 2c 27 2b 27  ALUES('date','+'
8ad0: 2c 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%Q)",.         
8ae0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 65 77 44             zNewD
8af0: 61 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ate);.    }.    
8b00: 69 66 28 20 73 74 72 63 6d 70 28 7a 55 73 65 72  if( strcmp(zUser
8b10: 2c 7a 4e 65 77 55 73 65 72 29 21 3d 30 20 29 7b  ,zNewUser)!=0 ){
8b20: 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f  .      db_multi_
8b30: 65 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e  exec("REPLACE IN
8b40: 54 4f 20 6e 65 77 74 61 67 73 20 56 41 4c 55 45  TO newtags VALUE
8b50: 53 28 27 75 73 65 72 27 2c 27 2b 27 2c 25 51 29  S('user','+',%Q)
8b60: 22 2c 20 7a 4e 65 77 55 73 65 72 29 3b 0a 20 20  ", zNewUser);.  
8b70: 20 20 7d 0a 20 20 20 20 64 62 5f 70 72 65 70 61    }.    db_prepa
8b80: 72 65 28 26 71 2c 0a 20 20 20 20 20 20 20 22 53  re(&q,.       "S
8b90: 45 4c 45 43 54 20 74 61 67 2e 74 61 67 69 64 2c  ELECT tag.tagid,
8ba0: 20 74 61 67 6e 61 6d 65 20 46 52 4f 4d 20 74 61   tagname FROM ta
8bb0: 67 78 72 65 66 2c 20 74 61 67 22 0a 20 20 20 20  gxref, tag".    
8bc0: 20 20 20 22 20 57 48 45 52 45 20 74 61 67 78 72     " WHERE tagxr
8bd0: 65 66 2e 72 69 64 3d 25 64 20 41 4e 44 20 74 61  ef.rid=%d AND ta
8be0: 67 74 79 70 65 3e 30 20 41 4e 44 20 74 61 67 78  gtype>0 AND tagx
8bf0: 72 65 66 2e 74 61 67 69 64 3d 74 61 67 2e 74 61  ref.tagid=tag.ta
8c00: 67 69 64 22 2c 0a 20 20 20 20 20 20 20 72 69 64  gid",.       rid
8c10: 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69 6c  .    );.    whil
8c20: 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d  e( db_step(&q)==
8c30: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
8c40: 20 20 20 20 69 6e 74 20 74 61 67 69 64 20 3d 20      int tagid = 
8c50: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71  db_column_int(&q
8c60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 0);.      cons
8c70: 74 20 63 68 61 72 20 2a 7a 54 61 67 20 3d 20 64  t char *zTag = d
8c80: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
8c90: 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 68 61 72  , 1);.      char
8ca0: 20 7a 4c 61 62 65 6c 5b 33 30 5d 3b 0a 20 20 20   zLabel[30];.   
8cb0: 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 61 62 65     sprintf(zLabe
8cc0: 6c 2c 20 22 63 25 64 22 2c 20 74 61 67 69 64 29  l, "c%d", tagid)
8cd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 50 28 7a 4c  ;.      if( P(zL
8ce0: 61 62 65 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  abel) ){.       
8cf0: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22   db_multi_exec("
8d00: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6e 65 77  REPLACE INTO new
8d10: 74 61 67 73 20 56 41 4c 55 45 53 28 25 51 2c 27  tags VALUES(%Q,'
8d20: 2d 27 2c 4e 55 4c 4c 29 22 2c 20 7a 54 61 67 29  -',NULL)", zTag)
8d30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8d40: 20 20 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28      db_finalize(
8d50: 26 71 29 3b 0a 20 20 20 20 69 66 28 20 7a 43 6c  &q);.    if( zCl
8d60: 6f 73 65 46 6c 61 67 5b 30 5d 20 29 7b 0a 20 20  oseFlag[0] ){.  
8d70: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
8d80: 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  c("REPLACE INTO 
8d90: 6e 65 77 74 61 67 73 20 56 41 4c 55 45 53 28 27  newtags VALUES('
8da0: 63 6c 6f 73 65 64 27 2c 27 2b 27 2c 4e 55 4c 4c  closed','+',NULL
8db0: 29 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  )");.    }.    i
8dc0: 66 28 20 7a 4e 65 77 54 61 67 46 6c 61 67 5b 30  f( zNewTagFlag[0
8dd0: 5d 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 6d 75  ] ){.      db_mu
8de0: 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43  lti_exec("REPLAC
8df0: 45 20 49 4e 54 4f 20 6e 65 77 74 61 67 73 20 56  E INTO newtags V
8e00: 41 4c 55 45 53 28 27 73 79 6d 2d 25 71 27 2c 27  ALUES('sym-%q','
8e10: 2b 27 2c 4e 55 4c 4c 29 22 2c 20 7a 4e 65 77 54  +',NULL)", zNewT
8e20: 61 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ag);.    }.    i
8e30: 66 28 20 7a 4e 65 77 42 72 46 6c 61 67 5b 30 5d  f( zNewBrFlag[0]
8e40: 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c   ){.      db_mul
8e50: 74 69 5f 65 78 65 63 28 0a 20 20 20 20 20 20 20  ti_exec(.       
8e60: 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6e   "REPLACE INTO n
8e70: 65 77 74 61 67 73 20 22 0a 20 20 20 20 20 20 20  ewtags ".       
8e80: 20 22 20 53 45 4c 45 43 54 20 74 61 67 6e 61 6d   " SELECT tagnam
8e90: 65 2c 20 27 2d 27 2c 20 4e 55 4c 4c 20 46 52 4f  e, '-', NULL FRO
8ea0: 4d 20 74 61 67 78 72 65 66 2c 20 74 61 67 22 0a  M tagxref, tag".
8eb0: 20 20 20 20 20 20 20 20 22 20 20 57 48 45 52 45          "  WHERE
8ec0: 20 74 61 67 78 72 65 66 2e 72 69 64 3d 25 64 20   tagxref.rid=%d 
8ed0: 41 4e 44 20 74 61 67 74 79 70 65 3d 3d 32 22 0a  AND tagtype==2".
8ee0: 20 20 20 20 20 20 20 20 22 20 20 20 20 41 4e 44          "    AND
8ef0: 20 74 61 67 6e 61 6d 65 20 47 4c 4f 42 20 27 73   tagname GLOB 's
8f00: 79 6d 2d 2a 27 22 0a 20 20 20 20 20 20 20 20 22  ym-*'".        "
8f10: 20 20 20 20 41 4e 44 20 74 61 67 2e 74 61 67 69      AND tag.tagi
8f20: 64 3d 74 61 67 78 72 65 66 2e 74 61 67 69 64 22  d=tagxref.tagid"
8f30: 2c 0a 20 20 20 20 20 20 20 20 72 69 64 0a 20 20  ,.        rid.  
8f40: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 64 62 5f      );.      db_
8f50: 6d 75 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c  multi_exec("REPL
8f60: 41 43 45 20 49 4e 54 4f 20 6e 65 77 74 61 67 73  ACE INTO newtags
8f70: 20 56 41 4c 55 45 53 28 27 62 72 61 6e 63 68 27   VALUES('branch'
8f80: 2c 27 2a 27 2c 25 51 29 22 2c 20 7a 4e 65 77 42  ,'*',%Q)", zNewB
8f90: 72 61 6e 63 68 29 3b 0a 20 20 20 20 20 20 64 62  ranch);.      db
8fa0: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 52 45 50  _multi_exec("REP
8fb0: 4c 41 43 45 20 49 4e 54 4f 20 6e 65 77 74 61 67  LACE INTO newtag
8fc0: 73 20 56 41 4c 55 45 53 28 27 73 79 6d 2d 25 71  s VALUES('sym-%q
8fd0: 27 2c 27 2a 27 2c 4e 55 4c 4c 29 22 2c 0a 20 20  ','*',NULL)",.  
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 7a 4e 65 77 42 72 61 6e 63 68 29 3b 0a 20    zNewBranch);. 
9000: 20 20 20 7d 0a 20 20 20 20 64 62 5f 70 72 65 70     }.    db_prep
9010: 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20  are(&q, "SELECT 
9020: 74 61 67 2c 20 70 72 65 66 69 78 2c 20 76 61 6c  tag, prefix, val
9030: 75 65 20 46 52 4f 4d 20 6e 65 77 74 61 67 73 22  ue FROM newtags"
9040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9050: 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 70      " ORDER BY p
9060: 72 65 66 69 78 20 7c 7c 20 74 61 67 22 29 3b 0a  refix || tag");.
9070: 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74      while( db_st
9080: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52  ep(&q)==SQLITE_R
9090: 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  OW ){.      cons
90a0: 74 20 63 68 61 72 20 2a 7a 54 61 67 20 3d 20 64  t char *zTag = d
90b0: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
90c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 0);.      cons
90d0: 74 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 20  t char *zPrefix 
90e0: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
90f0: 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 63  (&q, 1);.      c
9100: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75  onst char *zValu
9110: 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  e = db_column_te
9120: 78 74 28 26 71 2c 20 32 29 3b 0a 20 20 20 20 20  xt(&q, 2);.     
9130: 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 20 20   nChng++;.      
9140: 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20 20  if( zValue ){.  
9150: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
9160: 64 66 28 26 63 74 72 6c 2c 20 22 54 20 25 73 25  df(&ctrl, "T %s%
9170: 46 20 25 73 20 25 46 5c 6e 22 2c 20 7a 50 72 65  F %s %F\n", zPre
9180: 66 69 78 2c 20 7a 54 61 67 2c 20 7a 55 75 69 64  fix, zTag, zUuid
9190: 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  , zValue);.     
91a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
91b0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 63 74  blob_appendf(&ct
91c0: 72 6c 2c 20 22 54 20 25 73 25 46 20 25 73 5c 6e  rl, "T %s%F %s\n
91d0: 22 2c 20 7a 50 72 65 66 69 78 2c 20 7a 54 61 67  ", zPrefix, zTag
91e0: 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 20 20  , zUuid);.      
91f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 66  }.    }.    db_f
9200: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20  inalize(&q);.   
9210: 20 69 66 28 20 6e 43 68 6e 67 3e 30 20 29 7b 0a   if( nChng>0 ){.
9220: 20 20 20 20 20 20 69 6e 74 20 6e 72 69 64 3b 0a        int nrid;.
9230: 20 20 20 20 20 20 42 6c 6f 62 20 63 6b 73 75 6d        Blob cksum
9240: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70  ;.      blob_app
9250: 65 6e 64 66 28 26 63 74 72 6c 2c 20 22 55 20 25  endf(&ctrl, "U %
9260: 46 5c 6e 22 2c 20 67 2e 7a 4c 6f 67 69 6e 29 3b  F\n", g.zLogin);
9270: 0a 20 20 20 20 20 20 6d 64 35 73 75 6d 5f 62 6c  .      md5sum_bl
9280: 6f 62 28 26 63 74 72 6c 2c 20 26 63 6b 73 75 6d  ob(&ctrl, &cksum
9290: 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  );.      blob_ap
92a0: 70 65 6e 64 66 28 26 63 74 72 6c 2c 20 22 5a 20  pendf(&ctrl, "Z 
92b0: 25 62 5c 6e 22 2c 20 26 63 6b 73 75 6d 29 3b 0a  %b\n", &cksum);.
92c0: 20 20 20 20 20 20 64 62 5f 62 65 67 69 6e 5f 74        db_begin_t
92d0: 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20  ransaction();.  
92e0: 20 20 20 20 67 2e 6d 61 72 6b 50 72 69 76 61 74      g.markPrivat
92f0: 65 20 3d 20 63 6f 6e 74 65 6e 74 5f 69 73 5f 70  e = content_is_p
9300: 72 69 76 61 74 65 28 72 69 64 29 3b 0a 20 20 20  rivate(rid);.   
9310: 20 20 20 6e 72 69 64 20 3d 20 63 6f 6e 74 65 6e     nrid = conten
9320: 74 5f 70 75 74 28 26 63 74 72 6c 2c 20 30 2c 20  t_put(&ctrl, 0, 
9330: 30 29 3b 0a 20 20 20 20 20 20 6d 61 6e 69 66 65  0);.      manife
9340: 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 28 6e 72 69  st_crosslink(nri
9350: 64 2c 20 26 63 74 72 6c 29 3b 0a 20 20 20 20 20  d, &ctrl);.     
9360: 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74   db_end_transact
9370: 69 6f 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ion(0);.    }.  
9380: 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 66 28    cgi_redirectf(
9390: 22 63 69 3f 6e 61 6d 65 3d 25 64 22 2c 20 72 69  "ci?name=%d", ri
93a0: 64 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 7a  d);.  }.  blob_z
93b0: 65 72 6f 28 26 63 6f 6d 6d 65 6e 74 29 3b 0a 20  ero(&comment);. 
93c0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 63 6f   blob_append(&co
93d0: 6d 6d 65 6e 74 2c 20 7a 4e 65 77 43 6f 6d 6d 65  mment, zNewComme
93e0: 6e 74 2c 20 2d 31 29 3b 0a 20 20 7a 55 75 69 64  nt, -1);.  zUuid
93f0: 5b 31 30 5d 20 3d 20 30 3b 0a 20 20 73 74 79 6c  [10] = 0;.  styl
9400: 65 5f 68 65 61 64 65 72 28 22 45 64 69 74 20 43  e_header("Edit C
9410: 68 65 63 6b 2d 69 6e 20 5b 25 73 5d 22 2c 20 7a  heck-in [%s]", z
9420: 55 75 69 64 29 3b 0a 20 20 69 66 28 20 50 28 22  Uuid);.  if( P("
9430: 70 72 65 76 69 65 77 22 29 20 29 7b 0a 20 20 20  preview") ){.   
9440: 20 42 6c 6f 62 20 73 75 66 66 69 78 3b 0a 20 20   Blob suffix;.  
9450: 20 20 69 6e 74 20 6e 54 61 67 20 3d 20 30 3b 0a    int nTag = 0;.
9460: 20 20 20 20 40 20 3c 62 3e 50 72 65 76 69 65 77      @ <b>Preview
9470: 3a 3c 2f 62 3e 0a 20 20 20 20 40 20 3c 62 6c 6f  :</b>.    @ <blo
9480: 63 6b 71 75 6f 74 65 3e 0a 20 20 20 20 40 20 3c  ckquote>.    @ <
9490: 74 61 62 6c 65 20 62 6f 72 64 65 72 3d 30 3e 0a  table border=0>.
94a0: 20 20 20 20 69 66 28 20 7a 4e 65 77 43 6f 6c 6f      if( zNewColo
94b0: 72 20 26 26 20 7a 4e 65 77 43 6f 6c 6f 72 5b 30  r && zNewColor[0
94c0: 5d 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 74 72  ] ){.      @ <tr
94d0: 3e 3c 74 64 20 62 67 63 6f 6c 6f 72 3d 22 25 68  ><td bgcolor="%h
94e0: 28 7a 4e 65 77 43 6f 6c 6f 72 29 22 3e 0a 20 20  (zNewColor)">.  
94f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40    }else{.      @
9500: 20 3c 74 72 3e 3c 74 64 3e 0a 20 20 20 20 7d 0a   <tr><td>.    }.
9510: 20 20 20 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74      wiki_convert
9520: 28 26 63 6f 6d 6d 65 6e 74 2c 20 30 2c 20 57 49  (&comment, 0, WI
9530: 4b 49 5f 49 4e 4c 49 4e 45 29 3b 0a 20 20 20 20  KI_INLINE);.    
9540: 62 6c 6f 62 5f 7a 65 72 6f 28 26 73 75 66 66 69  blob_zero(&suffi
9550: 78 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70  x);.    blob_app
9560: 65 6e 64 66 28 26 73 75 66 66 69 78 2c 20 22 28  endf(&suffix, "(
9570: 75 73 65 72 3a 20 25 68 22 2c 20 7a 4e 65 77 55  user: %h", zNewU
9580: 73 65 72 29 3b 0a 20 20 20 20 64 62 5f 70 72 65  ser);.    db_pre
9590: 70 61 72 65 28 26 71 2c 20 22 53 45 4c 45 43 54  pare(&q, "SELECT
95a0: 20 73 75 62 73 74 72 28 74 61 67 6e 61 6d 65 2c   substr(tagname,
95b0: 35 29 20 46 52 4f 4d 20 74 61 67 78 72 65 66 2c  5) FROM tagxref,
95c0: 20 74 61 67 22 0a 20 20 20 20 20 20 20 20 20 20   tag".          
95d0: 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
95e0: 20 74 61 67 6e 61 6d 65 20 47 4c 4f 42 20 27 73   tagname GLOB 's
95f0: 79 6d 2d 2a 27 20 41 4e 44 20 74 61 67 78 72 65  ym-*' AND tagxre
9600: 66 2e 72 69 64 3d 25 64 22 0a 20 20 20 20 20 20  f.rid=%d".      
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
9620: 20 41 4e 44 20 74 61 67 74 79 70 65 3e 31 20 41   AND tagtype>1 A
9630: 4e 44 20 74 61 67 2e 74 61 67 69 64 3d 74 61 67  ND tag.tagid=tag
9640: 78 72 65 66 2e 74 61 67 69 64 22 2c 0a 20 20 20  xref.tagid",.   
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 72 69 64 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  rid);.    while(
9670: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
9680: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
9690: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
96a0: 61 67 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  ag = db_column_t
96b0: 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20  ext(&q, 0);.    
96c0: 20 20 69 66 28 20 6e 54 61 67 3d 3d 30 20 29 7b    if( nTag==0 ){
96d0: 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  .        blob_ap
96e0: 70 65 6e 64 66 28 26 73 75 66 66 69 78 2c 20 22  pendf(&suffix, "
96f0: 2c 20 74 61 67 73 3a 20 25 68 22 2c 20 7a 54 61  , tags: %h", zTa
9700: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
9710: 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70  .        blob_ap
9720: 70 65 6e 64 66 28 26 73 75 66 66 69 78 2c 20 22  pendf(&suffix, "
9730: 2c 20 25 68 22 2c 20 7a 54 61 67 29 3b 0a 20 20  , %h", zTag);.  
9740: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 54 61 67      }.      nTag
9750: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ++;.    }.    db
9760: 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20  _finalize(&q);. 
9770: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
9780: 26 73 75 66 66 69 78 2c 20 22 29 22 29 3b 0a 20  &suffix, ")");. 
9790: 20 20 20 40 20 25 73 28 62 6c 6f 62 5f 73 74 72     @ %s(blob_str
97a0: 28 26 73 75 66 66 69 78 29 29 0a 20 20 20 20 40  (&suffix)).    @
97b0: 20 3c 2f 74 64 3e 3c 2f 74 72 3e 3c 2f 74 61 62   </td></tr></tab
97c0: 6c 65 3e 0a 20 20 20 20 40 20 3c 2f 62 6c 6f 63  le>.    @ </bloc
97d0: 6b 71 75 6f 74 65 3e 0a 20 20 20 20 40 20 3c 68  kquote>.    @ <h
97e0: 72 3e 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  r>.    blob_rese
97f0: 74 28 26 73 75 66 66 69 78 29 3b 0a 20 20 7d 0a  t(&suffix);.  }.
9800: 20 20 40 20 3c 70 3e 4d 61 6b 65 20 63 68 61 6e    @ <p>Make chan
9810: 67 65 73 20 74 6f 20 61 74 74 72 69 62 75 74 65  ges to attribute
9820: 73 20 6f 66 20 63 68 65 63 6b 2d 69 6e 0a 20 20  s of check-in.  
9830: 40 20 5b 3c 61 20 68 72 65 66 3d 22 63 69 3f 6e  @ [<a href="ci?n
9840: 61 6d 65 3d 25 64 28 72 69 64 29 22 3e 25 73 28  ame=%d(rid)">%s(
9850: 7a 55 75 69 64 29 3c 2f 61 3e 5d 3a 3c 2f 70 3e  zUuid)</a>]:</p>
9860: 0a 20 20 40 20 3c 66 6f 72 6d 20 61 63 74 69 6f  .  @ <form actio
9870: 6e 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  n="%s(g.zBaseURL
9880: 29 2f 63 69 5f 65 64 69 74 22 20 6d 65 74 68 6f  )/ci_edit" metho
9890: 64 3d 22 50 4f 53 54 22 3e 0a 20 20 6c 6f 67 69  d="POST">.  logi
98a0: 6e 5f 69 6e 73 65 72 74 5f 63 73 72 66 5f 73 65  n_insert_csrf_se
98b0: 63 72 65 74 28 29 3b 0a 20 20 40 20 3c 69 6e 70  cret();.  @ <inp
98c0: 75 74 20 74 79 70 65 3d 22 68 69 64 64 65 6e 22  ut type="hidden"
98d0: 20 6e 61 6d 65 3d 22 72 22 20 76 61 6c 75 65 3d   name="r" value=
98e0: 22 25 64 28 72 69 64 29 22 3e 0a 20 20 40 20 3c  "%d(rid)">.  @ <
98f0: 74 61 62 6c 65 20 62 6f 72 64 65 72 3d 22 30 22  table border="0"
9900: 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d 22 31 30   cellspacing="10
9910: 22 3e 0a 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20  ">..  @ <tr><td 
9920: 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 20 76 61  align="right" va
9930: 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c 62 3e 55 73  lign="top"><b>Us
9940: 65 72 3a 3c 2f 62 3e 3c 2f 74 64 3e 0a 20 20 40  er:</b></td>.  @
9950: 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70   <td valign="top
9960: 22 3e 0a 20 20 40 20 20 20 3c 69 6e 70 75 74 20  ">.  @   <input 
9970: 74 79 70 65 3d 22 74 65 78 74 22 20 6e 61 6d 65  type="text" name
9980: 3d 22 75 22 20 73 69 7a 65 3d 22 32 30 22 20 76  ="u" size="20" v
9990: 61 6c 75 65 3d 22 25 68 28 7a 4e 65 77 55 73 65  alue="%h(zNewUse
99a0: 72 29 22 3e 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f  r)">.  @ </td></
99b0: 74 72 3e 0a 0a 20 20 40 20 3c 74 72 3e 3c 74 64  tr>..  @ <tr><td
99c0: 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 22 20 76   align="right" v
99d0: 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c 62 3e 43  align="top"><b>C
99e0: 6f 6d 6d 65 6e 74 3a 3c 2f 62 3e 3c 2f 74 64 3e  omment:</b></td>
99f0: 0a 20 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d  .  @ <td valign=
9a00: 22 74 6f 70 22 3e 0a 20 20 40 20 3c 74 65 78 74  "top">.  @ <text
9a10: 61 72 65 61 20 6e 61 6d 65 3d 22 63 22 20 72 6f  area name="c" ro
9a20: 77 73 3d 22 31 30 22 20 63 6f 6c 73 3d 22 38 30  ws="10" cols="80
9a30: 22 3e 25 68 28 7a 4e 65 77 43 6f 6d 6d 65 6e 74  ">%h(zNewComment
9a40: 29 3c 2f 74 65 78 74 61 72 65 61 3e 0a 20 20 40  )</textarea>.  @
9a50: 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 0a 20 20 40   </td></tr>..  @
9a60: 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22   <tr><td align="
9a70: 72 69 67 68 74 22 20 76 61 6c 69 67 6e 3d 22 74  right" valign="t
9a80: 6f 70 22 3e 3c 62 3e 43 68 65 63 6b 2d 69 6e 20  op"><b>Check-in 
9a90: 54 69 6d 65 3a 3c 2f 62 3e 3c 2f 74 64 3e 0a 20  Time:</b></td>. 
9aa0: 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74   @ <td valign="t
9ab0: 6f 70 22 3e 0a 20 20 40 20 20 20 3c 69 6e 70 75  op">.  @   <inpu
9ac0: 74 20 74 79 70 65 3d 22 74 65 78 74 22 20 6e 61  t type="text" na
9ad0: 6d 65 3d 22 64 74 22 20 73 69 7a 65 3d 22 32 30  me="dt" size="20
9ae0: 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 4e 65 77  " value="%h(zNew
9af0: 44 61 74 65 29 22 3e 0a 20 20 40 20 3c 2f 74 64  Date)">.  @ </td
9b00: 3e 3c 2f 74 72 3e 0a 0a 20 20 40 20 3c 74 72 3e  ></tr>..  @ <tr>
9b10: 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 67 68 74  <td align="right
9b20: 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c  " valign="top"><
9b30: 62 3e 42 61 63 6b 67 72 6f 75 6e 64 20 43 6f 6c  b>Background Col
9b40: 6f 72 3a 3c 2f 62 3e 3c 2f 74 64 3e 0a 20 20 40  or:</b></td>.  @
9b50: 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70   <td valign="top
9b60: 22 3e 0a 20 20 40 20 3c 74 61 62 6c 65 20 62 6f  ">.  @ <table bo
9b70: 72 64 65 72 3d 30 20 63 65 6c 6c 70 61 64 64 69  rder=0 cellpaddi
9b80: 6e 67 3d 30 20 63 65 6c 6c 73 70 61 63 69 6e 67  ng=0 cellspacing
9b90: 3d 31 3e 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20  =1>.  @ <tr><td 
9ba0: 63 6f 6c 73 70 61 6e 3d 22 36 22 20 61 6c 69 67  colspan="6" alig
9bb0: 6e 3d 22 6c 65 66 74 22 3e 0a 20 20 69 66 28 20  n="left">.  if( 
9bc0: 66 50 72 6f 70 61 67 61 74 65 43 6f 6c 6f 72 20  fPropagateColor 
9bd0: 29 7b 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20  ){.    @ <input 
9be0: 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20  type="checkbox" 
9bf0: 6e 61 6d 65 3d 22 70 63 6c 72 22 20 63 68 65 63  name="pclr" chec
9c00: 6b 65 64 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ked>.  }else{.  
9c10: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
9c20: 22 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d  "checkbox" name=
9c30: 22 70 63 6c 72 22 3e 0a 20 20 7d 0a 20 20 40 20  "pclr">.  }.  @ 
9c40: 50 72 6f 70 61 67 61 74 65 20 63 6f 6c 6f 72 20  Propagate color 
9c50: 74 6f 20 64 65 73 63 65 6e 64 61 6e 74 73 3c 2f  to descendants</
9c60: 69 6e 70 75 74 3e 3c 2f 74 64 3e 3c 2f 74 72 3e  input></td></tr>
9c70: 0a 20 20 40 20 3c 74 72 3e 0a 20 20 66 6f 72 28  .  @ <tr>.  for(
9c80: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 6f 72 3b 20 69  i=0; i<nColor; i
9c90: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 43 6f  ++){.    if( aCo
9ca0: 6c 6f 72 5b 69 5d 2e 7a 43 6f 6c 6f 72 5b 30 5d  lor[i].zColor[0]
9cb0: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 74 64 20   ){.      @ <td 
9cc0: 62 67 63 6f 6c 6f 72 3d 22 25 68 28 61 43 6f 6c  bgcolor="%h(aCol
9cd0: 6f 72 5b 69 5d 2e 7a 43 6f 6c 6f 72 29 22 3e 0a  or[i].zColor)">.
9ce0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9cf0: 20 40 20 3c 74 64 3e 0a 20 20 20 20 7d 0a 20 20   @ <td>.    }.  
9d00: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 65    if( strcmp(zNe
9d10: 77 43 6f 6c 6f 72 2c 20 61 43 6f 6c 6f 72 5b 69  wColor, aColor[i
9d20: 5d 2e 7a 43 6f 6c 6f 72 29 3d 3d 30 20 29 7b 0a  ].zColor)==0 ){.
9d30: 20 20 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74        @ <input t
9d40: 79 70 65 3d 22 72 61 64 69 6f 22 20 6e 61 6d 65  ype="radio" name
9d50: 3d 22 63 6c 72 22 20 76 61 6c 75 65 3d 22 25 68  ="clr" value="%h
9d60: 28 61 43 6f 6c 6f 72 5b 69 5d 2e 7a 43 6f 6c 6f  (aColor[i].zColo
9d70: 72 29 22 20 63 68 65 63 6b 65 64 3e 0a 20 20 20  r)" checked>.   
9d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20   }else{.      @ 
9d90: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 72 61 64  <input type="rad
9da0: 69 6f 22 20 6e 61 6d 65 3d 22 63 6c 72 22 20 76  io" name="clr" v
9db0: 61 6c 75 65 3d 22 25 68 28 61 43 6f 6c 6f 72 5b  alue="%h(aColor[
9dc0: 69 5d 2e 7a 43 6f 6c 6f 72 29 22 3e 0a 20 20 20  i].zColor)">.   
9dd0: 20 7d 0a 20 20 20 20 40 20 25 68 28 61 43 6f 6c   }.    @ %h(aCol
9de0: 6f 72 5b 69 5d 2e 7a 43 4e 61 6d 65 29 3c 2f 69  or[i].zCName)</i
9df0: 6e 70 75 74 3e 3c 2f 74 64 3e 0a 20 20 20 20 69  nput></td>.    i
9e00: 66 28 20 28 69 25 36 29 3d 3d 35 20 26 26 20 69  f( (i%6)==5 && i
9e10: 2b 31 3c 6e 43 6f 6c 6f 72 20 29 7b 0a 20 20 20  +1<nColor ){.   
9e20: 20 20 20 40 20 3c 2f 74 72 3e 3c 74 72 3e 0a 20     @ </tr><tr>. 
9e30: 20 20 20 7d 0a 20 20 7d 0a 20 20 40 20 3c 2f 74     }.  }.  @ </t
9e40: 72 3e 0a 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a  r>.  @ </table>.
9e50: 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 0a    @ </td></tr>..
9e60: 20 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67    @ <tr><td alig
9e70: 6e 3d 22 72 69 67 68 74 22 20 76 61 6c 69 67 6e  n="right" valign
9e80: 3d 22 74 6f 70 22 3e 3c 62 3e 54 61 67 73 3a 3c  ="top"><b>Tags:<
9e90: 2f 62 3e 3c 2f 74 64 3e 0a 20 20 40 20 3c 74 64  /b></td>.  @ <td
9ea0: 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20   valign="top">. 
9eb0: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
9ec0: 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22  checkbox" name="
9ed0: 6e 65 77 74 61 67 22 25 73 28 7a 4e 65 77 54 61  newtag"%s(zNewTa
9ee0: 67 46 6c 61 67 29 3e 0a 20 20 40 20 41 64 64 20  gFlag)>.  @ Add 
9ef0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  the following ne
9f00: 77 20 74 61 67 20 6e 61 6d 65 20 74 6f 20 74 68  w tag name to th
9f10: 69 73 20 63 68 65 63 6b 2d 69 6e 3a 0a 20 20 40  is check-in:.  @
9f20: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65   <input type="te
9f30: 78 74 22 20 77 69 64 74 68 3d 22 31 35 22 20 6e  xt" width="15" n
9f40: 61 6d 65 3d 22 74 61 67 6e 61 6d 65 22 20 76 61  ame="tagname" va
9f50: 6c 75 65 3d 22 25 68 28 7a 4e 65 77 54 61 67 29  lue="%h(zNewTag)
9f60: 22 3e 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28  ">.  db_prepare(
9f70: 26 71 2c 0a 20 20 20 20 20 22 53 45 4c 45 43 54  &q,.     "SELECT
9f80: 20 74 61 67 2e 74 61 67 69 64 2c 20 74 61 67 6e   tag.tagid, tagn
9f90: 61 6d 65 20 46 52 4f 4d 20 74 61 67 78 72 65 66  ame FROM tagxref
9fa0: 2c 20 74 61 67 22 0a 20 20 20 20 20 22 20 57 48  , tag".     " WH
9fb0: 45 52 45 20 74 61 67 78 72 65 66 2e 72 69 64 3d  ERE tagxref.rid=
9fc0: 25 64 20 41 4e 44 20 74 61 67 74 79 70 65 3e 30  %d AND tagtype>0
9fd0: 20 41 4e 44 20 74 61 67 78 72 65 66 2e 74 61 67   AND tagxref.tag
9fe0: 69 64 3d 74 61 67 2e 74 61 67 69 64 22 0a 20 20  id=tag.tagid".  
9ff0: 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 43 41     " ORDER BY CA
a000: 53 45 20 57 48 45 4e 20 74 61 67 6e 61 6d 65 20  SE WHEN tagname 
a010: 47 4c 4f 42 20 27 73 79 6d 2d 2a 27 20 54 48 45  GLOB 'sym-*' THE
a020: 4e 20 73 75 62 73 74 72 28 74 61 67 6e 61 6d 65  N substr(tagname
a030: 2c 35 29 22 0a 20 20 20 20 20 22 20 20 20 20 20  ,5)".     "     
a040: 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20 74            ELSE t
a050: 61 67 6e 61 6d 65 20 45 4e 44 22 2c 0a 20 20 20  agname END",.   
a060: 20 20 72 69 64 0a 20 20 29 3b 0a 20 20 77 68 69    rid.  );.  whi
a070: 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d  le( db_step(&q)=
a080: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
a090: 20 20 20 69 6e 74 20 74 61 67 69 64 20 3d 20 64     int tagid = d
a0a0: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c  b_column_int(&q,
a0b0: 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   0);.    const c
a0c0: 68 61 72 20 2a 7a 54 61 67 4e 61 6d 65 20 3d 20  har *zTagName = 
a0d0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
a0e0: 71 2c 20 31 29 3b 0a 20 20 20 20 63 68 61 72 20  q, 1);.    char 
a0f0: 7a 4c 61 62 65 6c 5b 33 30 5d 3b 0a 20 20 20 20  zLabel[30];.    
a100: 73 70 72 69 6e 74 66 28 7a 4c 61 62 65 6c 2c 20  sprintf(zLabel, 
a110: 22 63 25 64 22 2c 20 74 61 67 69 64 29 3b 0a 20  "c%d", tagid);. 
a120: 20 20 20 69 66 28 20 50 28 7a 4c 61 62 65 6c 29     if( P(zLabel)
a130: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 62 72 3e   ){.      @ <br>
a140: 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65  <input type="che
a150: 63 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 63 25 64  ckbox" name="c%d
a160: 28 74 61 67 69 64 29 22 20 63 68 65 63 6b 65 64  (tagid)" checked
a170: 3e 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  >.    }else{.   
a180: 20 20 20 40 20 3c 62 72 3e 3c 69 6e 70 75 74 20     @ <br><input 
a190: 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22 20  type="checkbox" 
a1a0: 6e 61 6d 65 3d 22 63 25 64 28 74 61 67 69 64 29  name="c%d(tagid)
a1b0: 22 3e 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ">.    }.    if(
a1c0: 20 73 74 72 6e 63 6d 70 28 7a 54 61 67 4e 61 6d   strncmp(zTagNam
a1d0: 65 2c 20 22 73 79 6d 2d 22 2c 20 34 29 3d 3d 30  e, "sym-", 4)==0
a1e0: 20 29 7b 0a 20 20 20 20 20 20 40 20 43 61 6e 63   ){.      @ Canc
a1f0: 65 6c 20 74 61 67 20 3c 62 3e 25 68 28 26 7a 54  el tag <b>%h(&zT
a200: 61 67 4e 61 6d 65 5b 34 5d 29 3c 2f 62 3e 0a 20  agName[4])</b>. 
a210: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a220: 40 20 43 61 6e 63 65 6c 20 73 70 65 63 69 61 6c  @ Cancel special
a230: 20 74 61 67 20 3c 62 3e 25 68 28 7a 54 61 67 4e   tag <b>%h(zTagN
a240: 61 6d 65 29 3c 2f 62 3e 0a 20 20 20 20 7d 0a 20  ame)</b>.    }. 
a250: 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65   }.  db_finalize
a260: 28 26 71 29 3b 0a 20 20 40 20 3c 2f 74 64 3e 3c  (&q);.  @ </td><
a270: 2f 74 72 3e 0a 0a 20 20 69 66 28 20 64 62 5f 65  /tr>..  if( db_e
a280: 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 20  xists("SELECT 1 
a290: 46 52 4f 4d 20 74 61 67 78 72 65 66 20 57 48 45  FROM tagxref WHE
a2a0: 52 45 20 72 69 64 3d 25 64 20 41 4e 44 20 74 61  RE rid=%d AND ta
a2b0: 67 69 64 3d 25 64 20 41 4e 44 20 73 72 63 69 64  gid=%d AND srcid
a2c0: 3e 30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >0",.           
a2d0: 20 20 20 20 20 72 69 64 2c 20 54 41 47 5f 42 52       rid, TAG_BR
a2e0: 41 4e 43 48 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ANCH)==0 ){.    
a2f0: 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d  @ <tr><td align=
a300: 22 72 69 67 68 74 22 20 76 61 6c 69 67 6e 3d 22  "right" valign="
a310: 74 6f 70 22 3e 3c 62 3e 42 72 61 6e 63 68 69 6e  top"><b>Branchin
a320: 67 3a 3c 2f 62 3e 3c 2f 74 64 3e 0a 20 20 20 20  g:</b></td>.    
a330: 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f  @ <td valign="to
a340: 70 22 3e 0a 20 20 20 20 40 20 3c 69 6e 70 75 74  p">.    @ <input
a350: 20 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78 22   type="checkbox"
a360: 20 6e 61 6d 65 3d 22 6e 65 77 62 72 22 25 73 28   name="newbr"%s(
a370: 7a 4e 65 77 42 72 46 6c 61 67 29 3e 0a 20 20 20  zNewBrFlag)>.   
a380: 20 40 20 4d 61 6b 65 20 74 68 69 73 20 63 68 65   @ Make this che
a390: 63 6b 2d 69 6e 20 74 68 65 20 73 74 61 72 74 20  ck-in the start 
a3a0: 6f 66 20 61 20 6e 65 77 20 62 72 61 6e 63 68 20  of a new branch 
a3b0: 6e 61 6d 65 64 3a 0a 20 20 20 20 40 20 3c 69 6e  named:.    @ <in
a3c0: 70 75 74 20 74 79 70 65 3d 22 74 65 78 74 22 20  put type="text" 
a3d0: 77 69 64 74 68 3d 22 31 35 22 20 6e 61 6d 65 3d  width="15" name=
a3e0: 22 62 72 6e 61 6d 65 22 20 76 61 6c 75 65 3d 22  "brname" value="
a3f0: 25 68 28 7a 4e 65 77 42 72 61 6e 63 68 29 22 3e  %h(zNewBranch)">
a400: 0a 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72  .    @ </td></tr
a410: 3e 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 5f  >.  }..  if( is_
a420: 61 5f 6c 65 61 66 28 72 69 64 29 0a 20 20 20 26  a_leaf(rid).   &
a430: 26 20 21 64 62 5f 65 78 69 73 74 73 28 22 53 45  & !db_exists("SE
a440: 4c 45 43 54 20 31 20 46 52 4f 4d 20 74 61 67 78  LECT 1 FROM tagx
a450: 72 65 66 20 22 0a 20 20 20 20 20 20 20 20 20 20  ref ".          
a460: 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74         " WHERE t
a470: 61 67 69 64 3d 25 64 20 41 4e 44 20 72 69 64 3d  agid=%d AND rid=
a480: 25 64 20 41 4e 44 20 74 61 67 74 79 70 65 3e 30  %d AND tagtype>0
a490: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
a4a0: 20 20 20 20 54 41 47 5f 43 4c 4f 53 45 44 2c 20      TAG_CLOSED, 
a4b0: 72 69 64 29 0a 20 20 29 7b 0a 20 20 20 20 40 20  rid).  ){.    @ 
a4c0: 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 72  <tr><td align="r
a4d0: 69 67 68 74 22 20 76 61 6c 69 67 6e 3d 22 74 6f  ight" valign="to
a4e0: 70 22 3e 3c 62 3e 4c 65 61 66 20 43 6c 6f 73 75  p"><b>Leaf Closu
a4f0: 72 65 3a 3c 2f 62 3e 3c 2f 74 64 3e 0a 20 20 20  re:</b></td>.   
a500: 20 40 20 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74   @ <td valign="t
a510: 6f 70 22 3e 0a 20 20 20 20 40 20 3c 69 6e 70 75  op">.    @ <inpu
a520: 74 20 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78  t type="checkbox
a530: 22 20 6e 61 6d 65 3d 22 63 6c 6f 73 65 22 25 73  " name="close"%s
a540: 28 7a 43 6c 6f 73 65 46 6c 61 67 29 3e 0a 20 20  (zCloseFlag)>.  
a550: 20 20 40 20 4d 61 72 6b 20 74 68 69 73 20 6c 65    @ Mark this le
a560: 61 66 20 61 73 20 22 63 6c 6f 73 65 64 22 20 73  af as "closed" s
a570: 6f 20 74 68 61 74 20 69 74 20 6e 6f 20 6c 6f 6e  o that it no lon
a580: 67 65 72 20 61 70 70 65 61 72 73 20 6f 6e 20 74  ger appears on t
a590: 68 65 0a 20 20 20 20 40 20 22 6c 65 61 76 65 73  he.    @ "leaves
a5a0: 22 20 70 61 67 65 20 61 6e 64 20 69 73 20 6e 6f  " page and is no
a5b0: 20 6c 6f 6e 67 65 72 20 6c 61 62 65 6c 65 64 20   longer labeled 
a5c0: 61 73 20 61 20 22 3c 62 3e 4c 65 61 66 3c 2f 62  as a "<b>Leaf</b
a5d0: 3e 22 2e 0a 20 20 20 20 40 20 3c 2f 74 64 3e 3c  >"..    @ </td><
a5e0: 2f 74 72 3e 0a 20 20 7d 0a 0a 0a 20 20 40 20 3c  /tr>.  }...  @ <
a5f0: 74 72 3e 3c 74 64 20 63 6f 6c 73 70 61 6e 3d 22  tr><td colspan="
a600: 32 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20 74  2">.  @ <input t
a610: 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61 6d  ype="submit" nam
a620: 65 3d 22 70 72 65 76 69 65 77 22 20 76 61 6c 75  e="preview" valu
a630: 65 3d 22 50 72 65 76 69 65 77 22 3e 0a 20 20 40  e="Preview">.  @
a640: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 73 75   <input type="su
a650: 62 6d 69 74 22 20 6e 61 6d 65 3d 22 61 70 70 6c  bmit" name="appl
a660: 79 22 20 76 61 6c 75 65 3d 22 41 70 70 6c 79 20  y" value="Apply 
a670: 43 68 61 6e 67 65 73 22 3e 0a 20 20 40 20 3c 69  Changes">.  @ <i
a680: 6e 70 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69  nput type="submi
a690: 74 22 20 6e 61 6d 65 3d 22 63 61 6e 63 65 6c 22  t" name="cancel"
a6a0: 20 76 61 6c 75 65 3d 22 43 61 6e 63 65 6c 22 3e   value="Cancel">
a6b0: 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a  .  @ </td></tr>.
a6c0: 20 20 40 20 3c 2f 74 61 62 6c 65 3e 0a 20 20 40    @ </table>.  @
a6d0: 20 3c 2f 66 6f 72 6d 3e 0a 20 20 73 74 79 6c 65   </form>.  style
a6e0: 5f 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a           _footer();.}.