Hex Artifact Content
Not logged in

Artifact dd6de258e10c1c22b175d2ee17ede01443f52e64:

File src/info.c part of check-in [d5695157d0] - Deal with windows filename aliasing in the "all" command. Ticket 974618fe5a8. Also display the home directory for windows users with the "info" command since the home directory is non-obvious in windows. by drh on 2009-11-11 16:21:19.

0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74   contains code t
0380: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
0390: 22 69 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 20  "info" command. 
03a0: 20 54 68 65 0a 2a 2a 20 22 69 6e 66 6f 22 20 63   The.** "info" c
03b0: 6f 6d 6d 61 6e 64 20 67 69 76 65 73 20 63 6f 6d  ommand gives com
03c0: 6d 61 6e 64 2d 6c 69 6e 65 20 61 63 63 65 73 73  mand-line access
03d0: 20 74 6f 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   to information 
03e0: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 75 72  about.** the cur
03f0: 72 65 6e 74 20 74 72 65 65 2c 20 6f 72 20 61 20  rent tree, or a 
0400: 70 61 72 74 69 63 75 6c 61 72 20 61 72 74 69 66  particular artif
0410: 61 63 74 20 6f 72 20 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 6e 61 6d 65 3a 20 25 73 5c 6e 22 2c 20 64 62  -name: %s\n", db
0ea0: 5f 67 65 74 28 22 70 72 6f 6a 65 63 74 2d 6e 61  _get("project-na
0eb0: 6d 65 22 2c 20 22 3c 75 6e 6e 61 6d 65 64 3e 22  me", "<unnamed>"
0ec0: 29 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  ));.    printf("
0ed0: 70 72 6f 6a 65 63 74 2d 63 6f 64 65 3a 20 25 73  project-code: %s
0ee0: 5c 6e 22 2c 20 64 62 5f 67 65 74 28 22 70 72 6f  \n", db_get("pro
0ef0: 6a 65 63 74 2d 63 6f 64 65 22 2c 20 22 3c 6e 6f  ject-code", "<no
0f00: 6e 65 3e 22 29 29 3b 0a 20 20 20 20 70 72 69 6e  ne>"));.    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 70 72 6f 6a 65 63 74 2d  printf("project-
0ff0: 6e 61 6d 65 3a 20 25 73 5c 6e 22 2c 20 64 62 5f  name: %s\n", db_
1000: 67 65 74 28 22 70 72 6f 6a 65 63 74 2d 6e 61 6d  get("project-nam
1010: 65 22 2c 20 22 3c 75 6e 6e 61 6d 65 64 3e 22 29  e", "<unnamed>")
1020: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 72  );.    printf("r
1030: 65 70 6f 73 69 74 6f 72 79 3a 20 20 20 25 73 5c  epository:   %s\
1040: 6e 22 2c 20 64 62 5f 6c 67 65 74 28 22 72 65 70  n", db_lget("rep
1050: 6f 73 69 74 6f 72 79 22 2c 20 22 22 29 29 3b 0a  ository", ""));.
1060: 20 20 20 20 70 72 69 6e 74 66 28 22 6c 6f 63 61      printf("loca
1070: 6c 2d 72 6f 6f 74 3a 20 20 20 25 73 5c 6e 22 2c  l-root:   %s\n",
1080: 20 67 2e 7a 4c 6f 63 61 6c 52 6f 6f 74 29 3b 0a   g.zLocalRoot);.
1090: 23 69 66 64 65 66 20 5f 5f 4d 49 4e 47 57 33 32  #ifdef __MINGW32
10a0: 5f 5f 0a 20 20 20 20 69 66 28 20 67 2e 7a 48 6f  __.    if( g.zHo
10b0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e  me ){.      prin
10c0: 74 66 28 22 75 73 65 72 2d 68 6f 6d 65 3a 20 20  tf("user-home:  
10d0: 3a 20 25 73 5c 6e 22 2c 20 67 2e 7a 48 6f 6d 65  : %s\n", g.zHome
10e0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
10f0: 20 20 20 20 70 72 69 6e 74 66 28 22 70 72 6f 6a      printf("proj
1100: 65 63 74 2d 63 6f 64 65 3a 20 25 73 5c 6e 22 2c  ect-code: %s\n",
1110: 20 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 63 74   db_get("project
1120: 2d 63 6f 64 65 22 2c 20 22 22 29 29 3b 0a 20 20  -code", ""));.  
1130: 20 20 70 72 69 6e 74 66 28 22 73 65 72 76 65 72    printf("server
1140: 2d 63 6f 64 65 3a 20 20 25 73 5c 6e 22 2c 20 64  -code:  %s\n", d
1150: 62 5f 67 65 74 28 22 73 65 72 76 65 72 2d 63 6f  b_get("server-co
1160: 64 65 22 2c 20 22 22 29 29 3b 0a 20 20 20 20 76  de", ""));.    v
1170: 69 64 20 3d 20 64 62 5f 6c 67 65 74 5f 69 6e 74  id = db_lget_int
1180: 28 22 63 68 65 63 6b 6f 75 74 22 2c 20 30 29 3b  ("checkout", 0);
1190: 0a 20 20 20 20 69 66 28 20 76 69 64 3d 3d 30 20  .    if( vid==0 
11a0: 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ){.      printf(
11b0: 22 63 68 65 63 6b 6f 75 74 3a 20 20 20 20 20 6e  "checkout:     n
11c0: 69 6c 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73  il\n");.    }els
11d0: 65 7b 0a 20 20 20 20 20 20 73 68 6f 77 5f 63 6f  e{.      show_co
11e0: 6d 6d 6f 6e 5f 69 6e 66 6f 28 76 69 64 2c 20 22  mmon_info(vid, "
11f0: 63 68 65 63 6b 6f 75 74 3a 22 2c 20 31 29 3b 0a  checkout:", 1);.
1200: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1210: 20 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 20 20     int rid;.    
1220: 72 69 64 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69  rid = name_to_ri
1230: 64 28 67 2e 61 72 67 76 5b 32 5d 29 3b 0a 20 20  d(g.argv[2]);.  
1240: 20 20 69 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a    if( rid==0 ){.
1250: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e        fossil_pan
1260: 69 63 28 22 6e 6f 20 73 75 63 68 20 6f 62 6a 65  ic("no such obje
1270: 63 74 3a 20 25 73 5c 6e 22 2c 20 67 2e 61 72 67  ct: %s\n", g.arg
1280: 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  v[2]);.    }.   
1290: 20 73 68 6f 77 5f 63 6f 6d 6d 6f 6e 5f 69 6e 66   show_common_inf
12a0: 6f 28 72 69 64 2c 20 22 75 75 69 64 3a 22 2c 20  o(rid, "uuid:", 
12b0: 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
12c0: 20 53 68 6f 77 20 69 6e 66 6f 72 6d 61 74 69 6f   Show informatio
12d0: 6e 20 61 62 6f 75 74 20 61 6c 6c 20 74 61 67 73  n about all tags
12e0: 20 6f 6e 20 61 20 67 69 76 65 6e 20 6e 6f 64 65   on a given node
12f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1300: 20 73 68 6f 77 54 61 67 73 28 69 6e 74 20 72 69   showTags(int ri
1310: 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
1320: 4e 6f 74 47 6c 6f 62 29 7b 0a 20 20 53 74 6d 74  NotGlob){.  Stmt
1330: 20 71 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20   q;.  int cnt = 
1340: 30 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28  0;.  db_prepare(
1350: 26 71 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20  &q,.    "SELECT 
1360: 74 61 67 2e 74 61 67 69 64 2c 20 74 61 67 6e 61  tag.tagid, tagna
1370: 6d 65 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20  me, ".    "     
1380: 20 20 28 53 45 4c 45 43 54 20 75 75 69 64 20 46    (SELECT uuid F
1390: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72  ROM blob WHERE r
13a0: 69 64 3d 74 61 67 78 72 65 66 2e 73 72 63 69 64  id=tagxref.srcid
13b0: 20 41 4e 44 20 72 69 64 21 3d 25 64 29 2c 22 0a   AND rid!=%d),".
13c0: 20 20 20 20 22 20 20 20 20 20 20 20 76 61 6c 75      "       valu
13d0: 65 2c 20 64 61 74 65 74 69 6d 65 28 74 61 67 78  e, datetime(tagx
13e0: 72 65 66 2e 6d 74 69 6d 65 2c 27 6c 6f 63 61 6c  ref.mtime,'local
13f0: 74 69 6d 65 27 29 2c 20 74 61 67 74 79 70 65 2c  time'), tagtype,
1400: 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 28 53  ".    "       (S
1410: 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20  ELECT uuid FROM 
1420: 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 74  blob WHERE rid=t
1430: 61 67 78 72 65 66 2e 6f 72 69 67 69 64 20 41 4e  agxref.origid AN
1440: 44 20 72 69 64 21 3d 25 64 29 22 0a 20 20 20 20  D rid!=%d)".    
1450: 22 20 20 46 52 4f 4d 20 74 61 67 78 72 65 66 20  "  FROM tagxref 
1460: 4a 4f 49 4e 20 74 61 67 20 4f 4e 20 74 61 67 78  JOIN tag ON tagx
1470: 72 65 66 2e 74 61 67 69 64 3d 74 61 67 2e 74 61  ref.tagid=tag.ta
1480: 67 69 64 22 0a 20 20 20 20 22 20 57 48 45 52 45  gid".    " WHERE
1490: 20 74 61 67 78 72 65 66 2e 72 69 64 3d 25 64 20   tagxref.rid=%d 
14a0: 41 4e 44 20 74 61 67 6e 61 6d 65 20 4e 4f 54 20  AND tagname NOT 
14b0: 47 4c 4f 42 20 27 25 73 27 22 0a 20 20 20 20 22  GLOB '%s'".    "
14c0: 20 4f 52 44 45 52 20 42 59 20 74 61 67 6e 61 6d   ORDER BY tagnam
14d0: 65 22 2c 20 72 69 64 2c 20 72 69 64 2c 20 72 69  e", rid, rid, ri
14e0: 64 2c 20 7a 4e 6f 74 47 6c 6f 62 0a 20 20 29 3b  d, zNotGlob.  );
14f0: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
1500: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
1510: 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  W ){.    const c
1520: 68 61 72 20 2a 7a 54 61 67 6e 61 6d 65 20 3d 20  har *zTagname = 
1530: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
1540: 71 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74  q, 1);.    const
1550: 20 63 68 61 72 20 2a 7a 53 72 63 55 75 69 64 20   char *zSrcUuid 
1560: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
1570: 28 26 71 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e  (&q, 2);.    con
1580: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 20  st char *zValue 
1590: 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  = db_column_text
15a0: 28 26 71 2c 20 33 29 3b 0a 20 20 20 20 63 6f 6e  (&q, 3);.    con
15b0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65 20 3d  st char *zDate =
15c0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
15d0: 26 71 2c 20 34 29 3b 0a 20 20 20 20 69 6e 74 20  &q, 4);.    int 
15e0: 74 61 67 74 79 70 65 20 3d 20 64 62 5f 63 6f 6c  tagtype = db_col
15f0: 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 35 29 3b 0a  umn_int(&q, 5);.
1600: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1610: 7a 4f 72 69 67 55 75 69 64 20 3d 20 64 62 5f 63  zOrigUuid = db_c
1620: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 36  olumn_text(&q, 6
1630: 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  );.    cnt++;.  
1640: 20 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a    if( cnt==1 ){.
1650: 20 20 20 20 20 20 40 20 3c 64 69 76 20 63 6c 61        @ <div cla
1660: 73 73 3d 22 73 65 63 74 69 6f 6e 22 3e 54 61 67  ss="section">Tag
1670: 73 20 41 6e 64 20 50 72 6f 70 65 72 74 69 65 73  s And Properties
1680: 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20 40 20 3c  </div>.      @ <
1690: 75 6c 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40 20  ul>.    }.    @ 
16a0: 3c 6c 69 3e 0a 20 20 20 20 69 66 28 20 74 61 67  <li>.    if( tag
16b0: 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
16c0: 20 40 20 3c 62 3e 3c 73 3e 25 68 28 7a 54 61 67   @ <b><s>%h(zTag
16d0: 6e 61 6d 65 29 3c 2f 73 3e 3c 2f 62 3e 20 63 61  name)</s></b> ca
16e0: 6e 63 65 6c 6c 65 64 0a 20 20 20 20 7d 65 6c 73  ncelled.    }els
16f0: 65 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a  e if( zValue ){.
1700: 20 20 20 20 20 20 40 20 3c 62 3e 25 68 28 7a 54        @ <b>%h(zT
1710: 61 67 6e 61 6d 65 29 3d 25 68 28 7a 56 61 6c 75  agname)=%h(zValu
1720: 65 29 3c 2f 62 3e 0a 20 20 20 20 7d 65 6c 73 65  e)</b>.    }else
1730: 20 7b 0a 20 20 20 20 20 20 40 20 3c 62 3e 25 68   {.      @ <b>%h
1740: 28 7a 54 61 67 6e 61 6d 65 29 3c 2f 62 3e 0a 20  (zTagname)</b>. 
1750: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 61 67     }.    if( tag
1760: 74 79 70 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20  type==2 ){.     
1770: 20 69 66 28 20 7a 4f 72 69 67 55 75 69 64 20 26   if( zOrigUuid &
1780: 26 20 7a 4f 72 69 67 55 75 69 64 5b 30 5d 20 29  & zOrigUuid[0] )
1790: 7b 0a 20 20 20 20 20 20 20 20 40 20 69 6e 68 65  {.        @ inhe
17a0: 72 69 74 65 64 20 66 72 6f 6d 0a 20 20 20 20 20  rited from.     
17b0: 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f     hyperlink_to_
17c0: 75 75 69 64 28 7a 4f 72 69 67 55 75 69 64 29 3b  uuid(zOrigUuid);
17d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17e0: 20 20 20 20 20 20 40 20 70 72 6f 70 61 67 61 74        @ propagat
17f0: 65 73 20 74 6f 20 64 65 73 63 65 6e 64 61 6e 74  es to descendant
1800: 73 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  s.      }.    }.
1810: 20 20 20 20 69 66 28 20 7a 53 72 63 55 75 69 64      if( zSrcUuid
1820: 20 26 26 20 7a 53 72 63 55 75 69 64 5b 30 5d 20   && zSrcUuid[0] 
1830: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74 61 67  ){.      if( tag
1840: 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
1850: 20 20 20 40 20 62 79 0a 20 20 20 20 20 20 7d 65     @ by.      }e
1860: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 40 20 61  lse{.        @ a
1870: 64 64 65 64 20 62 79 0a 20 20 20 20 20 20 7d 0a  dded by.      }.
1880: 20 20 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f        hyperlink_
1890: 74 6f 5f 75 75 69 64 28 7a 53 72 63 55 75 69 64  to_uuid(zSrcUuid
18a0: 29 3b 0a 20 20 20 20 20 20 40 20 6f 6e 0a 20 20  );.      @ on.  
18b0: 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f      hyperlink_to
18c0: 5f 64 61 74 65 28 7a 44 61 74 65 2c 30 29 3b 0a  _date(zDate,0);.
18d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 66      }.  }.  db_f
18e0: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 69  inalize(&q);.  i
18f0: 66 28 20 63 6e 74 20 29 7b 0a 20 20 20 20 40 20  f( cnt ){.    @ 
1900: 3c 2f 75 6c 3e 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  </ul>.  }.}.../*
1910: 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68 65 20 64  .** Append the d
1920: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
1930: 6e 20 74 77 6f 20 52 49 44 73 20 74 6f 20 74 68  n two RIDs to th
1940: 65 20 6f 75 74 70 75 74 0a 2a 2f 0a 73 74 61 74  e output.*/.stat
1950: 69 63 20 76 6f 69 64 20 61 70 70 65 6e 64 5f 64  ic void append_d
1960: 69 66 66 28 69 6e 74 20 66 72 6f 6d 69 64 2c 20  iff(int fromid, 
1970: 69 6e 74 20 74 6f 69 64 29 7b 0a 20 20 42 6c 6f  int toid){.  Blo
1980: 62 20 66 72 6f 6d 2c 20 74 6f 2c 20 6f 75 74 3b  b from, to, out;
1990: 0a 20 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 66  .  content_get(f
19a0: 72 6f 6d 69 64 2c 20 26 66 72 6f 6d 29 3b 0a 20  romid, &from);. 
19b0: 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 74 6f 69   content_get(toi
19c0: 64 2c 20 26 74 6f 29 3b 0a 20 20 62 6c 6f 62 5f  d, &to);.  blob_
19d0: 7a 65 72 6f 28 26 6f 75 74 29 3b 0a 20 20 74 65  zero(&out);.  te
19e0: 78 74 5f 64 69 66 66 28 26 66 72 6f 6d 2c 20 26  xt_diff(&from, &
19f0: 74 6f 2c 20 26 6f 75 74 2c 20 35 29 3b 0a 20 20  to, &out, 5);.  
1a00: 40 20 25 68 28 62 6c 6f 62 5f 73 74 72 28 26 6f  @ %h(blob_str(&o
1a10: 75 74 29 29 0a 20 20 62 6c 6f 62 5f 72 65 73 65  ut)).  blob_rese
1a20: 74 28 26 66 72 6f 6d 29 3b 0a 20 20 62 6c 6f 62  t(&from);.  blob
1a30: 5f 72 65 73 65 74 28 26 74 6f 29 3b 0a 20 20 62  _reset(&to);.  b
1a40: 6c 6f 62 5f 72 65 73 65 74 28 26 6f 75 74 29 3b  lob_reset(&out);
1a50: 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45 42    .}.../*.** WEB
1a60: 50 41 47 45 3a 20 76 69 6e 66 6f 0a 2a 2a 20 57  PAGE: vinfo.** W
1a70: 45 42 50 41 47 45 3a 20 63 69 0a 2a 2a 20 55 52  EBPAGE: ci.** UR
1a80: 4c 3a 20 20 2f 63 69 3f 6e 61 6d 65 3d 52 49 44  L:  /ci?name=RID
1a90: 7c 41 52 54 49 46 41 43 54 49 44 0a 2a 2a 0a 2a  |ARTIFACTID.**.*
1aa0: 2a 20 44 69 73 70 6c 61 79 20 69 6e 66 6f 72 6d  * Display inform
1ab0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 70 61  ation about a pa
1ac0: 72 74 69 63 75 6c 61 72 20 63 68 65 63 6b 2d 69  rticular check-i
1ad0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 63 69 5f 70 61  n..*/.void ci_pa
1ae0: 67 65 28 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74  ge(void){.  Stmt
1af0: 20 71 3b 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20   q;.  int rid;. 
1b00: 20 69 6e 74 20 69 73 4c 65 61 66 3b 0a 0a 20 20   int isLeaf;..  
1b10: 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64  login_check_cred
1b20: 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66 28  entials();.  if(
1b30: 20 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c 6f   !g.okRead ){ lo
1b40: 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72 65  gin_needed(); re
1b50: 74 75 72 6e 3b 20 7d 0a 20 20 72 69 64 20 3d 20  turn; }.  rid = 
1b60: 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44 28 22  name_to_rid(PD("
1b70: 6e 61 6d 65 22 2c 22 30 22 29 29 3b 0a 20 20 69  name","0"));.  i
1b80: 66 28 20 72 69 64 3d 3d 30 20 29 7b 0a 20 20 20  f( rid==0 ){.   
1b90: 20 73 74 79 6c 65 5f 68 65 61 64 65 72 28 22 43   style_header("C
1ba0: 68 65 63 6b 2d 69 6e 20 49 6e 66 6f 72 6d 61 74  heck-in Informat
1bb0: 69 6f 6e 20 45 72 72 6f 72 22 29 3b 0a 20 20 20  ion Error");.   
1bc0: 20 40 20 4e 6f 20 73 75 63 68 20 6f 62 6a 65 63   @ No such objec
1bd0: 74 3a 20 25 68 28 67 2e 61 72 67 76 5b 32 5d 29  t: %h(g.argv[2])
1be0: 0a 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65  .    style_foote
1bf0: 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  r();.    return;
1c00: 0a 20 20 7d 0a 20 20 69 73 4c 65 61 66 20 3d 20  .  }.  isLeaf = 
1c10: 21 64 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45  !db_exists("SELE
1c20: 43 54 20 31 20 46 52 4f 4d 20 70 6c 69 6e 6b 20  CT 1 FROM plink 
1c30: 57 48 45 52 45 20 70 69 64 3d 25 64 22 2c 20 72  WHERE pid=%d", r
1c40: 69 64 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72  id);.  db_prepar
1c50: 65 28 26 71 2c 20 0a 20 20 20 20 20 22 53 45 4c  e(&q, .     "SEL
1c60: 45 43 54 20 75 75 69 64 2c 20 64 61 74 65 74 69  ECT uuid, dateti
1c70: 6d 65 28 6d 74 69 6d 65 2c 20 27 6c 6f 63 61 6c  me(mtime, 'local
1c80: 74 69 6d 65 27 29 2c 20 75 73 65 72 2c 20 63 6f  time'), user, co
1c90: 6d 6d 65 6e 74 22 0a 20 20 20 20 20 22 20 20 46  mment".     "  F
1ca0: 52 4f 4d 20 62 6c 6f 62 2c 20 65 76 65 6e 74 22  ROM blob, event"
1cb0: 0a 20 20 20 20 20 22 20 57 48 45 52 45 20 62 6c  .     " WHERE bl
1cc0: 6f 62 2e 72 69 64 3d 25 64 22 0a 20 20 20 20 20  ob.rid=%d".     
1cd0: 22 20 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f 62  "   AND event.ob
1ce0: 6a 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 72 69  jid=%d",.     ri
1cf0: 64 2c 20 72 69 64 0a 20 20 29 3b 0a 20 20 69 66  d, rid.  );.  if
1d00: 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53  ( db_step(&q)==S
1d10: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
1d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75   const char *zUu
1d30: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  id = db_column_t
1d40: 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20  ext(&q, 0);.    
1d50: 63 68 61 72 20 2a 7a 54 69 74 6c 65 20 3d 20 6d  char *zTitle = m
1d60: 70 72 69 6e 74 66 28 22 43 68 65 63 6b 2d 69 6e  printf("Check-in
1d70: 20 5b 25 2e 31 30 73 5d 22 2c 20 7a 55 75 69 64   [%.10s]", zUuid
1d80: 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 55  );.    char *zEU
1d90: 73 65 72 2c 20 2a 7a 45 43 6f 6d 6d 65 6e 74 3b  ser, *zEComment;
1da0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1db0: 2a 7a 55 73 65 72 3b 0a 20 20 20 20 63 6f 6e 73  *zUser;.    cons
1dc0: 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 65 6e 74  t char *zComment
1dd0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1de0: 20 2a 7a 44 61 74 65 3b 0a 20 20 20 20 73 74 79   *zDate;.    sty
1df0: 6c 65 5f 68 65 61 64 65 72 28 7a 54 69 74 6c 65  le_header(zTitle
1e00: 29 3b 0a 20 20 20 20 6c 6f 67 69 6e 5f 61 6e 6f  );.    login_ano
1e10: 6e 79 6d 6f 75 73 5f 61 76 61 69 6c 61 62 6c 65  nymous_available
1e20: 28 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54 69  ();.    free(zTi
1e30: 74 6c 65 29 3b 0a 20 20 20 20 7a 45 55 73 65 72  tle);.    zEUser
1e40: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 0a 20 20   = db_text(0,.  
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 20 22 53 45 4c 45 43 54 20 76 61 6c 75 65 20 46   "SELECT value F
1e70: 52 4f 4d 20 74 61 67 78 72 65 66 20 57 48 45 52  ROM tagxref WHER
1e80: 45 20 74 61 67 69 64 3d 25 64 20 41 4e 44 20 72  E tagid=%d AND r
1e90: 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 20 20  id=%d",.        
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 54 41 47 5f              TAG_
1eb0: 55 53 45 52 2c 20 72 69 64 29 3b 0a 20 20 20 20  USER, rid);.    
1ec0: 7a 45 43 6f 6d 6d 65 6e 74 20 3d 20 64 62 5f 74  zEComment = db_t
1ed0: 65 78 74 28 30 2c 20 0a 20 20 20 20 20 20 20 20  ext(0, .        
1ee0: 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
1ef0: 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 74 61  CT value FROM ta
1f00: 67 78 72 65 66 20 57 48 45 52 45 20 74 61 67 69  gxref WHERE tagi
1f10: 64 3d 25 64 20 41 4e 44 20 72 69 64 3d 25 64 22  d=%d AND rid=%d"
1f20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f30: 20 20 20 20 20 54 41 47 5f 43 4f 4d 4d 45 4e 54       TAG_COMMENT
1f40: 2c 20 72 69 64 29 3b 0a 20 20 20 20 7a 55 73 65  , rid);.    zUse
1f50: 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  r = db_column_te
1f60: 78 74 28 26 71 2c 20 32 29 3b 0a 20 20 20 20 7a  xt(&q, 2);.    z
1f70: 43 6f 6d 6d 65 6e 74 20 3d 20 64 62 5f 63 6f 6c  Comment = db_col
1f80: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29 3b  umn_text(&q, 3);
1f90: 0a 20 20 20 20 7a 44 61 74 65 20 3d 20 64 62 5f  .    zDate = db_
1fa0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 31  column_text(&q,1
1fb0: 29 3b 0a 20 20 20 20 40 20 3c 64 69 76 20 63 6c  );.    @ <div cl
1fc0: 61 73 73 3d 22 73 65 63 74 69 6f 6e 22 3e 4f 76  ass="section">Ov
1fd0: 65 72 76 69 65 77 3c 2f 64 69 76 3e 0a 20 20 20  erview</div>.   
1fe0: 20 40 20 3c 70 3e 3c 74 61 62 6c 65 20 63 6c 61   @ <p><table cla
1ff0: 73 73 3d 22 6c 61 62 65 6c 2d 76 61 6c 75 65 22  ss="label-value"
2000: 3e 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e  >.    @ <tr><th>
2010: 53 48 41 31 26 6e 62 73 70 3b 48 61 73 68 3a 3c  SHA1&nbsp;Hash:<
2020: 2f 74 68 3e 3c 74 64 3e 25 73 28 7a 55 75 69 64  /th><td>%s(zUuid
2030: 29 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 53 65  ).    if( g.okSe
2040: 74 75 70 20 29 7b 0a 20 20 20 20 20 20 40 20 28  tup ){.      @ (
2050: 52 65 63 6f 72 64 20 49 44 3a 20 25 64 28 72 69  Record ID: %d(ri
2060: 64 29 29 0a 20 20 20 20 7d 0a 20 20 20 20 40 20  d)).    }.    @ 
2070: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 40  </td></tr>.    @
2080: 20 3c 74 72 3e 3c 74 68 3e 44 61 74 65 3a 3c 2f   <tr><th>Date:</
2090: 74 68 3e 3c 74 64 3e 0a 20 20 20 20 68 79 70 65  th><td>.    hype
20a0: 72 6c 69 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a 44  rlink_to_date(zD
20b0: 61 74 65 2c 20 22 3c 2f 74 64 3e 3c 2f 74 72 3e  ate, "</td></tr>
20c0: 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 55 73  ");.    if( zEUs
20d0: 65 72 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 74  er ){.      @ <t
20e0: 72 3e 3c 74 68 3e 45 64 69 74 65 64 26 6e 62 73  r><th>Edited&nbs
20f0: 70 3b 55 73 65 72 3a 3c 2f 74 64 3e 3c 74 64 3e  p;User:</td><td>
2100: 0a 20 20 20 20 20 20 68 79 70 65 72 6c 69 6e 6b  .      hyperlink
2110: 5f 74 6f 5f 75 73 65 72 28 7a 45 55 73 65 72 2c  _to_user(zEUser,
2120: 7a 44 61 74 65 2c 22 3c 2f 74 64 3e 3c 2f 74 72  zDate,"</td></tr
2130: 3e 22 29 3b 0a 20 20 20 20 20 20 40 20 3c 74 72  >");.      @ <tr
2140: 3e 3c 74 68 3e 4f 72 69 67 69 6e 61 6c 26 6e 62  ><th>Original&nb
2150: 73 70 3b 55 73 65 72 3a 3c 2f 74 68 3e 3c 74 64  sp;User:</th><td
2160: 3e 0a 20 20 20 20 20 20 68 79 70 65 72 6c 69 6e  >.      hyperlin
2170: 6b 5f 74 6f 5f 75 73 65 72 28 7a 55 73 65 72 2c  k_to_user(zUser,
2180: 7a 44 61 74 65 2c 22 3c 2f 74 64 3e 3c 2f 74 72  zDate,"</td></tr
2190: 3e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >");.    }else{.
21a0: 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e        @ <tr><th>
21b0: 55 73 65 72 3a 3c 2f 74 64 3e 3c 74 64 3e 0a 20  User:</td><td>. 
21c0: 20 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74       hyperlink_t
21d0: 6f 5f 75 73 65 72 28 7a 55 73 65 72 2c 7a 44 61  o_user(zUser,zDa
21e0: 74 65 2c 22 3c 2f 74 64 3e 3c 2f 74 72 3e 22 29  te,"</td></tr>")
21f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2200: 7a 45 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  zEComment ){.   
2210: 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 45 64 69     @ <tr><th>Edi
2220: 74 65 64 26 6e 62 73 70 3b 43 6f 6d 6d 65 6e 74  ted&nbsp;Comment
2230: 3a 3c 2f 74 68 3e 3c 74 64 3e 25 77 28 7a 45 43  :</th><td>%w(zEC
2240: 6f 6d 6d 65 6e 74 29 3c 2f 74 64 3e 3c 2f 74 72  omment)</td></tr
2250: 3e 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74  >.      @ <tr><t
2260: 68 3e 4f 72 69 67 69 6e 61 6c 26 6e 62 73 70 3b  h>Original&nbsp;
2270: 43 6f 6d 6d 65 6e 74 3a 3c 2f 74 68 3e 3c 74 64  Comment:</th><td
2280: 3e 25 77 28 7a 43 6f 6d 6d 65 6e 74 29 3c 2f 74  >%w(zComment)</t
2290: 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 7d 65 6c 73  d></tr>.    }els
22a0: 65 7b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c  e{.      @ <tr><
22b0: 74 68 3e 43 6f 6d 6d 65 6e 74 3a 3c 2f 74 68 3e  th>Comment:</th>
22c0: 3c 74 64 3e 25 77 28 7a 43 6f 6d 6d 65 6e 74 29  <td>%w(zComment)
22d0: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 7d  </td></tr>.    }
22e0: 0a 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72  .    @ </td></tr
22f0: 3e 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 41 64  >.    if( g.okAd
2300: 6d 69 6e 20 29 7b 0a 20 20 20 20 20 20 64 62 5f  min ){.      db_
2310: 70 72 65 70 61 72 65 28 26 71 2c 20 0a 20 20 20  prepare(&q, .   
2320: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72 63        "SELECT rc
2330: 76 66 72 6f 6d 2e 69 70 61 64 64 72 2c 20 75 73  vfrom.ipaddr, us
2340: 65 72 2e 6c 6f 67 69 6e 2c 20 64 61 74 65 74 69  er.login, dateti
2350: 6d 65 28 72 63 76 66 72 6f 6d 2e 6d 74 69 6d 65  me(rcvfrom.mtime
2360: 29 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 46  )".         "  F
2370: 52 4f 4d 20 62 6c 6f 62 20 4a 4f 49 4e 20 72 63  ROM blob JOIN rc
2380: 76 66 72 6f 6d 20 55 53 49 4e 47 28 72 63 76 69  vfrom USING(rcvi
2390: 64 29 20 4c 45 46 54 20 4a 4f 49 4e 20 75 73 65  d) LEFT JOIN use
23a0: 72 20 55 53 49 4e 47 28 75 69 64 29 22 0a 20 20  r USING(uid)".  
23b0: 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 62         " WHERE b
23c0: 6c 6f 62 2e 72 69 64 3d 25 64 22 2c 0a 20 20 20  lob.rid=%d",.   
23d0: 20 20 20 20 20 20 72 69 64 0a 20 20 20 20 20 20        rid.      
23e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 5f  );.      if( db_
23f0: 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45  step(&q)==SQLITE
2400: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  _ROW ){.        
2410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 70 41  const char *zIpA
2420: 64 64 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ddr = db_column_
2430: 74 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20  text(&q, 0);.   
2440: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2450: 2a 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f 6c 75  *zUser = db_colu
2460: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b 0a  mn_text(&q, 1);.
2470: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2480: 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63  ar *zDate = db_c
2490: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32  olumn_text(&q, 2
24a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
24b0: 55 73 65 72 3d 3d 30 20 7c 7c 20 7a 55 73 65 72  User==0 || zUser
24c0: 5b 30 5d 3d 3d 30 20 29 20 7a 55 73 65 72 20 3d  [0]==0 ) zUser =
24d0: 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20   "unknown";.    
24e0: 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e 52 65      @ <tr><th>Re
24f0: 63 65 69 76 65 64 26 6e 62 73 70 3b 46 72 6f 6d  ceived&nbsp;From
2500: 3a 3c 2f 74 68 3e 0a 20 20 20 20 20 20 20 20 40  :</th>.        @
2510: 20 3c 74 64 3e 25 68 28 7a 55 73 65 72 29 20 40   <td>%h(zUser) @
2520: 20 25 68 28 7a 49 70 41 64 64 72 29 20 6f 6e 20   %h(zIpAddr) on 
2530: 25 73 28 7a 44 61 74 65 29 3c 2f 74 64 3e 3c 2f  %s(zDate)</td></
2540: 74 72 3e 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tr>.      }.    
2550: 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71    db_finalize(&q
2560: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2570: 20 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a   g.okHistory ){.
2580: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 68 6f        char *zSho
2590: 72 74 55 75 69 64 20 3d 20 6d 70 72 69 6e 74 66  rtUuid = mprintf
25a0: 28 22 25 2e 31 30 73 22 2c 20 7a 55 75 69 64 29  ("%.10s", zUuid)
25b0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
25c0: 61 72 20 2a 7a 50 72 6f 6a 4e 61 6d 65 20 3d 20  ar *zProjName = 
25d0: 64 62 5f 67 65 74 28 22 70 72 6f 6a 65 63 74 2d  db_get("project-
25e0: 6e 61 6d 65 22 2c 20 22 75 6e 6e 61 6d 65 64 22  name", "unnamed"
25f0: 29 3b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c  );.      @ <tr><
2600: 74 68 3e 54 69 6d 65 6c 69 6e 65 73 3a 3c 2f 74  th>Timelines:</t
2610: 68 3e 3c 74 64 3e 0a 20 20 20 20 20 20 40 20 20  h><td>.      @  
2620: 20 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e    <a href="%s(g.
2630: 7a 42 61 73 65 55 52 4c 29 2f 74 69 6d 65 6c 69  zBaseURL)/timeli
2640: 6e 65 3f 70 3d 25 64 28 72 69 64 29 22 3e 61 6e  ne?p=%d(rid)">an
2650: 63 65 73 74 6f 72 73 3c 2f 61 3e 0a 20 20 20 20  cestors</a>.    
2660: 20 20 40 20 20 20 20 7c 20 3c 61 20 68 72 65 66    @    | <a href
2670: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
2680: 2f 74 69 6d 65 6c 69 6e 65 3f 64 3d 25 64 28 72  /timeline?d=%d(r
2690: 69 64 29 22 3e 64 65 73 63 65 6e 64 61 6e 74 73  id)">descendants
26a0: 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 20 20 20  </a>.      @    
26b0: 7c 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e  | <a href="%s(g.
26c0: 7a 42 61 73 65 55 52 4c 29 2f 74 69 6d 65 6c 69  zBaseURL)/timeli
26d0: 6e 65 3f 64 3d 25 64 28 72 69 64 29 26 70 3d 25  ne?d=%d(rid)&p=%
26e0: 64 28 72 69 64 29 22 3e 62 6f 74 68 3c 2f 61 3e  d(rid)">both</a>
26f0: 0a 20 20 20 20 20 20 64 62 5f 70 72 65 70 61 72  .      db_prepar
2700: 65 28 26 71 2c 20 22 53 45 4c 45 43 54 20 73 75  e(&q, "SELECT su
2710: 62 73 74 72 28 74 61 67 2e 74 61 67 6e 61 6d 65  bstr(tag.tagname
2720: 2c 35 29 20 46 52 4f 4d 20 74 61 67 78 72 65 66  ,5) FROM tagxref
2730: 2c 20 74 61 67 20 22 0a 20 20 20 20 20 20 20 20  , tag ".        
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
2750: 48 45 52 45 20 72 69 64 3d 25 64 20 41 4e 44 20  HERE rid=%d AND 
2760: 74 61 67 74 79 70 65 3e 30 20 22 0a 20 20 20 20  tagtype>0 ".    
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2780: 20 22 20 20 20 41 4e 44 20 74 61 67 2e 74 61 67   "   AND tag.tag
2790: 69 64 3d 74 61 67 78 72 65 66 2e 74 61 67 69 64  id=tagxref.tagid
27a0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
27b0: 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20          "   AND 
27c0: 2b 74 61 67 2e 74 61 67 6e 61 6d 65 20 47 4c 4f  +tag.tagname GLO
27d0: 42 20 27 73 79 6d 2d 2a 27 22 2c 20 72 69 64 29  B 'sym-*'", rid)
27e0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 64  ;.      while( d
27f0: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49  b_step(&q)==SQLI
2800: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
2810: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2820: 61 67 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c 75  agName = db_colu
2830: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b 0a  mn_text(&q, 0);.
2840: 20 20 20 20 20 20 20 20 40 20 20 7c 20 3c 61 20          @  | <a 
2850: 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65  href="%s(g.zBase
2860: 55 52 4c 29 2f 74 69 6d 65 6c 69 6e 65 3f 74 3d  URL)/timeline?t=
2870: 25 54 28 7a 54 61 67 4e 61 6d 65 29 22 3e 25 68  %T(zTagName)">%h
2880: 28 7a 54 61 67 4e 61 6d 65 29 3c 2f 61 3e 0a 20  (zTagName)</a>. 
2890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 5f       }.      db_
28a0: 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20  finalize(&q);.  
28b0: 20 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e      @ </td></tr>
28c0: 0a 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 68  .      @ <tr><th
28d0: 3e 4f 74 68 65 72 26 6e 62 73 70 3b 4c 69 6e 6b  >Other&nbsp;Link
28e0: 73 3a 3c 2f 74 68 3e 0a 20 20 20 20 20 20 40 20  s:</th>.      @ 
28f0: 20 20 3c 74 64 3e 0a 20 20 20 20 20 20 40 20 20    <td>.      @  
2900: 20 20 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67     <a href="%s(g
2910: 2e 7a 42 61 73 65 55 52 4c 29 2f 64 69 72 3f 63  .zBaseURL)/dir?c
2920: 69 3d 25 73 28 7a 53 68 6f 72 74 55 75 69 64 29  i=%s(zShortUuid)
2930: 22 3e 66 69 6c 65 73 3c 2f 61 3e 0a 20 20 20 20  ">files</a>.    
2940: 20 20 40 20 20 20 20 20 7c 20 3c 61 20 68 72 65    @     | <a hre
2950: 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  f="%s(g.zBaseURL
2960: 29 2f 7a 69 70 2f 25 73 28 7a 50 72 6f 6a 4e 61  )/zip/%s(zProjNa
2970: 6d 65 29 2d 25 73 28 7a 53 68 6f 72 74 55 75 69  me)-%s(zShortUui
2980: 64 29 2e 7a 69 70 3f 75 75 69 64 3d 25 73 28 7a  d).zip?uuid=%s(z
2990: 55 75 69 64 29 22 3e 0a 20 20 20 20 20 20 40 20  Uuid)">.      @ 
29a0: 20 20 20 20 20 20 20 20 5a 49 50 20 61 72 63 68          ZIP arch
29b0: 69 76 65 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20  ive</a>.      @ 
29c0: 20 20 20 20 7c 20 3c 61 20 68 72 65 66 3d 22 25      | <a href="%
29d0: 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 61 72  s(g.zBaseURL)/ar
29e0: 74 69 66 61 63 74 2f 25 64 28 72 69 64 29 22 3e  tifact/%d(rid)">
29f0: 6d 61 6e 69 66 65 73 74 3c 2f 61 3e 0a 20 20 20  manifest</a>.   
2a00: 20 20 20 69 66 28 20 67 2e 6f 6b 57 72 69 74 65     if( g.okWrite
2a10: 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20 20 20   ){.        @   
2a20: 20 20 7c 20 3c 61 20 68 72 65 66 3d 22 25 73 28    | <a href="%s(
2a30: 67 2e 7a 42 61 73 65 55 52 4c 29 2f 63 69 5f 65  g.zBaseURL)/ci_e
2a40: 64 69 74 3f 72 3d 25 64 28 72 69 64 29 22 3e 65  dit?r=%d(rid)">e
2a50: 64 69 74 3c 2f 61 3e 0a 20 20 20 20 20 20 7d 0a  dit</a>.      }.
2a60: 20 20 20 20 20 20 40 20 20 20 3c 2f 74 64 3e 0a        @   </td>.
2a70: 20 20 20 20 20 20 40 20 3c 2f 74 72 3e 0a 20 20        @ </tr>.  
2a80: 20 20 20 20 66 72 65 65 28 7a 53 68 6f 72 74 55      free(zShortU
2a90: 75 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uid);.    }.    
2aa0: 40 20 3c 2f 74 61 62 6c 65 3e 3c 2f 70 3e 0a 20  @ </table></p>. 
2ab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 79 6c   }else{.    styl
2ac0: 65 5f 68 65 61 64 65 72 28 22 43 68 65 63 6b 2d  e_header("Check-
2ad0: 69 6e 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 22 29  in Information")
2ae0: 3b 0a 20 20 20 20 6c 6f 67 69 6e 5f 61 6e 6f 6e  ;.    login_anon
2af0: 79 6d 6f 75 73 5f 61 76 61 69 6c 61 62 6c 65 28  ymous_available(
2b00: 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61  );.  }.  db_fina
2b10: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 73 68 6f 77  lize(&q);.  show
2b20: 54 61 67 73 28 72 69 64 2c 20 22 22 29 3b 0a 20  Tags(rid, "");. 
2b30: 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 73   @ <div class="s
2b40: 65 63 74 69 6f 6e 22 3e 43 68 61 6e 67 65 73 3c  ection">Changes<
2b50: 2f 64 69 76 3e 0a 20 20 64 62 5f 70 72 65 70 61  /div>.  db_prepa
2b60: 72 65 28 26 71 2c 0a 20 20 20 20 20 22 53 45 4c  re(&q,.     "SEL
2b70: 45 43 54 20 70 69 64 2c 20 66 69 64 2c 20 6e 61  ECT pid, fid, na
2b80: 6d 65 2c 20 73 75 62 73 74 72 28 61 2e 75 75 69  me, substr(a.uui
2b90: 64 2c 31 2c 31 30 29 2c 20 73 75 62 73 74 72 28  d,1,10), substr(
2ba0: 62 2e 75 75 69 64 2c 31 2c 31 30 29 22 0a 20 20  b.uuid,1,10)".  
2bb0: 20 20 20 22 20 20 46 52 4f 4d 20 6d 6c 69 6e 6b     "  FROM mlink
2bc0: 20 4a 4f 49 4e 20 66 69 6c 65 6e 61 6d 65 20 4f   JOIN filename O
2bd0: 4e 20 66 69 6c 65 6e 61 6d 65 2e 66 6e 69 64 3d  N filename.fnid=
2be0: 6d 6c 69 6e 6b 2e 66 6e 69 64 22 0a 20 20 20 20  mlink.fnid".    
2bf0: 20 22 20 20 20 20 20 20 20 20 20 4c 45 46 54 20   "         LEFT 
2c00: 4a 4f 49 4e 20 62 6c 6f 62 20 61 20 4f 4e 20 61  JOIN blob a ON a
2c10: 2e 72 69 64 3d 70 69 64 22 0a 20 20 20 20 20 22  .rid=pid".     "
2c20: 20 20 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f           LEFT JO
2c30: 49 4e 20 62 6c 6f 62 20 62 20 4f 4e 20 62 2e 72  IN blob b ON b.r
2c40: 69 64 3d 66 69 64 22 0a 20 20 20 20 20 22 20 57  id=fid".     " W
2c50: 48 45 52 45 20 6d 6c 69 6e 6b 2e 6d 69 64 3d 25  HERE mlink.mid=%
2c60: 64 22 0a 20 20 20 20 20 22 20 4f 52 44 45 52 20  d".     " ORDER 
2c70: 42 59 20 6e 61 6d 65 22 2c 0a 20 20 20 20 20 72  BY name",.     r
2c80: 69 64 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  id.  );.  while(
2c90: 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51   db_step(&q)==SQ
2ca0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
2cb0: 69 6e 74 20 70 69 64 20 3d 20 64 62 5f 63 6f 6c  int pid = db_col
2cc0: 75 6d 6e 5f 69 6e 74 28 26 71 2c 30 29 3b 0a 20  umn_int(&q,0);. 
2cd0: 20 20 20 69 6e 74 20 66 69 64 20 3d 20 64 62 5f     int fid = db_
2ce0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 31 29  column_int(&q,1)
2cf0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
2d00: 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f 63 6f 6c   *zName = db_col
2d10: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 32 29 3b 0a  umn_text(&q,2);.
2d20: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2d30: 7a 4f 6c 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e  zOld = db_column
2d40: 5f 74 65 78 74 28 26 71 2c 33 29 3b 0a 20 20 20  _text(&q,3);.   
2d50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
2d60: 77 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  w = db_column_te
2d70: 78 74 28 26 71 2c 34 29 3b 0a 20 20 20 20 69 66  xt(&q,4);.    if
2d80: 28 20 21 67 2e 6f 6b 48 69 73 74 6f 72 79 20 29  ( !g.okHistory )
2d90: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 65 77  {.      if( zNew
2da0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 40  ==0 ){.        @
2db0: 20 3c 70 3e 44 65 6c 65 74 65 64 20 25 68 28 7a   <p>Deleted %h(z
2dc0: 4e 61 6d 65 29 3c 2f 70 3e 0a 20 20 20 20 20 20  Name)</p>.      
2dd0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2df0: 20 40 20 3c 70 3e 43 68 61 6e 67 65 73 20 74 6f   @ <p>Changes to
2e00: 20 25 68 28 7a 4e 61 6d 65 29 3c 2f 70 3e 0a 20   %h(zName)</p>. 
2e10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2e20: 20 69 66 28 20 7a 4f 6c 64 20 26 26 20 7a 4e 65   if( zOld && zNe
2e30: 77 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 70 3e  w ){.      @ <p>
2e40: 4d 6f 64 69 66 69 65 64 20 3c 61 20 68 72 65 66  Modified <a href
2e50: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
2e60: 2f 66 69 6e 66 6f 3f 6e 61 6d 65 3d 25 54 28 7a  /finfo?name=%T(z
2e70: 4e 61 6d 65 29 22 3e 25 68 28 7a 4e 61 6d 65 29  Name)">%h(zName)
2e80: 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 66 72 6f  </a>.      @ fro
2e90: 6d 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e  m <a href="%s(g.
2ea0: 7a 42 61 73 65 55 52 4c 29 2f 61 72 74 69 66 61  zBaseURL)/artifa
2eb0: 63 74 2f 25 73 28 7a 4f 6c 64 29 22 3e 5b 25 73  ct/%s(zOld)">[%s
2ec0: 28 7a 4f 6c 64 29 5d 3c 2f 61 3e 0a 20 20 20 20  (zOld)]</a>.    
2ed0: 20 20 40 20 74 6f 20 3c 61 20 68 72 65 66 3d 22    @ to <a href="
2ee0: 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 61  %s(g.zBaseURL)/a
2ef0: 72 74 69 66 61 63 74 2f 25 73 28 7a 4e 65 77 29  rtifact/%s(zNew)
2f00: 22 3e 5b 25 73 28 7a 4e 65 77 29 5d 3c 2f 61 3e  ">[%s(zNew)]</a>
2f10: 3c 2f 70 3e 0a 20 20 20 20 7d 65 6c 73 65 20 69  </p>.    }else i
2f20: 66 28 20 7a 4f 6c 64 20 29 7b 0a 20 20 20 20 20  f( zOld ){.     
2f30: 20 40 20 3c 70 3e 44 65 6c 65 74 65 64 20 3c 61   @ <p>Deleted <a
2f40: 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73   href="%s(g.zBas
2f50: 65 55 52 4c 29 2f 66 69 6e 66 6f 3f 6e 61 6d 65  eURL)/finfo?name
2f60: 3d 25 54 28 7a 4e 61 6d 65 29 22 3e 25 68 28 7a  =%T(zName)">%h(z
2f70: 4e 61 6d 65 29 3c 2f 61 3e 0a 20 20 20 20 20 20  Name)</a>.      
2f80: 40 20 76 65 72 73 69 6f 6e 20 3c 61 20 68 72 65  @ version <a hre
2f90: 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c  f="%s(g.zBaseURL
2fa0: 29 2f 61 72 74 69 66 61 63 74 2f 25 73 28 7a 4f  )/artifact/%s(zO
2fb0: 6c 64 29 22 3e 5b 25 73 28 7a 4f 6c 64 29 5d 3c  ld)">[%s(zOld)]<
2fc0: 2f 61 3e 3c 2f 70 3e 0a 20 20 20 20 20 20 63 6f  /a></p>.      co
2fd0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73  ntinue;.    }els
2fe0: 65 7b 0a 20 20 20 20 20 20 40 20 3c 70 3e 41 64  e{.      @ <p>Ad
2ff0: 64 65 64 20 3c 61 20 68 72 65 66 3d 22 25 73 28  ded <a href="%s(
3000: 67 2e 7a 42 61 73 65 55 52 4c 29 2f 66 69 6e 66  g.zBaseURL)/finf
3010: 6f 3f 6e 61 6d 65 3d 25 54 28 7a 4e 61 6d 65 29  o?name=%T(zName)
3020: 22 3e 25 68 28 7a 4e 61 6d 65 29 3c 2f 61 3e 0a  ">%h(zName)</a>.
3030: 20 20 20 20 20 20 40 20 76 65 72 73 69 6f 6e 20        @ version 
3040: 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42  <a href="%s(g.zB
3050: 61 73 65 55 52 4c 29 2f 61 72 74 69 66 61 63 74  aseURL)/artifact
3060: 2f 25 73 28 7a 4e 65 77 29 22 3e 5b 25 73 28 7a  /%s(zNew)">[%s(z
3070: 4e 65 77 29 5d 3c 2f 61 3e 3c 2f 70 3e 0a 20 20  New)]</a></p>.  
3080: 20 20 7d 0a 20 20 20 20 40 20 3c 62 6c 6f 63 6b    }.    @ <block
3090: 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 20 20 20 20  quote><pre>.    
30a0: 61 70 70 65 6e 64 5f 64 69 66 66 28 70 69 64 2c  append_diff(pid,
30b0: 20 66 69 64 29 3b 0a 20 20 20 20 40 20 3c 2f 70   fid);.    @ </p
30c0: 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e  re></blockquote>
30d0: 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69  .  }.  db_finali
30e0: 7a 65 28 26 71 29 3b 0a 20 20 73 74 79 6c 65 5f  ze(&q);.  style_
30f0: 66 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a  footer();.}../*.
3100: 2a 2a 20 57 45 42 50 41 47 45 3a 20 77 69 6e 66  ** WEBPAGE: winf
3110: 6f 0a 2a 2a 20 55 52 4c 3a 20 20 2f 77 69 6e 66  o.** URL:  /winf
3120: 6f 3f 6e 61 6d 65 3d 52 49 44 0a 2a 2a 0a 2a 2a  o?name=RID.**.**
3130: 20 52 65 74 75 72 6e 20 69 6e 66 6f 72 6d 61 74   Return informat
3140: 69 6f 6e 20 61 62 6f 75 74 20 61 20 77 69 6b 69  ion about a wiki
3150: 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 77   page..*/.void w
3160: 69 6e 66 6f 5f 70 61 67 65 28 76 6f 69 64 29 7b  info_page(void){
3170: 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74  .  Stmt q;.  int
3180: 20 72 69 64 3b 0a 0a 20 20 6c 6f 67 69 6e 5f 63   rid;..  login_c
3190: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73  heck_credentials
31a0: 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b 52  ();.  if( !g.okR
31b0: 64 57 69 6b 69 20 29 7b 20 6c 6f 67 69 6e 5f 6e  dWiki ){ login_n
31c0: 65 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b  eeded(); return;
31d0: 20 7d 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f   }.  rid = name_
31e0: 74 6f 5f 72 69 64 28 50 44 28 22 6e 61 6d 65 22  to_rid(PD("name"
31f0: 2c 22 30 22 29 29 3b 0a 20 20 69 66 28 20 72 69  ,"0"));.  if( ri
3200: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 79 6c  d==0 ){.    styl
3210: 65 5f 68 65 61 64 65 72 28 22 57 69 6b 69 20 50  e_header("Wiki P
3220: 61 67 65 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  age Information 
3230: 45 72 72 6f 72 22 29 3b 0a 20 20 20 20 40 20 4e  Error");.    @ N
3240: 6f 20 73 75 63 68 20 6f 62 6a 65 63 74 3a 20 25  o such object: %
3250: 68 28 67 2e 61 72 67 76 5b 32 5d 29 0a 20 20 20  h(g.argv[2]).   
3260: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
3270: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
3280: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71  .  db_prepare(&q
3290: 2c 20 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20  , .     "SELECT 
32a0: 73 75 62 73 74 72 28 74 61 67 6e 61 6d 65 2c 20  substr(tagname, 
32b0: 36 2c 20 31 30 30 30 29 2c 20 75 75 69 64 2c 22  6, 1000), uuid,"
32c0: 0a 20 20 20 20 20 22 20 20 20 20 20 20 20 64 61  .     "       da
32d0: 74 65 74 69 6d 65 28 65 76 65 6e 74 2e 6d 74 69  tetime(event.mti
32e0: 6d 65 2c 20 27 6c 6f 63 61 6c 74 69 6d 65 27 29  me, 'localtime')
32f0: 2c 20 75 73 65 72 22 0a 20 20 20 20 20 22 20 20  , user".     "  
3300: 46 52 4f 4d 20 74 61 67 78 72 65 66 2c 20 74 61  FROM tagxref, ta
3310: 67 2c 20 62 6c 6f 62 2c 20 65 76 65 6e 74 22 0a  g, blob, event".
3320: 20 20 20 20 20 22 20 57 48 45 52 45 20 74 61 67       " WHERE tag
3330: 78 72 65 66 2e 72 69 64 3d 25 64 22 0a 20 20 20  xref.rid=%d".   
3340: 20 20 22 20 20 20 41 4e 44 20 74 61 67 2e 74 61    "   AND tag.ta
3350: 67 69 64 3d 74 61 67 78 72 65 66 2e 74 61 67 69  gid=tagxref.tagi
3360: 64 22 0a 20 20 20 20 20 22 20 20 20 41 4e 44 20  d".     "   AND 
3370: 74 61 67 2e 74 61 67 6e 61 6d 65 20 4c 49 4b 45  tag.tagname LIKE
3380: 20 27 77 69 6b 69 2d 25 25 27 22 0a 20 20 20 20   'wiki-%%'".    
3390: 20 22 20 20 20 41 4e 44 20 62 6c 6f 62 2e 72 69   "   AND blob.ri
33a0: 64 3d 25 64 22 0a 20 20 20 20 20 22 20 20 20 41  d=%d".     "   A
33b0: 4e 44 20 65 76 65 6e 74 2e 6f 62 6a 69 64 3d 25  ND event.objid=%
33c0: 64 22 2c 0a 20 20 20 20 20 72 69 64 2c 20 72 69  d",.     rid, ri
33d0: 64 2c 20 72 69 64 0a 20 20 29 3b 0a 20 20 69 66  d, rid.  );.  if
33e0: 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53  ( db_step(&q)==S
33f0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
3400: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
3410: 6d 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74  me = db_column_t
3420: 65 78 74 28 26 71 2c 20 30 29 3b 0a 20 20 20 20  ext(&q, 0);.    
3430: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 75 69  const char *zUui
3440: 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  d = db_column_te
3450: 78 74 28 26 71 2c 20 31 29 3b 0a 20 20 20 20 63  xt(&q, 1);.    c
3460: 68 61 72 20 2a 7a 54 69 74 6c 65 20 3d 20 6d 70  har *zTitle = mp
3470: 72 69 6e 74 66 28 22 57 69 6b 69 20 50 61 67 65  rintf("Wiki Page
3480: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
3490: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
34a0: 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f  ate = db_column_
34b0: 74 65 78 74 28 26 71 2c 32 29 3b 0a 20 20 20 20  text(&q,2);.    
34c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 65  const char *zUse
34d0: 72 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65  r = db_column_te
34e0: 78 74 28 26 71 2c 33 29 3b 0a 20 20 20 20 73 74  xt(&q,3);.    st
34f0: 79 6c 65 5f 68 65 61 64 65 72 28 7a 54 69 74 6c  yle_header(zTitl
3500: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54 69  e);.    free(zTi
3510: 74 6c 65 29 3b 0a 20 20 20 20 6c 6f 67 69 6e 5f  tle);.    login_
3520: 61 6e 6f 6e 79 6d 6f 75 73 5f 61 76 61 69 6c 61  anonymous_availa
3530: 62 6c 65 28 29 3b 0a 20 20 20 20 40 20 3c 64 69  ble();.    @ <di
3540: 76 20 63 6c 61 73 73 3d 22 73 65 63 74 69 6f 6e  v class="section
3550: 22 3e 4f 76 65 72 76 69 65 77 3c 2f 64 69 76 3e  ">Overview</div>
3560: 0a 20 20 20 20 40 20 3c 70 3e 3c 74 61 62 6c 65  .    @ <p><table
3570: 20 63 6c 61 73 73 3d 22 6c 61 62 65 6c 2d 76 61   class="label-va
3580: 6c 75 65 22 3e 0a 20 20 20 20 40 20 3c 74 72 3e  lue">.    @ <tr>
3590: 3c 74 68 3e 56 65 72 73 69 6f 6e 3a 3c 2f 74 68  <th>Version:</th
35a0: 3e 3c 74 64 3e 25 73 28 7a 55 75 69 64 29 3c 2f  ><td>%s(zUuid)</
35b0: 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20 40 20 3c  td></tr>.    @ <
35c0: 74 72 3e 3c 74 68 3e 44 61 74 65 3a 3c 2f 74 68  tr><th>Date:</th
35d0: 3e 3c 74 64 3e 0a 20 20 20 20 68 79 70 65 72 6c  ><td>.    hyperl
35e0: 69 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a 44 61 74  ink_to_date(zDat
35f0: 65 2c 20 22 3c 2f 74 64 3e 3c 2f 74 72 3e 22 29  e, "</td></tr>")
3600: 3b 0a 20 20 20 20 69 66 28 20 67 2e 6f 6b 53 65  ;.    if( g.okSe
3610: 74 75 70 20 29 7b 0a 20 20 20 20 20 20 40 20 3c  tup ){.      @ <
3620: 74 72 3e 3c 74 68 3e 52 65 63 6f 72 64 20 49 44  tr><th>Record ID
3630: 3a 3c 2f 74 68 3e 3c 74 64 3e 25 64 28 72 69 64  :</th><td>%d(rid
3640: 29 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 20 20  )</td></tr>.    
3650: 7d 0a 20 20 20 20 40 20 3c 74 72 3e 3c 74 68 3e  }.    @ <tr><th>
3660: 4f 72 69 67 69 6e 61 6c 26 6e 62 73 70 3b 55 73  Original&nbsp;Us
3670: 65 72 3a 3c 2f 74 68 3e 3c 74 64 3e 0a 20 20 20  er:</th><td>.   
3680: 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73   hyperlink_to_us
3690: 65 72 28 7a 55 73 65 72 2c 20 7a 44 61 74 65 2c  er(zUser, zDate,
36a0: 20 22 3c 2f 74 64 3e 3c 2f 74 72 3e 22 29 3b 0a   "</td></tr>");.
36b0: 20 20 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74      if( g.okHist
36c0: 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 40 20 3c  ory ){.      @ <
36d0: 74 72 3e 3c 74 68 3e 43 6f 6d 6d 61 6e 64 73 3a  tr><th>Commands:
36e0: 3c 2f 74 68 3e 0a 20 20 20 20 20 20 40 20 20 20  </th>.      @   
36f0: 3c 74 64 3e 0a 20 20 20 20 20 20 2f 2a 20 40 20  <td>.      /* @ 
3700: 20 20 20 20 3c 61 20 68 72 65 66 3d 22 25 73 28      <a href="%s(
3710: 67 2e 7a 42 61 73 65 55 52 4c 29 2f 77 64 69 66  g.zBaseURL)/wdif
3720: 66 2f 25 64 28 72 69 64 29 22 3e 64 69 66 66 3c  f/%d(rid)">diff<
3730: 2f 61 3e 20 7c 20 2a 2f 0a 20 20 20 20 20 20 40  /a> | */.      @
3740: 20 20 20 20 20 3c 61 20 68 72 65 66 3d 22 25 73       <a href="%s
3750: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 77 68 69  (g.zBaseURL)/whi
3760: 73 74 6f 72 79 3f 6e 61 6d 65 3d 25 74 28 7a 4e  story?name=%t(zN
3770: 61 6d 65 29 22 3e 68 69 73 74 6f 72 79 3c 2f 61  ame)">history</a
3780: 3e 0a 20 20 20 20 20 20 40 20 20 20 20 20 7c 20  >.      @     | 
3790: 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42  <a href="%s(g.zB
37a0: 61 73 65 55 52 4c 29 2f 61 72 74 69 66 61 63 74  aseURL)/artifact
37b0: 2f 25 64 28 72 69 64 29 22 3e 72 61 77 2d 74 65  /%d(rid)">raw-te
37c0: 78 74 3c 2f 61 3e 0a 20 20 20 20 20 20 40 20 20  xt</a>.      @  
37d0: 20 3c 2f 74 64 3e 0a 20 20 20 20 20 20 40 20 3c   </td>.      @ <
37e0: 2f 74 72 3e 0a 20 20 20 20 7d 0a 20 20 20 20 40  /tr>.    }.    @
37f0: 20 3c 2f 74 61 62 6c 65 3e 3c 2f 70 3e 0a 20 20   </table></p>.  
3800: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 79 6c 65  }else{.    style
3810: 5f 68 65 61 64 65 72 28 22 57 69 6b 69 20 49 6e  _header("Wiki In
3820: 66 6f 72 6d 61 74 69 6f 6e 22 29 3b 0a 20 20 20  formation");.   
3830: 20 72 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   rid = 0;.  }.  
3840: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
3850: 0a 20 20 73 68 6f 77 54 61 67 73 28 72 69 64 2c  .  showTags(rid,
3860: 20 22 77 69 6b 69 2d 2a 22 29 3b 0a 20 20 69 66   "wiki-*");.  if
3870: 28 20 72 69 64 20 29 7b 0a 20 20 20 20 42 6c 6f  ( rid ){.    Blo
3880: 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 4d  b content;.    M
3890: 61 6e 69 66 65 73 74 20 6d 3b 0a 20 20 20 20 6d  anifest m;.    m
38a0: 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a  emset(&m, 0, siz
38b0: 65 6f 66 28 6d 29 29 3b 0a 20 20 20 20 62 6c 6f  eof(m));.    blo
38c0: 62 5f 7a 65 72 6f 28 26 6d 2e 63 6f 6e 74 65 6e  b_zero(&m.conten
38d0: 74 29 3b 0a 20 20 20 20 63 6f 6e 74 65 6e 74 5f  t);.    content_
38e0: 67 65 74 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e  get(rid, &conten
38f0: 74 29 3b 0a 20 20 20 20 6d 61 6e 69 66 65 73 74  t);.    manifest
3900: 5f 70 61 72 73 65 28 26 6d 2c 20 26 63 6f 6e 74  _parse(&m, &cont
3910: 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 6d 2e  ent);.    if( m.
3920: 74 79 70 65 3d 3d 43 46 54 59 50 45 5f 57 49 4b  type==CFTYPE_WIK
3930: 49 20 29 7b 0a 20 20 20 20 20 20 42 6c 6f 62 20  I ){.      Blob 
3940: 77 69 6b 69 3b 0a 20 20 20 20 20 20 62 6c 6f 62  wiki;.      blob
3950: 5f 69 6e 69 74 28 26 77 69 6b 69 2c 20 6d 2e 7a  _init(&wiki, m.z
3960: 57 69 6b 69 2c 20 2d 31 29 3b 0a 20 20 20 20 20  Wiki, -1);.     
3970: 20 40 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 73   @ <div class="s
3980: 65 63 74 69 6f 6e 22 3e 43 6f 6e 74 65 6e 74 3c  ection">Content<
3990: 2f 64 69 76 3e 0a 20 20 20 20 20 20 77 69 6b 69  /div>.      wiki
39a0: 5f 63 6f 6e 76 65 72 74 28 26 77 69 6b 69 2c 20  _convert(&wiki, 
39b0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 6c 6f  0, 0);.      blo
39c0: 62 5f 72 65 73 65 74 28 26 77 69 6b 69 29 3b 0a  b_reset(&wiki);.
39d0: 20 20 20 20 7d 0a 20 20 20 20 6d 61 6e 69 66 65      }.    manife
39e0: 73 74 5f 63 6c 65 61 72 28 26 6d 29 3b 0a 20 20  st_clear(&m);.  
39f0: 7d 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72  }.  style_footer
3a00: 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42  ();.}../*.** WEB
3a10: 50 41 47 45 3a 20 76 64 69 66 66 0a 2a 2a 20 55  PAGE: vdiff.** U
3a20: 52 4c 3a 20 2f 76 64 69 66 66 3f 6e 61 6d 65 3d  RL: /vdiff?name=
3a30: 52 49 44 0a 2a 2a 0a 2a 2a 20 53 68 6f 77 20 61  RID.**.** Show a
3a40: 6c 6c 20 64 69 66 66 65 72 65 6e 63 65 73 20 66  ll differences f
3a50: 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  or a particular 
3a60: 63 68 65 63 6b 2d 69 6e 2e 0a 2a 2f 0a 76 6f 69  check-in..*/.voi
3a70: 64 20 76 64 69 66 66 5f 70 61 67 65 28 76 6f 69  d vdiff_page(voi
3a80: 64 29 7b 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20  d){.  int rid;. 
3a90: 20 53 74 6d 74 20 71 3b 0a 20 20 63 68 61 72 20   Stmt q;.  char 
3aa0: 2a 7a 55 75 69 64 3b 0a 0a 20 20 6c 6f 67 69 6e  *zUuid;..  login
3ab0: 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61  _check_credentia
3ac0: 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f  ls();.  if( !g.o
3ad0: 6b 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e  kRead ){ login_n
3ae0: 65 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b  eeded(); return;
3af0: 20 7d 0a 20 20 6c 6f 67 69 6e 5f 61 6e 6f 6e 79   }.  login_anony
3b00: 6d 6f 75 73 5f 61 76 61 69 6c 61 62 6c 65 28 29  mous_available()
3b10: 3b 0a 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65 5f  ;..  rid = name_
3b20: 74 6f 5f 72 69 64 28 50 44 28 22 6e 61 6d 65 22  to_rid(PD("name"
3b30: 2c 22 22 29 29 3b 0a 20 20 69 66 28 20 72 69 64  ,""));.  if( rid
3b40: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69  ==0 ){.    fossi
3b50: 6c 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28  l_redirect_home(
3b60: 29 3b 0a 20 20 7d 0a 20 20 7a 55 75 69 64 20 3d  );.  }.  zUuid =
3b70: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
3b80: 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c  ECT uuid FROM bl
3b90: 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22  ob WHERE rid=%d"
3ba0: 2c 20 72 69 64 29 3b 0a 20 20 73 74 79 6c 65 5f  , rid);.  style_
3bb0: 68 65 61 64 65 72 28 22 43 68 65 63 6b 2d 69 6e  header("Check-in
3bc0: 20 5b 25 2e 31 30 73 5d 22 2c 20 7a 55 75 69 64   [%.10s]", zUuid
3bd0: 29 3b 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28  );.  db_prepare(
3be0: 26 71 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20  &q,.    "SELECT 
3bf0: 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 29 2c  datetime(mtime),
3c00: 20 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 63   ".    "       c
3c10: 6f 61 6c 65 73 63 65 28 65 76 65 6e 74 2e 65 63  oalesce(event.ec
3c20: 6f 6d 6d 65 6e 74 2c 65 76 65 6e 74 2e 63 6f 6d  omment,event.com
3c30: 6d 65 6e 74 29 2c 22 0a 20 20 20 20 22 20 20 20  ment),".    "   
3c40: 20 20 20 20 63 6f 61 6c 65 73 63 65 28 65 76 65      coalesce(eve
3c50: 6e 74 2e 65 75 73 65 72 2c 65 76 65 6e 74 2e 75  nt.euser,event.u
3c60: 73 65 72 29 22 0a 20 20 20 20 22 20 20 46 52 4f  ser)".    "  FRO
3c70: 4d 20 65 76 65 6e 74 20 57 48 45 52 45 20 74 79  M event WHERE ty
3c80: 70 65 3d 27 63 69 27 20 41 4e 44 20 6f 62 6a 69  pe='ci' AND obji
3c90: 64 3d 25 64 22 2c 0a 20 20 20 20 72 69 64 0a 20  d=%d",.    rid. 
3ca0: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f   );.  while( db_
3cb0: 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45  step(&q)==SQLITE
3cc0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
3cd0: 74 20 63 68 61 72 20 2a 7a 44 61 74 65 20 3d 20  t char *zDate = 
3ce0: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
3cf0: 71 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74  q, 0);.    const
3d00: 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 64   char *zUser = d
3d10: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
3d20: 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 2);.    const 
3d30: 63 68 61 72 20 2a 7a 43 6f 6d 6d 65 6e 74 20 3d  char *zComment =
3d40: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
3d50: 26 71 2c 20 31 29 3b 0a 20 20 20 20 40 20 3c 68  &q, 1);.    @ <h
3d60: 32 3e 43 68 65 63 6b 2d 69 6e 20 25 73 28 7a 55  2>Check-in %s(zU
3d70: 75 69 64 29 3c 2f 68 32 3e 0a 20 20 20 20 40 20  uid)</h2>.    @ 
3d80: 3c 70 3e 4d 61 64 65 20 62 79 0a 20 20 20 20 68  <p>Made by.    h
3d90: 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65 72  yperlink_to_user
3da0: 28 7a 55 73 65 72 2c 7a 44 61 74 65 2c 22 20 6f  (zUser,zDate," o
3db0: 6e 22 29 3b 0a 20 20 20 20 68 79 70 65 72 6c 69  n");.    hyperli
3dc0: 6e 6b 5f 74 6f 5f 64 61 74 65 28 7a 44 61 74 65  nk_to_date(zDate
3dd0: 2c 20 22 3a 22 29 3b 0a 20 20 20 20 40 20 25 77  , ":");.    @ %w
3de0: 28 7a 43 6f 6d 6d 65 6e 74 29 2e 20 0a 20 20 20  (zComment). .   
3df0: 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f 72 79   if( g.okHistory
3e00: 20 29 7b 0a 20 20 20 20 20 20 40 20 3c 61 20 68   ){.      @ <a h
3e10: 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55  ref="%s(g.zBaseU
3e20: 52 4c 29 2f 63 69 2f 25 73 28 7a 55 75 69 64 29  RL)/ci/%s(zUuid)
3e30: 22 3e 5b 64 65 74 61 69 6c 73 5d 3c 2f 61 3e 0a  ">[details]</a>.
3e40: 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 2f 70 3e      }.    @ </p>
3e50: 3c 68 72 3e 0a 20 20 7d 0a 20 20 64 62 5f 66 69  <hr>.  }.  db_fi
3e60: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 64 62  nalize(&q);.  db
3e70: 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20  _prepare(&q,.   
3e80: 20 20 22 53 45 4c 45 43 54 20 70 69 64 2c 20 66    "SELECT pid, f
3e90: 69 64 2c 20 6e 61 6d 65 22 0a 20 20 20 20 20 22  id, name".     "
3ea0: 20 20 46 52 4f 4d 20 6d 6c 69 6e 6b 2c 20 66 69    FROM mlink, fi
3eb0: 6c 65 6e 61 6d 65 22 0a 20 20 20 20 20 22 20 57  lename".     " W
3ec0: 48 45 52 45 20 6d 6c 69 6e 6b 2e 6d 69 64 3d 25  HERE mlink.mid=%
3ed0: 64 22 0a 20 20 20 20 20 22 20 20 20 41 4e 44 20  d".     "   AND 
3ee0: 66 69 6c 65 6e 61 6d 65 2e 66 6e 69 64 3d 6d 6c  filename.fnid=ml
3ef0: 69 6e 6b 2e 66 6e 69 64 22 0a 20 20 20 20 20 22  ink.fnid".     "
3f00: 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 22 2c   ORDER BY name",
3f10: 0a 20 20 20 20 20 72 69 64 0a 20 20 29 3b 0a 20  .     rid.  );. 
3f20: 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28   while( db_step(
3f30: 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)==SQLITE_ROW 
3f40: 29 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 20 3d  ){.    int pid =
3f50: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26   db_column_int(&
3f60: 71 2c 30 29 3b 0a 20 20 20 20 69 6e 74 20 66 69  q,0);.    int fi
3f70: 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e  d = db_column_in
3f80: 74 28 26 71 2c 31 29 3b 0a 20 20 20 20 63 6f 6e  t(&q,1);.    con
3f90: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
3fa0: 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28   db_column_text(
3fb0: 26 71 2c 32 29 3b 0a 20 20 20 20 69 66 28 20 67  &q,2);.    if( g
3fc0: 2e 6f 6b 48 69 73 74 6f 72 79 20 29 7b 0a 20 20  .okHistory ){.  
3fd0: 20 20 20 20 40 20 3c 70 3e 3c 61 20 68 72 65 66      @ <p><a href
3fe0: 3d 22 25 73 28 67 2e 7a 42 61 73 65 55 52 4c 29  ="%s(g.zBaseURL)
3ff0: 2f 66 69 6e 66 6f 3f 6e 61 6d 65 3d 25 54 28 7a  /finfo?name=%T(z
4000: 4e 61 6d 65 29 22 3e 25 68 28 7a 4e 61 6d 65 29  Name)">%h(zName)
4010: 3c 2f 61 3e 3c 2f 70 3e 0a 20 20 20 20 7d 65 6c  </a></p>.    }el
4020: 73 65 7b 0a 20 20 20 20 20 20 40 20 3c 70 3e 25  se{.      @ <p>%
4030: 68 28 7a 4e 61 6d 65 29 3c 2f 70 3e 0a 20 20 20  h(zName)</p>.   
4040: 20 7d 0a 20 20 20 20 40 20 3c 62 6c 6f 63 6b 71   }.    @ <blockq
4050: 75 6f 74 65 3e 3c 70 72 65 3e 0a 20 20 20 20 61  uote><pre>.    a
4060: 70 70 65 6e 64 5f 64 69 66 66 28 70 69 64 2c 20  ppend_diff(pid, 
4070: 66 69 64 29 3b 0a 20 20 20 20 40 20 3c 2f 70 72  fid);.    @ </pr
4080: 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a  e></blockquote>.
4090: 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a    }.  db_finaliz
40a0: 65 28 26 71 29 3b 0a 20 20 73 74 79 6c 65 5f 66  e(&q);.  style_f
40b0: 6f 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ooter();.}../*.*
40c0: 2a 20 57 72 69 74 65 20 61 20 64 65 73 63 72 69  * Write a descri
40d0: 70 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 62 6a 65  ption of an obje
40e0: 63 74 20 74 6f 20 74 68 65 20 77 77 77 20 72 65  ct to the www re
40f0: 70 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ply..**.** If th
4100: 65 20 6f 62 6a 65 63 74 20 69 73 20 61 20 66 69  e object is a fi
4110: 6c 65 20 74 68 65 6e 20 6d 65 6e 74 69 6f 6e 3a  le then mention:
4120: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 49 74 27  .**.**     * It'
4130: 73 20 61 72 74 69 66 61 63 74 20 49 44 0a 2a 2a  s artifact ID.**
4140: 20 20 20 20 20 2a 20 41 6c 6c 20 69 74 73 20 66       * All its f
4150: 69 6c 65 6e 61 6d 65 73 0a 2a 2a 20 20 20 20 20  ilenames.**     
4160: 2a 20 54 68 65 20 63 68 65 63 6b 2d 69 6e 20 69  * The check-in i
4170: 74 20 77 61 73 20 70 61 72 74 20 6f 66 2c 20 77  t was part of, w
4180: 69 74 68 20 74 69 6d 65 73 20 61 6e 64 20 75 73  ith times and us
4190: 65 72 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ers.**.** If the
41a0: 20 6f 62 6a 65 63 74 20 69 73 20 61 20 6d 61 6e   object is a man
41b0: 69 66 65 73 74 2c 20 74 68 65 6e 20 6d 65 6e 74  ifest, then ment
41c0: 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ion:.**.**     *
41d0: 20 49 74 27 73 20 61 72 74 69 66 61 63 74 20 49   It's artifact I
41e0: 44 0a 2a 2a 20 20 20 20 20 2a 20 64 61 74 65 20  D.**     * date 
41f0: 6f 66 20 63 68 65 63 6b 2d 69 6e 0a 2a 2a 20 20  of check-in.**  
4200: 20 20 20 2a 20 43 6f 6d 6d 65 6e 74 20 26 20 75     * Comment & u
4210: 73 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ser.*/.static vo
4220: 69 64 20 6f 62 6a 65 63 74 5f 64 65 73 63 72 69  id object_descri
4230: 70 74 69 6f 6e 28 0a 20 20 69 6e 74 20 72 69 64  ption(.  int rid
4240: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4250: 20 20 2f 2a 20 54 68 65 20 61 72 74 69 66 61 63    /* The artifac
4260: 74 20 49 44 20 2a 2f 0a 20 20 69 6e 74 20 6c 69  t ID */.  int li
4270: 6e 6b 54 6f 56 69 65 77 2c 20 20 20 20 20 20 20  nkToView,       
4280: 20 20 20 2f 2a 20 41 64 64 20 76 69 65 77 65 72     /* Add viewer
4290: 20 6c 69 6e 6b 20 69 66 20 74 72 75 65 20 2a 2f   link if true */
42a0: 0a 20 20 42 6c 6f 62 20 2a 70 44 6f 77 6e 6c 6f  .  Blob *pDownlo
42b0: 61 64 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 46  adName      /* F
42c0: 69 6c 6c 20 77 69 74 68 20 61 6e 20 61 70 70 72  ill with an appr
42d0: 6f 70 72 69 61 74 65 20 64 6f 77 6e 6c 6f 61 64  opriate download
42e0: 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 53 74   name */.){.  St
42f0: 6d 74 20 71 3b 0a 20 20 69 6e 74 20 63 6e 74 20  mt q;.  int cnt 
4300: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 69 6b 69  = 0;.  int nWiki
4310: 20 3d 20 30 3b 0a 20 20 64 62 5f 70 72 65 70 61   = 0;.  db_prepa
4320: 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45 4c 45  re(&q,.    "SELE
4330: 43 54 20 66 69 6c 65 6e 61 6d 65 2e 6e 61 6d 65  CT filename.name
4340: 2c 20 64 61 74 65 74 69 6d 65 28 65 76 65 6e 74  , datetime(event
4350: 2e 6d 74 69 6d 65 29 2c 22 0a 20 20 20 20 22 20  .mtime),".    " 
4360: 20 20 20 20 20 20 63 6f 61 6c 65 73 63 65 28 65        coalesce(e
4370: 76 65 6e 74 2e 65 63 6f 6d 6d 65 6e 74 2c 65 76  vent.ecomment,ev
4380: 65 6e 74 2e 63 6f 6d 6d 65 6e 74 29 2c 22 0a 20  ent.comment),". 
4390: 20 20 20 22 20 20 20 20 20 20 20 63 6f 61 6c 65     "       coale
43a0: 73 63 65 28 65 76 65 6e 74 2e 65 75 73 65 72 2c  sce(event.euser,
43b0: 65 76 65 6e 74 2e 75 73 65 72 29 2c 22 0a 20 20  event.user),".  
43c0: 20 20 22 20 20 20 20 20 20 20 62 2e 75 75 69 64    "       b.uuid
43d0: 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 6d 6c  ".    "  FROM ml
43e0: 69 6e 6b 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 65  ink, filename, e
43f0: 76 65 6e 74 2c 20 62 6c 6f 62 20 61 2c 20 62 6c  vent, blob a, bl
4400: 6f 62 20 62 22 0a 20 20 20 20 22 20 57 48 45 52  ob b".    " WHER
4410: 45 20 66 69 6c 65 6e 61 6d 65 2e 66 6e 69 64 3d  E filename.fnid=
4420: 6d 6c 69 6e 6b 2e 66 6e 69 64 22 0a 20 20 20 20  mlink.fnid".    
4430: 22 20 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f 62  "   AND event.ob
4440: 6a 69 64 3d 6d 6c 69 6e 6b 2e 6d 69 64 22 0a 20  jid=mlink.mid". 
4450: 20 20 20 22 20 20 20 41 4e 44 20 61 2e 72 69 64     "   AND a.rid
4460: 3d 6d 6c 69 6e 6b 2e 66 69 64 22 0a 20 20 20 20  =mlink.fid".    
4470: 22 20 20 20 41 4e 44 20 62 2e 72 69 64 3d 6d 6c  "   AND b.rid=ml
4480: 69 6e 6b 2e 6d 69 64 22 0a 20 20 20 20 22 20 20  ink.mid".    "  
4490: 20 41 4e 44 20 6d 6c 69 6e 6b 2e 66 69 64 3d 25   AND mlink.fid=%
44a0: 64 22 2c 0a 20 20 20 20 72 69 64 0a 20 20 29 3b  d",.    rid.  );
44b0: 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65  .  while( db_ste
44c0: 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  p(&q)==SQLITE_RO
44d0: 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  W ){.    const c
44e0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 64 62 5f  har *zName = db_
44f0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
4500: 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  0);.    const ch
4510: 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63  ar *zDate = db_c
4520: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31  olumn_text(&q, 1
4530: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
4540: 72 20 2a 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c  r *zCom = db_col
4550: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29 3b  umn_text(&q, 2);
4560: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
4570: 2a 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f 6c 75  *zUser = db_colu
4580: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29 3b 0a  mn_text(&q, 3);.
4590: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
45a0: 7a 56 65 72 73 20 3d 20 64 62 5f 63 6f 6c 75 6d  zVers = db_colum
45b0: 6e 5f 74 65 78 74 28 26 71 2c 20 34 29 3b 0a 20  n_text(&q, 4);. 
45c0: 20 20 20 69 66 28 20 63 6e 74 3e 30 20 29 7b 0a     if( cnt>0 ){.
45d0: 20 20 20 20 20 20 40 20 41 6c 73 6f 20 66 69 6c        @ Also fil
45e0: 65 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e.    }else{.   
45f0: 20 20 20 40 20 46 69 6c 65 0a 20 20 20 20 7d 0a     @ File.    }.
4600: 20 20 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74      if( g.okHist
4610: 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 40 20 3c  ory ){.      @ <
4620: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
4630: 73 65 55 52 4c 29 2f 66 69 6e 66 6f 3f 6e 61 6d  seURL)/finfo?nam
4640: 65 3d 25 54 28 7a 4e 61 6d 65 29 22 3e 25 68 28  e=%T(zName)">%h(
4650: 7a 4e 61 6d 65 29 3c 2f 61 3e 0a 20 20 20 20 7d  zName)</a>.    }
4660: 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 25 68  else{.      @ %h
4670: 28 7a 4e 61 6d 65 29 0a 20 20 20 20 7d 0a 20 20  (zName).    }.  
4680: 20 20 40 20 70 61 72 74 20 6f 66 20 63 68 65 63    @ part of chec
4690: 6b 2d 69 6e 0a 20 20 20 20 68 79 70 65 72 6c 69  k-in.    hyperli
46a0: 6e 6b 5f 74 6f 5f 75 75 69 64 28 7a 56 65 72 73  nk_to_uuid(zVers
46b0: 29 3b 0a 20 20 20 20 40 20 2d 20 25 77 28 7a 43  );.    @ - %w(zC
46c0: 6f 6d 29 20 62 79 20 0a 20 20 20 20 68 79 70 65  om) by .    hype
46d0: 72 6c 69 6e 6b 5f 74 6f 5f 75 73 65 72 28 7a 55  rlink_to_user(zU
46e0: 73 65 72 2c 7a 44 61 74 65 2c 22 20 6f 6e 22 29  ser,zDate," on")
46f0: 3b 0a 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f  ;.    hyperlink_
4700: 74 6f 5f 64 61 74 65 28 7a 44 61 74 65 2c 22 2e  to_date(zDate,".
4710: 22 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  ");.    cnt++;. 
4720: 20 20 20 69 66 28 20 70 44 6f 77 6e 6c 6f 61 64     if( pDownload
4730: 4e 61 6d 65 20 26 26 20 62 6c 6f 62 5f 73 69 7a  Name && blob_siz
4740: 65 28 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29  e(pDownloadName)
4750: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f  ==0 ){.      blo
4760: 62 5f 61 70 70 65 6e 64 28 70 44 6f 77 6e 6c 6f  b_append(pDownlo
4770: 61 64 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  adName, zName, -
4780: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
4790: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
47a0: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71  .  db_prepare(&q
47b0: 2c 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20 73  , .    "SELECT s
47c0: 75 62 73 74 72 28 74 61 67 6e 61 6d 65 2c 20 36  ubstr(tagname, 6
47d0: 2c 20 31 30 30 30 30 29 2c 20 64 61 74 65 74 69  , 10000), dateti
47e0: 6d 65 28 65 76 65 6e 74 2e 6d 74 69 6d 65 29 2c  me(event.mtime),
47f0: 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 63 6f  ".    "       co
4800: 61 6c 65 73 63 65 28 65 76 65 6e 74 2e 65 75 73  alesce(event.eus
4810: 65 72 2c 20 65 76 65 6e 74 2e 75 73 65 72 29 22  er, event.user)"
4820: 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 74 61 67  .    "  FROM tag
4830: 78 72 65 66 2c 20 74 61 67 2c 20 65 76 65 6e 74  xref, tag, event
4840: 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 74 61  ".    " WHERE ta
4850: 67 78 72 65 66 2e 72 69 64 3d 25 64 22 0a 20 20  gxref.rid=%d".  
4860: 20 20 22 20 20 20 41 4e 44 20 74 61 67 2e 74 61    "   AND tag.ta
4870: 67 69 64 3d 74 61 67 78 72 65 66 2e 74 61 67 69  gid=tagxref.tagi
4880: 64 22 20 0a 20 20 20 20 22 20 20 20 41 4e 44 20  d" .    "   AND 
4890: 74 61 67 2e 74 61 67 6e 61 6d 65 20 4c 49 4b 45  tag.tagname LIKE
48a0: 20 27 77 69 6b 69 2d 25 25 27 22 0a 20 20 20 20   'wiki-%%'".    
48b0: 22 20 20 20 41 4e 44 20 65 76 65 6e 74 2e 6f 62  "   AND event.ob
48c0: 6a 69 64 3d 74 61 67 78 72 65 66 2e 72 69 64 22  jid=tagxref.rid"
48d0: 2c 0a 20 20 20 20 72 69 64 0a 20 20 29 3b 0a 20  ,.    rid.  );. 
48e0: 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28   while( db_step(
48f0: 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  &q)==SQLITE_ROW 
4900: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
4910: 72 20 2a 7a 50 61 67 65 6e 61 6d 65 20 3d 20 64  r *zPagename = d
4920: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
4930: 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 0);.    const 
4940: 63 68 61 72 20 2a 7a 44 61 74 65 20 3d 20 64 62  char *zDate = db
4950: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c  _column_text(&q,
4960: 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   1);.    const c
4970: 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 64 62 5f  har *zUser = db_
4980: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
4990: 32 29 3b 0a 20 20 20 20 69 66 28 20 63 6e 74 3e  2);.    if( cnt>
49a0: 30 20 29 7b 0a 20 20 20 20 20 20 40 20 41 6c 73  0 ){.      @ Als
49b0: 6f 20 77 69 6b 69 20 70 61 67 65 0a 20 20 20 20  o wiki page.    
49c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 57  }else{.      @ W
49d0: 69 6b 69 20 70 61 67 65 0a 20 20 20 20 7d 0a 20  iki page.    }. 
49e0: 20 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f     if( g.okHisto
49f0: 72 79 20 29 7b 0a 20 20 20 20 20 20 40 20 5b 3c  ry ){.      @ [<
4a00: 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a 42 61  a href="%s(g.zBa
4a10: 73 65 55 52 4c 29 2f 77 69 6b 69 3f 6e 61 6d 65  seURL)/wiki?name
4a20: 3d 25 74 28 7a 50 61 67 65 6e 61 6d 65 29 22 3e  =%t(zPagename)">
4a30: 25 68 28 7a 50 61 67 65 6e 61 6d 65 29 3c 2f 61  %h(zPagename)</a
4a40: 3e 5d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  >].    }else{.  
4a50: 20 20 20 20 40 20 5b 25 68 28 7a 50 61 67 65 6e      @ [%h(zPagen
4a60: 61 6d 65 29 5d 0a 20 20 20 20 7d 0a 20 20 20 20  ame)].    }.    
4a70: 40 20 62 79 0a 20 20 20 20 68 79 70 65 72 6c 69  @ by.    hyperli
4a80: 6e 6b 5f 74 6f 5f 75 73 65 72 28 7a 55 73 65 72  nk_to_user(zUser
4a90: 2c 7a 44 61 74 65 2c 22 20 6f 6e 22 29 3b 0a 20  ,zDate," on");. 
4aa0: 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f     hyperlink_to_
4ab0: 64 61 74 65 28 7a 44 61 74 65 2c 22 2e 22 29 3b  date(zDate,".");
4ac0: 0a 20 20 20 20 6e 57 69 6b 69 2b 2b 3b 0a 20 20  .    nWiki++;.  
4ad0: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28    cnt++;.    if(
4ae0: 20 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 20 26   pDownloadName &
4af0: 26 20 62 6c 6f 62 5f 73 69 7a 65 28 70 44 6f 77  & blob_size(pDow
4b00: 6e 6c 6f 61 64 4e 61 6d 65 29 3d 3d 30 20 29 7b  nloadName)==0 ){
4b10: 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  .      blob_appe
4b20: 6e 64 28 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65  nd(pDownloadName
4b30: 2c 20 7a 50 61 67 65 6e 61 6d 65 2c 20 2d 31 29  , zPagename, -1)
4b40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
4b50: 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20  _finalize(&q);. 
4b60: 20 69 66 28 20 6e 57 69 6b 69 3d 3d 30 20 29 7b   if( nWiki==0 ){
4b70: 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28  .    db_prepare(
4b80: 26 71 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 43  &q,.      "SELEC
4b90: 54 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65  T datetime(mtime
4ba0: 29 2c 20 75 73 65 72 2c 20 63 6f 6d 6d 65 6e 74  ), user, comment
4bb0: 2c 20 74 79 70 65 2c 20 75 75 69 64 22 0a 20 20  , type, uuid".  
4bc0: 20 20 20 20 22 20 20 46 52 4f 4d 20 65 76 65 6e      "  FROM even
4bd0: 74 2c 20 62 6c 6f 62 22 0a 20 20 20 20 20 20 22  t, blob".      "
4be0: 20 57 48 45 52 45 20 65 76 65 6e 74 2e 6f 62 6a   WHERE event.obj
4bf0: 69 64 3d 25 64 22 0a 20 20 20 20 20 20 22 20 20  id=%d".      "  
4c00: 20 41 4e 44 20 62 6c 6f 62 2e 72 69 64 3d 25 64   AND blob.rid=%d
4c10: 22 2c 0a 20 20 20 20 20 20 72 69 64 2c 20 72 69  ",.      rid, ri
4c20: 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 77 68 69  d.    );.    whi
4c30: 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d  le( db_step(&q)=
4c40: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
4c50: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
4c60: 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75  *zDate = db_colu
4c70: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b 0a  mn_text(&q, 0);.
4c80: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
4c90: 20 2a 7a 55 73 65 72 20 3d 20 64 62 5f 63 6f 6c   *zUser = db_col
4ca0: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b  umn_text(&q, 1);
4cb0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
4cc0: 72 20 2a 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c  r *zCom = db_col
4cd0: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29 3b  umn_text(&q, 2);
4ce0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
4cf0: 72 20 2a 7a 54 79 70 65 20 3d 20 64 62 5f 63 6f  r *zType = db_co
4d00: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 33 29  lumn_text(&q, 3)
4d10: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
4d20: 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f 63  ar *zUuid = db_c
4d30: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 34  olumn_text(&q, 4
4d40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74  );.      if( cnt
4d50: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20  >0 ){.        @ 
4d60: 41 6c 73 6f 0a 20 20 20 20 20 20 7d 0a 20 20 20  Also.      }.   
4d70: 20 20 20 69 66 28 20 7a 54 79 70 65 5b 30 5d 3d     if( zType[0]=
4d80: 3d 27 77 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='w' ){.        
4d90: 40 20 57 69 6b 69 20 65 64 69 74 0a 20 20 20 20  @ Wiki edit.    
4da0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 79 70    }else if( zTyp
4db0: 65 5b 30 5d 3d 3d 27 74 27 20 29 7b 0a 20 20 20  e[0]=='t' ){.   
4dc0: 20 20 20 20 20 40 20 54 69 63 6b 65 74 20 63 68       @ Ticket ch
4dd0: 61 6e 67 65 0a 20 20 20 20 20 20 7d 65 6c 73 65  ange.      }else
4de0: 20 69 66 28 20 7a 54 79 70 65 5b 30 5d 3d 3d 27   if( zType[0]=='
4df0: 63 27 20 29 7b 0a 20 20 20 20 20 20 20 20 40 20  c' ){.        @ 
4e00: 4d 61 6e 69 66 65 73 74 20 6f 66 20 63 68 65 63  Manifest of chec
4e10: 6b 2d 69 6e 0a 20 20 20 20 20 20 7d 65 6c 73 65  k-in.      }else
4e20: 7b 0a 20 20 20 20 20 20 20 20 40 20 43 6f 6e 74  {.        @ Cont
4e30: 72 6f 6c 20 66 69 6c 65 20 72 65 66 65 72 65 6e  rol file referen
4e40: 63 69 6e 67 0a 20 20 20 20 20 20 7d 0a 20 20 20  cing.      }.   
4e50: 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74 6f 5f     hyperlink_to_
4e60: 75 75 69 64 28 7a 55 75 69 64 29 3b 0a 20 20 20  uuid(zUuid);.   
4e70: 20 20 20 40 20 2d 20 25 77 28 7a 43 6f 6d 29 20     @ - %w(zCom) 
4e80: 62 79 0a 20 20 20 20 20 20 68 79 70 65 72 6c 69  by.      hyperli
4e90: 6e 6b 5f 74 6f 5f 75 73 65 72 28 7a 55 73 65 72  nk_to_user(zUser
4ea0: 2c 7a 44 61 74 65 2c 22 20 6f 6e 22 29 3b 0a 20  ,zDate," on");. 
4eb0: 20 20 20 20 20 68 79 70 65 72 6c 69 6e 6b 5f 74       hyperlink_t
4ec0: 6f 5f 64 61 74 65 28 7a 44 61 74 65 2c 20 22 2e  o_date(zDate, ".
4ed0: 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  ");.      if( pD
4ee0: 6f 77 6e 6c 6f 61 64 4e 61 6d 65 20 26 26 20 62  ownloadName && b
4ef0: 6c 6f 62 5f 73 69 7a 65 28 70 44 6f 77 6e 6c 6f  lob_size(pDownlo
4f00: 61 64 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  adName)==0 ){.  
4f10: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e        blob_appen
4f20: 64 28 70 44 6f 77 6e 6c 6f 61 64 4e 61 6d 65 2c  d(pDownloadName,
4f30: 20 7a 55 75 69 64 2c 20 2d 31 29 3b 0a 20 20 20   zUuid, -1);.   
4f40: 20 20 20 7d 0a 20 20 20 20 20 20 63 6e 74 2b 2b     }.      cnt++
4f50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 66  ;.    }.    db_f
4f60: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 7d  inalize(&q);.  }
4f70: 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b  .  if( cnt==0 ){
4f80: 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 75 69 64  .    char *zUuid
4f90: 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53   = db_text(0, "S
4fa0: 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20  ELECT uuid FROM 
4fb0: 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25  blob WHERE rid=%
4fc0: 64 22 2c 20 72 69 64 29 3b 0a 20 20 20 20 40 20  d", rid);.    @ 
4fd0: 43 6f 6e 74 72 6f 6c 20 61 72 74 69 66 61 63 74  Control artifact
4fe0: 2e 0a 20 20 20 20 69 66 28 20 70 44 6f 77 6e 6c  ..    if( pDownl
4ff0: 6f 61 64 4e 61 6d 65 20 26 26 20 62 6c 6f 62 5f  oadName && blob_
5000: 73 69 7a 65 28 70 44 6f 77 6e 6c 6f 61 64 4e 61  size(pDownloadNa
5010: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
5020: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 44 6f 77  blob_append(pDow
5030: 6e 6c 6f 61 64 4e 61 6d 65 2c 20 7a 55 75 69 64  nloadName, zUuid
5040: 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
5050: 65 6c 73 65 20 69 66 28 20 6c 69 6e 6b 54 6f 56  else if( linkToV
5060: 69 65 77 20 26 26 20 67 2e 6f 6b 48 69 73 74 6f  iew && g.okHisto
5070: 72 79 20 29 7b 0a 20 20 20 20 40 20 3c 61 20 68  ry ){.    @ <a h
5080: 72 65 66 3d 22 25 73 28 67 2e 7a 42 61 73 65 55  ref="%s(g.zBaseU
5090: 52 4c 29 2f 61 72 74 69 66 61 63 74 2f 25 64 28  RL)/artifact/%d(
50a0: 72 69 64 29 22 3e 5b 76 69 65 77 5d 3c 2f 61 3e  rid)">[view]</a>
50b0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  .  }.}.../*.** W
50c0: 45 42 50 41 47 45 3a 20 66 64 69 66 66 0a 2a 2a  EBPAGE: fdiff.**
50d0: 0a 2a 2a 20 54 77 6f 20 61 72 67 75 6d 65 6e 74  .** Two argument
50e0: 73 2c 20 76 31 20 61 6e 64 20 76 32 2c 20 61 72  s, v1 and v2, ar
50f0: 65 20 69 6e 74 65 67 65 72 73 2e 20 20 53 68 6f  e integers.  Sho
5100: 77 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  w the difference
5110: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 74 68 65 20   between.** the 
5120: 74 77 6f 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a  two records..*/.
5130: 76 6f 69 64 20 64 69 66 66 5f 70 61 67 65 28 76  void diff_page(v
5140: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 76 31 20 3d  oid){.  int v1 =
5150: 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44 28   name_to_rid(PD(
5160: 22 76 31 22 2c 22 30 22 29 29 3b 0a 20 20 69 6e  "v1","0"));.  in
5170: 74 20 76 32 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72  t v2 = name_to_r
5180: 69 64 28 50 44 28 22 76 32 22 2c 22 30 22 29 29  id(PD("v2","0"))
5190: 3b 0a 20 20 42 6c 6f 62 20 63 31 2c 20 63 32 2c  ;.  Blob c1, c2,
51a0: 20 64 69 66 66 3b 0a 0a 20 20 6c 6f 67 69 6e 5f   diff;..  login_
51b0: 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c  check_credential
51c0: 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f 6b  s();.  if( !g.ok
51d0: 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65  Read ){ login_ne
51e0: 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b 20  eded(); return; 
51f0: 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72  }.  style_header
5200: 28 22 44 69 66 66 22 29 3b 0a 20 20 40 20 3c 68  ("Diff");.  @ <h
5210: 32 3e 44 69 66 66 65 72 65 6e 63 65 73 20 46 72  2>Differences Fr
5220: 6f 6d 3a 3c 2f 68 32 3e 0a 20 20 40 20 3c 62 6c  om:</h2>.  @ <bl
5230: 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 6f 62 6a 65  ockquote>.  obje
5240: 63 74 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 76  ct_description(v
5250: 31 2c 20 31 2c 20 30 29 3b 0a 20 20 40 20 3c 2f  1, 1, 0);.  @ </
5260: 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 40 20  blockquote>.  @ 
5270: 3c 68 32 3e 54 6f 3a 3c 2f 68 32 3e 0a 20 20 40  <h2>To:</h2>.  @
5280: 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20   <blockquote>.  
5290: 6f 62 6a 65 63 74 5f 64 65 73 63 72 69 70 74 69  object_descripti
52a0: 6f 6e 28 76 32 2c 20 31 2c 20 30 29 3b 0a 20 20  on(v2, 1, 0);.  
52b0: 40 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a  @ </blockquote>.
52c0: 20 20 40 20 3c 68 72 3e 0a 20 20 40 20 3c 62 6c    @ <hr>.  @ <bl
52d0: 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 20  ockquote><pre>. 
52e0: 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 76 31 2c   content_get(v1,
52f0: 20 26 63 31 29 3b 0a 20 20 63 6f 6e 74 65 6e 74   &c1);.  content
5300: 5f 67 65 74 28 76 32 2c 20 26 63 32 29 3b 0a 20  _get(v2, &c2);. 
5310: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 64 69 66 66   blob_zero(&diff
5320: 29 3b 0a 20 20 74 65 78 74 5f 64 69 66 66 28 26  );.  text_diff(&
5330: 63 31 2c 20 26 63 32 2c 20 26 64 69 66 66 2c 20  c1, &c2, &diff, 
5340: 34 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74  4);.  blob_reset
5350: 28 26 63 31 29 3b 0a 20 20 62 6c 6f 62 5f 72 65  (&c1);.  blob_re
5360: 73 65 74 28 26 63 32 29 3b 0a 20 20 40 20 25 68  set(&c2);.  @ %h
5370: 28 62 6c 6f 62 5f 73 74 72 28 26 64 69 66 66 29  (blob_str(&diff)
5380: 29 0a 20 20 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c  ).  @ </pre></bl
5390: 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 62 6c 6f 62  ockquote>.  blob
53a0: 5f 72 65 73 65 74 28 26 64 69 66 66 29 3b 0a 20  _reset(&diff);. 
53b0: 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b   style_footer();
53c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47  .}../*.** WEBPAG
53d0: 45 3a 20 72 61 77 0a 2a 2a 20 55 52 4c 3a 20 2f  E: raw.** URL: /
53e0: 72 61 77 3f 6e 61 6d 65 3d 41 52 54 49 46 41 43  raw?name=ARTIFAC
53f0: 54 49 44 26 6d 3d 54 59 50 45 0a 2a 2a 20 0a 2a  TID&m=TYPE.** .*
5400: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69  * Return the uni
5410: 6e 74 65 72 70 72 65 74 65 64 20 63 6f 6e 74 65  nterpreted conte
5420: 6e 74 20 6f 66 20 61 6e 20 61 72 74 69 66 61 63  nt of an artifac
5430: 74 2e 20 20 55 73 65 64 20 70 72 69 6d 61 72 69  t.  Used primari
5440: 6c 79 0a 2a 2a 20 74 6f 20 76 69 65 77 20 61 72  ly.** to view ar
5450: 74 69 66 61 63 74 73 20 74 68 61 74 20 61 72 65  tifacts that are
5460: 20 69 6d 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64   images..*/.void
5470: 20 72 61 77 61 72 74 69 66 61 63 74 5f 70 61 67   rawartifact_pag
5480: 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 72  e(void){.  int r
5490: 69 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  id;.  const char
54a0: 20 2a 7a 4d 69 6d 65 3b 0a 20 20 42 6c 6f 62 20   *zMime;.  Blob 
54b0: 63 6f 6e 74 65 6e 74 3b 0a 0a 20 20 72 69 64 20  content;..  rid 
54c0: 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44  = name_to_rid(PD
54d0: 28 22 6e 61 6d 65 22 2c 22 30 22 29 29 3b 0a 20  ("name","0"));. 
54e0: 20 7a 4d 69 6d 65 20 3d 20 50 44 28 22 6d 22 2c   zMime = PD("m",
54f0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66  "application/x-f
5500: 6f 73 73 69 6c 2d 61 72 74 69 66 61 63 74 22 29  ossil-artifact")
5510: 3b 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f  ;.  login_check_
5520: 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20  credentials();. 
5530: 20 69 66 28 20 21 67 2e 6f 6b 52 65 61 64 20 29   if( !g.okRead )
5540: 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29  { login_needed()
5550: 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 69 66  ; return; }.  if
5560: 28 20 72 69 64 3d 3d 30 20 29 7b 20 63 67 69 5f  ( rid==0 ){ cgi_
5570: 72 65 64 69 72 65 63 74 28 22 2f 68 6f 6d 65 22  redirect("/home"
5580: 29 3b 20 7d 0a 20 20 63 6f 6e 74 65 6e 74 5f 67  ); }.  content_g
5590: 65 74 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74  et(rid, &content
55a0: 29 3b 0a 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e  );.  cgi_set_con
55b0: 74 65 6e 74 5f 74 79 70 65 28 7a 4d 69 6d 65 29  tent_type(zMime)
55c0: 3b 0a 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e 74  ;.  cgi_set_cont
55d0: 65 6e 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 7d  ent(&content);.}
55e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 61  ../*.** Render a
55f0: 20 68 65 78 20 64 75 6d 70 20 6f 66 20 61 20 66   hex dump of a f
5600: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ile..*/.static v
5610: 6f 69 64 20 68 65 78 64 75 6d 70 28 42 6c 6f 62  oid hexdump(Blob
5620: 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 63 6f 6e 73   *pBlob){.  cons
5630: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
5640: 2a 78 3b 0a 20 20 69 6e 74 20 6e 2c 20 69 2c 20  *x;.  int n, i, 
5650: 6a 2c 20 6b 3b 0a 20 20 63 68 61 72 20 7a 4c 69  j, k;.  char zLi
5660: 6e 65 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69  ne[100];.  stati
5670: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 48 65  c const char zHe
5680: 78 5b 5d 20 3d 20 22 30 31 32 33 34 35 36 37 38  x[] = "012345678
5690: 39 61 62 63 64 65 66 22 3b 0a 0a 20 20 78 20 3d  9abcdef";..  x =
56a0: 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
56b0: 20 63 68 61 72 2a 29 62 6c 6f 62 5f 62 75 66 66   char*)blob_buff
56c0: 65 72 28 70 42 6c 6f 62 29 3b 0a 20 20 6e 20 3d  er(pBlob);.  n =
56d0: 20 62 6c 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62   blob_size(pBlob
56e0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
56f0: 6e 3b 20 69 2b 3d 31 36 29 7b 0a 20 20 20 20 6a  n; i+=16){.    j
5700: 20 3d 20 30 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b   = 0;.    zLine[
5710: 30 5d 20 3d 20 7a 48 65 78 5b 28 69 3e 3e 32 34  0] = zHex[(i>>24
5720: 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e  )&0xf];.    zLin
5730: 65 5b 31 5d 20 3d 20 7a 48 65 78 5b 28 69 3e 3e  e[1] = zHex[(i>>
5740: 31 36 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a 4c  16)&0xf];.    zL
5750: 69 6e 65 5b 32 5d 20 3d 20 7a 48 65 78 5b 28 69  ine[2] = zHex[(i
5760: 3e 3e 38 29 26 30 78 66 5d 3b 0a 20 20 20 20 7a  >>8)&0xf];.    z
5770: 4c 69 6e 65 5b 33 5d 20 3d 20 7a 48 65 78 5b 69  Line[3] = zHex[i
5780: 26 30 78 66 5d 3b 0a 20 20 20 20 7a 4c 69 6e 65  &0xf];.    zLine
5790: 5b 34 5d 20 3d 20 27 3a 27 3b 0a 20 20 20 20 73  [4] = ':';.    s
57a0: 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25  printf(zLine, "%
57b0: 30 34 78 3a 20 22 2c 20 69 29 3b 0a 20 20 20 20  04x: ", i);.    
57c0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 36 3b 20 6a  for(j=0; j<16; j
57d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6b 20 3d 20 35  ++){.      k = 5
57e0: 2b 6a 2a 33 3b 0a 20 20 20 20 20 20 7a 4c 69 6e  +j*3;.      zLin
57f0: 65 5b 6b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  e[k] = ' ';.    
5800: 20 20 69 66 28 20 69 2b 6a 3c 6e 20 29 7b 0a 20    if( i+j<n ){. 
5810: 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
5820: 63 68 61 72 20 63 20 3d 20 78 5b 69 2b 6a 5d 3b  char c = x[i+j];
5830: 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b  .        zLine[k
5840: 2b 31 5d 20 3d 20 7a 48 65 78 5b 63 3e 3e 34 5d  +1] = zHex[c>>4]
5850: 3b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b  ;.        zLine[
5860: 6b 2b 32 5d 20 3d 20 7a 48 65 78 5b 63 26 30 78  k+2] = zHex[c&0x
5870: 66 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  f];.      }else{
5880: 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b  .        zLine[k
5890: 2b 31 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  +1] = ' ';.     
58a0: 20 20 20 7a 4c 69 6e 65 5b 6b 2b 32 5d 20 3d 20     zLine[k+2] = 
58b0: 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ' ';.      }.   
58c0: 20 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b 35 33 5d   }.    zLine[53]
58d0: 20 3d 20 27 20 27 3b 0a 20 20 20 20 7a 4c 69 6e   = ' ';.    zLin
58e0: 65 5b 35 34 5d 20 3d 20 27 20 27 3b 0a 20 20 20  e[54] = ' ';.   
58f0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 36 3b 20   for(j=0; j<16; 
5900: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 6b 20 3d 20  j++){.      k = 
5910: 6a 2b 35 35 3b 0a 20 20 20 20 20 20 69 66 28 20  j+55;.      if( 
5920: 69 2b 6a 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  i+j<n ){.       
5930: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
5940: 20 3d 20 78 5b 69 2b 6a 5d 3b 0a 20 20 20 20 20   = x[i+j];.     
5950: 20 20 20 69 66 28 20 63 3e 3d 30 78 32 30 20 26     if( c>=0x20 &
5960: 26 20 63 3c 3d 30 78 37 65 20 29 7b 0a 20 20 20  & c<=0x7e ){.   
5970: 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6b 5d 20         zLine[k] 
5980: 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = c;.        }el
5990: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c  se{.          zL
59a0: 69 6e 65 5b 6b 5d 20 3d 20 27 2e 27 3b 0a 20 20  ine[k] = '.';.  
59b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
59c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  lse{.        zLi
59d0: 6e 65 5b 6b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ne[k] = 0;.     
59e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c 69   }.    }.    zLi
59f0: 6e 65 5b 37 31 5d 20 3d 20 30 3b 0a 20 20 20 20  ne[71] = 0;.    
5a00: 40 20 25 68 28 7a 4c 69 6e 65 29 0a 20 20 7d 0a  @ %h(zLine).  }.
5a10: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47 45  }../*.** WEBPAGE
5a20: 3a 20 68 65 78 64 75 6d 70 0a 2a 2a 20 55 52 4c  : hexdump.** URL
5a30: 3a 20 2f 68 65 78 64 75 6d 70 3f 6e 61 6d 65 3d  : /hexdump?name=
5a40: 41 52 54 49 46 41 43 54 49 44 0a 2a 2a 20 0a 2a  ARTIFACTID.** .*
5a50: 2a 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c  * Show the compl
5a60: 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ete content of a
5a70: 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65 64   file identified
5a80: 20 62 79 20 41 52 54 49 46 41 43 54 49 44 0a 2a   by ARTIFACTID.*
5a90: 2a 20 61 73 20 70 72 65 66 6f 72 6d 61 74 74 65  * as preformatte
5aa0: 64 20 74 65 78 74 2e 0a 2a 2f 0a 76 6f 69 64 20  d text..*/.void 
5ab0: 68 65 78 64 75 6d 70 5f 70 61 67 65 28 76 6f 69  hexdump_page(voi
5ac0: 64 29 7b 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20  d){.  int rid;. 
5ad0: 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20   Blob content;. 
5ae0: 20 42 6c 6f 62 20 64 6f 77 6e 6c 6f 61 64 4e 61   Blob downloadNa
5af0: 6d 65 3b 0a 20 20 63 68 61 72 20 2a 7a 55 75 69  me;.  char *zUui
5b00: 64 3b 0a 0a 20 20 72 69 64 20 3d 20 6e 61 6d 65  d;..  rid = name
5b10: 5f 74 6f 5f 72 69 64 28 50 44 28 22 6e 61 6d 65  _to_rid(PD("name
5b20: 22 2c 22 30 22 29 29 3b 0a 20 20 6c 6f 67 69 6e  ","0"));.  login
5b30: 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61  _check_credentia
5b40: 6c 73 28 29 3b 0a 20 20 69 66 28 20 21 67 2e 6f  ls();.  if( !g.o
5b50: 6b 52 65 61 64 20 29 7b 20 6c 6f 67 69 6e 5f 6e  kRead ){ login_n
5b60: 65 65 64 65 64 28 29 3b 20 72 65 74 75 72 6e 3b  eeded(); return;
5b70: 20 7d 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20   }.  if( rid==0 
5b80: 29 7b 20 63 67 69 5f 72 65 64 69 72 65 63 74 28  ){ cgi_redirect(
5b90: 22 2f 68 6f 6d 65 22 29 3b 20 7d 0a 20 20 69 66  "/home"); }.  if
5ba0: 28 20 67 2e 6f 6b 41 64 6d 69 6e 20 29 7b 0a 20  ( g.okAdmin ){. 
5bb0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5bc0: 55 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 22  Uuid = db_text("
5bd0: 22 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20  ", "SELECT uuid 
5be0: 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20  FROM blob WHERE 
5bf0: 72 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20  rid=%d", rid);. 
5c00: 20 20 20 69 66 28 20 64 62 5f 65 78 69 73 74 73     if( db_exists
5c10: 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  ("SELECT 1 FROM 
5c20: 73 68 75 6e 20 57 48 45 52 45 20 75 75 69 64 3d  shun WHERE uuid=
5c30: 27 25 73 27 22 2c 20 7a 55 75 69 64 29 20 29 7b  '%s'", zUuid) ){
5c40: 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62  .      style_sub
5c50: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 55 6e  menu_element("Un
5c60: 73 68 75 6e 22 2c 22 55 6e 73 68 75 6e 22 2c 20  shun","Unshun", 
5c70: 22 25 73 2f 73 68 75 6e 3f 75 75 69 64 3d 25 73  "%s/shun?uuid=%s
5c80: 26 73 75 62 3d 31 22 2c 0a 20 20 20 20 20 20 20  &sub=1",.       
5c90: 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 55 75       g.zTop, zUu
5ca0: 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  id);.    }else{.
5cb0: 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d        style_subm
5cc0: 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 53 68 75  enu_element("Shu
5cd0: 6e 22 2c 22 53 68 75 6e 22 2c 20 22 25 73 2f 73  n","Shun", "%s/s
5ce0: 68 75 6e 3f 73 68 75 6e 3d 25 73 23 61 64 64 73  hun?shun=%s#adds
5cf0: 68 75 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  hun",.          
5d00: 20 20 67 2e 7a 54 6f 70 2c 20 7a 55 75 69 64 29    g.zTop, zUuid)
5d10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74  ;.    }.  }.  st
5d20: 79 6c 65 5f 68 65 61 64 65 72 28 22 48 65 78 20  yle_header("Hex 
5d30: 41 72 74 69 66 61 63 74 20 43 6f 6e 74 65 6e 74  Artifact Content
5d40: 22 29 3b 0a 20 20 7a 55 75 69 64 20 3d 20 64 62  ");.  zUuid = db
5d50: 5f 74 65 78 74 28 22 3f 22 2c 22 53 45 4c 45 43  _text("?","SELEC
5d60: 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62  T uuid FROM blob
5d70: 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20   WHERE rid=%d", 
5d80: 72 69 64 29 3b 0a 20 20 40 20 3c 68 32 3e 41 72  rid);.  @ <h2>Ar
5d90: 74 69 66 61 63 74 20 25 73 28 7a 55 75 69 64 29  tifact %s(zUuid)
5da0: 3a 3c 2f 68 32 3e 0a 20 20 40 20 3c 62 6c 6f 63  :</h2>.  @ <bloc
5db0: 6b 71 75 6f 74 65 3e 0a 20 20 62 6c 6f 62 5f 7a  kquote>.  blob_z
5dc0: 65 72 6f 28 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d  ero(&downloadNam
5dd0: 65 29 3b 0a 20 20 6f 62 6a 65 63 74 5f 64 65 73  e);.  object_des
5de0: 63 72 69 70 74 69 6f 6e 28 72 69 64 2c 20 30 2c  cription(rid, 0,
5df0: 20 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29 3b   &downloadName);
5e00: 0a 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75  .  style_submenu
5e10: 5f 65 6c 65 6d 65 6e 74 28 22 44 6f 77 6e 6c 6f  _element("Downlo
5e20: 61 64 22 2c 20 22 44 6f 77 6e 6c 6f 61 64 22 2c  ad", "Download",
5e30: 20 0a 20 20 20 20 20 20 20 20 22 25 73 2f 72 61   .        "%s/ra
5e40: 77 2f 25 54 3f 6e 61 6d 65 3d 25 64 22 2c 20 67  w/%T?name=%d", g
5e50: 2e 7a 42 61 73 65 55 52 4c 2c 20 62 6c 6f 62 5f  .zBaseURL, blob_
5e60: 73 74 72 28 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d  str(&downloadNam
5e70: 65 29 2c 20 72 69 64 29 3b 0a 20 20 40 20 3c 2f  e), rid);.  @ </
5e80: 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 40 20  blockquote>.  @ 
5e90: 3c 68 72 3e 0a 20 20 63 6f 6e 74 65 6e 74 5f 67  <hr>.  content_g
5ea0: 65 74 28 72 69 64 2c 20 26 63 6f 6e 74 65 6e 74  et(rid, &content
5eb0: 29 3b 0a 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f  );.  @ <blockquo
5ec0: 74 65 3e 3c 70 72 65 3e 0a 20 20 68 65 78 64 75  te><pre>.  hexdu
5ed0: 6d 70 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20  mp(&content);.  
5ee0: 40 20 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71  @ </pre></blockq
5ef0: 75 6f 74 65 3e 0a 20 20 73 74 79 6c 65 5f 66 6f  uote>.  style_fo
5f00: 6f 74 65 72 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  oter();.}../*.**
5f10: 20 57 45 42 50 41 47 45 3a 20 61 72 74 69 66 61   WEBPAGE: artifa
5f20: 63 74 0a 2a 2a 20 55 52 4c 3a 20 2f 61 72 74 69  ct.** URL: /arti
5f30: 66 61 63 74 3f 6e 61 6d 65 3d 41 52 54 49 46 41  fact?name=ARTIFA
5f40: 43 54 49 44 0a 2a 2a 20 0a 2a 2a 20 53 68 6f 77  CTID.** .** Show
5f50: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
5f60: 6e 74 65 6e 74 20 6f 66 20 61 20 66 69 6c 65 20  ntent of a file 
5f70: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 41 52  identified by AR
5f80: 54 49 46 41 43 54 49 44 0a 2a 2a 20 61 73 20 70  TIFACTID.** as p
5f90: 72 65 66 6f 72 6d 61 74 74 65 64 20 74 65 78 74  reformatted text
5fa0: 2e 0a 2a 2f 0a 76 6f 69 64 20 61 72 74 69 66 61  ..*/.void artifa
5fb0: 63 74 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20  ct_page(void){. 
5fc0: 20 69 6e 74 20 72 69 64 3b 0a 20 20 42 6c 6f 62   int rid;.  Blob
5fd0: 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 63 6f 6e 73   content;.  cons
5fe0: 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65 3b 0a 20  t char *zMime;. 
5ff0: 20 42 6c 6f 62 20 64 6f 77 6e 6c 6f 61 64 4e 61   Blob downloadNa
6000: 6d 65 3b 0a 20 20 69 6e 74 20 72 65 6e 64 65 72  me;.  int render
6010: 41 73 57 69 6b 69 20 3d 20 30 3b 0a 20 20 69 6e  AsWiki = 0;.  in
6020: 74 20 72 65 6e 64 65 72 41 73 48 74 6d 6c 20 3d  t renderAsHtml =
6030: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
6040: 20 2a 7a 55 75 69 64 3b 0a 0a 20 20 72 69 64 20   *zUuid;..  rid 
6050: 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69 64 28 50 44  = name_to_rid(PD
6060: 28 22 6e 61 6d 65 22 2c 22 30 22 29 29 3b 0a 20  ("name","0"));. 
6070: 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65   login_check_cre
6080: 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20 20 69 66  dentials();.  if
6090: 28 20 21 67 2e 6f 6b 52 65 61 64 20 29 7b 20 6c  ( !g.okRead ){ l
60a0: 6f 67 69 6e 5f 6e 65 65 64 65 64 28 29 3b 20 72  ogin_needed(); r
60b0: 65 74 75 72 6e 3b 20 7d 0a 20 20 69 66 28 20 72  eturn; }.  if( r
60c0: 69 64 3d 3d 30 20 29 7b 20 63 67 69 5f 72 65 64  id==0 ){ cgi_red
60d0: 69 72 65 63 74 28 22 2f 68 6f 6d 65 22 29 3b 20  irect("/home"); 
60e0: 7d 0a 20 20 69 66 28 20 67 2e 6f 6b 41 64 6d 69  }.  if( g.okAdmi
60f0: 6e 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  n ){.    const c
6100: 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 5f  har *zUuid = db_
6110: 74 65 78 74 28 22 22 2c 20 22 53 45 4c 45 43 54  text("", "SELECT
6120: 20 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20   uuid FROM blob 
6130: 57 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72  WHERE rid=%d", r
6140: 69 64 29 3b 0a 20 20 20 20 69 66 28 20 64 62 5f  id);.    if( db_
6150: 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31  exists("SELECT 1
6160: 20 46 52 4f 4d 20 73 68 75 6e 20 57 48 45 52 45   FROM shun WHERE
6170: 20 75 75 69 64 3d 27 25 73 27 22 2c 20 7a 55 75   uuid='%s'", zUu
6180: 69 64 29 20 29 7b 0a 20 20 20 20 20 20 73 74 79  id) ){.      sty
6190: 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65  le_submenu_eleme
61a0: 6e 74 28 22 55 6e 73 68 75 6e 22 2c 22 55 6e 73  nt("Unshun","Uns
61b0: 68 75 6e 22 2c 20 22 25 73 2f 73 68 75 6e 3f 75  hun", "%s/shun?u
61c0: 75 69 64 3d 25 73 26 73 75 62 3d 31 22 2c 0a 20  uid=%s&sub=1",. 
61d0: 20 20 20 20 20 20 20 20 20 20 20 67 2e 7a 54 6f             g.zTo
61e0: 70 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 7d  p, zUuid);.    }
61f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 79 6c  else{.      styl
6200: 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e  e_submenu_elemen
6210: 74 28 22 53 68 75 6e 22 2c 22 53 68 75 6e 22 2c  t("Shun","Shun",
6220: 20 22 25 73 2f 73 68 75 6e 3f 73 68 75 6e 3d 25   "%s/shun?shun=%
6230: 73 23 61 64 64 73 68 75 6e 22 2c 0a 20 20 20 20  s#addshun",.    
6240: 20 20 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20          g.zTop, 
6250: 7a 55 75 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  zUuid);.    }.  
6260: 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61 64 65 72  }.  style_header
6270: 28 22 41 72 74 69 66 61 63 74 20 43 6f 6e 74 65  ("Artifact Conte
6280: 6e 74 22 29 3b 0a 20 20 7a 55 75 69 64 20 3d 20  nt");.  zUuid = 
6290: 64 62 5f 74 65 78 74 28 22 3f 22 2c 20 22 53 45  db_text("?", "SE
62a0: 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62  LECT uuid FROM b
62b0: 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64  lob WHERE rid=%d
62c0: 22 2c 20 72 69 64 29 3b 0a 20 20 40 20 3c 68 32  ", rid);.  @ <h2
62d0: 3e 41 72 74 69 66 61 63 74 20 25 73 28 7a 55 75  >Artifact %s(zUu
62e0: 69 64 29 3c 2f 68 32 3e 0a 20 20 40 20 3c 62 6c  id)</h2>.  @ <bl
62f0: 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 62 6c 6f 62  ockquote>.  blob
6300: 5f 7a 65 72 6f 28 26 64 6f 77 6e 6c 6f 61 64 4e  _zero(&downloadN
6310: 61 6d 65 29 3b 0a 20 20 6f 62 6a 65 63 74 5f 64  ame);.  object_d
6320: 65 73 63 72 69 70 74 69 6f 6e 28 72 69 64 2c 20  escription(rid, 
6330: 30 2c 20 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d 65  0, &downloadName
6340: 29 3b 0a 20 20 73 74 79 6c 65 5f 73 75 62 6d 65  );.  style_subme
6350: 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 44 6f 77 6e  nu_element("Down
6360: 6c 6f 61 64 22 2c 20 22 44 6f 77 6e 6c 6f 61 64  load", "Download
6370: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 25  ", .          "%
6380: 73 2f 72 61 77 2f 25 54 3f 6e 61 6d 65 3d 25 64  s/raw/%T?name=%d
6390: 22 2c 20 67 2e 7a 54 6f 70 2c 20 62 6c 6f 62 5f  ", g.zTop, blob_
63a0: 73 74 72 28 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d  str(&downloadNam
63b0: 65 29 2c 20 72 69 64 29 3b 0a 20 20 7a 4d 69 6d  e), rid);.  zMim
63c0: 65 20 3d 20 6d 69 6d 65 74 79 70 65 5f 66 72 6f  e = mimetype_fro
63d0: 6d 5f 6e 61 6d 65 28 62 6c 6f 62 5f 73 74 72 28  m_name(blob_str(
63e0: 26 64 6f 77 6e 6c 6f 61 64 4e 61 6d 65 29 29 3b  &downloadName));
63f0: 0a 20 20 69 66 28 20 7a 4d 69 6d 65 20 29 7b 0a  .  if( zMime ){.
6400: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6410: 4d 69 6d 65 2c 20 22 74 65 78 74 2f 68 74 6d 6c  Mime, "text/html
6420: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
6430: 66 28 20 50 28 22 74 78 74 22 29 20 29 7b 0a 20  f( P("txt") ){. 
6440: 20 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62         style_sub
6450: 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 48 74  menu_element("Ht
6460: 6d 6c 22 2c 20 22 48 74 6d 6c 22 2c 0a 20 20 20  ml", "Html",.   
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6480: 20 20 20 20 20 20 20 20 20 20 20 22 25 73 2f 61             "%s/a
6490: 72 74 69 66 61 63 74 3f 6e 61 6d 65 3d 25 64 22  rtifact?name=%d"
64a0: 2c 20 67 2e 7a 54 6f 70 2c 20 72 69 64 29 3b 0a  , g.zTop, rid);.
64b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
64c0: 20 20 20 20 20 72 65 6e 64 65 72 41 73 48 74 6d       renderAsHtm
64d0: 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  l = 1;.        s
64e0: 74 79 6c 65 5f 73 75 62 6d 65 6e 75 5f 65 6c 65  tyle_submenu_ele
64f0: 6d 65 6e 74 28 22 54 65 78 74 22 2c 20 22 54 65  ment("Text", "Te
6500: 78 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xt",.           
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6520: 20 20 20 22 25 73 2f 61 72 74 69 66 61 63 74 3f     "%s/artifact?
6530: 6e 61 6d 65 3d 25 64 26 74 78 74 3d 31 22 2c 20  name=%d&txt=1", 
6540: 67 2e 7a 54 6f 70 2c 20 72 69 64 29 3b 0a 20 20  g.zTop, rid);.  
6550: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
6560: 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 69 6d 65  if( strcmp(zMime
6570: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
6580: 2d 66 6f 73 73 69 6c 2d 77 69 6b 69 22 29 3d 3d  -fossil-wiki")==
6590: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50  0 ){.      if( P
65a0: 28 22 74 78 74 22 29 20 29 7b 0a 20 20 20 20 20  ("txt") ){.     
65b0: 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65 6e 75     style_submenu
65c0: 5f 65 6c 65 6d 65 6e 74 28 22 57 69 6b 69 22 2c  _element("Wiki",
65d0: 20 22 57 69 6b 69 22 2c 0a 20 20 20 20 20 20 20   "Wiki",.       
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 20 20 20 20 20 20 20 22 25 73 2f 61 72 74 69 66         "%s/artif
6600: 61 63 74 3f 6e 61 6d 65 3d 25 64 22 2c 20 67 2e  act?name=%d", g.
6610: 7a 54 6f 70 2c 20 72 69 64 29 3b 0a 20 20 20 20  zTop, rid);.    
6620: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6630: 20 72 65 6e 64 65 72 41 73 57 69 6b 69 20 3d 20   renderAsWiki = 
6640: 31 3b 0a 20 20 20 20 20 20 20 20 73 74 79 6c 65  1;.        style
6650: 5f 73 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74  _submenu_element
6660: 28 22 54 65 78 74 22 2c 20 22 54 65 78 74 22 2c  ("Text", "Text",
6670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
6690: 25 73 2f 61 72 74 69 66 61 63 74 3f 6e 61 6d 65  %s/artifact?name
66a0: 3d 25 64 26 74 78 74 3d 31 22 2c 20 67 2e 7a 54  =%d&txt=1", g.zT
66b0: 6f 70 2c 20 72 69 64 29 3b 0a 20 20 20 20 20 20  op, rid);.      
66c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 40 20  }.    }.  }.  @ 
66d0: 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20 20  </blockquote>.  
66e0: 40 20 3c 68 72 3e 0a 20 20 63 6f 6e 74 65 6e 74  @ <hr>.  content
66f0: 5f 67 65 74 28 72 69 64 2c 20 26 63 6f 6e 74 65  _get(rid, &conte
6700: 6e 74 29 3b 0a 20 20 69 66 28 20 72 65 6e 64 65  nt);.  if( rende
6710: 72 41 73 57 69 6b 69 20 29 7b 0a 20 20 20 20 77  rAsWiki ){.    w
6720: 69 6b 69 5f 63 6f 6e 76 65 72 74 28 26 63 6f 6e  iki_convert(&con
6730: 74 65 6e 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  tent, 0, 0);.  }
6740: 65 6c 73 65 20 69 66 28 20 72 65 6e 64 65 72 41  else if( renderA
6750: 73 48 74 6d 6c 20 29 7b 0a 20 20 20 20 40 20 3c  sHtml ){.    @ <
6760: 64 69 76 3e 0a 20 20 20 20 63 67 69 5f 61 70 70  div>.    cgi_app
6770: 65 6e 64 5f 63 6f 6e 74 65 6e 74 28 62 6c 6f 62  end_content(blob
6780: 5f 62 75 66 66 65 72 28 26 63 6f 6e 74 65 6e 74  _buffer(&content
6790: 29 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 63 6f  ), blob_size(&co
67a0: 6e 74 65 6e 74 29 29 3b 0a 20 20 20 20 40 20 3c  ntent));.    @ <
67b0: 2f 64 69 76 3e 0a 20 20 7d 65 6c 73 65 7b 0a 20  /div>.  }else{. 
67c0: 20 20 20 7a 4d 69 6d 65 20 3d 20 6d 69 6d 65 74     zMime = mimet
67d0: 79 70 65 5f 66 72 6f 6d 5f 63 6f 6e 74 65 6e 74  ype_from_content
67e0: 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  (&content);.    
67f0: 40 20 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a 20  @ <blockquote>. 
6800: 20 20 20 69 66 28 20 7a 4d 69 6d 65 3d 3d 30 20     if( zMime==0 
6810: 29 7b 0a 20 20 20 20 20 20 40 20 3c 70 72 65 3e  ){.      @ <pre>
6820: 0a 20 20 20 20 20 20 40 20 25 68 28 62 6c 6f 62  .      @ %h(blob
6830: 5f 73 74 72 28 26 63 6f 6e 74 65 6e 74 29 29 0a  _str(&content)).
6840: 20 20 20 20 20 20 40 20 3c 2f 70 72 65 3e 0a 20        @ </pre>. 
6850: 20 20 20 20 20 73 74 79 6c 65 5f 73 75 62 6d 65       style_subme
6860: 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 48 65 78 22  nu_element("Hex"
6870: 2c 22 48 65 78 22 2c 20 22 25 73 2f 68 65 78 64  ,"Hex", "%s/hexd
6880: 75 6d 70 3f 6e 61 6d 65 3d 25 64 22 2c 20 67 2e  ump?name=%d", g.
6890: 7a 54 6f 70 2c 20 72 69 64 29 3b 0a 20 20 20 20  zTop, rid);.    
68a0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
68b0: 70 28 7a 4d 69 6d 65 2c 20 22 69 6d 61 67 65 2f  p(zMime, "image/
68c0: 22 2c 20 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 6)==0 ){.    
68d0: 20 20 40 20 3c 69 6d 67 20 73 72 63 3d 22 25 73    @ <img src="%s
68e0: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 72 61 77  (g.zBaseURL)/raw
68f0: 3f 6e 61 6d 65 3d 25 64 28 72 69 64 29 26 6d 3d  ?name=%d(rid)&m=
6900: 25 73 28 7a 4d 69 6d 65 29 22 3e 3c 2f 69 6d 67  %s(zMime)"></img
6910: 3e 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75  >.      style_su
6920: 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 48  bmenu_element("H
6930: 65 78 22 2c 22 48 65 78 22 2c 20 22 25 73 2f 68  ex","Hex", "%s/h
6940: 65 78 64 75 6d 70 3f 6e 61 6d 65 3d 25 64 22 2c  exdump?name=%d",
6950: 20 67 2e 7a 54 6f 70 2c 20 72 69 64 29 3b 0a 20   g.zTop, rid);. 
6960: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6970: 40 20 3c 70 72 65 3e 0a 20 20 20 20 20 20 68 65  @ <pre>.      he
6980: 78 64 75 6d 70 28 26 63 6f 6e 74 65 6e 74 29 3b  xdump(&content);
6990: 0a 20 20 20 20 20 20 40 20 3c 2f 70 72 65 3e 0a  .      @ </pre>.
69a0: 20 20 20 20 7d 0a 20 20 20 20 40 20 3c 2f 62 6c      }.    @ </bl
69b0: 6f 63 6b 71 75 6f 74 65 3e 0a 20 20 7d 0a 20 20  ockquote>.  }.  
69c0: 73 74 79 6c 65 5f 66 6f 6f 74 65 72 28 29 3b 0a  style_footer();.
69d0: 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41  }  ../*.** WEBPA
69e0: 47 45 3a 20 74 69 6e 66 6f 0a 2a 2a 20 55 52 4c  GE: tinfo.** URL
69f0: 3a 20 2f 74 69 6e 66 6f 3f 6e 61 6d 65 3d 41 52  : /tinfo?name=AR
6a00: 54 49 46 41 43 54 49 44 0a 2a 2a 0a 2a 2a 20 53  TIFACTID.**.** S
6a10: 68 6f 77 20 74 68 65 20 64 65 74 61 69 6c 73 20  how the details 
6a20: 6f 66 20 61 20 74 69 63 6b 65 74 20 63 68 61 6e  of a ticket chan
6a30: 67 65 20 63 6f 6e 74 72 6f 6c 20 61 72 74 69 66  ge control artif
6a40: 61 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 74 69 6e  act..*/.void tin
6a50: 66 6f 5f 70 61 67 65 28 76 6f 69 64 29 7b 0a 20  fo_page(void){. 
6a60: 20 69 6e 74 20 72 69 64 3b 0a 20 20 42 6c 6f 62   int rid;.  Blob
6a70: 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 63 68 61 72   content;.  char
6a80: 20 2a 7a 44 61 74 65 3b 0a 20 20 63 6f 6e 73 74   *zDate;.  const
6a90: 20 63 68 61 72 20 2a 7a 55 75 69 64 3b 0a 20 20   char *zUuid;.  
6aa0: 63 68 61 72 20 7a 54 6b 74 4e 61 6d 65 5b 32 30  char zTktName[20
6ab0: 5d 3b 0a 20 20 4d 61 6e 69 66 65 73 74 20 6d 3b  ];.  Manifest m;
6ac0: 0a 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63 6b 5f  ..  login_check_
6ad0: 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b 0a 20  credentials();. 
6ae0: 20 69 66 28 20 21 67 2e 6f 6b 52 64 54 6b 74 20   if( !g.okRdTkt 
6af0: 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65 64 28  ){ login_needed(
6b00: 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 72  ); return; }.  r
6b10: 69 64 20 3d 20 6e 61 6d 65 5f 74 6f 5f 72 69 64  id = name_to_rid
6b20: 28 50 44 28 22 6e 61 6d 65 22 2c 22 30 22 29 29  (PD("name","0"))
6b30: 3b 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20 29  ;.  if( rid==0 )
6b40: 7b 20 66 6f 73 73 69 6c 5f 72 65 64 69 72 65 63  { fossil_redirec
6b50: 74 5f 68 6f 6d 65 28 29 3b 20 7d 0a 20 20 7a 55  t_home(); }.  zU
6b60: 75 69 64 20 3d 20 64 62 5f 74 65 78 74 28 22 22  uid = db_text(""
6b70: 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46  , "SELECT uuid F
6b80: 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 72  ROM blob WHERE r
6b90: 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20  id=%d", rid);.  
6ba0: 69 66 28 20 67 2e 6f 6b 41 64 6d 69 6e 20 29 7b  if( g.okAdmin ){
6bb0: 0a 20 20 20 20 69 66 28 20 64 62 5f 65 78 69 73  .    if( db_exis
6bc0: 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f  ts("SELECT 1 FRO
6bd0: 4d 20 73 68 75 6e 20 57 48 45 52 45 20 75 75 69  M shun WHERE uui
6be0: 64 3d 27 25 73 27 22 2c 20 7a 55 75 69 64 29 20  d='%s'", zUuid) 
6bf0: 29 7b 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 73  ){.      style_s
6c00: 75 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22  ubmenu_element("
6c10: 55 6e 73 68 75 6e 22 2c 22 55 6e 73 68 75 6e 22  Unshun","Unshun"
6c20: 2c 20 22 25 73 2f 73 68 75 6e 3f 75 75 69 64 3d  , "%s/shun?uuid=
6c30: 25 73 26 73 75 62 3d 31 22 2c 0a 20 20 20 20 20  %s&sub=1",.     
6c40: 20 20 20 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a         g.zTop, z
6c50: 55 75 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Uuid);.    }else
6c60: 7b 0a 20 20 20 20 20 20 73 74 79 6c 65 5f 73 75  {.      style_su
6c70: 62 6d 65 6e 75 5f 65 6c 65 6d 65 6e 74 28 22 53  bmenu_element("S
6c80: 68 75 6e 22 2c 22 53 68 75 6e 22 2c 20 22 25 73  hun","Shun", "%s
6c90: 2f 73 68 75 6e 3f 73 68 75 6e 3d 25 73 23 61 64  /shun?shun=%s#ad
6ca0: 64 73 68 75 6e 22 2c 0a 20 20 20 20 20 20 20 20  dshun",.        
6cb0: 20 20 20 20 67 2e 7a 54 6f 70 2c 20 7a 55 75 69      g.zTop, zUui
6cc0: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  d);.    }.  }.  
6cd0: 63 6f 6e 74 65 6e 74 5f 67 65 74 28 72 69 64 2c  content_get(rid,
6ce0: 20 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66   &content);.  if
6cf0: 28 20 6d 61 6e 69 66 65 73 74 5f 70 61 72 73 65  ( manifest_parse
6d00: 28 26 6d 2c 20 26 63 6f 6e 74 65 6e 74 29 3d 3d  (&m, &content)==
6d10: 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  0 ){.    fossil_
6d20: 72 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b  redirect_home();
6d30: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 2e 74 79 70  .  }.  if( m.typ
6d40: 65 21 3d 43 46 54 59 50 45 5f 54 49 43 4b 45 54  e!=CFTYPE_TICKET
6d50: 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 72   ){.    fossil_r
6d60: 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b 0a  edirect_home();.
6d70: 20 20 7d 0a 20 20 73 74 79 6c 65 5f 68 65 61 64    }.  style_head
6d80: 65 72 28 22 54 69 63 6b 65 74 20 43 68 61 6e 67  er("Ticket Chang
6d90: 65 20 44 65 74 61 69 6c 73 22 29 3b 0a 20 20 7a  e Details");.  z
6da0: 44 61 74 65 20 3d 20 64 62 5f 74 65 78 74 28 30  Date = db_text(0
6db0: 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65 74 69  , "SELECT dateti
6dc0: 6d 65 28 25 2e 31 32 66 29 22 2c 20 6d 2e 72 44  me(%.12f)", m.rD
6dd0: 61 74 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  ate);.  memcpy(z
6de0: 54 6b 74 4e 61 6d 65 2c 20 6d 2e 7a 54 69 63 6b  TktName, m.zTick
6df0: 65 74 55 75 69 64 2c 20 31 30 29 3b 0a 20 20 7a  etUuid, 10);.  z
6e00: 54 6b 74 4e 61 6d 65 5b 31 30 5d 20 3d 20 30 3b  TktName[10] = 0;
6e10: 0a 20 20 69 66 28 20 67 2e 6f 6b 48 69 73 74 6f  .  if( g.okHisto
6e20: 72 79 20 29 7b 0a 20 20 20 20 40 20 3c 68 32 3e  ry ){.    @ <h2>
6e30: 43 68 61 6e 67 65 73 20 74 6f 20 74 69 63 6b 65  Changes to ticke
6e40: 74 20 3c 61 20 68 72 65 66 3d 22 25 73 28 6d 2e  t <a href="%s(m.
6e50: 7a 54 69 63 6b 65 74 55 75 69 64 29 22 3e 25 73  zTicketUuid)">%s
6e60: 28 7a 54 6b 74 4e 61 6d 65 29 3c 2f 61 3e 3c 2f  (zTktName)</a></
6e70: 68 32 3e 0a 20 20 20 20 40 0a 20 20 20 20 40 20  h2>.    @.    @ 
6e80: 3c 70 3e 42 79 20 25 68 28 6d 2e 7a 55 73 65 72  <p>By %h(m.zUser
6e90: 29 20 6f 6e 20 25 73 28 7a 44 61 74 65 29 2e 20  ) on %s(zDate). 
6ea0: 20 53 65 65 20 61 6c 73 6f 3a 0a 20 20 20 20 40   See also:.    @
6eb0: 20 3c 61 20 68 72 65 66 3d 22 25 73 28 67 2e 7a   <a href="%s(g.z
6ec0: 54 6f 70 29 2f 61 72 74 69 66 61 63 74 2f 25 54  Top)/artifact/%T
6ed0: 28 7a 55 75 69 64 29 22 3e 61 72 74 69 66 61 63  (zUuid)">artifac
6ee0: 74 20 63 6f 6e 74 65 6e 74 3c 2f 61 3e 2c 20 61  t content</a>, a
6ef0: 6e 64 0a 20 20 20 20 40 20 3c 61 20 68 72 65 66  nd.    @ <a href
6f00: 3d 22 25 73 28 67 2e 7a 54 6f 70 29 2f 74 6b 74  ="%s(g.zTop)/tkt
6f10: 68 69 73 74 6f 72 79 2f 25 73 28 6d 2e 7a 54 69  history/%s(m.zTi
6f20: 63 6b 65 74 55 75 69 64 29 22 3e 74 69 63 6b 65  cketUuid)">ticke
6f30: 74 20 68 69 73 74 6f 72 79 3c 2f 61 3e 0a 20 20  t history</a>.  
6f40: 20 20 40 20 3c 2f 70 3e 0a 20 20 7d 65 6c 73 65    @ </p>.  }else
6f50: 7b 0a 20 20 20 20 40 20 3c 68 32 3e 43 68 61 6e  {.    @ <h2>Chan
6f60: 67 65 73 20 74 6f 20 74 69 63 6b 65 74 20 25 73  ges to ticket %s
6f70: 28 7a 54 6b 74 4e 61 6d 65 29 3c 2f 68 32 3e 0a  (zTktName)</h2>.
6f80: 20 20 20 20 40 0a 20 20 20 20 40 20 3c 70 3e 42      @.    @ <p>B
6f90: 79 20 25 68 28 6d 2e 7a 55 73 65 72 29 20 6f 6e  y %h(m.zUser) on
6fa0: 20 25 73 28 7a 44 61 74 65 29 2e 0a 20 20 20 20   %s(zDate)..    
6fb0: 40 20 3c 2f 70 3e 0a 20 20 7d 0a 20 20 40 0a 20  @ </p>.  }.  @. 
6fc0: 20 40 20 3c 6f 6c 3e 0a 20 20 66 72 65 65 28 7a   @ <ol>.  free(z
6fd0: 44 61 74 65 29 3b 0a 20 20 74 69 63 6b 65 74 5f  Date);.  ticket_
6fe0: 6f 75 74 70 75 74 5f 63 68 61 6e 67 65 5f 61 72  output_change_ar
6ff0: 74 69 66 61 63 74 28 26 6d 29 3b 0a 20 20 6d 61  tifact(&m);.  ma
7000: 6e 69 66 65 73 74 5f 63 6c 65 61 72 28 26 6d 29  nifest_clear(&m)
7010: 3b 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72  ;.  style_footer
7020: 28 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 45  ();.}.../*.** WE
7030: 42 50 41 47 45 3a 20 69 6e 66 6f 0a 2a 2a 20 55  BPAGE: info.** U
7040: 52 4c 3a 20 69 6e 66 6f 2f 41 52 54 49 46 41 43  RL: info/ARTIFAC
7050: 54 49 44 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72  TID.**.** The ar
7060: 67 75 6d 65 6e 74 20 69 73 20 61 20 61 72 74 69  gument is a arti
7070: 66 61 63 74 20 49 44 20 77 68 69 63 68 20 6d 69  fact ID which mi
7080: 67 68 74 20 62 65 20 61 20 62 61 73 65 6c 69 6e  ght be a baselin
7090: 65 20 6f 72 20 61 20 66 69 6c 65 20 6f 72 0a 2a  e or a file or.*
70a0: 2a 20 61 20 74 69 63 6b 65 74 20 63 68 61 6e 67  * a ticket chang
70b0: 65 73 20 6f 72 20 61 20 77 69 6b 69 20 65 64 69  es or a wiki edi
70c0: 74 6f 72 20 6f 72 20 73 6f 6d 65 74 68 69 6e 67  tor or something
70d0: 20 65 6c 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 46 69   else. .**.** Fi
70e0: 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 74 68  gure out what th
70f0: 65 20 61 72 74 69 66 61 63 74 20 49 44 20 69 73  e artifact ID is
7100: 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 69 74 2e   and jump to it.
7110: 0a 2a 2f 0a 76 6f 69 64 20 69 6e 66 6f 5f 70 61  .*/.void info_pa
7120: 67 65 28 76 6f 69 64 29 7b 0a 20 20 63 6f 6e 73  ge(void){.  cons
7130: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
7140: 20 42 6c 6f 62 20 75 75 69 64 3b 0a 20 20 69 6e   Blob uuid;.  in
7150: 74 20 72 69 64 2c 20 6e 4e 61 6d 65 3b 0a 20 20  t rid, nName;.  
7160: 0a 20 20 7a 4e 61 6d 65 20 3d 20 50 28 22 6e 61  .  zName = P("na
7170: 6d 65 22 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  me");.  if( zNam
7180: 65 3d 3d 30 20 29 20 66 6f 73 73 69 6c 5f 72 65  e==0 ) fossil_re
7190: 64 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b 0a 20  direct_home();. 
71a0: 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28   nName = strlen(
71b0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 4e  zName);.  if( nN
71c0: 61 6d 65 3c 34 20 7c 7c 20 6e 4e 61 6d 65 3e 55  ame<4 || nName>U
71d0: 55 49 44 5f 53 49 5a 45 20 7c 7c 20 21 76 61 6c  UID_SIZE || !val
71e0: 69 64 61 74 65 31 36 28 7a 4e 61 6d 65 2c 20 6e  idate16(zName, n
71f0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 73 77 69  Name) ){.    swi
7200: 74 63 68 28 20 73 79 6d 5f 74 61 67 5f 74 6f 5f  tch( sym_tag_to_
7210: 75 75 69 64 28 7a 4e 61 6d 65 2c 20 26 75 75 69  uuid(zName, &uui
7220: 64 29 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  d) ){.      case
7230: 20 31 3a 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a   1: {.        /*
7240: 20 67 6f 74 20 6f 6e 65 20 55 55 49 44 2c 20 75   got one UUID, u
7250: 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 20  se it */.       
7260: 20 7a 4e 61 6d 65 20 3d 20 62 6c 6f 62 5f 73 74   zName = blob_st
7270: 72 28 26 75 75 69 64 29 3b 0a 20 20 20 20 20 20  r(&uuid);.      
7280: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7290: 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 7b  .      case 2: {
72a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 67 6f 20 73  .        /* go s
72b0: 6f 6d 65 77 68 65 72 65 20 74 6f 20 73 68 6f 77  omewhere to show
72c0: 20 74 68 65 20 6d 75 6c 74 69 70 6c 65 20 55 55   the multiple UU
72d0: 49 44 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  IDs */.        r
72e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 62  eturn;.        b
72f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
7300: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
7310: 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 72 65         fossil_re
7320: 64 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b 0a 20  direct_home();. 
7330: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7340: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7350: 20 20 69 66 28 20 64 62 5f 65 78 69 73 74 73 28    if( db_exists(
7360: 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 74  "SELECT 1 FROM t
7370: 69 63 6b 65 74 20 57 48 45 52 45 20 74 6b 74 5f  icket WHERE tkt_
7380: 75 75 69 64 20 47 4c 4f 42 20 27 25 73 2a 27 22  uuid GLOB '%s*'"
7390: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
73a0: 74 6b 74 76 69 65 77 5f 70 61 67 65 28 29 3b 0a  tktview_page();.
73b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
73c0: 20 20 72 69 64 20 3d 20 64 62 5f 69 6e 74 28 30    rid = db_int(0
73d0: 2c 20 22 53 45 4c 45 43 54 20 72 69 64 20 46 52  , "SELECT rid FR
73e0: 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 20 75 75  OM blob WHERE uu
73f0: 69 64 20 47 4c 4f 42 20 27 25 73 2a 27 22 2c 20  id GLOB '%s*'", 
7400: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 72 69  zName);.  if( ri
7410: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 79 6c  d==0 ){.    styl
7420: 65 5f 68 65 61 64 65 72 28 22 42 72 6f 6b 65 6e  e_header("Broken
7430: 20 4c 69 6e 6b 22 29 3b 0a 20 20 20 20 40 20 3c   Link");.    @ <
7440: 70 3e 4e 6f 20 73 75 63 68 20 6f 62 6a 65 63 74  p>No such object
7450: 3a 20 25 68 28 7a 4e 61 6d 65 29 3c 2f 70 3e 0a  : %h(zName)</p>.
7460: 20 20 20 20 73 74 79 6c 65 5f 66 6f 6f 74 65 72      style_footer
7470: 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ();.    return;.
7480: 20 20 7d 0a 20 20 69 66 28 20 64 62 5f 65 78 69    }.  if( db_exi
7490: 73 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52  sts("SELECT 1 FR
74a0: 4f 4d 20 6d 6c 69 6e 6b 20 57 48 45 52 45 20 6d  OM mlink WHERE m
74b0: 69 64 3d 25 64 22 2c 20 72 69 64 29 20 29 7b 0a  id=%d", rid) ){.
74c0: 20 20 20 20 63 69 5f 70 61 67 65 28 29 3b 0a 20      ci_page();. 
74d0: 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 64 62 5f   }else.  if( db_
74e0: 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31  exists("SELECT 1
74f0: 20 46 52 4f 4d 20 74 61 67 78 72 65 66 20 4a 4f   FROM tagxref JO
7500: 49 4e 20 74 61 67 20 55 53 49 4e 47 28 74 61 67  IN tag USING(tag
7510: 69 64 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  id)".           
7520: 20 20 20 20 20 22 20 57 48 45 52 45 20 72 69 64       " WHERE rid
7530: 3d 25 64 20 41 4e 44 20 74 61 67 6e 61 6d 65 20  =%d AND tagname 
7540: 4c 49 4b 45 20 27 77 69 6b 69 2d 25 25 27 22 2c  LIKE 'wiki-%%'",
7550: 20 72 69 64 29 20 29 7b 0a 20 20 20 20 77 69 6e   rid) ){.    win
7560: 66 6f 5f 70 61 67 65 28 29 3b 0a 20 20 7d 65 6c  fo_page();.  }el
7570: 73 65 0a 20 20 69 66 28 20 64 62 5f 65 78 69 73  se.  if( db_exis
7580: 74 73 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f  ts("SELECT 1 FRO
7590: 4d 20 74 61 67 78 72 65 66 20 4a 4f 49 4e 20 74  M tagxref JOIN t
75a0: 61 67 20 55 53 49 4e 47 28 74 61 67 69 64 29 22  ag USING(tagid)"
75b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
75c0: 20 22 20 57 48 45 52 45 20 72 69 64 3d 25 64 20   " WHERE rid=%d 
75d0: 41 4e 44 20 74 61 67 6e 61 6d 65 20 4c 49 4b 45  AND tagname LIKE
75e0: 20 27 74 6b 74 2d 25 25 27 22 2c 20 72 69 64 29   'tkt-%%'", rid)
75f0: 20 29 7b 0a 20 20 20 20 74 69 6e 66 6f 5f 70 61   ){.    tinfo_pa
7600: 67 65 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20  ge();.  }else.  
7610: 69 66 28 20 64 62 5f 65 78 69 73 74 73 28 22 53  if( db_exists("S
7620: 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 6c 69  ELECT 1 FROM pli
7630: 6e 6b 20 57 48 45 52 45 20 63 69 64 3d 25 64 22  nk WHERE cid=%d"
7640: 2c 20 72 69 64 29 20 29 7b 0a 20 20 20 20 63 69  , rid) ){.    ci
7650: 5f 70 61 67 65 28 29 3b 0a 20 20 7d 65 6c 73 65  _page();.  }else
7660: 0a 20 20 69 66 28 20 64 62 5f 65 78 69 73 74 73  .  if( db_exists
7670: 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  ("SELECT 1 FROM 
7680: 70 6c 69 6e 6b 20 57 48 45 52 45 20 70 69 64 3d  plink WHERE pid=
7690: 25 64 22 2c 20 72 69 64 29 20 29 7b 0a 20 20 20  %d", rid) ){.   
76a0: 20 63 69 5f 70 61 67 65 28 29 3b 0a 20 20 7d 65   ci_page();.  }e
76b0: 6c 73 65 0a 20 20 7b 0a 20 20 20 20 61 72 74 69  lse.  {.    arti
76c0: 66 61 63 74 5f 70 61 67 65 28 29 3b 0a 20 20 7d  fact_page();.  }
76d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 45 42 50 41 47  .}../*.** WEBPAG
76e0: 45 3a 20 63 69 5f 65 64 69 74 0a 2a 2a 20 55 52  E: ci_edit.** UR
76f0: 4c 3a 20 20 63 69 5f 65 64 69 74 3f 72 3d 52 49  L:  ci_edit?r=RI
7700: 44 26 63 3d 4e 45 57 43 4f 4d 4d 45 4e 54 26 75  D&c=NEWCOMMENT&u
7710: 3d 4e 45 57 55 53 45 52 0a 2a 2a 0a 2a 2a 20 50  =NEWUSER.**.** P
7720: 72 65 73 65 6e 74 20 61 20 64 69 61 6c 6f 67 20  resent a dialog 
7730: 66 6f 72 20 75 70 64 61 74 69 6e 67 20 70 72 6f  for updating pro
7740: 70 65 72 74 69 65 73 20 6f 66 20 61 20 62 61 73  perties of a bas
7750: 65 6c 69 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eline:.**.**    
7760: 20 2a 20 20 54 68 65 20 63 68 65 63 6b 2d 69 6e   *  The check-in
7770: 20 75 73 65 72 0a 2a 2a 20 20 20 20 20 2a 20 20   user.**     *  
7780: 54 68 65 20 63 68 65 63 6b 2d 69 6e 20 63 6f 6d  The check-in com
7790: 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 2a 20 20 54  ment.**     *  T
77a0: 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 63 6f  he background co
77b0: 6c 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 63 69 5f  lor..*/.void ci_
77c0: 65 64 69 74 5f 70 61 67 65 28 76 6f 69 64 29 7b  edit_page(void){
77d0: 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 63 6f  .  int rid;.  co
77e0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 65  nst char *zComme
77f0: 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  nt;         /* C
7800: 75 72 72 65 6e 74 20 63 6f 6d 6d 65 6e 74 20 6f  urrent comment o
7810: 6e 20 74 68 65 20 63 68 65 63 6b 2d 69 6e 20 2a  n the check-in *
7820: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
7830: 7a 4e 65 77 43 6f 6d 6d 65 6e 74 3b 20 20 20 20  zNewComment;    
7840: 20 20 2f 2a 20 52 65 76 69 73 65 64 20 63 68 65    /* Revised che
7850: 63 6b 2d 69 6e 20 63 6f 6d 6d 65 6e 74 20 2a 2f  ck-in comment */
7860: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7870: 55 73 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  User;           
7880: 20 2f 2a 20 43 75 72 72 65 6e 74 20 75 73 65 72   /* Current user
7890: 20 66 6f 72 20 74 68 65 20 63 68 65 63 6b 2d 69   for the check-i
78a0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
78b0: 72 20 2a 7a 4e 65 77 55 73 65 72 3b 20 20 20 20  r *zNewUser;    
78c0: 20 20 20 20 20 2f 2a 20 52 65 76 69 73 65 64 20       /* Revised 
78d0: 75 73 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  user */.  const 
78e0: 63 68 61 72 20 2a 7a 44 61 74 65 3b 20 20 20 20  char *zDate;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7900: 6e 74 20 64 61 74 65 20 6f 66 20 74 68 65 20 63  nt date of the c
7910: 68 65 63 6b 2d 69 6e 20 2a 2f 0a 20 20 63 6f 6e  heck-in */.  con
7920: 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 44 61 74  st char *zNewDat
7930: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e;         /* Re
7940: 76 69 73 65 64 20 63 68 65 63 6b 2d 69 6e 20 64  vised check-in d
7950: 61 74 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ate */.  const c
7960: 68 61 72 20 2a 7a 43 6f 6c 6f 72 3b 20 20 20 20  har *zColor;    
7970: 20 20 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72     .  const char
7980: 20 2a 7a 4e 65 77 43 6f 6c 6f 72 3b 0a 20 20 63   *zNewColor;.  c
7990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 54  onst char *zNewT
79a0: 61 67 46 6c 61 67 3b 0a 20 20 63 6f 6e 73 74 20  agFlag;.  const 
79b0: 63 68 61 72 20 2a 7a 4e 65 77 54 61 67 3b 0a 20  char *zNewTag;. 
79c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
79d0: 77 42 72 46 6c 61 67 3b 0a 20 20 63 6f 6e 73 74  wBrFlag;.  const
79e0: 20 63 68 61 72 20 2a 7a 4e 65 77 42 72 61 6e 63   char *zNewBranc
79f0: 68 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  h;.  const char 
7a00: 2a 7a 43 6c 6f 73 65 46 6c 61 67 3b 0a 20 20 69  *zCloseFlag;.  i
7a10: 6e 74 20 66 50 72 6f 70 61 67 61 74 65 43 6f 6c  nt fPropagateCol
7a20: 6f 72 3b 0a 20 20 63 68 61 72 20 2a 7a 55 75 69  or;.  char *zUui
7a30: 64 3b 0a 20 20 42 6c 6f 62 20 63 6f 6d 6d 65 6e  d;.  Blob commen
7a40: 74 3b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 73  t;.  Stmt q;.  s
7a50: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
7a60: 63 74 20 53 61 6d 70 6c 65 43 6f 6c 6f 72 73 20  ct SampleColors 
7a70: 7b 0a 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  {.     const cha
7a80: 72 20 2a 7a 43 4e 61 6d 65 3b 0a 20 20 20 20 20  r *zCName;.     
7a90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
7aa0: 6f 72 3b 0a 20 20 7d 20 61 43 6f 6c 6f 72 5b 5d  or;.  } aColor[]
7ab0: 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 28 6e 6f   = {.     { "(no
7ac0: 6e 65 29 22 2c 20 20 22 22 20 7d 2c 0a 20 20 20  ne)",  "" },.   
7ad0: 20 20 7b 20 22 23 66 32 64 63 64 63 22 2c 20 22    { "#f2dcdc", "
7ae0: 23 66 32 64 63 64 63 22 20 7d 2c 0a 20 20 20 20  #f2dcdc" },.    
7af0: 20 7b 20 22 23 66 30 66 66 63 30 22 2c 20 22 23   { "#f0ffc0", "#
7b00: 66 30 66 66 63 30 22 20 7d 2c 0a 20 20 20 20 20  f0ffc0" },.     
7b10: 7b 20 22 23 62 64 65 35 64 36 22 2c 20 22 23 62  { "#bde5d6", "#b
7b20: 64 65 35 64 36 22 20 7d 2c 0a 20 20 20 20 20 7b  de5d6" },.     {
7b30: 20 22 23 63 30 66 66 63 30 22 2c 20 22 23 63 30   "#c0ffc0", "#c0
7b40: 66 66 63 30 22 20 7d 2c 0a 20 20 20 20 20 7b 20  ffc0" },.     { 
7b50: 22 23 63 30 66 66 66 30 22 2c 20 22 23 63 30 66  "#c0fff0", "#c0f
7b60: 66 66 30 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22  ff0" },.     { "
7b70: 23 63 30 66 30 66 66 22 2c 20 22 23 63 30 66 30  #c0f0ff", "#c0f0
7b80: 66 66 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23  ff" },.     { "#
7b90: 64 30 63 30 66 66 22 2c 20 22 23 64 30 63 30 66  d0c0ff", "#d0c0f
7ba0: 66 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23 66  f" },.     { "#f
7bb0: 66 63 30 66 66 22 2c 20 22 23 66 66 63 30 66 66  fc0ff", "#ffc0ff
7bc0: 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23 66 66  " },.     { "#ff
7bd0: 63 30 64 30 22 2c 20 22 23 66 66 63 30 64 30 22  c0d0", "#ffc0d0"
7be0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 23 66 66 66   },.     { "#fff
7bf0: 30 63 30 22 2c 20 22 23 66 66 66 30 63 30 22 20  0c0", "#fff0c0" 
7c00: 7d 2c 0a 20 20 20 20 20 7b 20 22 23 63 30 63 30  },.     { "#c0c0
7c10: 63 30 22 2c 20 22 23 63 30 63 30 63 30 22 20 7d  c0", "#c0c0c0" }
7c20: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 43 6f  ,.  };.  int nCo
7c30: 6c 6f 72 20 3d 20 73 69 7a 65 6f 66 28 61 43 6f  lor = sizeof(aCo
7c40: 6c 6f 72 29 2f 73 69 7a 65 6f 66 28 61 43 6f 6c  lor)/sizeof(aCol
7c50: 6f 72 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 69 3b  or[0]);.  int i;
7c60: 0a 20 20 0a 20 20 6c 6f 67 69 6e 5f 63 68 65 63  .  .  login_chec
7c70: 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 28 29 3b  k_credentials();
7c80: 0a 20 20 69 66 28 20 21 67 2e 6f 6b 57 72 69 74  .  if( !g.okWrit
7c90: 65 20 29 7b 20 6c 6f 67 69 6e 5f 6e 65 65 64 65  e ){ login_neede
7ca0: 64 28 29 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20  d(); return; }. 
7cb0: 20 72 69 64 20 3d 20 61 74 6f 69 28 50 44 28 22   rid = atoi(PD("
7cc0: 72 22 2c 22 30 22 29 29 3b 0a 20 20 7a 55 75 69  r","0"));.  zUui
7cd0: 64 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 22  d = db_text(0, "
7ce0: 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d  SELECT uuid FROM
7cf0: 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d   blob WHERE rid=
7d00: 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 7a 43 6f  %d", rid);.  zCo
7d10: 6d 6d 65 6e 74 20 3d 20 64 62 5f 74 65 78 74 28  mment = db_text(
7d20: 30 2c 20 22 53 45 4c 45 43 54 20 63 6f 61 6c 65  0, "SELECT coale
7d30: 73 63 65 28 65 63 6f 6d 6d 65 6e 74 2c 63 6f 6d  sce(ecomment,com
7d40: 6d 65 6e 74 29 22 0a 20 20 20 20 20 20 20 20 20  ment)".         
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
7d60: 20 20 46 52 4f 4d 20 65 76 65 6e 74 20 57 48 45    FROM event WHE
7d70: 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c 20 72 69  RE objid=%d", ri
7d80: 64 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6d 6d 65  d);.  if( zComme
7d90: 6e 74 3d 3d 30 20 29 20 66 6f 73 73 69 6c 5f 72  nt==0 ) fossil_r
7da0: 65 64 69 72 65 63 74 5f 68 6f 6d 65 28 29 3b 0a  edirect_home();.
7db0: 20 20 69 66 28 20 50 28 22 63 61 6e 63 65 6c 22    if( P("cancel"
7dc0: 29 20 29 7b 0a 20 20 20 20 63 67 69 5f 72 65 64  ) ){.    cgi_red
7dd0: 69 72 65 63 74 66 28 22 63 69 3f 6e 61 6d 65 3d  irectf("ci?name=
7de0: 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 7d 0a 20  %d", rid);.  }. 
7df0: 20 7a 4e 65 77 43 6f 6d 6d 65 6e 74 20 3d 20 50   zNewComment = P
7e00: 44 28 22 63 22 2c 7a 43 6f 6d 6d 65 6e 74 29 3b  D("c",zComment);
7e10: 0a 20 20 7a 55 73 65 72 20 3d 20 64 62 5f 74 65  .  zUser = db_te
7e20: 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 63 6f  xt(0, "SELECT co
7e30: 61 6c 65 73 63 65 28 65 75 73 65 72 2c 75 73 65  alesce(euser,use
7e40: 72 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)".            
7e50: 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d           "  FROM
7e60: 20 65 76 65 6e 74 20 57 48 45 52 45 20 6f 62 6a   event WHERE obj
7e70: 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20  id=%d", rid);.  
7e80: 69 66 28 20 7a 55 73 65 72 3d 3d 30 20 29 20 66  if( zUser==0 ) f
7e90: 6f 73 73 69 6c 5f 72 65 64 69 72 65 63 74 5f 68  ossil_redirect_h
7ea0: 6f 6d 65 28 29 3b 0a 20 20 7a 4e 65 77 55 73 65  ome();.  zNewUse
7eb0: 72 20 3d 20 50 44 28 22 75 22 2c 7a 55 73 65 72  r = PD("u",zUser
7ec0: 29 3b 0a 20 20 7a 44 61 74 65 20 3d 20 64 62 5f  );.  zDate = db_
7ed0: 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20  text(0, "SELECT 
7ee0: 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 29 22  datetime(mtime)"
7ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7f00: 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 65 76        "  FROM ev
7f10: 65 6e 74 20 57 48 45 52 45 20 6f 62 6a 69 64 3d  ent WHERE objid=
7f20: 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 69 66 28  %d", rid);.  if(
7f30: 20 7a 44 61 74 65 3d 3d 30 20 29 20 66 6f 73 73   zDate==0 ) foss
7f40: 69 6c 5f 72 65 64 69 72 65 63 74 5f 68 6f 6d 65  il_redirect_home
7f50: 28 29 3b 0a 20 20 7a 4e 65 77 44 61 74 65 20 3d  ();.  zNewDate =
7f60: 20 50 44 28 22 64 74 22 2c 7a 44 61 74 65 29 3b   PD("dt",zDate);
7f70: 0a 20 20 7a 43 6f 6c 6f 72 20 3d 20 64 62 5f 74  .  zColor = db_t
7f80: 65 78 74 28 22 22 2c 20 22 53 45 4c 45 43 54 20  ext("", "SELECT 
7f90: 62 67 63 6f 6c 6f 72 22 0a 20 20 20 20 20 20 20  bgcolor".       
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 22 20 20 46 52 4f 4d 20 65 76 65 6e 74 20 57   "  FROM event W
7fc0: 48 45 52 45 20 6f 62 6a 69 64 3d 25 64 22 2c 20  HERE objid=%d", 
7fd0: 72 69 64 29 3b 0a 20 20 7a 4e 65 77 43 6f 6c 6f  rid);.  zNewColo
7fe0: 72 20 3d 20 50 44 28 22 63 6c 72 22 2c 7a 43 6f  r = PD("clr",zCo
7ff0: 6c 6f 72 29 3b 0a 20 20 66 50 72 6f 70 61 67 61  lor);.  fPropaga
8000: 74 65 43 6f 6c 6f 72 20 3d 20 50 28 22 70 63 6c  teColor = P("pcl
8010: 72 22 29 21 3d 30 3b 0a 20 20 7a 4e 65 77 54 61  r")!=0;.  zNewTa
8020: 67 46 6c 61 67 20 3d 20 50 28 22 6e 65 77 74 61  gFlag = P("newta
8030: 67 22 29 20 3f 20 22 20 63 68 65 63 6b 65 64 22  g") ? " checked"
8040: 20 3a 20 22 22 3b 0a 20 20 7a 4e 65 77 54 61 67   : "";.  zNewTag
8050: 20 3d 20 50 44 28 22 74 61 67 6e 61 6d 65 22 2c   = PD("tagname",
8060: 22 22 29 3b 0a 20 20 7a 4e 65 77 42 72 46 6c 61  "");.  zNewBrFla
8070: 67 20 3d 20 50 28 22 6e 65 77 62 72 22 29 20 3f  g = P("newbr") ?
8080: 20 22 20 63 68 65 63 6b 65 64 22 20 3a 20 22 22   " checked" : ""
8090: 3b 0a 20 20 7a 4e 65 77 42 72 61 6e 63 68 20 3d  ;.  zNewBranch =
80a0: 20 50 44 28 22 62 72 6e 61 6d 65 22 2c 22 22 29   PD("brname","")
80b0: 3b 0a 20 20 7a 43 6c 6f 73 65 46 6c 61 67 20 3d  ;.  zCloseFlag =
80c0: 20 50 28 22 63 6c 6f 73 65 22 29 20 3f 20 22 20   P("close") ? " 
80d0: 63 68 65 63 6b 65 64 22 20 3a 20 22 22 3b 0a 20  checked" : "";. 
80e0: 20 69 66 28 20 50 28 22 61 70 70 6c 79 22 29 20   if( P("apply") 
80f0: 29 7b 0a 20 20 20 20 42 6c 6f 62 20 63 74 72 6c  ){.    Blob ctrl
8100: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 61 74  ;.    char *zDat
8110: 65 3b 0a 20 20 20 20 69 6e 74 20 6e 43 68 6e 67  e;.    int nChng
8120: 20 3d 20 30 3b 0a 0a 20 20 20 20 6c 6f 67 69 6e   = 0;..    login
8130: 5f 76 65 72 69 66 79 5f 63 73 72 66 5f 73 65 63  _verify_csrf_sec
8140: 72 65 74 28 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  ret();.    blob_
8150: 7a 65 72 6f 28 26 63 74 72 6c 29 3b 0a 20 20 20  zero(&ctrl);.   
8160: 20 7a 44 61 74 65 20 3d 20 64 62 5f 74 65 78 74   zDate = db_text
8170: 28 30 2c 20 22 53 45 4c 45 43 54 20 64 61 74 65  (0, "SELECT date
8180: 74 69 6d 65 28 27 6e 6f 77 27 29 22 29 3b 0a 20  time('now')");. 
8190: 20 20 20 7a 44 61 74 65 5b 31 30 5d 20 3d 20 27     zDate[10] = '
81a0: 54 27 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70  T';.    blob_app
81b0: 65 6e 64 66 28 26 63 74 72 6c 2c 20 22 44 20 25  endf(&ctrl, "D %
81c0: 73 5c 6e 22 2c 20 7a 44 61 74 65 29 3b 0a 20 20  s\n", zDate);.  
81d0: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
81e0: 22 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42  "CREATE TEMP TAB
81f0: 4c 45 20 6e 65 77 74 61 67 73 28 74 61 67 20 55  LE newtags(tag U
8200: 4e 49 51 55 45 2c 20 70 72 65 66 69 78 2c 20 76  NIQUE, prefix, v
8210: 61 6c 75 65 29 22 29 3b 0a 20 20 20 20 69 66 28  alue)");.    if(
8220: 20 7a 4e 65 77 43 6f 6c 6f 72 5b 30 5d 20 26 26   zNewColor[0] &&
8230: 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6f 72 2c 7a   strcmp(zColor,z
8240: 4e 65 77 43 6f 6c 6f 72 29 21 3d 30 20 29 7b 0a  NewColor)!=0 ){.
8250: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65        char *zPre
8260: 66 69 78 20 3d 20 22 2b 22 3b 0a 20 20 20 20 20  fix = "+";.     
8270: 20 69 66 28 20 66 50 72 6f 70 61 67 61 74 65 43   if( fPropagateC
8280: 6f 6c 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  olor ){.        
8290: 7a 50 72 65 66 69 78 20 3d 20 22 2a 22 3b 0a 20  zPrefix = "*";. 
82a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 5f       }.      db_
82b0: 6d 75 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c  multi_exec("REPL
82c0: 41 43 45 20 49 4e 54 4f 20 6e 65 77 74 61 67 73  ACE INTO newtags
82d0: 20 56 41 4c 55 45 53 28 27 62 67 63 6f 6c 6f 72   VALUES('bgcolor
82e0: 27 2c 25 51 2c 25 51 29 22 2c 0a 20 20 20 20 20  ',%Q,%Q)",.     
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
8300: 50 72 65 66 69 78 2c 20 7a 4e 65 77 43 6f 6c 6f  Prefix, zNewColo
8310: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
8320: 28 20 7a 4e 65 77 43 6f 6c 6f 72 5b 30 5d 3d 3d  ( zNewColor[0]==
8330: 30 20 26 26 20 7a 43 6f 6c 6f 72 5b 30 5d 21 3d  0 && zColor[0]!=
8340: 30 20 29 7b 0a 20 20 20 20 20 20 64 62 5f 6d 75  0 ){.      db_mu
8350: 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43  lti_exec("REPLAC
8360: 45 20 49 4e 54 4f 20 6e 65 77 74 61 67 73 20 56  E INTO newtags V
8370: 41 4c 55 45 53 28 27 62 67 63 6f 6c 6f 72 27 2c  ALUES('bgcolor',
8380: 27 2d 27 2c 4e 55 4c 4c 29 22 29 3b 0a 20 20 20  '-',NULL)");.   
8390: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   }.    if( strcm
83a0: 70 28 7a 43 6f 6d 6d 65 6e 74 2c 7a 4e 65 77 43  p(zComment,zNewC
83b0: 6f 6d 6d 65 6e 74 29 21 3d 30 20 29 7b 0a 20 20  omment)!=0 ){.  
83c0: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65      db_multi_exe
83d0: 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  c("REPLACE INTO 
83e0: 6e 65 77 74 61 67 73 20 56 41 4c 55 45 53 28 27  newtags VALUES('
83f0: 63 6f 6d 6d 65 6e 74 27 2c 27 2b 27 2c 25 51 29  comment','+',%Q)
8400: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
8410: 20 20 20 20 20 20 20 7a 4e 65 77 43 6f 6d 6d 65         zNewComme
8420: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nt);.    }.    i
8430: 66 28 20 73 74 72 63 6d 70 28 7a 44 61 74 65 2c  f( strcmp(zDate,
8440: 7a 4e 65 77 44 61 74 65 29 21 3d 30 20 29 7b 0a  zNewDate)!=0 ){.
8450: 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65        db_multi_e
8460: 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54  xec("REPLACE INT
8470: 4f 20 6e 65 77 74 61 67 73 20 56 41 4c 55 45 53  O newtags VALUES
8480: 28 27 64 61 74 65 27 2c 27 2b 27 2c 25 51 29 22  ('date','+',%Q)"
8490: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
84a0: 20 20 20 20 20 20 7a 4e 65 77 44 61 74 65 29 3b        zNewDate);
84b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
84c0: 74 72 63 6d 70 28 7a 55 73 65 72 2c 7a 4e 65 77  trcmp(zUser,zNew
84d0: 55 73 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  User)!=0 ){.    
84e0: 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28    db_multi_exec(
84f0: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6e 65  "REPLACE INTO ne
8500: 77 74 61 67 73 20 56 41 4c 55 45 53 28 27 75 73  wtags VALUES('us
8510: 65 72 27 2c 27 2b 27 2c 25 51 29 22 2c 20 7a 4e  er','+',%Q)", zN
8520: 65 77 55 73 65 72 29 3b 0a 20 20 20 20 7d 0a 20  ewUser);.    }. 
8530: 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71     db_prepare(&q
8540: 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
8550: 20 74 61 67 2e 74 61 67 69 64 2c 20 74 61 67 6e   tag.tagid, tagn
8560: 61 6d 65 20 46 52 4f 4d 20 74 61 67 78 72 65 66  ame FROM tagxref
8570: 2c 20 74 61 67 22 0a 20 20 20 20 20 20 20 22 20  , tag".       " 
8580: 57 48 45 52 45 20 74 61 67 78 72 65 66 2e 72 69  WHERE tagxref.ri
8590: 64 3d 25 64 20 41 4e 44 20 74 61 67 74 79 70 65  d=%d AND tagtype
85a0: 3e 30 20 41 4e 44 20 74 61 67 78 72 65 66 2e 74  >0 AND tagxref.t
85b0: 61 67 69 64 3d 74 61 67 2e 74 61 67 69 64 22 2c  agid=tag.tagid",
85c0: 0a 20 20 20 20 20 20 20 72 69 64 0a 20 20 20 20  .       rid.    
85d0: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 64 62  );.    while( db
85e0: 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54  _step(&q)==SQLIT
85f0: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69  E_ROW ){.      i
8600: 6e 74 20 74 61 67 69 64 20 3d 20 64 62 5f 63 6f  nt tagid = db_co
8610: 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b  lumn_int(&q, 0);
8620: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
8630: 72 20 2a 7a 54 61 67 20 3d 20 64 62 5f 63 6f 6c  r *zTag = db_col
8640: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b  umn_text(&q, 1);
8650: 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c 61 62  .      char zLab
8660: 65 6c 5b 33 30 5d 3b 0a 20 20 20 20 20 20 73 70  el[30];.      sp
8670: 72 69 6e 74 66 28 7a 4c 61 62 65 6c 2c 20 22 63  rintf(zLabel, "c
8680: 25 64 22 2c 20 74 61 67 69 64 29 3b 0a 20 20 20  %d", tagid);.   
8690: 20 20 20 69 66 28 20 50 28 7a 4c 61 62 65 6c 29     if( P(zLabel)
86a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 62 5f 6d   ){.        db_m
86b0: 75 6c 74 69 5f 65 78 65 63 28 22 52 45 50 4c 41  ulti_exec("REPLA
86c0: 43 45 20 49 4e 54 4f 20 6e 65 77 74 61 67 73 20  CE INTO newtags 
86d0: 56 41 4c 55 45 53 28 25 51 2c 27 2d 27 2c 4e 55  VALUES(%Q,'-',NU
86e0: 4c 4c 29 22 2c 20 7a 54 61 67 29 3b 0a 20 20 20  LL)", zTag);.   
86f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64     }.    }.    d
8700: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a  b_finalize(&q);.
8710: 20 20 20 20 69 66 28 20 7a 43 6c 6f 73 65 46 6c      if( zCloseFl
8720: 61 67 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 64  ag[0] ){.      d
8730: 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 52 45  b_multi_exec("RE
8740: 50 4c 41 43 45 20 49 4e 54 4f 20 6e 65 77 74 61  PLACE INTO newta
8750: 67 73 20 56 41 4c 55 45 53 28 27 63 6c 6f 73 65  gs VALUES('close
8760: 64 27 2c 27 2b 27 2c 4e 55 4c 4c 29 22 29 3b 0a  d','+',NULL)");.
8770: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e      }.    if( zN
8780: 65 77 54 61 67 46 6c 61 67 5b 30 5d 20 29 7b 0a  ewTagFlag[0] ){.
8790: 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65        db_multi_e
87a0: 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54  xec("REPLACE INT
87b0: 4f 20 6e 65 77 74 61 67 73 20 56 41 4c 55 45 53  O newtags VALUES
87c0: 28 27 73 79 6d 2d 25 71 27 2c 27 2b 27 2c 4e 55  ('sym-%q','+',NU
87d0: 4c 4c 29 22 2c 20 7a 4e 65 77 54 61 67 29 3b 0a  LL)", zNewTag);.
87e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e      }.    if( zN
87f0: 65 77 42 72 46 6c 61 67 5b 30 5d 20 29 7b 0a 20  ewBrFlag[0] ){. 
8800: 20 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78       db_multi_ex
8810: 65 63 28 0a 20 20 20 20 20 20 20 20 22 52 45 50  ec(.        "REP
8820: 4c 41 43 45 20 49 4e 54 4f 20 6e 65 77 74 61 67  LACE INTO newtag
8830: 73 20 22 0a 20 20 20 20 20 20 20 20 22 20 53 45  s ".        " SE
8840: 4c 45 43 54 20 74 61 67 6e 61 6d 65 2c 20 27 2d  LECT tagname, '-
8850: 27 2c 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 61 67  ', NULL FROM tag
8860: 78 72 65 66 2c 20 74 61 67 22 0a 20 20 20 20 20  xref, tag".     
8870: 20 20 20 22 20 20 57 48 45 52 45 20 74 61 67 78     "  WHERE tagx
8880: 72 65 66 2e 72 69 64 3d 25 64 20 41 4e 44 20 74  ref.rid=%d AND t
8890: 61 67 74 79 70 65 3d 3d 32 22 0a 20 20 20 20 20  agtype==2".     
88a0: 20 20 20 22 20 20 20 20 41 4e 44 20 74 61 67 6e     "    AND tagn
88b0: 61 6d 65 20 47 4c 4f 42 20 27 73 79 6d 2d 2a 27  ame GLOB 'sym-*'
88c0: 22 0a 20 20 20 20 20 20 20 20 22 20 20 20 20 41  ".        "    A
88d0: 4e 44 20 74 61 67 2e 74 61 67 69 64 3d 74 61 67  ND tag.tagid=tag
88e0: 78 72 65 66 2e 74 61 67 69 64 22 2c 0a 20 20 20  xref.tagid",.   
88f0: 20 20 20 20 20 72 69 64 0a 20 20 20 20 20 20 29       rid.      )
8900: 3b 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c 74 69  ;.      db_multi
8910: 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45 20 49  _exec("REPLACE I
8920: 4e 54 4f 20 6e 65 77 74 61 67 73 20 56 41 4c 55  NTO newtags VALU
8930: 45 53 28 27 62 72 61 6e 63 68 27 2c 27 2a 27 2c  ES('branch','*',
8940: 25 51 29 22 2c 20 7a 4e 65 77 42 72 61 6e 63 68  %Q)", zNewBranch
8950: 29 3b 0a 20 20 20 20 20 20 64 62 5f 6d 75 6c 74  );.      db_mult
8960: 69 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45 20  i_exec("REPLACE 
8970: 49 4e 54 4f 20 6e 65 77 74 61 67 73 20 56 41 4c  INTO newtags VAL
8980: 55 45 53 28 27 73 79 6d 2d 25 71 27 2c 27 2a 27  UES('sym-%q','*'
8990: 2c 4e 55 4c 4c 29 22 2c 0a 20 20 20 20 20 20 20  ,NULL)",.       
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 65               zNe
89b0: 77 42 72 61 6e 63 68 29 3b 0a 20 20 20 20 7d 0a  wBranch);.    }.
89c0: 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 26      db_prepare(&
89d0: 71 2c 20 22 53 45 4c 45 43 54 20 74 61 67 2c 20  q, "SELECT tag, 
89e0: 70 72 65 66 69 78 2c 20 76 61 6c 75 65 20 46 52  prefix, value FR
89f0: 4f 4d 20 6e 65 77 74 61 67 73 22 0a 20 20 20 20  OM newtags".    
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
8a10: 20 4f 52 44 45 52 20 42 59 20 70 72 65 66 69 78   ORDER BY prefix
8a20: 20 7c 7c 20 74 61 67 22 29 3b 0a 20 20 20 20 77   || tag");.    w
8a30: 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71  hile( db_step(&q
8a40: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
8a50: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
8a60: 72 20 2a 7a 54 61 67 20 3d 20 64 62 5f 63 6f 6c  r *zTag = db_col
8a70: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 29 3b  umn_text(&q, 0);
8a80: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
8a90: 72 20 2a 7a 50 72 65 66 69 78 20 3d 20 64 62 5f  r *zPrefix = db_
8aa0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20  column_text(&q, 
8ab0: 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  1);.      const 
8ac0: 63 68 61 72 20 2a 7a 56 61 6c 75 65 20 3d 20 64  char *zValue = d
8ad0: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71  b_column_text(&q
8ae0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 43 68 6e  , 2);.      nChn
8af0: 67 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  g++;.      if( z
8b00: 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Value ){.       
8b10: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 63   blob_appendf(&c
8b20: 74 72 6c 2c 20 22 54 20 25 73 25 46 20 25 73 20  trl, "T %s%F %s 
8b30: 25 46 5c 6e 22 2c 20 7a 50 72 65 66 69 78 2c 20  %F\n", zPrefix, 
8b40: 7a 54 61 67 2c 20 7a 55 75 69 64 2c 20 7a 56 61  zTag, zUuid, zVa
8b50: 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  lue);.      }els
8b60: 65 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f  e{.        blob_
8b70: 61 70 70 65 6e 64 66 28 26 63 74 72 6c 2c 20 22  appendf(&ctrl, "
8b80: 54 20 25 73 25 46 20 25 73 5c 6e 22 2c 20 7a 50  T %s%F %s\n", zP
8b90: 72 65 66 69 78 2c 20 7a 54 61 67 2c 20 7a 55 75  refix, zTag, zUu
8ba0: 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  id);.      }.   
8bb0: 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61 6c 69   }.    db_finali
8bc0: 7a 65 28 26 71 29 3b 0a 20 20 20 20 69 66 28 20  ze(&q);.    if( 
8bd0: 6e 43 68 6e 67 3e 30 20 29 7b 0a 20 20 20 20 20  nChng>0 ){.     
8be0: 20 69 6e 74 20 6e 72 69 64 3b 0a 20 20 20 20 20   int nrid;.     
8bf0: 20 42 6c 6f 62 20 63 6b 73 75 6d 3b 0a 20 20 20   Blob cksum;.   
8c00: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
8c10: 26 63 74 72 6c 2c 20 22 55 20 25 46 5c 6e 22 2c  &ctrl, "U %F\n",
8c20: 20 67 2e 7a 4c 6f 67 69 6e 29 3b 0a 20 20 20 20   g.zLogin);.    
8c30: 20 20 6d 64 35 73 75 6d 5f 62 6c 6f 62 28 26 63    md5sum_blob(&c
8c40: 74 72 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  trl, &cksum);.  
8c50: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
8c60: 28 26 63 74 72 6c 2c 20 22 5a 20 25 62 5c 6e 22  (&ctrl, "Z %b\n"
8c70: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  , &cksum);.     
8c80: 20 64 62 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61   db_begin_transa
8c90: 63 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 67  ction();.      g
8ca0: 2e 6d 61 72 6b 50 72 69 76 61 74 65 20 3d 20 63  .markPrivate = c
8cb0: 6f 6e 74 65 6e 74 5f 69 73 5f 70 72 69 76 61 74  ontent_is_privat
8cc0: 65 28 72 69 64 29 3b 0a 20 20 20 20 20 20 6e 72  e(rid);.      nr
8cd0: 69 64 20 3d 20 63 6f 6e 74 65 6e 74 5f 70 75 74  id = content_put
8ce0: 28 26 63 74 72 6c 2c 20 30 2c 20 30 29 3b 0a 20  (&ctrl, 0, 0);. 
8cf0: 20 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 63 72       manifest_cr
8d00: 6f 73 73 6c 69 6e 6b 28 6e 72 69 64 2c 20 26 63  osslink(nrid, &c
8d10: 74 72 6c 29 3b 0a 20 20 20 20 20 20 64 62 5f 65  trl);.      db_e
8d20: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 30  nd_transaction(0
8d30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 67 69  );.    }.    cgi
8d40: 5f 72 65 64 69 72 65 63 74 66 28 22 63 69 3f 6e  _redirectf("ci?n
8d50: 61 6d 65 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20  ame=%d", rid);. 
8d60: 20 7d 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26   }.  blob_zero(&
8d70: 63 6f 6d 6d 65 6e 74 29 3b 0a 20 20 62 6c 6f 62  comment);.  blob
8d80: 5f 61 70 70 65 6e 64 28 26 63 6f 6d 6d 65 6e 74  _append(&comment
8d90: 2c 20 7a 4e 65 77 43 6f 6d 6d 65 6e 74 2c 20 2d  , zNewComment, -
8da0: 31 29 3b 0a 20 20 7a 55 75 69 64 5b 31 30 5d 20  1);.  zUuid[10] 
8db0: 3d 20 30 3b 0a 20 20 73 74 79 6c 65 5f 68 65 61  = 0;.  style_hea
8dc0: 64 65 72 28 22 45 64 69 74 20 43 68 65 63 6b 2d  der("Edit Check-
8dd0: 69 6e 20 5b 25 73 5d 22 2c 20 7a 55 75 69 64 29  in [%s]", zUuid)
8de0: 3b 0a 20 20 69 66 28 20 50 28 22 70 72 65 76 69  ;.  if( P("previ
8df0: 65 77 22 29 20 29 7b 0a 20 20 20 20 42 6c 6f 62  ew") ){.    Blob
8e00: 20 73 75 66 66 69 78 3b 0a 20 20 20 20 69 6e 74   suffix;.    int
8e10: 20 6e 54 61 67 20 3d 20 30 3b 0a 20 20 20 20 40   nTag = 0;.    @
8e20: 20 3c 62 3e 50 72 65 76 69 65 77 3a 3c 2f 62 3e   <b>Preview:</b>
8e30: 0a 20 20 20 20 40 20 3c 62 6c 6f 63 6b 71 75 6f  .    @ <blockquo
8e40: 74 65 3e 0a 20 20 20 20 40 20 3c 74 61 62 6c 65  te>.    @ <table
8e50: 20 62 6f 72 64 65 72 3d 30 3e 0a 20 20 20 20 69   border=0>.    i
8e60: 66 28 20 7a 4e 65 77 43 6f 6c 6f 72 20 26 26 20  f( zNewColor && 
8e70: 7a 4e 65 77 43 6f 6c 6f 72 5b 30 5d 20 29 7b 0a  zNewColor[0] ){.
8e80: 20 20 20 20 20 20 40 20 3c 74 72 3e 3c 74 64 20        @ <tr><td 
8e90: 62 67 63 6f 6c 6f 72 3d 22 25 68 28 7a 4e 65 77  bgcolor="%h(zNew
8ea0: 43 6f 6c 6f 72 29 22 3e 0a 20 20 20 20 7d 65 6c  Color)">.    }el
8eb0: 73 65 7b 0a 20 20 20 20 20 20 40 20 3c 74 72 3e  se{.      @ <tr>
8ec0: 3c 74 64 3e 0a 20 20 20 20 7d 0a 20 20 20 20 77  <td>.    }.    w
8ed0: 69 6b 69 5f 63 6f 6e 76 65 72 74 28 26 63 6f 6d  iki_convert(&com
8ee0: 6d 65 6e 74 2c 20 30 2c 20 57 49 4b 49 5f 49 4e  ment, 0, WIKI_IN
8ef0: 4c 49 4e 45 29 3b 0a 20 20 20 20 62 6c 6f 62 5f  LINE);.    blob_
8f00: 7a 65 72 6f 28 26 73 75 66 66 69 78 29 3b 0a 20  zero(&suffix);. 
8f10: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28     blob_appendf(
8f20: 26 73 75 66 66 69 78 2c 20 22 28 75 73 65 72 3a  &suffix, "(user:
8f30: 20 25 68 22 2c 20 7a 4e 65 77 55 73 65 72 29 3b   %h", zNewUser);
8f40: 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28  .    db_prepare(
8f50: 26 71 2c 20 22 53 45 4c 45 43 54 20 73 75 62 73  &q, "SELECT subs
8f60: 74 72 28 74 61 67 6e 61 6d 65 2c 35 29 20 46 52  tr(tagname,5) FR
8f70: 4f 4d 20 74 61 67 78 72 65 66 2c 20 74 61 67 22  OM tagxref, tag"
8f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8f90: 20 20 20 20 22 20 57 48 45 52 45 20 74 61 67 6e      " WHERE tagn
8fa0: 61 6d 65 20 47 4c 4f 42 20 27 73 79 6d 2d 2a 27  ame GLOB 'sym-*'
8fb0: 20 41 4e 44 20 74 61 67 78 72 65 66 2e 72 69 64   AND tagxref.rid
8fc0: 3d 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20  =%d".           
8fd0: 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20          "   AND 
8fe0: 74 61 67 74 79 70 65 3e 31 20 41 4e 44 20 74 61  tagtype>1 AND ta
8ff0: 67 2e 74 61 67 69 64 3d 74 61 67 78 72 65 66 2e  g.tagid=tagxref.
9000: 74 61 67 69 64 22 2c 0a 20 20 20 20 20 20 20 20  tagid",.        
9010: 20 20 20 20 20 20 20 20 20 20 20 72 69 64 29 3b             rid);
9020: 0a 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73  .    while( db_s
9030: 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f  tep(&q)==SQLITE_
9040: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ROW ){.      con
9050: 73 74 20 63 68 61 72 20 2a 7a 54 61 67 20 3d 20  st char *zTag = 
9060: 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26  db_column_text(&
9070: 71 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  q, 0);.      if(
9080: 20 6e 54 61 67 3d 3d 30 20 29 7b 0a 20 20 20 20   nTag==0 ){.    
9090: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
90a0: 28 26 73 75 66 66 69 78 2c 20 22 2c 20 74 61 67  (&suffix, ", tag
90b0: 73 3a 20 25 68 22 2c 20 7a 54 61 67 29 3b 0a 20  s: %h", zTag);. 
90c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
90d0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66      blob_appendf
90e0: 28 26 73 75 66 66 69 78 2c 20 22 2c 20 25 68 22  (&suffix, ", %h"
90f0: 2c 20 7a 54 61 67 29 3b 0a 20 20 20 20 20 20 7d  , zTag);.      }
9100: 0a 20 20 20 20 20 20 6e 54 61 67 2b 2b 3b 0a 20  .      nTag++;. 
9110: 20 20 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e 61     }.    db_fina
9120: 6c 69 7a 65 28 26 71 29 3b 0a 20 20 20 20 62 6c  lize(&q);.    bl
9130: 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 75 66 66  ob_appendf(&suff
9140: 69 78 2c 20 22 29 22 29 3b 0a 20 20 20 20 40 20  ix, ")");.    @ 
9150: 25 73 28 62 6c 6f 62 5f 73 74 72 28 26 73 75 66  %s(blob_str(&suf
9160: 66 69 78 29 29 0a 20 20 20 20 40 20 3c 2f 74 64  fix)).    @ </td
9170: 3e 3c 2f 74 72 3e 3c 2f 74 61 62 6c 65 3e 0a 20  ></tr></table>. 
9180: 20 20 20 40 20 3c 2f 62 6c 6f 63 6b 71 75 6f 74     @ </blockquot
9190: 65 3e 0a 20 20 20 20 40 20 3c 68 72 3e 0a 20 20  e>.    @ <hr>.  
91a0: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 75    blob_reset(&su
91b0: 66 66 69 78 29 3b 0a 20 20 7d 0a 20 20 40 20 3c  ffix);.  }.  @ <
91c0: 70 3e 4d 61 6b 65 20 63 68 61 6e 67 65 73 20 74  p>Make changes t
91d0: 6f 20 61 74 74 72 69 62 75 74 65 73 20 6f 66 20  o attributes of 
91e0: 63 68 65 63 6b 2d 69 6e 0a 20 20 40 20 5b 3c 61  check-in.  @ [<a
91f0: 20 68 72 65 66 3d 22 63 69 3f 6e 61 6d 65 3d 25   href="ci?name=%
9200: 64 28 72 69 64 29 22 3e 25 73 28 7a 55 75 69 64  d(rid)">%s(zUuid
9210: 29 3c 2f 61 3e 5d 3a 3c 2f 70 3e 0a 20 20 40 20  )</a>]:</p>.  @ 
9220: 3c 66 6f 72 6d 20 61 63 74 69 6f 6e 3d 22 25 73  <form action="%s
9230: 28 67 2e 7a 42 61 73 65 55 52 4c 29 2f 63 69 5f  (g.zBaseURL)/ci_
9240: 65 64 69 74 22 20 6d 65 74 68 6f 64 3d 22 50 4f  edit" method="PO
9250: 53 54 22 3e 0a 20 20 6c 6f 67 69 6e 5f 69 6e 73  ST">.  login_ins
9260: 65 72 74 5f 63 73 72 66 5f 73 65 63 72 65 74 28  ert_csrf_secret(
9270: 29 3b 0a 20 20 40 20 3c 69 6e 70 75 74 20 74 79  );.  @ <input ty
9280: 70 65 3d 22 68 69 64 64 65 6e 22 20 6e 61 6d 65  pe="hidden" name
9290: 3d 22 72 22 20 76 61 6c 75 65 3d 22 25 64 28 72  ="r" value="%d(r
92a0: 69 64 29 22 3e 0a 20 20 40 20 3c 74 61 62 6c 65  id)">.  @ <table
92b0: 20 62 6f 72 64 65 72 3d 22 30 22 20 63 65 6c 6c   border="0" cell
92c0: 73 70 61 63 69 6e 67 3d 22 31 30 22 3e 0a 0a 20  spacing="10">.. 
92d0: 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67 6e   @ <tr><td align
92e0: 3d 22 72 69 67 68 74 22 20 76 61 6c 69 67 6e 3d  ="right" valign=
92f0: 22 74 6f 70 22 3e 3c 62 3e 55 73 65 72 3a 3c 2f  "top"><b>User:</
9300: 62 3e 3c 2f 74 64 3e 0a 20 20 40 20 3c 74 64 20  b></td>.  @ <td 
9310: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20  valign="top">.  
9320: 40 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d  @   <input type=
9330: 22 74 65 78 74 22 20 6e 61 6d 65 3d 22 75 22 20  "text" name="u" 
9340: 73 69 7a 65 3d 22 32 30 22 20 76 61 6c 75 65 3d  size="20" value=
9350: 22 25 68 28 7a 4e 65 77 55 73 65 72 29 22 3e 0a  "%h(zNewUser)">.
9360: 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 0a    @ </td></tr>..
9370: 20 20 40 20 3c 74 72 3e 3c 74 64 20 61 6c 69 67    @ <tr><td alig
9380: 6e 3d 22 72 69 67 68 74 22 20 76 61 6c 69 67 6e  n="right" valign
9390: 3d 22 74 6f 70 22 3e 3c 62 3e 43 6f 6d 6d 65 6e  ="top"><b>Commen
93a0: 74 3a 3c 2f 62 3e 3c 2f 74 64 3e 0a 20 20 40 20  t:</b></td>.  @ 
93b0: 3c 74 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22  <td valign="top"
93c0: 3e 0a 20 20 40 20 3c 74 65 78 74 61 72 65 61 20  >.  @ <textarea 
93d0: 6e 61 6d 65 3d 22 63 22 20 72 6f 77 73 3d 22 31  name="c" rows="1
93e0: 30 22 20 63 6f 6c 73 3d 22 38 30 22 3e 25 68 28  0" cols="80">%h(
93f0: 7a 4e 65 77 43 6f 6d 6d 65 6e 74 29 3c 2f 74 65  zNewComment)</te
9400: 78 74 61 72 65 61 3e 0a 20 20 40 20 3c 2f 74 64  xtarea>.  @ </td
9410: 3e 3c 2f 74 72 3e 0a 0a 20 20 40 20 3c 74 72 3e  ></tr>..  @ <tr>
9420: 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 67 68 74  <td align="right
9430: 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c  " valign="top"><
9440: 62 3e 43 68 65 63 6b 2d 69 6e 20 54 69 6d 65 3a  b>Check-in Time:
9450: 3c 2f 62 3e 3c 2f 74 64 3e 0a 20 20 40 20 3c 74  </b></td>.  @ <t
9460: 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a  d valign="top">.
9470: 20 20 40 20 20 20 3c 69 6e 70 75 74 20 74 79 70    @   <input typ
9480: 65 3d 22 74 65 78 74 22 20 6e 61 6d 65 3d 22 64  e="text" name="d
9490: 74 22 20 73 69 7a 65 3d 22 32 30 22 20 76 61 6c  t" size="20" val
94a0: 75 65 3d 22 25 68 28 7a 4e 65 77 44 61 74 65 29  ue="%h(zNewDate)
94b0: 22 3e 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72  ">.  @ </td></tr
94c0: 3e 0a 0a 20 20 40 20 3c 74 72 3e 3c 74 64 20 61  >..  @ <tr><td a
94d0: 6c 69 67 6e 3d 22 72 69 67 68 74 22 20 76 61 6c  lign="right" val
94e0: 69 67 6e 3d 22 74 6f 70 22 3e 3c 62 3e 42 61 63  ign="top"><b>Bac
94f0: 6b 67 72 6f 75 6e 64 20 43 6f 6c 6f 72 3a 3c 2f  kground Color:</
9500: 62 3e 3c 2f 74 64 3e 0a 20 20 40 20 3c 74 64 20  b></td>.  @ <td 
9510: 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20 20  valign="top">.  
9520: 40 20 3c 74 61 62 6c 65 20 62 6f 72 64 65 72 3d  @ <table border=
9530: 30 20 63 65 6c 6c 70 61 64 64 69 6e 67 3d 30 20  0 cellpadding=0 
9540: 63 65 6c 6c 73 70 61 63 69 6e 67 3d 31 3e 0a 20  cellspacing=1>. 
9550: 20 40 20 3c 74 72 3e 3c 74 64 20 63 6f 6c 73 70   @ <tr><td colsp
9560: 61 6e 3d 22 36 22 20 61 6c 69 67 6e 3d 22 6c 65  an="6" align="le
9570: 66 74 22 3e 0a 20 20 69 66 28 20 66 50 72 6f 70  ft">.  if( fProp
9580: 61 67 61 74 65 43 6f 6c 6f 72 20 29 7b 0a 20 20  agateColor ){.  
9590: 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d    @ <input type=
95a0: 22 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d  "checkbox" name=
95b0: 22 70 63 6c 72 22 20 63 68 65 63 6b 65 64 3e 0a  "pclr" checked>.
95c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 40 20 3c    }else{.    @ <
95d0: 69 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65 63  input type="chec
95e0: 6b 62 6f 78 22 20 6e 61 6d 65 3d 22 70 63 6c 72  kbox" name="pclr
95f0: 22 3e 0a 20 20 7d 0a 20 20 40 20 50 72 6f 70 61  ">.  }.  @ Propa
9600: 67 61 74 65 20 63 6f 6c 6f 72 20 74 6f 20 64 65  gate color to de
9610: 73 63 65 6e 64 61 6e 74 73 3c 2f 69 6e 70 75 74  scendants</input
9620: 3e 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20  ></td></tr>.  @ 
9630: 3c 74 72 3e 0a 20 20 66 6f 72 28 69 3d 30 3b 20  <tr>.  for(i=0; 
9640: 69 3c 6e 43 6f 6c 6f 72 3b 20 69 2b 2b 29 7b 0a  i<nColor; i++){.
9650: 20 20 20 20 69 66 28 20 61 43 6f 6c 6f 72 5b 69      if( aColor[i
9660: 5d 2e 7a 43 6f 6c 6f 72 5b 30 5d 20 29 7b 0a 20  ].zColor[0] ){. 
9670: 20 20 20 20 20 40 20 3c 74 64 20 62 67 63 6f 6c       @ <td bgcol
9680: 6f 72 3d 22 25 68 28 61 43 6f 6c 6f 72 5b 69 5d  or="%h(aColor[i]
9690: 2e 7a 43 6f 6c 6f 72 29 22 3e 0a 20 20 20 20 7d  .zColor)">.    }
96a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 3c 74  else{.      @ <t
96b0: 64 3e 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d>.    }.    if(
96c0: 20 73 74 72 63 6d 70 28 7a 4e 65 77 43 6f 6c 6f   strcmp(zNewColo
96d0: 72 2c 20 61 43 6f 6c 6f 72 5b 69 5d 2e 7a 43 6f  r, aColor[i].zCo
96e0: 6c 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lor)==0 ){.     
96f0: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
9700: 72 61 64 69 6f 22 20 6e 61 6d 65 3d 22 63 6c 72  radio" name="clr
9710: 22 20 76 61 6c 75 65 3d 22 25 68 28 61 43 6f 6c  " value="%h(aCol
9720: 6f 72 5b 69 5d 2e 7a 43 6f 6c 6f 72 29 22 20 63  or[i].zColor)" c
9730: 68 65 63 6b 65 64 3e 0a 20 20 20 20 7d 65 6c 73  hecked>.    }els
9740: 65 7b 0a 20 20 20 20 20 20 40 20 3c 69 6e 70 75  e{.      @ <inpu
9750: 74 20 74 79 70 65 3d 22 72 61 64 69 6f 22 20 6e  t type="radio" n
9760: 61 6d 65 3d 22 63 6c 72 22 20 76 61 6c 75 65 3d  ame="clr" value=
9770: 22 25 68 28 61 43 6f 6c 6f 72 5b 69 5d 2e 7a 43  "%h(aColor[i].zC
9780: 6f 6c 6f 72 29 22 3e 0a 20 20 20 20 7d 0a 20 20  olor)">.    }.  
9790: 20 20 40 20 25 68 28 61 43 6f 6c 6f 72 5b 69 5d    @ %h(aColor[i]
97a0: 2e 7a 43 4e 61 6d 65 29 3c 2f 69 6e 70 75 74 3e  .zCName)</input>
97b0: 3c 2f 74 64 3e 0a 20 20 20 20 69 66 28 20 28 69  </td>.    if( (i
97c0: 25 36 29 3d 3d 35 20 26 26 20 69 2b 31 3c 6e 43  %6)==5 && i+1<nC
97d0: 6f 6c 6f 72 20 29 7b 0a 20 20 20 20 20 20 40 20  olor ){.      @ 
97e0: 3c 2f 74 72 3e 3c 74 72 3e 0a 20 20 20 20 7d 0a  </tr><tr>.    }.
97f0: 20 20 7d 0a 20 20 40 20 3c 2f 74 72 3e 0a 20 20    }.  @ </tr>.  
9800: 40 20 3c 2f 74 61 62 6c 65 3e 0a 20 20 40 20 3c  @ </table>.  @ <
9810: 2f 74 64 3e 3c 2f 74 72 3e 0a 0a 20 20 40 20 3c  /td></tr>..  @ <
9820: 74 72 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69  tr><td align="ri
9830: 67 68 74 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70  ght" valign="top
9840: 22 3e 3c 62 3e 54 61 67 73 3a 3c 2f 62 3e 3c 2f  "><b>Tags:</b></
9850: 74 64 3e 0a 20 20 40 20 3c 74 64 20 76 61 6c 69  td>.  @ <td vali
9860: 67 6e 3d 22 74 6f 70 22 3e 0a 20 20 40 20 3c 69  gn="top">.  @ <i
9870: 6e 70 75 74 20 74 79 70 65 3d 22 63 68 65 63 6b  nput type="check
9880: 62 6f 78 22 20 6e 61 6d 65 3d 22 6e 65 77 74 61  box" name="newta
9890: 67 22 25 73 28 7a 4e 65 77 54 61 67 46 6c 61 67  g"%s(zNewTagFlag
98a0: 29 3e 0a 20 20 40 20 41 64 64 20 74 68 65 20 66  )>.  @ Add the f
98b0: 6f 6c 6c 6f 77 69 6e 67 20 6e 65 77 20 74 61 67  ollowing new tag
98c0: 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 63 68   name to this ch
98d0: 65 63 6b 2d 69 6e 3a 0a 20 20 40 20 3c 69 6e 70  eck-in:.  @ <inp
98e0: 75 74 20 74 79 70 65 3d 22 74 65 78 74 22 20 77  ut type="text" w
98f0: 69 64 74 68 3d 22 31 35 22 20 6e 61 6d 65 3d 22  idth="15" name="
9900: 74 61 67 6e 61 6d 65 22 20 76 61 6c 75 65 3d 22  tagname" value="
9910: 25 68 28 7a 4e 65 77 54 61 67 29 22 3e 0a 20 20  %h(zNewTag)">.  
9920: 64 62 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20  db_prepare(&q,. 
9930: 20 20 20 20 22 53 45 4c 45 43 54 20 74 61 67 2e      "SELECT tag.
9940: 74 61 67 69 64 2c 20 74 61 67 6e 61 6d 65 20 46  tagid, tagname F
9950: 52 4f 4d 20 74 61 67 78 72 65 66 2c 20 74 61 67  ROM tagxref, tag
9960: 22 0a 20 20 20 20 20 22 20 57 48 45 52 45 20 74  ".     " WHERE t
9970: 61 67 78 72 65 66 2e 72 69 64 3d 25 64 20 41 4e  agxref.rid=%d AN
9980: 44 20 74 61 67 74 79 70 65 3e 30 20 41 4e 44 20  D tagtype>0 AND 
9990: 74 61 67 78 72 65 66 2e 74 61 67 69 64 3d 74 61  tagxref.tagid=ta
99a0: 67 2e 74 61 67 69 64 22 0a 20 20 20 20 20 22 20  g.tagid".     " 
99b0: 4f 52 44 45 52 20 42 59 20 43 41 53 45 20 57 48  ORDER BY CASE WH
99c0: 45 4e 20 74 61 67 6e 61 6d 65 20 47 4c 4f 42 20  EN tagname GLOB 
99d0: 27 73 79 6d 2d 2a 27 20 54 48 45 4e 20 73 75 62  'sym-*' THEN sub
99e0: 73 74 72 28 74 61 67 6e 61 6d 65 2c 35 29 22 0a  str(tagname,5)".
99f0: 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20       "          
9a00: 20 20 20 20 20 45 4c 53 45 20 74 61 67 6e 61 6d       ELSE tagnam
9a10: 65 20 45 4e 44 22 2c 0a 20 20 20 20 20 72 69 64  e END",.     rid
9a20: 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 64  .  );.  while( d
9a30: 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c 49  b_step(&q)==SQLI
9a40: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e  TE_ROW ){.    in
9a50: 74 20 74 61 67 69 64 20 3d 20 64 62 5f 63 6f 6c  t tagid = db_col
9a60: 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 30 29 3b 0a  umn_int(&q, 0);.
9a70: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9a80: 7a 54 61 67 4e 61 6d 65 20 3d 20 64 62 5f 63 6f  zTagName = db_co
9a90: 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29  lumn_text(&q, 1)
9aa0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 4c 61 62 65  ;.    char zLabe
9ab0: 6c 5b 33 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e  l[30];.    sprin
9ac0: 74 66 28 7a 4c 61 62 65 6c 2c 20 22 63 25 64 22  tf(zLabel, "c%d"
9ad0: 2c 20 74 61 67 69 64 29 3b 0a 20 20 20 20 69 66  , tagid);.    if
9ae0: 28 20 50 28 7a 4c 61 62 65 6c 29 20 29 7b 0a 20  ( P(zLabel) ){. 
9af0: 20 20 20 20 20 40 20 3c 62 72 3e 3c 69 6e 70 75       @ <br><inpu
9b00: 74 20 74 79 70 65 3d 22 63 68 65 63 6b 62 6f 78  t type="checkbox
9b10: 22 20 6e 61 6d 65 3d 22 63 25 64 28 74 61 67 69  " name="c%d(tagi
9b20: 64 29 22 20 63 68 65 63 6b 65 64 3e 0a 20 20 20  d)" checked>.   
9b30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 40 20   }else{.      @ 
9b40: 3c 62 72 3e 3c 69 6e 70 75 74 20 74 79 70 65 3d  <br><input type=
9b50: 22 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65 3d  "checkbox" name=
9b60: 22 63 25 64 28 74 61 67 69 64 29 22 3e 0a 20 20  "c%d(tagid)">.  
9b70: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 6e    }.    if( strn
9b80: 63 6d 70 28 7a 54 61 67 4e 61 6d 65 2c 20 22 73  cmp(zTagName, "s
9b90: 79 6d 2d 22 2c 20 34 29 3d 3d 30 20 29 7b 0a 20  ym-", 4)==0 ){. 
9ba0: 20 20 20 20 20 40 20 43 61 6e 63 65 6c 20 74 61       @ Cancel ta
9bb0: 67 20 3c 62 3e 25 68 28 26 7a 54 61 67 4e 61 6d  g <b>%h(&zTagNam
9bc0: 65 5b 34 5d 29 3c 2f 62 3e 0a 20 20 20 20 7d 65  e[4])</b>.    }e
9bd0: 6c 73 65 7b 0a 20 20 20 20 20 20 40 20 43 61 6e  lse{.      @ Can
9be0: 63 65 6c 20 73 70 65 63 69 61 6c 20 74 61 67 20  cel special tag 
9bf0: 3c 62 3e 25 68 28 7a 54 61 67 4e 61 6d 65 29 3c  <b>%h(zTagName)<
9c00: 2f 62 3e 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  /b>.    }.  }.  
9c10: 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b  db_finalize(&q);
9c20: 0a 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a  .  @ </td></tr>.
9c30: 0a 20 20 69 66 28 20 64 62 5f 65 78 69 73 74 73  .  if( db_exists
9c40: 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  ("SELECT 1 FROM 
9c50: 74 61 67 78 72 65 66 20 57 48 45 52 45 20 72 69  tagxref WHERE ri
9c60: 64 3d 25 64 20 41 4e 44 20 74 61 67 69 64 3d 25  d=%d AND tagid=%
9c70: 64 20 41 4e 44 20 73 72 63 69 64 3e 30 22 2c 0a  d AND srcid>0",.
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c90: 72 69 64 2c 20 54 41 47 5f 42 52 41 4e 43 48 29  rid, TAG_BRANCH)
9ca0: 3d 3d 30 20 29 7b 0a 20 20 20 20 40 20 3c 74 72  ==0 ){.    @ <tr
9cb0: 3e 3c 74 64 20 61 6c 69 67 6e 3d 22 72 69 67 68  ><td align="righ
9cc0: 74 22 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e  t" valign="top">
9cd0: 3c 62 3e 42 72 61 6e 63 68 69 6e 67 3a 3c 2f 62  <b>Branching:</b
9ce0: 3e 3c 2f 74 64 3e 0a 20 20 20 20 40 20 3c 74 64  ></td>.    @ <td
9cf0: 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a 20   valign="top">. 
9d00: 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65     @ <input type
9d10: 3d 22 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d 65  ="checkbox" name
9d20: 3d 22 6e 65 77 62 72 22 25 73 28 7a 4e 65 77 42  ="newbr"%s(zNewB
9d30: 72 46 6c 61 67 29 3e 0a 20 20 20 20 40 20 4d 61  rFlag)>.    @ Ma
9d40: 6b 65 20 74 68 69 73 20 63 68 65 63 6b 2d 69 6e  ke this check-in
9d50: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
9d60: 6e 65 77 20 62 72 61 6e 63 68 20 6e 61 6d 65 64  new branch named
9d70: 3a 0a 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74  :.    @ <input t
9d80: 79 70 65 3d 22 74 65 78 74 22 20 77 69 64 74 68  ype="text" width
9d90: 3d 22 31 35 22 20 6e 61 6d 65 3d 22 62 72 6e 61  ="15" name="brna
9da0: 6d 65 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 4e  me" value="%h(zN
9db0: 65 77 42 72 61 6e 63 68 29 22 3e 0a 20 20 20 20  ewBranch)">.    
9dc0: 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 7d  @ </td></tr>.  }
9dd0: 0a 0a 20 20 69 66 28 20 69 73 5f 61 5f 6c 65 61  ..  if( is_a_lea
9de0: 66 28 72 69 64 29 0a 20 20 20 26 26 20 21 64 62  f(rid).   && !db
9df0: 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20  _exists("SELECT 
9e00: 31 20 46 52 4f 4d 20 74 61 67 78 72 65 66 20 22  1 FROM tagxref "
9e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9e20: 20 20 22 20 57 48 45 52 45 20 74 61 67 69 64 3d    " WHERE tagid=
9e30: 25 64 20 41 4e 44 20 72 69 64 3d 25 64 20 41 4e  %d AND rid=%d AN
9e40: 44 20 74 61 67 74 79 70 65 3e 30 22 2c 0a 20 20  D tagtype>0",.  
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
9e60: 41 47 5f 43 4c 4f 53 45 44 2c 20 72 69 64 29 0a  AG_CLOSED, rid).
9e70: 20 20 29 7b 0a 20 20 20 20 40 20 3c 74 72 3e 3c    ){.    @ <tr><
9e80: 74 64 20 61 6c 69 67 6e 3d 22 72 69 67 68 74 22  td align="right"
9e90: 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 3c 62   valign="top"><b
9ea0: 3e 4c 65 61 66 20 43 6c 6f 73 75 72 65 3a 3c 2f  >Leaf Closure:</
9eb0: 62 3e 3c 2f 74 64 3e 0a 20 20 20 20 40 20 3c 74  b></td>.    @ <t
9ec0: 64 20 76 61 6c 69 67 6e 3d 22 74 6f 70 22 3e 0a  d valign="top">.
9ed0: 20 20 20 20 40 20 3c 69 6e 70 75 74 20 74 79 70      @ <input typ
9ee0: 65 3d 22 63 68 65 63 6b 62 6f 78 22 20 6e 61 6d  e="checkbox" nam
9ef0: 65 3d 22 63 6c 6f 73 65 22 25 73 28 7a 43 6c 6f  e="close"%s(zClo
9f00: 73 65 46 6c 61 67 29 3e 0a 20 20 20 20 40 20 4d  seFlag)>.    @ M
9f10: 61 72 6b 20 74 68 69 73 20 6c 65 61 66 20 61 73  ark this leaf as
9f20: 20 22 63 6c 6f 73 65 64 22 20 73 6f 20 74 68 61   "closed" so tha
9f30: 74 20 69 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 61  t it no longer a
9f40: 70 70 65 61 72 73 20 6f 6e 20 74 68 65 0a 20 20  ppears on the.  
9f50: 20 20 40 20 22 6c 65 61 76 65 73 22 20 70 61 67    @ "leaves" pag
9f60: 65 20 61 6e 64 20 69 73 20 6e 6f 20 6c 6f 6e 67  e and is no long
9f70: 65 72 20 6c 61 62 65 6c 65 64 20 61 73 20 61 20  er labeled as a 
9f80: 22 3c 62 3e 4c 65 61 66 3c 2f 62 3e 22 2e 0a 20  "<b>Leaf</b>".. 
9f90: 20 20 20 40 20 3c 2f 74 64 3e 3c 2f 74 72 3e 0a     @ </td></tr>.
9fa0: 20 20 7d 0a 0a 0a 20 20 40 20 3c 74 72 3e 3c 74    }...  @ <tr><t
9fb0: 64 20 63 6f 6c 73 70 61 6e 3d 22 32 22 3e 0a 20  d colspan="2">. 
9fc0: 20 40 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22   @ <input type="
9fd0: 73 75 62 6d 69 74 22 20 6e 61 6d 65 3d 22 70 72  submit" name="pr
9fe0: 65 76 69 65 77 22 20 76 61 6c 75 65 3d 22 50 72  eview" value="Pr
9ff0: 65 76 69 65 77 22 3e 0a 20 20 40 20 3c 69 6e 70  eview">.  @ <inp
a000: 75 74 20 74 79 70 65 3d 22 73 75 62 6d 69 74 22  ut type="submit"
a010: 20 6e 61 6d 65 3d 22 61 70 70 6c 79 22 20 76 61   name="apply" va
a020: 6c 75 65 3d 22 41 70 70 6c 79 20 43 68 61 6e 67  lue="Apply Chang
a030: 65 73 22 3e 0a 20 20 40 20 3c 69 6e 70 75 74 20  es">.  @ <input 
a040: 74 79 70 65 3d 22 73 75 62 6d 69 74 22 20 6e 61  type="submit" na
a050: 6d 65 3d 22 63 61 6e 63 65 6c 22 20 76 61 6c 75  me="cancel" valu
a060: 65 3d 22 43 61 6e 63 65 6c 22 3e 0a 20 20 40 20  e="Cancel">.  @ 
a070: 3c 2f 74 64 3e 3c 2f 74 72 3e 0a 20 20 40 20 3c  </td></tr>.  @ <
a080: 2f 74 61 62 6c 65 3e 0a 20 20 40 20 3c 2f 66 6f  /table>.  @ </fo
a090: 72 6d 3e 0a 20 20 73 74 79 6c 65 5f 66 6f 6f 74  rm>.  style_foot
a0a0: 65 72 28 29 3b 0a 7d 0a                          er();.}.